From c33fe57433884add4cf300ecd1a468fa8c0bdbfc Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Tue, 23 Jun 2026 08:31:34 +0200 Subject: [PATCH] =?UTF-8?q?fix(ux):=20Idiotensicherheit=20=E2=80=94=208=20?= =?UTF-8?q?Audit-Fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Behebung der drei kritischsten UX-Schwachstellen aus dem Produkt-Audit: 1. ConnectPanel: Steps 2-4 (Modellauswahl, Tool-Picker, Config-Snippet, Vision) werden blockiert wenn noch kein Modell installiert ist. Stattdessen klarer Hinweis "Erst im Cookbook ein Modell holen" mit direktem CTA. Verhindert dass Anfänger ein Snippet mit Fake-"coder" kopieren, bevor ein echtes Modell existiert. 2. OverviewPanel: preload() schluckte Fehler still (catch {}). Zeigt jetzt einen verständlichen Toast wenn die Engine nicht erreichbar ist. Schnellstart ist kontextsensitiv: ohne Modelle zeigt er Onboarding- Schritte (Modell holen → Verbinden → Guide lesen) statt sinnloser Aktionen wie "Speicher freigeben". 3. CookbookPanel Profi-Suche: doDownload() nutzte zwei sequenzielle API-Calls (download + register) — wenn der zweite scheiterte, blieb das System in einem inkonsistenten Halbzustand. Jetzt ein einziger atomarer Aufruf an /api/cookbook/install-model (wie Recipe/Discover). Backend-Erweiterung: InstallModelReq akzeptiert jetzt 'file' und 'ctx' um Nutzer-Auswahl direkt zu übergeben. 4. Cookbook Section 1 als "Hier starten" markiert ("1 · Anwendungsfall wählen & installieren" mit erklärendem Sub-Text). 5. Post-Download-Toasts: Alle drei Install-Pfade sagen nun einheitlich "Modell erscheint danach automatisch im Modelle-Tab" statt nur "siehe Aktivität". 6. too_tight-Alternative: Bei Modellen/Setups die den Speicher übersteigen wird jetzt eine konkrete Alternative (kleinere Datei / passendes Rezept) verlinkt statt nur "Trotzdem installieren". 7. Duplikat extract_params_b aus cookbook.py entfernt — importiert jetzt aus hw_math (Single Source of Truth). Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/panels/ConnectPanel.svelte | 172 +++++++++++++---------- frontend/src/panels/CookbookPanel.svelte | 50 +++++-- frontend/src/panels/OverviewPanel.svelte | 67 ++++++--- routers/cookbook.py | 24 ++-- static/dist/main.js | 52 +++---- 5 files changed, 213 insertions(+), 152 deletions(-) diff --git a/frontend/src/panels/ConnectPanel.svelte b/frontend/src/panels/ConnectPanel.svelte index 4d4885c..f8cadb5 100644 --- a/frontend/src/panels/ConnectPanel.svelte +++ b/frontend/src/panels/ConnectPanel.svelte @@ -115,8 +115,10 @@ - + {#if allModels.length} + +

2 · Modelle auswählen

@@ -140,90 +142,104 @@
{/if}
-{/if} - -
-

3 · Tool wählen

-
Für welches Werkzeug brauchst du die Konfiguration?
-
- {#each [ - ['zed', 'Zed', 'Schneller nativer Editor — Empfohlen'], - ['opencode', 'OpenCode', 'Open-Source Coding-Agent (Terminal/Desktop)'], - ['cline', 'Cline / Cursor', 'VS Code Extension, Bring-Your-Own-Key'], - ['openwebui', 'OpenWebUI', 'Browser-Chat-Interface'] - ] as [id, label, desc]} - - {/each} + +
+

3 · Tool wählen

+
Für welches Werkzeug brauchst du die Konfiguration?
+
+ {#each [ + ['zed', 'Zed', 'Schneller nativer Editor — Empfohlen'], + ['opencode', 'OpenCode', 'Open-Source Coding-Agent (Terminal/Desktop)'], + ['cline', 'Cline / Cursor', 'VS Code Extension, Bring-Your-Own-Key'], + ['openwebui', 'OpenWebUI', 'Browser-Chat-Interface'] + ] as [id, label, desc]} + + {/each} +
-
- -
-

4 · Config-Snippet

- {#if selectedTool === 'zed'} - {@const block = zedBlock(url, activeIds)} -

Öffne die Zed-Settings mit Cmd/Strg + , und füge diesen Block in deine bestehende settings.json ein. Falls bereits ein "bosgame"-Eintrag existiert: vorher löschen.

-
Nur diesen Block einfügen, nicht die ganze Datei ersetzen — sonst gehen andere Einstellungen verloren.
-
- -
{block}
-
-

API-Key: Öffne den Agent-Panel → Anbieter bosgame → trag irgendeinen Wert ein (z.B. local).

-
Danach im Agent-Panel das Modell bosgame / {firstModel} auswählen.
- {:else if selectedTool === 'opencode'} - {@const block = openCodeBlock(url, activeIds)} -

Datei anlegen oder öffnen:

-

Windows: %USERPROFILE%\.config\opencode\opencode.json

-
Nur den "provider"-Block einfügen. Falls bereits ein "llama-swap"-Eintrag vorhanden: vorher löschen, sonst erscheinen Modelle doppelt.
-
- -
{block}
-
-

Danach in OpenCode /modelsllama-swap/{firstModel} wählen.

- {:else if selectedTool === 'cline'} -

In Cline/Cursor den Provider „OpenAI Compatible" wählen:

- -
- - -
- -
- - -
-
API-Key: ein beliebiger Wert (z.B. local).
- {:else if selectedTool === 'openwebui'} -

Settings → Admin Panel → Connections → neue OpenAI-Verbindung:

- -
- - -
- -
- - + +
+

4 · Config-Snippet

+ {#if selectedTool === 'zed'} + {@const block = zedBlock(url, activeIds)} +

Öffne die Zed-Settings mit Cmd/Strg + , und füge diesen Block in deine bestehende settings.json ein. Falls bereits ein "bosgame"-Eintrag existiert: vorher löschen.

+
Nur diesen Block einfügen, nicht die ganze Datei ersetzen — sonst gehen andere Einstellungen verloren.
+
+ +
{block}
+
+

API-Key: Öffne den Agent-Panel → Anbieter bosgame → trag irgendeinen Wert ein (z.B. local).

+
Danach im Agent-Panel das Modell bosgame / {firstModel} auswählen.
+ {:else if selectedTool === 'opencode'} + {@const block = openCodeBlock(url, activeIds)} +

Datei anlegen oder öffnen:

+

Windows: %USERPROFILE%\.config\opencode\opencode.json

+
Nur den "provider"-Block einfügen. Falls bereits ein "llama-swap"-Eintrag vorhanden: vorher löschen, sonst erscheinen Modelle doppelt.
+
+ +
{block}
+
+

Danach in OpenCode /modelsllama-swap/{firstModel} wählen.

+ {:else if selectedTool === 'cline'} +

In Cline/Cursor den Provider „OpenAI Compatible" wählen:

+ +
+ + +
+ +
+ + +
+
API-Key: ein beliebiger Wert (z.B. local).
+ {:else if selectedTool === 'openwebui'} +

Settings → Admin Panel → Connections → neue OpenAI-Verbindung:

+ +
+ + +
+ +
+ + +
+ {/if} +
+ + + {#if visionModel} + {@const snippet = `curl ${url}/chat/completions \\\n -H "Content-Type: application/json" \\\n -d '{\n "model": "${visionModel}",\n "messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,"}}]}]\n}'`} +
+
+

Bilder einbinden (Vision)

+ {@html icon('check')} „{visionModel}" bereit +
+
Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.
+
+ +
{snippet}
+
{/if} -
- -{#if visionModel} - {@const snippet = `curl ${url}/chat/completions \\\n -H "Content-Type: application/json" \\\n -d '{\n "model": "${visionModel}",\n "messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,"}}]}]\n}'`} +{:else} +
-
-

Bilder einbinden (Vision)

- {@html icon('check')} „{visionModel}" bereit -
-
Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.
-
- -
{snippet}
+

2 · Erst ein Modell installieren

+
+
Noch kein Modell eingerichtet
+
Bevor du ein Tool verbinden kannst, braucht die Engine mindestens ein Modell. Das Config-Snippet wird dann automatisch mit deinen echten Modellnamen befüllt.
+
{/if} diff --git a/frontend/src/panels/CookbookPanel.svelte b/frontend/src/panels/CookbookPanel.svelte index 0d35670..5b3c6d9 100644 --- a/frontend/src/panels/CookbookPanel.svelte +++ b/frontend/src/panels/CookbookPanel.svelte @@ -163,7 +163,7 @@ if (btn) { btn.disabled = true; btn.textContent = 'Starte…' } try { const r = await api('/api/cookbook/install-recipe', { method: 'POST', body: JSON.stringify({ recipe_id: id, hf_token: getHfToken() }) }) - toast(`${r.count} Downloads gestartet — siehe Aktivität.`) + toast(`${r.count} Download${r.count !== 1 ? 's' : ''} läuft — Modelle erscheinen danach automatisch im Modelle-Tab.`) recipeModal = null; goView('activity') } catch (e: any) { toast(e.message, true); if (btn) { btn.disabled = false; btn.textContent = 'Installieren' } } } @@ -196,9 +196,14 @@ if (!modelModalRepo || !modelFile) return toast('Bitte eine GGUF-Datei wählen.', true) modelLoading = true try { - const res = await api('/api/download', { method: 'POST', body: JSON.stringify({ repo: modelModalRepo, file: modelFile, hf_token: getHfToken() }) }) - await api('/api/register', { method: 'POST', body: JSON.stringify({ role: modelRole, model_path: res.expected_path, ctx: modelCtx }) }) - toast('Download gestartet — siehe Aktivität.'); modelModal = false; goView('activity') + const params_b = modelAnalysis?.params_b ?? 7.0 + const quant = modelFit?.quant ?? 'Q4_K_M' + await api('/api/cookbook/install-model', { method: 'POST', body: JSON.stringify({ + repo: modelModalRepo, role: modelRole, params_b, quant, + file: modelFile, ctx: modelCtx, hf_token: getHfToken() + })}) + toast('Download läuft — Modell erscheint danach automatisch im Modelle-Tab.') + modelModal = false; goView('activity') } catch (e: any) { toast('Fehler: ' + e.message, true) } modelLoading = false } @@ -208,7 +213,7 @@ btnEl.disabled = true; btnEl.textContent = 'Starte…' try { await api('/api/cookbook/install-model', { method: 'POST', body: JSON.stringify({ repo, role, params_b, quant: 'Q4_K_M', hf_token: getHfToken() }) }) - toast('Download gestartet — siehe Aktivität.'); goView('activity') + toast('Download läuft — Modell erscheint danach automatisch im Modelle-Tab.'); goView('activity') } catch (e: any) { toast(e.message, true); btnEl.disabled = false; btnEl.textContent = 'Installieren' } } @@ -263,10 +268,10 @@
-

Use-Case-Setups

+

1 · Anwendungsfall wählen & installieren

-
Fertige Modell-Bundles für deinen Anwendungsfall. Hardware-Ampel zeigt, ob es auf deinen PC passt.
+
Hier starten: Fertige Modell-Bundles für deinen Anwendungsfall — ein Klick installiert alles. Die Hardware-Ampel zeigt vorab, ob das Setup auf deinen PC passt.
{#if recipeLoading}
Lade Setups…
{:else} @@ -450,9 +455,21 @@ {@const maxRam = Math.max(...r.models.map((m: any) => m.fit?.req_gb ?? 0))}
Größter Spitzenbedarf: ~{maxRam.toFixed(1)} GB. Es läuft immer nur ein Modell gleichzeitig — das größte bestimmt, ob das Setup passt.
{/if} + {#if r.fit_level === 'too_tight'} + {@const smallerRec = recipes.find((x: any) => !x.user && x.fit_level !== 'too_tight' && x.id !== r.id)} +
+ ⚠ Dieses Setup übersteigt deinen verfügbaren Speicher. + {#if smallerRec} + Alternative: { e.preventDefault(); recipeModal = null; setTimeout(() => openRecipe(smallerRec.id), 50) }}> + „{smallerRec.title}" ansehen + — passt auf dein System. + {/if} +
+ {/if}
@@ -501,9 +518,24 @@ {modelFit.fit.text}
{/if} + {#if modelFit?.fit.level === 'too_tight' && modelAnalysis?.files} + {@const better = modelAnalysis.files.find((f: any) => f.fit.level !== 'too_tight' && f.filename !== modelFile)} + {#if better} +
+ ⚠ Diese Datei ist zu groß für deinen Speicher. Kleinere Alternative: + { e.preventDefault(); modelFile = better.filename; updateModelFit() }}> + {better.filename} ({fitWord(better.fit.level)}) + — einfach auswählen. +
+ {:else} +
+ ⚠ Alle Varianten dieses Modells sind zu groß für deinen Speicher. Ein kleineres Modell aus den Empfehlungen wäre die bessere Wahl. +
+ {/if} + {/if} {:else if !modelLoading}
Keine GGUF-Dateien im Repo gefunden.
diff --git a/frontend/src/panels/OverviewPanel.svelte b/frontend/src/panels/OverviewPanel.svelte index b10417d..12ef2b7 100644 --- a/frontend/src/panels/OverviewPanel.svelte +++ b/frontend/src/panels/OverviewPanel.svelte @@ -3,7 +3,7 @@ import { statusStore } from '../stores/status.svelte.js' import { systemStore } from '../stores/system.svelte.js' import { api } from '@core/api.js' - import { confirmModal, icon, fmtBytes } from '@core/ui.js' + import { confirmModal, toast, icon, fmtBytes } from '@core/ui.js' const s = $derived(statusStore.value) const sys = $derived(systemStore.value) @@ -53,7 +53,7 @@ async function preload(modelName: string) { preloadingModel = modelName try { await api('/api/preload?model=' + encodeURIComponent(modelName), { method: 'POST' }) } - catch {} + catch (e: any) { toast('Laden fehlgeschlagen: ' + (e.message || 'Engine nicht erreichbar?'), true) } preloadingModel = null refresh() } @@ -153,27 +153,48 @@

Schnellstart

-
Die häufigsten Aufgaben — ein Klick.
- - - - + {#if !configuredModels.length} + +
Noch kein Modell eingerichtet — starte hier:
+ + + + {:else} + +
Die häufigsten Aufgaben — ein Klick.
+ + + + + {/if}
diff --git a/routers/cookbook.py b/routers/cookbook.py index 36fd8a5..0dc9bf7 100644 --- a/routers/cookbook.py +++ b/routers/cookbook.py @@ -14,7 +14,7 @@ import psutil from ruamel.yaml.scalarstring import LiteralScalarString from auth import auth -from hw_math import evaluate_fit, max_ctx_for +from hw_math import evaluate_fit, max_ctx_for, extract_params_b from config import (MODELS_DIR, CMD_TEMPLATE, DEFAULT_TTL, HF_DOWNLOAD_ENV, USER_RECIPES_PATH, DISCOVER_CACHE_PATH, DISCOVER_TTL, hf_bin) from llamaswap import read_config, write_config, model_id_from_path, set_role_alias @@ -68,6 +68,8 @@ class InstallModelReq(BaseModel): role: str params_b: float quant: str = "Q4_K_M" + file: str | None = None # konkrete GGUF-Datei; None → _pick_gguf wählt automatisch + ctx: int | None = None # None → max_ctx_for (Hardware-Optimum) hf_token: str | None = None @@ -85,18 +87,6 @@ class UserRecipeReq(BaseModel): icon: str = "box" models: list[UserRecipeModelReq] -def extract_params_b(repo_id: str) -> float: - """Extrahiert die Parametergröße (in Milliarden) aus dem Repo-Namen.""" - # z.B. Qwen2.5-Coder-32B -> 32 - # 8x7B -> 56 (MoE) - moe = re.search(r"(\d+)x(\d+(?:\.\d+)?)[bB]", repo_id) - if moe: - return float(moe.group(1)) * float(moe.group(2)) - m = re.search(r"(\d+(?:\.\d+)?)[bB](?![a-zA-Z])", repo_id) - if m: - return float(m.group(1)) - return 7.0 # Fallback - def extract_quant(filename: str) -> str: m = re.search(r"(Q\d_[A-Z0-9_]+|IQ\d_[A-Z0-9_]+|FP16|BF16)", filename, re.IGNORECASE) return m.group(1).upper() if m else "Q4_K_M" @@ -531,8 +521,10 @@ def upgrades(): @router.post("/install-model") def install_model(req: InstallModelReq): - """Ein einzelnes Modell installieren (Download + Einpflegen unter 'role', optimaler ctx).""" - file = _pick_gguf(req.repo, req.quant) + """Ein einzelnes Modell installieren (Download + Einpflegen unter 'role', optimaler ctx). + Wenn 'file' übergeben wird, wird genau diese GGUF-Datei geladen (Profi-Suche-Auswahl); + andernfalls wählt _pick_gguf automatisch die beste Variante für den gewünschten Quant.""" + file = req.file or _pick_gguf(req.repo, req.quant) if not file: raise HTTPException(404, "Keine GGUF-Datei im Repo gefunden.") mmproj = _pick_mmproj(req.repo) @@ -550,7 +542,7 @@ def install_model(req: InstallModelReq): JOBS[jid]["result_path"] = str(target / file) attach_download_progress(jid, str(target), hf_file_size(req.repo, file)) cfg = read_config() - ctx = max_ctx_for(req.params_b, req.quant, ram_gb) + ctx = req.ctx if req.ctx else max_ctx_for(req.params_b, req.quant, ram_gb) path = str(target / file) cmd = CMD_TEMPLATE.replace("{model}", path).replace("{ctx}", str(ctx)) if mmproj: diff --git a/static/dist/main.js b/static/dist/main.js index 0023b1e..5c6c9b8 100644 --- a/static/dist/main.js +++ b/static/dist/main.js @@ -1,53 +1,53 @@ -var tl=Object.defineProperty;var Ai=e=>{throw TypeError(e)};var nl=(e,t,a)=>t in e?tl(e,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[t]=a;var en=(e,t,a)=>nl(e,typeof t!="symbol"?t+"":t,a),Gr=(e,t,a)=>t.has(e)||Ai("Cannot "+a);var f=(e,t,a)=>(Gr(e,t,"read from private field"),a?a.call(e):t.get(e)),de=(e,t,a)=>t.has(e)?Ai("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,a),se=(e,t,a,r)=>(Gr(e,t,"write to private field"),r?r.call(e,a):t.set(e,a),a),$e=(e,t,a)=>(Gr(e,t,"access private method"),a);var hi=Array.isArray,al=Array.prototype.indexOf,Sr=Array.prototype.includes,Dr=Array.from,rl=Object.defineProperty,Ya=Object.getOwnPropertyDescriptor,il=Object.getOwnPropertyDescriptors,sl=Object.prototype,ll=Array.prototype,is=Object.getPrototypeOf,Ci=Object.isExtensible;const ol=()=>{};function dl(e){for(var t=0;t{e=r,t=i});return{promise:a,resolve:e,reject:t}}function ir(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);const a=[];for(const r of e)if(a.push(r),a.length===t)break;return a}const zt=2,Ra=4,Or=8,ls=1<<24,Sn=16,Tn=32,na=64,ti=128,gn=512,St=1024,Ct=2048,qn=4096,Ut=8192,_n=16384,Ka=32768,ni=1<<25,qa=65536,Er=1<<17,cl=1<<18,Ga=1<<19,ul=1<<20,Dn=1<<25,ya=65536,Tr=1<<21,Ta=1<<22,ta=1<<23,$a=Symbol("$state"),vl=Symbol(""),br=Symbol("attributes"),ai=Symbol("class"),ri=Symbol("style"),Va=Symbol("text"),yr=Symbol("form reset"),Rr=new class extends Error{constructor(){super(...arguments);en(this,"name","StaleReactionError");en(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};var ts;const fl=!!((ts=globalThis.document)!=null&&ts.contentType)&&globalThis.document.contentType.includes("xml");function os(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function pl(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function hl(e,t,a){throw new Error("https://svelte.dev/e/each_key_duplicate")}function gl(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function _l(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function ml(e){throw new Error("https://svelte.dev/e/effect_orphan")}function bl(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function yl(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function wl(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function xl(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function kl(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const Ml=1,Sl=2,ds=4,El=8,Tl=16,$l=1,Al=2,Mt=Symbol("uninitialized"),cs="http://www.w3.org/1999/xhtml",Cl="http://www.w3.org/2000/svg",Ll="http://www.w3.org/1998/Math/MathML";function zl(){console.warn("https://svelte.dev/e/derived_inert")}function Pl(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Dl(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function us(e){return e===this.v}function Ol(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function vs(e){return!Ol(e,this.v)}let Lt=null;function Ba(e){Lt=e}function ra(e,t=!1,a){Lt={p:Lt,i:!1,c:null,e:null,s:e,x:null,r:me,l:null}}function ia(e){var t=Lt,a=t.e;if(a!==null){t.e=null;for(var r of a)Ds(r)}return t.i=!0,Lt=t.p,{}}function fs(){return!0}let la=[];function ps(){var e=la;la=[],dl(e)}function ga(e){if(la.length===0&&!Xa){var t=la;queueMicrotask(()=>{t===la&&ps()})}la.push(e)}function Rl(){for(;la.length>0;)ps()}function hs(e){var t=me;if(t===null)return he.f|=ta,e;if((t.f&Ka)===0&&(t.f&Ra)===0)throw e;Xn(e,t)}function Xn(e,t){if(!(t!==null&&(t.f&_n)!==0)){for(;t!==null;){if((t.f&ti)!==0){if((t.f&Ka)===0)throw e;try{t.b.error(e);return}catch(a){e=a}}t=t.parent}throw e}}const ql=-7169;function gt(e,t){e.f=e.f&ql|t}function gi(e){(e.f&gn)!==0||e.deps===null?gt(e,St):gt(e,qn)}function gs(e){if(e!==null)for(const t of e)(t.f&zt)===0||(t.f&ya)===0||(t.f^=ya,gs(t.deps))}function _s(e,t,a){(e.f&Ct)!==0?t.add(e):(e.f&qn)!==0&&a.add(e),gs(e.deps),gt(e,St)}function Bl(e){let t=0,a=xa(0),r;return()=>{ki()&&(n(a),qr(()=>(t===0&&(r=Ua(()=>e(()=>er(a)))),t+=1,()=>{ga(()=>{t-=1,t===0&&(r==null||r(),r=void 0,er(a))})})))}}var Il=qa|Ga;function Nl(e,t,a,r){new Fl(e,t,a,r)}var un,pi,vn,ua,Wt,fn,Gt,an,Fn,va,Yn,Aa,or,dr,Kn,Lr,ft,Kl,Gl,Ul,ii,wr,xr,si,li;class Fl{constructor(t,a,r,i){de(this,ft);en(this,"parent");en(this,"is_pending",!1);en(this,"transform_error");de(this,un);de(this,pi,null);de(this,vn);de(this,ua);de(this,Wt);de(this,fn,null);de(this,Gt,null);de(this,an,null);de(this,Fn,null);de(this,va,0);de(this,Yn,0);de(this,Aa,!1);de(this,or,new Set);de(this,dr,new Set);de(this,Kn,null);de(this,Lr,Bl(()=>(se(this,Kn,xa(f(this,va))),()=>{se(this,Kn,null)})));var o;se(this,un,t),se(this,vn,a),se(this,ua,d=>{var c=me;c.b=this,c.f|=ti,r(d)}),this.parent=me.b,this.transform_error=i??((o=this.parent)==null?void 0:o.transform_error)??(d=>d),se(this,Wt,Si(()=>{$e(this,ft,ii).call(this)},Il))}defer_effect(t){_s(t,f(this,or),f(this,dr))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!f(this,vn).pending}update_pending_count(t,a){$e(this,ft,si).call(this,t,a),se(this,va,f(this,va)+t),!(!f(this,Kn)||f(this,Aa))&&(se(this,Aa,!0),ga(()=>{se(this,Aa,!1),f(this,Kn)&&Ia(f(this,Kn),f(this,va))}))}get_effect_pending(){return f(this,Lr).call(this),n(f(this,Kn))}error(t){if(!f(this,vn).onerror&&!f(this,vn).failed)throw t;W!=null&&W.is_fork?(f(this,fn)&&W.skip_effect(f(this,fn)),f(this,Gt)&&W.skip_effect(f(this,Gt)),f(this,an)&&W.skip_effect(f(this,an)),W.oncommit(()=>{$e(this,ft,li).call(this,t)})):$e(this,ft,li).call(this,t)}}un=new WeakMap,pi=new WeakMap,vn=new WeakMap,ua=new WeakMap,Wt=new WeakMap,fn=new WeakMap,Gt=new WeakMap,an=new WeakMap,Fn=new WeakMap,va=new WeakMap,Yn=new WeakMap,Aa=new WeakMap,or=new WeakMap,dr=new WeakMap,Kn=new WeakMap,Lr=new WeakMap,ft=new WeakSet,Kl=function(){try{se(this,fn,pn(()=>f(this,ua).call(this,f(this,un))))}catch(t){this.error(t)}},Gl=function(t){const a=f(this,vn).failed;a&&se(this,an,pn(()=>{a(f(this,un),()=>t,()=>()=>{})}))},Ul=function(){const t=f(this,vn).pending;t&&(this.is_pending=!0,se(this,Gt,pn(()=>t(f(this,un)))),ga(()=>{var a=se(this,Fn,document.createDocumentFragment()),r=Hn();a.append(r),se(this,fn,$e(this,ft,xr).call(this,()=>pn(()=>f(this,ua).call(this,r)))),f(this,Yn)===0&&(f(this,un).before(a),se(this,Fn,null),ma(f(this,Gt),()=>{se(this,Gt,null)}),$e(this,ft,wr).call(this,W))}))},ii=function(){try{if(this.is_pending=this.has_pending_snippet(),se(this,Yn,0),se(this,va,0),se(this,fn,pn(()=>{f(this,ua).call(this,f(this,un))})),f(this,Yn)>0){var t=se(this,Fn,document.createDocumentFragment());Ti(f(this,fn),t);const a=f(this,vn).pending;se(this,Gt,pn(()=>a(f(this,un))))}else $e(this,ft,wr).call(this,W)}catch(a){this.error(a)}},wr=function(t){this.is_pending=!1,t.transfer_effects(f(this,or),f(this,dr))},xr=function(t){var a=me,r=he,i=Lt;Bn(f(this,Wt)),mn(f(this,Wt)),Ba(f(this,Wt).ctx);try{return wa.ensure(),t()}catch(o){return hs(o),null}finally{Bn(a),mn(r),Ba(i)}},si=function(t,a){var r;if(!this.has_pending_snippet()){this.parent&&$e(r=this.parent,ft,si).call(r,t,a);return}se(this,Yn,f(this,Yn)+t),f(this,Yn)===0&&($e(this,ft,wr).call(this,a),f(this,Gt)&&ma(f(this,Gt),()=>{se(this,Gt,null)}),f(this,Fn)&&(f(this,un).before(f(this,Fn)),se(this,Fn,null)))},li=function(t){f(this,fn)&&(Qt(f(this,fn)),se(this,fn,null)),f(this,Gt)&&(Qt(f(this,Gt)),se(this,Gt,null)),f(this,an)&&(Qt(f(this,an)),se(this,an,null));var a=f(this,vn).onerror;let r=f(this,vn).failed;var i=!1,o=!1;const d=()=>{if(i){Dl();return}i=!0,o&&kl(),f(this,an)!==null&&ma(f(this,an),()=>{se(this,an,null)}),$e(this,ft,xr).call(this,()=>{$e(this,ft,ii).call(this)})},c=u=>{try{o=!0,a==null||a(u,d),o=!1}catch(v){Xn(v,f(this,Wt)&&f(this,Wt).parent)}r&&se(this,an,$e(this,ft,xr).call(this,()=>{try{return pn(()=>{var v=me;v.b=this,v.f|=ti,r(f(this,un),()=>u,()=>d)})}catch(v){return Xn(v,f(this,Wt).parent),null}}))};ga(()=>{var u;try{u=this.transform_error(t)}catch(v){Xn(v,f(this,Wt)&&f(this,Wt).parent);return}u!==null&&typeof u=="object"&&typeof u.then=="function"?u.then(c,v=>Xn(v,f(this,Wt)&&f(this,Wt).parent)):c(u)})};function Hl(e,t,a,r){const i=_i;var o=e.filter(w=>!w.settled),d=t.map(i);if(a.length===0&&o.length===0){r(d);return}var c=me,u=Vl(),v=o.length===1?o[0].promise:o.length>1?Promise.all(o.map(w=>w.promise)):null;function h(w){if((c.f&_n)===0){u();try{r([...d,...w])}catch(A){Xn(A,c)}$r()}}var E=ms();if(a.length===0){v.then(()=>h([])).finally(E);return}function p(){Promise.all(a.map(w=>Wl(w))).then(h).catch(w=>Xn(w,c)).finally(E)}v?v.then(()=>{u(),p(),$r()}):p()}function Vl(){var e=me,t=he,a=Lt,r=W;return function(o=!0){Bn(e),mn(t),Ba(a),o&&(e.f&_n)===0&&(r==null||r.activate(),r==null||r.apply())}}function $r(e=!0){Bn(null),mn(null),Ba(null),e&&(W==null||W.deactivate())}function ms(){var e=me,t=e.b,a=W,r=!!(t!=null&&t.is_rendered());return t==null||t.update_pending_count(1,a),a.increment(r,e),()=>{t==null||t.update_pending_count(-1,a),a.decrement(r,e)}}function _i(e){var t=zt|Ct;return me!==null&&(me.f|=Ga),{ctx:Lt,deps:null,effects:null,equals:us,f:t,fn:e,reactions:null,rv:0,v:Mt,wv:0,parent:me,ac:null}}const Wa=Symbol("obsolete");function Wl(e,t,a){let r=me;r===null&&pl();var i=void 0,o=xa(Mt),d=!he,c=new Set;return uo(()=>{var w,A;var u=me,v=ss();i=v.promise;try{Promise.resolve(e()).then(v.resolve,L=>{L!==Rr&&v.reject(L)}).finally($r)}catch(L){v.reject(L),$r()}var h=W;if(d){if((u.f&Ka)!==0)var E=ms();if((w=r.b)!=null&&w.is_rendered())(A=h.async_deriveds.get(u))==null||A.reject(Wa);else for(const L of c.values())L.reject(Wa);c.add(v),h.async_deriveds.set(u,v)}const p=(L,M=void 0)=>{E==null||E(),c.delete(v),M!==Wa&&(h.activate(),M?(o.f|=ta,Ia(o,M)):((o.f&ta)!==0&&(o.f^=ta),Ia(o,L)),h.deactivate())};v.promise.then(p,L=>p(null,L||"unknown"))}),Ps(()=>{for(const u of c)u.reject(Wa)}),new Promise(u=>{function v(h){function E(){h===i?u(o):v(i)}h.then(E,E)}v(i)})}function I(e){const t=_i(e);return Fs(t),t}function jl(e){const t=_i(e);return t.equals=vs,t}function Jl(e){var t=e.effects;if(t!==null){e.effects=null;for(var a=0;athis.schedule(r)){var r=f(this,zn).get(t);if(r){f(this,zn).delete(t);for(var i of r.d)gt(i,Ct),a(i);for(i of r.m)gt(i,qn),a(i)}f(this,Oa).add(t)}capture(t,a,r=!1){t.v!==Mt&&!this.previous.has(t)&&this.previous.set(t,t.v),(t.f&ta)===0&&(this.current.set(t,[a,r]),At==null||At.set(t,a)),this.is_fork||(t.v=a)}activate(){W=this}deactivate(){W=null,At=null}flush(){try{Hr=!0,W=this,$e(this,Be,ja).call(this)}finally{Li=0,oi=null,Ea=null,kr=null,Hr=!1,W=null,At=null,_a.clear()}}discard(){var t;for(const a of f(this,za))a(this);f(this,za).clear();for(const a of this.async_deriveds.values())a.reject(Wa);$e(this,Be,Ja).call(this),(t=f(this,Da))==null||t.resolve()}register_created_effect(t){f(this,cr).push(t)}increment(t,a){if(se(this,Pa,f(this,Pa)+1),t){let r=f(this,Gn).get(a)??0;f(this,Gn).set(a,r+1)}}decrement(t,a){if(se(this,Pa,f(this,Pa)-1),t){let r=f(this,Gn).get(a)??0;r===1?f(this,Gn).delete(a):f(this,Gn).set(a,r-1)}f(this,pa)||(se(this,pa,!0),ga(()=>{se(this,pa,!1),this.linked&&this.flush()}))}transfer_effects(t,a){for(const r of t)f(this,Un).add(r);for(const r of a)f(this,xn).add(r);t.clear(),a.clear()}oncommit(t){f(this,La).add(t)}ondiscard(t){f(this,za).add(t)}settled(){return(f(this,Da)??se(this,Da,ss())).promise}static ensure(){if(W===null){const t=W=new zr;!Hr&&!Xa&&ga(()=>{f(t,Ca)||t.flush()})}return W}apply(){{At=null;return}}schedule(t){var i;if(oi=t,(i=t.b)!=null&&i.is_pending&&(t.f&(Ra|Or|ls))!==0&&(t.f&Ka)===0){t.b.defer_effect(t);return}for(var a=t;a.parent!==null;){a=a.parent;var r=a.f;if(Ea!==null&&a===me&&(he===null||(he.f&zt)===0))return;if((r&(na|Tn))!==0){if((r&St)===0)return;a.f^=St}}f(this,jt).push(a)}};Ca=new WeakMap,Zn=new WeakMap,fa=new WeakMap,La=new WeakMap,za=new WeakMap,Pa=new WeakMap,Gn=new WeakMap,Da=new WeakMap,jt=new WeakMap,cr=new WeakMap,Un=new WeakMap,xn=new WeakMap,zn=new WeakMap,Oa=new WeakMap,pa=new WeakMap,Be=new WeakSet,di=function(){if(this.is_fork)return!0;for(const r of f(this,Gn).keys()){for(var t=r,a=!1;t.parent!==null;){if(f(this,zn).has(t)){a=!0;break}t=t.parent}if(!a)return!0}return!1},ja=function(){var u,v,h,E;se(this,Ca,!0),Li++>1e3&&($e(this,Be,Ja).call(this),eo());for(const p of f(this,Un))f(this,xn).delete(p),gt(p,Ct),this.schedule(p);for(const p of f(this,xn))gt(p,qn),this.schedule(p);const t=f(this,jt);se(this,jt,[]),this.apply();var a=Ea=[],r=[],i=kr=[];for(const p of t)try{$e(this,Be,ci).call(this,p,a,r)}catch(w){throw Ss(p),$e(this,Be,di).call(this)||this.discard(),w}if(W=null,i.length>0){var o=zr.ensure();for(const p of i)o.schedule(p)}if(Ea=null,kr=null,$e(this,Be,di).call(this)){$e(this,Be,Sa).call(this,r),$e(this,Be,Sa).call(this,a);for(const[p,w]of f(this,zn))Ms(p,w);i.length>0&&$e(u=W,Be,ja).call(u);return}const d=$e(this,Be,ws).call(this);if(d){$e(this,Be,Sa).call(this,r),$e(this,Be,Sa).call(this,a),$e(v=d,Be,xs).call(v,this);return}f(this,Un).clear(),f(this,xn).clear();for(const p of f(this,La))p(this);f(this,La).clear(),Za=this,zi(r),zi(a),Za=null,(h=f(this,Da))==null||h.resolve();var c=W;if(f(this,Pa)===0&&(f(this,jt).length===0||c!==null)&&$e(this,Be,Ja).call(this),f(this,jt).length>0)if(c!==null){const p=c;f(p,jt).push(...f(this,jt).filter(w=>!f(p,jt).includes(w)))}else c=this;c!==null&&$e(E=c,Be,ja).call(E)},ci=function(t,a,r){t.f^=St;for(var i=t.first;i!==null;){var o=i.f,d=(o&(Tn|na))!==0,c=d&&(o&St)!==0,u=c||(o&Ut)!==0||f(this,zn).has(i);if(!u&&i.fn!==null){d?i.f^=St:(o&Ra)!==0?a.push(i):pr(i)&&((o&Sn)!==0&&f(this,xn).add(i),Na(i));var v=i.first;if(v!==null){i=v;continue}}for(;i!==null;){var h=i.next;if(h!==null){i=h;break}i=i.parent}}},ws=function(){for(var t=f(this,Zn);t!==null;){if(!t.is_fork){for(const[a,[,r]]of this.current)if(t.current.has(a)&&!r)return t}t=f(t,Zn)}return null},xs=function(t){var r;for(const[i,o]of t.current)!this.previous.has(i)&&t.previous.has(i)&&this.previous.set(i,t.previous.get(i)),this.current.set(i,o);for(const[i,o]of t.async_deriveds){const d=this.async_deriveds.get(i);d&&o.promise.then(d.resolve).catch(d.reject)}t.async_deriveds.clear(),this.transfer_effects(f(t,Un),f(t,xn));const a=i=>{var o=i.reactions;if(o!==null)for(const u of o){var d=u.f;if((d&zt)!==0)a(u);else{var c=u;d&(Ta|Sn)&&!this.async_deriveds.has(c)&&(f(this,xn).delete(c),gt(c,Ct),this.schedule(c))}}};for(const i of this.current.keys())a(i);this.oncommit(()=>t.discard()),$e(r=t,Be,Ja).call(r),W=this,$e(this,Be,ja).call(this)},Sa=function(t){for(var a=0;a!p.current.get(w)[1]);if(!(!f(p,Ca)||i.length===0)){var o=i.filter(w=>!this.current.has(w));if(o.length===0)t&&p.discard();else if(a.length>0){if(t)for(const w of f(this,Oa))p.unskip_effect(w,A=>{var L;(A.f&(Sn|Ta))!==0?p.schedule(A):$e(L=p,Be,Sa).call(L,[A])});p.activate();var d=new Set,c=new Map;for(var u of a)ks(u,o,d,c);c=new Map;var v=[...p.current].filter(([w,A])=>{const L=this.current.get(w);return L?L[0]!==A[0]||L[1]!==A[1]:!0}).map(([w])=>w);if(v.length>0)for(const w of f(this,cr))(w.f&(_n|Ut|Er))===0&&bi(w,v,c)&&((w.f&(Ta|Sn))!==0?(gt(w,Ct),p.schedule(w)):f(p,Un).add(w));if(f(p,jt).length>0&&!f(p,pa)){p.apply();for(var h of f(p,jt))$e(E=p,Be,ci).call(E,h,[],[]);se(p,jt,[])}p.deactivate()}}}},Ja=function(){if(this.linked){var t=f(this,Zn),a=f(this,fa);t===null?Ur=a:se(t,fa,a),a===null?Ma=t:se(a,Zn,t),this.linked=!1}};let wa=zr;function Xl(e){var t=Xa;Xa=!0;try{for(var a;;){if(Rl(),W===null)return a;W.flush()}}finally{Xa=t}}function eo(){try{bl()}catch(e){Xn(e,oi)}}let wn=null;function zi(e){var t=e.length;if(t!==0){for(var a=0;a0)){_a.clear();for(const i of wn){if((i.f&(_n|Ut))!==0)continue;const o=[i];let d=i.parent;for(;d!==null;)wn.has(d)&&(wn.delete(d),o.push(d)),d=d.parent;for(let c=o.length-1;c>=0;c--){const u=o[c];(u.f&(_n|Ut))===0&&Na(u)}}wn.clear()}}wn=null}}function ks(e,t,a,r){if(!a.has(e)&&(a.add(e),e.reactions!==null))for(const i of e.reactions){const o=i.f;(o&zt)!==0?ks(i,t,a,r):(o&(Ta|Sn))!==0&&(o&Ct)===0&&bi(i,t,r)&&(gt(i,Ct),yi(i))}}function bi(e,t,a){const r=a.get(e);if(r!==void 0)return r;if(e.deps!==null)for(const i of e.deps){if(Sr.call(t,i))return!0;if((i.f&zt)!==0&&bi(i,t,a))return a.set(i,!0),!0}return a.set(e,!1),!1}function yi(e){W.schedule(e)}function Ms(e,t){if(!((e.f&Tn)!==0&&(e.f&St)!==0)){(e.f&Ct)!==0?t.d.push(e):(e.f&qn)!==0&&t.m.push(e),gt(e,St);for(var a=e.first;a!==null;)Ms(a,t),a=a.next}}function Ss(e){gt(e,St);for(var t=e.first;t!==null;)Ss(t),t=t.next}let Ar=new Set;const _a=new Map;let Es=!1;function xa(e,t){var a={f:0,v:e,reactions:null,equals:us,rv:0,wv:0};return a}function B(e,t){const a=xa(e);return Fs(a),a}function to(e,t=!1,a=!0){const r=xa(e);return t||(r.equals=vs),r}function g(e,t,a=!1){he!==null&&(!En||(he.f&Er)!==0)&&fs()&&(he.f&(zt|Sn|Ta|Er))!==0&&(On===null||!On.has(e))&&xl();let r=a?Dt(t):t;return Ia(e,r,kr)}function Ia(e,t,a=null){if(!e.equals(t)){_a.set(e,aa?t:e.v);var r=wa.ensure();if(r.capture(e,t),(e.f&zt)!==0){const i=e;(e.f&Ct)!==0&&mi(i),At===null&&gi(i)}e.wv=Gs(),Ts(e,Ct,a),me!==null&&(me.f&St)!==0&&(me.f&(Tn|na))===0&&(cn===null?fo([e]):cn.push(e)),!r.is_fork&&Ar.size>0&&!Es&&no()}return t}function no(){Es=!1;for(const e of Ar){(e.f&St)!==0&>(e,qn);let t;try{t=pr(e)}catch{t=!0}t&&Na(e)}Ar.clear()}function er(e){g(e,e.v+1)}function Ts(e,t,a){var r=e.reactions;if(r!==null)for(var i=r.length,o=0;o{if(ba===o)return c();var u=he,v=ba;mn(null),qi(o);var h=c();return mn(u),qi(v),h};return r&&a.set("length",B(e.length)),new Proxy(e,{defineProperty(c,u,v){(!("value"in v)||v.configurable===!1||v.enumerable===!1||v.writable===!1)&&yl();var h=a.get(u);return h===void 0?d(()=>{var E=B(v.value);return a.set(u,E),E}):g(h,v.value,!0),!0},deleteProperty(c,u){var v=a.get(u);if(v===void 0){if(u in c){const h=d(()=>B(Mt));a.set(u,h),er(i)}}else g(v,Mt),er(i);return!0},get(c,u,v){var w;if(u===$a)return e;var h=a.get(u),E=u in c;if(h===void 0&&(!E||(w=Ya(c,u))!=null&&w.writable)&&(h=d(()=>{var A=Dt(E?c[u]:Mt),L=B(A);return L}),a.set(u,h)),h!==void 0){var p=n(h);return p===Mt?void 0:p}return Reflect.get(c,u,v)},getOwnPropertyDescriptor(c,u){var v=Reflect.getOwnPropertyDescriptor(c,u);if(v&&"value"in v){var h=a.get(u);h&&(v.value=n(h))}else if(v===void 0){var E=a.get(u),p=E==null?void 0:E.v;if(E!==void 0&&p!==Mt)return{enumerable:!0,configurable:!0,value:p,writable:!0}}return v},has(c,u){var p;if(u===$a)return!0;var v=a.get(u),h=v!==void 0&&v.v!==Mt||Reflect.has(c,u);if(v!==void 0||me!==null&&(!h||(p=Ya(c,u))!=null&&p.writable)){v===void 0&&(v=d(()=>{var w=h?Dt(c[u]):Mt,A=B(w);return A}),a.set(u,v));var E=n(v);if(E===Mt)return!1}return h},set(c,u,v,h){var re;var E=a.get(u),p=u in c;if(r&&u==="length")for(var w=v;wB(Mt)),a.set(w+"",A))}if(E===void 0)(!p||(re=Ya(c,u))!=null&&re.writable)&&(E=d(()=>B(void 0)),g(E,Dt(v)),a.set(u,E));else{p=E.v!==Mt;var L=d(()=>Dt(v));g(E,L)}var M=Reflect.getOwnPropertyDescriptor(c,u);if(M!=null&&M.set&&M.set.call(h,v),!p){if(r&&typeof u=="string"){var R=a.get("length"),Se=Number(u);Number.isInteger(Se)&&Se>=R.v&&g(R,Se+1)}er(i)}return!0},ownKeys(c){n(i);var u=Reflect.ownKeys(c).filter(E=>{var p=a.get(E);return p===void 0||p.v!==Mt});for(var[v,h]of a)h.v!==Mt&&!(v in c)&&u.push(v);return u},setPrototypeOf(){wl()}})}function Pi(e){try{if(e!==null&&typeof e=="object"&&$a in e)return e[$a]}catch{}return e}function ao(e,t){return Object.is(Pi(e),Pi(t))}var Di,$s,As,Cs;function ro(){if(Di===void 0){Di=window,$s=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,a=Text.prototype;As=Ya(t,"firstChild").get,Cs=Ya(t,"nextSibling").get,Ci(e)&&(e[ai]=void 0,e[br]=null,e[ri]=void 0,e.__e=void 0),Ci(a)&&(a[Va]=void 0)}}function Hn(e=""){return document.createTextNode(e)}function ea(e){return As.call(e)}function fr(e){return Cs.call(e)}function l(e,t){return ea(e)}function _t(e,t=!1){{var a=ea(e);return a instanceof Comment&&a.data===""?fr(a):a}}function s(e,t=1,a=!1){let r=e;for(;t--;)r=fr(r);return r}function io(e){e.textContent=""}function Ls(){return!1}function zs(e,t,a){return t==null||t===cs?a?document.createElement(e,{is:a}):document.createElement(e):a?document.createElementNS(t,e,{is:a}):document.createElementNS(t,e)}let Oi=!1;function so(){Oi||(Oi=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var t;if(!e.defaultPrevented)for(const a of e.target.elements)(t=a[yr])==null||t.call(a)})},{capture:!0}))}function wi(e){var t=he,a=me;mn(null),Bn(null);try{return e()}finally{mn(t),Bn(a)}}function xi(e,t,a,r=a){e.addEventListener(t,()=>wi(a));const i=e[yr];i?e[yr]=()=>{i(),r(!0)}:e[yr]=()=>r(!0),so()}function lo(e){me===null&&(he===null&&ml(),_l()),aa&&gl()}function oo(e,t){var a=t.last;a===null?t.last=t.first=e:(a.next=e,e.prev=a,t.last=e)}function Vn(e,t){var a=me;a!==null&&(a.f&Ut)!==0&&(e|=Ut);var r={ctx:Lt,deps:null,nodes:null,f:e|Ct|gn,first:null,fn:t,last:null,next:null,parent:a,b:a&&a.b,prev:null,teardown:null,wv:0,ac:null};W==null||W.register_created_effect(r);var i=r;if((e&Ra)!==0)Ea!==null?Ea.push(r):wa.ensure().schedule(r);else if(t!==null){try{Na(r)}catch(d){throw Qt(r),d}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&(i.f&Ga)===0&&(i=i.first,(e&Sn)!==0&&(e&qa)!==0&&i!==null&&(i.f|=qa))}if(i!==null&&(i.parent=a,a!==null&&oo(i,a),he!==null&&(he.f&zt)!==0&&(e&na)===0)){var o=he;(o.effects??(o.effects=[])).push(i)}return r}function ki(){return he!==null&&!En}function Ps(e){const t=Vn(Or,null);return gt(t,St),t.teardown=e,t}function Mi(e){lo();var t=me.f,a=!he&&(t&Tn)!==0&&Lt!==null&&!Lt.i;if(a){var r=Lt;(r.e??(r.e=[])).push(e)}else return Ds(e)}function Ds(e){return Vn(Ra|ul,e)}function co(e){wa.ensure();const t=Vn(na|Ga,e);return(a={})=>new Promise(r=>{a.outro?ma(t,()=>{Qt(t),r(void 0)}):(Qt(t),r(void 0))})}function Os(e){return Vn(Ra,e)}function uo(e){return Vn(Ta|Ga,e)}function qr(e,t=0){return Vn(Or|t,e)}function O(e,t=[],a=[],r=[]){Hl(r,t,a,i=>{Vn(Or,()=>{e(...i.map(n))})})}function Si(e,t=0){var a=Vn(Sn|t,e);return a}function pn(e){return Vn(Tn|Ga,e)}function Rs(e){var t=e.teardown;if(t!==null){const a=aa,r=he;Ri(!0),mn(null);try{t.call(null)}finally{Ri(a),mn(r)}}}function Ei(e,t=!1){var a=e.first;for(e.first=e.last=null;a!==null;){const i=a.ac;i!==null&&wi(()=>{i.abort(Rr)});var r=a.next;(a.f&na)!==0?a.parent=null:Qt(a,t),a=r}}function vo(e){for(var t=e.first;t!==null;){var a=t.next;(t.f&Tn)===0&&Qt(t),t=a}}function Qt(e,t=!0){var a=!1;(t||(e.f&cl)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(qs(e.nodes.start,e.nodes.end),a=!0),e.f|=ni,Ei(e,t&&!a),sr(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(const o of r)o.stop();Rs(e),e.f^=ni,e.f|=_n;var i=e.parent;i!==null&&i.first!==null&&Bs(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function qs(e,t){for(;e!==null;){var a=e===t?null:fr(e);e.remove(),e=a}}function Bs(e){var t=e.parent,a=e.prev,r=e.next;a!==null&&(a.next=r),r!==null&&(r.prev=a),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=a))}function ma(e,t,a=!0){var r=[];Is(e,r,!0);var i=()=>{a&&Qt(e),t&&t()},o=r.length;if(o>0){var d=()=>--o||i();for(var c of r)c.out(d)}else i()}function Is(e,t,a){if((e.f&Ut)===0){e.f^=Ut;var r=e.nodes&&e.nodes.t;if(r!==null)for(const c of r)(c.is_global||a)&&t.push(c);for(var i=e.first;i!==null;){var o=i.next;if((i.f&na)===0){var d=(i.f&qa)!==0||(i.f&Tn)!==0&&(e.f&Sn)!==0;Is(i,t,d?a:!1)}i=o}}}function Cr(e){Ns(e,!0)}function Ns(e,t){if((e.f&Ut)!==0){e.f^=Ut,(e.f&St)===0&&(gt(e,Ct),wa.ensure().schedule(e));for(var a=e.first;a!==null;){var r=a.next,i=(a.f&qa)!==0||(a.f&Tn)!==0;Ns(a,i?t:!1),a=r}var o=e.nodes&&e.nodes.t;if(o!==null)for(const d of o)(d.is_global||t)&&d.in()}}function Ti(e,t){if(e.nodes)for(var a=e.nodes.start,r=e.nodes.end;a!==null;){var i=a===r?null:fr(a);t.append(a),a=i}}let Mr=!1,aa=!1;function Ri(e){aa=e}let he=null,En=!1;function mn(e){he=e}let me=null;function Bn(e){me=e}let On=null;function Fs(e){he!==null&&(On??(On=new Set)).add(e)}let Jt=null,nn=0,cn=null;function fo(e){cn=e}let Ks=1,oa=0,ba=oa;function qi(e){ba=e}function Gs(){return++Ks}function pr(e){var t=e.f;if((t&Ct)!==0)return!0;if(t&zt&&(e.f&=~ya),(t&qn)!==0){for(var a=e.deps,r=a.length,i=0;ie.wv)return!0}(t&gn)!==0&&At===null&>(e,St)}return!1}function Us(e,t,a=!0){var r=e.reactions;if(r!==null&&!(On!==null&&On.has(e)))for(var i=0;i{e.ac.abort(Rr)}),e.ac=null);try{e.f|=Tr;var h=e.fn,E=h();e.f|=Ka;var p=e.deps,w=W==null?void 0:W.is_fork;if(Jt!==null){var A;if(w||sr(e,nn),p!==null&&nn>0)for(p.length=nn+Jt.length,A=0;A{throw R});throw p}}finally{e[da]=t,delete e.currentTarget,mn(h),Bn(E)}}}var ns;const Vr=((ns=globalThis==null?void 0:globalThis.window)==null?void 0:ns.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function mo(e){return(Vr==null?void 0:Vr.createHTML(e))??e}function bo(e){var t=zs("template");return t.innerHTML=mo(e.replaceAll("","")),t.content}function Fa(e,t){var a=me;a.nodes===null&&(a.nodes={start:e,end:t,a:null,t:null})}function k(e,t){var a=(t&$l)!==0,r=(t&Al)!==0,i,o=!e.startsWith("");return()=>{i===void 0&&(i=bo(o?e:""+e),a||(i=ea(i)));var d=r||$s?document.importNode(i,!0):i.cloneNode(!0);if(a){var c=ea(d),u=d.lastChild;Fa(c,u)}else Fa(d,d);return d}}function tr(e=""){{var t=Hn(e+"");return Fa(t,t),t}}function Br(){var e=document.createDocumentFragment(),t=document.createComment(""),a=Hn();return e.append(t,a),Fa(t,a),e}function b(e,t){e!==null&&e.before(t)}function m(e,t){var a=t==null?"":typeof t=="object"?`${t}`:t;a!==(e[Va]??(e[Va]=e.nodeValue))&&(e[Va]=a,e.nodeValue=`${a}`)}function yo(e,t){return wo(e,t)}const _r=new Map;function wo(e,{target:t,anchor:a,props:r={},events:i,context:o,intro:d=!0,transformError:c}){ro();var u=void 0,v=co(()=>{var h=a??t.appendChild(Hn());Nl(h,{pending:()=>{}},w=>{ra({});var A=Lt;o&&(A.c=o),i&&(r.$$events=i),u=e(w,r)||{},ia()},c);var E=new Set,p=w=>{for(var A=0;A{var M;for(var w of E)for(const R of[t,document]){var A=_r.get(R),L=A.get(w);--L==0?(R.removeEventListener(w,Ii),A.delete(w),A.size===0&&_r.delete(R)):A.set(w,L)}ui.delete(p),h!==a&&((M=h.parentNode)==null||M.removeChild(h))}});return xo.set(u,v),u}let xo=new WeakMap;var kn,Pn,rn,ha,ur,vr,Pr;class ko{constructor(t,a=!0){en(this,"anchor");de(this,kn,new Map);de(this,Pn,new Map);de(this,rn,new Map);de(this,ha,new Set);de(this,ur,!0);de(this,vr,t=>{if(f(this,kn).has(t)){var a=f(this,kn).get(t),r=f(this,Pn).get(a);if(r)Cr(r),f(this,ha).delete(a);else{var i=f(this,rn).get(a);i&&(Cr(i.effect),f(this,Pn).set(a,i.effect),f(this,rn).delete(a),i.fragment.lastChild.remove(),this.anchor.before(i.fragment),r=i.effect)}for(const[o,d]of f(this,kn)){if(f(this,kn).delete(o),o===t)break;const c=f(this,rn).get(d);c&&(Qt(c.effect),f(this,rn).delete(d))}for(const[o,d]of f(this,Pn)){if(o===a||f(this,ha).has(o))continue;const c=()=>{if(Array.from(f(this,kn).values()).includes(o)){var v=document.createDocumentFragment();Ti(d,v),v.append(Hn()),f(this,rn).set(o,{effect:d,fragment:v})}else Qt(d);f(this,ha).delete(o),f(this,Pn).delete(o)};f(this,ur)||!r?(f(this,ha).add(o),ma(d,c,!1)):c()}}});de(this,Pr,t=>{f(this,kn).delete(t);const a=Array.from(f(this,kn).values());for(const[r,i]of f(this,rn))a.includes(r)||(Qt(i.effect),f(this,rn).delete(r))});this.anchor=t,se(this,ur,a)}ensure(t,a){var r=W,i=Ls();if(a&&!f(this,Pn).has(t)&&!f(this,rn).has(t))if(i){var o=document.createDocumentFragment(),d=Hn();o.append(d),f(this,rn).set(t,{effect:pn(()=>a(d)),fragment:o})}else f(this,Pn).set(t,pn(()=>a(this.anchor)));if(f(this,kn).set(r,t),i){for(const[c,u]of f(this,Pn))c===t?r.unskip_effect(u):r.skip_effect(u);for(const[c,u]of f(this,rn))c===t?r.unskip_effect(u.effect):r.skip_effect(u.effect);r.oncommit(f(this,vr)),r.ondiscard(f(this,Pr))}else f(this,vr).call(this,r)}}kn=new WeakMap,Pn=new WeakMap,rn=new WeakMap,ha=new WeakMap,ur=new WeakMap,vr=new WeakMap,Pr=new WeakMap;function G(e,t,a=!1){var r=new ko(e),i=a?qa:0;function o(d,c){r.ensure(d,c)}Si(()=>{var d=!1;t((c,u=0)=>{d=!0,o(u,c)}),d||o(-1,null)},i)}function Ye(e,t){return t}function Mo(e,t,a){for(var r=[],i=t.length,o,d=t.length,c=0;c{if(o){if(o.pending.delete(E),o.done.add(E),o.pending.size===0){var p=e.outrogroups;vi(e,Dr(o.done)),p.delete(o),p.size===0&&(e.outrogroups=null)}}else d-=1},!1)}if(d===0){var u=r.length===0&&a!==null;if(u){var v=a,h=v.parentNode;io(h),h.append(v),e.items.clear()}vi(e,t,!u)}else o={pending:new Set(t),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(o)}function vi(e,t,a=!0){var r;if(e.pending.size>0){r=new Set;for(const d of e.pending.values())for(const c of d)r.add(e.items.get(c).e)}for(var i=0;i{var re=a();return hi(re)?re:re==null?[]:Dr(re)}),p,w=new Map,A=!0;function L(re){(Se.effect.f&_n)===0&&(Se.pending.delete(re),Se.fallback=h,So(Se,p,d,t,r),h!==null&&(p.length===0?(h.f&Dn)===0?Cr(h):(h.f^=Dn,Qa(h,null,d)):ma(h,()=>{h=null})))}function M(re){Se.pending.delete(re)}var R=Si(()=>{p=n(E);for(var re=p.length,ve=new Set,be=W,F=Ls(),H=0;Ho(d)):(h=pn(()=>o(Ni??(Ni=Hn()))),h.f|=Dn)),re>ve.size&&hl(),!A)if(w.set(be,ve),F){for(const[ze,nt]of c)ve.has(ze)||be.skip_effect(nt.e);be.oncommit(L),be.ondiscard(M)}else L(be);n(E)}),Se={effect:R,items:c,pending:w,outrogroups:null,fallback:h};A=!1}function Ha(e){for(;e!==null&&(e.f&Tn)===0;)e=e.next;return e}function So(e,t,a,r,i){var Ee,ze,nt,T,J,oe,Pe,Q,ye;var o=(r&El)!==0,d=t.length,c=e.items,u=Ha(e.effect.first),v,h=null,E,p=[],w=[],A,L,M,R;if(o)for(R=0;R0){var fe=(r&ds)!==0&&d===0?a:null;if(o){for(R=0;R{var ne,Ke;if(E!==void 0)for(M of E)(Ke=(ne=M.nodes)==null?void 0:ne.a)==null||Ke.apply()})}function Eo(e,t,a,r,i,o,d,c){var u=(d&Ml)!==0?(d&Tl)===0?to(a,!1,!1):xa(a):null,v=(d&Sl)!==0?xa(i):null;return{v:u,i:v,e:pn(()=>(o(t,u??a,v??i,c),()=>{e.delete(r)}))}}function Qa(e,t,a){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,o=t&&(t.f&Dn)===0?t.nodes.start:a;r!==null;){var d=fr(r);if(o.before(r),r===i)return;r=d}}function Jn(e,t,a){t===null?e.effect.first=a:t.next=a,a===null?e.effect.last=t:a.prev=t}function qe(e,t,a=!1,r=!1,i=!1,o=!1){var d=e,c="";if(a)var u=e;O(()=>{var v=me;if(c!==(c=t()??"")){if(a){v.nodes=null,u.innerHTML=c,c!==""&&Fa(ea(u),u.lastChild);return}if(v.nodes!==null&&(qs(v.nodes.start,v.nodes.end),v.nodes=null),c!==""){var h=r?Cl:i?Ll:void 0,E=zs(r?"svg":i?"math":"template",h);E.innerHTML=c;var p=r||i?E:E.content;if(Fa(ea(p),p.lastChild),r||i)for(;ea(p);)d.before(ea(p));else d.before(p)}}})}function To(e,t,a){var r=e==null?"":""+e;return r===""?null:r}function $o(e,t){return e==null?null:String(e)}function vt(e,t,a,r,i,o){var d=e[ai];if(d!==a||d===void 0){var c=To(a);c==null?e.removeAttribute("class"):e.className=c,e[ai]=a}return o}function hn(e,t,a,r){var i=e[ri];if(i!==t){var o=$o(t);o==null?e.removeAttribute("style"):e.style.cssText=o,e[ri]=t}return r}function Js(e,t,a=!1){if(e.multiple){if(t==null)return;if(!hi(t))return Pl();for(var r of e.options)r.selected=t.includes(ar(r));return}for(r of e.options){var i=ar(r);if(ao(i,t)){r.selected=!0;return}}(!a||t!==void 0)&&(e.selectedIndex=-1)}function Ao(e){var t=new MutationObserver(()=>{Js(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),Ps(()=>{t.disconnect()})}function nr(e,t,a=t){var r=new WeakSet,i=!0;xi(e,"change",o=>{var d=o?"[selected]":":checked",c;if(e.multiple)c=[].map.call(e.querySelectorAll(d),ar);else{var u=e.querySelector(d)??e.querySelector("option:not([disabled])");c=u&&ar(u)}a(c),e.__value=c,W!==null&&r.add(W)}),Os(()=>{var o=t();if(e===document.activeElement){var d=W;if(r.has(d))return}if(Js(e,o,i),i&&o===void 0){var c=e.querySelector(":checked");c!==null&&(o=ar(c),a(o))}e.__value=o,i=!1}),Ao(e)}function ar(e){return"__value"in e?e.__value:e.value}const Co=Symbol("is custom element"),Lo=Symbol("is html"),zo=fl?"progress":"PROGRESS";function mr(e,t){var a=Qs(e);a.value===(a.value=t??void 0)||e.value===t&&(t!==0||e.nodeName!==zo)||(e.value=t??"")}function Ir(e,t,a,r){var i=Qs(e);i[t]!==(i[t]=a)&&(t==="loading"&&(e[vl]=a),a==null?e.removeAttribute(t):typeof a!="string"&&Po(e).includes(t)?e[t]=a:e.setAttribute(t,a))}function Qs(e){return e[br]??(e[br]={[Co]:e.nodeName.includes("-"),[Lo]:e.namespaceURI===cs})}var Fi=new Map;function Po(e){var t=e.getAttribute("is")||e.nodeName,a=Fi.get(t);if(a)return a;Fi.set(t,a=[]);for(var r,i=e,o=Element.prototype;o!==i;){r=il(i);for(var d in r)r[d].set&&d!=="innerHTML"&&d!=="textContent"&&d!=="innerText"&&a.push(d);i=is(i)}return a}function Ln(e,t,a=t){var r=new WeakSet;xi(e,"input",async i=>{var o=i?e.defaultValue:e.value;if(o=Wr(e)?jr(o):o,a(o),W!==null&&r.add(W),await ho(),o!==(o=t())){var d=e.selectionStart,c=e.selectionEnd,u=e.value.length;if(e.value=o??"",c!==null){var v=e.value.length;d===c&&c===u&&v>u?(e.selectionStart=v,e.selectionEnd=v):(e.selectionStart=d,e.selectionEnd=Math.min(c,v))}}}),Ua(t)==null&&e.value&&(a(Wr(e)?jr(e.value):e.value),W!==null&&r.add(W)),qr(()=>{var i=t();if(e===document.activeElement){var o=W;if(r.has(o))return}Wr(e)&&i===jr(e.value)||e.type==="date"&&!i&&!e.value||i!==e.value&&(e.value=i??"")})}function Do(e,t,a=t){xi(e,"change",r=>{var i=r?e.defaultChecked:e.checked;a(i)}),Ua(t)==null&&a(e.checked),qr(()=>{var r=t();e.checked=!!r})}function Wr(e){var t=e.type;return t==="number"||t==="range"}function jr(e){return e===""?null:+e}function Jr(e,t){return e===t||(e==null?void 0:e[$a])===t}function Oo(e={},t,a,r){var i=Lt.r,o=me;return Os(()=>{var d,c;return qr(()=>{d=c,c=[],Ua(()=>{Jr(a(...c),e)||(t(e,...c),d&&Jr(a(...d),e)&&t(null,...d))})}),()=>{let u=o;for(;u!==i&&u.parent!==null&&u.parent.f∋)u=u.parent;const v=()=>{c&&Jr(a(...c),e)&&t(null,...c)},h=u.teardown;u.teardown=()=>{v(),h==null||h()}}}),e}function hr(e){Lt===null&&os(),Mi(()=>{const t=Ua(e);if(typeof t=="function")return t})}function Ro(e){Lt===null&&os(),hr(()=>()=>Ua(e))}let lr=localStorage.getItem("mc_token")||"";function Ys(){return lr}function qo(e){lr=(e||"").trim(),localStorage.setItem("mc_token",lr)}function Bo(){const e={"Content-Type":"application/json"};return lr&&(e["X-MC-Token"]=lr),e}function rr(){return localStorage.getItem("mc_hf_token")||""}function Io(e){localStorage.setItem("mc_hf_token",(e||"").trim())}async function ge(e,t={}){const a=await fetch(e,{headers:Bo(),...t}),r=await a.json().catch(()=>({}));if(!a.ok)throw new Error(r.error||"HTTP "+a.status);return r}const No=(e,t=document)=>t.querySelector(e),Ki=(e,t=document)=>[...t.querySelectorAll(e)];function Rn(e){return String(e??"").replace(/[&<>]/g,t=>({"&":"&","<":"<",">":">"})[t])}let Gi;function te(e,t=!1){const a=No("#toast");a&&(a.textContent=e,a.className="toast show"+(t?" err":""),clearTimeout(Gi),Gi=setTimeout(()=>a.className="toast",3200))}function Fo(e,t){return e==="running"||e==="ready"?'geladen':e==="loading"||e==="starting"?'lädt…':e==="downloading"?`↓ Download${t!=null?` ${Math.round(t)}%`:""}`:'bereit'}const Re=e=>`${e}`,Nr={logo:Re(''),grid:Re(''),cpu:Re(''),pulse:Re(''),server:Re(''),book:Re(''),help:Re(''),settings:Re(''),swap:Re(''),monitor:Re(''),layers:Re(''),alert:Re(''),gauge:Re(''),search:Re(''),compass:Re(''),code:Re(''),eye:Re(''),refresh:Re(''),file:Re(''),database:Re(''),thermo:Re(''),shield:Re(''),info:Re(''),chevron:Re(''),bolt:Re(''),x:Re(''),check:Re(''),download:Re(''),clock:Re('')};function tn(e){return Nr[e]||""}function fi(e){return`${Nr.info}`}function sa(e){if(!e&&e!==0)return"–";const t=e/1024/1024/1024;return t>=1?t.toFixed(1)+" GB":Math.round(e/1024/1024)+" MB"}function Mn({title:e,body:t,confirmLabel:a="Bestätigen",cancelLabel:r="Abbrechen",danger:i=!1}){return new Promise(o=>{const d=document.createElement("div");d.className="modal-overlay",d.innerHTML=``;const c=v=>{d.remove(),o(v)};d.addEventListener("click",v=>{if(v.target===d)return c(!1);const u=v.target.closest("[data-x]");u&&c(u.getAttribute("data-x")==="1")}),document.body.appendChild(d),d.querySelector('[data-x="1"]').focus()})}function Wi({title:e,body:t="",placeholder:n="",password:r=!1,confirmLabel:i="Weiter",danger:o=!1}){return new Promise(d=>{const c=document.createElement("div");c.className="modal-overlay",c.innerHTML=``;const u=c.querySelector("input"),v=h=>{c.remove(),d(h)};c.addEventListener("click",h=>{if(h.target===c)return v(null);const E=h.target.closest("[data-x]");E&&v(E.getAttribute("data-x")==="1"?u.value||"":null)}),u.addEventListener("keydown",h=>{h.key==="Enter"&&v(u.value||""),h.key==="Escape"&&v(null)}),document.body.appendChild(c),u.focus()})}function Ko(e="overview"){const t=Ki(".nav-item[data-view]:not(.disabled)"),a=Ki(".view[data-view]"),r=new Set(a.map(o=>o.dataset.view));function i(o){r.has(o)||(o=e),a.forEach(d=>d.hidden=d.dataset.view!==o),t.forEach(d=>d.classList.toggle("active",d.dataset.view===o)),location.hash!=="#/"+o&&(location.hash="#/"+o)}return t.forEach(o=>o.addEventListener("click",d=>{d.preventDefault(),i(o.dataset.view)})),window.addEventListener("hashchange",()=>i(location.hash.replace("#/",""))),i(location.hash.replace("#/","")||e),{show:i}}let Hi=B(null);const gr={get value(){return n(Hi)},set(e){g(Hi,e,!0)}};let Vi=B(Dt([])),Qn=B(Dt([]));const ca={get value(){return n(Vi)},set(e){g(Vi,e||[],!0)},get tracked(){return n(Qn)},track(e){n(Qn).includes(e)||g(Qn,[...n(Qn),e],!0)},toggle(e){g(Qn,n(Qn).includes(e)?n(Qn).filter(t=>t!==e):[...n(Qn),e],!0)}};let Wi=B(null);const $i={get value(){return n(Wi)},set(e){g(Wi,e,!0)}},Go="5";var as;typeof window<"u"&&((as=window.__svelte??(window.__svelte={})).v??(as.v=new Set)).add(Go);var Uo=k('— bereit für Anfragen'),Ho=k('
Temperatur (GPU)
Freier Speicher
GB
',1),Vo=k('
Temperatur
messe…
Freier Speicher
messe…
',1),Wo=k('
'),jo=k('
Warte auf Messwerte…
'),Jo=k('Bild'),Qo=k('Code'),Yo=k('Text'),Zo=k('∞ aktiv'),Xo=k(''),ed=k('
'),ji=k('
'),td=k('
Noch keine Modelle
Hol dir unter „Cookbook" ein Modell, das auf deine Hardware passt.
'),nd=k('
'),ad=k('
News gerade nicht ladbar.
'),rd=k('

LLM-Engine
Aktives Modell

System-Gesundheit

Auslastung in Echtzeit.

Schnellstart

Die häufigsten Aufgaben — ein Klick.

Dein Stack

Top-News

Alle →
',1);function id(e,t){ra(t,!0);const a=I(()=>gr.value),r=I(()=>$i.value),i=I(()=>{var S;return((S=n(a))==null?void 0:S.models)||[]}),o=I(()=>{var S;return((S=n(a))==null?void 0:S.swap_ok)??!1}),d=["running","ready","loading","starting"],c=I(()=>n(i).find(S=>d.includes(S.state))),u=I(()=>n(i).filter(S=>!S.incomplete)),v=I(()=>n(a)?n(o)?n(r)&&n(r).ram.percent>=90?"Achtung: Speicher wird knapp.":"Alles läuft rund.":"LLM-Engine offline":"Verbinde…"),h=I(()=>n(a)?n(o)?n(r)&&n(r).ram.percent>=90?`Arbeitsspeicher bei ${Math.round(n(r).ram.percent)} % — eventuell Speicher freigeben.`:`${n(u).length} ${n(u).length===1?"Modell":"Modelle"} konfiguriert · ${n(c)?`„${n(c).name}" geladen`:"keines geladen"} · keine Warnungen.`:"Der llama-swap-Dienst antwortet gerade nicht.":""),E=I(()=>()=>{var ee;const S=(ee=n(r))==null?void 0:ee.gpu;return S&&S.vram.total+S.gtt.total>0?(S.vram.used+S.gtt.used)/(S.vram.total+S.gtt.total)*100:0});let p=B(Dt([])),w=B(null);hr(async()=>{try{g(p,((await ge("/api/news")).items||[]).slice(0,4),!0)}catch{}});async function A(){await Mn({title:"Speicher freigeben?",body:"Alle aktuell geladenen Modelle werden aus dem Grafikspeicher geworfen. Sie laden beim nächsten Aufruf automatisch neu.",confirmLabel:"Speicher freigeben"})&&(await ge("/api/unload",{method:"POST"}),M())}async function L(S){g(w,S,!0);try{await ge("/api/preload?model="+encodeURIComponent(S),{method:"POST"})}catch{}g(w,null),M()}function M(){document.dispatchEvent(new Event("mc:refresh"))}function R(S){var ee;(ee=document.querySelector(`.nav-item[data-view="${S}"]`))==null||ee.dispatchEvent(new MouseEvent("click"))}function Se(S){return S>=90?"red":S>=75?"":"green"}function re(S){return S==null?"":S>=75?"red":S>=55?"":"green"}function ve(S){return S>=90?"red":S>=70?"":"green"}var be=rd(),F=_t(be),H=l(F),ue=l(H),fe=l(ue),Ee=s(fe);{var ze=S=>{var ee=Uo();b(S,ee)};G(Ee,S=>{n(o)&&!n(c)&&S(ze)})}var nt=s(ue,2),T=l(nt),J=s(F,2),oe=l(J),Pe=l(oe),Q=s(l(Pe),2);qe(Q,()=>tn("server"),!0);var ye=s(Pe,2),ne=l(ye),Ke=s(ye,2),Ie=l(Ke),He=s(oe,2),Ve=l(He),We=s(l(Ve),2);qe(We,()=>tn("cpu"),!0);var Tt=s(Ve,2),Pt=l(Tt),Ot=s(Tt,2),Rt=l(Ot);{var qt=S=>{var ee=tr();O(st=>m(ee,`${st??""} · ${n(c).state??""}`),[()=>{var st;return(st=n(c).meta)!=null&&st.ctx?Math.round(n(c).meta.ctx/1024)+"k ctx":""}]),b(S,ee)},D=S=>{var ee=tr("lädt bei erster Anfrage");b(S,ee)};G(Rt,S=>{n(c)?S(qt):S(D,-1)})}var U=s(He,2);{var Z=S=>{const ee=I(()=>{var lt;return n(r).gpu_temp??((lt=n(r).cpu)==null?void 0:lt.temp)??null}),st=I(()=>re(n(ee))),xe=I(()=>n(r).ram.total-n(r).ram.used),rt=I(()=>100-n(r).ram.percent);var Vt=Ho(),_e=_t(Vt),Qe=l(_e),dn=s(l(Qe));qe(dn,()=>tn("thermo"),!0);var Nt=s(Qe,2),In=l(Nt),Nn=s(Nt,2),An=l(Nn),_=s(_e,2),y=l(_),N=s(l(y));qe(N,()=>tn("database"),!0);var q=s(y,2),Y=l(q),Ce=s(q,2),Le=l(Ce);O((lt,yt,Te,De)=>{vt(_e,1,`kpi ${n(st)??""}`),m(In,lt),m(An,n(ee)==null?"messe…":n(ee)<55?"kühl":n(ee)<75?"normal":"⚠ heiß"),vt(_,1,`kpi ${n(rt)<15?"red":n(rt)<30?"":"green"}`),m(Y,yt),m(Le,`von ${Te??""} GB · ${De??""} % frei`)},[()=>n(ee)!=null?`${Math.round(n(ee))}°C`:"–",()=>Math.round(n(xe)/1073741824),()=>Math.round(n(r).ram.total/1073741824),()=>Math.round(n(rt))]),b(S,Vt)},le=S=>{var ee=Vo();b(S,ee)};G(U,S=>{n(r)?S(Z):S(le,-1)})}var x=s(J,2),z=l(x),K=s(l(z),4);{var ie=S=>{const ee=I(()=>n(E)());var st=Br(),xe=_t(st);Ze(xe,17,()=>{var rt;return[["Prozessor (CPU)",((rt=n(r).cpu)==null?void 0:rt.percent)??0,""],["Arbeitsspeicher (RAM)",n(r).ram.percent,Se(n(r).ram.percent)],["Grafikspeicher (VRAM)",n(ee),ve(n(ee))]]},Ye,(rt,Vt)=>{var _e=I(()=>ir(n(Vt),3));let Qe=()=>n(_e)[0],dn=()=>n(_e)[1];const Nt=I(()=>Math.max(0,Math.min(100,dn()||0)));var In=Wo(),Nn=l(In),An=l(Nn),_=l(An),y=s(An),N=l(y),q=s(Nn,2),Y=l(q);O((Ce,Le)=>{m(_,Qe()),m(N,`${Ce??""} %`),vt(q,1,`bar ${n(Nt)>=90?"bad":n(Nt)>=75?"warn":""}`),hn(Y,`width:${Le??""}%`)},[()=>Math.round(n(Nt)),()=>Math.max(2,n(Nt))]),b(rt,In)}),b(S,st)},$=S=>{var ee=jo();b(S,ee)};G(K,S=>{n(r)?S(ie):S($,-1)})}var V=s(z,2),ae=s(l(V),4),we=l(ae);qe(we,()=>tn("search"),!0);var Xe=s(we,4);qe(Xe,()=>tn("chevron"),!0);var Ae=s(ae,2),at=l(Ae);qe(at,()=>tn("refresh"),!0);var it=s(at,4);qe(it,()=>tn("chevron"),!0);var mt=s(Ae,2),et=l(mt);qe(et,()=>tn("file"),!0);var bt=s(et,4);qe(bt,()=>tn("chevron"),!0);var C=s(mt,2),X=l(C);qe(X,()=>tn("swap"),!0);var pe=s(X,4);qe(pe,()=>tn("chevron"),!0);var je=s(x,2),Ne=l(je),Bt=l(Ne),Ht=s(l(Bt),2),It=l(Ht),Yt=s(Bt,2);{var sn=S=>{var ee=ji();Ze(ee,21,()=>n(u),Ye,(st,xe)=>{const rt=I(()=>d.includes(n(xe).state)),Vt=I(()=>n(xe).state==="downloading"),_e=I(()=>n(xe).state==="loading"||n(xe).state==="starting"||n(Vt)?"load":n(rt)?"on":""),Qe=I(()=>n(Vt)?`↓ ${n(xe).download_progress!=null?Math.round(n(xe).download_progress)+"%":"..."}`:n(xe).state==="loading"||n(xe).state==="starting"?"lädt…":n(rt)?"geladen ✓":"bereit");var dn=ed(),Nt=l(dn),In=s(Nt,2),Nn=l(In),An=l(Nn),_=l(An),y=s(An,2);{var N=j=>{var ce=Jo();b(j,ce)},q=I(()=>{var j,ce;return(ce=(j=n(xe).meta)==null?void 0:j.caps)==null?void 0:ce.includes("Bild")}),Y=j=>{var ce=Qo();b(j,ce)},Ce=I(()=>{var j,ce;return(ce=(j=n(xe).meta)==null?void 0:j.caps)==null?void 0:ce.includes("Code")}),Le=j=>{var ce=Yo();b(j,ce)};G(y,j=>{n(q)?j(N):n(Ce)?j(Y,1):j(Le,-1)})}var lt=s(y,2);{var yt=j=>{var ce=Zo();b(j,ce)};G(lt,j=>{n(xe).ttl>=99999&&j(yt)})}var Te=s(Nn,2),De=l(Te),Me=s(In,2),ke=l(Me),Fe=l(ke),Ge=s(ke,2);{var Oe=j=>{var ce=Xo(),ot=l(ce);O(()=>{hn(ce,`padding:3px 9px;font-size:12px;opacity:${n(w)===n(xe).name?".5":"1"}`),ce.disabled=n(w)===n(xe).name,m(ot,n(w)===n(xe).name?"…":"Laden")}),P("click",ce,()=>L(n(xe).name)),b(j,ce)};G(Ge,j=>{!n(rt)&&!n(Vt)&&n(o)&&j(Oe)})}O((j,ce)=>{var ot;vt(Nt,1,`li-dot ${n(_e)??""}`),hn(An,n(rt)?"color:var(--accent)":""),m(_,n(xe).name),m(De,`${j??""} - ${(ot=n(xe).meta)!=null&&ot.quant?" · "+n(xe).meta.quant:""} - ${ce??""}`),hn(ke,`white-space:nowrap;color:${n(rt)?"var(--on)":"var(--mut)"}`),m(Fe,n(Qe))},[()=>{var j;return(j=n(xe).meta)!=null&&j.ctx?Math.round(n(xe).meta.ctx/1024)+"k ctx":""},()=>{var j;return(j=n(xe).meta)!=null&&j.size_bytes?" · "+(n(xe).meta.size_bytes/1073741824).toFixed(1)+" GB":""}]),b(st,dn)}),b(S,ee)},bn=S=>{var ee=td(),st=s(l(ee),4);P("click",st,()=>R("cookbook")),b(S,ee)};G(Yt,S=>{n(u).length?S(sn):S(bn,-1)})}var $n=s(Ne,2),ln=l($n),on=s(l(ln),2),yn=s(ln,2);{var Je=S=>{var ee=ji();Ze(ee,21,()=>n(p),Ye,(st,xe)=>{var rt=nd(),Vt=l(rt),_e=l(Vt),Qe=l(_e),dn=s(_e,2),Nt=l(dn);O(()=>{Ir(rt,"href",n(xe).link),m(Qe,n(xe).title),m(Nt,`${n(xe).source??""}${n(xe).relevant?" · für dich":""}`)}),b(st,rt)}),b(S,ee)},pt=S=>{var ee=ad();b(S,ee)};G(yn,S=>{n(p).length?S(Je):S(pt,-1)})}O(S=>{m(fe,`${n(v)??""} `),m(T,n(h)),vt(oe,1,`kpi ${n(o)?"green":"red"}`),m(ne,n(o)?"Online":"Offline"),m(Ie,S),vt(He,1,`kpi ${n(c)?"blue":"muted"}`),m(Pt,n(c)?n(c).name:"Keins"),m(It,n(u).length?n(u).length+" konfiguriert":"")},[()=>{var S,ee;return((ee=(S=n(a))==null?void 0:S.swap_url)==null?void 0:ee.replace(/^https?:\/\//,""))??"—"}]),P("click",ae,()=>R("cookbook")),P("click",Ae,A),P("click",mt,()=>R("server")),P("click",C,()=>R("connect")),P("click",on,()=>R("news")),P("keydown",on,S=>S.key==="Enter"&&R("news")),b(e,be),ia()}ka(["click","keydown"]);var sd=k(""),ld=k('
'),od=k('
Noch keine Modelle konfiguriert
Hol dir unter „Cookbook" ein passendes Modell.
'),dd=k('
kein Modell hinterlegt
leere Rolleleer '),cd=k(' '),ud=k('
'),vd=k(' '),fd=k('
API-Name:
'),pd=k('
ModellKannDetailsStatusPortAktionen
'),hd=k('
Empfohlen für deine Hardware

'),gd=k(''),_d=k(''),md=k(''),bd=k('

Modelle

Deine konfigurierten Modelle — testen, Kontext anpassen oder aus dem Speicher werfen.

Schnelltest

Schreib eine Nachricht — das gewählte Modell wird automatisch geweckt.

Modelle & Ports

Modelle laden automatisch, sobald eine Anfrage kommt — du musst nichts manuell starten.
',1);function yd(e,t){ra(t,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr (längere Dateien/Chats), braucht aber mehr Speicher und wird etwas langsamer.",r="Die Rolle ist ein zusätzlicher, sprechender Name (z.B. coder). Du kannst in deinen Tools entweder den echten Modellnamen ODER die Rolle angeben — beides führt zum selben Modell.",i=[{id:"coder",label:"Coder",desc:"Programmieren & Code"},{id:"vision",label:"Vision",desc:"Bilder verstehen"},{id:"scout",label:"Scout",desc:"Schneller Allrounder"},{id:"reviewer",label:"Reviewer",desc:"Code/Texte prüfen"},{id:"manager",label:"Manager",desc:"Planen & koordinieren"}],o=I(()=>{var x;return((x=gr.value)==null?void 0:x.models)||[]});function d(){document.dispatchEvent(new Event("mc:refresh"))}let c=B(""),u=B(""),v=B(""),h=B(!1);const E=I(()=>n(o).filter(x=>!x.incomplete));async function p(){var z;const x=n(c)||((z=n(E)[0])==null?void 0:z.name);if(!(!x||!n(u).trim())){g(h,!0),g(v,"(wecke Modell, kann beim Laden kurz dauern…)");try{const K=await ge("/api/chat",{method:"POST",body:JSON.stringify({model:x,message:n(u)})});g(v,K.reply,!0)}catch(K){g(v,"Fehler: "+K.message)}g(h,!1),d()}}const w=300;let A=B(!1),L=B(null),M=B(8192),R=B(!1);function Se(x){var z;g(L,n(o).find(K=>K.name===x),!0),n(L)&&(g(M,((z=n(L).meta)==null?void 0:z.ctx)||8192,!0),g(R,(n(L).ttl??w)>=99999),g(A,!0))}async function re(){const x=n(R)?99999:w;try{await ge("/api/update_model",{method:"POST",body:JSON.stringify({alias:n(L).name,ctx:n(M),ttl:x})}),te("Gespeichert — aktiv beim nächsten Modell-Start."),g(A,!1),d()}catch(z){te(z.message,!0)}}let ve=B(!1),be=B(""),F=B(""),H=B("");function ue(x){const z=n(o).find(K=>K.name===x);g(be,x,!0),g(H,(z==null?void 0:z.role)||"",!0),g(F,""),g(ve,!0)}async function fe(x){try{await ge("/api/set_role",{method:"POST",body:JSON.stringify({alias:n(be),role:x})}),te(x?`Rolle gesetzt: ${x}`:"Rolle entfernt."),g(ve,!1),d()}catch(z){te(z.message,!0)}}async function Ee(x){if(await Mn({title:`„${x}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await ge("/api/unload?model="+encodeURIComponent(x),{method:"POST"}),te("Entladen: "+x),setTimeout(d,600)}catch(z){te(z.message,!0)}}async function ze(x){if(await Mn({title:`„${x}" wirklich löschen?`,body:"Das Modell wird aus der Konfiguration ausgetragen und seine Dateien werden von der Festplatte gelöscht, um Speicher freizugeben. Das lässt sich nicht rückgängig machen — später brauchst du dafür einen neuen Download.",confirmLabel:"Endgültig löschen",danger:!0}))try{const z=await ge("/api/delete_model",{method:"POST",body:JSON.stringify({alias:x})});te(z.note||"Gelöscht: "+x),setTimeout(d,600)}catch(z){te(z.message,!0)}}function nt(x){return x!=null&&x.length?x.map(z=>z==="Code"?'Code':z==="Bild"?'Bild':'Text').join(" "):"–"}function T(x){if(!x)return"–";const z=x.quant||"?",K=x.ctx?Math.round(x.ctx/1024)+"K":"?",ie=x.size_bytes?(x.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${z} · ${K} · ${ie}`}function J(x){var z;(z=navigator.clipboard)==null||z.writeText(x),te("Kopiert: "+x)}var oe=bd(),Pe=s(_t(oe),2),Q=s(l(Pe),6);Ze(Q,21,()=>n(E),Ye,(x,z)=>{var K=sd(),ie=l(K),$={};O(()=>{m(ie,n(z).name),$!==($=n(z).name)&&(K.value=(K.__value=n(z).name)??"")}),b(x,K)});var ye=s(Q,4),ne=s(ye,2),Ke=l(ne),Ie=s(ne,2);{var He=x=>{var z=ld(),K=l(z);O(()=>m(K,n(v))),b(x,z)};G(Ie,x=>{n(v)&&x(He)})}var Ve=s(Pe,2),We=l(Ve),Tt=s(l(We)),Pt=l(Tt),Ot=s(We,4);{var Rt=x=>{var z=od();b(x,z)},qt=x=>{var z=pd(),K=s(l(z));Ze(K,21,()=>n(o),Ye,(ie,$)=>{var V=Br(),ae=_t(V);{var we=Ae=>{var at=dd(),it=l(at),mt=l(it),et=s(it,5),bt=l(et),C=s(bt,2);O(()=>m(mt,n($).name)),P("click",bt,()=>{var X;te("Lade im Cookbook ein Modell und setze den Alias auf: "+n($).name),(X=document.querySelector(".nav-item[data-view='cookbook']"))==null||X.dispatchEvent(new MouseEvent("click"))}),P("click",C,()=>ze(n($).name)),b(Ae,at)},Xe=Ae=>{var at=fd(),it=l(at),mt=l(it),et=l(mt),bt=s(et);{var C=Je=>{var pt=cd(),S=l(pt);O(()=>m(S,n($).role)),b(Je,pt)};G(bt,Je=>{n($).role&&Je(C)})}var X=s(mt,2);{var pe=Je=>{var pt=ud(),S=l(pt);O(()=>m(S,n($).meta.filename)),b(Je,pt)};G(X,Je=>{var pt;(pt=n($).meta)!=null&&pt.filename&&Je(pe)})}var je=s(X,2),Ne=s(l(je),2);Ze(Ne,17,()=>{var Je;return(Je=n($).api_ids)!=null&&Je.length?n($).api_ids:[n($).name]},Ye,(Je,pt)=>{var S=vd(),ee=l(S);O(()=>m(ee,n(pt))),P("click",S,()=>J(n(pt))),b(Je,S)});var Bt=s(it);qe(Bt,()=>{var Je;return nt((Je=n($).meta)==null?void 0:Je.caps)},!0);var Ht=s(Bt);qe(Ht,()=>T(n($).meta),!0);var It=s(Ht);qe(It,()=>Fo(n($).state,n($).download_progress),!0);var Yt=s(It),sn=l(Yt),bn=s(Yt),$n=l(bn),ln=s($n,2),on=s(ln,2),yn=s(on,2);O(()=>{m(et,`${n($).name??""} `),m(sn,n($).port??"auto")}),P("click",$n,()=>ue(n($).name)),P("click",ln,()=>Se(n($).name)),P("click",on,()=>Ee(n($).name)),P("click",yn,()=>ze(n($).name)),b(Ae,at)};G(ae,Ae=>{n($).incomplete?Ae(we):Ae(Xe,-1)})}b(ie,V)}),b(x,z)};G(Ot,x=>{n(o).length?x(qt,-1):x(Rt)})}var D=s(Ve,2);{var U=x=>{var z=gd(),K=l(z),ie=l(K),$=s(ie,4),V=l($),ae=s($,2),we=s(l(ae));qe(we,()=>fi(a));var Xe=s(ae,2),Ae=s(Xe,2);{var at=pe=>{var je=hd(),Ne=l(je),Bt=s(l(Ne),2),Ht=l(Bt),It=s(Ht,2),Yt=s(Ne,2);O((sn,bn)=>{m(Ht,`Optimal ~${sn??""}k → ~${n(L).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),m(It,` Aktuell ~${bn??""}k → ~${n(L).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(n(L).meta.optimal_ctx/1024),()=>Math.round((n(L).meta.ctx||0)/1024)]),P("click",Yt,()=>g(M,n(L).meta.optimal_ctx,!0)),b(pe,je)};G(Ae,pe=>{var je;(je=n(L).meta)!=null&&je.optimal_ctx&&pe(at)})}var it=s(Ae,4),mt=s(l(it),2),et=l(mt),bt=s(et,2),C=l(bt),X=s(it,2);O(()=>{m(V,n(L).name),hn(bt,`color:${n(R)?"var(--accent)":"var(--mut)"}`),m(C,n(R)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),P("click",z,pe=>{pe.target.classList.contains("modal-overlay")&&g(A,!1)}),P("click",ie,()=>g(A,!1)),Ln(Xe,()=>n(M),pe=>g(M,pe)),Do(et,()=>n(R),pe=>g(R,pe)),P("click",X,re),b(x,z)};G(D,x=>{n(A)&&n(L)&&x(U)})}var Z=s(D,2);{var le=x=>{var z=md(),K=l(z),ie=l(K),$=s(ie,2),V=s(l($));qe(V,()=>fi(r));var ae=s($,2),we=l(ae),Xe=s(ae,4);Ze(Xe,21,()=>i,Ye,(et,bt)=>{var C=_d(),X=l(C);O(()=>{vt(C,1,n(H)===n(bt).id?"primary":"ghost"),Ir(C,"title",n(bt).desc),m(X,n(bt).label)}),P("click",C,()=>fe(n(bt).id)),b(et,C)});var Ae=s(Xe,4),at=s(Ae,2),it=l(at),mt=s(it,2);O(()=>m(we,n(be))),P("click",z,et=>{et.target.classList.contains("modal-overlay")&&g(ve,!1)}),P("click",ie,()=>g(ve,!1)),Ln(Ae,()=>n(F),et=>g(F,et)),P("click",it,()=>fe("")),P("click",mt,()=>fe(n(F).trim().toLowerCase())),b(x,z)};G(Z,x=>{n(ve)&&x(le)})}O(()=>{ne.disabled=n(h),m(Ke,n(h)?"…":"Senden"),m(Pt,n(o).length?n(o).length+" konfiguriert":"")}),nr(Q,()=>n(c),x=>g(c,x)),Ln(ye,()=>n(u),x=>g(u,x)),P("click",ne,p),b(e,oe),ia()}ka(["click"]);var wd=k('
Prozessor (CPU)
%
Arbeitsspeicher
%
Grafikspeicher
%

System-Metriken (Bosgame)

Live-Auslastung deines Mini-PCs, alle 0,5 Sekunden.
Arbeitsspeicher (RAM)
Grafikspeicher (VRAM + GTT)
Speicherplatz (Disk)
Temperatur (GPU / CPU)
CPU-Verlauf
RAM-Verlauf
VRAM-Verlauf
',1),xd=k(''),kd=k('
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
'),Md=k(' '),Sd=k(''),Ed=k(''),Td=k('
'),$d=k('
'),Ad=k('
'),Cd=k('

Aktivität

Live-Auslastung und laufende Aufgaben (Downloads, Updates) mit Protokoll.

Hintergrund-Aufgaben

Downloads & Updates erscheinen hier mit Live-Protokoll — zum Aufklappen klicken.
',1);function Ld(e,t){ra(t,!0);const a=I(()=>ca.value),r=I(()=>ca.tracked),i=I(()=>$i.value);let o=Dt({cpu:[],ram:[],gpu:[]});Mi(()=>{var oe;if(!n(i))return;const T=n(i).gpu,J=T&&T.vram.total+T.gtt.total>0?(T.vram.used+T.gtt.used)/(T.vram.total+T.gtt.total)*100:0;o.cpu=[...o.cpu,((oe=n(i).cpu)==null?void 0:oe.percent)??0].slice(-60),o.ram=[...o.ram,n(i).ram.percent].slice(-60),o.gpu=[...o.gpu,J].slice(-60)});const d=I(()=>()=>{var J;const T=(J=n(i))==null?void 0:J.gpu;return T&&T.vram.total+T.gtt.total>0?(T.vram.used+T.gtt.used)/(T.vram.total+T.gtt.total)*100:0}),c=I(()=>n(a).filter(T=>T.state!=="running"&&T.state!=="queued").length),u=I(()=>n(a).filter(T=>T.state==="failed").length);function v(T){if(T.state!=="running")return null;if(typeof T.progress=="number")return Math.min(100,T.progress);const oe=((T.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return oe?Math.min(100,parseFloat(oe[1])):null}function h(T){return T==null||T<0?"":T>=90?`noch ~${Math.round(T/60)} min`:`noch ~${Math.max(1,Math.round(T))} s`}function E(T){return T==="done"?'fertig':T==="failed"?'fehler':T==="canceled"?'abgebrochen':'läuft…'}function p(T){return T==="done"?"on":T==="failed"||T==="canceled"?"":"load"}async function w(T){try{await ge(`/api/jobs/${T}/cancel`,{method:"POST"}),te("Abbruch angefordert…")}catch(J){te(J.message,!0)}}async function A(T){try{await ge(`/api/jobs/${T}`,{method:"DELETE"})}catch(J){te(J.message,!0)}}async function L(){try{const T=await ge("/api/jobs/clear",{method:"POST"});te(`${T.removed} Einträge entfernt.`)}catch(T){te(T.message,!0)}}function M(T,J){return T.map(oe=>`
`).join("")}var R=Cd(),Se=s(_t(R),2);{var re=T=>{const J=I(()=>n(d)());var oe=wd(),Pe=_t(oe),Q=l(Pe),ye=s(l(Q),2),ne=l(ye),Ke=s(ye,2),Ie=l(Ke),He=s(Q,2),Ve=s(l(He),2),We=l(Ve),Tt=s(Ve,2),Pt=l(Tt),Ot=s(He,2),Rt=s(l(Ot),2),qt=l(Rt),D=s(Rt,2),U=l(D),Z=s(Pe,2),le=s(l(Z),4),x=l(le),z=s(l(x)),K=l(z),ie=s(x,2),$=s(l(ie),2),V=l($),ae=s(ie,2),we=s(l(ae)),Xe=l(we),Ae=s(ae,2),at=s(l(Ae),2),it=l(at),mt=s(le,2),et=l(mt),bt=s(l(et));qe(bt,()=>M(o.cpu,"--accent"),!0);var C=s(et,2),X=s(l(C));qe(X,()=>M(o.ram,"--purple"),!0);var pe=s(C,2),je=s(l(pe));qe(je,()=>M(o.gpu,"--on"),!0),O((Ne,Bt,Ht,It,Yt,sn,bn,$n,ln,on,yn,Je,pt)=>{m(ne,Ne),m(Ie,Bt),m(We,Ht),m(Pt,`${It??""} / ${Yt??""}`),m(qt,sn),m(U,bn),m(K,`${$n??""} / ${ln??""}`),m(V,on),m(Xe,`${yn??""} % belegt`),m(it,`${Je??""} / ${pt??""}`)},[()=>{var Ne;return Math.round(((Ne=n(i).cpu)==null?void 0:Ne.percent)??0)},()=>{var Ne;return((Ne=n(i).cpu)==null?void 0:Ne.temp)!=null?`${Math.round(n(i).cpu.temp)}° CPU-Temp`:"Auslastung"},()=>Math.round(n(i).ram.percent),()=>sa(n(i).ram.used),()=>sa(n(i).ram.total),()=>Math.round(n(J)),()=>n(i).gpu_temp!=null?`${Math.round(n(i).gpu_temp)}° GPU-Temp`:"VRAM + GTT",()=>sa(n(i).ram.used),()=>sa(n(i).ram.total),()=>n(i).gpu?`${sa(n(i).gpu.vram.used+n(i).gpu.gtt.used)} / ${sa(n(i).gpu.vram.total+n(i).gpu.gtt.total)}`:"–",()=>{var Ne;return Math.round(((Ne=n(i).disk)==null?void 0:Ne.percent)??0)},()=>n(i).gpu_temp!=null?Math.round(n(i).gpu_temp)+"°":"–",()=>{var Ne;return((Ne=n(i).cpu)==null?void 0:Ne.temp)!=null?Math.round(n(i).cpu.temp)+"°":"–"}]),b(T,oe)};G(Se,T=>{n(i)&&T(re)})}var ve=s(Se,2),be=l(ve),F=s(l(be),2),H=l(F),ue=s(F,2);{var fe=T=>{var J=xd();P("click",J,L),b(T,J)};G(ue,T=>{n(c)&&T(fe)})}var Ee=s(be,4);{var ze=T=>{var J=kd();b(T,J)},nt=T=>{var J=Br(),oe=_t(J);Ze(oe,17,()=>n(a),Ye,(Pe,Q)=>{const ye=I(()=>v(n(Q))),ne=I(()=>n(Q).state==="running"?h(n(Q).eta_s):""),Ke=I(()=>n(Q).state==="running"&&n(Q).rate_bps?sa(n(Q).rate_bps)+"/s":""),Ie=I(()=>[n(ne),n(Ke)].filter(Boolean).join(" · ")),He=I(()=>n(r).includes(n(Q).id));var Ve=Ad(),We=l(Ve),Tt=l(We),Pt=s(Tt,2),Ot=l(Pt),Rt=s(Pt,2);{var qt=$=>{var V=Md(),ae=l(V);O(we=>m(ae,`${we??""} %${n(Ie)?` · ${n(Ie)}`:""}`),[()=>Math.round(n(ye))]),b($,V)};G(Rt,$=>{n(ye)!=null&&$(qt)})}var D=s(Rt,2);{var U=$=>{var V=Sd();O(()=>hn(V,`${n(ye)==null?"margin-left:auto;":""}margin-right:2px;padding:2px 9px;font-size:12px`)),P("click",V,ae=>{ae.stopPropagation(),w(n(Q).id)}),b($,V)},Z=$=>{var V=Ed();P("click",V,ae=>{ae.stopPropagation(),A(n(Q).id)}),b($,V)};G(D,$=>{n(Q).state==="running"?$(U):$(Z,-1)})}var le=s(D,2);qe(le,()=>E(n(Q).state));var x=s(We,2);{var z=$=>{var V=Td(),ae=l(V);O(()=>hn(ae,`width:${n(ye)??""}%`)),b($,V)};G(x,$=>{n(ye)!=null&&n(Q).state==="running"&&$(z)})}var K=s(x,2);{var ie=$=>{var V=$d(),ae=l(V);O(we=>m(ae,we),[()=>(n(Q).log||[]).join(` -`)]),b($,V)};G(K,$=>{n(He)&&$(ie)})}O($=>{vt(Tt,1,`li-dot ${$??""}`),m(Ot,n(Q).label)},[()=>p(n(Q).state)]),P("click",We,()=>ca.toggle(n(Q).id)),P("keydown",We,$=>$.key==="Enter"&&ca.toggle(n(Q).id)),b(Pe,Ve)}),b(T,J)};G(Ee,T=>{n(a).length?T(nt,-1):T(ze)})}O(()=>m(H,n(a).length?n(u)?n(u)+" Fehler":n(a).length+" gesamt":"")),b(e,R),ia()}ka(["click","keydown"]);var zd=k(' '),Pd=k(''),Dd=k('✓ fertig'),Od=k('✗ fehlgeschlagen'),Rd=k('abgebrochen'),qd=k('läuft…'),Bd=k('
'),Id=k('

Aktueller Vorgang

'),Nd=k('

Server & Wartung

Dienste steuern, Updates einspielen und live mitlesen — ganz ohne SSH oder Terminal.

LLM-Engine (llama-swap)

Das Herzstück: lädt bei jeder Anfrage automatisch das passende Modell.
Adresse (für deine Tools)
Aktuell geladen
Konfigurierte Modelle

Dienste & Applikation

Diese Aktionen sind harmlos und passwortlos — es geht nichts dabei verloren.

Betriebssystem (Bosgame)

Tiefe Eingriffe — das Dashboard fragt einmalig nach deinem sudo-Passwort.

Live-Konsole

Live mitlesen, was der Dienst gerade tut.
',1);function Fd(e,t){ra(t,!0);const a=I(()=>gr.value),r=I(()=>ca.value);let i=null,o=B(`Verbinde… -`),d=B("llama-swap"),c,u=B(null),v=B("");const h=new Set,E=I(()=>n(u)?n(r).find(C=>C.id===n(u)):null);Mi(()=>{if(!n(E))return;const C=n(E),X=C.state==="done",pe=C.state==="failed",je=C.state==="canceled";(X||pe||je)&&!h.has(C.id)&&(h.add(C.id),te(X?`✓ ${n(v)} abgeschlossen.`:je?`${n(v)} abgebrochen.`:`✗ ${n(v)} fehlgeschlagen.`,pe),X&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function p(C,X){g(u,C,!0),g(v,X,!0),ca.track(C)}hr(()=>{w()}),Ro(()=>{i==null||i.close()});function w(){i==null||i.close();const C=n(d);g(o,`Verbinde mit ${C}… -`);const X=location.protocol==="https:"?"wss:":"ws:";i=new WebSocket(`${X}//${location.host}/api/logs/${C}?token=${encodeURIComponent(Ys())}`),i.onmessage=pe=>{g(o,n(o)+pe.data),c&&(c.scrollTop=c.scrollHeight)},i.onclose=()=>{g(o,n(o)+` -— Verbindung getrennt —`)},i.onerror=()=>i==null?void 0:i.close()}async function A(C,X,pe){if(await Mn({title:X,body:pe,confirmLabel:"Neustarten"}))try{await ge(`/api/service/${C}/restart`,{method:"POST"}),te("Neustart ausgelöst: "+C),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(je){te(je.message,!0)}}async function L(){if(await Mn({title:"Mission Control aktualisieren?",body:"Holt die neueste Dashboard-Version aus Gitea und startet automatisch neu. Die Seite trennt kurz und verbindet von selbst wieder (~10 Sek)."}))try{const C=await ge("/api/self-update",{method:"POST"});te("Update läuft — Dashboard startet gleich neu."),p(C.job_id,"Mission Control Update")}catch(C){te(C.message,!0)}}async function M(){if(await Mn({title:"LLM-Engine aktualisieren?",body:"Lädt die neueste llama.cpp-ROCm-Version und installiert sie. Die Engine ist während des Updates kurz nicht erreichbar."}))try{const C=await ge("/api/update",{method:"POST"});te("LLM-Engine-Update läuft."),p(C.job_id,"LLM-Engine-Update")}catch(C){te(C.message,!0)}}async function R(){if(await Mn({title:"Grafikspeicher leeren?",body:"Alle geladenen Modelle werden entladen. Sie laden beim nächsten Aufruf automatisch neu — es geht nichts verloren.",confirmLabel:"Leeren"}))try{await ge("/api/unload",{method:"POST"}),te("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(C){te(C.message,!0)}}async function Se(){if(!await Mn({title:"OS-Updates installieren?",body:"Führt apt update & upgrade aus. Das kann ein paar Minuten dauern; der Fortschritt erscheint in der Aktivität."}))return;const C=await Ui({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(C)try{const X=await ge("/api/os-update",{method:"POST",body:JSON.stringify({password:C})});te("OS-Update gestartet."),p(X.job_id,"OS-Update")}catch(X){te(X.message,!0)}}async function re(){if(!await Mn({title:"Server wirklich neu starten?",body:"Der ganze Bosgame startet physisch neu. Alles ist für ~1 Minute offline — auch dieses Dashboard.",confirmLabel:"Reboot",danger:!0}))return;const C=await Ui({title:"sudo-Passwort",body:"Für den Reboot wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Jetzt neustarten",danger:!0});if(C)try{await ge("/api/reboot",{method:"POST",body:JSON.stringify({password:C})}),te("Reboot ausgelöst — bis gleich.")}catch(X){te(X.message,!0)}}async function ve(){g(be,"prüfe…");try{const C=await ge("/api/integration/test");g(be,C.ok?`✓ Engine antwortet — ${C.models.length} Modell(e): ${C.models.join(", ")}`:`✗ keine Verbindung: ${C.error}`,!0),g(F,C.ok,!0)}catch(C){g(be,"✗ "+C.message),g(F,!1)}}let be=B(""),F=B(!1);const H=I(()=>{var C;return((C=n(a))==null?void 0:C.models)||[]}),ue=["running","ready","loading","starting"],fe=I(()=>n(H).find(C=>ue.includes(C.state)));function Ee(C){if(!C||C.state!=="running")return null;if(typeof C.progress=="number")return Math.min(100,C.progress);const pe=((C.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return pe?Math.min(100,parseFloat(pe[1])):null}var ze=Nd(),nt=s(_t(ze),2),T=l(nt),J=s(l(T),2),oe=l(J),Pe=s(T,4),Q=l(Pe),ye=s(l(Q)),ne=l(ye),Ke=s(Q,2),Ie=s(l(Ke),2),He=l(Ie),Ve=s(Ke,2),We=s(l(Ve),2),Tt=l(We),Pt=s(Pe,2),Ot=l(Pt),Rt=s(Ot,2);{var qt=C=>{var X=zd(),pe=l(X);O(()=>{hn(X,`color:${n(F)?"#7ee29a":"#ff9b95"}`),m(pe,n(be))}),b(C,X)};G(Rt,C=>{n(be)&&C(qt)})}var D=s(nt,2),U=s(l(D),4),Z=s(U,2),le=s(Z,2),x=s(le,2),z=s(x,2),K=s(D,2),ie=s(l(K),4),$=s(ie,2),V=s(K,2);{var ae=C=>{const X=I(()=>n(E)),pe=I(()=>n(X).state==="done"),je=I(()=>n(X).state==="failed"),Ne=I(()=>n(X).state==="canceled"),Bt=I(()=>n(pe)||n(je)||n(Ne)),Ht=I(()=>Ee(n(X)));var It=Id(),Yt=l(It),sn=s(l(Yt),2);{var bn=_e=>{var Qe=Pd();P("click",Qe,async()=>{await Mn({title:n(v)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&ge(`/api/jobs/${n(X).id}/cancel`,{method:"POST"})}),b(_e,Qe)};G(sn,_e=>{n(Bt)||_e(bn)})}var $n=s(sn,2),ln=l($n);{var on=_e=>{var Qe=Dd();b(_e,Qe)},yn=_e=>{var Qe=Od();b(_e,Qe)},Je=_e=>{var Qe=Rd();b(_e,Qe)},pt=_e=>{var Qe=qd();b(_e,Qe)};G(ln,_e=>{n(pe)?_e(on):n(je)?_e(yn,1):n(Ne)?_e(Je,2):_e(pt,-1)})}var S=s(Yt,2),ee=l(S),st=s(S,2);{var xe=_e=>{var Qe=Bd(),dn=l(Qe);O(()=>hn(dn,`width:${n(Ht)??""}%`)),b(_e,Qe)};G(st,_e=>{n(Ht)!=null&&!n(Bt)&&_e(xe)})}var rt=s(st,2),Vt=l(rt);O(_e=>{m(ee,`${n(v)??""}${n(Bt)?n(pe)?" — erfolgreich.":n(Ne)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),m(Vt,_e)},[()=>(n(X).log||[]).join(` -`)]),b(C,It)};G(V,C=>{n(E)&&C(ae)})}var we=s(V,2),Xe=l(we),Ae=s(l(Xe),2),at=l(Ae);at.value=at.__value="llama-swap";var it=s(at);it.value=it.__value="mission-control";var mt=s(it);mt.value=mt.__value="system";var et=s(Xe,4),bt=l(et);Oo(et,C=>c=C,()=>c),O(C=>{var X,pe,je;hn(J,`margin-left:auto;${(X=n(a))!=null&&X.swap_ok?"background:rgba(63,185,80,.12);border-color:rgba(63,185,80,.25);color:#7ee29a":"background:rgba(248,81,73,.12);border-color:rgba(248,81,73,.3);color:#ff9b95"}`),m(oe,(pe=n(a))!=null&&pe.swap_ok?"● erreichbar":"● offline"),m(ne,(((je=n(a))==null?void 0:je.swap_url)||"—")+"/v1"),m(He,n(fe)?n(fe).name+` (${n(fe).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),m(Tt,C),m(bt,n(o))},[()=>n(H).filter(C=>!C.incomplete).length||"keine"]),P("click",Ot,ve),P("click",U,()=>A("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),P("click",Z,()=>A("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),P("click",le,L),P("click",x,M),P("click",z,R),P("click",ie,Se),P("click",$,re),P("change",Ae,w),nr(Ae,()=>n(d),C=>g(d,C)),b(e,ze),ia()}ka(["click","change"]);var Kd=k('
Lade Setups…
'),Gd=k(' ×',1),Qr=k('
★ Beste Wahl für dein System
'),Ud=k('
Dein Setup
'),Hd=k(''),Vd=k('
'),Wd=k('· ⚠ Cache veraltet'),jd=k(" ",1),Jd=k('
Frage Quellen ab…
'),Qd=k('
'),Yd=k('✓ installiert'),Zd=k(''),Xd=k('

'),ec=k('

'),tc=k(''),nc=k('

'),ac=k('
'),rc=k('
'),ic=k('
'),sc=k(" "),lc=k('
'),oc=k('
Größter Spitzenbedarf: . Es läuft immer nur ein Modell gleichzeitig — das größte bestimmt, ob das Setup passt.
'),dc=k(''),cc=k('
Lade Dateien von HuggingFace…
'),Ji=k(""),uc=k('
Empfohlener Kontext für deine Hardware: übernehmen
'),vc=k('
Ressourcen-Check
'),fc=k('
',1),pc=k('
Keine GGUF-Dateien im Repo gefunden.
'),hc=k(''),gc=k('
'),_c=k(''),mc=k('

Cookbook

Modelle finden, installieren und eigene Setups zusammenstellen.

Use-Case-Setups

Fertige Modell-Bundles für deinen Anwendungsfall. Hardware-Ampel zeigt, ob es auf deinen PC passt.

Aktuell die besten Modelle für dein System

Top-Modelle je Kategorie von HuggingFace — Hardware-Fit wird live für dein System berechnet.

Profi-Suche (HuggingFace)

Direkt HuggingFace durchsuchen — oder eine Modell-URL einfügen für den direkten Sprung.
',1);function bc(e,t){ra(t,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr, braucht aber mehr Speicher und wird etwas langsamer.",r="MoE (Mixture of Experts): viele Parameter fürs Wissen, aber pro Wort ist nur ein kleiner Teil aktiv → fast große-Modell-Qualität bei hohem Tempo. Ideal für deine APU.",i={perfect:0,marginal:1,too_tight:2},o={vision:"Bilder",coder:"Coden",reasoning:"Logik",agent:"Agenten & Tools",scout:"Allrounder",reviewer:"Review",manager:"Manager"},d=[{label:"Bilder",kw:["-vl-","-vl","vision","llava","multimodal","-mm-","pixtral"]},{label:"Coden",kw:["coder","-code-","code-","codestral","starcoder"]},{label:"Logik",kw:["-r1","deepseek-r1","reasoning","qwq","magistral","-think","thinking","-o1"]},{label:"Agenten & Tools",kw:["hermes","-tool","command-r","watt","-fc-","function"]}];function c(_){const y=(_||"").toLowerCase();for(const N of d)if(N.kw.some(q=>y.includes(q)))return N.label;return"Allrounder"}function u(_=""){const y=_.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(y)||new RegExp("(?{Pt(),Ot()});async function Pt(){g(L,!0);try{const _=await ge("/api/cookbook/recipes");g(w,_.recipes||[],!0),g(A,_.recommended_id||null,!0)}catch(_){te(_.message,!0)}g(L,!1)}async function Ot(_=!1){g(R,!0);try{const y=await ge("/api/cookbook/discover"+(_?"?force=true":""));g(M,y,!0),g(Se,y.stale,!0)}catch(y){te("Empfehlungen nicht ladbar: "+y.message,!0)}g(R,!1)}function Rt(_){_=_.trim();const y=_.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return y?y[1]:/^[\w.-]+\/[\w.-]+$/.test(_)?_:null}async function qt(){const _=n(re).trim(),y=Rt(_);let N=_;if(n(F)&&!y&&(N=N?N+" "+n(F):n(F)),!N&&!y){g(ve,[],!0);return}g(be,!0),g(ue,[],!0),g(fe,-1);try{if(y)g(ve,[{id:y,author:y.split("/")[0],downloads:0}],!0);else{const q=`https://huggingface.co/api/models?search=${encodeURIComponent(N)}&filter=gguf&sort=${encodeURIComponent(n(H))}&direction=-1&limit=40`,Y=await fetch(q);g(ve,await Y.json(),!0)}n(ve).forEach((q,Y)=>D(Y,q.id))}catch(q){te(q.message,!0),g(ve,[],!0)}g(be,!1)}async function D(_,y){var N;try{const q=await ge("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:y,ctx:8192})});if(!((N=q.files)!=null&&N.length)){n(ue)[_]=null,U();return}const Y=q.files.find(Ce=>{var Le;return(Le=Ce.quant)==null?void 0:Le.includes("Q4_K_M")})||q.files[0];n(ue)[_]=Y.fit.level,U()}catch{n(ue)[_]=null,U()}}function U(){let _=-1,y=99;n(ue).forEach((N,q)=>{if(N==null)return;const Y=i[N]??99;Y=0&&y<=1?_:-1,!0)}function Z(_){g(Ee,n(w).find(y=>y.id===_),!0)}async function le(_){const y=document.getElementById("cb-r-install-btn");y&&(y.disabled=!0,y.textContent="Starte…");try{const N=await ge("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:_,hf_token:rr()})});te(`${N.count} Downloads gestartet — siehe Aktivität.`),g(Ee,null),Tt("activity")}catch(N){te(N.message,!0),y&&(y.disabled=!1,y.textContent="Installieren")}}async function x(_,y){var N,q;g(ze,!0),g(nt,y,!0),g(T,_,!0),g(Pe,""),g(Q,8192),g(J,null),g(ne,null),g(oe,""),g(ye,!0);try{if(g(J,await ge("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:_,ctx:8192})}),!0),(q=(N=n(J))==null?void 0:N.files)!=null&&q.length){const Y=n(J).files.find(Ce=>{var Le;return(Le=Ce.quant)==null?void 0:Le.includes("Q4_K_M")})||n(J).files[0];g(oe,Y.filename,!0),Y.optimal_ctx&&n(Q)===8192&&g(Q,Y.optimal_ctx,!0),z()}}catch(Y){te(Y.message,!0)}g(ye,!1)}function z(){var _,y,N;!((y=(_=n(J))==null?void 0:_.files)!=null&&y.length)||!n(oe)||(g(ne,n(J).files.find(q=>q.filename===n(oe))||null,!0),(N=n(ne))!=null&&N.optimal_ctx&&n(Q)===8192&&g(Q,n(ne).optimal_ctx,!0))}async function K(){if(!n(T)||!n(oe))return te("Bitte eine GGUF-Datei wählen.",!0);g(ye,!0);try{const _=await ge("/api/download",{method:"POST",body:JSON.stringify({repo:n(T),file:n(oe),hf_token:rr()})});await ge("/api/register",{method:"POST",body:JSON.stringify({role:n(Pe),model_path:_.expected_path,ctx:n(Q)})}),te("Download gestartet — siehe Aktivität."),g(ze,!1),Tt("activity")}catch(_){te("Fehler: "+_.message,!0)}g(ye,!1)}async function ie(_,y,N,q){q.disabled=!0,q.textContent="Starte…";try{await ge("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:_,role:y,params_b:N,quant:"Q4_K_M",hf_token:rr()})}),te("Download gestartet — siehe Aktivität."),Tt("activity")}catch(Y){te(Y.message,!0),q.disabled=!1,q.textContent="Installieren"}}function $(){g(We,null),g(Ie,""),g(He,""),g(Ve,[{repo:"",role:"",quant:"Q4_K_M"}],!0),g(Ke,!0)}function V(_){const y=n(w).find(N=>N.id===_);y&&(g(We,_,!0),g(Ie,y.title,!0),g(He,y.desc||"",!0),g(Ve,y.models.map(N=>({repo:N.repo,role:N.role,quant:N.quant||"Q4_K_M"})),!0),g(Ke,!0))}async function ae(){if(!n(Ie).trim())return te("Bitte einen Titel angeben.",!0);const _=n(Ve).filter(y=>y.repo.trim());if(!_.length)return te("Mindestens ein Modell (Repo) angeben.",!0);try{n(We)?(await ge("/api/cookbook/user-recipe/"+encodeURIComponent(n(We)),{method:"PUT",body:JSON.stringify({title:n(Ie),desc:n(He),models:_})}),te("Setup aktualisiert.")):(await ge("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:n(Ie),desc:n(He),models:_})}),te("Setup gespeichert.")),g(Ke,!1),Pt()}catch(y){te(y.message,!0)}}async function we(_){const y=n(w).find(N=>N.id===_);if(await Mn({title:`„${(y==null?void 0:y.title)||_}" löschen?`,body:"Dein eigenes Setup wird aus dem Cookbook entfernt. Bereits installierte Modelle bleiben unangetastet.",confirmLabel:"Löschen",danger:!0}))try{await ge("/api/cookbook/user-recipe/"+encodeURIComponent(_),{method:"DELETE"}),te("Setup gelöscht."),Pt()}catch(N){te(N.message,!0)}}function Xe(_){if(!u(_))return"";const y=v(_);return`MoE${y?` · ~${y}B aktiv`:""}`}function Ae(_){return _?`${Rn(_)}`:""}var at=mc(),it=s(_t(at),2),mt=l(it),et=s(l(mt),2),bt=s(mt,4);{var C=_=>{var y=Kd();b(_,y)},X=_=>{var y=Vd();Ze(y,21,()=>n(w),Ye,(N,q)=>{const Y=I(()=>n(q).id===n(A));var Ce=Hd(),Le=l(Ce);{var lt=Ue=>{var ct=Gd(),Zt=_t(ct),wt=s(Zt,2);P("click",Zt,xt=>{xt.stopPropagation(),V(n(q).id)}),P("keydown",Zt,xt=>{xt.key==="Enter"&&(xt.stopPropagation(),V(n(q).id))}),P("click",wt,xt=>{xt.stopPropagation(),we(n(q).id)}),P("keydown",wt,xt=>{xt.key==="Enter"&&(xt.stopPropagation(),we(n(q).id))}),b(Ue,ct)};G(Le,Ue=>{n(q).user&&Ue(lt)})}var yt=s(Le,2);{var Te=Ue=>{var ct=Qr();b(Ue,ct)},De=Ue=>{var ct=Ud();b(Ue,ct)};G(yt,Ue=>{n(Y)?Ue(Te):n(q).user&&Ue(De,1)})}var Me=s(yt,2),ke=l(Me),Fe=l(ke),Ge=l(Fe),Oe=s(ke,2),j=l(Oe),ce=s(Me,2),ot=l(ce),$t=s(ce,2),dt=l($t);O((Ue,ct)=>{vt(Ce,1,`card-btn${n(Y)?" cb-best":""}`),m(Ge,n(q).title),vt(Oe,1,`fit-badge ${Ue??""}`),m(j,ct),m(ot,n(q).desc),m(dt,`${n(q).models.length??""} Modell${n(q).models.length>1?"e":""} im Setup`)},[()=>h(n(q).fit_level),()=>E(n(q).fit_level)]),P("click",Ce,()=>Z(n(q).id)),b(N,Ce)}),b(_,y)};G(bt,_=>{n(L)?_(C):_(X,-1)})}var pe=s(it,2),je=l(pe),Ne=s(l(je),2),Bt=l(Ne);{var Ht=_=>{const y=I(()=>Math.round((Date.now()/1e3-n(M).updated)/60));var N=jd(),q=_t(N);{var Y=Te=>{var De=tr();O(()=>m(De,`Quellen befragt vor ${n(y)??""} min`)),b(Te,De)},Ce=Te=>{var De=tr();O(Me=>m(De,`Quellen befragt vor ${Me??""} h`),[()=>Math.round(n(y)/60)]),b(Te,De)},Le=Te=>{var De=tr();O(Me=>m(De,`Quellen befragt vor ${Me??""} Tg.`),[()=>Math.round(n(y)/1440)]),b(Te,De)};G(q,Te=>{n(y)<60?Te(Y):n(y)<1440?Te(Ce,1):Te(Le,-1)})}var lt=s(q,2);{var yt=Te=>{var De=Wd();b(Te,De)};G(lt,Te=>{n(Se)&&Te(yt)})}b(_,N)};G(Bt,_=>{var y;(y=n(M))!=null&&y.updated&&_(Ht)})}var It=s(Ne,2),Yt=l(It),sn=s(je,4);{var bn=_=>{var y=Jd();b(_,y)},$n=_=>{var y=Br(),N=_t(y);Ze(N,17,()=>n(M).categories,Ye,(q,Y)=>{var Ce=ec(),Le=l(Ce),lt=l(Le),yt=l(lt),Te=s(Le,2);Ze(Te,21,()=>n(Y).models,Ye,(De,Me)=>{const ke=I(()=>n(Y).recommended&&n(Me).repo===n(Y).recommended);var Fe=Xd(),Ge=l(Fe);{var Oe=Et=>{var Kt=Qr();b(Et,Kt)};G(Ge,Et=>{n(ke)&&Et(Oe)})}var j=s(Ge,2),ce=l(j),ot=l(ce),$t=l(ot),dt=s(ot,2),Ue=l(dt),ct=s(ce,2),Zt=l(ct),wt=s(j,2),xt=l(wt);qe(xt,()=>Ae(o[n(Me).role]||c(n(Me).repo)));var Cn=s(xt,2);qe(Cn,()=>Xe(n(Me).repo));var Wn=s(wt,2),tt=l(Wn),ut=s(Wn,2);Ze(ut,17,()=>n(Me).requirements||[],Ye,(Et,Kt)=>{var jn=Qd(),Kr=l(jn);O(()=>m(Kr,`⚠ ${n(Kt)??""}`)),b(Et,jn)});var ht=s(ut,4),kt=l(ht);{var Xt=Et=>{var Kt=Yd();O(()=>Ir(Kt,"title",`bereits eingerichtet als ${n(Me).installed??""}`)),b(Et,Kt)},Ft=Et=>{var Kt=Zd();P("click",Kt,jn=>ie(n(Me).repo,n(Me).role,n(Me).params_b,jn.currentTarget)),b(Et,Kt)};G(kt,Et=>{n(Me).installed?Et(Xt):Et(Ft,-1)})}O((Et,Kt,jn)=>{vt(Fe,1,`card${n(ke)?" res-best":""}`),m($t,n(Me).name),m(Ue,`${n(Me).author??""} · ${n(Me).params_b??""}B`),vt(ct,1,`fit-badge ${Et??""}`),m(Zt,n(Me).fit.text),m(tt,`${Kt??""} · ⬇ ${jn??""}`)},[()=>h(n(Me).fit.level),()=>p(n(Me).fit),()=>(n(Me).downloads||0).toLocaleString()]),b(De,Fe)}),O(()=>m(yt,n(Y).title)),b(q,Ce)}),b(_,y)};G(sn,_=>{var y;n(R)&&!n(M)?_(bn):(y=n(M))!=null&&y.categories&&_($n,1)})}var ln=s(pe,2),on=s(l(ln),4),yn=l(on),Je=s(yn,2),pt=l(Je);pt.value=pt.__value="downloads";var S=s(pt);S.value=S.__value="trending";var ee=s(S);ee.value=ee.__value="created_at";var st=s(Je,2),xe=l(st),rt=s(on,2);Ze(rt,20,()=>["","coder","vision","reasoning","chat","agent"],Ye,(_,y)=>{var N=tc(),q=l(N);O(()=>{vt(N,1,n(F)===y?"primary":"ghost"),m(q,y||"Alle")}),P("click",N,()=>{g(F,y,!0),qt()}),b(_,N)});var Vt=s(rt,2);{var _e=_=>{var y=ac();Ze(y,21,()=>n(ve),Ye,(N,q,Y)=>{var Ce=nc(),Le=l(Ce);{var lt=wt=>{var xt=Qr();b(wt,xt)};G(Le,wt=>{Y===n(fe)&&wt(lt)})}var yt=s(Le,2),Te=l(yt),De=l(Te),Me=l(De),ke=s(De,2),Fe=l(ke),Ge=s(Te,2),Oe=l(Ge),j=s(yt,2),ce=l(j);qe(ce,()=>Ae(c(n(q).id)));var ot=s(ce,2);qe(ot,()=>Xe(n(q).id));var $t=s(j,4),dt=l($t),Ue=l(dt),ct=s(dt,2),Zt=l(ct);O((wt,xt,Cn,Wn,tt)=>{vt(Ce,1,`card${Y===n(fe)?" res-best":""}`),m(Me,wt),m(Fe,n(q).author||""),vt(Ge,1,`fit-badge ${xt??""}`),m(Oe,Cn),m(Ue,Wn),m(Zt,`⬇ ${tt??""}`)},[()=>n(q).id.split("/").pop(),()=>n(ue)[Y]?h(n(ue)[Y]):"warn",()=>n(ue)[Y]?E(n(ue)[Y]):"prüfe…",()=>n(ue)[Y]?p({req_gb:0,tps:0}):"Hardware-Fit…",()=>(n(q).downloads||0).toLocaleString()]),P("click",Ce,()=>x(n(q).id,n(q).id.split("/").pop())),b(N,Ce)}),b(_,y)};G(Vt,_=>{n(ve).length&&_(_e)})}var Qe=s(ln,2);{var dn=_=>{const y=I(()=>n(Ee));var N=dc(),q=l(N),Y=l(q),Ce=s(Y,2),Le=l(Ce),lt=s(Ce,2),yt=l(lt),Te=s(lt,2);Ze(Te,21,()=>n(y).models,Ye,(Ge,Oe)=>{var j=lc(),ce=l(j),ot=l(ce),$t=l(ot),dt=l($t),Ue=s($t,2),ct=l(Ue),Zt=s(Ue,2);qe(Zt,()=>Xe(n(Oe).repo));var wt=s(ot,2);{var xt=ht=>{var kt=rc(),Xt=l(kt);O(()=>m(Xt,n(Oe).why)),b(ht,kt)};G(wt,ht=>{n(Oe).why&&ht(xt)})}var Cn=s(wt,2);{var Wn=ht=>{var kt=ic(),Xt=l(kt);O((Ft,Et,Kt)=>m(Xt,`~${Ft??""} GB · ~${Et??""} Tok/s · optimal ~${Kt??""}k Kontext`),[()=>(n(Oe).fit.req_gb??0).toFixed(1),()=>Math.round(n(Oe).fit.tps??0),()=>Math.round((n(Oe).optimal_ctx||8192)/1024)]),b(ht,kt)};G(Cn,ht=>{n(Oe).fit&&ht(Wn)})}var tt=s(ce,2);{var ut=ht=>{var kt=sc(),Xt=l(kt);O(Ft=>{vt(kt,1,`fit-badge ${Ft??""}`),m(Xt,n(Oe).fit.text)},[()=>h(n(Oe).fit.level)]),b(ht,kt)};G(tt,ht=>{n(Oe).fit&&ht(ut)})}O(()=>{m(dt,n(Oe).name),m(ct,n(Oe).role)}),b(Ge,j)});var De=s(Te,2);{var Me=Ge=>{const Oe=I(()=>Math.max(...n(y).models.map($t=>{var dt;return((dt=$t.fit)==null?void 0:dt.req_gb)??0})));var j=oc(),ce=s(l(j)),ot=l(ce);O($t=>m(ot,`~${$t??""} GB`),[()=>n(Oe).toFixed(1)]),b(Ge,j)};G(De,Ge=>{n(y).models.length&&n(y).models[0].fit&&Ge(Me)})}var ke=s(De,2),Fe=l(ke);O(()=>{m(Le,n(y).title),m(yt,n(y).desc),vt(ke,1,`primary${n(y).fit_level==="too_tight"?" warn":""}`),m(Fe,n(y).fit_level==="too_tight"?"Trotzdem installieren (zu groß)":"Komplettes Setup installieren")}),P("click",N,Ge=>{Ge.target.classList.contains("modal-overlay")&&g(Ee,null)}),P("click",Y,()=>g(Ee,null)),P("click",ke,()=>le(n(y).id)),b(_,N)};G(Qe,_=>{n(Ee)&&_(dn)})}var Nt=s(Qe,2);{var In=_=>{var y=hc(),N=l(y),q=l(N),Y=s(q,2),Ce=l(Y),Le=s(Y,2),lt=l(Le),yt=s(Le,2);{var Te=ke=>{var Fe=cc();b(ke,Fe)},De=ke=>{var Fe=fc(),Ge=s(_t(Fe),2);Ze(Ge,21,()=>n(J).files,Ye,(tt,ut)=>{const ht=I(()=>n(ut).fit.level==="perfect"?"●":n(ut).fit.level==="marginal"?"◐":"○");var kt=Ji(),Xt=l(kt),Ft={};O(()=>{m(Xt,`${n(ht)??""} ${n(ut).filename??""}`),Ft!==(Ft=n(ut).filename)&&(kt.value=(kt.__value=n(ut).filename)??"")}),b(tt,kt)});var Oe=s(Ge,2),j=l(Oe),ce=s(l(j),2),ot=s(j,2),$t=l(ot),dt=s(l($t));qe(dt,()=>fi(a));var Ue=s($t,2),ct=s(Oe,2);{var Zt=tt=>{var ut=uc(),ht=s(l(ut)),kt=l(ht),Xt=s(ht,2);O(Ft=>m(kt,`~${Ft??""}k`),[()=>Math.round(n(ne).optimal_ctx/1024)]),P("click",Xt,Ft=>{Ft.preventDefault(),g(Q,n(ne).optimal_ctx,!0)}),b(tt,ut)};G(ct,tt=>{var ut;(ut=n(ne))!=null&&ut.optimal_ctx&&tt(Zt)})}var wt=s(ct,2);{var xt=tt=>{var ut=vc(),ht=l(ut),kt=s(l(ht),2),Xt=l(kt),Ft=s(ht,2),Et=l(Ft);O((Kt,jn,Kr)=>{m(Xt,`~${Kt??""} GB · ~${jn??""} Tok/s · ${(n(ne).quant||"GGUF")??""}`),vt(Ft,1,`fit-badge ${Kr??""}`),m(Et,n(ne).fit.text)},[()=>(n(ne).fit.req_gb??0).toFixed(1),()=>Math.round(n(ne).fit.tps??0),()=>h(n(ne).fit.level)]),b(tt,ut)};G(wt,tt=>{n(ne)&&tt(xt)})}var Cn=s(wt,2),Wn=l(Cn);O(()=>{var tt,ut;vt(Cn,1,`primary${((tt=n(ne))==null?void 0:tt.fit.level)==="too_tight"?" warn":""}`),Cn.disabled=n(ye),m(Wn,n(ye)?"Starte…":((ut=n(ne))==null?void 0:ut.fit.level)==="too_tight"?"Trotzdem holen (zu groß)":"Herunterladen & Einpflegen")}),P("change",Ge,z),nr(Ge,()=>n(oe),tt=>g(oe,tt)),Ln(ce,()=>n(Pe),tt=>g(Pe,tt)),Ln(Ue,()=>n(Q),tt=>g(Q,tt)),P("click",Cn,K),b(ke,Fe)},Me=ke=>{var Fe=pc();b(ke,Fe)};G(yt,ke=>{var Fe,Ge;n(ye)&&!n(J)?ke(Te):(Ge=(Fe=n(J))==null?void 0:Fe.files)!=null&&Ge.length?ke(De,1):n(ye)||ke(Me,2)})}O(()=>{m(Ce,n(nt)),m(lt,n(T))}),P("click",y,ke=>{ke.target.classList.contains("modal-overlay")&&g(ze,!1)}),P("click",q,()=>g(ze,!1)),b(_,y)};G(Nt,_=>{n(ze)&&_(In)})}var Nn=s(Nt,2);{var An=_=>{var y=_c(),N=l(y),q=l(N),Y=s(q,2),Ce=l(Y),Le=s(Y,6),lt=s(Le,4),yt=s(lt,4);Ze(yt,17,()=>n(Ve),Ye,(ke,Fe,Ge)=>{var Oe=gc(),j=l(Oe),ce=s(j,2),ot=s(ce,2);Ze(ot,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],Ye,(dt,Ue)=>{var ct=Ji(),Zt=l(ct),wt={};O(()=>{m(Zt,Ue),wt!==(wt=Ue)&&(ct.__value=Ue)}),b(dt,ct)});var $t=s(ot,2);Ln(j,()=>n(Fe).repo,dt=>n(Fe).repo=dt),Ln(ce,()=>n(Fe).role,dt=>n(Fe).role=dt),nr(ot,()=>n(Fe).quant,dt=>n(Fe).quant=dt),P("click",$t,()=>g(Ve,n(Ve).filter((dt,Ue)=>Ue!==Ge),!0)),b(ke,Oe)});var Te=s(yt,2),De=s(Te,4),Me=l(De);O(()=>{m(Ce,n(We)?"Setup bearbeiten":"Eigenes Setup erstellen"),m(Me,n(We)?"Änderungen speichern":"Setup speichern")}),P("click",y,ke=>{ke.target.classList.contains("modal-overlay")&&g(Ke,!1)}),P("click",q,()=>g(Ke,!1)),Ln(Le,()=>n(Ie),ke=>g(Ie,ke)),Ln(lt,()=>n(He),ke=>g(He,ke)),P("click",Te,()=>g(Ve,[...n(Ve),{repo:"",role:"",quant:"Q4_K_M"}],!0)),P("click",De,ae),b(_,y)};G(Nn,_=>{n(Ke)&&_(An)})}O(()=>{It.disabled=n(R),m(Yt,n(R)?"Suche…":"Aktualisieren"),st.disabled=n(be),m(xe,n(be)?"Lade…":"Suchen")}),P("click",et,$),P("click",It,()=>Ot(!0)),P("keydown",yn,_=>_.key==="Enter"&&qt()),Ln(yn,()=>n(re),_=>g(re,_)),nr(Je,()=>n(H),_=>g(H,_)),P("click",st,qt),b(e,at),ia()}ka(["click","keydown","change"]);var yc=k(`
Du öffnest Mission Control über einen Proxy/Namen. Die Engine läuft auf Port 8080 ohne HTTPS direkt am Bosgame. - Trag in deinen Tools die LAN-IP ein: http://192.168.178.151:8080/v1 — nicht den Proxy-Namen.
`),wc=k(' '),xc=k('
'),kc=k(' '),Mc=k(''),Sc=k('

2 · Modelle auswählen

Wähle, welche Modelle im Config-Snippet erscheinen sollen.
'),Ec=k(''),Tc=k('

Öffne die Zed-Settings mit Cmd/Strg + , und füge diesen Block in deine bestehende settings.json ein. Falls bereits ein "bosgame"-Eintrag existiert: vorher löschen.

Nur diesen Block einfügen, nicht die ganze Datei ersetzen — sonst gehen andere Einstellungen verloren.

API-Key: Öffne den Agent-Panel → Anbieter bosgame → trag irgendeinen Wert ein (z.B. local).

Danach im Agent-Panel das Modell auswählen.
',1),$c=k('

Datei anlegen oder öffnen:

Windows: %USERPROFILE%\\.config\\opencode\\opencode.json

Nur den "provider"-Block einfügen. Falls bereits ein "llama-swap"-Eintrag vorhanden: vorher löschen, sonst erscheinen Modelle doppelt.

Danach in OpenCode /models wählen.

',1),Ac=k('

In Cline/Cursor den Provider „OpenAI Compatible" wählen:

API-Key: ein beliebiger Wert (z.B. local).
',1),Cc=k('

Settings → Admin Panel → Connections → neue OpenAI-Verbindung:

',1),Lc=k('

Bilder einbinden (Vision)

Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.
'),zc=k('

Verbinden

Schritt für Schritt: KI-Modelle in deine Tools einbinden — getestet, erklärt, mit Copy-Paste-Config.

1 · Verbindung prüfen

Stelle sicher, dass die LLM-Engine erreichbar ist, bevor du Tools konfigurierst.

Wie funktioniert das Auto-Swap?

3 · Tool wählen

Für welches Werkzeug brauchst du die Konfiguration?

4 · Config-Snippet

',1);function Pc(e,t){ra(t,!0);const a=I(()=>gr.value),r=I(()=>{var D;return(((D=n(a))==null?void 0:D.models)||[]).filter(U=>!U.incomplete)}),i=I(v);let o=B("zed"),d=B(Dt([])),c=B(""),u=B(!1);function v(){return`http://${location.hostname}:8080/v1`}function h(D){return/^\d{1,3}(\.\d{1,3}){3}$/.test(D)}function E(){return location.protocol==="https:"||!h(location.hostname)}const p=I(()=>n(d).length?n(d):n(r).map(D=>D.name)),w=I(()=>n(p)[0]||"coder"),A=I(()=>{var D;return(D=n(r).find(U=>{var Z,le;return(le=(Z=U.meta)==null?void 0:Z.caps)==null?void 0:le.includes("Bild")}))==null?void 0:D.name});function L(D,U){const le=(U.length?n(r).filter(x=>U.includes(x.name)):n(r).length?n(r):[{name:"coder",meta:{}}]).map(x=>{var ie,$;const z=(((ie=x.meta)==null?void 0:ie.caps)||[]).some(V=>/Bild|Vision/i.test(V)),K=(($=x.meta)==null?void 0:$.ctx)||131072;return` { "name": "${x.name}", "display_name": "${x.name}", "max_tokens": ${K}${z?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`, + + `;const v=c.querySelector("input"),u=h=>{c.remove(),d(h)};c.addEventListener("click",h=>{if(h.target===c)return u(null);const E=h.target.closest("[data-x]");E&&u(E.getAttribute("data-x")==="1"?v.value||"":null)}),v.addEventListener("keydown",h=>{h.key==="Enter"&&u(v.value||""),h.key==="Escape"&&u(null)}),document.body.appendChild(c),v.focus()})}function Ho(e="overview"){const t=Hi(".nav-item[data-view]:not(.disabled)"),n=Hi(".view[data-view]"),r=new Set(n.map(o=>o.dataset.view));function i(o){r.has(o)||(o=e),n.forEach(d=>d.hidden=d.dataset.view!==o),t.forEach(d=>d.classList.toggle("active",d.dataset.view===o)),location.hash!=="#/"+o&&(location.hash="#/"+o)}return t.forEach(o=>o.addEventListener("click",d=>{d.preventDefault(),i(o.dataset.view)})),window.addEventListener("hashchange",()=>i(location.hash.replace("#/",""))),i(location.hash.replace("#/","")||e),{show:i}}let ji=O(null);const mr={get value(){return a(ji)},set(e){g(ji,e,!0)}};let Qi=O(Ht([])),Wa=O(Ht([]));const dn={get value(){return a(Qi)},set(e){g(Qi,e||[],!0)},get tracked(){return a(Wa)},track(e){a(Wa).includes(e)||g(Wa,[...a(Wa),e],!0)},toggle(e){g(Wa,a(Wa).includes(e)?a(Wa).filter(t=>t!==e):[...a(Wa),e],!0)}};let Ji=O(null);const Li={get value(){return a(Ji)},set(e){g(Ji,e,!0)}},Vo="5";var ss;typeof window<"u"&&((ss=window.__svelte??(window.__svelte={})).v??(ss.v=new Set)).add(Vo);var Wo=w('— bereit für Anfragen'),jo=w('
Temperatur (GPU)
Freier Speicher
GB
',1),Qo=w('
Temperatur
messe…
Freier Speicher
messe…
',1),Jo=w('
'),Yo=w('
Warte auf Messwerte…
'),Zo=w('
Noch kein Modell eingerichtet — starte hier:
',1),Xo=w('
Die häufigsten Aufgaben — ein Klick.
',1),ed=w('Bild'),td=w('Code'),ad=w('Text'),nd=w('∞ aktiv'),rd=w(''),id=w('
'),Yi=w('
'),sd=w('
Noch keine Modelle
Hol dir unter „Cookbook" ein Modell, das auf deine Hardware passt.
'),ld=w('
'),od=w('
News gerade nicht ladbar.
'),dd=w('

LLM-Engine
Aktives Modell

System-Gesundheit

Auslastung in Echtzeit.

Schnellstart

Dein Stack

Top-News

Alle →
',1);function cd(e,t){tn(t,!0);const n=q(()=>mr.value),r=q(()=>Li.value),i=q(()=>{var M;return((M=a(n))==null?void 0:M.models)||[]}),o=q(()=>{var M;return((M=a(n))==null?void 0:M.swap_ok)??!1}),d=["running","ready","loading","starting"],c=q(()=>a(i).find(M=>d.includes(M.state))),v=q(()=>a(i).filter(M=>!M.incomplete)),u=q(()=>a(n)?a(o)?a(r)&&a(r).ram.percent>=90?"Achtung: Speicher wird knapp.":"Alles läuft rund.":"LLM-Engine offline":"Verbinde…"),h=q(()=>a(n)?a(o)?a(r)&&a(r).ram.percent>=90?`Arbeitsspeicher bei ${Math.round(a(r).ram.percent)} % — eventuell Speicher freigeben.`:`${a(v).length} ${a(v).length===1?"Modell":"Modelle"} konfiguriert · ${a(c)?`„${a(c).name}" geladen`:"keines geladen"} · keine Warnungen.`:"Der llama-swap-Dienst antwortet gerade nicht.":""),E=q(()=>()=>{var G;const M=(G=a(r))==null?void 0:G.gpu;return M&&M.vram.total+M.gtt.total>0?(M.vram.used+M.gtt.used)/(M.vram.total+M.gtt.total)*100:0});let p=O(Ht([])),x=O(null);_r(async()=>{try{g(p,((await Me("/api/news")).items||[]).slice(0,4),!0)}catch{}});async function $(){await wa({title:"Speicher freigeben?",body:"Alle aktuell geladenen Modelle werden aus dem Grafikspeicher geworfen. Sie laden beim nächsten Aufruf automatisch neu.",confirmLabel:"Speicher freigeben"})&&(await Me("/api/unload",{method:"POST"}),k())}async function L(M){g(x,M,!0);try{await Me("/api/preload?model="+encodeURIComponent(M),{method:"POST"})}catch(G){ee("Laden fehlgeschlagen: "+(G.message||"Engine nicht erreichbar?"),!0)}g(x,null),k()}function k(){document.dispatchEvent(new Event("mc:refresh"))}function D(M){var G;(G=document.querySelector(`.nav-item[data-view="${M}"]`))==null||G.dispatchEvent(new MouseEvent("click"))}function Pe(M){return M>=90?"red":M>=75?"":"green"}function ne(M){return M==null?"":M>=75?"red":M>=55?"":"green"}function pe(M){return M>=90?"red":M>=70?"":"green"}var Ee=dd(),K=ot(Ee),U=l(K),ue=l(U),he=l(ue),Le=s(he);{var Ue=M=>{var G=Wo();_(M,G)};I(Le,M=>{a(o)&&!a(c)&&M(Ue)})}var _t=s(ue,2),T=l(_t),W=s(K,2),re=l(W),He=l(re),J=s(l(He),2);Ce(J,()=>zt("server"),!0);var ze=s(He,2),Z=l(ze),rt=s(ze,2),P=l(rt),H=s(re,2),ie=l(H),ge=s(l(ie),2);Ce(ge,()=>zt("cpu"),!0);var Te=s(ie,2),mt=l(Te),pt=s(Te,2),kt=l(pt);{var At=M=>{var G=ar();z(qe=>m(G,`${qe??""} · ${a(c).state??""}`),[()=>{var qe;return(qe=a(c).meta)!=null&&qe.ctx?Math.round(a(c).meta.ctx/1024)+"k ctx":""}]),_(M,G)},Mt=M=>{var G=ar("lädt bei erster Anfrage");_(M,G)};I(kt,M=>{a(c)?M(At):M(Mt,-1)})}var Lt=s(H,2);{var qt=M=>{const G=q(()=>{var Ua;return a(r).gpu_temp??((Ua=a(r).cpu)==null?void 0:Ua.temp)??null}),qe=q(()=>ne(a(G))),te=q(()=>a(r).ram.total-a(r).ram.used),Be=q(()=>100-a(r).ram.percent);var Ye=jo(),et=ot(Ye),ke=l(et),Ae=s(l(ke));Ce(Ae,()=>zt("thermo"),!0);var Oe=s(ke,2),Ot=l(Oe),Bt=s(Oe,2),Wt=l(Bt),na=s(et,2),_a=l(na),Ke=s(l(_a));Ce(Ke,()=>zt("database"),!0);var ht=s(_a,2),qa=l(ht),Ga=s(ht,2),nn=l(Ga);z((Ua,Hn,y,b)=>{wt(et,1,`kpi ${a(qe)??""}`),m(Ot,Ua),m(Wt,a(G)==null?"messe…":a(G)<55?"kühl":a(G)<75?"normal":"⚠ heiß"),wt(na,1,`kpi ${a(Be)<15?"red":a(Be)<30?"":"green"}`),m(qa,Hn),m(nn,`von ${y??""} GB · ${b??""} % frei`)},[()=>a(G)!=null?`${Math.round(a(G))}°C`:"–",()=>Math.round(a(te)/1073741824),()=>Math.round(a(r).ram.total/1073741824),()=>Math.round(a(Be))]),_(M,Ye)},Rt=M=>{var G=Qo();_(M,G)};I(Lt,M=>{a(r)?M(qt):M(Rt,-1)})}var C=s(W,2),F=l(C),$e=s(l(F),4);{var dt=M=>{const G=q(()=>a(E)());var qe=or(),te=ot(qe);ft(te,17,()=>{var Be;return[["Prozessor (CPU)",((Be=a(r).cpu)==null?void 0:Be.percent)??0,""],["Arbeitsspeicher (RAM)",a(r).ram.percent,Pe(a(r).ram.percent)],["Grafikspeicher (VRAM)",a(G),pe(a(G))]]},ut,(Be,Ye)=>{var et=q(()=>sr(a(Ye),3));let ke=()=>a(et)[0],Ae=()=>a(et)[1];const Oe=q(()=>Math.max(0,Math.min(100,Ae()||0)));var Ot=Jo(),Bt=l(Ot),Wt=l(Bt),na=l(Wt),_a=s(Wt),Ke=l(_a),ht=s(Bt,2),qa=l(ht);z((Ga,nn)=>{m(na,ke()),m(Ke,`${Ga??""} %`),wt(ht,1,`bar ${a(Oe)>=90?"bad":a(Oe)>=75?"warn":""}`),fa(qa,`width:${nn??""}%`)},[()=>Math.round(a(Oe)),()=>Math.max(2,a(Oe))]),_(Be,Ot)}),_(M,qe)},N=M=>{var G=Yo();_(M,G)};I($e,M=>{a(r)?M(dt):M(N,-1)})}var De=s(F,2),Q=s(l(De),2);{var de=M=>{var G=Zo(),qe=s(ot(G),2),te=l(qe);Ce(te,()=>zt("search"),!0);var Be=s(te,4);Ce(Be,()=>zt("chevron"),!0);var Ye=s(qe,2),et=l(Ye);Ce(et,()=>zt("swap"),!0);var ke=s(et,4);Ce(ke,()=>zt("chevron"),!0);var Ae=s(Ye,2),Oe=l(Ae);Ce(Oe,()=>zt("file"),!0);var Ot=s(Oe,4);Ce(Ot,()=>zt("chevron"),!0),A("click",qe,()=>D("cookbook")),A("click",Ye,()=>D("connect")),A("click",Ae,()=>D("guides")),_(M,G)},se=M=>{var G=Xo(),qe=s(ot(G),2),te=l(qe);Ce(te,()=>zt("search"),!0);var Be=s(te,4);Ce(Be,()=>zt("chevron"),!0);var Ye=s(qe,2),et=l(Ye);Ce(et,()=>zt("refresh"),!0);var ke=s(et,4);Ce(ke,()=>zt("chevron"),!0);var Ae=s(Ye,2),Oe=l(Ae);Ce(Oe,()=>zt("file"),!0);var Ot=s(Oe,4);Ce(Ot,()=>zt("chevron"),!0);var Bt=s(Ae,2),Wt=l(Bt);Ce(Wt,()=>zt("swap"),!0);var na=s(Wt,4);Ce(na,()=>zt("chevron"),!0),A("click",qe,()=>D("cookbook")),A("click",Ye,$),A("click",Ae,()=>D("server")),A("click",Bt,()=>D("connect")),_(M,G)};I(Q,M=>{a(v).length?M(se,-1):M(de)})}var Y=s(C,2),me=l(Y),ve=l(me),we=s(l(ve),2),xe=l(we),be=s(ve,2);{var S=M=>{var G=Yi();ft(G,21,()=>a(v),ut,(qe,te)=>{const Be=q(()=>d.includes(a(te).state)),Ye=q(()=>a(te).state==="downloading"),et=q(()=>a(te).state==="loading"||a(te).state==="starting"||a(Ye)?"load":a(Be)?"on":""),ke=q(()=>a(Ye)?`↓ ${a(te).download_progress!=null?Math.round(a(te).download_progress)+"%":"..."}`:a(te).state==="loading"||a(te).state==="starting"?"lädt…":a(Be)?"geladen ✓":"bereit");var Ae=id(),Oe=l(Ae),Ot=s(Oe,2),Bt=l(Ot),Wt=l(Bt),na=l(Wt),_a=s(Wt,2);{var Ke=X=>{var _e=ed();_(X,_e)},ht=q(()=>{var X,_e;return(_e=(X=a(te).meta)==null?void 0:X.caps)==null?void 0:_e.includes("Bild")}),qa=X=>{var _e=td();_(X,_e)},Ga=q(()=>{var X,_e;return(_e=(X=a(te).meta)==null?void 0:X.caps)==null?void 0:_e.includes("Code")}),nn=X=>{var _e=ad();_(X,_e)};I(_a,X=>{a(ht)?X(Ke):a(Ga)?X(qa,1):X(nn,-1)})}var Ua=s(_a,2);{var Hn=X=>{var _e=nd();_(X,_e)};I(Ua,X=>{a(te).ttl>=99999&&X(Hn)})}var y=s(Bt,2),b=l(y),B=s(Ot,2),R=l(B),ae=l(R),tt=s(R,2);{var it=X=>{var _e=rd(),Re=l(_e);z(()=>{fa(_e,`padding:3px 9px;font-size:12px;opacity:${a(x)===a(te).name?".5":"1"}`),_e.disabled=a(x)===a(te).name,m(Re,a(x)===a(te).name?"…":"Laden")}),A("click",_e,()=>L(a(te).name)),_(X,_e)};I(tt,X=>{!a(Be)&&!a(Ye)&&a(o)&&X(it)})}z((X,_e)=>{var Re;wt(Oe,1,`li-dot ${a(et)??""}`),fa(Wt,a(Be)?"color:var(--accent)":""),m(na,a(te).name),m(b,`${X??""} + ${(Re=a(te).meta)!=null&&Re.quant?" · "+a(te).meta.quant:""} + ${_e??""}`),fa(R,`white-space:nowrap;color:${a(Be)?"var(--on)":"var(--mut)"}`),m(ae,a(ke))},[()=>{var X;return(X=a(te).meta)!=null&&X.ctx?Math.round(a(te).meta.ctx/1024)+"k ctx":""},()=>{var X;return(X=a(te).meta)!=null&&X.size_bytes?" · "+(a(te).meta.size_bytes/1073741824).toFixed(1)+" GB":""}]),_(qe,Ae)}),_(M,G)},V=M=>{var G=sd(),qe=s(l(G),4);A("click",qe,()=>D("cookbook")),_(M,G)};I(be,M=>{a(v).length?M(S):M(V,-1)})}var le=s(me,2),Qe=l(le),Je=s(l(Qe),2),Jt=s(Qe,2);{var Yt=M=>{var G=Yi();ft(G,21,()=>a(p),ut,(qe,te)=>{var Be=ld(),Ye=l(Be),et=l(Ye),ke=l(et),Ae=s(et,2),Oe=l(Ae);z(()=>{Fr(Be,"href",a(te).link),m(ke,a(te).title),m(Oe,`${a(te).source??""}${a(te).relevant?" · für dich":""}`)}),_(qe,Be)}),_(M,G)},Vt=M=>{var G=od();_(M,G)};I(Jt,M=>{a(p).length?M(Yt):M(Vt,-1)})}z(M=>{m(he,`${a(u)??""} `),m(T,a(h)),wt(re,1,`kpi ${a(o)?"green":"red"}`),m(Z,a(o)?"Online":"Offline"),m(P,M),wt(H,1,`kpi ${a(c)?"blue":"muted"}`),m(mt,a(c)?a(c).name:"Keins"),m(xe,a(v).length?a(v).length+" konfiguriert":"")},[()=>{var M,G;return((G=(M=a(n))==null?void 0:M.swap_url)==null?void 0:G.replace(/^https?:\/\//,""))??"—"}]),A("click",Je,()=>D("news")),A("keydown",Je,M=>M.key==="Enter"&&D("news")),_(e,Ee),an()}xn(["click","keydown"]);var vd=w(""),ud=w('
'),fd=w('
Noch keine Modelle konfiguriert
Hol dir unter „Cookbook" ein passendes Modell.
'),pd=w('
kein Modell hinterlegt
leere Rolleleer '),hd=w(' '),gd=w('
'),_d=w(' '),md=w('
API-Name:
'),bd=w('
ModellKannDetailsStatusPortAktionen
'),yd=w('
Empfohlen für deine Hardware

'),wd=w(''),xd=w(''),kd=w(''),Md=w('

Modelle

Deine konfigurierten Modelle — testen, Kontext anpassen oder aus dem Speicher werfen.

Schnelltest

Schreib eine Nachricht — das gewählte Modell wird automatisch geweckt.

Modelle & Ports

Modelle laden automatisch, sobald eine Anfrage kommt — du musst nichts manuell starten.
',1);function Sd(e,t){tn(t,!0);const n="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr (längere Dateien/Chats), braucht aber mehr Speicher und wird etwas langsamer.",r="Die Rolle ist ein zusätzlicher, sprechender Name (z.B. coder). Du kannst in deinen Tools entweder den echten Modellnamen ODER die Rolle angeben — beides führt zum selben Modell.",i=[{id:"coder",label:"Coder",desc:"Programmieren & Code"},{id:"vision",label:"Vision",desc:"Bilder verstehen"},{id:"scout",label:"Scout",desc:"Schneller Allrounder"},{id:"reviewer",label:"Reviewer",desc:"Code/Texte prüfen"},{id:"manager",label:"Manager",desc:"Planen & koordinieren"}],o=q(()=>{var C;return((C=mr.value)==null?void 0:C.models)||[]});function d(){document.dispatchEvent(new Event("mc:refresh"))}let c=O(""),v=O(""),u=O(""),h=O(!1);const E=q(()=>a(o).filter(C=>!C.incomplete));async function p(){var F;const C=a(c)||((F=a(E)[0])==null?void 0:F.name);if(!(!C||!a(v).trim())){g(h,!0),g(u,"(wecke Modell, kann beim Laden kurz dauern…)");try{const $e=await Me("/api/chat",{method:"POST",body:JSON.stringify({model:C,message:a(v)})});g(u,$e.reply,!0)}catch($e){g(u,"Fehler: "+$e.message)}g(h,!1),d()}}const x=300;let $=O(!1),L=O(null),k=O(8192),D=O(!1);function Pe(C){var F;g(L,a(o).find($e=>$e.name===C),!0),a(L)&&(g(k,((F=a(L).meta)==null?void 0:F.ctx)||8192,!0),g(D,(a(L).ttl??x)>=99999),g($,!0))}async function ne(){const C=a(D)?99999:x;try{await Me("/api/update_model",{method:"POST",body:JSON.stringify({alias:a(L).name,ctx:a(k),ttl:C})}),ee("Gespeichert — aktiv beim nächsten Modell-Start."),g($,!1),d()}catch(F){ee(F.message,!0)}}let pe=O(!1),Ee=O(""),K=O(""),U=O("");function ue(C){const F=a(o).find($e=>$e.name===C);g(Ee,C,!0),g(U,(F==null?void 0:F.role)||"",!0),g(K,""),g(pe,!0)}async function he(C){try{await Me("/api/set_role",{method:"POST",body:JSON.stringify({alias:a(Ee),role:C})}),ee(C?`Rolle gesetzt: ${C}`:"Rolle entfernt."),g(pe,!1),d()}catch(F){ee(F.message,!0)}}async function Le(C){if(await wa({title:`„${C}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await Me("/api/unload?model="+encodeURIComponent(C),{method:"POST"}),ee("Entladen: "+C),setTimeout(d,600)}catch(F){ee(F.message,!0)}}async function Ue(C){if(await wa({title:`„${C}" wirklich löschen?`,body:"Das Modell wird aus der Konfiguration ausgetragen und seine Dateien werden von der Festplatte gelöscht, um Speicher freizugeben. Das lässt sich nicht rückgängig machen — später brauchst du dafür einen neuen Download.",confirmLabel:"Endgültig löschen",danger:!0}))try{const F=await Me("/api/delete_model",{method:"POST",body:JSON.stringify({alias:C})});ee(F.note||"Gelöscht: "+C),setTimeout(d,600)}catch(F){ee(F.message,!0)}}function _t(C){return C!=null&&C.length?C.map(F=>F==="Code"?'Code':F==="Bild"?'Bild':'Text').join(" "):"–"}function T(C){if(!C)return"–";const F=C.quant||"?",$e=C.ctx?Math.round(C.ctx/1024)+"K":"?",dt=C.size_bytes?(C.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${F} · ${$e} · ${dt}`}function W(C){var F;(F=navigator.clipboard)==null||F.writeText(C),ee("Kopiert: "+C)}var re=Md(),He=s(ot(re),2),J=s(l(He),6);ft(J,21,()=>a(E),ut,(C,F)=>{var $e=vd(),dt=l($e),N={};z(()=>{m(dt,a(F).name),N!==(N=a(F).name)&&($e.value=($e.__value=a(F).name)??"")}),_(C,$e)});var ze=s(J,4),Z=s(ze,2),rt=l(Z),P=s(Z,2);{var H=C=>{var F=ud(),$e=l(F);z(()=>m($e,a(u))),_(C,F)};I(P,C=>{a(u)&&C(H)})}var ie=s(He,2),ge=l(ie),Te=s(l(ge)),mt=l(Te),pt=s(ge,4);{var kt=C=>{var F=fd();_(C,F)},At=C=>{var F=bd(),$e=s(l(F));ft($e,21,()=>a(o),ut,(dt,N)=>{var De=or(),Q=ot(De);{var de=Y=>{var me=pd(),ve=l(me),we=l(ve),xe=s(ve,5),be=l(xe),S=s(be,2);z(()=>m(we,a(N).name)),A("click",be,()=>{var V;ee("Lade im Cookbook ein Modell und setze den Alias auf: "+a(N).name),(V=document.querySelector(".nav-item[data-view='cookbook']"))==null||V.dispatchEvent(new MouseEvent("click"))}),A("click",S,()=>Ue(a(N).name)),_(Y,me)},se=Y=>{var me=md(),ve=l(me),we=l(ve),xe=l(we),be=s(xe);{var S=ke=>{var Ae=hd(),Oe=l(Ae);z(()=>m(Oe,a(N).role)),_(ke,Ae)};I(be,ke=>{a(N).role&&ke(S)})}var V=s(we,2);{var le=ke=>{var Ae=gd(),Oe=l(Ae);z(()=>m(Oe,a(N).meta.filename)),_(ke,Ae)};I(V,ke=>{var Ae;(Ae=a(N).meta)!=null&&Ae.filename&&ke(le)})}var Qe=s(V,2),Je=s(l(Qe),2);ft(Je,17,()=>{var ke;return(ke=a(N).api_ids)!=null&&ke.length?a(N).api_ids:[a(N).name]},ut,(ke,Ae)=>{var Oe=_d(),Ot=l(Oe);z(()=>m(Ot,a(Ae))),A("click",Oe,()=>W(a(Ae))),_(ke,Oe)});var Jt=s(ve);Ce(Jt,()=>{var ke;return _t((ke=a(N).meta)==null?void 0:ke.caps)},!0);var Yt=s(Jt);Ce(Yt,()=>T(a(N).meta),!0);var Vt=s(Yt);Ce(Vt,()=>Uo(a(N).state,a(N).download_progress),!0);var M=s(Vt),G=l(M),qe=s(M),te=l(qe),Be=s(te,2),Ye=s(Be,2),et=s(Ye,2);z(()=>{m(xe,`${a(N).name??""} `),m(G,a(N).port??"auto")}),A("click",te,()=>ue(a(N).name)),A("click",Be,()=>Pe(a(N).name)),A("click",Ye,()=>Le(a(N).name)),A("click",et,()=>Ue(a(N).name)),_(Y,me)};I(Q,Y=>{a(N).incomplete?Y(de):Y(se,-1)})}_(dt,De)}),_(C,F)};I(pt,C=>{a(o).length?C(At,-1):C(kt)})}var Mt=s(ie,2);{var Lt=C=>{var F=wd(),$e=l(F),dt=l($e),N=s(dt,4),De=l(N),Q=s(N,2),de=s(l(Q));Ce(de,()=>gi(n));var se=s(Q,2),Y=s(se,2);{var me=le=>{var Qe=yd(),Je=l(Qe),Jt=s(l(Je),2),Yt=l(Jt),Vt=s(Yt,2),M=s(Je,2);z((G,qe)=>{m(Yt,`Optimal ~${G??""}k → ~${a(L).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),m(Vt,` Aktuell ~${qe??""}k → ~${a(L).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(a(L).meta.optimal_ctx/1024),()=>Math.round((a(L).meta.ctx||0)/1024)]),A("click",M,()=>g(k,a(L).meta.optimal_ctx,!0)),_(le,Qe)};I(Y,le=>{var Qe;(Qe=a(L).meta)!=null&&Qe.optimal_ctx&&le(me)})}var ve=s(Y,4),we=s(l(ve),2),xe=l(we),be=s(xe,2),S=l(be),V=s(ve,2);z(()=>{m(De,a(L).name),fa(be,`color:${a(D)?"var(--accent)":"var(--mut)"}`),m(S,a(D)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),A("click",F,le=>{le.target.classList.contains("modal-overlay")&&g($,!1)}),A("click",dt,()=>g($,!1)),Ta(se,()=>a(k),le=>g(k,le)),Ro(xe,()=>a(D),le=>g(D,le)),A("click",V,ne),_(C,F)};I(Mt,C=>{a($)&&a(L)&&C(Lt)})}var qt=s(Mt,2);{var Rt=C=>{var F=kd(),$e=l(F),dt=l($e),N=s(dt,2),De=s(l(N));Ce(De,()=>gi(r));var Q=s(N,2),de=l(Q),se=s(Q,4);ft(se,21,()=>i,ut,(xe,be)=>{var S=xd(),V=l(S);z(()=>{wt(S,1,a(U)===a(be).id?"primary":"ghost"),Fr(S,"title",a(be).desc),m(V,a(be).label)}),A("click",S,()=>he(a(be).id)),_(xe,S)});var Y=s(se,4),me=s(Y,2),ve=l(me),we=s(ve,2);z(()=>m(de,a(Ee))),A("click",F,xe=>{xe.target.classList.contains("modal-overlay")&&g(pe,!1)}),A("click",dt,()=>g(pe,!1)),Ta(Y,()=>a(K),xe=>g(K,xe)),A("click",ve,()=>he("")),A("click",we,()=>he(a(K).trim().toLowerCase())),_(C,F)};I(qt,C=>{a(pe)&&C(Rt)})}z(()=>{Z.disabled=a(h),m(rt,a(h)?"…":"Senden"),m(mt,a(o).length?a(o).length+" konfiguriert":"")}),nr(J,()=>a(c),C=>g(c,C)),Ta(ze,()=>a(v),C=>g(v,C)),A("click",Z,p),_(e,re),an()}xn(["click"]);var Ed=w('
Prozessor (CPU)
%
Arbeitsspeicher
%
Grafikspeicher
%

System-Metriken (Bosgame)

Live-Auslastung deines Mini-PCs, alle 0,5 Sekunden.
Arbeitsspeicher (RAM)
Grafikspeicher (VRAM + GTT)
Speicherplatz (Disk)
Temperatur (GPU / CPU)
CPU-Verlauf
RAM-Verlauf
VRAM-Verlauf
',1),Td=w(''),$d=w('
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
'),Ad=w(' '),Cd=w(''),Ld=w(''),zd=w('
'),Dd=w('
'),Pd=w('
'),qd=w('

Aktivität

Live-Auslastung und laufende Aufgaben (Downloads, Updates) mit Protokoll.

Hintergrund-Aufgaben

Downloads & Updates erscheinen hier mit Live-Protokoll — zum Aufklappen klicken.
',1);function Od(e,t){tn(t,!0);const n=q(()=>dn.value),r=q(()=>dn.tracked),i=q(()=>Li.value);let o=Ht({cpu:[],ram:[],gpu:[]});Ti(()=>{var re;if(!a(i))return;const T=a(i).gpu,W=T&&T.vram.total+T.gtt.total>0?(T.vram.used+T.gtt.used)/(T.vram.total+T.gtt.total)*100:0;o.cpu=[...o.cpu,((re=a(i).cpu)==null?void 0:re.percent)??0].slice(-60),o.ram=[...o.ram,a(i).ram.percent].slice(-60),o.gpu=[...o.gpu,W].slice(-60)});const d=q(()=>()=>{var W;const T=(W=a(i))==null?void 0:W.gpu;return T&&T.vram.total+T.gtt.total>0?(T.vram.used+T.gtt.used)/(T.vram.total+T.gtt.total)*100:0}),c=q(()=>a(n).filter(T=>T.state!=="running"&&T.state!=="queued").length),v=q(()=>a(n).filter(T=>T.state==="failed").length);function u(T){if(T.state!=="running")return null;if(typeof T.progress=="number")return Math.min(100,T.progress);const re=((T.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return re?Math.min(100,parseFloat(re[1])):null}function h(T){return T==null||T<0?"":T>=90?`noch ~${Math.round(T/60)} min`:`noch ~${Math.max(1,Math.round(T))} s`}function E(T){return T==="done"?'fertig':T==="failed"?'fehler':T==="canceled"?'abgebrochen':'läuft…'}function p(T){return T==="done"?"on":T==="failed"||T==="canceled"?"":"load"}async function x(T){try{await Me(`/api/jobs/${T}/cancel`,{method:"POST"}),ee("Abbruch angefordert…")}catch(W){ee(W.message,!0)}}async function $(T){try{await Me(`/api/jobs/${T}`,{method:"DELETE"})}catch(W){ee(W.message,!0)}}async function L(){try{const T=await Me("/api/jobs/clear",{method:"POST"});ee(`${T.removed} Einträge entfernt.`)}catch(T){ee(T.message,!0)}}function k(T,W){return T.map(re=>`
`).join("")}var D=qd(),Pe=s(ot(D),2);{var ne=T=>{const W=q(()=>a(d)());var re=Ed(),He=ot(re),J=l(He),ze=s(l(J),2),Z=l(ze),rt=s(ze,2),P=l(rt),H=s(J,2),ie=s(l(H),2),ge=l(ie),Te=s(ie,2),mt=l(Te),pt=s(H,2),kt=s(l(pt),2),At=l(kt),Mt=s(kt,2),Lt=l(Mt),qt=s(He,2),Rt=s(l(qt),4),C=l(Rt),F=s(l(C)),$e=l(F),dt=s(C,2),N=s(l(dt),2),De=l(N),Q=s(dt,2),de=s(l(Q)),se=l(de),Y=s(Q,2),me=s(l(Y),2),ve=l(me),we=s(Rt,2),xe=l(we),be=s(l(xe));Ce(be,()=>k(o.cpu,"--accent"),!0);var S=s(xe,2),V=s(l(S));Ce(V,()=>k(o.ram,"--purple"),!0);var le=s(S,2),Qe=s(l(le));Ce(Qe,()=>k(o.gpu,"--on"),!0),z((Je,Jt,Yt,Vt,M,G,qe,te,Be,Ye,et,ke,Ae)=>{m(Z,Je),m(P,Jt),m(ge,Yt),m(mt,`${Vt??""} / ${M??""}`),m(At,G),m(Lt,qe),m($e,`${te??""} / ${Be??""}`),m(De,Ye),m(se,`${et??""} % belegt`),m(ve,`${ke??""} / ${Ae??""}`)},[()=>{var Je;return Math.round(((Je=a(i).cpu)==null?void 0:Je.percent)??0)},()=>{var Je;return((Je=a(i).cpu)==null?void 0:Je.temp)!=null?`${Math.round(a(i).cpu.temp)}° CPU-Temp`:"Auslastung"},()=>Math.round(a(i).ram.percent),()=>rn(a(i).ram.used),()=>rn(a(i).ram.total),()=>Math.round(a(W)),()=>a(i).gpu_temp!=null?`${Math.round(a(i).gpu_temp)}° GPU-Temp`:"VRAM + GTT",()=>rn(a(i).ram.used),()=>rn(a(i).ram.total),()=>a(i).gpu?`${rn(a(i).gpu.vram.used+a(i).gpu.gtt.used)} / ${rn(a(i).gpu.vram.total+a(i).gpu.gtt.total)}`:"–",()=>{var Je;return Math.round(((Je=a(i).disk)==null?void 0:Je.percent)??0)},()=>a(i).gpu_temp!=null?Math.round(a(i).gpu_temp)+"°":"–",()=>{var Je;return((Je=a(i).cpu)==null?void 0:Je.temp)!=null?Math.round(a(i).cpu.temp)+"°":"–"}]),_(T,re)};I(Pe,T=>{a(i)&&T(ne)})}var pe=s(Pe,2),Ee=l(pe),K=s(l(Ee),2),U=l(K),ue=s(K,2);{var he=T=>{var W=Td();A("click",W,L),_(T,W)};I(ue,T=>{a(c)&&T(he)})}var Le=s(Ee,4);{var Ue=T=>{var W=$d();_(T,W)},_t=T=>{var W=or(),re=ot(W);ft(re,17,()=>a(n),ut,(He,J)=>{const ze=q(()=>u(a(J))),Z=q(()=>a(J).state==="running"?h(a(J).eta_s):""),rt=q(()=>a(J).state==="running"&&a(J).rate_bps?rn(a(J).rate_bps)+"/s":""),P=q(()=>[a(Z),a(rt)].filter(Boolean).join(" · ")),H=q(()=>a(r).includes(a(J).id));var ie=Pd(),ge=l(ie),Te=l(ge),mt=s(Te,2),pt=l(mt),kt=s(mt,2);{var At=N=>{var De=Ad(),Q=l(De);z(de=>m(Q,`${de??""} %${a(P)?` · ${a(P)}`:""}`),[()=>Math.round(a(ze))]),_(N,De)};I(kt,N=>{a(ze)!=null&&N(At)})}var Mt=s(kt,2);{var Lt=N=>{var De=Cd();z(()=>fa(De,`${a(ze)==null?"margin-left:auto;":""}margin-right:2px;padding:2px 9px;font-size:12px`)),A("click",De,Q=>{Q.stopPropagation(),x(a(J).id)}),_(N,De)},qt=N=>{var De=Ld();A("click",De,Q=>{Q.stopPropagation(),$(a(J).id)}),_(N,De)};I(Mt,N=>{a(J).state==="running"?N(Lt):N(qt,-1)})}var Rt=s(Mt,2);Ce(Rt,()=>E(a(J).state));var C=s(ge,2);{var F=N=>{var De=zd(),Q=l(De);z(()=>fa(Q,`width:${a(ze)??""}%`)),_(N,De)};I(C,N=>{a(ze)!=null&&a(J).state==="running"&&N(F)})}var $e=s(C,2);{var dt=N=>{var De=Dd(),Q=l(De);z(de=>m(Q,de),[()=>(a(J).log||[]).join(` +`)]),_(N,De)};I($e,N=>{a(H)&&N(dt)})}z(N=>{wt(Te,1,`li-dot ${N??""}`),m(pt,a(J).label)},[()=>p(a(J).state)]),A("click",ge,()=>dn.toggle(a(J).id)),A("keydown",ge,N=>N.key==="Enter"&&dn.toggle(a(J).id)),_(He,ie)}),_(T,W)};I(Le,T=>{a(n).length?T(_t,-1):T(Ue)})}z(()=>m(U,a(n).length?a(v)?a(v)+" Fehler":a(n).length+" gesamt":"")),_(e,D),an()}xn(["click","keydown"]);var Rd=w(' '),Bd=w(''),Id=w('✓ fertig'),Nd=w('✗ fehlgeschlagen'),Fd=w('abgebrochen'),Kd=w('läuft…'),Gd=w('
'),Ud=w('

Aktueller Vorgang

'),Hd=w('

Server & Wartung

Dienste steuern, Updates einspielen und live mitlesen — ganz ohne SSH oder Terminal.

LLM-Engine (llama-swap)

Das Herzstück: lädt bei jeder Anfrage automatisch das passende Modell.
Adresse (für deine Tools)
Aktuell geladen
Konfigurierte Modelle

Dienste & Applikation

Diese Aktionen sind harmlos und passwortlos — es geht nichts dabei verloren.

Betriebssystem (Bosgame)

Tiefe Eingriffe — das Dashboard fragt einmalig nach deinem sudo-Passwort.

Live-Konsole

Live mitlesen, was der Dienst gerade tut.
',1);function Vd(e,t){tn(t,!0);const n=q(()=>mr.value),r=q(()=>dn.value);let i=null,o=O(`Verbinde… +`),d=O("llama-swap"),c,v=O(null),u=O("");const h=new Set,E=q(()=>a(v)?a(r).find(S=>S.id===a(v)):null);Ti(()=>{if(!a(E))return;const S=a(E),V=S.state==="done",le=S.state==="failed",Qe=S.state==="canceled";(V||le||Qe)&&!h.has(S.id)&&(h.add(S.id),ee(V?`✓ ${a(u)} abgeschlossen.`:Qe?`${a(u)} abgebrochen.`:`✗ ${a(u)} fehlgeschlagen.`,le),V&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function p(S,V){g(v,S,!0),g(u,V,!0),dn.track(S)}_r(()=>{x()}),Io(()=>{i==null||i.close()});function x(){i==null||i.close();const S=a(d);g(o,`Verbinde mit ${S}… +`);const V=location.protocol==="https:"?"wss:":"ws:";i=new WebSocket(`${V}//${location.host}/api/logs/${S}?token=${encodeURIComponent(el())}`),i.onmessage=le=>{g(o,a(o)+le.data),c&&(c.scrollTop=c.scrollHeight)},i.onclose=()=>{g(o,a(o)+` +— Verbindung getrennt —`)},i.onerror=()=>i==null?void 0:i.close()}async function $(S,V,le){if(await wa({title:V,body:le,confirmLabel:"Neustarten"}))try{await Me(`/api/service/${S}/restart`,{method:"POST"}),ee("Neustart ausgelöst: "+S),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(Qe){ee(Qe.message,!0)}}async function L(){if(await wa({title:"Mission Control aktualisieren?",body:"Holt die neueste Dashboard-Version aus Gitea und startet automatisch neu. Die Seite trennt kurz und verbindet von selbst wieder (~10 Sek)."}))try{const S=await Me("/api/self-update",{method:"POST"});ee("Update läuft — Dashboard startet gleich neu."),p(S.job_id,"Mission Control Update")}catch(S){ee(S.message,!0)}}async function k(){if(await wa({title:"LLM-Engine aktualisieren?",body:"Lädt die neueste llama.cpp-ROCm-Version und installiert sie. Die Engine ist während des Updates kurz nicht erreichbar."}))try{const S=await Me("/api/update",{method:"POST"});ee("LLM-Engine-Update läuft."),p(S.job_id,"LLM-Engine-Update")}catch(S){ee(S.message,!0)}}async function D(){if(await wa({title:"Grafikspeicher leeren?",body:"Alle geladenen Modelle werden entladen. Sie laden beim nächsten Aufruf automatisch neu — es geht nichts verloren.",confirmLabel:"Leeren"}))try{await Me("/api/unload",{method:"POST"}),ee("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(S){ee(S.message,!0)}}async function Pe(){if(!await wa({title:"OS-Updates installieren?",body:"Führt apt update & upgrade aus. Das kann ein paar Minuten dauern; der Fortschritt erscheint in der Aktivität."}))return;const S=await Wi({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(S)try{const V=await Me("/api/os-update",{method:"POST",body:JSON.stringify({password:S})});ee("OS-Update gestartet."),p(V.job_id,"OS-Update")}catch(V){ee(V.message,!0)}}async function ne(){if(!await wa({title:"Server wirklich neu starten?",body:"Der ganze Bosgame startet physisch neu. Alles ist für ~1 Minute offline — auch dieses Dashboard.",confirmLabel:"Reboot",danger:!0}))return;const S=await Wi({title:"sudo-Passwort",body:"Für den Reboot wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Jetzt neustarten",danger:!0});if(S)try{await Me("/api/reboot",{method:"POST",body:JSON.stringify({password:S})}),ee("Reboot ausgelöst — bis gleich.")}catch(V){ee(V.message,!0)}}async function pe(){g(Ee,"prüfe…");try{const S=await Me("/api/integration/test");g(Ee,S.ok?`✓ Engine antwortet — ${S.models.length} Modell(e): ${S.models.join(", ")}`:`✗ keine Verbindung: ${S.error}`,!0),g(K,S.ok,!0)}catch(S){g(Ee,"✗ "+S.message),g(K,!1)}}let Ee=O(""),K=O(!1);const U=q(()=>{var S;return((S=a(n))==null?void 0:S.models)||[]}),ue=["running","ready","loading","starting"],he=q(()=>a(U).find(S=>ue.includes(S.state)));function Le(S){if(!S||S.state!=="running")return null;if(typeof S.progress=="number")return Math.min(100,S.progress);const le=((S.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return le?Math.min(100,parseFloat(le[1])):null}var Ue=Hd(),_t=s(ot(Ue),2),T=l(_t),W=s(l(T),2),re=l(W),He=s(T,4),J=l(He),ze=s(l(J)),Z=l(ze),rt=s(J,2),P=s(l(rt),2),H=l(P),ie=s(rt,2),ge=s(l(ie),2),Te=l(ge),mt=s(He,2),pt=l(mt),kt=s(pt,2);{var At=S=>{var V=Rd(),le=l(V);z(()=>{fa(V,`color:${a(K)?"#7ee29a":"#ff9b95"}`),m(le,a(Ee))}),_(S,V)};I(kt,S=>{a(Ee)&&S(At)})}var Mt=s(_t,2),Lt=s(l(Mt),4),qt=s(Lt,2),Rt=s(qt,2),C=s(Rt,2),F=s(C,2),$e=s(Mt,2),dt=s(l($e),4),N=s(dt,2),De=s($e,2);{var Q=S=>{const V=q(()=>a(E)),le=q(()=>a(V).state==="done"),Qe=q(()=>a(V).state==="failed"),Je=q(()=>a(V).state==="canceled"),Jt=q(()=>a(le)||a(Qe)||a(Je)),Yt=q(()=>Le(a(V)));var Vt=Ud(),M=l(Vt),G=s(l(M),2);{var qe=Ke=>{var ht=Bd();A("click",ht,async()=>{await wa({title:a(u)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&Me(`/api/jobs/${a(V).id}/cancel`,{method:"POST"})}),_(Ke,ht)};I(G,Ke=>{a(Jt)||Ke(qe)})}var te=s(G,2),Be=l(te);{var Ye=Ke=>{var ht=Id();_(Ke,ht)},et=Ke=>{var ht=Nd();_(Ke,ht)},ke=Ke=>{var ht=Fd();_(Ke,ht)},Ae=Ke=>{var ht=Kd();_(Ke,ht)};I(Be,Ke=>{a(le)?Ke(Ye):a(Qe)?Ke(et,1):a(Je)?Ke(ke,2):Ke(Ae,-1)})}var Oe=s(M,2),Ot=l(Oe),Bt=s(Oe,2);{var Wt=Ke=>{var ht=Gd(),qa=l(ht);z(()=>fa(qa,`width:${a(Yt)??""}%`)),_(Ke,ht)};I(Bt,Ke=>{a(Yt)!=null&&!a(Jt)&&Ke(Wt)})}var na=s(Bt,2),_a=l(na);z(Ke=>{m(Ot,`${a(u)??""}${a(Jt)?a(le)?" — erfolgreich.":a(Je)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),m(_a,Ke)},[()=>(a(V).log||[]).join(` +`)]),_(S,Vt)};I(De,S=>{a(E)&&S(Q)})}var de=s(De,2),se=l(de),Y=s(l(se),2),me=l(Y);me.value=me.__value="llama-swap";var ve=s(me);ve.value=ve.__value="mission-control";var we=s(ve);we.value=we.__value="system";var xe=s(se,4),be=l(xe);Bo(xe,S=>c=S,()=>c),z(S=>{var V,le,Qe;fa(W,`margin-left:auto;${(V=a(n))!=null&&V.swap_ok?"background:rgba(63,185,80,.12);border-color:rgba(63,185,80,.25);color:#7ee29a":"background:rgba(248,81,73,.12);border-color:rgba(248,81,73,.3);color:#ff9b95"}`),m(re,(le=a(n))!=null&&le.swap_ok?"● erreichbar":"● offline"),m(Z,(((Qe=a(n))==null?void 0:Qe.swap_url)||"—")+"/v1"),m(H,a(he)?a(he).name+` (${a(he).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),m(Te,S),m(be,a(o))},[()=>a(U).filter(S=>!S.incomplete).length||"keine"]),A("click",pt,pe),A("click",Lt,()=>$("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),A("click",qt,()=>$("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),A("click",Rt,L),A("click",C,k),A("click",F,D),A("click",dt,Pe),A("click",N,ne),A("change",Y,x),nr(Y,()=>a(d),S=>g(d,S)),_(e,Ue),an()}xn(["click","change"]);var Wd=w('
Lade Setups…
'),jd=w(' ×',1),Xr=w('
★ Beste Wahl für dein System
'),Qd=w('
Dein Setup
'),Jd=w(''),Yd=w('
'),Zd=w('· ⚠ Cache veraltet'),Xd=w(" ",1),ec=w('
Frage Quellen ab…
'),tc=w('
'),ac=w('✓ installiert'),nc=w(''),rc=w('

'),ic=w('

'),sc=w(''),lc=w('

'),oc=w('
'),dc=w('
'),cc=w('
'),vc=w(" "),uc=w('
'),fc=w('
Größter Spitzenbedarf: . Es läuft immer nur ein Modell gleichzeitig — das größte bestimmt, ob das Setup passt.
'),pc=w('Alternative: — passt auf dein System.',1),hc=w('
⚠ Dieses Setup übersteigt deinen verfügbaren Speicher.
'),gc=w(''),_c=w('
Lade Dateien von HuggingFace…
'),Zi=w(""),mc=w('
Empfohlener Kontext für deine Hardware: übernehmen
'),bc=w('
Ressourcen-Check
'),yc=w('
⚠ Diese Datei ist zu groß für deinen Speicher. Kleinere Alternative: — einfach auswählen.
'),wc=w('
⚠ Alle Varianten dieses Modells sind zu groß für deinen Speicher. Ein kleineres Modell aus den Empfehlungen wäre die bessere Wahl.
'),xc=w('
',1),kc=w('
Keine GGUF-Dateien im Repo gefunden.
'),Mc=w(''),Sc=w('
'),Ec=w(''),Tc=w('

Cookbook

Modelle finden, installieren und eigene Setups zusammenstellen.

1 · Anwendungsfall wählen & installieren

Hier starten: Fertige Modell-Bundles für deinen Anwendungsfall — ein Klick installiert alles. Die Hardware-Ampel zeigt vorab, ob das Setup auf deinen PC passt.

Aktuell die besten Modelle für dein System

Top-Modelle je Kategorie von HuggingFace — Hardware-Fit wird live für dein System berechnet.

Profi-Suche (HuggingFace)

Direkt HuggingFace durchsuchen — oder eine Modell-URL einfügen für den direkten Sprung.
',1);function $c(e,t){tn(t,!0);const n="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr, braucht aber mehr Speicher und wird etwas langsamer.",r="MoE (Mixture of Experts): viele Parameter fürs Wissen, aber pro Wort ist nur ein kleiner Teil aktiv → fast große-Modell-Qualität bei hohem Tempo. Ideal für deine APU.",i={perfect:0,marginal:1,too_tight:2},o={vision:"Bilder",coder:"Coden",reasoning:"Logik",agent:"Agenten & Tools",scout:"Allrounder",reviewer:"Review",manager:"Manager"},d=[{label:"Bilder",kw:["-vl-","-vl","vision","llava","multimodal","-mm-","pixtral"]},{label:"Coden",kw:["coder","-code-","code-","codestral","starcoder"]},{label:"Logik",kw:["-r1","deepseek-r1","reasoning","qwq","magistral","-think","thinking","-o1"]},{label:"Agenten & Tools",kw:["hermes","-tool","command-r","watt","-fc-","function"]}];function c(y){const b=(y||"").toLowerCase();for(const B of d)if(B.kw.some(R=>b.includes(R)))return B.label;return"Allrounder"}function v(y=""){const b=y.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(b)||new RegExp("(?{mt(),pt()});async function mt(){g(L,!0);try{const y=await Me("/api/cookbook/recipes");g(x,y.recipes||[],!0),g($,y.recommended_id||null,!0)}catch(y){ee(y.message,!0)}g(L,!1)}async function pt(y=!1){g(D,!0);try{const b=await Me("/api/cookbook/discover"+(y?"?force=true":""));g(k,b,!0),g(Pe,b.stale,!0)}catch(b){ee("Empfehlungen nicht ladbar: "+b.message,!0)}g(D,!1)}function kt(y){y=y.trim();const b=y.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return b?b[1]:/^[\w.-]+\/[\w.-]+$/.test(y)?y:null}async function At(){const y=a(ne).trim(),b=kt(y);let B=y;if(a(K)&&!b&&(B=B?B+" "+a(K):a(K)),!B&&!b){g(pe,[],!0);return}g(Ee,!0),g(ue,[],!0),g(he,-1);try{if(b)g(pe,[{id:b,author:b.split("/")[0],downloads:0}],!0);else{const R=`https://huggingface.co/api/models?search=${encodeURIComponent(B)}&filter=gguf&sort=${encodeURIComponent(a(U))}&direction=-1&limit=40`,ae=await fetch(R);g(pe,await ae.json(),!0)}a(pe).forEach((R,ae)=>Mt(ae,R.id))}catch(R){ee(R.message,!0),g(pe,[],!0)}g(Ee,!1)}async function Mt(y,b){var B;try{const R=await Me("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:b,ctx:8192})});if(!((B=R.files)!=null&&B.length)){a(ue)[y]=null,Lt();return}const ae=R.files.find(tt=>{var it;return(it=tt.quant)==null?void 0:it.includes("Q4_K_M")})||R.files[0];a(ue)[y]=ae.fit.level,Lt()}catch{a(ue)[y]=null,Lt()}}function Lt(){let y=-1,b=99;a(ue).forEach((B,R)=>{if(B==null)return;const ae=i[B]??99;ae=0&&b<=1?y:-1,!0)}function qt(y){g(Le,a(x).find(b=>b.id===y),!0)}async function Rt(y){const b=document.getElementById("cb-r-install-btn");b&&(b.disabled=!0,b.textContent="Starte…");try{const B=await Me("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:y,hf_token:ir()})});ee(`${B.count} Download${B.count!==1?"s":""} läuft — Modelle erscheinen danach automatisch im Modelle-Tab.`),g(Le,null),Te("activity")}catch(B){ee(B.message,!0),b&&(b.disabled=!1,b.textContent="Installieren")}}async function C(y,b){var B,R;g(Ue,!0),g(_t,b,!0),g(T,y,!0),g(He,""),g(J,8192),g(W,null),g(Z,null),g(re,""),g(ze,!0);try{if(g(W,await Me("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:y,ctx:8192})}),!0),(R=(B=a(W))==null?void 0:B.files)!=null&&R.length){const ae=a(W).files.find(tt=>{var it;return(it=tt.quant)==null?void 0:it.includes("Q4_K_M")})||a(W).files[0];g(re,ae.filename,!0),ae.optimal_ctx&&a(J)===8192&&g(J,ae.optimal_ctx,!0),F()}}catch(ae){ee(ae.message,!0)}g(ze,!1)}function F(){var y,b,B;!((b=(y=a(W))==null?void 0:y.files)!=null&&b.length)||!a(re)||(g(Z,a(W).files.find(R=>R.filename===a(re))||null,!0),(B=a(Z))!=null&&B.optimal_ctx&&a(J)===8192&&g(J,a(Z).optimal_ctx,!0))}async function $e(){var y,b;if(!a(T)||!a(re))return ee("Bitte eine GGUF-Datei wählen.",!0);g(ze,!0);try{const B=((y=a(W))==null?void 0:y.params_b)??7,R=((b=a(Z))==null?void 0:b.quant)??"Q4_K_M";await Me("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:a(T),role:a(He),params_b:B,quant:R,file:a(re),ctx:a(J),hf_token:ir()})}),ee("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),g(Ue,!1),Te("activity")}catch(B){ee("Fehler: "+B.message,!0)}g(ze,!1)}async function dt(y,b,B,R){R.disabled=!0,R.textContent="Starte…";try{await Me("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:y,role:b,params_b:B,quant:"Q4_K_M",hf_token:ir()})}),ee("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),Te("activity")}catch(ae){ee(ae.message,!0),R.disabled=!1,R.textContent="Installieren"}}function N(){g(ge,null),g(P,""),g(H,""),g(ie,[{repo:"",role:"",quant:"Q4_K_M"}],!0),g(rt,!0)}function De(y){const b=a(x).find(B=>B.id===y);b&&(g(ge,y,!0),g(P,b.title,!0),g(H,b.desc||"",!0),g(ie,b.models.map(B=>({repo:B.repo,role:B.role,quant:B.quant||"Q4_K_M"})),!0),g(rt,!0))}async function Q(){if(!a(P).trim())return ee("Bitte einen Titel angeben.",!0);const y=a(ie).filter(b=>b.repo.trim());if(!y.length)return ee("Mindestens ein Modell (Repo) angeben.",!0);try{a(ge)?(await Me("/api/cookbook/user-recipe/"+encodeURIComponent(a(ge)),{method:"PUT",body:JSON.stringify({title:a(P),desc:a(H),models:y})}),ee("Setup aktualisiert.")):(await Me("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:a(P),desc:a(H),models:y})}),ee("Setup gespeichert.")),g(rt,!1),mt()}catch(b){ee(b.message,!0)}}async function de(y){const b=a(x).find(B=>B.id===y);if(await wa({title:`„${(b==null?void 0:b.title)||y}" löschen?`,body:"Dein eigenes Setup wird aus dem Cookbook entfernt. Bereits installierte Modelle bleiben unangetastet.",confirmLabel:"Löschen",danger:!0}))try{await Me("/api/cookbook/user-recipe/"+encodeURIComponent(y),{method:"DELETE"}),ee("Setup gelöscht."),mt()}catch(B){ee(B.message,!0)}}function se(y){if(!v(y))return"";const b=u(y);return`MoE${b?` · ~${b}B aktiv`:""}`}function Y(y){return y?`${za(y)}`:""}var me=Tc(),ve=s(ot(me),2),we=l(ve),xe=s(l(we),2),be=s(we,4);{var S=y=>{var b=Wd();_(y,b)},V=y=>{var b=Yd();ft(b,21,()=>a(x),ut,(B,R)=>{const ae=q(()=>a(R).id===a($));var tt=Jd(),it=l(tt);{var X=fe=>{var Ze=jd(),Nt=ot(Ze),Tt=s(Nt,2);A("click",Nt,bt=>{bt.stopPropagation(),De(a(R).id)}),A("keydown",Nt,bt=>{bt.key==="Enter"&&(bt.stopPropagation(),De(a(R).id))}),A("click",Tt,bt=>{bt.stopPropagation(),de(a(R).id)}),A("keydown",Tt,bt=>{bt.key==="Enter"&&(bt.stopPropagation(),de(a(R).id))}),_(fe,Ze)};I(it,fe=>{a(R).user&&fe(X)})}var _e=s(it,2);{var Re=fe=>{var Ze=Xr();_(fe,Ze)},ct=fe=>{var Ze=Qd();_(fe,Ze)};I(_e,fe=>{a(ae)?fe(Re):a(R).user&&fe(ct,1)})}var Ie=s(_e,2),Ge=l(Ie),st=l(Ge),St=l(st),Zt=s(Ge,2),vt=l(Zt),Ne=s(Ie,2),Et=l(Ne),It=s(Ne,2),gt=l(It);z((fe,Ze)=>{wt(tt,1,`card-btn${a(ae)?" cb-best":""}`),m(St,a(R).title),wt(Zt,1,`fit-badge ${fe??""}`),m(vt,Ze),m(Et,a(R).desc),m(gt,`${a(R).models.length??""} Modell${a(R).models.length>1?"e":""} im Setup`)},[()=>h(a(R).fit_level),()=>E(a(R).fit_level)]),A("click",tt,()=>qt(a(R).id)),_(B,tt)}),_(y,b)};I(be,y=>{a(L)?y(S):y(V,-1)})}var le=s(ve,2),Qe=l(le),Je=s(l(Qe),2),Jt=l(Je);{var Yt=y=>{const b=q(()=>Math.round((Date.now()/1e3-a(k).updated)/60));var B=Xd(),R=ot(B);{var ae=Re=>{var ct=ar();z(()=>m(ct,`Quellen befragt vor ${a(b)??""} min`)),_(Re,ct)},tt=Re=>{var ct=ar();z(Ie=>m(ct,`Quellen befragt vor ${Ie??""} h`),[()=>Math.round(a(b)/60)]),_(Re,ct)},it=Re=>{var ct=ar();z(Ie=>m(ct,`Quellen befragt vor ${Ie??""} Tg.`),[()=>Math.round(a(b)/1440)]),_(Re,ct)};I(R,Re=>{a(b)<60?Re(ae):a(b)<1440?Re(tt,1):Re(it,-1)})}var X=s(R,2);{var _e=Re=>{var ct=Zd();_(Re,ct)};I(X,Re=>{a(Pe)&&Re(_e)})}_(y,B)};I(Jt,y=>{var b;(b=a(k))!=null&&b.updated&&y(Yt)})}var Vt=s(Je,2),M=l(Vt),G=s(Qe,4);{var qe=y=>{var b=ec();_(y,b)},te=y=>{var b=or(),B=ot(b);ft(B,17,()=>a(k).categories,ut,(R,ae)=>{var tt=ic(),it=l(tt),X=l(it),_e=l(X),Re=s(it,2);ft(Re,21,()=>a(ae).models,ut,(ct,Ie)=>{const Ge=q(()=>a(ae).recommended&&a(Ie).repo===a(ae).recommended);var st=rc(),St=l(st);{var Zt=Xe=>{var nt=Xr();_(Xe,nt)};I(St,Xe=>{a(Ge)&&Xe(Zt)})}var vt=s(St,2),Ne=l(vt),Et=l(Ne),It=l(Et),gt=s(Et,2),fe=l(gt),Ze=s(Ne,2),Nt=l(Ze),Tt=s(vt,2),bt=l(Tt);Ce(bt,()=>Y(o[a(Ie).role]||c(a(Ie).repo)));var Oa=s(bt,2);Ce(Oa,()=>se(a(Ie).repo));var Ha=s(Tt,2),Sa=l(Ha),kn=s(Ha,2);ft(kn,17,()=>a(Ie).requirements||[],ut,(Xe,nt)=>{var Ct=tc(),Ea=l(Ct);z(()=>m(Ea,`⚠ ${a(nt)??""}`)),_(Xe,Ct)});var lt=s(kn,4),Ve=l(lt);{var at=Xe=>{var nt=ac();z(()=>Fr(nt,"title",`bereits eingerichtet als ${a(Ie).installed??""}`)),_(Xe,nt)},yt=Xe=>{var nt=nc();A("click",nt,Ct=>dt(a(Ie).repo,a(Ie).role,a(Ie).params_b,Ct.currentTarget)),_(Xe,nt)};I(Ve,Xe=>{a(Ie).installed?Xe(at):Xe(yt,-1)})}z((Xe,nt,Ct)=>{wt(st,1,`card${a(Ge)?" res-best":""}`),m(It,a(Ie).name),m(fe,`${a(Ie).author??""} · ${a(Ie).params_b??""}B`),wt(Ze,1,`fit-badge ${Xe??""}`),m(Nt,a(Ie).fit.text),m(Sa,`${nt??""} · ⬇ ${Ct??""}`)},[()=>h(a(Ie).fit.level),()=>p(a(Ie).fit),()=>(a(Ie).downloads||0).toLocaleString()]),_(ct,st)}),z(()=>m(_e,a(ae).title)),_(R,tt)}),_(y,b)};I(G,y=>{var b;a(D)&&!a(k)?y(qe):(b=a(k))!=null&&b.categories&&y(te,1)})}var Be=s(le,2),Ye=s(l(Be),4),et=l(Ye),ke=s(et,2),Ae=l(ke);Ae.value=Ae.__value="downloads";var Oe=s(Ae);Oe.value=Oe.__value="trending";var Ot=s(Oe);Ot.value=Ot.__value="created_at";var Bt=s(ke,2),Wt=l(Bt),na=s(Ye,2);ft(na,20,()=>["","coder","vision","reasoning","chat","agent"],ut,(y,b)=>{var B=sc(),R=l(B);z(()=>{wt(B,1,a(K)===b?"primary":"ghost"),m(R,b||"Alle")}),A("click",B,()=>{g(K,b,!0),At()}),_(y,B)});var _a=s(na,2);{var Ke=y=>{var b=oc();ft(b,21,()=>a(pe),ut,(B,R,ae)=>{var tt=lc(),it=l(tt);{var X=Tt=>{var bt=Xr();_(Tt,bt)};I(it,Tt=>{ae===a(he)&&Tt(X)})}var _e=s(it,2),Re=l(_e),ct=l(Re),Ie=l(ct),Ge=s(ct,2),st=l(Ge),St=s(Re,2),Zt=l(St),vt=s(_e,2),Ne=l(vt);Ce(Ne,()=>Y(c(a(R).id)));var Et=s(Ne,2);Ce(Et,()=>se(a(R).id));var It=s(vt,4),gt=l(It),fe=l(gt),Ze=s(gt,2),Nt=l(Ze);z((Tt,bt,Oa,Ha,Sa)=>{wt(tt,1,`card${ae===a(he)?" res-best":""}`),m(Ie,Tt),m(st,a(R).author||""),wt(St,1,`fit-badge ${bt??""}`),m(Zt,Oa),m(fe,Ha),m(Nt,`⬇ ${Sa??""}`)},[()=>a(R).id.split("/").pop(),()=>a(ue)[ae]?h(a(ue)[ae]):"warn",()=>a(ue)[ae]?E(a(ue)[ae]):"prüfe…",()=>a(ue)[ae]?p({req_gb:0,tps:0}):"Hardware-Fit…",()=>(a(R).downloads||0).toLocaleString()]),A("click",tt,()=>C(a(R).id,a(R).id.split("/").pop())),_(B,tt)}),_(y,b)};I(_a,y=>{a(pe).length&&y(Ke)})}var ht=s(Be,2);{var qa=y=>{const b=q(()=>a(Le));var B=gc(),R=l(B),ae=l(R),tt=s(ae,2),it=l(tt),X=s(tt,2),_e=l(X),Re=s(X,2);ft(Re,21,()=>a(b).models,ut,(vt,Ne)=>{var Et=uc(),It=l(Et),gt=l(It),fe=l(gt),Ze=l(fe),Nt=s(fe,2),Tt=l(Nt),bt=s(Nt,2);Ce(bt,()=>se(a(Ne).repo));var Oa=s(gt,2);{var Ha=at=>{var yt=dc(),Xe=l(yt);z(()=>m(Xe,a(Ne).why)),_(at,yt)};I(Oa,at=>{a(Ne).why&&at(Ha)})}var Sa=s(Oa,2);{var kn=at=>{var yt=cc(),Xe=l(yt);z((nt,Ct,Ea)=>m(Xe,`~${nt??""} GB · ~${Ct??""} Tok/s · optimal ~${Ea??""}k Kontext`),[()=>(a(Ne).fit.req_gb??0).toFixed(1),()=>Math.round(a(Ne).fit.tps??0),()=>Math.round((a(Ne).optimal_ctx||8192)/1024)]),_(at,yt)};I(Sa,at=>{a(Ne).fit&&at(kn)})}var lt=s(It,2);{var Ve=at=>{var yt=vc(),Xe=l(yt);z(nt=>{wt(yt,1,`fit-badge ${nt??""}`),m(Xe,a(Ne).fit.text)},[()=>h(a(Ne).fit.level)]),_(at,yt)};I(lt,at=>{a(Ne).fit&&at(Ve)})}z(()=>{m(Ze,a(Ne).name),m(Tt,a(Ne).role)}),_(vt,Et)});var ct=s(Re,2);{var Ie=vt=>{const Ne=q(()=>Math.max(...a(b).models.map(fe=>{var Ze;return((Ze=fe.fit)==null?void 0:Ze.req_gb)??0})));var Et=fc(),It=s(l(Et)),gt=l(It);z(fe=>m(gt,`~${fe??""} GB`),[()=>a(Ne).toFixed(1)]),_(vt,Et)};I(ct,vt=>{a(b).models.length&&a(b).models[0].fit&&vt(Ie)})}var Ge=s(ct,2);{var st=vt=>{const Ne=q(()=>a(x).find(fe=>!fe.user&&fe.fit_level!=="too_tight"&&fe.id!==a(b).id));var Et=hc(),It=s(l(Et));{var gt=fe=>{var Ze=pc(),Nt=s(ot(Ze)),Tt=l(Nt);z(()=>m(Tt,`„${a(Ne).title??""}" ansehen`)),A("click",Nt,bt=>{bt.preventDefault(),g(Le,null),setTimeout(()=>qt(a(Ne).id),50)}),_(fe,Ze)};I(It,fe=>{a(Ne)&&fe(gt)})}_(vt,Et)};I(Ge,vt=>{a(b).fit_level==="too_tight"&&vt(st)})}var St=s(Ge,2),Zt=l(St);z(()=>{m(it,a(b).title),m(_e,a(b).desc),wt(St,1,`primary${a(b).fit_level==="too_tight"?" warn":""}`),m(Zt,a(b).fit_level==="too_tight"?"Trotzdem installieren (nicht empfohlen)":"Komplettes Setup installieren")}),A("click",B,vt=>{vt.target.classList.contains("modal-overlay")&&g(Le,null)}),A("click",ae,()=>g(Le,null)),A("click",St,()=>Rt(a(b).id)),_(y,B)};I(ht,y=>{a(Le)&&y(qa)})}var Ga=s(ht,2);{var nn=y=>{var b=Mc(),B=l(b),R=l(B),ae=s(R,2),tt=l(ae),it=s(ae,2),X=l(it),_e=s(it,2);{var Re=Ge=>{var st=_c();_(Ge,st)},ct=Ge=>{var st=xc(),St=s(ot(st),2);ft(St,21,()=>a(W).files,ut,(lt,Ve)=>{const at=q(()=>a(Ve).fit.level==="perfect"?"●":a(Ve).fit.level==="marginal"?"◐":"○");var yt=Zi(),Xe=l(yt),nt={};z(()=>{m(Xe,`${a(at)??""} ${a(Ve).filename??""}`),nt!==(nt=a(Ve).filename)&&(yt.value=(yt.__value=a(Ve).filename)??"")}),_(lt,yt)});var Zt=s(St,2),vt=l(Zt),Ne=s(l(vt),2),Et=s(vt,2),It=l(Et),gt=s(l(It));Ce(gt,()=>gi(n));var fe=s(It,2),Ze=s(Zt,2);{var Nt=lt=>{var Ve=mc(),at=s(l(Ve)),yt=l(at),Xe=s(at,2);z(nt=>m(yt,`~${nt??""}k`),[()=>Math.round(a(Z).optimal_ctx/1024)]),A("click",Xe,nt=>{nt.preventDefault(),g(J,a(Z).optimal_ctx,!0)}),_(lt,Ve)};I(Ze,lt=>{var Ve;(Ve=a(Z))!=null&&Ve.optimal_ctx&<(Nt)})}var Tt=s(Ze,2);{var bt=lt=>{var Ve=bc(),at=l(Ve),yt=s(l(at),2),Xe=l(yt),nt=s(at,2),Ct=l(nt);z((Ea,br,Ur)=>{m(Xe,`~${Ea??""} GB · ~${br??""} Tok/s · ${(a(Z).quant||"GGUF")??""}`),wt(nt,1,`fit-badge ${Ur??""}`),m(Ct,a(Z).fit.text)},[()=>(a(Z).fit.req_gb??0).toFixed(1),()=>Math.round(a(Z).fit.tps??0),()=>h(a(Z).fit.level)]),_(lt,Ve)};I(Tt,lt=>{a(Z)&<(bt)})}var Oa=s(Tt,2);{var Ha=lt=>{const Ve=q(()=>a(W).files.find(Ct=>Ct.fit.level!=="too_tight"&&Ct.filename!==a(re)));var at=or(),yt=ot(at);{var Xe=Ct=>{var Ea=yc(),br=s(l(Ea)),Ur=l(br);z(Hr=>m(Ur,`${a(Ve).filename??""} (${Hr??""})`),[()=>E(a(Ve).fit.level)]),A("click",br,Hr=>{Hr.preventDefault(),g(re,a(Ve).filename,!0),F()}),_(Ct,Ea)},nt=Ct=>{var Ea=wc();_(Ct,Ea)};I(yt,Ct=>{a(Ve)?Ct(Xe):Ct(nt,-1)})}_(lt,at)};I(Oa,lt=>{var Ve,at;((Ve=a(Z))==null?void 0:Ve.fit.level)==="too_tight"&&((at=a(W))!=null&&at.files)&<(Ha)})}var Sa=s(Oa,2),kn=l(Sa);z(()=>{var lt,Ve;wt(Sa,1,`primary${((lt=a(Z))==null?void 0:lt.fit.level)==="too_tight"?" warn":""}`),Sa.disabled=a(ze),m(kn,a(ze)?"Starte…":((Ve=a(Z))==null?void 0:Ve.fit.level)==="too_tight"?"Trotzdem holen (zu groß — nicht empfohlen)":"Herunterladen & Einpflegen")}),A("change",St,F),nr(St,()=>a(re),lt=>g(re,lt)),Ta(Ne,()=>a(He),lt=>g(He,lt)),Ta(fe,()=>a(J),lt=>g(J,lt)),A("click",Sa,$e),_(Ge,st)},Ie=Ge=>{var st=kc();_(Ge,st)};I(_e,Ge=>{var st,St;a(ze)&&!a(W)?Ge(Re):(St=(st=a(W))==null?void 0:st.files)!=null&&St.length?Ge(ct,1):a(ze)||Ge(Ie,2)})}z(()=>{m(tt,a(_t)),m(X,a(T))}),A("click",b,Ge=>{Ge.target.classList.contains("modal-overlay")&&g(Ue,!1)}),A("click",R,()=>g(Ue,!1)),_(y,b)};I(Ga,y=>{a(Ue)&&y(nn)})}var Ua=s(Ga,2);{var Hn=y=>{var b=Ec(),B=l(b),R=l(B),ae=s(R,2),tt=l(ae),it=s(ae,6),X=s(it,4),_e=s(X,4);ft(_e,17,()=>a(ie),ut,(Ge,st,St)=>{var Zt=Sc(),vt=l(Zt),Ne=s(vt,2),Et=s(Ne,2);ft(Et,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],ut,(gt,fe)=>{var Ze=Zi(),Nt=l(Ze),Tt={};z(()=>{m(Nt,fe),Tt!==(Tt=fe)&&(Ze.__value=fe)}),_(gt,Ze)});var It=s(Et,2);Ta(vt,()=>a(st).repo,gt=>a(st).repo=gt),Ta(Ne,()=>a(st).role,gt=>a(st).role=gt),nr(Et,()=>a(st).quant,gt=>a(st).quant=gt),A("click",It,()=>g(ie,a(ie).filter((gt,fe)=>fe!==St),!0)),_(Ge,Zt)});var Re=s(_e,2),ct=s(Re,4),Ie=l(ct);z(()=>{m(tt,a(ge)?"Setup bearbeiten":"Eigenes Setup erstellen"),m(Ie,a(ge)?"Änderungen speichern":"Setup speichern")}),A("click",b,Ge=>{Ge.target.classList.contains("modal-overlay")&&g(rt,!1)}),A("click",R,()=>g(rt,!1)),Ta(it,()=>a(P),Ge=>g(P,Ge)),Ta(X,()=>a(H),Ge=>g(H,Ge)),A("click",Re,()=>g(ie,[...a(ie),{repo:"",role:"",quant:"Q4_K_M"}],!0)),A("click",ct,Q),_(y,b)};I(Ua,y=>{a(rt)&&y(Hn)})}z(()=>{Vt.disabled=a(D),m(M,a(D)?"Suche…":"Aktualisieren"),Bt.disabled=a(Ee),m(Wt,a(Ee)?"Lade…":"Suchen")}),A("click",xe,N),A("click",Vt,()=>pt(!0)),A("keydown",et,y=>y.key==="Enter"&&At()),Ta(et,()=>a(ne),y=>g(ne,y)),nr(ke,()=>a(U),y=>g(U,y)),A("click",Bt,At),_(e,me),an()}xn(["click","keydown","change"]);var Ac=w(`
Du öffnest Mission Control über einen Proxy/Namen. Die Engine läuft auf Port 8080 ohne HTTPS direkt am Bosgame. + Trag in deinen Tools die LAN-IP ein: http://192.168.178.151:8080/v1 — nicht den Proxy-Namen.
`),Cc=w(' '),Lc=w('
'),zc=w(' '),Dc=w(''),Pc=w(''),qc=w('

Öffne die Zed-Settings mit Cmd/Strg + , und füge diesen Block in deine bestehende settings.json ein. Falls bereits ein "bosgame"-Eintrag existiert: vorher löschen.

Nur diesen Block einfügen, nicht die ganze Datei ersetzen — sonst gehen andere Einstellungen verloren.

API-Key: Öffne den Agent-Panel → Anbieter bosgame → trag irgendeinen Wert ein (z.B. local).

Danach im Agent-Panel das Modell auswählen.
',1),Oc=w('

Datei anlegen oder öffnen:

Windows: %USERPROFILE%\\.config\\opencode\\opencode.json

Nur den "provider"-Block einfügen. Falls bereits ein "llama-swap"-Eintrag vorhanden: vorher löschen, sonst erscheinen Modelle doppelt.

Danach in OpenCode /models wählen.

',1),Rc=w('

In Cline/Cursor den Provider „OpenAI Compatible" wählen:

API-Key: ein beliebiger Wert (z.B. local).
',1),Bc=w('

Settings → Admin Panel → Connections → neue OpenAI-Verbindung:

',1),Ic=w('

Bilder einbinden (Vision)

Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.
'),Nc=w('

2 · Modelle auswählen

Wähle, welche Modelle im Config-Snippet erscheinen sollen.

3 · Tool wählen

Für welches Werkzeug brauchst du die Konfiguration?

4 · Config-Snippet

',1),Fc=w('

2 · Erst ein Modell installieren

Noch kein Modell eingerichtet
Bevor du ein Tool verbinden kannst, braucht die Engine mindestens ein Modell. Das Config-Snippet wird dann automatisch mit deinen echten Modellnamen befüllt.
'),Kc=w('

Verbinden

Schritt für Schritt: KI-Modelle in deine Tools einbinden — getestet, erklärt, mit Copy-Paste-Config.

1 · Verbindung prüfen

Stelle sicher, dass die LLM-Engine erreichbar ist, bevor du Tools konfigurierst.

Wie funktioniert das Auto-Swap?

',1);function Gc(e,t){tn(t,!0);const n=q(()=>mr.value),r=q(()=>{var P;return(((P=a(n))==null?void 0:P.models)||[]).filter(H=>!H.incomplete)}),i=q(u);let o=O("zed"),d=O(Ht([])),c=O(""),v=O(!1);function u(){return`http://${location.hostname}:8080/v1`}function h(P){return/^\d{1,3}(\.\d{1,3}){3}$/.test(P)}function E(){return location.protocol==="https:"||!h(location.hostname)}const p=q(()=>a(d).length?a(d):a(r).map(P=>P.name)),x=q(()=>a(p)[0]||"coder"),$=q(()=>{var P;return(P=a(r).find(H=>{var ie,ge;return(ge=(ie=H.meta)==null?void 0:ie.caps)==null?void 0:ge.includes("Bild")}))==null?void 0:P.name});function L(P,H){const ge=(H.length?a(r).filter(Te=>H.includes(Te.name)):a(r).length?a(r):[{name:"coder",meta:{}}]).map(Te=>{var kt,At;const mt=(((kt=Te.meta)==null?void 0:kt.caps)||[]).some(Mt=>/Bild|Vision/i.test(Mt)),pt=((At=Te.meta)==null?void 0:At.ctx)||131072;return` { "name": "${Te.name}", "display_name": "${Te.name}", "max_tokens": ${pt}${mt?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`, `);return`"language_models": { "openai_compatible": { "bosgame": { - "api_url": "${D}", + "api_url": "${P}", "available_models": [ -${le} +${ge} ] } } -}`}function M(D,U){const le=(U.length?n(r).filter(x=>U.includes(x.name)):n(r).length?n(r):[{name:"coder",meta:{}}]).map(x=>{var K;const z=((K=x.meta)==null?void 0:K.ctx)||131072;return` "${x.name}": { "name": "${x.name}", "contextWindowSize": ${z} }`}).join(`, +}`}function k(P,H){const ge=(H.length?a(r).filter(Te=>H.includes(Te.name)):a(r).length?a(r):[{name:"coder",meta:{}}]).map(Te=>{var pt;const mt=((pt=Te.meta)==null?void 0:pt.ctx)||131072;return` "${Te.name}": { "name": "${Te.name}", "contextWindowSize": ${mt} }`}).join(`, `);return`"provider": { "llama-swap": { "npm": "@ai-sdk/openai-compatible", "name": "Bosgame (llama-swap)", "options": { - "baseURL": "${D}", + "baseURL": "${P}", "apiKey": "local" }, "models": { -${le} +${ge} } } -}`}async function R(){g(c,"Teste…");try{const D=await ge("/api/integration/test");g(u,D.ok,!0),g(c,D.ok?`✓ Verbunden — ${D.models.length} Modell(e): ${D.models.join(", ")}`:`✗ Keine Verbindung: ${D.error}`,!0)}catch(D){g(u,!1),g(c,"✗ "+D.message)}}function Se(D){var Z;const U=D.querySelector("code");U&&((Z=navigator.clipboard)==null||Z.writeText(U.textContent||""))}function re(D){var U;(U=navigator.clipboard)==null||U.writeText(D.value)}var ve=zc(),be=s(_t(ve),2),F=s(l(be),6),H=l(F),ue=s(H,2),fe=s(F,2);{var Ee=D=>{var U=yc();b(D,U)},ze=I(()=>E());G(fe,D=>{n(ze)&&D(Ee)})}var nt=s(fe,2),T=l(nt),J=s(T,2);{var oe=D=>{var U=wc(),Z=l(U);O(()=>{hn(U,`color:${n(u)?"#7ee29a":"#ff9b95"}`),m(Z,n(c))}),b(D,U)};G(J,D=>{n(c)&&D(oe)})}var Pe=s(be,2),Q=s(l(Pe),2);Ze(Q,20,()=>[["⚡","Kein manuelles Starten nötig",'Wenn du in Zed oder OpenCode „coder" auswählst und eine Anfrage sendest, lädt llama-swap das Modell automatisch — in ca. 2–5 Sekunden.'],["🔄","Modelle wechseln sich automatisch ab","Rufst du ein anderes Modell auf, entlädt llama-swap das aktuelle (nach TTL-Ablauf) und lädt das neue. Es läuft immer nur eines gleichzeitig."],["🧠","Zwei Modelle gleichzeitig aktiv halten","Du hast 124 GB RAM — genug für z.B. Scout 8B (~5 GB) dauerhaft geladen + ein größeres Modell das swappt. Dafür beim Scout im Modelle-Tab → Konfigurieren die TTL auf 99999 setzen."]],Ye,(D,U)=>{var Z=I(()=>ir(U,3));let le=()=>n(Z)[0],x=()=>n(Z)[1],z=()=>n(Z)[2];var K=xc(),ie=l(K),$=l(ie),V=s(ie,2),ae=l(V),we=l(ae),Xe=s(ae,2),Ae=l(Xe);O(()=>{m($,le()),m(we,x()),m(Ae,z())}),b(D,K)});var ye=s(Pe,2);{var ne=D=>{var U=Sc(),Z=l(U),le=s(l(Z),2),x=l(le),z=s(Z,4);Ze(z,21,()=>n(r),Ye,($,V)=>{const ae=I(()=>n(d).includes(n(V).name));var we=kc(),Xe=l(we);O(()=>{hn(we,`cursor:pointer;${n(ae)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),m(Xe,n(V).name)}),P("click",we,()=>g(d,n(ae)?n(d).filter(Ae=>Ae!==n(V).name):[...n(d),n(V).name],!0)),P("keydown",we,Ae=>Ae.key==="Enter"&&g(d,n(ae)?n(d).filter(at=>at!==n(V).name):[...n(d),n(V).name],!0)),b($,we)});var K=s(z,2);{var ie=$=>{var V=Mc(),ae=l(V);P("click",ae,we=>{we.preventDefault(),g(d,[],!0)}),b($,V)};G(K,$=>{n(d).length&&$(ie)})}O(()=>m(x,n(d).length?`${n(d).length} von ${n(r).length} ausgewählt`:"alle werden eingeschlossen")),b(D,U)};G(ye,D=>{n(r).length&&D(ne)})}var Ke=s(ye,2),Ie=s(l(Ke),4);Ze(Ie,20,()=>[["zed","Zed","Schneller nativer Editor — Empfohlen"],["opencode","OpenCode","Open-Source Coding-Agent (Terminal/Desktop)"],["cline","Cline / Cursor","VS Code Extension, Bring-Your-Own-Key"],["openwebui","OpenWebUI","Browser-Chat-Interface"]],Ye,(D,U)=>{var Z=I(()=>ir(U,3));let le=()=>n(Z)[0],x=()=>n(Z)[1],z=()=>n(Z)[2];var K=Ec(),ie=l(K),$=l(ie),V=s(ie,2),ae=l(V);O(()=>{vt(K,1,`card-btn${n(o)===le()?" cb-best":""}`),m($,x()),m(ae,z())}),P("click",K,()=>g(o,le(),!0)),b(D,K)});var He=s(Ke,2),Ve=s(l(He),2);{var We=D=>{const U=I(()=>L(n(i),n(p)));var Z=Tc(),le=s(_t(Z),4),x=l(le),z=s(x,2),K=l(z),ie=l(K),$=s(le,4),V=s(l($)),ae=l(V);O(()=>{m(ie,n(U)),m(ae,`bosgame / ${n(w)??""}`)}),P("click",x,we=>Se(we.currentTarget.parentElement)),b(D,Z)},Tt=D=>{const U=I(()=>M(n(i),n(p)));var Z=$c(),le=s(_t(Z),6),x=l(le),z=s(x,2),K=l(z),ie=l(K),$=s(le,2),V=s(l($),3),ae=l(V);O(()=>{m(ie,n(U)),m(ae,`llama-swap/${n(w)??""}`)}),P("click",x,we=>Se(we.currentTarget.parentElement)),b(D,Z)},Pt=D=>{var U=Ac(),Z=s(_t(U),4),le=l(Z),x=s(le,2),z=s(Z,4),K=l(z),ie=s(K,2);O(()=>{mr(le,n(i)),mr(K,n(w))}),P("click",x,$=>re($.currentTarget.previousElementSibling)),P("click",ie,$=>re($.currentTarget.previousElementSibling)),b(D,U)},Ot=D=>{var U=Cc(),Z=s(_t(U),4),le=l(Z),x=s(le,2),z=s(Z,4),K=l(z),ie=s(K,2);O(()=>mr(le,n(i))),P("click",x,$=>re($.currentTarget.previousElementSibling)),P("click",ie,$=>re($.currentTarget.previousElementSibling)),b(D,U)};G(Ve,D=>{n(o)==="zed"?D(We):n(o)==="opencode"?D(Tt,1):n(o)==="cline"?D(Pt,2):n(o)==="openwebui"&&D(Ot,3)})}var Rt=s(He,2);{var qt=D=>{const U=I(()=>`curl ${n(i)}/chat/completions \\ +}`}async function D(){g(c,"Teste…");try{const P=await Me("/api/integration/test");g(v,P.ok,!0),g(c,P.ok?`✓ Verbunden — ${P.models.length} Modell(e): ${P.models.join(", ")}`:`✗ Keine Verbindung: ${P.error}`,!0)}catch(P){g(v,!1),g(c,"✗ "+P.message)}}function Pe(P){var ie;const H=P.querySelector("code");H&&((ie=navigator.clipboard)==null||ie.writeText(H.textContent||""))}function ne(P){var H;(H=navigator.clipboard)==null||H.writeText(P.value)}var pe=Kc(),Ee=s(ot(pe),2),K=s(l(Ee),6),U=l(K),ue=s(U,2),he=s(K,2);{var Le=P=>{var H=Ac();_(P,H)},Ue=q(()=>E());I(he,P=>{a(Ue)&&P(Le)})}var _t=s(he,2),T=l(_t),W=s(T,2);{var re=P=>{var H=Cc(),ie=l(H);z(()=>{fa(H,`color:${a(v)?"#7ee29a":"#ff9b95"}`),m(ie,a(c))}),_(P,H)};I(W,P=>{a(c)&&P(re)})}var He=s(Ee,2),J=s(l(He),2);ft(J,20,()=>[["⚡","Kein manuelles Starten nötig",'Wenn du in Zed oder OpenCode „coder" auswählst und eine Anfrage sendest, lädt llama-swap das Modell automatisch — in ca. 2–5 Sekunden.'],["🔄","Modelle wechseln sich automatisch ab","Rufst du ein anderes Modell auf, entlädt llama-swap das aktuelle (nach TTL-Ablauf) und lädt das neue. Es läuft immer nur eines gleichzeitig."],["🧠","Zwei Modelle gleichzeitig aktiv halten","Du hast 124 GB RAM — genug für z.B. Scout 8B (~5 GB) dauerhaft geladen + ein größeres Modell das swappt. Dafür beim Scout im Modelle-Tab → Konfigurieren die TTL auf 99999 setzen."]],ut,(P,H)=>{var ie=q(()=>sr(H,3));let ge=()=>a(ie)[0],Te=()=>a(ie)[1],mt=()=>a(ie)[2];var pt=Lc(),kt=l(pt),At=l(kt),Mt=s(kt,2),Lt=l(Mt),qt=l(Lt),Rt=s(Lt,2),C=l(Rt);z(()=>{m(At,ge()),m(qt,Te()),m(C,mt())}),_(P,pt)});var ze=s(He,2);{var Z=P=>{var H=Nc(),ie=ot(H),ge=l(ie),Te=s(l(ge),2),mt=l(Te),pt=s(ge,4);ft(pt,21,()=>a(r),ut,(Q,de)=>{const se=q(()=>a(d).includes(a(de).name));var Y=zc(),me=l(Y);z(()=>{fa(Y,`cursor:pointer;${a(se)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),m(me,a(de).name)}),A("click",Y,()=>g(d,a(se)?a(d).filter(ve=>ve!==a(de).name):[...a(d),a(de).name],!0)),A("keydown",Y,ve=>ve.key==="Enter"&&g(d,a(se)?a(d).filter(we=>we!==a(de).name):[...a(d),a(de).name],!0)),_(Q,Y)});var kt=s(pt,2);{var At=Q=>{var de=Dc(),se=l(de);A("click",se,Y=>{Y.preventDefault(),g(d,[],!0)}),_(Q,de)};I(kt,Q=>{a(d).length&&Q(At)})}var Mt=s(ie,2),Lt=s(l(Mt),4);ft(Lt,20,()=>[["zed","Zed","Schneller nativer Editor — Empfohlen"],["opencode","OpenCode","Open-Source Coding-Agent (Terminal/Desktop)"],["cline","Cline / Cursor","VS Code Extension, Bring-Your-Own-Key"],["openwebui","OpenWebUI","Browser-Chat-Interface"]],ut,(Q,de)=>{var se=q(()=>sr(de,3));let Y=()=>a(se)[0],me=()=>a(se)[1],ve=()=>a(se)[2];var we=Pc(),xe=l(we),be=l(xe),S=s(xe,2),V=l(S);z(()=>{wt(we,1,`card-btn${a(o)===Y()?" cb-best":""}`),m(be,me()),m(V,ve())}),A("click",we,()=>g(o,Y(),!0)),_(Q,we)});var qt=s(Mt,2),Rt=s(l(qt),2);{var C=Q=>{const de=q(()=>L(a(i),a(p)));var se=qc(),Y=s(ot(se),4),me=l(Y),ve=s(me,2),we=l(ve),xe=l(we),be=s(Y,4),S=s(l(be)),V=l(S);z(()=>{m(xe,a(de)),m(V,`bosgame / ${a(x)??""}`)}),A("click",me,le=>Pe(le.currentTarget.parentElement)),_(Q,se)},F=Q=>{const de=q(()=>k(a(i),a(p)));var se=Oc(),Y=s(ot(se),6),me=l(Y),ve=s(me,2),we=l(ve),xe=l(we),be=s(Y,2),S=s(l(be),3),V=l(S);z(()=>{m(xe,a(de)),m(V,`llama-swap/${a(x)??""}`)}),A("click",me,le=>Pe(le.currentTarget.parentElement)),_(Q,se)},$e=Q=>{var de=Rc(),se=s(ot(de),4),Y=l(se),me=s(Y,2),ve=s(se,4),we=l(ve),xe=s(we,2);z(()=>{wr(Y,a(i)),wr(we,a(x))}),A("click",me,be=>ne(be.currentTarget.previousElementSibling)),A("click",xe,be=>ne(be.currentTarget.previousElementSibling)),_(Q,de)},dt=Q=>{var de=Bc(),se=s(ot(de),4),Y=l(se),me=s(Y,2),ve=s(se,4),we=l(ve),xe=s(we,2);z(()=>wr(Y,a(i))),A("click",me,be=>ne(be.currentTarget.previousElementSibling)),A("click",xe,be=>ne(be.currentTarget.previousElementSibling)),_(Q,de)};I(Rt,Q=>{a(o)==="zed"?Q(C):a(o)==="opencode"?Q(F,1):a(o)==="cline"?Q($e,2):a(o)==="openwebui"&&Q(dt,3)})}var N=s(qt,2);{var De=Q=>{const de=q(()=>`curl ${a(i)}/chat/completions \\ -H "Content-Type: application/json" \\ -d '{ - "model": "${n(A)}", + "model": "${a($)}", "messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,"}}]}] -}'`);var Z=Lc(),le=l(Z),x=s(l(le),2),z=l(x);qe(z,()=>tn("check"));var K=s(z),ie=s(le,4),$=l(ie),V=s($,2),ae=l(V),we=l(ae);O(()=>{m(K,` „${n(A)??""}" bereit`),m(we,n(U))}),P("click",$,Xe=>Se(Xe.currentTarget.parentElement)),b(D,Z)};G(Rt,D=>{n(A)&&D(qt)})}O(()=>mr(H,n(i))),P("click",ue,D=>{const U=D.currentTarget.previousElementSibling;re(U)}),P("click",T,R),b(e,ve),ia()}ka(["click","keydown"]);var Dc=k('
'),Oc=k('

Für dich: Upgrades

Neuere Modelle, die ein installiertes ersetzen können.
'),Rc=k('
Lade News… (erstes Laden kann kurz dauern)
'),qc=k('
'),Bc=k('
Keine News geladen
Die Quellen sind gerade nicht erreichbar — später nochmal probieren.
'),Ic=k('für dich'),Nc=k('
'),Fc=k('
'),Kc=k('

News

Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
',1);function Gc(e,t){ra(t,!0);let a=B(Dt([])),r=B(Dt([])),i=B(!0),o=B("");const d=F=>F==="perfect"?"ok":F==="marginal"?"warn":"bad";function c(F){const H=Math.max(0,Date.now()/1e3-F);return H<60?H+"s":H<3600?Math.floor(H/60)+"m":H<86400?Math.floor(H/3600)+"h":Math.floor(H/86400)+"d"}async function u(){g(i,!0),g(o,"");try{g(a,(await ge("/api/news")).items||[],!0)}catch(F){g(o,F.message||"Fehler beim Laden",!0)}finally{g(i,!1)}}async function v(){try{g(r,(await ge("/api/cookbook/upgrades")).upgrades||[],!0)}catch{g(r,[],!0)}}async function h(F,H){var ue;H.disabled=!0,H.textContent="Starte…";try{await ge("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:F.repo,role:F.role,params_b:F.params_b,quant:F.quant,hf_token:rr()})}),(ue=document.querySelector(".nav-item[data-view='activity']"))==null||ue.dispatchEvent(new MouseEvent("click"))}catch(fe){H.disabled=!1,H.textContent="Installieren",alert("Fehler: "+fe.message)}}function E(){u(),v()}hr(()=>{u(),v()});var p=Kc(),w=_t(p),A=s(l(w),2),L=s(w,2);{var M=F=>{var H=Oc(),ue=l(H),fe=s(l(ue),2),Ee=l(fe),ze=s(ue,4);Ze(ze,21,()=>n(r),Ye,(nt,T)=>{var J=Dc(),oe=l(J),Pe=l(oe),Q=l(Pe),ye=l(Q),ne=s(Q,2),Ke=l(ne),Ie=s(Pe,2),He=l(Ie),Ve=s(oe,2);O(We=>{m(ye,n(T).name),vt(ne,1,`fit-badge ${We??""}`),m(Ke,n(T).fit.text),m(He,`Ersetzt dein „${n(T).old??""}". ${n(T).why??""}`)},[()=>d(n(T).fit.level)]),P("click",Ve,We=>h(n(T),We.currentTarget)),b(nt,J)}),O(()=>m(Ee,n(r).length)),b(F,H)};G(L,F=>{n(r).length&&F(M)})}var R=s(L,2);{var Se=F=>{var H=Rc();b(F,H)},re=F=>{var H=qc(),ue=l(H);O(()=>m(ue,n(o))),b(F,H)},ve=F=>{var H=Bc();b(F,H)},be=F=>{var H=Fc();Ze(H,21,()=>n(a),Ye,(ue,fe,Ee)=>{var ze=Nc();vt(ze,1,`news-card${Ee===0?" featured":""}`);var nt=l(ze),T=l(nt),J=l(T),oe=s(T,2);{var Pe=Ie=>{var He=Ic();b(Ie,He)};G(oe,Ie=>{n(fe).relevant&&Ie(Pe)})}var Q=s(oe,2),ye=l(Q),ne=s(nt,2),Ke=l(ne);O(Ie=>{Ir(ze,"href",n(fe).link),m(J,n(fe).source),m(ye,Ie),m(Ke,n(fe).title)},[()=>n(fe).ts?c(n(fe).ts):""]),b(ue,ze)}),b(F,H)};G(R,F=>{n(i)?F(Se):n(o)?F(re,1):n(a).length?F(be,-1):F(ve,2)})}P("click",A,E),b(e,p),ia()}ka(["click"]);const Uc=[["Dein erster Workflow — in 3 Schritten",` +}'`);var se=Ic(),Y=l(se),me=s(l(Y),2),ve=l(me);Ce(ve,()=>zt("check"));var we=s(ve),xe=s(Y,4),be=l(xe),S=s(be,2),V=l(S),le=l(V);z(()=>{m(we,` „${a($)??""}" bereit`),m(le,a(de))}),A("click",be,Qe=>Pe(Qe.currentTarget.parentElement)),_(Q,se)};I(N,Q=>{a($)&&Q(De)})}z(()=>m(mt,a(d).length?`${a(d).length} von ${a(r).length} ausgewählt`:"alle werden eingeschlossen")),_(P,H)},rt=P=>{var H=Fc(),ie=s(l(H),2),ge=s(l(ie),4);A("click",ge,()=>{var Te;return(Te=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:Te.dispatchEvent(new MouseEvent("click"))}),_(P,H)};I(ze,P=>{a(r).length?P(Z):P(rt,-1)})}z(()=>wr(U,a(i))),A("click",ue,P=>{const H=P.currentTarget.previousElementSibling;ne(H)}),A("click",T,D),_(e,pe),an()}xn(["click","keydown"]);var Uc=w('
'),Hc=w('

Für dich: Upgrades

Neuere Modelle, die ein installiertes ersetzen können.
'),Vc=w('
Lade News… (erstes Laden kann kurz dauern)
'),Wc=w('
'),jc=w('
Keine News geladen
Die Quellen sind gerade nicht erreichbar — später nochmal probieren.
'),Qc=w('für dich'),Jc=w('
'),Yc=w('
'),Zc=w('

News

Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
',1);function Xc(e,t){tn(t,!0);let n=O(Ht([])),r=O(Ht([])),i=O(!0),o=O("");const d=K=>K==="perfect"?"ok":K==="marginal"?"warn":"bad";function c(K){const U=Math.max(0,Date.now()/1e3-K);return U<60?U+"s":U<3600?Math.floor(U/60)+"m":U<86400?Math.floor(U/3600)+"h":Math.floor(U/86400)+"d"}async function v(){g(i,!0),g(o,"");try{g(n,(await Me("/api/news")).items||[],!0)}catch(K){g(o,K.message||"Fehler beim Laden",!0)}finally{g(i,!1)}}async function u(){try{g(r,(await Me("/api/cookbook/upgrades")).upgrades||[],!0)}catch{g(r,[],!0)}}async function h(K,U){var ue;U.disabled=!0,U.textContent="Starte…";try{await Me("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:K.repo,role:K.role,params_b:K.params_b,quant:K.quant,hf_token:ir()})}),(ue=document.querySelector(".nav-item[data-view='activity']"))==null||ue.dispatchEvent(new MouseEvent("click"))}catch(he){U.disabled=!1,U.textContent="Installieren",alert("Fehler: "+he.message)}}function E(){v(),u()}_r(()=>{v(),u()});var p=Zc(),x=ot(p),$=s(l(x),2),L=s(x,2);{var k=K=>{var U=Hc(),ue=l(U),he=s(l(ue),2),Le=l(he),Ue=s(ue,4);ft(Ue,21,()=>a(r),ut,(_t,T)=>{var W=Uc(),re=l(W),He=l(re),J=l(He),ze=l(J),Z=s(J,2),rt=l(Z),P=s(He,2),H=l(P),ie=s(re,2);z(ge=>{m(ze,a(T).name),wt(Z,1,`fit-badge ${ge??""}`),m(rt,a(T).fit.text),m(H,`Ersetzt dein „${a(T).old??""}". ${a(T).why??""}`)},[()=>d(a(T).fit.level)]),A("click",ie,ge=>h(a(T),ge.currentTarget)),_(_t,W)}),z(()=>m(Le,a(r).length)),_(K,U)};I(L,K=>{a(r).length&&K(k)})}var D=s(L,2);{var Pe=K=>{var U=Vc();_(K,U)},ne=K=>{var U=Wc(),ue=l(U);z(()=>m(ue,a(o))),_(K,U)},pe=K=>{var U=jc();_(K,U)},Ee=K=>{var U=Yc();ft(U,21,()=>a(n),ut,(ue,he,Le)=>{var Ue=Jc();wt(Ue,1,`news-card${Le===0?" featured":""}`);var _t=l(Ue),T=l(_t),W=l(T),re=s(T,2);{var He=P=>{var H=Qc();_(P,H)};I(re,P=>{a(he).relevant&&P(He)})}var J=s(re,2),ze=l(J),Z=s(_t,2),rt=l(Z);z(P=>{Fr(Ue,"href",a(he).link),m(W,a(he).source),m(ze,P),m(rt,a(he).title)},[()=>a(he).ts?c(a(he).ts):""]),_(ue,Ue)}),_(K,U)};I(D,K=>{a(i)?K(Pe):a(o)?K(ne,1):a(n).length?K(Ee,-1):K(pe,2)})}A("click",$,E),_(e,p),an()}xn(["click"]);const ev=[["Dein erster Workflow — in 3 Schritten",`
  1. Modell holen: Tab Cookbook → wähle deinen Anwendungsfall (z.B. „Coden") → Komplettes Setup installieren. Der Download läuft im Tab Aktivität.
  2. @@ -111,4 +111,4 @@ ${le}
  3. OpenWebUI: Klassische Chat-Oberfläche für Fragen/Texte.
  4. Tipp: starkes Modell (coder) für schwere Aufgaben, schnelles - (scout) für einfache — du wählst es einfach im Tool aus.

    `]],Hc=[["LLM / Modell","Die KI selbst — versteht und schreibt Text (wie ChatGPT, nur lokal auf deinem PC). Ein Modell ist eine konkrete Datei davon, oft auf etwas spezialisiert (Code, Bilder, Chat)."],["GGUF","Das lokal lauffähige Dateiformat. Unsere Engine lädt nur GGUF — Repos ohne GGUF kann sie nicht nutzen."],["Quantisierung (Q4_K_M)","Verkleinert ein Modell (16-Bit → 4-Bit), damit es in den Speicher passt — bei kaum Qualitätsverlust. Q4_K_M ist der beliebte Sweetspot."],["Kontextfenster","Das Kurzzeitgedächtnis: wie viel Text sich das Modell gleichzeitig merkt. Größer = mehr Überblick, mehr Speicher, etwas langsamer."],["Auto-Swap","llama-swap lädt/entlädt Modelle automatisch — immer nur eins gleichzeitig. Du managst nichts."],["Agent","Ein Programm (OpenCode, Cline, Continue), das das Modell handeln lässt — Dateien lesen/ändern, Befehle ausführen, planen, im Loop bis die Aufgabe erledigt ist."],["MCP","Model Context Protocol — der Anschluss, über den ein Agent zusätzliche Werkzeuge bekommt (Web, Dateien, Datenbank). MCP = Werkzeuge."],["Skills","Verpackte Anleitung für wiederkehrende Aufgaben — der Agent liest sie und macht es jedes Mal wie du willst. Skills = Anleitungen."],["Rules / Commands","Die konkrete Form von Skills je Tool: AGENTS.md (OpenCode), .clinerules (Cline), Rules/Prompts (Continue)."]];var Vc=k('
    '),Wc=k('

    '),jc=k('

    Guide für Einsteiger

    Praktische Workflows + die Local-LLM-Welt in Klartext — ohne Vorwissen.

    Tutorials & Workflows

    Konzepte kurz erklärt

    ',1);function Jc(e){var t=jc(),a=s(_t(t),4);Ze(a,21,()=>Uc,Ye,(i,o,d)=>{var c=I(()=>ir(n(o),2));let u=()=>n(c)[0],v=()=>n(c)[1];var h=Vc();h.open=d===0;var E=l(h),p=l(E),w=s(E,2);qe(w,v,!0),O(()=>m(p,u())),b(i,h)});var r=s(a,4);Ze(r,21,()=>Hc,Ye,(i,o)=>{var d=I(()=>ir(n(o),2));let c=()=>n(d)[0],u=()=>n(d)[1];var v=Wc(),h=l(v),E=l(h),p=s(h,2),w=l(p);O(()=>{m(E,c()),m(w,u())}),b(i,v)}),b(e,t)}let Qi={};function Qc(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function Yi(e){var i;const t=document.getElementById("swdot"),a=document.getElementById("swlabel"),r=document.getElementById("top-active-text");if(!e)t&&(t.className="dot off"),a&&(a.textContent="Backend nicht erreichbar"),r&&(r.textContent="Backend offline"),Zi("Backend nicht erreichbar – läuft uvicorn?",!1);else{const o=(e.swap_url||"").replace(/^https?:\/\//,"");t&&(t.className="dot "+(e.swap_ok?"on":"off")),a&&(a.textContent=(e.swap_ok?"LLM-Engine: Online – ":"LLM-Engine: Offline – ")+o);const d=["running","ready","loading","starting"],c=(e.models||[]).find(v=>d.includes(v.state));if(r)if(c){const v=(i=c.meta)!=null&&i.ctx?` · ${Math.round(c.meta.ctx/1024)}k ctx`:"",h=c.state==="loading"||c.state==="starting"?' lädt…':"";r.innerHTML=`${c.name}${v}${h}`}else r.innerHTML='Kein Modell im VRAM';e.swap_ok?eu():Zi(`LLM-Engine nicht erreichbar unter ${o} – läuft der llama-swap Dienst?`,!0);const u={};for(const v of e.models||[])u[v.name]=v.state;for(const[v,h]of Object.entries(u)){const E=Qi[v];if(E&&E!==h&&(h==="running"||h==="loading")){Qc();break}}Qi=u}Yc(e),gr.set(e)}function Yc(e){const t=document.getElementById("sec-chip"),a=document.getElementById("sec-chip-tx");!t||!a||(t.classList.toggle("ok",!!(e!=null&&e.secured)),a.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function Zc(e){ca.set(e||[])}function Xc(e){$i.set(e)}function Zi(e,t){const a=document.getElementById("alert");a.className="alert"+(t?" warn":""),a.innerHTML=`${e}`,a.style.display="flex"}function eu(){const e=document.getElementById("alert");e&&(e.style.display="none")}const tu=e=>{var t;return(t=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:t.click()};function Yr(e,t,a,r){const i=document.createElement("span");return i.className="upd-badge"+(t?" "+t:""),i.textContent=e,r&&(i.title=r),i.onclick=()=>tu(a),i}async function Zs(){try{const e=await ge("/api/updates"),t=document.getElementById("update-badges");if(!t)return;const a=e.apt_cache_age_h,r=a!=null&&a>24,i=a!=null?` · apt-Cache: vor ${a}h`:"";t.innerHTML="",t.appendChild(Yr(e.os>0?`OS: ${e.os} Updates`:r?"OS: ?":"OS: aktuell",e.os>0||r?"warn":"ok","server",e.os>0?`${e.os} Pakete${i}`:r?`apt-Cache veraltet (${a}h)`:`Keine Updates${i}`)),t.appendChild(Yr(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),t.appendChild(Yr(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Fr(){try{Yi(await ge("/api/status"))}catch{Yi(null)}}async function Xs(){try{Zc(await ge("/api/jobs"))}catch{}}function el(){const e=window.location.protocol==="https:"?"wss:":"ws:",t=new WebSocket(`${e}//${window.location.host}/api/system/stream`);t.onmessage=a=>{try{Xc(JSON.parse(a.data))}catch{}},t.onclose=()=>{setTimeout(el,3e3)},t.onerror=()=>t.close()}var rs;((rs=document.getElementById("logo"))==null?void 0:rs.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Nr.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Nr[e.dataset.ic||""]||""});const nu=[["overview",id],["models",yd],["activity",Ld],["server",Fd],["cookbook",bc],["connect",Pc],["news",Gc],["guides",Jc]];for(const[e,t]of nu){const a=document.querySelector(`.view[data-view="${e}"]`);a&&yo(t,{target:a})}Ko("overview");const Zr=document.getElementById("token");Zr&&(Zr.value=Ys(),Zr.addEventListener("change",e=>{qo(e.target.value),Fr()}));const Xr=document.getElementById("hf-token");Xr&&(Xr.value=rr(),Xr.addEventListener("change",e=>Io(e.target.value)));const Xi=document.getElementById("nav-settings"),ei=document.getElementById("settings-modal"),es=document.getElementById("sm-close");Xi&&ei&&es&&(Xi.addEventListener("click",()=>ei.style.display="flex"),es.addEventListener("click",()=>ei.style.display="none"));function au(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Fr);Fr();Xs();el();setInterval(au,1e3);setInterval(Fr,3e3);setInterval(Xs,1500);Zs();setInterval(Zs,6e4); + (scout) für einfache — du wählst es einfach im Tool aus.

    `]],tv=[["LLM / Modell","Die KI selbst — versteht und schreibt Text (wie ChatGPT, nur lokal auf deinem PC). Ein Modell ist eine konkrete Datei davon, oft auf etwas spezialisiert (Code, Bilder, Chat)."],["GGUF","Das lokal lauffähige Dateiformat. Unsere Engine lädt nur GGUF — Repos ohne GGUF kann sie nicht nutzen."],["Quantisierung (Q4_K_M)","Verkleinert ein Modell (16-Bit → 4-Bit), damit es in den Speicher passt — bei kaum Qualitätsverlust. Q4_K_M ist der beliebte Sweetspot."],["Kontextfenster","Das Kurzzeitgedächtnis: wie viel Text sich das Modell gleichzeitig merkt. Größer = mehr Überblick, mehr Speicher, etwas langsamer."],["Auto-Swap","llama-swap lädt/entlädt Modelle automatisch — immer nur eins gleichzeitig. Du managst nichts."],["Agent","Ein Programm (OpenCode, Cline, Continue), das das Modell handeln lässt — Dateien lesen/ändern, Befehle ausführen, planen, im Loop bis die Aufgabe erledigt ist."],["MCP","Model Context Protocol — der Anschluss, über den ein Agent zusätzliche Werkzeuge bekommt (Web, Dateien, Datenbank). MCP = Werkzeuge."],["Skills","Verpackte Anleitung für wiederkehrende Aufgaben — der Agent liest sie und macht es jedes Mal wie du willst. Skills = Anleitungen."],["Rules / Commands","Die konkrete Form von Skills je Tool: AGENTS.md (OpenCode), .clinerules (Cline), Rules/Prompts (Continue)."]];var av=w('
    '),nv=w('

    '),rv=w('

    Guide für Einsteiger

    Praktische Workflows + die Local-LLM-Welt in Klartext — ohne Vorwissen.

    Tutorials & Workflows

    Konzepte kurz erklärt

    ',1);function iv(e){var t=rv(),n=s(ot(t),4);ft(n,21,()=>ev,ut,(i,o,d)=>{var c=q(()=>sr(a(o),2));let v=()=>a(c)[0],u=()=>a(c)[1];var h=av();h.open=d===0;var E=l(h),p=l(E),x=s(E,2);Ce(x,u,!0),z(()=>m(p,v())),_(i,h)});var r=s(n,4);ft(r,21,()=>tv,ut,(i,o)=>{var d=q(()=>sr(a(o),2));let c=()=>a(d)[0],v=()=>a(d)[1];var u=nv(),h=l(u),E=l(h),p=s(h,2),x=l(p);z(()=>{m(E,c()),m(x,v())}),_(i,u)}),_(e,t)}let Xi={};function sv(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function es(e){var i;const t=document.getElementById("swdot"),n=document.getElementById("swlabel"),r=document.getElementById("top-active-text");if(!e)t&&(t.className="dot off"),n&&(n.textContent="Backend nicht erreichbar"),r&&(r.textContent="Backend offline"),ts("Backend nicht erreichbar – läuft uvicorn?",!1);else{const o=(e.swap_url||"").replace(/^https?:\/\//,"");t&&(t.className="dot "+(e.swap_ok?"on":"off")),n&&(n.textContent=(e.swap_ok?"LLM-Engine: Online – ":"LLM-Engine: Offline – ")+o);const d=["running","ready","loading","starting"],c=(e.models||[]).find(u=>d.includes(u.state));if(r)if(c){const u=(i=c.meta)!=null&&i.ctx?` · ${Math.round(c.meta.ctx/1024)}k ctx`:"",h=c.state==="loading"||c.state==="starting"?' lädt…':"";r.innerHTML=`${c.name}${u}${h}`}else r.innerHTML='Kein Modell im VRAM';e.swap_ok?cv():ts(`LLM-Engine nicht erreichbar unter ${o} – läuft der llama-swap Dienst?`,!0);const v={};for(const u of e.models||[])v[u.name]=u.state;for(const[u,h]of Object.entries(v)){const E=Xi[u];if(E&&E!==h&&(h==="running"||h==="loading")){sv();break}}Xi=v}lv(e),mr.set(e)}function lv(e){const t=document.getElementById("sec-chip"),n=document.getElementById("sec-chip-tx");!t||!n||(t.classList.toggle("ok",!!(e!=null&&e.secured)),n.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function ov(e){dn.set(e||[])}function dv(e){Li.set(e)}function ts(e,t){const n=document.getElementById("alert");n.className="alert"+(t?" warn":""),n.innerHTML=`${e}`,n.style.display="flex"}function cv(){const e=document.getElementById("alert");e&&(e.style.display="none")}const vv=e=>{var t;return(t=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:t.click()};function ei(e,t,n,r){const i=document.createElement("span");return i.className="upd-badge"+(t?" "+t:""),i.textContent=e,r&&(i.title=r),i.onclick=()=>vv(n),i}async function tl(){try{const e=await Me("/api/updates"),t=document.getElementById("update-badges");if(!t)return;const n=e.apt_cache_age_h,r=n!=null&&n>24,i=n!=null?` · apt-Cache: vor ${n}h`:"";t.innerHTML="",t.appendChild(ei(e.os>0?`OS: ${e.os} Updates`:r?"OS: ?":"OS: aktuell",e.os>0||r?"warn":"ok","server",e.os>0?`${e.os} Pakete${i}`:r?`apt-Cache veraltet (${n}h)`:`Keine Updates${i}`)),t.appendChild(ei(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),t.appendChild(ei(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Gr(){try{es(await Me("/api/status"))}catch{es(null)}}async function al(){try{ov(await Me("/api/jobs"))}catch{}}function nl(){const e=window.location.protocol==="https:"?"wss:":"ws:",t=new WebSocket(`${e}//${window.location.host}/api/system/stream`);t.onmessage=n=>{try{dv(JSON.parse(n.data))}catch{}},t.onclose=()=>{setTimeout(nl,3e3)},t.onerror=()=>t.close()}var ls;((ls=document.getElementById("logo"))==null?void 0:ls.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Kr.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Kr[e.dataset.ic||""]||""});const uv=[["overview",cd],["models",Sd],["activity",Od],["server",Vd],["cookbook",$c],["connect",Gc],["news",Xc],["guides",iv]];for(const[e,t]of uv){const n=document.querySelector(`.view[data-view="${e}"]`);n&&ko(t,{target:n})}Ho("overview");const ti=document.getElementById("token");ti&&(ti.value=el(),ti.addEventListener("change",e=>{No(e.target.value),Gr()}));const ai=document.getElementById("hf-token");ai&&(ai.value=ir(),ai.addEventListener("change",e=>Ko(e.target.value)));const as=document.getElementById("nav-settings"),ni=document.getElementById("settings-modal"),ns=document.getElementById("sm-close");as&&ni&&ns&&(as.addEventListener("click",()=>ni.style.display="flex"),ns.addEventListener("click",()=>ni.style.display="none"));function fv(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Gr);Gr();al();nl();setInterval(fv,1e3);setInterval(Gr,3e3);setInterval(al,1500);tl();setInterval(tl,6e4);