diff --git a/frontend/src/panels/ConnectPanel.svelte b/frontend/src/panels/ConnectPanel.svelte index f8cadb5..bc1fb86 100644 --- a/frontend/src/panels/ConnectPanel.svelte +++ b/frontend/src/panels/ConnectPanel.svelte @@ -33,17 +33,26 @@ } function openCodeBlock(url: string, ids: string[]) { - // Modell-Objekte mit Meta (für ctx) statt nur IDs const ms = ids.length ? allModels.filter((m: any) => ids.includes(m.name)) : (allModels.length ? allModels : [{ name: 'coder', meta: {} }]) const modelMap = ms.map((m: any) => { - const ctx = m.meta?.ctx || 131072 // konfigurierten Kontext übergeben (Standard: 128k) + const ctx = m.meta?.ctx || 131072 return ` "${m.name}": { "name": "${m.name}", "contextWindowSize": ${ctx} }` }).join(',\n') return `"provider": {\n "llama-swap": {\n "npm": "@ai-sdk/openai-compatible",\n "name": "Bosgame (llama-swap)",\n "options": {\n "baseURL": "${url}",\n "apiKey": "local"\n },\n "models": {\n${modelMap}\n }\n }\n}` } + function continueBlock(url: string, ids: string[]) { + const ms = ids.length + ? allModels.filter((m: any) => ids.includes(m.name)) + : (allModels.length ? allModels : [{ name: 'coder', meta: {} }]) + const entries = ms.map((m: any) => + ` {\n "title": "llama-swap / ${m.name}",\n "provider": "openai",\n "model": "${m.name}",\n "apiBase": "${url}",\n "apiKey": "local"\n }` + ).join(',\n') + return `{\n "models": [\n${entries}\n ]\n}` + } + async function testConnection() { testResult = 'Teste…' try { @@ -146,13 +155,29 @@

3 · Tool wählen

-
Für welches Werkzeug brauchst du die Konfiguration?
-
+
Für welches Werkzeug brauchst du die Konfiguration?
+ +
Chat
+
{#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'] + ['janai', 'Jan AI', 'Einfachstes Chat-Interface — Desktop-App, kein Setup'], + ['openwebui', 'OpenWebUI', 'Browser-Chat für Teams — mehr Features, mehr Setup'], + ] as [id, label, desc]} + + {/each} +
+ +
Coding-Assistenten
+
+ {#each [ + ['continue', 'Continue', 'VS Code/JetBrains — Hilfe ohne Agent-Overhead'], + ['cline', 'Cline', 'VS Code/JetBrains/Zed — voller Coding-Agent'], + ['antigravity', 'Antigravity', 'Googles agentic IDE — VS Code-basiert'], + ['opencode', 'OpenCode', 'Terminal-Agent — autonom, mächtig'], + ['zed', 'Zed', 'Schneller nativer Editor mit KI-Panel'], ] as [id, label, desc]} +
+ +
+ + +
+
API-Key: ein beliebiger Wert (z.B. local). Jan AI fragt danach beim Einrichten.
+
Jan AI herunterladen: jan.ai — kostenlos, open source, Windows/macOS/Linux.
+ {:else if selectedTool === 'continue'} + {@const block = continueBlock(url, activeIds)} +

Datei anlegen oder öffnen: ~/.continue/config.json

+
Falls bereits eine config.json vorhanden: nur den "models"-Eintrag ergänzen, nicht die ganze Datei ersetzen.
+
+ +
{block}
+
+

Danach Continue in VS Code neu starten → im Chat-Panel das Modell llama-swap / {firstModel} wählen.

+
Continue: continue.dev — kostenlose VS Code / JetBrains Extension. Hinweis: 2026 von Cursor akquiriert — aktuell weiter aktiv und kostenlos.
+ {:else if selectedTool === 'antigravity'} +

Antigravity (Googles agentic IDE, VS Code-basiert) unterstützt OpenAI-kompatible Endpoints direkt:

+

Settings → Models → Custom Endpoint+ hinzufügen:

+ +
+ + +
+ +
+ + +
+
API-Key: ein beliebiger Wert (z.B. local). Danach das Modell {firstModel} in der Model-Liste auswählen.
+
Antigravity herunterladen: antigravityide.net — kostenlose Einzelperson-Tier, VS Code-basiert.
+ {:else 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.
diff --git a/frontend/src/panels/guides-data.ts b/frontend/src/panels/guides-data.ts index a3480ac..876c5eb 100644 --- a/frontend/src/panels/guides-data.ts +++ b/frontend/src/panels/guides-data.ts @@ -51,32 +51,50 @@ export const GUIDE_GROUPS: GuideGroup[] = [ label: 'Tools einrichten', tutorials: [ ["Welches Tool ist das richtige für mich?", ` -

Die Antwort hängt davon ab, was du hauptsächlich tun willst:

+

Chat — ich will einfach reden, schreiben, fragen:

-
Ich will einfach chatten, Texte schreiben, Fragen stellen
-
OpenWebUI — klassische Chat-Oberfläche im Browser. - Kein Programmieren, kein Setup. Ideal als Einstieg.
+
Einfachster Einstieg
+
Jan AI — Desktop-App, Doppelklick-Installer, sofort loslegen. + Vertraut wie ChatGPT, läuft komplett lokal. Kein Admin-Panel, kein Docker.
-
Ich programmiere und will KI in meinem Editor
-
Cline — KI-Assistent direkt in VS Code, JetBrains, Cursor, Zed u.a. - Zeigt dir jeden Schritt und fragt vor Änderungen.
-
-
-
Ich will, dass die KI eigenständig ganze Features baut
-
OpenCode — autonomer Coding-Agent im Terminal oder als Desktop-App. - Liest Dateien, schreibt Code, führt Befehle aus.
-
-
-
Ich will einen schnellen Editor mit eingebautem KI-Panel
-
Zed — nativer Editor mit direktem Modell-Zugriff. - Schnell, minimalistisch, für Leute die Gewicht auf Performance legen.
+
Teams / Power-User
+
OpenWebUI — viele Features (RAG, Bilder, Plugins, Mehrbenutzer). + Mehr Setup-Aufwand, aber der mächtigste Chat-Client.
-

Faustregel: Fang mit OpenWebUI an. Wenn du merkst dass - du dieselben Aufgaben immer wieder beschreibst und dann manuell umsetzt — wechsle zu - OpenCode oder Cline.

`], +

Coding — ich will KI beim Programmieren:

+
+
+
Simpler Einstieg in VS Code
+
Continue — Chat + Autocomplete direkt im Editor, kein Agent-Overhead. + Macht keinen Schritt ohne dich.
+
+
+
Voller Coding-Agent im Editor
+
Cline — liest Dateien, schreibt Code, fragt vor jeder Änderung. + VS Code, JetBrains, Zed u.a.
+
+
+
Agent-IDE mit VS Code-Feeling
+
Antigravity — Googles agentic IDE (VS Code-Fork), kostenlos. + Multi-Agent, planen + coden + testen in einem.
+
+
+
Autonomer Terminal-Agent
+
OpenCode — mächtigster lokaler Agent, lebt im Terminal. + Ideal für „bau mir Feature X komplett fertig".
+
+
+
Schneller Editor, minimalistisch
+
Zed — nativer Editor (Rust), eingebautes KI-Panel. + Für Leute die Performance über Features stellen.
+
+
+

Faustregel: Fang mit Jan AI zum Chatten an. + Für Coding: Continue als sanfter Einstieg oder gleich Cline/Antigravity + wenn du bereit bist, dem Agenten mehr Kontrolle zu geben.

`], ["OpenCode verbinden und die ersten Schritte", `

OpenCode ist installiert? Dann in vier Schritten verbinden:

@@ -145,19 +163,89 @@ export const GUIDE_GROUPS: GuideGroup[] = [ Tages- oder Monats-Budget setzen — verhindert dass ein laufender Agent unbemerkt viel Token verbraucht.

Weitere Infos: cline.bot · Memory Bank Docs

`], - ["OpenWebUI — chatten ohne Vorkenntnisse", ` -

OpenWebUI ist installiert? Verbinden in 3 Schritten:

+ ["Jan AI — einfachstes Chat-Interface", ` +

Jan AI ist die einfachste Art, lokal mit KI zu chatten — + Desktop-App, kein Terminal, kein Docker, kein Admin-Panel.

+
    +
  1. Jan AI installieren: jan.ai + → Download → Doppelklick-Installer (Windows/macOS/Linux).
  2. +
  3. Remote-Modell hinzufügen: In der linken Leiste auf das Hub-Icon → + oben rechts + Remote-Modell.
  4. +
  5. Verbindung eintragen: Tab VerbindenJan AI auswählen → + Basis-URL und Modell-ID kopieren und in Jan einfügen.
  6. +
  7. API-Key: irgendeinen Text (z.B. local). Speichern.
  8. +
+

Danach erscheint das Modell in der Modell-Liste — auswählen und loslegen.

+

Gut für: Chatten, Texte schreiben, übersetzen, Fragen stellen — + genauso wie ChatGPT, aber 100% lokal und privat. Bilder mitschicken klappt auch + sobald ein Vision-Modell eingetragen ist.

+

Download & Docs: jan.ai · jan.ai/docs

`], + + ["Continue — Coding-Hilfe in VS Code ohne Agent-Overhead", ` +

Continue ist die einfachste Coding-Erweiterung für VS Code und JetBrains — + kein autonomer Agent, sondern ein KI-Assistent der nur auf Anfrage handelt.

+
    +
  1. Extension installieren: VS Code → Extensions → „Continue" suchen → Installieren.
    + Oder: continue.dev
  2. +
  3. Config holen: Tab VerbindenContinue auswählen → + Snippet kopieren und in ~/.continue/config.json einfügen.
  4. +
  5. Continue in VS Code neu starten → im Chat-Panel Modell wählen → loslegen.
  6. +
+

Was Continue kann:

+ +

Unterschied zu Cline: Continue macht nichts von alleine — du steuerst jeden Schritt. + Ideal als erster Einstieg bevor man mit vollen Agenten arbeitet.

+

Weitere Infos: continue.dev + — Hinweis: 2026 von Cursor akquiriert, weiterhin kostenlos & open source.

`], + + ["Antigravity — Googles agentic IDE", ` +

Antigravity ist Googles agent-first IDE — ein Fork von VS Code, der Planung, + Coding, Testing und Deployment in einem Workflow zusammenführt. Kostenlos für Einzelpersonen.

+
    +
  1. Antigravity installieren: + antigravityide.net + → Download → läuft wie VS Code.
  2. +
  3. Eigenen Endpoint einrichten: Settings → Models → Custom Endpoint → + hinzufügen.
  4. +
  5. Verbindung eintragen: Tab VerbindenAntigravity auswählen → + Basis-URL und Modell-ID kopieren und eintragen.
  6. +
  7. API-Key: beliebiger Text (z.B. local). Danach das Modell aus der Liste wählen.
  8. +
+

Was Antigravity besonders macht:

+ +

Wann Antigravity statt OpenCode? Wenn du lieber eine grafische IDE als ein Terminal magst + und trotzdem volle Agenten-Kontrolle willst. OpenCode ist mächtiger im Terminal-Flow; + Antigravity ist komfortabler für Umsteiger aus VS Code.

+

Weitere Infos: antigravityide.net · + Google Dev Blog

`], + + ["OpenWebUI — für Teams und Power-User", ` +

OpenWebUI ist der mächtigste lokale Chat-Client — aber auch der komplexeste. + Empfohlen wenn du mehr als ein einfaches Chat-Interface brauchst.

+

Was OpenWebUI besonders kann (gegenüber Jan AI):

+ +

Verbinden (braucht Docker oder eine lokale Installation):

  1. OpenWebUI im Browser öffnen → Admin PanelConnections.
  2. -
  3. + OpenAI-Verbindung hinzufügen → Basis-URL aus Tab Verbinden (Abschnitt OpenWebUI) kopieren.
  4. -
  5. API-Key: dummy-key (egal was hier steht). Speichern.
  6. +
  7. + OpenAI-Verbindung → Tab VerbindenOpenWebUI → Basis-URL kopieren.
  8. +
  9. API-Key: dummy-key. Speichern.
-

Danach oben das Modell wählen (coder, scout oder vision) und loslegen - — genau wie bei ChatGPT, nur lokal und privat.

-

Bilder analysieren: Mit einem Vision-Modell (z.B. qwen3-vl) einfach ein Bild - per Drag & Drop ins Chat-Fenster ziehen — das Modell beschreibt und analysiert es.

-

Gut für: Texte schreiben, übersetzen, zusammenfassen, erklären lassen, Brainstorming — - alles ohne Programmierkenntnisse.

+

Danach Modell auswählen und loslegen. Für einfaches Chatten: Jan AI ist einfacher. + OpenWebUI lohnt sich ab dem Moment, wo du mehr als nur Chat willst.

Weitere Infos: openwebui.com

`], ], }, diff --git a/static/dist/main.js b/static/dist/main.js index 22cc43c..858f400 100644 --- a/static/dist/main.js +++ b/static/dist/main.js @@ -1,53 +1,64 @@ -var rl=Object.defineProperty;var Di=e=>{throw TypeError(e)};var il=(e,t,a)=>t in e?rl(e,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[t]=a;var rn=(e,t,a)=>il(e,typeof t!="symbol"?t+"":t,a),Ur=(e,t,a)=>t.has(e)||Di("Cannot "+a);var p=(e,t,a)=>(Ur(e,t,"read from private field"),a?a.call(e):t.get(e)),ce=(e,t,a)=>t.has(e)?Di("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,a),oe=(e,t,a,r)=>(Ur(e,t,"write to private field"),r?r.call(e,a):t.set(e,a),a),qe=(e,t,a)=>(Ur(e,t,"access private method"),a);var bi=Array.isArray,sl=Array.prototype.indexOf,Tr=Array.prototype.includes,Rr=Array.from,ll=Object.defineProperty,Ya=Object.getOwnPropertyDescriptor,ol=Object.getOwnPropertyDescriptors,dl=Object.prototype,cl=Array.prototype,os=Object.getPrototypeOf,$i=Object.isExtensible;const ul=()=>{};function vl(e){for(var t=0;t{e=r,t=i});return{promise:a,resolve:e,reject:t}}function sr(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 Wt=2,Ia=4,Br=8,cs=1<<24,xn=16,Mn=32,ea=64,ri=128,hn=512,Lt=1024,Kt=2048,Ln=4096,Jt=8192,gn=16384,Ka=32768,ii=1<<25,Ra=65536,Cr=1<<17,pl=1<<18,Ga=1<<19,fl=1<<20,Pn=1<<25,_a=65536,zr=1<<21,Aa=1<<22,Xn=1<<23,Ta=Symbol("$state"),hl=Symbol(""),yr=Symbol("attributes"),si=Symbol("class"),li=Symbol("style"),Ha=Symbol("text"),xr=Symbol("form reset"),Fr=new class extends Error{constructor(){super(...arguments);rn(this,"name","StaleReactionError");rn(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};var rs;const gl=!!((rs=globalThis.document)!=null&&rs.contentType)&&globalThis.document.contentType.includes("xml");function us(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function ml(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function bl(e,t,a){throw new Error("https://svelte.dev/e/each_key_duplicate")}function _l(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function wl(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function kl(e){throw new Error("https://svelte.dev/e/effect_orphan")}function yl(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function xl(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function Sl(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Ml(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function El(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const Al=1,Tl=2,vs=4,Cl=8,zl=16,Pl=1,Dl=2,$t=Symbol("uninitialized"),ps="http://www.w3.org/1999/xhtml",$l="http://www.w3.org/2000/svg",Ll="http://www.w3.org/1998/Math/MathML";function Ol(){console.warn("https://svelte.dev/e/derived_inert")}function Il(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Rl(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function fs(e){return e===this.v}function Bl(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function hs(e){return!Bl(e,this.v)}let Gt=null;function Ba(e){Gt=e}function na(e,t=!1,a){Gt={p:Gt,i:!1,c:null,e:null,s:e,x:null,r:Ee,l:null}}function aa(e){var t=Gt,a=t.e;if(a!==null){t.e=null;for(var r of a)Rs(r)}return t.i=!0,Gt=t.p,{}}function gs(){return!0}let sa=[];function ms(){var e=sa;sa=[],vl(e)}function ha(e){if(sa.length===0&&!er){var t=sa;queueMicrotask(()=>{t===sa&&ms()})}sa.push(e)}function Fl(){for(;sa.length>0;)ms()}function bs(e){var t=Ee;if(t===null)return we.f|=Xn,e;if((t.f&Ka)===0&&(t.f&Ia)===0)throw e;Zn(e,t)}function Zn(e,t){if(!(t!==null&&(t.f&gn)!==0)){for(;t!==null;){if((t.f&ri)!==0){if((t.f&Ka)===0)throw e;try{t.b.error(e);return}catch(a){e=a}}t=t.parent}throw e}}const Nl=-7169;function Tt(e,t){e.f=e.f&Nl|t}function _i(e){(e.f&hn)!==0||e.deps===null?Tt(e,Lt):Tt(e,Ln)}function _s(e){if(e!==null)for(const t of e)(t.f&Wt)===0||(t.f&_a)===0||(t.f^=_a,_s(t.deps))}function ws(e,t,a){(e.f&Kt)!==0?t.add(e):(e.f&Ln)!==0&&a.add(e),_s(e.deps),Tt(e,Lt)}function ql(e){let t=0,a=ka(0),r;return()=>{Ei()&&(n(a),Nr(()=>(t===0&&(r=Wa(()=>e(()=>tr(a)))),t+=1,()=>{ha(()=>{t-=1,t===0&&(r==null||r(),r=void 0,tr(a))})})))}}var Kl=Ra|Ga;function Gl(e,t,a,r){new Wl(e,t,a,r)}var cn,mi,un,ca,Xt,vn,jt,ln,Bn,ua,Jn,Ca,cr,ur,Fn,Lr,yt,Vl,Ul,Hl,oi,Sr,Mr,di,ci;class Wl{constructor(t,a,r,i){ce(this,yt);rn(this,"parent");rn(this,"is_pending",!1);rn(this,"transform_error");ce(this,cn);ce(this,mi,null);ce(this,un);ce(this,ca);ce(this,Xt);ce(this,vn,null);ce(this,jt,null);ce(this,ln,null);ce(this,Bn,null);ce(this,ua,0);ce(this,Jn,0);ce(this,Ca,!1);ce(this,cr,new Set);ce(this,ur,new Set);ce(this,Fn,null);ce(this,Lr,ql(()=>(oe(this,Fn,ka(p(this,ua))),()=>{oe(this,Fn,null)})));var o;oe(this,cn,t),oe(this,un,a),oe(this,ca,d=>{var c=Ee;c.b=this,c.f|=ri,r(d)}),this.parent=Ee.b,this.transform_error=i??((o=this.parent)==null?void 0:o.transform_error)??(d=>d),oe(this,Xt,Ti(()=>{qe(this,yt,oi).call(this)},Kl))}defer_effect(t){ws(t,p(this,cr),p(this,ur))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!p(this,un).pending}update_pending_count(t,a){qe(this,yt,di).call(this,t,a),oe(this,ua,p(this,ua)+t),!(!p(this,Fn)||p(this,Ca))&&(oe(this,Ca,!0),ha(()=>{oe(this,Ca,!1),p(this,Fn)&&Fa(p(this,Fn),p(this,ua))}))}get_effect_pending(){return p(this,Lr).call(this),n(p(this,Fn))}error(t){if(!p(this,un).onerror&&!p(this,un).failed)throw t;j!=null&&j.is_fork?(p(this,vn)&&j.skip_effect(p(this,vn)),p(this,jt)&&j.skip_effect(p(this,jt)),p(this,ln)&&j.skip_effect(p(this,ln)),j.oncommit(()=>{qe(this,yt,ci).call(this,t)})):qe(this,yt,ci).call(this,t)}}cn=new WeakMap,mi=new WeakMap,un=new WeakMap,ca=new WeakMap,Xt=new WeakMap,vn=new WeakMap,jt=new WeakMap,ln=new WeakMap,Bn=new WeakMap,ua=new WeakMap,Jn=new WeakMap,Ca=new WeakMap,cr=new WeakMap,ur=new WeakMap,Fn=new WeakMap,Lr=new WeakMap,yt=new WeakSet,Vl=function(){try{oe(this,vn,pn(()=>p(this,ca).call(this,p(this,cn))))}catch(t){this.error(t)}},Ul=function(t){const a=p(this,un).failed;a&&oe(this,ln,pn(()=>{a(p(this,cn),()=>t,()=>()=>{})}))},Hl=function(){const t=p(this,un).pending;t&&(this.is_pending=!0,oe(this,jt,pn(()=>t(p(this,cn)))),ha(()=>{var a=oe(this,Bn,document.createDocumentFragment()),r=Kn();a.append(r),oe(this,vn,qe(this,yt,Mr).call(this,()=>pn(()=>p(this,ca).call(this,r)))),p(this,Jn)===0&&(p(this,cn).before(a),oe(this,Bn,null),ma(p(this,jt),()=>{oe(this,jt,null)}),qe(this,yt,Sr).call(this,j))}))},oi=function(){try{if(this.is_pending=this.has_pending_snippet(),oe(this,Jn,0),oe(this,ua,0),oe(this,vn,pn(()=>{p(this,ca).call(this,p(this,cn))})),p(this,Jn)>0){var t=oe(this,Bn,document.createDocumentFragment());zi(p(this,vn),t);const a=p(this,un).pending;oe(this,jt,pn(()=>a(p(this,cn))))}else qe(this,yt,Sr).call(this,j)}catch(a){this.error(a)}},Sr=function(t){this.is_pending=!1,t.transfer_effects(p(this,cr),p(this,ur))},Mr=function(t){var a=Ee,r=we,i=Gt;On(p(this,Xt)),mn(p(this,Xt)),Ba(p(this,Xt).ctx);try{return wa.ensure(),t()}catch(o){return bs(o),null}finally{On(a),mn(r),Ba(i)}},di=function(t,a){var r;if(!this.has_pending_snippet()){this.parent&&qe(r=this.parent,yt,di).call(r,t,a);return}oe(this,Jn,p(this,Jn)+t),p(this,Jn)===0&&(qe(this,yt,Sr).call(this,a),p(this,jt)&&ma(p(this,jt),()=>{oe(this,jt,null)}),p(this,Bn)&&(p(this,cn).before(p(this,Bn)),oe(this,Bn,null)))},ci=function(t){p(this,vn)&&(nn(p(this,vn)),oe(this,vn,null)),p(this,jt)&&(nn(p(this,jt)),oe(this,jt,null)),p(this,ln)&&(nn(p(this,ln)),oe(this,ln,null));var a=p(this,un).onerror;let r=p(this,un).failed;var i=!1,o=!1;const d=()=>{if(i){Rl();return}i=!0,o&&El(),p(this,ln)!==null&&ma(p(this,ln),()=>{oe(this,ln,null)}),qe(this,yt,Mr).call(this,()=>{qe(this,yt,oi).call(this)})},c=u=>{try{o=!0,a==null||a(u,d),o=!1}catch(v){Zn(v,p(this,Xt)&&p(this,Xt).parent)}r&&oe(this,ln,qe(this,yt,Mr).call(this,()=>{try{return pn(()=>{var v=Ee;v.b=this,v.f|=ri,r(p(this,cn),()=>u,()=>d)})}catch(v){return Zn(v,p(this,Xt).parent),null}}))};ha(()=>{var u;try{u=this.transform_error(t)}catch(v){Zn(v,p(this,Xt)&&p(this,Xt).parent);return}u!==null&&typeof u=="object"&&typeof u.then=="function"?u.then(c,v=>Zn(v,p(this,Xt)&&p(this,Xt).parent)):c(u)})};function jl(e,t,a,r){const i=wi;var o=e.filter(y=>!y.settled),d=t.map(i);if(a.length===0&&o.length===0){r(d);return}var c=Ee,u=Jl(),v=o.length===1?o[0].promise:o.length>1?Promise.all(o.map(y=>y.promise)):null;function g(y){if((c.f&gn)===0){u();try{r([...d,...y])}catch(T){Zn(T,c)}Pr()}}var E=ks();if(a.length===0){v.then(()=>g([])).finally(E);return}function f(){Promise.all(a.map(y=>Ql(y))).then(g).catch(y=>Zn(y,c)).finally(E)}v?v.then(()=>{u(),f(),Pr()}):f()}function Jl(){var e=Ee,t=we,a=Gt,r=j;return function(o=!0){On(e),mn(t),Ba(a),o&&(e.f&gn)===0&&(r==null||r.activate(),r==null||r.apply())}}function Pr(e=!0){On(null),mn(null),Ba(null),e&&(j==null||j.deactivate())}function ks(){var e=Ee,t=e.b,a=j,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 wi(e){var t=Wt|Kt;return Ee!==null&&(Ee.f|=Ga),{ctx:Gt,deps:null,effects:null,equals:fs,f:t,fn:e,reactions:null,rv:0,v:$t,wv:0,parent:Ee,ac:null}}const ja=Symbol("obsolete");function Ql(e,t,a){let r=Ee;r===null&&ml();var i=void 0,o=ka($t),d=!we,c=new Set;return fo(()=>{var y,T;var u=Ee,v=ds();i=v.promise;try{Promise.resolve(e()).then(v.resolve,P=>{P!==Fr&&v.reject(P)}).finally(Pr)}catch(P){v.reject(P),Pr()}var g=j;if(d){if((u.f&Ka)!==0)var E=ks();if((y=r.b)!=null&&y.is_rendered())(T=g.async_deriveds.get(u))==null||T.reject(ja);else for(const P of c.values())P.reject(ja);c.add(v),g.async_deriveds.set(u,v)}const f=(P,x=void 0)=>{E==null||E(),c.delete(v),x!==ja&&(g.activate(),x?(o.f|=Xn,Fa(o,x)):((o.f&Xn)!==0&&(o.f^=Xn),Fa(o,P)),g.deactivate())};v.promise.then(f,P=>f(null,P||"unknown"))}),Is(()=>{for(const u of c)u.reject(ja)}),new Promise(u=>{function v(g){function E(){g===i?u(o):v(i)}g.then(E,E)}v(i)})}function O(e){const t=wi(e);return Ws(t),t}function Zl(e){const t=wi(e);return t.equals=hs,t}function Yl(e){var t=e.effects;if(t!==null){e.effects=null;for(var a=0;athis.schedule(r)){var r=p(this,Cn).get(t);if(r){p(this,Cn).delete(t);for(var i of r.d)Tt(i,Kt),a(i);for(i of r.m)Tt(i,Ln),a(i)}p(this,Oa).add(t)}capture(t,a,r=!1){t.v!==$t&&!this.previous.has(t)&&this.previous.set(t,t.v),(t.f&Xn)===0&&(this.current.set(t,[a,r]),qt==null||qt.set(t,a)),this.is_fork||(t.v=a)}activate(){j=this}deactivate(){j=null,qt=null}flush(){try{jr=!0,j=this,qe(this,je,Ja).call(this)}finally{Li=0,ui=null,Ea=null,Er=null,jr=!1,j=null,qt=null,ga.clear()}}discard(){var t;for(const a of p(this,Da))a(this);p(this,Da).clear();for(const a of this.async_deriveds.values())a.reject(ja);qe(this,je,Qa).call(this),(t=p(this,La))==null||t.resolve()}register_created_effect(t){p(this,vr).push(t)}increment(t,a){if(oe(this,$a,p(this,$a)+1),t){let r=p(this,Nn).get(a)??0;p(this,Nn).set(a,r+1)}}decrement(t,a){if(oe(this,$a,p(this,$a)-1),t){let r=p(this,Nn).get(a)??0;r===1?p(this,Nn).delete(a):p(this,Nn).set(a,r-1)}p(this,pa)||(oe(this,pa,!0),ha(()=>{oe(this,pa,!1),this.linked&&this.flush()}))}transfer_effects(t,a){for(const r of t)p(this,qn).add(r);for(const r of a)p(this,wn).add(r);t.clear(),a.clear()}oncommit(t){p(this,Pa).add(t)}ondiscard(t){p(this,Da).add(t)}settled(){return(p(this,La)??oe(this,La,ds())).promise}static ensure(){if(j===null){const t=j=new Or;!jr&&!er&&ha(()=>{p(t,za)||t.flush()})}return j}apply(){{qt=null;return}}schedule(t){var i;if(ui=t,(i=t.b)!=null&&i.is_pending&&(t.f&(Ia|Br|cs))!==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===Ee&&(we===null||(we.f&Wt)===0))return;if((r&(ea|Mn))!==0){if((r&Lt)===0)return;a.f^=Lt}}p(this,en).push(a)}};za=new WeakMap,Qn=new WeakMap,va=new WeakMap,Pa=new WeakMap,Da=new WeakMap,$a=new WeakMap,Nn=new WeakMap,La=new WeakMap,en=new WeakMap,vr=new WeakMap,qn=new WeakMap,wn=new WeakMap,Cn=new WeakMap,Oa=new WeakMap,pa=new WeakMap,je=new WeakSet,vi=function(){if(this.is_fork)return!0;for(const r of p(this,Nn).keys()){for(var t=r,a=!1;t.parent!==null;){if(p(this,Cn).has(t)){a=!0;break}t=t.parent}if(!a)return!0}return!1},Ja=function(){var u,v,g,E;oe(this,za,!0),Li++>1e3&&(qe(this,je,Qa).call(this),ao());for(const f of p(this,qn))p(this,wn).delete(f),Tt(f,Kt),this.schedule(f);for(const f of p(this,wn))Tt(f,Ln),this.schedule(f);const t=p(this,en);oe(this,en,[]),this.apply();var a=Ea=[],r=[],i=Er=[];for(const f of t)try{qe(this,je,pi).call(this,f,a,r)}catch(y){throw Ts(f),qe(this,je,vi).call(this)||this.discard(),y}if(j=null,i.length>0){var o=Or.ensure();for(const f of i)o.schedule(f)}if(Ea=null,Er=null,qe(this,je,vi).call(this)){qe(this,je,Ma).call(this,r),qe(this,je,Ma).call(this,a);for(const[f,y]of p(this,Cn))As(f,y);i.length>0&&qe(u=j,je,Ja).call(u);return}const d=qe(this,je,Ss).call(this);if(d){qe(this,je,Ma).call(this,r),qe(this,je,Ma).call(this,a),qe(v=d,je,Ms).call(v,this);return}p(this,qn).clear(),p(this,wn).clear();for(const f of p(this,Pa))f(this);p(this,Pa).clear(),Xa=this,Oi(r),Oi(a),Xa=null,(g=p(this,La))==null||g.resolve();var c=j;if(p(this,$a)===0&&(p(this,en).length===0||c!==null)&&qe(this,je,Qa).call(this),p(this,en).length>0)if(c!==null){const f=c;p(f,en).push(...p(this,en).filter(y=>!p(f,en).includes(y)))}else c=this;c!==null&&qe(E=c,je,Ja).call(E)},pi=function(t,a,r){t.f^=Lt;for(var i=t.first;i!==null;){var o=i.f,d=(o&(Mn|ea))!==0,c=d&&(o&Lt)!==0,u=c||(o&Jt)!==0||p(this,Cn).has(i);if(!u&&i.fn!==null){d?i.f^=Lt:(o&Ia)!==0?a.push(i):gr(i)&&((o&xn)!==0&&p(this,wn).add(i),Na(i));var v=i.first;if(v!==null){i=v;continue}}for(;i!==null;){var g=i.next;if(g!==null){i=g;break}i=i.parent}}},Ss=function(){for(var t=p(this,Qn);t!==null;){if(!t.is_fork){for(const[a,[,r]]of this.current)if(t.current.has(a)&&!r)return t}t=p(t,Qn)}return null},Ms=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(p(t,qn),p(t,wn));const a=i=>{var o=i.reactions;if(o!==null)for(const u of o){var d=u.f;if((d&Wt)!==0)a(u);else{var c=u;d&(Aa|xn)&&!this.async_deriveds.has(c)&&(p(this,wn).delete(c),Tt(c,Kt),this.schedule(c))}}};for(const i of this.current.keys())a(i);this.oncommit(()=>t.discard()),qe(r=t,je,Qa).call(r),j=this,qe(this,je,Ja).call(this)},Ma=function(t){for(var a=0;a!f.current.get(y)[1]);if(!(!p(f,za)||i.length===0)){var o=i.filter(y=>!this.current.has(y));if(o.length===0)t&&f.discard();else if(a.length>0){if(t)for(const y of p(this,Oa))f.unskip_effect(y,T=>{var P;(T.f&(xn|Aa))!==0?f.schedule(T):qe(P=f,je,Ma).call(P,[T])});f.activate();var d=new Set,c=new Map;for(var u of a)Es(u,o,d,c);c=new Map;var v=[...f.current].filter(([y,T])=>{const P=this.current.get(y);return P?P[0]!==T[0]||P[1]!==T[1]:!0}).map(([y])=>y);if(v.length>0)for(const y of p(this,vr))(y.f&(gn|Jt|Cr))===0&&yi(y,v,c)&&((y.f&(Aa|xn))!==0?(Tt(y,Kt),f.schedule(y)):p(f,qn).add(y));if(p(f,en).length>0&&!p(f,pa)){f.apply();for(var g of p(f,en))qe(E=f,je,pi).call(E,g,[],[]);oe(f,en,[])}f.deactivate()}}}},Qa=function(){if(this.linked){var t=p(this,Qn),a=p(this,va);t===null?Hr=a:oe(t,va,a),a===null?Sa=t:oe(a,Qn,t),this.linked=!1}};let wa=Or;function no(e){var t=er;er=!0;try{for(var a;;){if(Fl(),j===null)return a;j.flush()}}finally{er=t}}function ao(){try{yl()}catch(e){Zn(e,ui)}}let _n=null;function Oi(e){var t=e.length;if(t!==0){for(var a=0;a0)){ga.clear();for(const i of _n){if((i.f&(gn|Jt))!==0)continue;const o=[i];let d=i.parent;for(;d!==null;)_n.has(d)&&(_n.delete(d),o.push(d)),d=d.parent;for(let c=o.length-1;c>=0;c--){const u=o[c];(u.f&(gn|Jt))===0&&Na(u)}}_n.clear()}}_n=null}}function Es(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&Wt)!==0?Es(i,t,a,r):(o&(Aa|xn))!==0&&(o&Kt)===0&&yi(i,t,r)&&(Tt(i,Kt),xi(i))}}function yi(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(Tr.call(t,i))return!0;if((i.f&Wt)!==0&&yi(i,t,a))return a.set(i,!0),!0}return a.set(e,!1),!1}function xi(e){j.schedule(e)}function As(e,t){if(!((e.f&Mn)!==0&&(e.f&Lt)!==0)){(e.f&Kt)!==0?t.d.push(e):(e.f&Ln)!==0&&t.m.push(e),Tt(e,Lt);for(var a=e.first;a!==null;)As(a,t),a=a.next}}function Ts(e){Tt(e,Lt);for(var t=e.first;t!==null;)Ts(t),t=t.next}let Dr=new Set;const ga=new Map;let Cs=!1;function ka(e,t){var a={f:0,v:e,reactions:null,equals:fs,rv:0,wv:0};return a}function I(e,t){const a=ka(e);return Ws(a),a}function ro(e,t=!1,a=!0){const r=ka(e);return t||(r.equals=hs),r}function h(e,t,a=!1){we!==null&&(!Sn||(we.f&Cr)!==0)&&gs()&&(we.f&(Wt|xn|Aa|Cr))!==0&&(Dn===null||!Dn.has(e))&&Ml();let r=a?Vt(t):t;return Fa(e,r,Er)}function Fa(e,t,a=null){if(!e.equals(t)){ga.set(e,ta?t:e.v);var r=wa.ensure();if(r.capture(e,t),(e.f&Wt)!==0){const i=e;(e.f&Kt)!==0&&ki(i),qt===null&&_i(i)}e.wv=Us(),zs(e,Kt,a),Ee!==null&&(Ee.f&Lt)!==0&&(Ee.f&(Mn|ea))===0&&(dn===null?go([e]):dn.push(e)),!r.is_fork&&Dr.size>0&&!Cs&&io()}return t}function io(){Cs=!1;for(const e of Dr){(e.f&Lt)!==0&&Tt(e,Ln);let t;try{t=gr(e)}catch{t=!0}t&&Na(e)}Dr.clear()}function tr(e){h(e,e.v+1)}function zs(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=we,v=ba;mn(null),Ni(o);var g=c();return mn(u),Ni(v),g};return r&&a.set("length",I(e.length)),new Proxy(e,{defineProperty(c,u,v){(!("value"in v)||v.configurable===!1||v.enumerable===!1||v.writable===!1)&&xl();var g=a.get(u);return g===void 0?d(()=>{var E=I(v.value);return a.set(u,E),E}):h(g,v.value,!0),!0},deleteProperty(c,u){var v=a.get(u);if(v===void 0){if(u in c){const g=d(()=>I($t));a.set(u,g),tr(i)}}else h(v,$t),tr(i);return!0},get(c,u,v){var y;if(u===Ta)return e;var g=a.get(u),E=u in c;if(g===void 0&&(!E||(y=Ya(c,u))!=null&&y.writable)&&(g=d(()=>{var T=Vt(E?c[u]:$t),P=I(T);return P}),a.set(u,g)),g!==void 0){var f=n(g);return f===$t?void 0:f}return Reflect.get(c,u,v)},getOwnPropertyDescriptor(c,u){var v=Reflect.getOwnPropertyDescriptor(c,u);if(v&&"value"in v){var g=a.get(u);g&&(v.value=n(g))}else if(v===void 0){var E=a.get(u),f=E==null?void 0:E.v;if(E!==void 0&&f!==$t)return{enumerable:!0,configurable:!0,value:f,writable:!0}}return v},has(c,u){var f;if(u===Ta)return!0;var v=a.get(u),g=v!==void 0&&v.v!==$t||Reflect.has(c,u);if(v!==void 0||Ee!==null&&(!g||(f=Ya(c,u))!=null&&f.writable)){v===void 0&&(v=d(()=>{var y=g?Vt(c[u]):$t,T=I(y);return T}),a.set(u,v));var E=n(v);if(E===$t)return!1}return g},set(c,u,v,g){var te;var E=a.get(u),f=u in c;if(r&&u==="length")for(var y=v;yI($t)),a.set(y+"",T))}if(E===void 0)(!f||(te=Ya(c,u))!=null&&te.writable)&&(E=d(()=>I(void 0)),h(E,Vt(v)),a.set(u,E));else{f=E.v!==$t;var P=d(()=>Vt(v));h(E,P)}var x=Reflect.getOwnPropertyDescriptor(c,u);if(x!=null&&x.set&&x.set.call(g,v),!f){if(r&&typeof u=="string"){var D=a.get("length"),ke=Number(u);Number.isInteger(ke)&&ke>=D.v&&h(D,ke+1)}tr(i)}return!0},ownKeys(c){n(i);var u=Reflect.ownKeys(c).filter(E=>{var f=a.get(E);return f===void 0||f.v!==$t});for(var[v,g]of a)g.v!==$t&&!(v in c)&&u.push(v);return u},setPrototypeOf(){Sl()}})}function Ii(e){try{if(e!==null&&typeof e=="object"&&Ta in e)return e[Ta]}catch{}return e}function so(e,t){return Object.is(Ii(e),Ii(t))}var Ri,Ps,Ds,$s;function lo(){if(Ri===void 0){Ri=window,Ps=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,a=Text.prototype;Ds=Ya(t,"firstChild").get,$s=Ya(t,"nextSibling").get,$i(e)&&(e[si]=void 0,e[yr]=null,e[li]=void 0,e.__e=void 0),$i(a)&&(a[Ha]=void 0)}}function Kn(e=""){return document.createTextNode(e)}function Yn(e){return Ds.call(e)}function hr(e){return $s.call(e)}function l(e,t){return Yn(e)}function ct(e,t=!1){{var a=Yn(e);return a instanceof Comment&&a.data===""?hr(a):a}}function s(e,t=1,a=!1){let r=e;for(;t--;)r=hr(r);return r}function oo(e){e.textContent=""}function Ls(){return!1}function Os(e,t,a){return t==null||t===ps?a?document.createElement(e,{is:a}):document.createElement(e):a?document.createElementNS(t,e,{is:a}):document.createElementNS(t,e)}let Bi=!1;function co(){Bi||(Bi=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var t;if(!e.defaultPrevented)for(const a of e.target.elements)(t=a[xr])==null||t.call(a)})},{capture:!0}))}function Si(e){var t=we,a=Ee;mn(null),On(null);try{return e()}finally{mn(t),On(a)}}function Mi(e,t,a,r=a){e.addEventListener(t,()=>Si(a));const i=e[xr];i?e[xr]=()=>{i(),r(!0)}:e[xr]=()=>r(!0),co()}function uo(e){Ee===null&&(we===null&&kl(),wl()),ta&&_l()}function vo(e,t){var a=t.last;a===null?t.last=t.first=e:(a.next=e,e.prev=a,t.last=e)}function Gn(e,t){var a=Ee;a!==null&&(a.f&Jt)!==0&&(e|=Jt);var r={ctx:Gt,deps:null,nodes:null,f:e|Kt|hn,first:null,fn:t,last:null,next:null,parent:a,b:a&&a.b,prev:null,teardown:null,wv:0,ac:null};j==null||j.register_created_effect(r);var i=r;if((e&Ia)!==0)Ea!==null?Ea.push(r):wa.ensure().schedule(r);else if(t!==null){try{Na(r)}catch(d){throw nn(r),d}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&(i.f&Ga)===0&&(i=i.first,(e&xn)!==0&&(e&Ra)!==0&&i!==null&&(i.f|=Ra))}if(i!==null&&(i.parent=a,a!==null&&vo(i,a),we!==null&&(we.f&Wt)!==0&&(e&ea)===0)){var o=we;(o.effects??(o.effects=[])).push(i)}return r}function Ei(){return we!==null&&!Sn}function Is(e){const t=Gn(Br,null);return Tt(t,Lt),t.teardown=e,t}function Ai(e){uo();var t=Ee.f,a=!we&&(t&Mn)!==0&&Gt!==null&&!Gt.i;if(a){var r=Gt;(r.e??(r.e=[])).push(e)}else return Rs(e)}function Rs(e){return Gn(Ia|fl,e)}function po(e){wa.ensure();const t=Gn(ea|Ga,e);return(a={})=>new Promise(r=>{a.outro?ma(t,()=>{nn(t),r(void 0)}):(nn(t),r(void 0))})}function Bs(e){return Gn(Ia,e)}function fo(e){return Gn(Aa|Ga,e)}function Nr(e,t=0){return Gn(Br|t,e)}function $(e,t=[],a=[],r=[]){jl(r,t,a,i=>{Gn(Br,()=>{e(...i.map(n))})})}function Ti(e,t=0){var a=Gn(xn|t,e);return a}function pn(e){return Gn(Mn|Ga,e)}function Fs(e){var t=e.teardown;if(t!==null){const a=ta,r=we;Fi(!0),mn(null);try{t.call(null)}finally{Fi(a),mn(r)}}}function Ci(e,t=!1){var a=e.first;for(e.first=e.last=null;a!==null;){const i=a.ac;i!==null&&Si(()=>{i.abort(Fr)});var r=a.next;(a.f&ea)!==0?a.parent=null:nn(a,t),a=r}}function ho(e){for(var t=e.first;t!==null;){var a=t.next;(t.f&Mn)===0&&nn(t),t=a}}function nn(e,t=!0){var a=!1;(t||(e.f&pl)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(Ns(e.nodes.start,e.nodes.end),a=!0),e.f|=ii,Ci(e,t&&!a),lr(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(const o of r)o.stop();Fs(e),e.f^=ii,e.f|=gn;var i=e.parent;i!==null&&i.first!==null&&qs(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Ns(e,t){for(;e!==null;){var a=e===t?null:hr(e);e.remove(),e=a}}function qs(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=[];Ks(e,r,!0);var i=()=>{a&&nn(e),t&&t()},o=r.length;if(o>0){var d=()=>--o||i();for(var c of r)c.out(d)}else i()}function Ks(e,t,a){if((e.f&Jt)===0){e.f^=Jt;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&ea)===0){var d=(i.f&Ra)!==0||(i.f&Mn)!==0&&(e.f&xn)!==0;Ks(i,t,d?a:!1)}i=o}}}function $r(e){Gs(e,!0)}function Gs(e,t){if((e.f&Jt)!==0){e.f^=Jt,(e.f&Lt)===0&&(Tt(e,Kt),wa.ensure().schedule(e));for(var a=e.first;a!==null;){var r=a.next,i=(a.f&Ra)!==0||(a.f&Mn)!==0;Gs(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 zi(e,t){if(e.nodes)for(var a=e.nodes.start,r=e.nodes.end;a!==null;){var i=a===r?null:hr(a);t.append(a),a=i}}let Ar=!1,ta=!1;function Fi(e){ta=e}let we=null,Sn=!1;function mn(e){we=e}let Ee=null;function On(e){Ee=e}let Dn=null;function Ws(e){we!==null&&(Dn??(Dn=new Set)).add(e)}let tn=null,sn=0,dn=null;function go(e){dn=e}let Vs=1,la=0,ba=la;function Ni(e){ba=e}function Us(){return++Vs}function gr(e){var t=e.f;if((t&Kt)!==0)return!0;if(t&Wt&&(e.f&=~_a),(t&Ln)!==0){for(var a=e.deps,r=a.length,i=0;ie.wv)return!0}(t&hn)!==0&&qt===null&&Tt(e,Lt)}return!1}function Hs(e,t,a=!0){var r=e.reactions;if(r!==null&&!(Dn!==null&&Dn.has(e)))for(var i=0;i{e.ac.abort(Fr)}),e.ac=null);try{e.f|=zr;var g=e.fn,E=g();e.f|=Ka;var f=e.deps,y=j==null?void 0:j.is_fork;if(tn!==null){var T;if(y||lr(e,sn),f!==null&&sn>0)for(f.length=sn+tn.length,T=0;T{throw D});throw f}}finally{e[oa]=t,delete e.currentTarget,mn(g),On(E)}}}var is;const Jr=((is=globalThis==null?void 0:globalThis.window)==null?void 0:is.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function ko(e){return(Jr==null?void 0:Jr.createHTML(e))??e}function yo(e){var t=Os("template");return t.innerHTML=ko(e.replaceAll("","")),t.content}function qa(e,t){var a=Ee;a.nodes===null&&(a.nodes={start:e,end:t,a:null,t:null})}function k(e,t){var a=(t&Pl)!==0,r=(t&Dl)!==0,i,o=!e.startsWith("");return()=>{i===void 0&&(i=yo(o?e:""+e),a||(i=Yn(i)));var d=r||Ps?document.importNode(i,!0):i.cloneNode(!0);if(a){var c=Yn(d),u=d.lastChild;qa(c,u)}else qa(d,d);return d}}function nr(e=""){{var t=Kn(e+"");return qa(t,t),t}}function or(){var e=document.createDocumentFragment(),t=document.createComment(""),a=Kn();return e.append(t,a),qa(t,a),e}function m(e,t){e!==null&&e.before(t)}function b(e,t){var a=t==null?"":typeof t=="object"?`${t}`:t;a!==(e[Ha]??(e[Ha]=e.nodeValue))&&(e[Ha]=a,e.nodeValue=`${a}`)}function xo(e,t){return So(e,t)}const wr=new Map;function So(e,{target:t,anchor:a,props:r={},events:i,context:o,intro:d=!0,transformError:c}){lo();var u=void 0,v=po(()=>{var g=a??t.appendChild(Kn());Gl(g,{pending:()=>{}},y=>{na({});var T=Gt;o&&(T.c=o),i&&(r.$$events=i),u=e(y,r)||{},aa()},c);var E=new Set,f=y=>{for(var T=0;T{var x;for(var y of E)for(const D of[t,document]){var T=wr.get(D),P=T.get(y);--P==0?(D.removeEventListener(y,Ki),T.delete(y),T.size===0&&wr.delete(D)):T.set(y,P)}fi.delete(f),g!==a&&((x=g.parentNode)==null||x.removeChild(g))}});return Mo.set(u,v),u}let Mo=new WeakMap;var kn,zn,on,fa,pr,fr,Ir;class Eo{constructor(t,a=!0){rn(this,"anchor");ce(this,kn,new Map);ce(this,zn,new Map);ce(this,on,new Map);ce(this,fa,new Set);ce(this,pr,!0);ce(this,fr,t=>{if(p(this,kn).has(t)){var a=p(this,kn).get(t),r=p(this,zn).get(a);if(r)$r(r),p(this,fa).delete(a);else{var i=p(this,on).get(a);i&&($r(i.effect),p(this,zn).set(a,i.effect),p(this,on).delete(a),i.fragment.lastChild.remove(),this.anchor.before(i.fragment),r=i.effect)}for(const[o,d]of p(this,kn)){if(p(this,kn).delete(o),o===t)break;const c=p(this,on).get(d);c&&(nn(c.effect),p(this,on).delete(d))}for(const[o,d]of p(this,zn)){if(o===a||p(this,fa).has(o))continue;const c=()=>{if(Array.from(p(this,kn).values()).includes(o)){var v=document.createDocumentFragment();zi(d,v),v.append(Kn()),p(this,on).set(o,{effect:d,fragment:v})}else nn(d);p(this,fa).delete(o),p(this,zn).delete(o)};p(this,pr)||!r?(p(this,fa).add(o),ma(d,c,!1)):c()}}});ce(this,Ir,t=>{p(this,kn).delete(t);const a=Array.from(p(this,kn).values());for(const[r,i]of p(this,on))a.includes(r)||(nn(i.effect),p(this,on).delete(r))});this.anchor=t,oe(this,pr,a)}ensure(t,a){var r=j,i=Ls();if(a&&!p(this,zn).has(t)&&!p(this,on).has(t))if(i){var o=document.createDocumentFragment(),d=Kn();o.append(d),p(this,on).set(t,{effect:pn(()=>a(d)),fragment:o})}else p(this,zn).set(t,pn(()=>a(this.anchor)));if(p(this,kn).set(r,t),i){for(const[c,u]of p(this,zn))c===t?r.unskip_effect(u):r.skip_effect(u);for(const[c,u]of p(this,on))c===t?r.unskip_effect(u.effect):r.skip_effect(u.effect);r.oncommit(p(this,fr)),r.ondiscard(p(this,Ir))}else p(this,fr).call(this,r)}}kn=new WeakMap,zn=new WeakMap,on=new WeakMap,fa=new WeakMap,pr=new WeakMap,fr=new WeakMap,Ir=new WeakMap;function F(e,t,a=!1){var r=new Eo(e),i=a?Ra:0;function o(d,c){r.ensure(d,c)}Ti(()=>{var d=!1;t((c,u=0)=>{d=!0,o(u,c)}),d||o(-1,null)},i)}function ot(e,t){return t}function Ao(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 f=e.outrogroups;hi(e,Rr(o.done)),f.delete(o),f.size===0&&(e.outrogroups=null)}}else d-=1},!1)}if(d===0){var u=r.length===0&&a!==null;if(u){var v=a,g=v.parentNode;oo(g),g.append(v),e.items.clear()}hi(e,t,!u)}else o={pending:new Set(t),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(o)}function hi(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 te=a();return bi(te)?te:te==null?[]:Rr(te)}),f,y=new Map,T=!0;function P(te){(ke.effect.f&gn)===0&&(ke.pending.delete(te),ke.fallback=g,To(ke,f,d,t,r),g!==null&&(f.length===0?(g.f&Pn)===0?$r(g):(g.f^=Pn,Za(g,null,d)):ma(g,()=>{g=null})))}function x(te){ke.pending.delete(te)}var D=Ti(()=>{f=n(E);for(var te=f.length,ue=new Set,Ae=j,K=Ls(),W=0;Wo(d)):(g=pn(()=>o(Gi??(Gi=Kn()))),g.f|=Pn)),te>ue.size&&bl(),!T)if(y.set(Ae,ue),K){for(const[We,mt]of c)ue.has(We)||Ae.skip_effect(mt.e);Ae.oncommit(P),Ae.ondiscard(x)}else P(Ae);n(E)}),ke={effect:D,items:c,pending:y,outrogroups:null,fallback:g};T=!1}function Ua(e){for(;e!==null&&(e.f&Mn)===0;)e=e.next;return e}function To(e,t,a,r,i){var De,We,mt,A,H,re,Ve,Q,$e;var o=(r&Cl)!==0,d=t.length,c=e.items,u=Ua(e.effect.first),v,g=null,E,f=[],y=[],T,P,x,D;if(o)for(D=0;D0){var he=(r&vs)!==0&&d===0?a:null;if(o){for(D=0;D{var Y,rt;if(E!==void 0)for(x of E)(rt=(Y=x.nodes)==null?void 0:Y.a)==null||rt.apply()})}function Co(e,t,a,r,i,o,d,c){var u=(d&Al)!==0?(d&zl)===0?ro(a,!1,!1):ka(a):null,v=(d&Tl)!==0?ka(i):null;return{v:u,i:v,e:pn(()=>(o(t,u??a,v??i,c),()=>{e.delete(r)}))}}function Za(e,t,a){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,o=t&&(t.f&Pn)===0?t.nodes.start:a;r!==null;){var d=hr(r);if(o.before(r),r===i)return;r=d}}function Hn(e,t,a){t===null?e.effect.first=a:t.next=a,a===null?e.effect.last=t:a.prev=t}function Pe(e,t,a=!1,r=!1,i=!1,o=!1){var d=e,c="";if(a)var u=e;$(()=>{var v=Ee;if(c!==(c=t()??"")){if(a){v.nodes=null,u.innerHTML=c,c!==""&&qa(Yn(u),u.lastChild);return}if(v.nodes!==null&&(Ns(v.nodes.start,v.nodes.end),v.nodes=null),c!==""){var g=r?$l:i?Ll:void 0,E=Os(r?"svg":i?"math":"template",g);E.innerHTML=c;var f=r||i?E:E.content;if(qa(Yn(f),f.lastChild),r||i)for(;Yn(f);)d.before(Yn(f));else d.before(f)}}})}function zo(e,t,a){var r=e==null?"":""+e;return r===""?null:r}function Po(e,t){return e==null?null:String(e)}function kt(e,t,a,r,i,o){var d=e[si];if(d!==a||d===void 0){var c=zo(a);c==null?e.removeAttribute("class"):e.className=c,e[si]=a}return o}function fn(e,t,a,r){var i=e[li];if(i!==t){var o=Po(t);o==null?e.removeAttribute("style"):e.style.cssText=o,e[li]=t}return r}function Ys(e,t,a=!1){if(e.multiple){if(t==null)return;if(!bi(t))return Il();for(var r of e.options)r.selected=t.includes(rr(r));return}for(r of e.options){var i=rr(r);if(so(i,t)){r.selected=!0;return}}(!a||t!==void 0)&&(e.selectedIndex=-1)}function Do(e){var t=new MutationObserver(()=>{Ys(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),Is(()=>{t.disconnect()})}function ar(e,t,a=t){var r=new WeakSet,i=!0;Mi(e,"change",o=>{var d=o?"[selected]":":checked",c;if(e.multiple)c=[].map.call(e.querySelectorAll(d),rr);else{var u=e.querySelector(d)??e.querySelector("option:not([disabled])");c=u&&rr(u)}a(c),e.__value=c,j!==null&&r.add(j)}),Bs(()=>{var o=t();if(e===document.activeElement){var d=j;if(r.has(d))return}if(Ys(e,o,i),i&&o===void 0){var c=e.querySelector(":checked");c!==null&&(o=rr(c),a(o))}e.__value=o,i=!1}),Do(e)}function rr(e){return"__value"in e?e.__value:e.value}const $o=Symbol("is custom element"),Lo=Symbol("is html"),Oo=gl?"progress":"PROGRESS";function kr(e,t){var a=Xs(e);a.value===(a.value=t??void 0)||e.value===t&&(t!==0||e.nodeName!==Oo)||(e.value=t??"")}function qr(e,t,a,r){var i=Xs(e);i[t]!==(i[t]=a)&&(t==="loading"&&(e[hl]=a),a==null?e.removeAttribute(t):typeof a!="string"&&Io(e).includes(t)?e[t]=a:e.setAttribute(t,a))}function Xs(e){return e[yr]??(e[yr]={[$o]:e.nodeName.includes("-"),[Lo]:e.namespaceURI===ps})}var Wi=new Map;function Io(e){var t=e.getAttribute("is")||e.nodeName,a=Wi.get(t);if(a)return a;Wi.set(t,a=[]);for(var r,i=e,o=Element.prototype;o!==i;){r=ol(i);for(var d in r)r[d].set&&d!=="innerHTML"&&d!=="textContent"&&d!=="innerText"&&a.push(d);i=os(i)}return a}function Tn(e,t,a=t){var r=new WeakSet;Mi(e,"input",async i=>{var o=i?e.defaultValue:e.value;if(o=Qr(e)?Zr(o):o,a(o),j!==null&&r.add(j),await bo(),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))}}}),Wa(t)==null&&e.value&&(a(Qr(e)?Zr(e.value):e.value),j!==null&&r.add(j)),Nr(()=>{var i=t();if(e===document.activeElement){var o=j;if(r.has(o))return}Qr(e)&&i===Zr(e.value)||e.type==="date"&&!i&&!e.value||i!==e.value&&(e.value=i??"")})}function Ro(e,t,a=t){Mi(e,"change",r=>{var i=r?e.defaultChecked:e.checked;a(i)}),Wa(t)==null&&a(e.checked),Nr(()=>{var r=t();e.checked=!!r})}function Qr(e){var t=e.type;return t==="number"||t==="range"}function Zr(e){return e===""?null:+e}function Yr(e,t){return e===t||(e==null?void 0:e[Ta])===t}function Bo(e={},t,a,r){var i=Gt.r,o=Ee;return Bs(()=>{var d,c;return Nr(()=>{d=c,c=[],Wa(()=>{Yr(a(...c),e)||(t(e,...c),d&&Yr(a(...d),e)&&t(null,...d))})}),()=>{let u=o;for(;u!==i&&u.parent!==null&&u.parent.fⅈ)u=u.parent;const v=()=>{c&&Yr(a(...c),e)&&t(null,...c)},g=u.teardown;u.teardown=()=>{v(),g==null||g()}}}),e}function mr(e){Gt===null&&us(),Ai(()=>{const t=Wa(e);if(typeof t=="function")return t})}function Fo(e){Gt===null&&us(),mr(()=>()=>Wa(e))}let dr=localStorage.getItem("mc_token")||"";function el(){return dr}function No(e){dr=(e||"").trim(),localStorage.setItem("mc_token",dr)}function qo(){const e={"Content-Type":"application/json"};return dr&&(e["X-MC-Token"]=dr),e}function ir(){return localStorage.getItem("mc_hf_token")||""}function Ko(e){localStorage.setItem("mc_hf_token",(e||"").trim())}async function Me(e,t={}){const a=await fetch(e,{headers:qo(),...t}),r=await a.json().catch(()=>({}));if(!a.ok)throw new Error(r.error||"HTTP "+a.status);return r}const Go=(e,t=document)=>t.querySelector(e),Vi=(e,t=document)=>[...t.querySelectorAll(e)];function $n(e){return String(e??"").replace(/[&<>]/g,t=>({"&":"&","<":"<",">":">"})[t])}let Ui;function ee(e,t=!1){const a=Go("#toast");a&&(a.textContent=e,a.className="toast show"+(t?" err":""),clearTimeout(Ui),Ui=setTimeout(()=>a.className="toast",3200))}function Wo(e,t){return e==="running"||e==="ready"?'geladen':e==="loading"||e==="starting"?'lädt…':e==="downloading"?`↓ Download${t!=null?` ${Math.round(t)}%`:""}`:'bereit'}const He=e=>`${e}`,Kr={logo:He(''),grid:He(''),cpu:He(''),pulse:He(''),server:He(''),book:He(''),help:He(''),settings:He(''),swap:He(''),monitor:He(''),layers:He(''),alert:He(''),gauge:He(''),search:He(''),compass:He(''),code:He(''),eye:He(''),refresh:He(''),file:He(''),database:He(''),thermo:He(''),shield:He(''),info:He(''),chevron:He(''),bolt:He(''),x:He(''),check:He(''),download:He(''),clock:He('')};function Dt(e){return Kr[e]||""}function gi(e){return`${Kr.info}`}function ia(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 yn({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=u=>{d.remove(),o(u)};d.addEventListener("click",u=>{if(u.target===d)return c(!1);const v=u.target.closest("[data-x]");v&&c(v.getAttribute("data-x")==="1")}),document.body.appendChild(d),d.querySelector('[data-x="1"]').focus()})}function jr({title:e,body:n="",placeholder:a="",password:i=!1,confirmLabel:r="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=g=>{c.remove(),d(g)};c.addEventListener("click",g=>{if(g.target===c)return v(null);const E=g.target.closest("[data-x]");E&&v(E.getAttribute("data-x")==="1"?u.value||"":null)}),u.addEventListener("keydown",g=>{g.key==="Enter"&&v(u.value||""),g.key==="Escape"&&v(null)}),document.body.appendChild(c),u.focus()})}function Vo(e="overview"){const t=Vi(".nav-item[data-view]:not(.disabled)"),a=Vi(".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 ji=I(null);const br={get value(){return n(ji)},set(e){h(ji,e,!0)}};let Ji=I(Vt([])),jn=I(Vt([]));const da={get value(){return n(Ji)},set(e){h(Ji,e||[],!0)},get tracked(){return n(jn)},track(e){n(jn).includes(e)||h(jn,[...n(jn),e],!0)},toggle(e){h(jn,n(jn).includes(e)?n(jn).filter(t=>t!==e):[...n(jn),e],!0)}};let Qi=I(null);const Pi={get value(){return n(Qi)},set(e){h(Qi,e,!0)}},Uo="5";var ss;typeof window<"u"&&((ss=window.__svelte??(window.__svelte={})).v??(ss.v=new Set)).add(Uo);var Ho=k('— bereit für Anfragen'),jo=k('
Temperatur (GPU)
Freier Speicher
GB
',1),Jo=k('
Temperatur
messe…
Freier Speicher
messe…
',1),Qo=k('
'),Zo=k('
Warte auf Messwerte…
'),Yo=k('
Noch kein Modell eingerichtet — starte hier:
',1),Xo=k('
Die häufigsten Aufgaben — ein Klick.
',1),ed=k('Bild'),td=k('Code'),nd=k('Text'),ad=k('∞ aktiv'),rd=k(''),id=k('
'),Zi=k('
'),sd=k('
Noch keine Modelle
Hol dir unter „Cookbook" ein Modell, das auf deine Hardware passt.
'),ld=k('
'),od=k('
News gerade nicht ladbar.
'),dd=k('

LLM-Engine
Aktives Modell

System-Gesundheit

Auslastung in Echtzeit.

Schnellstart

Dein Stack

Top-News

Alle →
',1);function cd(e,t){na(t,!0);const a=O(()=>br.value),r=O(()=>Pi.value),i=O(()=>{var S;return((S=n(a))==null?void 0:S.models)||[]}),o=O(()=>{var S;return((S=n(a))==null?void 0:S.swap_ok)??!1}),d=["running","ready","loading","starting"],c=O(()=>n(i).find(S=>d.includes(S.state))),u=O(()=>n(i).filter(S=>!S.incomplete)),v=O(()=>n(a)?n(o)?n(r)&&n(r).ram.percent>=90?"Achtung: Speicher wird knapp.":"Alles läuft rund.":"LLM-Engine offline":"Verbinde…"),g=O(()=>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=O(()=>()=>{var G;const S=(G=n(r))==null?void 0:G.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 f=I(Vt([])),y=I(null);mr(async()=>{try{h(f,((await Me("/api/news")).items||[]).slice(0,4),!0)}catch{}});async function T(){await yn({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"}),x())}async function P(S){h(y,S,!0);try{await Me("/api/preload?model="+encodeURIComponent(S),{method:"POST"})}catch(G){ee("Laden fehlgeschlagen: "+(G.message||"Engine nicht erreichbar?"),!0)}h(y,null),x()}function x(){document.dispatchEvent(new Event("mc:refresh"))}function D(S){var G;(G=document.querySelector(`.nav-item[data-view="${S}"]`))==null||G.dispatchEvent(new MouseEvent("click"))}function ke(S){return S>=90?"red":S>=75?"":"green"}function te(S){return S==null?"":S>=75?"red":S>=55?"":"green"}function ue(S){return S>=90?"red":S>=70?"":"green"}var Ae=dd(),K=ct(Ae),W=l(K),pe=l(W),he=l(pe),De=s(he);{var We=S=>{var G=Ho();m(S,G)};F(De,S=>{n(o)&&!n(c)&&S(We)})}var mt=s(pe,2),A=l(mt),H=s(K,2),re=l(H),Ve=l(re),Q=s(l(Ve),2);Pe(Q,()=>Dt("server"),!0);var $e=s(Ve,2),Y=l($e),rt=s($e,2),L=l(rt),V=s(re,2),ie=l(V),ge=s(l(ie),2);Pe(ge,()=>Dt("cpu"),!0);var Te=s(ie,2),bt=l(Te),ft=s(Te,2),xt=l(ft);{var Ct=S=>{var G=nr();$(Oe=>b(G,`${Oe??""} · ${n(c).state??""}`),[()=>{var Oe;return(Oe=n(c).meta)!=null&&Oe.ctx?Math.round(n(c).meta.ctx/1024)+"k ctx":""}]),m(S,G)},St=S=>{var G=nr("lädt bei erster Anfrage");m(S,G)};F(xt,S=>{n(c)?S(Ct):S(St,-1)})}var Pt=s(V,2);{var Ot=S=>{const G=O(()=>{var Vn;return n(r).gpu_temp??((Vn=n(r).cpu)==null?void 0:Vn.temp)??null}),Oe=O(()=>te(n(G))),ne=O(()=>n(r).ram.total-n(r).ram.used),Be=O(()=>100-n(r).ram.percent);var Ze=jo(),et=ct(Ze),Se=l(et),ze=s(l(Se));Pe(ze,()=>Dt("thermo"),!0);var Ie=s(Se,2),It=l(Ie),Bt=s(Ie,2),Ht=l(Bt),an=s(et,2),bn=l(an),Ke=s(l(bn));Pe(Ke,()=>Dt("database"),!0);var ht=s(bn,2),In=l(ht),Wn=s(ht,2),ra=l(Wn);$((Vn,Va,w,_)=>{kt(et,1,`kpi ${n(Oe)??""}`),b(It,Vn),b(Ht,n(G)==null?"messe…":n(G)<55?"kühl":n(G)<75?"normal":"⚠ heiß"),kt(an,1,`kpi ${n(Be)<15?"red":n(Be)<30?"":"green"}`),b(In,Va),b(ra,`von ${w??""} GB · ${_??""} % frei`)},[()=>n(G)!=null?`${Math.round(n(G))}°C`:"–",()=>Math.round(n(ne)/1073741824),()=>Math.round(n(r).ram.total/1073741824),()=>Math.round(n(Be))]),m(S,Ze)},Rt=S=>{var G=Jo();m(S,G)};F(Pt,S=>{n(r)?S(Ot):S(Rt,-1)})}var z=s(H,2),q=l(z),Ce=s(l(q),4);{var ut=S=>{const G=O(()=>n(E)());var Oe=or(),ne=ct(Oe);dt(ne,17,()=>{var Be;return[["Prozessor (CPU)",((Be=n(r).cpu)==null?void 0:Be.percent)??0,""],["Arbeitsspeicher (RAM)",n(r).ram.percent,ke(n(r).ram.percent)],["Grafikspeicher (VRAM)",n(G),ue(n(G))]]},ot,(Be,Ze)=>{var et=O(()=>sr(n(Ze),3));let Se=()=>n(et)[0],ze=()=>n(et)[1];const Ie=O(()=>Math.max(0,Math.min(100,ze()||0)));var It=Qo(),Bt=l(It),Ht=l(Bt),an=l(Ht),bn=s(Ht),Ke=l(bn),ht=s(Bt,2),In=l(ht);$((Wn,ra)=>{b(an,Se()),b(Ke,`${Wn??""} %`),kt(ht,1,`bar ${n(Ie)>=90?"bad":n(Ie)>=75?"warn":""}`),fn(In,`width:${ra??""}%`)},[()=>Math.round(n(Ie)),()=>Math.max(2,n(Ie))]),m(Be,It)}),m(S,Oe)},N=S=>{var G=Zo();m(S,G)};F(Ce,S=>{n(r)?S(ut):S(N,-1)})}var Le=s(q,2),J=s(l(Le),2);{var de=S=>{var G=Yo(),Oe=s(ct(G),2),ne=l(Oe);Pe(ne,()=>Dt("search"),!0);var Be=s(ne,4);Pe(Be,()=>Dt("chevron"),!0);var Ze=s(Oe,2),et=l(Ze);Pe(et,()=>Dt("swap"),!0);var Se=s(et,4);Pe(Se,()=>Dt("chevron"),!0);var ze=s(Ze,2),Ie=l(ze);Pe(Ie,()=>Dt("file"),!0);var It=s(Ie,4);Pe(It,()=>Dt("chevron"),!0),C("click",Oe,()=>D("cookbook")),C("click",Ze,()=>D("connect")),C("click",ze,()=>D("guides")),m(S,G)},se=S=>{var G=Xo(),Oe=s(ct(G),2),ne=l(Oe);Pe(ne,()=>Dt("search"),!0);var Be=s(ne,4);Pe(Be,()=>Dt("chevron"),!0);var Ze=s(Oe,2),et=l(Ze);Pe(et,()=>Dt("refresh"),!0);var Se=s(et,4);Pe(Se,()=>Dt("chevron"),!0);var ze=s(Ze,2),Ie=l(ze);Pe(Ie,()=>Dt("file"),!0);var It=s(Ie,4);Pe(It,()=>Dt("chevron"),!0);var Bt=s(ze,2),Ht=l(Bt);Pe(Ht,()=>Dt("swap"),!0);var an=s(Ht,4);Pe(an,()=>Dt("chevron"),!0),C("click",Oe,()=>D("cookbook")),C("click",Ze,T),C("click",ze,()=>D("server")),C("click",Bt,()=>D("connect")),m(S,G)};F(J,S=>{n(u).length?S(se,-1):S(de)})}var Z=s(z,2),be=l(Z),ve=l(be),ye=s(l(ve),2),xe=l(ye),_e=s(ve,2);{var M=S=>{var G=Zi();dt(G,21,()=>n(u),ot,(Oe,ne)=>{const Be=O(()=>d.includes(n(ne).state)),Ze=O(()=>n(ne).state==="downloading"),et=O(()=>n(ne).state==="loading"||n(ne).state==="starting"||n(Ze)?"load":n(Be)?"on":""),Se=O(()=>n(Ze)?`↓ ${n(ne).download_progress!=null?Math.round(n(ne).download_progress)+"%":"..."}`:n(ne).state==="loading"||n(ne).state==="starting"?"lädt…":n(Be)?"geladen ✓":"bereit");var ze=id(),Ie=l(ze),It=s(Ie,2),Bt=l(It),Ht=l(Bt),an=l(Ht),bn=s(Ht,2);{var Ke=X=>{var me=ed();m(X,me)},ht=O(()=>{var X,me;return(me=(X=n(ne).meta)==null?void 0:X.caps)==null?void 0:me.includes("Bild")}),In=X=>{var me=td();m(X,me)},Wn=O(()=>{var X,me;return(me=(X=n(ne).meta)==null?void 0:X.caps)==null?void 0:me.includes("Code")}),ra=X=>{var me=nd();m(X,me)};F(bn,X=>{n(ht)?X(Ke):n(Wn)?X(In,1):X(ra,-1)})}var Vn=s(bn,2);{var Va=X=>{var me=ad();m(X,me)};F(Vn,X=>{n(ne).ttl>=99999&&X(Va)})}var w=s(Bt,2),_=l(w),B=s(It,2),R=l(B),ae=l(R),tt=s(R,2);{var it=X=>{var me=rd(),Re=l(me);$(()=>{fn(me,`padding:3px 9px;font-size:12px;opacity:${n(y)===n(ne).name?".5":"1"}`),me.disabled=n(y)===n(ne).name,b(Re,n(y)===n(ne).name?"…":"Laden")}),C("click",me,()=>P(n(ne).name)),m(X,me)};F(tt,X=>{!n(Be)&&!n(Ze)&&n(o)&&X(it)})}$((X,me)=>{var Re;kt(Ie,1,`li-dot ${n(et)??""}`),fn(Ht,n(Be)?"color:var(--accent)":""),b(an,n(ne).name),b(_,`${X??""} - ${(Re=n(ne).meta)!=null&&Re.quant?" · "+n(ne).meta.quant:""} - ${me??""}`),fn(R,`white-space:nowrap;color:${n(Be)?"var(--on)":"var(--mut)"}`),b(ae,n(Se))},[()=>{var X;return(X=n(ne).meta)!=null&&X.ctx?Math.round(n(ne).meta.ctx/1024)+"k ctx":""},()=>{var X;return(X=n(ne).meta)!=null&&X.size_bytes?" · "+(n(ne).meta.size_bytes/1073741824).toFixed(1)+" GB":""}]),m(Oe,ze)}),m(S,G)},U=S=>{var G=sd(),Oe=s(l(G),4);C("click",Oe,()=>D("cookbook")),m(S,G)};F(_e,S=>{n(u).length?S(M):S(U,-1)})}var le=s(be,2),Je=l(le),Qe=s(l(Je),2),Qt=s(Je,2);{var Zt=S=>{var G=Zi();dt(G,21,()=>n(f),ot,(Oe,ne)=>{var Be=ld(),Ze=l(Be),et=l(Ze),Se=l(et),ze=s(et,2),Ie=l(ze);$(()=>{qr(Be,"href",n(ne).link),b(Se,n(ne).title),b(Ie,`${n(ne).source??""}${n(ne).relevant?" · für dich":""}`)}),m(Oe,Be)}),m(S,G)},Ut=S=>{var G=od();m(S,G)};F(Qt,S=>{n(f).length?S(Zt):S(Ut,-1)})}$(S=>{b(he,`${n(v)??""} `),b(A,n(g)),kt(re,1,`kpi ${n(o)?"green":"red"}`),b(Y,n(o)?"Online":"Offline"),b(L,S),kt(V,1,`kpi ${n(c)?"blue":"muted"}`),b(bt,n(c)?n(c).name:"Keins"),b(xe,n(u).length?n(u).length+" konfiguriert":"")},[()=>{var S,G;return((G=(S=n(a))==null?void 0:S.swap_url)==null?void 0:G.replace(/^https?:\/\//,""))??"—"}]),C("click",Qe,()=>D("news")),C("keydown",Qe,S=>S.key==="Enter"&&D("news")),m(e,Ae),aa()}ya(["click","keydown"]);var ud=k(""),vd=k('
'),pd=k('
Noch keine Modelle konfiguriert
Hol dir unter „Cookbook" ein passendes Modell.
'),fd=k('
kein Modell hinterlegt
leere Rolleleer '),hd=k(' '),gd=k('
'),md=k(' '),bd=k('
API-Name:
'),_d=k('
ModellKannDetailsStatusPortAktionen
'),wd=k('
Empfohlen für deine Hardware

'),kd=k(''),yd=k(''),xd=k(''),Sd=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 Md(e,t){na(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=O(()=>{var z;return((z=br.value)==null?void 0:z.models)||[]});function d(){document.dispatchEvent(new Event("mc:refresh"))}let c=I(""),u=I(""),v=I(""),g=I(!1);const E=O(()=>n(o).filter(z=>!z.incomplete));async function f(){var q;const z=n(c)||((q=n(E)[0])==null?void 0:q.name);if(!(!z||!n(u).trim())){h(g,!0),h(v,"(wecke Modell, kann beim Laden kurz dauern…)");try{const Ce=await Me("/api/chat",{method:"POST",body:JSON.stringify({model:z,message:n(u)})});h(v,Ce.reply,!0)}catch(Ce){h(v,"Fehler: "+Ce.message)}h(g,!1),d()}}const y=300;let T=I(!1),P=I(null),x=I(8192),D=I(!1);function ke(z){var q;h(P,n(o).find(Ce=>Ce.name===z),!0),n(P)&&(h(x,((q=n(P).meta)==null?void 0:q.ctx)||8192,!0),h(D,(n(P).ttl??y)>=99999),h(T,!0))}async function te(){const z=n(D)?99999:y;try{await Me("/api/update_model",{method:"POST",body:JSON.stringify({alias:n(P).name,ctx:n(x),ttl:z})}),ee("Gespeichert — aktiv beim nächsten Modell-Start."),h(T,!1),d()}catch(q){ee(q.message,!0)}}let ue=I(!1),Ae=I(""),K=I(""),W=I("");function pe(z){const q=n(o).find(Ce=>Ce.name===z);h(Ae,z,!0),h(W,(q==null?void 0:q.role)||"",!0),h(K,""),h(ue,!0)}async function he(z){try{await Me("/api/set_role",{method:"POST",body:JSON.stringify({alias:n(Ae),role:z})}),ee(z?`Rolle gesetzt: ${z}`:"Rolle entfernt."),h(ue,!1),d()}catch(q){ee(q.message,!0)}}async function De(z){if(await yn({title:`„${z}" 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(z),{method:"POST"}),ee("Entladen: "+z),setTimeout(d,600)}catch(q){ee(q.message,!0)}}async function We(z){if(await yn({title:`„${z}" 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 q=await Me("/api/delete_model",{method:"POST",body:JSON.stringify({alias:z})});ee(q.note||"Gelöscht: "+z),setTimeout(d,600)}catch(q){ee(q.message,!0)}}function mt(z){return z!=null&&z.length?z.map(q=>q==="Code"?'Code':q==="Bild"?'Bild':'Text').join(" "):"–"}function A(z){if(!z)return"–";const q=z.quant||"?",Ce=z.ctx?Math.round(z.ctx/1024)+"K":"?",ut=z.size_bytes?(z.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${q} · ${Ce} · ${ut}`}function H(z){var q;(q=navigator.clipboard)==null||q.writeText(z),ee("Kopiert: "+z)}var re=Sd(),Ve=s(ct(re),2),Q=s(l(Ve),6);dt(Q,21,()=>n(E),ot,(z,q)=>{var Ce=ud(),ut=l(Ce),N={};$(()=>{b(ut,n(q).name),N!==(N=n(q).name)&&(Ce.value=(Ce.__value=n(q).name)??"")}),m(z,Ce)});var $e=s(Q,4),Y=s($e,2),rt=l(Y),L=s(Y,2);{var V=z=>{var q=vd(),Ce=l(q);$(()=>b(Ce,n(v))),m(z,q)};F(L,z=>{n(v)&&z(V)})}var ie=s(Ve,2),ge=l(ie),Te=s(l(ge)),bt=l(Te),ft=s(ge,4);{var xt=z=>{var q=pd();m(z,q)},Ct=z=>{var q=_d(),Ce=s(l(q));dt(Ce,21,()=>n(o),ot,(ut,N)=>{var Le=or(),J=ct(Le);{var de=Z=>{var be=fd(),ve=l(be),ye=l(ve),xe=s(ve,5),_e=l(xe),M=s(_e,2);$(()=>b(ye,n(N).name)),C("click",_e,()=>{var U;ee("Lade im Cookbook ein Modell und setze den Alias auf: "+n(N).name),(U=document.querySelector(".nav-item[data-view='cookbook']"))==null||U.dispatchEvent(new MouseEvent("click"))}),C("click",M,()=>We(n(N).name)),m(Z,be)},se=Z=>{var be=bd(),ve=l(be),ye=l(ve),xe=l(ye),_e=s(xe);{var M=Se=>{var ze=hd(),Ie=l(ze);$(()=>b(Ie,n(N).role)),m(Se,ze)};F(_e,Se=>{n(N).role&&Se(M)})}var U=s(ye,2);{var le=Se=>{var ze=gd(),Ie=l(ze);$(()=>b(Ie,n(N).meta.filename)),m(Se,ze)};F(U,Se=>{var ze;(ze=n(N).meta)!=null&&ze.filename&&Se(le)})}var Je=s(U,2),Qe=s(l(Je),2);dt(Qe,17,()=>{var Se;return(Se=n(N).api_ids)!=null&&Se.length?n(N).api_ids:[n(N).name]},ot,(Se,ze)=>{var Ie=md(),It=l(Ie);$(()=>b(It,n(ze))),C("click",Ie,()=>H(n(ze))),m(Se,Ie)});var Qt=s(ve);Pe(Qt,()=>{var Se;return mt((Se=n(N).meta)==null?void 0:Se.caps)},!0);var Zt=s(Qt);Pe(Zt,()=>A(n(N).meta),!0);var Ut=s(Zt);Pe(Ut,()=>Wo(n(N).state,n(N).download_progress),!0);var S=s(Ut),G=l(S),Oe=s(S),ne=l(Oe),Be=s(ne,2),Ze=s(Be,2),et=s(Ze,2);$(()=>{b(xe,`${n(N).name??""} `),b(G,n(N).port??"auto")}),C("click",ne,()=>pe(n(N).name)),C("click",Be,()=>ke(n(N).name)),C("click",Ze,()=>De(n(N).name)),C("click",et,()=>We(n(N).name)),m(Z,be)};F(J,Z=>{n(N).incomplete?Z(de):Z(se,-1)})}m(ut,Le)}),m(z,q)};F(ft,z=>{n(o).length?z(Ct,-1):z(xt)})}var St=s(ie,2);{var Pt=z=>{var q=kd(),Ce=l(q),ut=l(Ce),N=s(ut,4),Le=l(N),J=s(N,2),de=s(l(J));Pe(de,()=>gi(a));var se=s(J,2),Z=s(se,2);{var be=le=>{var Je=wd(),Qe=l(Je),Qt=s(l(Qe),2),Zt=l(Qt),Ut=s(Zt,2),S=s(Qe,2);$((G,Oe)=>{b(Zt,`Optimal ~${G??""}k → ~${n(P).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),b(Ut,` Aktuell ~${Oe??""}k → ~${n(P).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(n(P).meta.optimal_ctx/1024),()=>Math.round((n(P).meta.ctx||0)/1024)]),C("click",S,()=>h(x,n(P).meta.optimal_ctx,!0)),m(le,Je)};F(Z,le=>{var Je;(Je=n(P).meta)!=null&&Je.optimal_ctx&&le(be)})}var ve=s(Z,4),ye=s(l(ve),2),xe=l(ye),_e=s(xe,2),M=l(_e),U=s(ve,2);$(()=>{b(Le,n(P).name),fn(_e,`color:${n(D)?"var(--accent)":"var(--mut)"}`),b(M,n(D)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),C("click",q,le=>{le.target.classList.contains("modal-overlay")&&h(T,!1)}),C("click",ut,()=>h(T,!1)),Tn(se,()=>n(x),le=>h(x,le)),Ro(xe,()=>n(D),le=>h(D,le)),C("click",U,te),m(z,q)};F(St,z=>{n(T)&&n(P)&&z(Pt)})}var Ot=s(St,2);{var Rt=z=>{var q=xd(),Ce=l(q),ut=l(Ce),N=s(ut,2),Le=s(l(N));Pe(Le,()=>gi(r));var J=s(N,2),de=l(J),se=s(J,4);dt(se,21,()=>i,ot,(xe,_e)=>{var M=yd(),U=l(M);$(()=>{kt(M,1,n(W)===n(_e).id?"primary":"ghost"),qr(M,"title",n(_e).desc),b(U,n(_e).label)}),C("click",M,()=>he(n(_e).id)),m(xe,M)});var Z=s(se,4),be=s(Z,2),ve=l(be),ye=s(ve,2);$(()=>b(de,n(Ae))),C("click",q,xe=>{xe.target.classList.contains("modal-overlay")&&h(ue,!1)}),C("click",ut,()=>h(ue,!1)),Tn(Z,()=>n(K),xe=>h(K,xe)),C("click",ve,()=>he("")),C("click",ye,()=>he(n(K).trim().toLowerCase())),m(z,q)};F(Ot,z=>{n(ue)&&z(Rt)})}$(()=>{Y.disabled=n(g),b(rt,n(g)?"…":"Senden"),b(bt,n(o).length?n(o).length+" konfiguriert":"")}),ar(Q,()=>n(c),z=>h(c,z)),Tn($e,()=>n(u),z=>h(u,z)),C("click",Y,f),m(e,re),aa()}ya(["click"]);var Ed=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),Ad=k(''),Td=k('
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
'),Cd=k(' '),zd=k(''),Pd=k(''),Dd=k('
'),$d=k('
'),Ld=k('
'),Od=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 Id(e,t){na(t,!0);const a=O(()=>da.value),r=O(()=>da.tracked),i=O(()=>Pi.value);let o=Vt({cpu:[],ram:[],gpu:[]});Ai(()=>{var re;if(!n(i))return;const A=n(i).gpu,H=A&&A.vram.total+A.gtt.total>0?(A.vram.used+A.gtt.used)/(A.vram.total+A.gtt.total)*100:0;o.cpu=[...o.cpu,((re=n(i).cpu)==null?void 0:re.percent)??0].slice(-60),o.ram=[...o.ram,n(i).ram.percent].slice(-60),o.gpu=[...o.gpu,H].slice(-60)});const d=O(()=>()=>{var H;const A=(H=n(i))==null?void 0:H.gpu;return A&&A.vram.total+A.gtt.total>0?(A.vram.used+A.gtt.used)/(A.vram.total+A.gtt.total)*100:0}),c=O(()=>n(a).filter(A=>A.state!=="running"&&A.state!=="queued").length),u=O(()=>n(a).filter(A=>A.state==="failed").length);function v(A){if(A.state!=="running")return null;if(typeof A.progress=="number")return Math.min(100,A.progress);const re=((A.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return re?Math.min(100,parseFloat(re[1])):null}function g(A){return A==null||A<0?"":A>=90?`noch ~${Math.round(A/60)} min`:`noch ~${Math.max(1,Math.round(A))} s`}function E(A){return A==="done"?'fertig':A==="failed"?'fehler':A==="canceled"?'abgebrochen':'läuft…'}function f(A){return A==="done"?"on":A==="failed"||A==="canceled"?"":"load"}async function y(A){try{await Me(`/api/jobs/${A}/cancel`,{method:"POST"}),ee("Abbruch angefordert…")}catch(H){ee(H.message,!0)}}async function T(A){try{await Me(`/api/jobs/${A}`,{method:"DELETE"})}catch(H){ee(H.message,!0)}}async function P(){try{const A=await Me("/api/jobs/clear",{method:"POST"});ee(`${A.removed} Einträge entfernt.`)}catch(A){ee(A.message,!0)}}function x(A,H){return A.map(re=>`
`).join("")}var D=Od(),ke=s(ct(D),2);{var te=A=>{const H=O(()=>n(d)());var re=Ed(),Ve=ct(re),Q=l(Ve),$e=s(l(Q),2),Y=l($e),rt=s($e,2),L=l(rt),V=s(Q,2),ie=s(l(V),2),ge=l(ie),Te=s(ie,2),bt=l(Te),ft=s(V,2),xt=s(l(ft),2),Ct=l(xt),St=s(xt,2),Pt=l(St),Ot=s(Ve,2),Rt=s(l(Ot),4),z=l(Rt),q=s(l(z)),Ce=l(q),ut=s(z,2),N=s(l(ut),2),Le=l(N),J=s(ut,2),de=s(l(J)),se=l(de),Z=s(J,2),be=s(l(Z),2),ve=l(be),ye=s(Rt,2),xe=l(ye),_e=s(l(xe));Pe(_e,()=>x(o.cpu,"--accent"),!0);var M=s(xe,2),U=s(l(M));Pe(U,()=>x(o.ram,"--purple"),!0);var le=s(M,2),Je=s(l(le));Pe(Je,()=>x(o.gpu,"--on"),!0),$((Qe,Qt,Zt,Ut,S,G,Oe,ne,Be,Ze,et,Se,ze)=>{b(Y,Qe),b(L,Qt),b(ge,Zt),b(bt,`${Ut??""} / ${S??""}`),b(Ct,G),b(Pt,Oe),b(Ce,`${ne??""} / ${Be??""}`),b(Le,Ze),b(se,`${et??""} % belegt`),b(ve,`${Se??""} / ${ze??""}`)},[()=>{var Qe;return Math.round(((Qe=n(i).cpu)==null?void 0:Qe.percent)??0)},()=>{var Qe;return((Qe=n(i).cpu)==null?void 0:Qe.temp)!=null?`${Math.round(n(i).cpu.temp)}° CPU-Temp`:"Auslastung"},()=>Math.round(n(i).ram.percent),()=>ia(n(i).ram.used),()=>ia(n(i).ram.total),()=>Math.round(n(H)),()=>n(i).gpu_temp!=null?`${Math.round(n(i).gpu_temp)}° GPU-Temp`:"VRAM + GTT",()=>ia(n(i).ram.used),()=>ia(n(i).ram.total),()=>n(i).gpu?`${ia(n(i).gpu.vram.used+n(i).gpu.gtt.used)} / ${ia(n(i).gpu.vram.total+n(i).gpu.gtt.total)}`:"–",()=>{var Qe;return Math.round(((Qe=n(i).disk)==null?void 0:Qe.percent)??0)},()=>n(i).gpu_temp!=null?Math.round(n(i).gpu_temp)+"°":"–",()=>{var Qe;return((Qe=n(i).cpu)==null?void 0:Qe.temp)!=null?Math.round(n(i).cpu.temp)+"°":"–"}]),m(A,re)};F(ke,A=>{n(i)&&A(te)})}var ue=s(ke,2),Ae=l(ue),K=s(l(Ae),2),W=l(K),pe=s(K,2);{var he=A=>{var H=Ad();C("click",H,P),m(A,H)};F(pe,A=>{n(c)&&A(he)})}var De=s(Ae,4);{var We=A=>{var H=Td();m(A,H)},mt=A=>{var H=or(),re=ct(H);dt(re,17,()=>n(a),ot,(Ve,Q)=>{const $e=O(()=>v(n(Q))),Y=O(()=>n(Q).state==="running"?g(n(Q).eta_s):""),rt=O(()=>n(Q).state==="running"&&n(Q).rate_bps?ia(n(Q).rate_bps)+"/s":""),L=O(()=>[n(Y),n(rt)].filter(Boolean).join(" · ")),V=O(()=>n(r).includes(n(Q).id));var ie=Ld(),ge=l(ie),Te=l(ge),bt=s(Te,2),ft=l(bt),xt=s(bt,2);{var Ct=N=>{var Le=Cd(),J=l(Le);$(de=>b(J,`${de??""} %${n(L)?` · ${n(L)}`:""}`),[()=>Math.round(n($e))]),m(N,Le)};F(xt,N=>{n($e)!=null&&N(Ct)})}var St=s(xt,2);{var Pt=N=>{var Le=zd();$(()=>fn(Le,`${n($e)==null?"margin-left:auto;":""}margin-right:2px;padding:2px 9px;font-size:12px`)),C("click",Le,J=>{J.stopPropagation(),y(n(Q).id)}),m(N,Le)},Ot=N=>{var Le=Pd();C("click",Le,J=>{J.stopPropagation(),T(n(Q).id)}),m(N,Le)};F(St,N=>{n(Q).state==="running"?N(Pt):N(Ot,-1)})}var Rt=s(St,2);Pe(Rt,()=>E(n(Q).state));var z=s(ge,2);{var q=N=>{var Le=Dd(),J=l(Le);$(()=>fn(J,`width:${n($e)??""}%`)),m(N,Le)};F(z,N=>{n($e)!=null&&n(Q).state==="running"&&N(q)})}var Ce=s(z,2);{var ut=N=>{var Le=$d(),J=l(Le);$(de=>b(J,de),[()=>(n(Q).log||[]).join(` -`)]),m(N,Le)};F(Ce,N=>{n(V)&&N(ut)})}$(N=>{kt(Te,1,`li-dot ${N??""}`),b(ft,n(Q).label)},[()=>f(n(Q).state)]),C("click",ge,()=>da.toggle(n(Q).id)),C("keydown",ge,N=>N.key==="Enter"&&da.toggle(n(Q).id)),m(Ve,ie)}),m(A,H)};F(De,A=>{n(a).length?A(mt,-1):A(We)})}$(()=>b(W,n(a).length?n(u)?n(u)+" Fehler":n(a).length+" gesamt":"")),m(e,D),aa()}ya(["click","keydown"]);var Rd=k(' '),Bd=k(''),Fd=k('✓ fertig'),Nd=k('✗ fehlgeschlagen'),qd=k('abgebrochen'),Kd=k('läuft…'),Gd=k('
'),Wd=k('

Aktueller Vorgang

'),Vd=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 Ud(e,t){na(t,!0);const a=O(()=>br.value),r=O(()=>da.value);let i=null,o=I(`Verbinde… -`),d=I("llama-swap"),c,u=I(null),v=I("");const g=new Set,E=O(()=>n(u)?n(r).find(M=>M.id===n(u)):null);Ai(()=>{if(!n(E))return;const M=n(E),U=M.state==="done",le=M.state==="failed",Je=M.state==="canceled";(U||le||Je)&&!g.has(M.id)&&(g.add(M.id),ee(U?`✓ ${n(v)} abgeschlossen.`:Je?`${n(v)} abgebrochen.`:`✗ ${n(v)} fehlgeschlagen.`,le),U&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function f(M,U){h(u,M,!0),h(v,U,!0),da.track(M)}mr(()=>{y()}),Fo(()=>{i==null||i.close()});function y(){i==null||i.close();const M=n(d);h(o,`Verbinde mit ${M}… -`);const U=location.protocol==="https:"?"wss:":"ws:";i=new WebSocket(`${U}//${location.host}/api/logs/${M}?token=${encodeURIComponent(el())}`),i.onmessage=le=>{h(o,n(o)+le.data),c&&(c.scrollTop=c.scrollHeight)},i.onclose=()=>{h(o,n(o)+` -— Verbindung getrennt —`)},i.onerror=()=>i==null?void 0:i.close()}async function T(M,U,le){if(await yn({title:U,body:le,confirmLabel:"Neustarten"}))try{await Me(`/api/service/${M}/restart`,{method:"POST"}),ee("Neustart ausgelöst: "+M),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(Je){ee(Je.message,!0)}}async function P(){if(await yn({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 M=await Me("/api/self-update",{method:"POST"});ee("Update läuft — Dashboard startet gleich neu."),f(M.job_id,"Mission Control Update")}catch(M){ee(M.message,!0)}}async function x(){if(await yn({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 M=await Me("/api/update",{method:"POST"});ee("LLM-Engine-Update läuft."),f(M.job_id,"LLM-Engine-Update")}catch(M){ee(M.message,!0)}}async function D(){if(await yn({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(M){ee(M.message,!0)}}async function ke(){if(!await yn({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 M=await Hi({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(M)try{const U=await Me("/api/os-update",{method:"POST",body:JSON.stringify({password:M})});ee("OS-Update gestartet."),f(U.job_id,"OS-Update")}catch(U){ee(U.message,!0)}}async function te(){if(!await yn({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 M=await Hi({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(M)try{await Me("/api/reboot",{method:"POST",body:JSON.stringify({password:M})}),ee("Reboot ausgelöst — bis gleich.")}catch(U){ee(U.message,!0)}}async function ue(){h(Ae,"prüfe…");try{const M=await Me("/api/integration/test");h(Ae,M.ok?`✓ Engine antwortet — ${M.models.length} Modell(e): ${M.models.join(", ")}`:`✗ keine Verbindung: ${M.error}`,!0),h(K,M.ok,!0)}catch(M){h(Ae,"✗ "+M.message),h(K,!1)}}let Ae=I(""),K=I(!1);const W=O(()=>{var M;return((M=n(a))==null?void 0:M.models)||[]}),pe=["running","ready","loading","starting"],he=O(()=>n(W).find(M=>pe.includes(M.state)));function De(M){if(!M||M.state!=="running")return null;if(typeof M.progress=="number")return Math.min(100,M.progress);const le=((M.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return le?Math.min(100,parseFloat(le[1])):null}var We=Vd(),mt=s(ct(We),2),A=l(mt),H=s(l(A),2),re=l(H),Ve=s(A,4),Q=l(Ve),$e=s(l(Q)),Y=l($e),rt=s(Q,2),L=s(l(rt),2),V=l(L),ie=s(rt,2),ge=s(l(ie),2),Te=l(ge),bt=s(Ve,2),ft=l(bt),xt=s(ft,2);{var Ct=M=>{var U=Rd(),le=l(U);$(()=>{fn(U,`color:${n(K)?"#7ee29a":"#ff9b95"}`),b(le,n(Ae))}),m(M,U)};F(xt,M=>{n(Ae)&&M(Ct)})}var St=s(mt,2),Pt=s(l(St),4),Ot=s(Pt,2),Rt=s(Ot,2),z=s(Rt,2),q=s(z,2),Ce=s(St,2),ut=s(l(Ce),4),N=s(ut,2),Le=s(Ce,2);{var J=M=>{const U=O(()=>n(E)),le=O(()=>n(U).state==="done"),Je=O(()=>n(U).state==="failed"),Qe=O(()=>n(U).state==="canceled"),Qt=O(()=>n(le)||n(Je)||n(Qe)),Zt=O(()=>De(n(U)));var Ut=Wd(),S=l(Ut),G=s(l(S),2);{var Oe=Ke=>{var ht=Bd();C("click",ht,async()=>{await yn({title:n(v)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&Me(`/api/jobs/${n(U).id}/cancel`,{method:"POST"})}),m(Ke,ht)};F(G,Ke=>{n(Qt)||Ke(Oe)})}var ne=s(G,2),Be=l(ne);{var Ze=Ke=>{var ht=Fd();m(Ke,ht)},et=Ke=>{var ht=Nd();m(Ke,ht)},Se=Ke=>{var ht=qd();m(Ke,ht)},ze=Ke=>{var ht=Kd();m(Ke,ht)};F(Be,Ke=>{n(le)?Ke(Ze):n(Je)?Ke(et,1):n(Qe)?Ke(Se,2):Ke(ze,-1)})}var Ie=s(S,2),It=l(Ie),Bt=s(Ie,2);{var Ht=Ke=>{var ht=Gd(),In=l(ht);$(()=>fn(In,`width:${n(Zt)??""}%`)),m(Ke,ht)};F(Bt,Ke=>{n(Zt)!=null&&!n(Qt)&&Ke(Ht)})}var an=s(Bt,2),bn=l(an);$(Ke=>{b(It,`${n(v)??""}${n(Qt)?n(le)?" — erfolgreich.":n(Qe)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),b(bn,Ke)},[()=>(n(U).log||[]).join(` -`)]),m(M,Ut)};F(Le,M=>{n(E)&&M(J)})}var de=s(Le,2),se=l(de),Z=s(l(se),2),be=l(Z);be.value=be.__value="llama-swap";var ve=s(be);ve.value=ve.__value="mission-control";var ye=s(ve);ye.value=ye.__value="system";var xe=s(se,4),_e=l(xe);Bo(xe,M=>c=M,()=>c),$(M=>{var U,le,Je;fn(H,`margin-left:auto;${(U=n(a))!=null&&U.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"}`),b(re,(le=n(a))!=null&&le.swap_ok?"● erreichbar":"● offline"),b(Y,(((Je=n(a))==null?void 0:Je.swap_url)||"—")+"/v1"),b(V,n(he)?n(he).name+` (${n(he).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),b(Te,M),b(_e,n(o))},[()=>n(W).filter(M=>!M.incomplete).length||"keine"]),C("click",ft,ue),C("click",Pt,()=>T("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),C("click",Ot,()=>T("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),C("click",Rt,P),C("click",z,x),C("click",q,D),C("click",ut,ke),C("click",N,te),C("change",Z,y),ar(Z,()=>n(d),M=>h(d,M)),m(e,We),aa()}ya(["click","change"]);var Hd=k('
Lade Setups…
'),jd=k(' ×',1),Xr=k('
★ Beste Wahl für dein System
'),Jd=k('
Dein Setup
'),Qd=k(''),Zd=k('
'),Yd=k('· ⚠ Cache veraltet'),Xd=k(" ",1),ec=k('
Frage Quellen ab…
'),tc=k('
'),nc=k('✓ installiert'),ac=k(''),rc=k('

'),ic=k('

'),sc=k(''),lc=k('

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

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 Tc(e,t){na(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(w){const _=(w||"").toLowerCase();for(const B of d)if(B.kw.some(R=>_.includes(R)))return B.label;return"Allrounder"}function u(w=""){const _=w.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(_)||new RegExp("(?{bt(),ft()});async function bt(){h(P,!0);try{const w=await Me("/api/cookbook/recipes");h(y,w.recipes||[],!0),h(T,w.recommended_id||null,!0)}catch(w){ee(w.message,!0)}h(P,!1)}async function ft(w=!1){h(D,!0);try{const _=await Me("/api/cookbook/discover"+(w?"?force=true":""));h(x,_,!0),h(ke,_.stale,!0)}catch(_){ee("Empfehlungen nicht ladbar: "+_.message,!0)}h(D,!1)}function xt(w){w=w.trim();const _=w.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return _?_[1]:/^[\w.-]+\/[\w.-]+$/.test(w)?w:null}async function Ct(){const w=n(te).trim(),_=xt(w);let B=w;if(n(K)&&!_&&(B=B?B+" "+n(K):n(K)),!B&&!_){h(ue,[],!0);return}h(Ae,!0),h(pe,[],!0),h(he,-1);try{if(_)h(ue,[{id:_,author:_.split("/")[0],downloads:0}],!0);else{const R=`https://huggingface.co/api/models?search=${encodeURIComponent(B)}&filter=gguf&sort=${encodeURIComponent(n(W))}&direction=-1&limit=40`,ae=await fetch(R);h(ue,await ae.json(),!0)}n(ue).forEach((R,ae)=>St(ae,R.id))}catch(R){ee(R.message,!0),h(ue,[],!0)}h(Ae,!1)}async function St(w,_){var B;try{const R=await Me("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:_,ctx:8192})});if(!((B=R.files)!=null&&B.length)){n(pe)[w]=null,Pt();return}const ae=R.files.find(tt=>{var it;return(it=tt.quant)==null?void 0:it.includes("Q4_K_M")})||R.files[0];n(pe)[w]=ae.fit.level,Pt()}catch{n(pe)[w]=null,Pt()}}function Pt(){let w=-1,_=99;n(pe).forEach((B,R)=>{if(B==null)return;const ae=i[B]??99;ae<_&&(_=ae,w=R)}),h(he,w>=0&&_<=1?w:-1,!0)}function Ot(w){h(De,n(y).find(_=>_.id===w),!0)}async function Rt(w){const _=document.getElementById("cb-r-install-btn");_&&(_.disabled=!0,_.textContent="Starte…");try{const B=await Me("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:w,hf_token:ir()})});ee(`${B.count} Download${B.count!==1?"s":""} läuft — Modelle erscheinen danach automatisch im Modelle-Tab.`),h(De,null),Te("activity")}catch(B){ee(B.message,!0),_&&(_.disabled=!1,_.textContent="Installieren")}}async function z(w,_){var B,R;h(We,!0),h(mt,_,!0),h(A,w,!0),h(Ve,""),h(Q,8192),h(H,null),h(Y,null),h(re,""),h($e,!0);try{if(h(H,await Me("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:w,ctx:8192})}),!0),(R=(B=n(H))==null?void 0:B.files)!=null&&R.length){const ae=n(H).files.find(tt=>{var it;return(it=tt.quant)==null?void 0:it.includes("Q4_K_M")})||n(H).files[0];h(re,ae.filename,!0),ae.optimal_ctx&&n(Q)===8192&&h(Q,ae.optimal_ctx,!0),q()}}catch(ae){ee(ae.message,!0)}h($e,!1)}function q(){var w,_,B;!((_=(w=n(H))==null?void 0:w.files)!=null&&_.length)||!n(re)||(h(Y,n(H).files.find(R=>R.filename===n(re))||null,!0),(B=n(Y))!=null&&B.optimal_ctx&&n(Q)===8192&&h(Q,n(Y).optimal_ctx,!0))}async function Ce(){var w,_;if(!n(A)||!n(re))return ee("Bitte eine GGUF-Datei wählen.",!0);h($e,!0);try{const B=((w=n(H))==null?void 0:w.params_b)??7,R=((_=n(Y))==null?void 0:_.quant)??"Q4_K_M";await Me("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:n(A),role:n(Ve),params_b:B,quant:R,file:n(re),ctx:n(Q),hf_token:ir()})}),ee("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),h(We,!1),Te("activity")}catch(B){ee("Fehler: "+B.message,!0)}h($e,!1)}async function ut(w,_,B,R){R.disabled=!0,R.textContent="Starte…";try{await Me("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:w,role:_,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(){h(ge,null),h(L,""),h(V,""),h(ie,[{repo:"",role:"",quant:"Q4_K_M"}],!0),h(rt,!0)}function Le(w){const _=n(y).find(B=>B.id===w);_&&(h(ge,w,!0),h(L,_.title,!0),h(V,_.desc||"",!0),h(ie,_.models.map(B=>({repo:B.repo,role:B.role,quant:B.quant||"Q4_K_M"})),!0),h(rt,!0))}async function J(){if(!n(L).trim())return ee("Bitte einen Titel angeben.",!0);const w=n(ie).filter(_=>_.repo.trim());if(!w.length)return ee("Mindestens ein Modell (Repo) angeben.",!0);try{n(ge)?(await Me("/api/cookbook/user-recipe/"+encodeURIComponent(n(ge)),{method:"PUT",body:JSON.stringify({title:n(L),desc:n(V),models:w})}),ee("Setup aktualisiert.")):(await Me("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:n(L),desc:n(V),models:w})}),ee("Setup gespeichert.")),h(rt,!1),bt()}catch(_){ee(_.message,!0)}}async function de(w){const _=n(y).find(B=>B.id===w);if(await yn({title:`„${(_==null?void 0:_.title)||w}" 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(w),{method:"DELETE"}),ee("Setup gelöscht."),bt()}catch(B){ee(B.message,!0)}}function se(w){if(!u(w))return"";const _=v(w);return`MoE${_?` · ~${_}B aktiv`:""}`}function Z(w){return w?`${$n(w)}`:""}var be=Ac(),ve=s(ct(be),2),ye=l(ve),xe=s(l(ye),2),_e=s(ye,4);{var M=w=>{var _=Hd();m(w,_)},U=w=>{var _=Zd();dt(_,21,()=>n(y),ot,(B,R)=>{const ae=O(()=>n(R).id===n(T));var tt=Qd(),it=l(tt);{var X=fe=>{var Ye=jd(),Nt=ct(Ye),At=s(Nt,2);C("click",Nt,_t=>{_t.stopPropagation(),Le(n(R).id)}),C("keydown",Nt,_t=>{_t.key==="Enter"&&(_t.stopPropagation(),Le(n(R).id))}),C("click",At,_t=>{_t.stopPropagation(),de(n(R).id)}),C("keydown",At,_t=>{_t.key==="Enter"&&(_t.stopPropagation(),de(n(R).id))}),m(fe,Ye)};F(it,fe=>{n(R).user&&fe(X)})}var me=s(it,2);{var Re=fe=>{var Ye=Xr();m(fe,Ye)},vt=fe=>{var Ye=Jd();m(fe,Ye)};F(me,fe=>{n(ae)?fe(Re):n(R).user&&fe(vt,1)})}var Fe=s(me,2),Ge=l(Fe),st=l(Ge),Mt=l(st),Yt=s(Ge,2),pt=l(Yt),Ne=s(Fe,2),Et=l(Ne),Ft=s(Ne,2),gt=l(Ft);$((fe,Ye)=>{kt(tt,1,`card-btn${n(ae)?" cb-best":""}`),b(Mt,n(R).title),kt(Yt,1,`fit-badge ${fe??""}`),b(pt,Ye),b(Et,n(R).desc),b(gt,`${n(R).models.length??""} Modell${n(R).models.length>1?"e":""} im Setup`)},[()=>g(n(R).fit_level),()=>E(n(R).fit_level)]),C("click",tt,()=>Ot(n(R).id)),m(B,tt)}),m(w,_)};F(_e,w=>{n(P)?w(M):w(U,-1)})}var le=s(ve,2),Je=l(le),Qe=s(l(Je),2),Qt=l(Qe);{var Zt=w=>{const _=O(()=>Math.round((Date.now()/1e3-n(x).updated)/60));var B=Xd(),R=ct(B);{var ae=Re=>{var vt=nr();$(()=>b(vt,`Quellen befragt vor ${n(_)??""} min`)),m(Re,vt)},tt=Re=>{var vt=nr();$(Fe=>b(vt,`Quellen befragt vor ${Fe??""} h`),[()=>Math.round(n(_)/60)]),m(Re,vt)},it=Re=>{var vt=nr();$(Fe=>b(vt,`Quellen befragt vor ${Fe??""} Tg.`),[()=>Math.round(n(_)/1440)]),m(Re,vt)};F(R,Re=>{n(_)<60?Re(ae):n(_)<1440?Re(tt,1):Re(it,-1)})}var X=s(R,2);{var me=Re=>{var vt=Yd();m(Re,vt)};F(X,Re=>{n(ke)&&Re(me)})}m(w,B)};F(Qt,w=>{var _;(_=n(x))!=null&&_.updated&&w(Zt)})}var Ut=s(Qe,2),S=l(Ut),G=s(Je,4);{var Oe=w=>{var _=ec();m(w,_)},ne=w=>{var _=or(),B=ct(_);dt(B,17,()=>n(x).categories,ot,(R,ae)=>{var tt=ic(),it=l(tt),X=l(it),me=l(X),Re=s(it,2);dt(Re,21,()=>n(ae).models,ot,(vt,Fe)=>{const Ge=O(()=>n(ae).recommended&&n(Fe).repo===n(ae).recommended);var st=rc(),Mt=l(st);{var Yt=Xe=>{var at=Xr();m(Xe,at)};F(Mt,Xe=>{n(Ge)&&Xe(Yt)})}var pt=s(Mt,2),Ne=l(pt),Et=l(Ne),Ft=l(Et),gt=s(Et,2),fe=l(gt),Ye=s(Ne,2),Nt=l(Ye),At=s(pt,2),_t=l(At);Pe(_t,()=>Z(o[n(Fe).role]||c(n(Fe).repo)));var Rn=s(_t,2);Pe(Rn,()=>se(n(Fe).repo));var Un=s(At,2),En=l(Un),xa=s(Un,2);dt(xa,17,()=>n(Fe).requirements||[],ot,(Xe,at)=>{var zt=tc(),An=l(zt);$(()=>b(An,`⚠ ${n(at)??""}`)),m(Xe,zt)});var lt=s(xa,4),Ue=l(lt);{var nt=Xe=>{var at=nc();$(()=>qr(at,"title",`bereits eingerichtet als ${n(Fe).installed??""}`)),m(Xe,at)},wt=Xe=>{var at=ac();C("click",at,zt=>ut(n(Fe).repo,n(Fe).role,n(Fe).params_b,zt.currentTarget)),m(Xe,at)};F(Ue,Xe=>{n(Fe).installed?Xe(nt):Xe(wt,-1)})}$((Xe,at,zt)=>{kt(st,1,`card${n(Ge)?" res-best":""}`),b(Ft,n(Fe).name),b(fe,`${n(Fe).author??""} · ${n(Fe).params_b??""}B`),kt(Ye,1,`fit-badge ${Xe??""}`),b(Nt,n(Fe).fit.text),b(En,`${at??""} · ⬇ ${zt??""}`)},[()=>g(n(Fe).fit.level),()=>f(n(Fe).fit),()=>(n(Fe).downloads||0).toLocaleString()]),m(vt,st)}),$(()=>b(me,n(ae).title)),m(R,tt)}),m(w,_)};F(G,w=>{var _;n(D)&&!n(x)?w(Oe):(_=n(x))!=null&&_.categories&&w(ne,1)})}var Be=s(le,2),Ze=s(l(Be),4),et=l(Ze),Se=s(et,2),ze=l(Se);ze.value=ze.__value="downloads";var Ie=s(ze);Ie.value=Ie.__value="trending";var It=s(Ie);It.value=It.__value="created_at";var Bt=s(Se,2),Ht=l(Bt),an=s(Ze,2);dt(an,20,()=>["","coder","vision","reasoning","chat","agent"],ot,(w,_)=>{var B=sc(),R=l(B);$(()=>{kt(B,1,n(K)===_?"primary":"ghost"),b(R,_||"Alle")}),C("click",B,()=>{h(K,_,!0),Ct()}),m(w,B)});var bn=s(an,2);{var Ke=w=>{var _=oc();dt(_,21,()=>n(ue),ot,(B,R,ae)=>{var tt=lc(),it=l(tt);{var X=At=>{var _t=Xr();m(At,_t)};F(it,At=>{ae===n(he)&&At(X)})}var me=s(it,2),Re=l(me),vt=l(Re),Fe=l(vt),Ge=s(vt,2),st=l(Ge),Mt=s(Re,2),Yt=l(Mt),pt=s(me,2),Ne=l(pt);Pe(Ne,()=>Z(c(n(R).id)));var Et=s(Ne,2);Pe(Et,()=>se(n(R).id));var Ft=s(pt,4),gt=l(Ft),fe=l(gt),Ye=s(gt,2),Nt=l(Ye);$((At,_t,Rn,Un,En)=>{kt(tt,1,`card${ae===n(he)?" res-best":""}`),b(Fe,At),b(st,n(R).author||""),kt(Mt,1,`fit-badge ${_t??""}`),b(Yt,Rn),b(fe,Un),b(Nt,`⬇ ${En??""}`)},[()=>n(R).id.split("/").pop(),()=>n(pe)[ae]?g(n(pe)[ae]):"warn",()=>n(pe)[ae]?E(n(pe)[ae]):"prüfe…",()=>n(pe)[ae]?f({req_gb:0,tps:0}):"Hardware-Fit…",()=>(n(R).downloads||0).toLocaleString()]),C("click",tt,()=>z(n(R).id,n(R).id.split("/").pop())),m(B,tt)}),m(w,_)};F(bn,w=>{n(ue).length&&w(Ke)})}var ht=s(Be,2);{var In=w=>{const _=O(()=>n(De));var B=gc(),R=l(B),ae=l(R),tt=s(ae,2),it=l(tt),X=s(tt,2),me=l(X),Re=s(X,2);dt(Re,21,()=>n(_).models,ot,(pt,Ne)=>{var Et=vc(),Ft=l(Et),gt=l(Ft),fe=l(gt),Ye=l(fe),Nt=s(fe,2),At=l(Nt),_t=s(Nt,2);Pe(_t,()=>se(n(Ne).repo));var Rn=s(gt,2);{var Un=nt=>{var wt=dc(),Xe=l(wt);$(()=>b(Xe,n(Ne).why)),m(nt,wt)};F(Rn,nt=>{n(Ne).why&&nt(Un)})}var En=s(Rn,2);{var xa=nt=>{var wt=cc(),Xe=l(wt);$((at,zt,An)=>b(Xe,`~${at??""} GB · ~${zt??""} Tok/s · optimal ~${An??""}k Kontext`),[()=>(n(Ne).fit.req_gb??0).toFixed(1),()=>Math.round(n(Ne).fit.tps??0),()=>Math.round((n(Ne).optimal_ctx||8192)/1024)]),m(nt,wt)};F(En,nt=>{n(Ne).fit&&nt(xa)})}var lt=s(Ft,2);{var Ue=nt=>{var wt=uc(),Xe=l(wt);$(at=>{kt(wt,1,`fit-badge ${at??""}`),b(Xe,n(Ne).fit.text)},[()=>g(n(Ne).fit.level)]),m(nt,wt)};F(lt,nt=>{n(Ne).fit&&nt(Ue)})}$(()=>{b(Ye,n(Ne).name),b(At,n(Ne).role)}),m(pt,Et)});var vt=s(Re,2);{var Fe=pt=>{const Ne=O(()=>Math.max(...n(_).models.map(fe=>{var Ye;return((Ye=fe.fit)==null?void 0:Ye.req_gb)??0})));var Et=pc(),Ft=s(l(Et)),gt=l(Ft);$(fe=>b(gt,`~${fe??""} GB`),[()=>n(Ne).toFixed(1)]),m(pt,Et)};F(vt,pt=>{n(_).models.length&&n(_).models[0].fit&&pt(Fe)})}var Ge=s(vt,2);{var st=pt=>{const Ne=O(()=>n(y).find(fe=>!fe.user&&fe.fit_level!=="too_tight"&&fe.id!==n(_).id));var Et=hc(),Ft=s(l(Et));{var gt=fe=>{var Ye=fc(),Nt=s(ct(Ye)),At=l(Nt);$(()=>b(At,`„${n(Ne).title??""}" ansehen`)),C("click",Nt,_t=>{_t.preventDefault(),h(De,null),setTimeout(()=>Ot(n(Ne).id),50)}),m(fe,Ye)};F(Ft,fe=>{n(Ne)&&fe(gt)})}m(pt,Et)};F(Ge,pt=>{n(_).fit_level==="too_tight"&&pt(st)})}var Mt=s(Ge,2),Yt=l(Mt);$(()=>{b(it,n(_).title),b(me,n(_).desc),kt(Mt,1,`primary${n(_).fit_level==="too_tight"?" warn":""}`),b(Yt,n(_).fit_level==="too_tight"?"Trotzdem installieren (nicht empfohlen)":"Komplettes Setup installieren")}),C("click",B,pt=>{pt.target.classList.contains("modal-overlay")&&h(De,null)}),C("click",ae,()=>h(De,null)),C("click",Mt,()=>Rt(n(_).id)),m(w,B)};F(ht,w=>{n(De)&&w(In)})}var Wn=s(ht,2);{var ra=w=>{var _=Sc(),B=l(_),R=l(B),ae=s(R,2),tt=l(ae),it=s(ae,2),X=l(it),me=s(it,2);{var Re=Ge=>{var st=mc();m(Ge,st)},vt=Ge=>{var st=yc(),Mt=s(ct(st),2);dt(Mt,21,()=>n(H).files,ot,(lt,Ue)=>{const nt=O(()=>n(Ue).fit.level==="perfect"?"●":n(Ue).fit.level==="marginal"?"◐":"○");var wt=Yi(),Xe=l(wt),at={};$(()=>{b(Xe,`${n(nt)??""} ${n(Ue).filename??""}`),at!==(at=n(Ue).filename)&&(wt.value=(wt.__value=n(Ue).filename)??"")}),m(lt,wt)});var Yt=s(Mt,2),pt=l(Yt),Ne=s(l(pt),2),Et=s(pt,2),Ft=l(Et),gt=s(l(Ft));Pe(gt,()=>gi(a));var fe=s(Ft,2),Ye=s(Yt,2);{var Nt=lt=>{var Ue=bc(),nt=s(l(Ue)),wt=l(nt),Xe=s(nt,2);$(at=>b(wt,`~${at??""}k`),[()=>Math.round(n(Y).optimal_ctx/1024)]),C("click",Xe,at=>{at.preventDefault(),h(Q,n(Y).optimal_ctx,!0)}),m(lt,Ue)};F(Ye,lt=>{var Ue;(Ue=n(Y))!=null&&Ue.optimal_ctx&<(Nt)})}var At=s(Ye,2);{var _t=lt=>{var Ue=_c(),nt=l(Ue),wt=s(l(nt),2),Xe=l(wt),at=s(nt,2),zt=l(at);$((An,_r,Wr)=>{b(Xe,`~${An??""} GB · ~${_r??""} Tok/s · ${(n(Y).quant||"GGUF")??""}`),kt(at,1,`fit-badge ${Wr??""}`),b(zt,n(Y).fit.text)},[()=>(n(Y).fit.req_gb??0).toFixed(1),()=>Math.round(n(Y).fit.tps??0),()=>g(n(Y).fit.level)]),m(lt,Ue)};F(At,lt=>{n(Y)&<(_t)})}var Rn=s(At,2);{var Un=lt=>{const Ue=O(()=>n(H).files.find(zt=>zt.fit.level!=="too_tight"&&zt.filename!==n(re)));var nt=or(),wt=ct(nt);{var Xe=zt=>{var An=wc(),_r=s(l(An)),Wr=l(_r);$(Vr=>b(Wr,`${n(Ue).filename??""} (${Vr??""})`),[()=>E(n(Ue).fit.level)]),C("click",_r,Vr=>{Vr.preventDefault(),h(re,n(Ue).filename,!0),q()}),m(zt,An)},at=zt=>{var An=kc();m(zt,An)};F(wt,zt=>{n(Ue)?zt(Xe):zt(at,-1)})}m(lt,nt)};F(Rn,lt=>{var Ue,nt;((Ue=n(Y))==null?void 0:Ue.fit.level)==="too_tight"&&((nt=n(H))!=null&&nt.files)&<(Un)})}var En=s(Rn,2),xa=l(En);$(()=>{var lt,Ue;kt(En,1,`primary${((lt=n(Y))==null?void 0:lt.fit.level)==="too_tight"?" warn":""}`),En.disabled=n($e),b(xa,n($e)?"Starte…":((Ue=n(Y))==null?void 0:Ue.fit.level)==="too_tight"?"Trotzdem holen (zu groß — nicht empfohlen)":"Herunterladen & Einpflegen")}),C("change",Mt,q),ar(Mt,()=>n(re),lt=>h(re,lt)),Tn(Ne,()=>n(Ve),lt=>h(Ve,lt)),Tn(fe,()=>n(Q),lt=>h(Q,lt)),C("click",En,Ce),m(Ge,st)},Fe=Ge=>{var st=xc();m(Ge,st)};F(me,Ge=>{var st,Mt;n($e)&&!n(H)?Ge(Re):(Mt=(st=n(H))==null?void 0:st.files)!=null&&Mt.length?Ge(vt,1):n($e)||Ge(Fe,2)})}$(()=>{b(tt,n(mt)),b(X,n(A))}),C("click",_,Ge=>{Ge.target.classList.contains("modal-overlay")&&h(We,!1)}),C("click",R,()=>h(We,!1)),m(w,_)};F(Wn,w=>{n(We)&&w(ra)})}var Vn=s(Wn,2);{var Va=w=>{var _=Ec(),B=l(_),R=l(B),ae=s(R,2),tt=l(ae),it=s(ae,6),X=s(it,4),me=s(X,4);dt(me,17,()=>n(ie),ot,(Ge,st,Mt)=>{var Yt=Mc(),pt=l(Yt),Ne=s(pt,2),Et=s(Ne,2);dt(Et,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],ot,(gt,fe)=>{var Ye=Yi(),Nt=l(Ye),At={};$(()=>{b(Nt,fe),At!==(At=fe)&&(Ye.__value=fe)}),m(gt,Ye)});var Ft=s(Et,2);Tn(pt,()=>n(st).repo,gt=>n(st).repo=gt),Tn(Ne,()=>n(st).role,gt=>n(st).role=gt),ar(Et,()=>n(st).quant,gt=>n(st).quant=gt),C("click",Ft,()=>h(ie,n(ie).filter((gt,fe)=>fe!==Mt),!0)),m(Ge,Yt)});var Re=s(me,2),vt=s(Re,4),Fe=l(vt);$(()=>{b(tt,n(ge)?"Setup bearbeiten":"Eigenes Setup erstellen"),b(Fe,n(ge)?"Änderungen speichern":"Setup speichern")}),C("click",_,Ge=>{Ge.target.classList.contains("modal-overlay")&&h(rt,!1)}),C("click",R,()=>h(rt,!1)),Tn(it,()=>n(L),Ge=>h(L,Ge)),Tn(X,()=>n(V),Ge=>h(V,Ge)),C("click",Re,()=>h(ie,[...n(ie),{repo:"",role:"",quant:"Q4_K_M"}],!0)),C("click",vt,J),m(w,_)};F(Vn,w=>{n(rt)&&w(Va)})}$(()=>{Ut.disabled=n(D),b(S,n(D)?"Suche…":"Aktualisieren"),Bt.disabled=n(Ae),b(Ht,n(Ae)?"Lade…":"Suchen")}),C("click",xe,N),C("click",Ut,()=>ft(!0)),C("keydown",et,w=>w.key==="Enter"&&Ct()),Tn(et,()=>n(te),w=>h(te,w)),ar(Se,()=>n(W),w=>h(W,w)),C("click",Bt,Ct),m(e,be),aa()}ya(["click","keydown","change"]);var Cc=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.
`),zc=k(' '),Pc=k('
'),Dc=k(' '),$c=k(''),Lc=k(''),Oc=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),Ic=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),Rc=k('

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

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

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

',1),Fc=k('

Bilder einbinden (Vision)

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

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),qc=k('

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=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?

',1);function Gc(e,t){na(t,!0);const a=O(()=>br.value),r=O(()=>{var L;return(((L=n(a))==null?void 0:L.models)||[]).filter(V=>!V.incomplete)}),i=O(v);let o=I("zed"),d=I(Vt([])),c=I(""),u=I(!1);function v(){return`http://${location.hostname}:8080/v1`}function g(L){return/^\d{1,3}(\.\d{1,3}){3}$/.test(L)}function E(){return location.protocol==="https:"||!g(location.hostname)}const f=O(()=>n(d).length?n(d):n(r).map(L=>L.name)),y=O(()=>n(f)[0]||"coder"),T=O(()=>{var L;return(L=n(r).find(V=>{var ie,ge;return(ge=(ie=V.meta)==null?void 0:ie.caps)==null?void 0:ge.includes("Bild")}))==null?void 0:L.name});function P(L,V){const ge=(V.length?n(r).filter(Te=>V.includes(Te.name)):n(r).length?n(r):[{name:"coder",meta:{}}]).map(Te=>{var xt,Ct;const bt=(((xt=Te.meta)==null?void 0:xt.caps)||[]).some(St=>/Bild|Vision/i.test(St)),ft=((Ct=Te.meta)==null?void 0:Ct.ctx)||131072;return` { "name": "${Te.name}", "display_name": "${Te.name}", "max_tokens": ${ft}${bt?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`, + +
`;const u=c.querySelector("input"),v=g=>{c.remove(),d(g)};c.addEventListener("click",g=>{if(g.target===c)return v(null);const E=g.target.closest("[data-x]");E&&v(E.getAttribute("data-x")==="1"?u.value||"":null)}),u.addEventListener("keydown",g=>{g.key==="Enter"&&v(u.value||""),g.key==="Escape"&&v(null)}),document.body.appendChild(c),u.focus()})}function Uo(e="overview"){const n=Vr(".nav-item[data-view]:not(.disabled)"),a=Vr(".view[data-view]"),i=new Set(a.map(o=>o.dataset.view));function r(o){i.has(o)||(o=e),a.forEach(d=>d.hidden=d.dataset.view!==o),n.forEach(d=>d.classList.toggle("active",d.dataset.view===o)),location.hash!=="#/"+o&&(location.hash="#/"+o)}return n.forEach(o=>o.addEventListener("click",d=>{d.preventDefault(),r(o.dataset.view)})),window.addEventListener("hashchange",()=>r(location.hash.replace("#/",""))),r(location.hash.replace("#/","")||e),{show:r}}let Hr=O(null);const _i={get value(){return t(Hr)},set(e){h(Hr,e,!0)}};let Jr=O(Ht([])),Jn=O(Ht([]));const ca={get value(){return t(Jr)},set(e){h(Jr,e||[],!0)},get tracked(){return t(Jn)},track(e){t(Jn).includes(e)||h(Jn,[...t(Jn),e],!0)},toggle(e){h(Jn,t(Jn).includes(e)?t(Jn).filter(n=>n!==e):[...t(Jn),e],!0)}};let Qr=O(null);const Pr={get value(){return t(Qr)},set(e){h(Qr,e,!0)}},jo="5";var ls;typeof window<"u"&&((ls=window.__svelte??(window.__svelte={})).v??(ls.v=new Set)).add(jo);var Ho=w('— bereit für Anfragen'),Jo=w('
Temperatur (GPU)
Freier Speicher
GB
',1),Qo=w('
Temperatur
messe…
Freier Speicher
messe…
',1),Zo=w('
'),Yo=w('
Warte auf Messwerte…
'),Xo=w('
Noch kein Modell eingerichtet — starte hier:
',1),ed=w('
Die häufigsten Aufgaben — ein Klick.
',1),td=w('Bild'),nd=w('Code'),ad=w('Text'),id=w('∞ aktiv'),rd=w(''),sd=w('
'),Zr=w('
'),ld=w('
Noch keine Modelle
Hol dir unter „Cookbook" ein Modell, das auf deine Hardware passt.
'),od=w('
'),dd=w('
News gerade nicht ladbar.
'),cd=w('

LLM-Engine
Aktives Modell

System-Gesundheit

Auslastung in Echtzeit.

Schnellstart

Dein Stack

Top-News

Alle →
',1);function ud(e,n){aa(n,!0);const a=I(()=>_i.value),i=I(()=>Pr.value),r=I(()=>{var M;return((M=t(a))==null?void 0:M.models)||[]}),o=I(()=>{var M;return((M=t(a))==null?void 0:M.swap_ok)??!1}),d=["running","ready","loading","starting"],c=I(()=>t(r).find(M=>d.includes(M.state))),u=I(()=>t(r).filter(M=>!M.incomplete)),v=I(()=>t(a)?t(o)?t(i)&&t(i).ram.percent>=90?"Achtung: Speicher wird knapp.":"Alles läuft rund.":"LLM-Engine offline":"Verbinde…"),g=I(()=>t(a)?t(o)?t(i)&&t(i).ram.percent>=90?`Arbeitsspeicher bei ${Math.round(t(i).ram.percent)} % — eventuell Speicher freigeben.`:`${t(u).length} ${t(u).length===1?"Modell":"Modelle"} konfiguriert · ${t(c)?`„${t(c).name}" geladen`:"keines geladen"} · keine Warnungen.`:"Der llama-swap-Dienst antwortet gerade nicht.":""),E=I(()=>()=>{var H;const M=(H=t(i))==null?void 0:H.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 f=O(Ht([])),y=O(null);bi(async()=>{try{h(f,((await we("/api/news")).items||[]).slice(0,4),!0)}catch{}});async function T(){await yn({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 we("/api/unload",{method:"POST"}),S())}async function P(M){h(y,M,!0);try{await we("/api/preload?model="+encodeURIComponent(M),{method:"POST"})}catch(H){se("Laden fehlgeschlagen: "+(H.message||"Engine nicht erreichbar?"),!0)}h(y,null),S()}function S(){document.dispatchEvent(new Event("mc:refresh"))}function $(M){var H;(H=document.querySelector(`.nav-item[data-view="${M}"]`))==null||H.dispatchEvent(new MouseEvent("click"))}function Ce(M){return M>=90?"red":M>=75?"":"green"}function oe(M){return M==null?"":M>=75?"red":M>=55?"":"green"}function ae(M){return M>=90?"red":M>=70?"":"green"}var xe=cd(),V=We(xe),Q=l(V),fe=l(Q),be=l(fe),Se=s(be);{var Ne=M=>{var H=Ho();m(M,H)};K(Se,M=>{t(o)&&!t(c)&&M(Ne)})}var bt=s(fe,2),C=l(bt),Y=s(V,2),ue=l(Y),Ue=l(ue),te=s(l(Ue),2);Ae(te,()=>Bt("server"),!0);var Te=s(Ue,2),ie=l(Te),lt=s(Te,2),je=l(lt),B=s(ue,2),U=l(B),ce=s(l(U),2);Ae(ce,()=>Bt("cpu"),!0);var Oe=s(U,2),he=l(Oe),St=s(Oe,2),ht=l(St);{var Mt=M=>{var H=ii();D(Pe=>b(H,`${Pe??""} · ${t(c).state??""}`),[()=>{var Pe;return(Pe=t(c).meta)!=null&&Pe.ctx?Math.round(t(c).meta.ctx/1024)+"k ctx":""}]),m(M,H)},Et=M=>{var H=ii("lädt bei erster Anfrage");m(M,H)};K(ht,M=>{t(c)?M(Mt):M(Et,-1)})}var At=s(B,2);{var It=M=>{const H=I(()=>{var Vn;return t(i).gpu_temp??((Vn=t(i).cpu)==null?void 0:Vn.temp)??null}),Pe=I(()=>oe(t(H))),le=I(()=>t(i).ram.total-t(i).ram.used),Le=I(()=>100-t(i).ram.percent);var Ze=Jo(),tt=We(Ze),ke=l(tt),Ee=s(l(ke));Ae(Ee,()=>Bt("thermo"),!0);var De=s(ke,2),Ft=l(De),Nt=s(De,2),Jt=l(Nt),an=s(tt,2),bn=l(an),Fe=s(l(bn));Ae(Fe,()=>Bt("database"),!0);var gt=s(bn,2),Bn=l(gt),Wn=s(gt,2),ra=l(Wn);D((Vn,ja,k,_)=>{kt(tt,1,`kpi ${t(Pe)??""}`),b(Ft,Vn),b(Jt,t(H)==null?"messe…":t(H)<55?"kühl":t(H)<75?"normal":"⚠ heiß"),kt(an,1,`kpi ${t(Le)<15?"red":t(Le)<30?"":"green"}`),b(Bn,ja),b(ra,`von ${k??""} GB · ${_??""} % frei`)},[()=>t(H)!=null?`${Math.round(t(H))}°C`:"–",()=>Math.round(t(le)/1073741824),()=>Math.round(t(i).ram.total/1073741824),()=>Math.round(t(Le))]),m(M,Ze)},qt=M=>{var H=Qo();m(M,H)};K(At,M=>{t(i)?M(It):M(qt,-1)})}var z=s(Y,2),N=l(z),Me=s(l(N),4);{var ut=M=>{const H=I(()=>t(E)());var Pe=di(),le=We(Pe);st(le,17,()=>{var Le;return[["Prozessor (CPU)",((Le=t(i).cpu)==null?void 0:Le.percent)??0,""],["Arbeitsspeicher (RAM)",t(i).ram.percent,Ce(t(i).ram.percent)],["Grafikspeicher (VRAM)",t(H),ae(t(H))]]},rt,(Le,Ze)=>{var tt=I(()=>Ca(t(Ze),3));let ke=()=>t(tt)[0],Ee=()=>t(tt)[1];const De=I(()=>Math.max(0,Math.min(100,Ee()||0)));var Ft=Zo(),Nt=l(Ft),Jt=l(Nt),an=l(Jt),bn=s(Jt),Fe=l(bn),gt=s(Nt,2),Bn=l(gt);D((Wn,ra)=>{b(an,ke()),b(Fe,`${Wn??""} %`),kt(gt,1,`bar ${t(De)>=90?"bad":t(De)>=75?"warn":""}`),fn(Bn,`width:${ra??""}%`)},[()=>Math.round(t(De)),()=>Math.max(2,t(De))]),m(Le,Ft)}),m(M,Pe)},G=M=>{var H=Yo();m(M,H)};K(Me,M=>{t(i)?M(ut):M(G,-1)})}var ze=s(N,2),He=s(l(ze),2);{var Dt=M=>{var H=Xo(),Pe=s(We(H),2),le=l(Pe);Ae(le,()=>Bt("search"),!0);var Le=s(le,4);Ae(Le,()=>Bt("chevron"),!0);var Ze=s(Pe,2),tt=l(Ze);Ae(tt,()=>Bt("swap"),!0);var ke=s(tt,4);Ae(ke,()=>Bt("chevron"),!0);var Ee=s(Ze,2),De=l(Ee);Ae(De,()=>Bt("file"),!0);var Ft=s(De,4);Ae(Ft,()=>Bt("chevron"),!0),A("click",Pe,()=>$("cookbook")),A("click",Ze,()=>$("connect")),A("click",Ee,()=>$("guides")),m(M,H)},$t=M=>{var H=ed(),Pe=s(We(H),2),le=l(Pe);Ae(le,()=>Bt("search"),!0);var Le=s(le,4);Ae(Le,()=>Bt("chevron"),!0);var Ze=s(Pe,2),tt=l(Ze);Ae(tt,()=>Bt("refresh"),!0);var ke=s(tt,4);Ae(ke,()=>Bt("chevron"),!0);var Ee=s(Ze,2),De=l(Ee);Ae(De,()=>Bt("file"),!0);var Ft=s(De,4);Ae(Ft,()=>Bt("chevron"),!0);var Nt=s(Ee,2),Jt=l(Nt);Ae(Jt,()=>Bt("swap"),!0);var an=s(Jt,4);Ae(an,()=>Bt("chevron"),!0),A("click",Pe,()=>$("cookbook")),A("click",Ze,T),A("click",Ee,()=>$("server")),A("click",Nt,()=>$("connect")),m(M,H)};K(He,M=>{t(u).length?M($t,-1):M(Dt)})}var vt=s(z,2),_t=l(vt),j=l(_t),ee=s(l(j),2),W=l(ee),J=s(j,2);{var x=M=>{var H=Zr();st(H,21,()=>t(u),rt,(Pe,le)=>{const Le=I(()=>d.includes(t(le).state)),Ze=I(()=>t(le).state==="downloading"),tt=I(()=>t(le).state==="loading"||t(le).state==="starting"||t(Ze)?"load":t(Le)?"on":""),ke=I(()=>t(Ze)?`↓ ${t(le).download_progress!=null?Math.round(t(le).download_progress)+"%":"..."}`:t(le).state==="loading"||t(le).state==="starting"?"lädt…":t(Le)?"geladen ✓":"bereit");var Ee=sd(),De=l(Ee),Ft=s(De,2),Nt=l(Ft),Jt=l(Nt),an=l(Jt),bn=s(Jt,2);{var Fe=re=>{var me=td();m(re,me)},gt=I(()=>{var re,me;return(me=(re=t(le).meta)==null?void 0:re.caps)==null?void 0:me.includes("Bild")}),Bn=re=>{var me=nd();m(re,me)},Wn=I(()=>{var re,me;return(me=(re=t(le).meta)==null?void 0:re.caps)==null?void 0:me.includes("Code")}),ra=re=>{var me=ad();m(re,me)};K(bn,re=>{t(gt)?re(Fe):t(Wn)?re(Bn,1):re(ra,-1)})}var Vn=s(bn,2);{var ja=re=>{var me=id();m(re,me)};K(Vn,re=>{t(le).ttl>=99999&&re(ja)})}var k=s(Nt,2),_=l(k),q=s(Ft,2),F=l(q),de=l(F),nt=s(F,2);{var ot=re=>{var me=rd(),$e=l(me);D(()=>{fn(me,`padding:3px 9px;font-size:12px;opacity:${t(y)===t(le).name?".5":"1"}`),me.disabled=t(y)===t(le).name,b($e,t(y)===t(le).name?"…":"Laden")}),A("click",me,()=>P(t(le).name)),m(re,me)};K(nt,re=>{!t(Le)&&!t(Ze)&&t(o)&&re(ot)})}D((re,me)=>{var $e;kt(De,1,`li-dot ${t(tt)??""}`),fn(Jt,t(Le)?"color:var(--accent)":""),b(an,t(le).name),b(_,`${re??""} + ${($e=t(le).meta)!=null&&$e.quant?" · "+t(le).meta.quant:""} + ${me??""}`),fn(F,`white-space:nowrap;color:${t(Le)?"var(--on)":"var(--mut)"}`),b(de,t(ke))},[()=>{var re;return(re=t(le).meta)!=null&&re.ctx?Math.round(t(le).meta.ctx/1024)+"k ctx":""},()=>{var re;return(re=t(le).meta)!=null&&re.size_bytes?" · "+(t(le).meta.size_bytes/1073741824).toFixed(1)+" GB":""}]),m(Pe,Ee)}),m(M,H)},L=M=>{var H=ld(),Pe=s(l(H),4);A("click",Pe,()=>$("cookbook")),m(M,H)};K(J,M=>{t(u).length?M(x):M(L,-1)})}var R=s(_t,2),ne=l(R),Z=s(l(ne),2),Je=s(ne,2);{var Qe=M=>{var H=Zr();st(H,21,()=>t(f),rt,(Pe,le)=>{var Le=od(),Ze=l(Le),tt=l(Ze),ke=l(tt),Ee=s(tt,2),De=l(Ee);D(()=>{Ni(Le,"href",t(le).link),b(ke,t(le).title),b(De,`${t(le).source??""}${t(le).relevant?" · für dich":""}`)}),m(Pe,Le)}),m(M,H)},et=M=>{var H=dd();m(M,H)};K(Je,M=>{t(f).length?M(Qe):M(et,-1)})}D(M=>{b(be,`${t(v)??""} `),b(C,t(g)),kt(ue,1,`kpi ${t(o)?"green":"red"}`),b(ie,t(o)?"Online":"Offline"),b(je,M),kt(B,1,`kpi ${t(c)?"blue":"muted"}`),b(he,t(c)?t(c).name:"Keins"),b(W,t(u).length?t(u).length+" konfiguriert":"")},[()=>{var M,H;return((H=(M=t(a))==null?void 0:M.swap_url)==null?void 0:H.replace(/^https?:\/\//,""))??"—"}]),A("click",Z,()=>$("news")),A("keydown",Z,M=>M.key==="Enter"&&$("news")),m(e,xe),ia()}xa(["click","keydown"]);var vd=w(""),pd=w('
'),fd=w('
Noch keine Modelle konfiguriert
Hol dir unter „Cookbook" ein passendes Modell.
'),hd=w('
kein Modell hinterlegt
leere Rolleleer '),gd=w(' '),md=w('
'),bd=w(' '),_d=w('
API-Name:
'),kd=w('
ModellKannDetailsStatusPortAktionen
'),wd=w('
Empfohlen für deine Hardware

'),yd=w(''),xd=w(''),Sd=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 Ed(e,n){aa(n,!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.",i="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.",r=[{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 z;return((z=_i.value)==null?void 0:z.models)||[]});function d(){document.dispatchEvent(new Event("mc:refresh"))}let c=O(""),u=O(""),v=O(""),g=O(!1);const E=I(()=>t(o).filter(z=>!z.incomplete));async function f(){var N;const z=t(c)||((N=t(E)[0])==null?void 0:N.name);if(!(!z||!t(u).trim())){h(g,!0),h(v,"(wecke Modell, kann beim Laden kurz dauern…)");try{const Me=await we("/api/chat",{method:"POST",body:JSON.stringify({model:z,message:t(u)})});h(v,Me.reply,!0)}catch(Me){h(v,"Fehler: "+Me.message)}h(g,!1),d()}}const y=300;let T=O(!1),P=O(null),S=O(8192),$=O(!1);function Ce(z){var N;h(P,t(o).find(Me=>Me.name===z),!0),t(P)&&(h(S,((N=t(P).meta)==null?void 0:N.ctx)||8192,!0),h($,(t(P).ttl??y)>=99999),h(T,!0))}async function oe(){const z=t($)?99999:y;try{await we("/api/update_model",{method:"POST",body:JSON.stringify({alias:t(P).name,ctx:t(S),ttl:z})}),se("Gespeichert — aktiv beim nächsten Modell-Start."),h(T,!1),d()}catch(N){se(N.message,!0)}}let ae=O(!1),xe=O(""),V=O(""),Q=O("");function fe(z){const N=t(o).find(Me=>Me.name===z);h(xe,z,!0),h(Q,(N==null?void 0:N.role)||"",!0),h(V,""),h(ae,!0)}async function be(z){try{await we("/api/set_role",{method:"POST",body:JSON.stringify({alias:t(xe),role:z})}),se(z?`Rolle gesetzt: ${z}`:"Rolle entfernt."),h(ae,!1),d()}catch(N){se(N.message,!0)}}async function Se(z){if(await yn({title:`„${z}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await we("/api/unload?model="+encodeURIComponent(z),{method:"POST"}),se("Entladen: "+z),setTimeout(d,600)}catch(N){se(N.message,!0)}}async function Ne(z){if(await yn({title:`„${z}" 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 N=await we("/api/delete_model",{method:"POST",body:JSON.stringify({alias:z})});se(N.note||"Gelöscht: "+z),setTimeout(d,600)}catch(N){se(N.message,!0)}}function bt(z){return z!=null&&z.length?z.map(N=>N==="Code"?'Code':N==="Bild"?'Bild':'Text').join(" "):"–"}function C(z){if(!z)return"–";const N=z.quant||"?",Me=z.ctx?Math.round(z.ctx/1024)+"K":"?",ut=z.size_bytes?(z.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${N} · ${Me} · ${ut}`}function Y(z){var N;(N=navigator.clipboard)==null||N.writeText(z),se("Kopiert: "+z)}var ue=Md(),Ue=s(We(ue),2),te=s(l(Ue),6);st(te,21,()=>t(E),rt,(z,N)=>{var Me=vd(),ut=l(Me),G={};D(()=>{b(ut,t(N).name),G!==(G=t(N).name)&&(Me.value=(Me.__value=t(N).name)??"")}),m(z,Me)});var Te=s(te,4),ie=s(Te,2),lt=l(ie),je=s(ie,2);{var B=z=>{var N=pd(),Me=l(N);D(()=>b(Me,t(v))),m(z,N)};K(je,z=>{t(v)&&z(B)})}var U=s(Ue,2),ce=l(U),Oe=s(l(ce)),he=l(Oe),St=s(ce,4);{var ht=z=>{var N=fd();m(z,N)},Mt=z=>{var N=kd(),Me=s(l(N));st(Me,21,()=>t(o),rt,(ut,G)=>{var ze=di(),He=We(ze);{var Dt=vt=>{var _t=hd(),j=l(_t),ee=l(j),W=s(j,5),J=l(W),x=s(J,2);D(()=>b(ee,t(G).name)),A("click",J,()=>{var L;se("Lade im Cookbook ein Modell und setze den Alias auf: "+t(G).name),(L=document.querySelector(".nav-item[data-view='cookbook']"))==null||L.dispatchEvent(new MouseEvent("click"))}),A("click",x,()=>Ne(t(G).name)),m(vt,_t)},$t=vt=>{var _t=_d(),j=l(_t),ee=l(j),W=l(ee),J=s(W);{var x=ke=>{var Ee=gd(),De=l(Ee);D(()=>b(De,t(G).role)),m(ke,Ee)};K(J,ke=>{t(G).role&&ke(x)})}var L=s(ee,2);{var R=ke=>{var Ee=md(),De=l(Ee);D(()=>b(De,t(G).meta.filename)),m(ke,Ee)};K(L,ke=>{var Ee;(Ee=t(G).meta)!=null&&Ee.filename&&ke(R)})}var ne=s(L,2),Z=s(l(ne),2);st(Z,17,()=>{var ke;return(ke=t(G).api_ids)!=null&&ke.length?t(G).api_ids:[t(G).name]},rt,(ke,Ee)=>{var De=bd(),Ft=l(De);D(()=>b(Ft,t(Ee))),A("click",De,()=>Y(t(Ee))),m(ke,De)});var Je=s(j);Ae(Je,()=>{var ke;return bt((ke=t(G).meta)==null?void 0:ke.caps)},!0);var Qe=s(Je);Ae(Qe,()=>C(t(G).meta),!0);var et=s(Qe);Ae(et,()=>Vo(t(G).state,t(G).download_progress),!0);var M=s(et),H=l(M),Pe=s(M),le=l(Pe),Le=s(le,2),Ze=s(Le,2),tt=s(Ze,2);D(()=>{b(W,`${t(G).name??""} `),b(H,t(G).port??"auto")}),A("click",le,()=>fe(t(G).name)),A("click",Le,()=>Ce(t(G).name)),A("click",Ze,()=>Se(t(G).name)),A("click",tt,()=>Ne(t(G).name)),m(vt,_t)};K(He,vt=>{t(G).incomplete?vt(Dt):vt($t,-1)})}m(ut,ze)}),m(z,N)};K(St,z=>{t(o).length?z(Mt,-1):z(ht)})}var Et=s(U,2);{var At=z=>{var N=yd(),Me=l(N),ut=l(Me),G=s(ut,4),ze=l(G),He=s(G,2),Dt=s(l(He));Ae(Dt,()=>gr(a));var $t=s(He,2),vt=s($t,2);{var _t=R=>{var ne=wd(),Z=l(ne),Je=s(l(Z),2),Qe=l(Je),et=s(Qe,2),M=s(Z,2);D((H,Pe)=>{b(Qe,`Optimal ~${H??""}k → ~${t(P).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),b(et,` Aktuell ~${Pe??""}k → ~${t(P).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(t(P).meta.optimal_ctx/1024),()=>Math.round((t(P).meta.ctx||0)/1024)]),A("click",M,()=>h(S,t(P).meta.optimal_ctx,!0)),m(R,ne)};K(vt,R=>{var ne;(ne=t(P).meta)!=null&&ne.optimal_ctx&&R(_t)})}var j=s(vt,4),ee=s(l(j),2),W=l(ee),J=s(W,2),x=l(J),L=s(j,2);D(()=>{b(ze,t(P).name),fn(J,`color:${t($)?"var(--accent)":"var(--mut)"}`),b(x,t($)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),A("click",N,R=>{R.target.classList.contains("modal-overlay")&&h(T,!1)}),A("click",ut,()=>h(T,!1)),Cn($t,()=>t(S),R=>h(S,R)),Oo(W,()=>t($),R=>h($,R)),A("click",L,oe),m(z,N)};K(Et,z=>{t(T)&&t(P)&&z(At)})}var It=s(Et,2);{var qt=z=>{var N=Sd(),Me=l(N),ut=l(Me),G=s(ut,2),ze=s(l(G));Ae(ze,()=>gr(i));var He=s(G,2),Dt=l(He),$t=s(He,4);st($t,21,()=>r,rt,(W,J)=>{var x=xd(),L=l(x);D(()=>{kt(x,1,t(Q)===t(J).id?"primary":"ghost"),Ni(x,"title",t(J).desc),b(L,t(J).label)}),A("click",x,()=>be(t(J).id)),m(W,x)});var vt=s($t,4),_t=s(vt,2),j=l(_t),ee=s(j,2);D(()=>b(Dt,t(xe))),A("click",N,W=>{W.target.classList.contains("modal-overlay")&&h(ae,!1)}),A("click",ut,()=>h(ae,!1)),Cn(vt,()=>t(V),W=>h(V,W)),A("click",j,()=>be("")),A("click",ee,()=>be(t(V).trim().toLowerCase())),m(z,N)};K(It,z=>{t(ae)&&z(qt)})}D(()=>{ie.disabled=t(g),b(lt,t(g)?"…":"Senden"),b(he,t(o).length?t(o).length+" konfiguriert":"")}),ri(te,()=>t(c),z=>h(c,z)),Cn(Te,()=>t(u),z=>h(u,z)),A("click",ie,f),m(e,ue),ia()}xa(["click"]);var Ad=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),Cd=w(''),Td=w('
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
'),zd=w(' '),Pd=w(''),Dd=w(''),$d=w('
'),Ld=w('
'),Id=w('
'),Bd=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 Rd(e,n){aa(n,!0);const a=I(()=>ca.value),i=I(()=>ca.tracked),r=I(()=>Pr.value);let o=Ht({cpu:[],ram:[],gpu:[]});Ar(()=>{var ue;if(!t(r))return;const C=t(r).gpu,Y=C&&C.vram.total+C.gtt.total>0?(C.vram.used+C.gtt.used)/(C.vram.total+C.gtt.total)*100:0;o.cpu=[...o.cpu,((ue=t(r).cpu)==null?void 0:ue.percent)??0].slice(-60),o.ram=[...o.ram,t(r).ram.percent].slice(-60),o.gpu=[...o.gpu,Y].slice(-60)});const d=I(()=>()=>{var Y;const C=(Y=t(r))==null?void 0:Y.gpu;return C&&C.vram.total+C.gtt.total>0?(C.vram.used+C.gtt.used)/(C.vram.total+C.gtt.total)*100:0}),c=I(()=>t(a).filter(C=>C.state!=="running"&&C.state!=="queued").length),u=I(()=>t(a).filter(C=>C.state==="failed").length);function v(C){if(C.state!=="running")return null;if(typeof C.progress=="number")return Math.min(100,C.progress);const ue=((C.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return ue?Math.min(100,parseFloat(ue[1])):null}function g(C){return C==null||C<0?"":C>=90?`noch ~${Math.round(C/60)} min`:`noch ~${Math.max(1,Math.round(C))} s`}function E(C){return C==="done"?'fertig':C==="failed"?'fehler':C==="canceled"?'abgebrochen':'läuft…'}function f(C){return C==="done"?"on":C==="failed"||C==="canceled"?"":"load"}async function y(C){try{await we(`/api/jobs/${C}/cancel`,{method:"POST"}),se("Abbruch angefordert…")}catch(Y){se(Y.message,!0)}}async function T(C){try{await we(`/api/jobs/${C}`,{method:"DELETE"})}catch(Y){se(Y.message,!0)}}async function P(){try{const C=await we("/api/jobs/clear",{method:"POST"});se(`${C.removed} Einträge entfernt.`)}catch(C){se(C.message,!0)}}function S(C,Y){return C.map(ue=>`
`).join("")}var $=Bd(),Ce=s(We($),2);{var oe=C=>{const Y=I(()=>t(d)());var ue=Ad(),Ue=We(ue),te=l(Ue),Te=s(l(te),2),ie=l(Te),lt=s(Te,2),je=l(lt),B=s(te,2),U=s(l(B),2),ce=l(U),Oe=s(U,2),he=l(Oe),St=s(B,2),ht=s(l(St),2),Mt=l(ht),Et=s(ht,2),At=l(Et),It=s(Ue,2),qt=s(l(It),4),z=l(qt),N=s(l(z)),Me=l(N),ut=s(z,2),G=s(l(ut),2),ze=l(G),He=s(ut,2),Dt=s(l(He)),$t=l(Dt),vt=s(He,2),_t=s(l(vt),2),j=l(_t),ee=s(qt,2),W=l(ee),J=s(l(W));Ae(J,()=>S(o.cpu,"--accent"),!0);var x=s(W,2),L=s(l(x));Ae(L,()=>S(o.ram,"--purple"),!0);var R=s(x,2),ne=s(l(R));Ae(ne,()=>S(o.gpu,"--on"),!0),D((Z,Je,Qe,et,M,H,Pe,le,Le,Ze,tt,ke,Ee)=>{b(ie,Z),b(je,Je),b(ce,Qe),b(he,`${et??""} / ${M??""}`),b(Mt,H),b(At,Pe),b(Me,`${le??""} / ${Le??""}`),b(ze,Ze),b($t,`${tt??""} % belegt`),b(j,`${ke??""} / ${Ee??""}`)},[()=>{var Z;return Math.round(((Z=t(r).cpu)==null?void 0:Z.percent)??0)},()=>{var Z;return((Z=t(r).cpu)==null?void 0:Z.temp)!=null?`${Math.round(t(r).cpu.temp)}° CPU-Temp`:"Auslastung"},()=>Math.round(t(r).ram.percent),()=>sa(t(r).ram.used),()=>sa(t(r).ram.total),()=>Math.round(t(Y)),()=>t(r).gpu_temp!=null?`${Math.round(t(r).gpu_temp)}° GPU-Temp`:"VRAM + GTT",()=>sa(t(r).ram.used),()=>sa(t(r).ram.total),()=>t(r).gpu?`${sa(t(r).gpu.vram.used+t(r).gpu.gtt.used)} / ${sa(t(r).gpu.vram.total+t(r).gpu.gtt.total)}`:"–",()=>{var Z;return Math.round(((Z=t(r).disk)==null?void 0:Z.percent)??0)},()=>t(r).gpu_temp!=null?Math.round(t(r).gpu_temp)+"°":"–",()=>{var Z;return((Z=t(r).cpu)==null?void 0:Z.temp)!=null?Math.round(t(r).cpu.temp)+"°":"–"}]),m(C,ue)};K(Ce,C=>{t(r)&&C(oe)})}var ae=s(Ce,2),xe=l(ae),V=s(l(xe),2),Q=l(V),fe=s(V,2);{var be=C=>{var Y=Cd();A("click",Y,P),m(C,Y)};K(fe,C=>{t(c)&&C(be)})}var Se=s(xe,4);{var Ne=C=>{var Y=Td();m(C,Y)},bt=C=>{var Y=di(),ue=We(Y);st(ue,17,()=>t(a),rt,(Ue,te)=>{const Te=I(()=>v(t(te))),ie=I(()=>t(te).state==="running"?g(t(te).eta_s):""),lt=I(()=>t(te).state==="running"&&t(te).rate_bps?sa(t(te).rate_bps)+"/s":""),je=I(()=>[t(ie),t(lt)].filter(Boolean).join(" · ")),B=I(()=>t(i).includes(t(te).id));var U=Id(),ce=l(U),Oe=l(ce),he=s(Oe,2),St=l(he),ht=s(he,2);{var Mt=G=>{var ze=zd(),He=l(ze);D(Dt=>b(He,`${Dt??""} %${t(je)?` · ${t(je)}`:""}`),[()=>Math.round(t(Te))]),m(G,ze)};K(ht,G=>{t(Te)!=null&&G(Mt)})}var Et=s(ht,2);{var At=G=>{var ze=Pd();D(()=>fn(ze,`${t(Te)==null?"margin-left:auto;":""}margin-right:2px;padding:2px 9px;font-size:12px`)),A("click",ze,He=>{He.stopPropagation(),y(t(te).id)}),m(G,ze)},It=G=>{var ze=Dd();A("click",ze,He=>{He.stopPropagation(),T(t(te).id)}),m(G,ze)};K(Et,G=>{t(te).state==="running"?G(At):G(It,-1)})}var qt=s(Et,2);Ae(qt,()=>E(t(te).state));var z=s(ce,2);{var N=G=>{var ze=$d(),He=l(ze);D(()=>fn(He,`width:${t(Te)??""}%`)),m(G,ze)};K(z,G=>{t(Te)!=null&&t(te).state==="running"&&G(N)})}var Me=s(z,2);{var ut=G=>{var ze=Ld(),He=l(ze);D(Dt=>b(He,Dt),[()=>(t(te).log||[]).join(` +`)]),m(G,ze)};K(Me,G=>{t(B)&&G(ut)})}D(G=>{kt(Oe,1,`li-dot ${G??""}`),b(St,t(te).label)},[()=>f(t(te).state)]),A("click",ce,()=>ca.toggle(t(te).id)),A("keydown",ce,G=>G.key==="Enter"&&ca.toggle(t(te).id)),m(Ue,U)}),m(C,Y)};K(Se,C=>{t(a).length?C(bt,-1):C(Ne)})}D(()=>b(Q,t(a).length?t(u)?t(u)+" Fehler":t(a).length+" gesamt":"")),m(e,$),ia()}xa(["click","keydown"]);var Od=w(' '),Fd=w(''),qd=w('✓ fertig'),Nd=w('✗ fehlgeschlagen'),Kd=w('abgebrochen'),Gd=w('läuft…'),Wd=w('
'),Vd=w('

Aktueller Vorgang

'),Ud=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 jd(e,n){aa(n,!0);const a=I(()=>_i.value),i=I(()=>ca.value);let r=null,o=O(`Verbinde… +`),d=O("llama-swap"),c,u=O(null),v=O("");const g=new Set,E=I(()=>t(u)?t(i).find(x=>x.id===t(u)):null);Ar(()=>{if(!t(E))return;const x=t(E),L=x.state==="done",R=x.state==="failed",ne=x.state==="canceled";(L||R||ne)&&!g.has(x.id)&&(g.add(x.id),se(L?`✓ ${t(v)} abgeschlossen.`:ne?`${t(v)} abgebrochen.`:`✗ ${t(v)} fehlgeschlagen.`,R),L&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function f(x,L){h(u,x,!0),h(v,L,!0),ca.track(x)}bi(()=>{y()}),qo(()=>{r==null||r.close()});function y(){r==null||r.close();const x=t(d);h(o,`Verbinde mit ${x}… +`);const L=location.protocol==="https:"?"wss:":"ws:";r=new WebSocket(`${L}//${location.host}/api/logs/${x}?token=${encodeURIComponent(tl())}`),r.onmessage=R=>{h(o,t(o)+R.data),c&&(c.scrollTop=c.scrollHeight)},r.onclose=()=>{h(o,t(o)+` +— Verbindung getrennt —`)},r.onerror=()=>r==null?void 0:r.close()}async function T(x,L,R){if(await yn({title:L,body:R,confirmLabel:"Neustarten"}))try{await we(`/api/service/${x}/restart`,{method:"POST"}),se("Neustart ausgelöst: "+x),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(ne){se(ne.message,!0)}}async function P(){if(await yn({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 x=await we("/api/self-update",{method:"POST"});se("Update läuft — Dashboard startet gleich neu."),f(x.job_id,"Mission Control Update")}catch(x){se(x.message,!0)}}async function S(){if(await yn({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 x=await we("/api/update",{method:"POST"});se("LLM-Engine-Update läuft."),f(x.job_id,"LLM-Engine-Update")}catch(x){se(x.message,!0)}}async function $(){if(await yn({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 we("/api/unload",{method:"POST"}),se("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(x){se(x.message,!0)}}async function Ce(){if(!await yn({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 x=await jr({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(x)try{const L=await we("/api/os-update",{method:"POST",body:JSON.stringify({password:x})});se("OS-Update gestartet."),f(L.job_id,"OS-Update")}catch(L){se(L.message,!0)}}async function oe(){if(!await yn({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 x=await jr({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(x)try{await we("/api/reboot",{method:"POST",body:JSON.stringify({password:x})}),se("Reboot ausgelöst — bis gleich.")}catch(L){se(L.message,!0)}}async function ae(){h(xe,"prüfe…");try{const x=await we("/api/integration/test");h(xe,x.ok?`✓ Engine antwortet — ${x.models.length} Modell(e): ${x.models.join(", ")}`:`✗ keine Verbindung: ${x.error}`,!0),h(V,x.ok,!0)}catch(x){h(xe,"✗ "+x.message),h(V,!1)}}let xe=O(""),V=O(!1);const Q=I(()=>{var x;return((x=t(a))==null?void 0:x.models)||[]}),fe=["running","ready","loading","starting"],be=I(()=>t(Q).find(x=>fe.includes(x.state)));function Se(x){if(!x||x.state!=="running")return null;if(typeof x.progress=="number")return Math.min(100,x.progress);const R=((x.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return R?Math.min(100,parseFloat(R[1])):null}var Ne=Ud(),bt=s(We(Ne),2),C=l(bt),Y=s(l(C),2),ue=l(Y),Ue=s(C,4),te=l(Ue),Te=s(l(te)),ie=l(Te),lt=s(te,2),je=s(l(lt),2),B=l(je),U=s(lt,2),ce=s(l(U),2),Oe=l(ce),he=s(Ue,2),St=l(he),ht=s(St,2);{var Mt=x=>{var L=Od(),R=l(L);D(()=>{fn(L,`color:${t(V)?"#7ee29a":"#ff9b95"}`),b(R,t(xe))}),m(x,L)};K(ht,x=>{t(xe)&&x(Mt)})}var Et=s(bt,2),At=s(l(Et),4),It=s(At,2),qt=s(It,2),z=s(qt,2),N=s(z,2),Me=s(Et,2),ut=s(l(Me),4),G=s(ut,2),ze=s(Me,2);{var He=x=>{const L=I(()=>t(E)),R=I(()=>t(L).state==="done"),ne=I(()=>t(L).state==="failed"),Z=I(()=>t(L).state==="canceled"),Je=I(()=>t(R)||t(ne)||t(Z)),Qe=I(()=>Se(t(L)));var et=Vd(),M=l(et),H=s(l(M),2);{var Pe=Fe=>{var gt=Fd();A("click",gt,async()=>{await yn({title:t(v)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&we(`/api/jobs/${t(L).id}/cancel`,{method:"POST"})}),m(Fe,gt)};K(H,Fe=>{t(Je)||Fe(Pe)})}var le=s(H,2),Le=l(le);{var Ze=Fe=>{var gt=qd();m(Fe,gt)},tt=Fe=>{var gt=Nd();m(Fe,gt)},ke=Fe=>{var gt=Kd();m(Fe,gt)},Ee=Fe=>{var gt=Gd();m(Fe,gt)};K(Le,Fe=>{t(R)?Fe(Ze):t(ne)?Fe(tt,1):t(Z)?Fe(ke,2):Fe(Ee,-1)})}var De=s(M,2),Ft=l(De),Nt=s(De,2);{var Jt=Fe=>{var gt=Wd(),Bn=l(gt);D(()=>fn(Bn,`width:${t(Qe)??""}%`)),m(Fe,gt)};K(Nt,Fe=>{t(Qe)!=null&&!t(Je)&&Fe(Jt)})}var an=s(Nt,2),bn=l(an);D(Fe=>{b(Ft,`${t(v)??""}${t(Je)?t(R)?" — erfolgreich.":t(Z)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),b(bn,Fe)},[()=>(t(L).log||[]).join(` +`)]),m(x,et)};K(ze,x=>{t(E)&&x(He)})}var Dt=s(ze,2),$t=l(Dt),vt=s(l($t),2),_t=l(vt);_t.value=_t.__value="llama-swap";var j=s(_t);j.value=j.__value="mission-control";var ee=s(j);ee.value=ee.__value="system";var W=s($t,4),J=l(W);Fo(W,x=>c=x,()=>c),D(x=>{var L,R,ne;fn(Y,`margin-left:auto;${(L=t(a))!=null&&L.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"}`),b(ue,(R=t(a))!=null&&R.swap_ok?"● erreichbar":"● offline"),b(ie,(((ne=t(a))==null?void 0:ne.swap_url)||"—")+"/v1"),b(B,t(be)?t(be).name+` (${t(be).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),b(Oe,x),b(J,t(o))},[()=>t(Q).filter(x=>!x.incomplete).length||"keine"]),A("click",St,ae),A("click",At,()=>T("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),A("click",It,()=>T("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),A("click",qt,P),A("click",z,S),A("click",N,$),A("click",ut,Ce),A("click",G,oe),A("change",vt,y),ri(vt,()=>t(d),x=>h(d,x)),m(e,Ne),ia()}xa(["click","change"]);var Hd=w('
Lade Setups…
'),Jd=w(' ×',1),Xi=w('
★ Beste Wahl für dein System
'),Qd=w('
Dein Setup
'),Zd=w(''),Yd=w('
'),Xd=w('· ⚠ Cache veraltet'),ec=w(" ",1),tc=w('
Frage Quellen ab…
'),nc=w('
'),ac=w('✓ installiert'),ic=w(''),rc=w('

'),sc=w('

'),lc=w(''),oc=w('

'),dc=w('
'),cc=w('
'),uc=w('
'),vc=w(" "),pc=w('
'),fc=w('
Größter Spitzenbedarf: . Es läuft immer nur ein Modell gleichzeitig — das größte bestimmt, ob das Setup passt.
'),hc=w('Alternative: — passt auf dein System.',1),gc=w('
⚠ Dieses Setup übersteigt deinen verfügbaren Speicher.
'),mc=w(''),bc=w('
Lade Dateien von HuggingFace…
'),Yr=w(""),_c=w('
Empfohlener Kontext für deine Hardware: übernehmen
'),kc=w('
Ressourcen-Check
'),wc=w('
⚠ Diese Datei ist zu groß für deinen Speicher. Kleinere Alternative: — einfach auswählen.
'),yc=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),Sc=w('
Keine GGUF-Dateien im Repo gefunden.
'),Mc=w(''),Ec=w('
'),Ac=w(''),Cc=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 Tc(e,n){aa(n,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr, braucht aber mehr Speicher und wird etwas langsamer.",i="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.",r={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(k){const _=(k||"").toLowerCase();for(const q of d)if(q.kw.some(F=>_.includes(F)))return q.label;return"Allrounder"}function u(k=""){const _=k.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(_)||new RegExp("(?{he(),St()});async function he(){h(P,!0);try{const k=await we("/api/cookbook/recipes");h(y,k.recipes||[],!0),h(T,k.recommended_id||null,!0)}catch(k){se(k.message,!0)}h(P,!1)}async function St(k=!1){h($,!0);try{const _=await we("/api/cookbook/discover"+(k?"?force=true":""));h(S,_,!0),h(Ce,_.stale,!0)}catch(_){se("Empfehlungen nicht ladbar: "+_.message,!0)}h($,!1)}function ht(k){k=k.trim();const _=k.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return _?_[1]:/^[\w.-]+\/[\w.-]+$/.test(k)?k:null}async function Mt(){const k=t(oe).trim(),_=ht(k);let q=k;if(t(V)&&!_&&(q=q?q+" "+t(V):t(V)),!q&&!_){h(ae,[],!0);return}h(xe,!0),h(fe,[],!0),h(be,-1);try{if(_)h(ae,[{id:_,author:_.split("/")[0],downloads:0}],!0);else{const F=`https://huggingface.co/api/models?search=${encodeURIComponent(q)}&filter=gguf&sort=${encodeURIComponent(t(Q))}&direction=-1&limit=40`,de=await fetch(F);h(ae,await de.json(),!0)}t(ae).forEach((F,de)=>Et(de,F.id))}catch(F){se(F.message,!0),h(ae,[],!0)}h(xe,!1)}async function Et(k,_){var q;try{const F=await we("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:_,ctx:8192})});if(!((q=F.files)!=null&&q.length)){t(fe)[k]=null,At();return}const de=F.files.find(nt=>{var ot;return(ot=nt.quant)==null?void 0:ot.includes("Q4_K_M")})||F.files[0];t(fe)[k]=de.fit.level,At()}catch{t(fe)[k]=null,At()}}function At(){let k=-1,_=99;t(fe).forEach((q,F)=>{if(q==null)return;const de=r[q]??99;de<_&&(_=de,k=F)}),h(be,k>=0&&_<=1?k:-1,!0)}function It(k){h(Se,t(y).find(_=>_.id===k),!0)}async function qt(k){const _=document.getElementById("cb-r-install-btn");_&&(_.disabled=!0,_.textContent="Starte…");try{const q=await we("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:k,hf_token:li()})});se(`${q.count} Download${q.count!==1?"s":""} läuft — Modelle erscheinen danach automatisch im Modelle-Tab.`),h(Se,null),Oe("activity")}catch(q){se(q.message,!0),_&&(_.disabled=!1,_.textContent="Installieren")}}async function z(k,_){var q,F;h(Ne,!0),h(bt,_,!0),h(C,k,!0),h(Ue,""),h(te,8192),h(Y,null),h(ie,null),h(ue,""),h(Te,!0);try{if(h(Y,await we("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:k,ctx:8192})}),!0),(F=(q=t(Y))==null?void 0:q.files)!=null&&F.length){const de=t(Y).files.find(nt=>{var ot;return(ot=nt.quant)==null?void 0:ot.includes("Q4_K_M")})||t(Y).files[0];h(ue,de.filename,!0),de.optimal_ctx&&t(te)===8192&&h(te,de.optimal_ctx,!0),N()}}catch(de){se(de.message,!0)}h(Te,!1)}function N(){var k,_,q;!((_=(k=t(Y))==null?void 0:k.files)!=null&&_.length)||!t(ue)||(h(ie,t(Y).files.find(F=>F.filename===t(ue))||null,!0),(q=t(ie))!=null&&q.optimal_ctx&&t(te)===8192&&h(te,t(ie).optimal_ctx,!0))}async function Me(){var k,_;if(!t(C)||!t(ue))return se("Bitte eine GGUF-Datei wählen.",!0);h(Te,!0);try{const q=((k=t(Y))==null?void 0:k.params_b)??7,F=((_=t(ie))==null?void 0:_.quant)??"Q4_K_M";await we("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:t(C),role:t(Ue),params_b:q,quant:F,file:t(ue),ctx:t(te),hf_token:li()})}),se("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),h(Ne,!1),Oe("activity")}catch(q){se("Fehler: "+q.message,!0)}h(Te,!1)}async function ut(k,_,q,F){F.disabled=!0,F.textContent="Starte…";try{await we("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:k,role:_,params_b:q,quant:"Q4_K_M",hf_token:li()})}),se("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),Oe("activity")}catch(de){se(de.message,!0),F.disabled=!1,F.textContent="Installieren"}}function G(){h(ce,null),h(je,""),h(B,""),h(U,[{repo:"",role:"",quant:"Q4_K_M"}],!0),h(lt,!0)}function ze(k){const _=t(y).find(q=>q.id===k);_&&(h(ce,k,!0),h(je,_.title,!0),h(B,_.desc||"",!0),h(U,_.models.map(q=>({repo:q.repo,role:q.role,quant:q.quant||"Q4_K_M"})),!0),h(lt,!0))}async function He(){if(!t(je).trim())return se("Bitte einen Titel angeben.",!0);const k=t(U).filter(_=>_.repo.trim());if(!k.length)return se("Mindestens ein Modell (Repo) angeben.",!0);try{t(ce)?(await we("/api/cookbook/user-recipe/"+encodeURIComponent(t(ce)),{method:"PUT",body:JSON.stringify({title:t(je),desc:t(B),models:k})}),se("Setup aktualisiert.")):(await we("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:t(je),desc:t(B),models:k})}),se("Setup gespeichert.")),h(lt,!1),he()}catch(_){se(_.message,!0)}}async function Dt(k){const _=t(y).find(q=>q.id===k);if(await yn({title:`„${(_==null?void 0:_.title)||k}" löschen?`,body:"Dein eigenes Setup wird aus dem Cookbook entfernt. Bereits installierte Modelle bleiben unangetastet.",confirmLabel:"Löschen",danger:!0}))try{await we("/api/cookbook/user-recipe/"+encodeURIComponent(k),{method:"DELETE"}),se("Setup gelöscht."),he()}catch(q){se(q.message,!0)}}function $t(k){if(!u(k))return"";const _=v(k);return`MoE${_?` · ~${_}B aktiv`:""}`}function vt(k){return k?`${$n(k)}`:""}var _t=Cc(),j=s(We(_t),2),ee=l(j),W=s(l(ee),2),J=s(ee,4);{var x=k=>{var _=Hd();m(k,_)},L=k=>{var _=Yd();st(_,21,()=>t(y),rt,(q,F)=>{const de=I(()=>t(F).id===t(T));var nt=Zd(),ot=l(nt);{var re=ge=>{var Ye=Jd(),Gt=We(Ye),zt=s(Gt,2);A("click",Gt,wt=>{wt.stopPropagation(),ze(t(F).id)}),A("keydown",Gt,wt=>{wt.key==="Enter"&&(wt.stopPropagation(),ze(t(F).id))}),A("click",zt,wt=>{wt.stopPropagation(),Dt(t(F).id)}),A("keydown",zt,wt=>{wt.key==="Enter"&&(wt.stopPropagation(),Dt(t(F).id))}),m(ge,Ye)};K(ot,ge=>{t(F).user&&ge(re)})}var me=s(ot,2);{var $e=ge=>{var Ye=Xi();m(ge,Ye)},pt=ge=>{var Ye=Qd();m(ge,Ye)};K(me,ge=>{t(de)?ge($e):t(F).user&&ge(pt,1)})}var Ie=s(me,2),qe=l(Ie),dt=l(qe),Ct=l(dt),Yt=s(qe,2),ft=l(Yt),Be=s(Ie,2),Tt=l(Be),Kt=s(Be,2),mt=l(Kt);D((ge,Ye)=>{kt(nt,1,`card-btn${t(de)?" cb-best":""}`),b(Ct,t(F).title),kt(Yt,1,`fit-badge ${ge??""}`),b(ft,Ye),b(Tt,t(F).desc),b(mt,`${t(F).models.length??""} Modell${t(F).models.length>1?"e":""} im Setup`)},[()=>g(t(F).fit_level),()=>E(t(F).fit_level)]),A("click",nt,()=>It(t(F).id)),m(q,nt)}),m(k,_)};K(J,k=>{t(P)?k(x):k(L,-1)})}var R=s(j,2),ne=l(R),Z=s(l(ne),2),Je=l(Z);{var Qe=k=>{const _=I(()=>Math.round((Date.now()/1e3-t(S).updated)/60));var q=ec(),F=We(q);{var de=$e=>{var pt=ii();D(()=>b(pt,`Quellen befragt vor ${t(_)??""} min`)),m($e,pt)},nt=$e=>{var pt=ii();D(Ie=>b(pt,`Quellen befragt vor ${Ie??""} h`),[()=>Math.round(t(_)/60)]),m($e,pt)},ot=$e=>{var pt=ii();D(Ie=>b(pt,`Quellen befragt vor ${Ie??""} Tg.`),[()=>Math.round(t(_)/1440)]),m($e,pt)};K(F,$e=>{t(_)<60?$e(de):t(_)<1440?$e(nt,1):$e(ot,-1)})}var re=s(F,2);{var me=$e=>{var pt=Xd();m($e,pt)};K(re,$e=>{t(Ce)&&$e(me)})}m(k,q)};K(Je,k=>{var _;(_=t(S))!=null&&_.updated&&k(Qe)})}var et=s(Z,2),M=l(et),H=s(ne,4);{var Pe=k=>{var _=tc();m(k,_)},le=k=>{var _=di(),q=We(_);st(q,17,()=>t(S).categories,rt,(F,de)=>{var nt=sc(),ot=l(nt),re=l(ot),me=l(re),$e=s(ot,2);st($e,21,()=>t(de).models,rt,(pt,Ie)=>{const qe=I(()=>t(de).recommended&&t(Ie).repo===t(de).recommended);var dt=rc(),Ct=l(dt);{var Yt=Xe=>{var it=Xi();m(Xe,it)};K(Ct,Xe=>{t(qe)&&Xe(Yt)})}var ft=s(Ct,2),Be=l(ft),Tt=l(Be),Kt=l(Tt),mt=s(Tt,2),ge=l(mt),Ye=s(Be,2),Gt=l(Ye),zt=s(ft,2),wt=l(zt);Ae(wt,()=>vt(o[t(Ie).role]||c(t(Ie).repo)));var Rn=s(wt,2);Ae(Rn,()=>$t(t(Ie).repo));var Un=s(zt,2),En=l(Un),Sa=s(Un,2);st(Sa,17,()=>t(Ie).requirements||[],rt,(Xe,it)=>{var Lt=nc(),An=l(Lt);D(()=>b(An,`⚠ ${t(it)??""}`)),m(Xe,Lt)});var ct=s(Sa,4),Ke=l(ct);{var at=Xe=>{var it=ac();D(()=>Ni(it,"title",`bereits eingerichtet als ${t(Ie).installed??""}`)),m(Xe,it)},yt=Xe=>{var it=ic();A("click",it,Lt=>ut(t(Ie).repo,t(Ie).role,t(Ie).params_b,Lt.currentTarget)),m(Xe,it)};K(Ke,Xe=>{t(Ie).installed?Xe(at):Xe(yt,-1)})}D((Xe,it,Lt)=>{kt(dt,1,`card${t(qe)?" res-best":""}`),b(Kt,t(Ie).name),b(ge,`${t(Ie).author??""} · ${t(Ie).params_b??""}B`),kt(Ye,1,`fit-badge ${Xe??""}`),b(Gt,t(Ie).fit.text),b(En,`${it??""} · ⬇ ${Lt??""}`)},[()=>g(t(Ie).fit.level),()=>f(t(Ie).fit),()=>(t(Ie).downloads||0).toLocaleString()]),m(pt,dt)}),D(()=>b(me,t(de).title)),m(F,nt)}),m(k,_)};K(H,k=>{var _;t($)&&!t(S)?k(Pe):(_=t(S))!=null&&_.categories&&k(le,1)})}var Le=s(R,2),Ze=s(l(Le),4),tt=l(Ze),ke=s(tt,2),Ee=l(ke);Ee.value=Ee.__value="downloads";var De=s(Ee);De.value=De.__value="trending";var Ft=s(De);Ft.value=Ft.__value="created_at";var Nt=s(ke,2),Jt=l(Nt),an=s(Ze,2);st(an,20,()=>["","coder","vision","reasoning","chat","agent"],rt,(k,_)=>{var q=lc(),F=l(q);D(()=>{kt(q,1,t(V)===_?"primary":"ghost"),b(F,_||"Alle")}),A("click",q,()=>{h(V,_,!0),Mt()}),m(k,q)});var bn=s(an,2);{var Fe=k=>{var _=dc();st(_,21,()=>t(ae),rt,(q,F,de)=>{var nt=oc(),ot=l(nt);{var re=zt=>{var wt=Xi();m(zt,wt)};K(ot,zt=>{de===t(be)&&zt(re)})}var me=s(ot,2),$e=l(me),pt=l($e),Ie=l(pt),qe=s(pt,2),dt=l(qe),Ct=s($e,2),Yt=l(Ct),ft=s(me,2),Be=l(ft);Ae(Be,()=>vt(c(t(F).id)));var Tt=s(Be,2);Ae(Tt,()=>$t(t(F).id));var Kt=s(ft,4),mt=l(Kt),ge=l(mt),Ye=s(mt,2),Gt=l(Ye);D((zt,wt,Rn,Un,En)=>{kt(nt,1,`card${de===t(be)?" res-best":""}`),b(Ie,zt),b(dt,t(F).author||""),kt(Ct,1,`fit-badge ${wt??""}`),b(Yt,Rn),b(ge,Un),b(Gt,`⬇ ${En??""}`)},[()=>t(F).id.split("/").pop(),()=>t(fe)[de]?g(t(fe)[de]):"warn",()=>t(fe)[de]?E(t(fe)[de]):"prüfe…",()=>t(fe)[de]?f({req_gb:0,tps:0}):"Hardware-Fit…",()=>(t(F).downloads||0).toLocaleString()]),A("click",nt,()=>z(t(F).id,t(F).id.split("/").pop())),m(q,nt)}),m(k,_)};K(bn,k=>{t(ae).length&&k(Fe)})}var gt=s(Le,2);{var Bn=k=>{const _=I(()=>t(Se));var q=mc(),F=l(q),de=l(F),nt=s(de,2),ot=l(nt),re=s(nt,2),me=l(re),$e=s(re,2);st($e,21,()=>t(_).models,rt,(ft,Be)=>{var Tt=pc(),Kt=l(Tt),mt=l(Kt),ge=l(mt),Ye=l(ge),Gt=s(ge,2),zt=l(Gt),wt=s(Gt,2);Ae(wt,()=>$t(t(Be).repo));var Rn=s(mt,2);{var Un=at=>{var yt=cc(),Xe=l(yt);D(()=>b(Xe,t(Be).why)),m(at,yt)};K(Rn,at=>{t(Be).why&&at(Un)})}var En=s(Rn,2);{var Sa=at=>{var yt=uc(),Xe=l(yt);D((it,Lt,An)=>b(Xe,`~${it??""} GB · ~${Lt??""} Tok/s · optimal ~${An??""}k Kontext`),[()=>(t(Be).fit.req_gb??0).toFixed(1),()=>Math.round(t(Be).fit.tps??0),()=>Math.round((t(Be).optimal_ctx||8192)/1024)]),m(at,yt)};K(En,at=>{t(Be).fit&&at(Sa)})}var ct=s(Kt,2);{var Ke=at=>{var yt=vc(),Xe=l(yt);D(it=>{kt(yt,1,`fit-badge ${it??""}`),b(Xe,t(Be).fit.text)},[()=>g(t(Be).fit.level)]),m(at,yt)};K(ct,at=>{t(Be).fit&&at(Ke)})}D(()=>{b(Ye,t(Be).name),b(zt,t(Be).role)}),m(ft,Tt)});var pt=s($e,2);{var Ie=ft=>{const Be=I(()=>Math.max(...t(_).models.map(ge=>{var Ye;return((Ye=ge.fit)==null?void 0:Ye.req_gb)??0})));var Tt=fc(),Kt=s(l(Tt)),mt=l(Kt);D(ge=>b(mt,`~${ge??""} GB`),[()=>t(Be).toFixed(1)]),m(ft,Tt)};K(pt,ft=>{t(_).models.length&&t(_).models[0].fit&&ft(Ie)})}var qe=s(pt,2);{var dt=ft=>{const Be=I(()=>t(y).find(ge=>!ge.user&&ge.fit_level!=="too_tight"&&ge.id!==t(_).id));var Tt=gc(),Kt=s(l(Tt));{var mt=ge=>{var Ye=hc(),Gt=s(We(Ye)),zt=l(Gt);D(()=>b(zt,`„${t(Be).title??""}" ansehen`)),A("click",Gt,wt=>{wt.preventDefault(),h(Se,null),setTimeout(()=>It(t(Be).id),50)}),m(ge,Ye)};K(Kt,ge=>{t(Be)&&ge(mt)})}m(ft,Tt)};K(qe,ft=>{t(_).fit_level==="too_tight"&&ft(dt)})}var Ct=s(qe,2),Yt=l(Ct);D(()=>{b(ot,t(_).title),b(me,t(_).desc),kt(Ct,1,`primary${t(_).fit_level==="too_tight"?" warn":""}`),b(Yt,t(_).fit_level==="too_tight"?"Trotzdem installieren (nicht empfohlen)":"Komplettes Setup installieren")}),A("click",q,ft=>{ft.target.classList.contains("modal-overlay")&&h(Se,null)}),A("click",de,()=>h(Se,null)),A("click",Ct,()=>qt(t(_).id)),m(k,q)};K(gt,k=>{t(Se)&&k(Bn)})}var Wn=s(gt,2);{var ra=k=>{var _=Mc(),q=l(_),F=l(q),de=s(F,2),nt=l(de),ot=s(de,2),re=l(ot),me=s(ot,2);{var $e=qe=>{var dt=bc();m(qe,dt)},pt=qe=>{var dt=xc(),Ct=s(We(dt),2);st(Ct,21,()=>t(Y).files,rt,(ct,Ke)=>{const at=I(()=>t(Ke).fit.level==="perfect"?"●":t(Ke).fit.level==="marginal"?"◐":"○");var yt=Yr(),Xe=l(yt),it={};D(()=>{b(Xe,`${t(at)??""} ${t(Ke).filename??""}`),it!==(it=t(Ke).filename)&&(yt.value=(yt.__value=t(Ke).filename)??"")}),m(ct,yt)});var Yt=s(Ct,2),ft=l(Yt),Be=s(l(ft),2),Tt=s(ft,2),Kt=l(Tt),mt=s(l(Kt));Ae(mt,()=>gr(a));var ge=s(Kt,2),Ye=s(Yt,2);{var Gt=ct=>{var Ke=_c(),at=s(l(Ke)),yt=l(at),Xe=s(at,2);D(it=>b(yt,`~${it??""}k`),[()=>Math.round(t(ie).optimal_ctx/1024)]),A("click",Xe,it=>{it.preventDefault(),h(te,t(ie).optimal_ctx,!0)}),m(ct,Ke)};K(Ye,ct=>{var Ke;(Ke=t(ie))!=null&&Ke.optimal_ctx&&ct(Gt)})}var zt=s(Ye,2);{var wt=ct=>{var Ke=kc(),at=l(Ke),yt=s(l(at),2),Xe=l(yt),it=s(at,2),Lt=l(it);D((An,ki,Wi)=>{b(Xe,`~${An??""} GB · ~${ki??""} Tok/s · ${(t(ie).quant||"GGUF")??""}`),kt(it,1,`fit-badge ${Wi??""}`),b(Lt,t(ie).fit.text)},[()=>(t(ie).fit.req_gb??0).toFixed(1),()=>Math.round(t(ie).fit.tps??0),()=>g(t(ie).fit.level)]),m(ct,Ke)};K(zt,ct=>{t(ie)&&ct(wt)})}var Rn=s(zt,2);{var Un=ct=>{const Ke=I(()=>t(Y).files.find(Lt=>Lt.fit.level!=="too_tight"&&Lt.filename!==t(ue)));var at=di(),yt=We(at);{var Xe=Lt=>{var An=wc(),ki=s(l(An)),Wi=l(ki);D(Vi=>b(Wi,`${t(Ke).filename??""} (${Vi??""})`),[()=>E(t(Ke).fit.level)]),A("click",ki,Vi=>{Vi.preventDefault(),h(ue,t(Ke).filename,!0),N()}),m(Lt,An)},it=Lt=>{var An=yc();m(Lt,An)};K(yt,Lt=>{t(Ke)?Lt(Xe):Lt(it,-1)})}m(ct,at)};K(Rn,ct=>{var Ke,at;((Ke=t(ie))==null?void 0:Ke.fit.level)==="too_tight"&&((at=t(Y))!=null&&at.files)&&ct(Un)})}var En=s(Rn,2),Sa=l(En);D(()=>{var ct,Ke;kt(En,1,`primary${((ct=t(ie))==null?void 0:ct.fit.level)==="too_tight"?" warn":""}`),En.disabled=t(Te),b(Sa,t(Te)?"Starte…":((Ke=t(ie))==null?void 0:Ke.fit.level)==="too_tight"?"Trotzdem holen (zu groß — nicht empfohlen)":"Herunterladen & Einpflegen")}),A("change",Ct,N),ri(Ct,()=>t(ue),ct=>h(ue,ct)),Cn(Be,()=>t(Ue),ct=>h(Ue,ct)),Cn(ge,()=>t(te),ct=>h(te,ct)),A("click",En,Me),m(qe,dt)},Ie=qe=>{var dt=Sc();m(qe,dt)};K(me,qe=>{var dt,Ct;t(Te)&&!t(Y)?qe($e):(Ct=(dt=t(Y))==null?void 0:dt.files)!=null&&Ct.length?qe(pt,1):t(Te)||qe(Ie,2)})}D(()=>{b(nt,t(bt)),b(re,t(C))}),A("click",_,qe=>{qe.target.classList.contains("modal-overlay")&&h(Ne,!1)}),A("click",F,()=>h(Ne,!1)),m(k,_)};K(Wn,k=>{t(Ne)&&k(ra)})}var Vn=s(Wn,2);{var ja=k=>{var _=Ac(),q=l(_),F=l(q),de=s(F,2),nt=l(de),ot=s(de,6),re=s(ot,4),me=s(re,4);st(me,17,()=>t(U),rt,(qe,dt,Ct)=>{var Yt=Ec(),ft=l(Yt),Be=s(ft,2),Tt=s(Be,2);st(Tt,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],rt,(mt,ge)=>{var Ye=Yr(),Gt=l(Ye),zt={};D(()=>{b(Gt,ge),zt!==(zt=ge)&&(Ye.__value=ge)}),m(mt,Ye)});var Kt=s(Tt,2);Cn(ft,()=>t(dt).repo,mt=>t(dt).repo=mt),Cn(Be,()=>t(dt).role,mt=>t(dt).role=mt),ri(Tt,()=>t(dt).quant,mt=>t(dt).quant=mt),A("click",Kt,()=>h(U,t(U).filter((mt,ge)=>ge!==Ct),!0)),m(qe,Yt)});var $e=s(me,2),pt=s($e,4),Ie=l(pt);D(()=>{b(nt,t(ce)?"Setup bearbeiten":"Eigenes Setup erstellen"),b(Ie,t(ce)?"Änderungen speichern":"Setup speichern")}),A("click",_,qe=>{qe.target.classList.contains("modal-overlay")&&h(lt,!1)}),A("click",F,()=>h(lt,!1)),Cn(ot,()=>t(je),qe=>h(je,qe)),Cn(re,()=>t(B),qe=>h(B,qe)),A("click",$e,()=>h(U,[...t(U),{repo:"",role:"",quant:"Q4_K_M"}],!0)),A("click",pt,He),m(k,_)};K(Vn,k=>{t(lt)&&k(ja)})}D(()=>{et.disabled=t($),b(M,t($)?"Suche…":"Aktualisieren"),Nt.disabled=t(xe),b(Jt,t(xe)?"Lade…":"Suchen")}),A("click",W,G),A("click",et,()=>St(!0)),A("keydown",tt,k=>k.key==="Enter"&&Mt()),Cn(tt,()=>t(oe),k=>h(oe,k)),ri(ke,()=>t(Q),k=>h(Q,k)),A("click",Nt,Mt),m(e,_t),ia()}xa(["click","keydown","change"]);var zc=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.
`),Pc=w(' '),Dc=w('
'),$c=w(' '),Lc=w('
Auswahl aufheben (alle)
'),Xr=w(''),Ic=w('

Jan AI ist eine Desktop-App — kein Browser, kein Server, kein Admin-Panel. Einfach installieren und loslegen.

Jan AI öffnen → linke Leiste → Remote-Modelle+ Modell hinzufügen:

API-Key: ein beliebiger Wert (z.B. local). Jan AI fragt danach beim Einrichten.
Jan AI herunterladen: jan.ai — kostenlos, open source, Windows/macOS/Linux.
',1),Bc=w('

Datei anlegen oder öffnen: ~/.continue/config.json

Falls bereits eine config.json vorhanden: nur den "models"-Eintrag ergänzen, nicht die ganze Datei ersetzen.

Danach Continue in VS Code neu starten → im Chat-Panel das Modell wählen.

Continue: continue.dev — kostenlose VS Code / JetBrains Extension. Hinweis: 2026 von Cursor akquiriert — aktuell weiter aktiv und kostenlos.
',1),Rc=w('

Antigravity (Googles agentic IDE, VS Code-basiert) unterstützt OpenAI-kompatible Endpoints direkt:

Settings → Models → Custom Endpoint+ hinzufügen:

API-Key: ein beliebiger Wert (z.B. local). Danach das Modell in der Model-Liste auswählen.
Antigravity herunterladen: antigravityide.net — kostenlose Einzelperson-Tier, VS Code-basiert.
',1),Oc=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),Fc=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),qc=w('

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

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

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

',1),Kc=w('

Bilder einbinden (Vision)

Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.
'),Gc=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?
Chat
Coding-Assistenten

4 · Config-Snippet

',1),Wc=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.
'),Vc=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 Uc(e,n){aa(n,!0);const a=I(()=>_i.value),i=I(()=>{var B;return(((B=t(a))==null?void 0:B.models)||[]).filter(U=>!U.incomplete)}),r=I(v);let o=O("zed"),d=O(Ht([])),c=O(""),u=O(!1);function v(){return`http://${location.hostname}:8080/v1`}function g(B){return/^\d{1,3}(\.\d{1,3}){3}$/.test(B)}function E(){return location.protocol==="https:"||!g(location.hostname)}const f=I(()=>t(d).length?t(d):t(i).map(B=>B.name)),y=I(()=>t(f)[0]||"coder"),T=I(()=>{var B;return(B=t(i).find(U=>{var ce,Oe;return(Oe=(ce=U.meta)==null?void 0:ce.caps)==null?void 0:Oe.includes("Bild")}))==null?void 0:B.name});function P(B,U){const Oe=(U.length?t(i).filter(he=>U.includes(he.name)):t(i).length?t(i):[{name:"coder",meta:{}}]).map(he=>{var Mt,Et;const St=(((Mt=he.meta)==null?void 0:Mt.caps)||[]).some(At=>/Bild|Vision/i.test(At)),ht=((Et=he.meta)==null?void 0:Et.ctx)||131072;return` { "name": "${he.name}", "display_name": "${he.name}", "max_tokens": ${ht}${St?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`, `);return`"language_models": { "openai_compatible": { "bosgame": { - "api_url": "${L}", + "api_url": "${B}", "available_models": [ -${ge} +${Oe} ] } } -}`}function x(L,V){const ge=(V.length?n(r).filter(Te=>V.includes(Te.name)):n(r).length?n(r):[{name:"coder",meta:{}}]).map(Te=>{var ft;const bt=((ft=Te.meta)==null?void 0:ft.ctx)||131072;return` "${Te.name}": { "name": "${Te.name}", "contextWindowSize": ${bt} }`}).join(`, +}`}function S(B,U){const Oe=(U.length?t(i).filter(he=>U.includes(he.name)):t(i).length?t(i):[{name:"coder",meta:{}}]).map(he=>{var ht;const St=((ht=he.meta)==null?void 0:ht.ctx)||131072;return` "${he.name}": { "name": "${he.name}", "contextWindowSize": ${St} }`}).join(`, `);return`"provider": { "llama-swap": { "npm": "@ai-sdk/openai-compatible", "name": "Bosgame (llama-swap)", "options": { - "baseURL": "${L}", + "baseURL": "${B}", "apiKey": "local" }, "models": { -${ge} +${Oe} } } -}`}async function D(){h(c,"Teste…");try{const L=await Me("/api/integration/test");h(u,L.ok,!0),h(c,L.ok?`✓ Verbunden — ${L.models.length} Modell(e): ${L.models.join(", ")}`:`✗ Keine Verbindung: ${L.error}`,!0)}catch(L){h(u,!1),h(c,"✗ "+L.message)}}function ke(L){var ie;const V=L.querySelector("code");V&&((ie=navigator.clipboard)==null||ie.writeText(V.textContent||""))}function te(L){var V;(V=navigator.clipboard)==null||V.writeText(L.value)}var ue=Kc(),Ae=s(ct(ue),2),K=s(l(Ae),6),W=l(K),pe=s(W,2),he=s(K,2);{var De=L=>{var V=Cc();m(L,V)},We=O(()=>E());F(he,L=>{n(We)&&L(De)})}var mt=s(he,2),A=l(mt),H=s(A,2);{var re=L=>{var V=zc(),ie=l(V);$(()=>{fn(V,`color:${n(u)?"#7ee29a":"#ff9b95"}`),b(ie,n(c))}),m(L,V)};F(H,L=>{n(c)&&L(re)})}var Ve=s(Ae,2),Q=s(l(Ve),2);dt(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."]],ot,(L,V)=>{var ie=O(()=>sr(V,3));let ge=()=>n(ie)[0],Te=()=>n(ie)[1],bt=()=>n(ie)[2];var ft=Pc(),xt=l(ft),Ct=l(xt),St=s(xt,2),Pt=l(St),Ot=l(Pt),Rt=s(Pt,2),z=l(Rt);$(()=>{b(Ct,ge()),b(Ot,Te()),b(z,bt())}),m(L,ft)});var $e=s(Ve,2);{var Y=L=>{var V=Nc(),ie=ct(V),ge=l(ie),Te=s(l(ge),2),bt=l(Te),ft=s(ge,4);dt(ft,21,()=>n(r),ot,(J,de)=>{const se=O(()=>n(d).includes(n(de).name));var Z=Dc(),be=l(Z);$(()=>{fn(Z,`cursor:pointer;${n(se)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),b(be,n(de).name)}),C("click",Z,()=>h(d,n(se)?n(d).filter(ve=>ve!==n(de).name):[...n(d),n(de).name],!0)),C("keydown",Z,ve=>ve.key==="Enter"&&h(d,n(se)?n(d).filter(ye=>ye!==n(de).name):[...n(d),n(de).name],!0)),m(J,Z)});var xt=s(ft,2);{var Ct=J=>{var de=$c(),se=l(de);C("click",se,Z=>{Z.preventDefault(),h(d,[],!0)}),m(J,de)};F(xt,J=>{n(d).length&&J(Ct)})}var St=s(ie,2),Pt=s(l(St),4);dt(Pt,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"]],ot,(J,de)=>{var se=O(()=>sr(de,3));let Z=()=>n(se)[0],be=()=>n(se)[1],ve=()=>n(se)[2];var ye=Lc(),xe=l(ye),_e=l(xe),M=s(xe,2),U=l(M);$(()=>{kt(ye,1,`card-btn${n(o)===Z()?" cb-best":""}`),b(_e,be()),b(U,ve())}),C("click",ye,()=>h(o,Z(),!0)),m(J,ye)});var Ot=s(St,2),Rt=s(l(Ot),2);{var z=J=>{const de=O(()=>P(n(i),n(f)));var se=Oc(),Z=s(ct(se),4),be=l(Z),ve=s(be,2),ye=l(ve),xe=l(ye),_e=s(Z,4),M=s(l(_e)),U=l(M);$(()=>{b(xe,n(de)),b(U,`bosgame / ${n(y)??""}`)}),C("click",be,le=>ke(le.currentTarget.parentElement)),m(J,se)},q=J=>{const de=O(()=>x(n(i),n(f)));var se=Ic(),Z=s(ct(se),6),be=l(Z),ve=s(be,2),ye=l(ve),xe=l(ye),_e=s(Z,2),M=s(l(_e),3),U=l(M);$(()=>{b(xe,n(de)),b(U,`llama-swap/${n(y)??""}`)}),C("click",be,le=>ke(le.currentTarget.parentElement)),m(J,se)},Ce=J=>{var de=Rc(),se=s(ct(de),4),Z=l(se),be=s(Z,2),ve=s(se,4),ye=l(ve),xe=s(ye,2);$(()=>{kr(Z,n(i)),kr(ye,n(y))}),C("click",be,_e=>te(_e.currentTarget.previousElementSibling)),C("click",xe,_e=>te(_e.currentTarget.previousElementSibling)),m(J,de)},ut=J=>{var de=Bc(),se=s(ct(de),4),Z=l(se),be=s(Z,2),ve=s(se,4),ye=l(ve),xe=s(ye,2);$(()=>kr(Z,n(i))),C("click",be,_e=>te(_e.currentTarget.previousElementSibling)),C("click",xe,_e=>te(_e.currentTarget.previousElementSibling)),m(J,de)};F(Rt,J=>{n(o)==="zed"?J(z):n(o)==="opencode"?J(q,1):n(o)==="cline"?J(Ce,2):n(o)==="openwebui"&&J(ut,3)})}var N=s(Ot,2);{var Le=J=>{const de=O(()=>`curl ${n(i)}/chat/completions \\ +}`}function $(B,U){return`{ + "models": [ +${(U.length?t(i).filter(he=>U.includes(he.name)):t(i).length?t(i):[{name:"coder",meta:{}}]).map(he=>` { + "title": "llama-swap / ${he.name}", + "provider": "openai", + "model": "${he.name}", + "apiBase": "${B}", + "apiKey": "local" + }`).join(`, +`)} + ] +}`}async function Ce(){h(c,"Teste…");try{const B=await we("/api/integration/test");h(u,B.ok,!0),h(c,B.ok?`✓ Verbunden — ${B.models.length} Modell(e): ${B.models.join(", ")}`:`✗ Keine Verbindung: ${B.error}`,!0)}catch(B){h(u,!1),h(c,"✗ "+B.message)}}function oe(B){var ce;const U=B.querySelector("code");U&&((ce=navigator.clipboard)==null||ce.writeText(U.textContent||""))}function ae(B){var U;(U=navigator.clipboard)==null||U.writeText(B.value)}var xe=Vc(),V=s(We(xe),2),Q=s(l(V),6),fe=l(Q),be=s(fe,2),Se=s(Q,2);{var Ne=B=>{var U=zc();m(B,U)},bt=I(()=>E());K(Se,B=>{t(bt)&&B(Ne)})}var C=s(Se,2),Y=l(C),ue=s(Y,2);{var Ue=B=>{var U=Pc(),ce=l(U);D(()=>{fn(U,`color:${t(u)?"#7ee29a":"#ff9b95"}`),b(ce,t(c))}),m(B,U)};K(ue,B=>{t(c)&&B(Ue)})}var te=s(V,2),Te=s(l(te),2);st(Te,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."]],rt,(B,U)=>{var ce=I(()=>Ca(U,3));let Oe=()=>t(ce)[0],he=()=>t(ce)[1],St=()=>t(ce)[2];var ht=Dc(),Mt=l(ht),Et=l(Mt),At=s(Mt,2),It=l(At),qt=l(It),z=s(It,2),N=l(z);D(()=>{b(Et,Oe()),b(qt,he()),b(N,St())}),m(B,ht)});var ie=s(te,2);{var lt=B=>{var U=Gc(),ce=We(U),Oe=l(ce),he=s(l(Oe),2),St=l(he),ht=s(Oe,4);st(ht,21,()=>t(i),rt,(j,ee)=>{const W=I(()=>t(d).includes(t(ee).name));var J=$c(),x=l(J);D(()=>{fn(J,`cursor:pointer;${t(W)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),b(x,t(ee).name)}),A("click",J,()=>h(d,t(W)?t(d).filter(L=>L!==t(ee).name):[...t(d),t(ee).name],!0)),A("keydown",J,L=>L.key==="Enter"&&h(d,t(W)?t(d).filter(R=>R!==t(ee).name):[...t(d),t(ee).name],!0)),m(j,J)});var Mt=s(ht,2);{var Et=j=>{var ee=Lc(),W=l(ee);A("click",W,J=>{J.preventDefault(),h(d,[],!0)}),m(j,ee)};K(Mt,j=>{t(d).length&&j(Et)})}var At=s(ce,2),It=s(l(At),6);st(It,20,()=>[["janai","Jan AI","Einfachstes Chat-Interface — Desktop-App, kein Setup"],["openwebui","OpenWebUI","Browser-Chat für Teams — mehr Features, mehr Setup"]],rt,(j,ee)=>{var W=I(()=>Ca(ee,3));let J=()=>t(W)[0],x=()=>t(W)[1],L=()=>t(W)[2];var R=Xr(),ne=l(R),Z=l(ne),Je=s(ne,2),Qe=l(Je);D(()=>{kt(R,1,`card-btn${t(o)===J()?" cb-best":""}`),b(Z,x()),b(Qe,L())}),A("click",R,()=>h(o,J(),!0)),m(j,R)});var qt=s(It,4);st(qt,20,()=>[["continue","Continue","VS Code/JetBrains — Hilfe ohne Agent-Overhead"],["cline","Cline","VS Code/JetBrains/Zed — voller Coding-Agent"],["antigravity","Antigravity","Googles agentic IDE — VS Code-basiert"],["opencode","OpenCode","Terminal-Agent — autonom, mächtig"],["zed","Zed","Schneller nativer Editor mit KI-Panel"]],rt,(j,ee)=>{var W=I(()=>Ca(ee,3));let J=()=>t(W)[0],x=()=>t(W)[1],L=()=>t(W)[2];var R=Xr(),ne=l(R),Z=l(ne),Je=s(ne,2),Qe=l(Je);D(()=>{kt(R,1,`card-btn${t(o)===J()?" cb-best":""}`),b(Z,x()),b(Qe,L())}),A("click",R,()=>h(o,J(),!0)),m(j,R)});var z=s(At,2),N=s(l(z),2);{var Me=j=>{var ee=Ic(),W=s(We(ee),6),J=l(W),x=s(J,2),L=s(W,4),R=l(L),ne=s(R,2);D(()=>{Hn(J,t(r)),Hn(R,t(y))}),A("click",x,Z=>ae(Z.currentTarget.previousElementSibling)),A("click",ne,Z=>ae(Z.currentTarget.previousElementSibling)),m(j,ee)},ut=j=>{const ee=I(()=>$(t(r),t(f)));var W=Bc(),J=s(We(W),4),x=l(J),L=s(x,2),R=l(L),ne=l(R),Z=s(J,2),Je=s(l(Z)),Qe=l(Je);D(()=>{b(ne,t(ee)),b(Qe,`llama-swap / ${t(y)??""}`)}),A("click",x,et=>oe(et.currentTarget.parentElement)),m(j,W)},G=j=>{var ee=Rc(),W=s(We(ee),6),J=l(W),x=s(J,2),L=s(W,4),R=l(L),ne=s(R,2),Z=s(L,2),Je=s(l(Z),3),Qe=l(Je);D(()=>{Hn(J,t(r)),Hn(R,t(y)),b(Qe,t(y))}),A("click",x,et=>ae(et.currentTarget.previousElementSibling)),A("click",ne,et=>ae(et.currentTarget.previousElementSibling)),m(j,ee)},ze=j=>{const ee=I(()=>P(t(r),t(f)));var W=Oc(),J=s(We(W),4),x=l(J),L=s(x,2),R=l(L),ne=l(R),Z=s(J,4),Je=s(l(Z)),Qe=l(Je);D(()=>{b(ne,t(ee)),b(Qe,`bosgame / ${t(y)??""}`)}),A("click",x,et=>oe(et.currentTarget.parentElement)),m(j,W)},He=j=>{const ee=I(()=>S(t(r),t(f)));var W=Fc(),J=s(We(W),6),x=l(J),L=s(x,2),R=l(L),ne=l(R),Z=s(J,2),Je=s(l(Z),3),Qe=l(Je);D(()=>{b(ne,t(ee)),b(Qe,`llama-swap/${t(y)??""}`)}),A("click",x,et=>oe(et.currentTarget.parentElement)),m(j,W)},Dt=j=>{var ee=qc(),W=s(We(ee),4),J=l(W),x=s(J,2),L=s(W,4),R=l(L),ne=s(R,2);D(()=>{Hn(J,t(r)),Hn(R,t(y))}),A("click",x,Z=>ae(Z.currentTarget.previousElementSibling)),A("click",ne,Z=>ae(Z.currentTarget.previousElementSibling)),m(j,ee)},$t=j=>{var ee=Nc(),W=s(We(ee),4),J=l(W),x=s(J,2),L=s(W,4),R=l(L),ne=s(R,2);D(()=>Hn(J,t(r))),A("click",x,Z=>ae(Z.currentTarget.previousElementSibling)),A("click",ne,Z=>ae(Z.currentTarget.previousElementSibling)),m(j,ee)};K(N,j=>{t(o)==="janai"?j(Me):t(o)==="continue"?j(ut,1):t(o)==="antigravity"?j(G,2):t(o)==="zed"?j(ze,3):t(o)==="opencode"?j(He,4):t(o)==="cline"?j(Dt,5):t(o)==="openwebui"&&j($t,6)})}var vt=s(z,2);{var _t=j=>{const ee=I(()=>`curl ${t(r)}/chat/completions \\ -H "Content-Type: application/json" \\ -d '{ - "model": "${n(T)}", + "model": "${t(T)}", "messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,"}}]}] -}'`);var se=Fc(),Z=l(se),be=s(l(Z),2),ve=l(be);Pe(ve,()=>Dt("check"));var ye=s(ve),xe=s(Z,4),_e=l(xe),M=s(_e,2),U=l(M),le=l(U);$(()=>{b(ye,` „${n(T)??""}" bereit`),b(le,n(de))}),C("click",_e,Je=>ke(Je.currentTarget.parentElement)),m(J,se)};F(N,J=>{n(T)&&J(Le)})}$(()=>b(bt,n(d).length?`${n(d).length} von ${n(r).length} ausgewählt`:"alle werden eingeschlossen")),m(L,V)},rt=L=>{var V=qc(),ie=s(l(V),2),ge=s(l(ie),4);C("click",ge,()=>{var Te;return(Te=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:Te.dispatchEvent(new MouseEvent("click"))}),m(L,V)};F($e,L=>{n(r).length?L(Y):L(rt,-1)})}$(()=>kr(W,n(i))),C("click",pe,L=>{const V=L.currentTarget.previousElementSibling;te(V)}),C("click",A,D),m(e,ue),aa()}ya(["click","keydown"]);var Wc=k('
'),Vc=k('

Für dich: Upgrades

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

News

Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
',1);function Xc(e,t){na(t,!0);let a=I(Vt([])),r=I(Vt([])),i=I(!0),o=I("");const d=K=>K==="perfect"?"ok":K==="marginal"?"warn":"bad";function c(K){const W=Math.max(0,Date.now()/1e3-K);return W<60?W+"s":W<3600?Math.floor(W/60)+"m":W<86400?Math.floor(W/3600)+"h":Math.floor(W/86400)+"d"}async function u(){h(i,!0),h(o,"");try{h(a,(await Me("/api/news")).items||[],!0)}catch(K){h(o,K.message||"Fehler beim Laden",!0)}finally{h(i,!1)}}async function v(){try{h(r,(await Me("/api/cookbook/upgrades")).upgrades||[],!0)}catch{h(r,[],!0)}}async function g(K,W){var pe;W.disabled=!0,W.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()})}),(pe=document.querySelector(".nav-item[data-view='activity']"))==null||pe.dispatchEvent(new MouseEvent("click"))}catch(he){W.disabled=!1,W.textContent="Installieren",alert("Fehler: "+he.message)}}function E(){u(),v()}mr(()=>{u(),v()});var f=Yc(),y=ct(f),T=s(l(y),2),P=s(y,2);{var x=K=>{var W=Vc(),pe=l(W),he=s(l(pe),2),De=l(he),We=s(pe,4);dt(We,21,()=>n(r),ot,(mt,A)=>{var H=Wc(),re=l(H),Ve=l(re),Q=l(Ve),$e=l(Q),Y=s(Q,2),rt=l(Y),L=s(Ve,2),V=l(L),ie=s(re,2);$(ge=>{b($e,n(A).name),kt(Y,1,`fit-badge ${ge??""}`),b(rt,n(A).fit.text),b(V,`Ersetzt dein „${n(A).old??""}". ${n(A).why??""}`)},[()=>d(n(A).fit.level)]),C("click",ie,ge=>g(n(A),ge.currentTarget)),m(mt,H)}),$(()=>b(De,n(r).length)),m(K,W)};F(P,K=>{n(r).length&&K(x)})}var D=s(P,2);{var ke=K=>{var W=Uc();m(K,W)},te=K=>{var W=Hc(),pe=l(W);$(()=>b(pe,n(o))),m(K,W)},ue=K=>{var W=jc();m(K,W)},Ae=K=>{var W=Zc();dt(W,21,()=>n(a),ot,(pe,he,De)=>{var We=Qc();kt(We,1,`news-card${De===0?" featured":""}`);var mt=l(We),A=l(mt),H=l(A),re=s(A,2);{var Ve=L=>{var V=Jc();m(L,V)};F(re,L=>{n(he).relevant&&L(Ve)})}var Q=s(re,2),$e=l(Q),Y=s(mt,2),rt=l(Y);$(L=>{qr(We,"href",n(he).link),b(H,n(he).source),b($e,L),b(rt,n(he).title)},[()=>n(he).ts?c(n(he).ts):""]),m(pe,We)}),m(K,W)};F(D,K=>{n(i)?K(ke):n(o)?K(te,1):n(a).length?K(Ae,-1):K(ue,2)})}C("click",T,E),m(e,f),aa()}ya(["click"]);const eu=[{label:"Einstieg",tutorials:[["Dein erster Workflow — in 3 Schritten",` +}'`);var W=Kc(),J=l(W),x=s(l(J),2),L=l(x);Ae(L,()=>Bt("check"));var R=s(L),ne=s(J,4),Z=l(ne),Je=s(Z,2),Qe=l(Je),et=l(Qe);D(()=>{b(R,` „${t(T)??""}" bereit`),b(et,t(ee))}),A("click",Z,M=>oe(M.currentTarget.parentElement)),m(j,W)};K(vt,j=>{t(T)&&j(_t)})}D(()=>b(St,t(d).length?`${t(d).length} von ${t(i).length} ausgewählt`:"alle werden eingeschlossen")),m(B,U)},je=B=>{var U=Wc(),ce=s(l(U),2),Oe=s(l(ce),4);A("click",Oe,()=>{var he;return(he=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:he.dispatchEvent(new MouseEvent("click"))}),m(B,U)};K(ie,B=>{t(i).length?B(lt):B(je,-1)})}D(()=>Hn(fe,t(r))),A("click",be,B=>{const U=B.currentTarget.previousElementSibling;ae(U)}),A("click",Y,Ce),m(e,xe),ia()}xa(["click","keydown"]);var jc=w('
'),Hc=w('

Für dich: Upgrades

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

News

Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
',1);function nu(e,n){aa(n,!0);let a=O(Ht([])),i=O(Ht([])),r=O(!0),o=O("");const d=V=>V==="perfect"?"ok":V==="marginal"?"warn":"bad";function c(V){const Q=Math.max(0,Date.now()/1e3-V);return Q<60?Q+"s":Q<3600?Math.floor(Q/60)+"m":Q<86400?Math.floor(Q/3600)+"h":Math.floor(Q/86400)+"d"}async function u(){h(r,!0),h(o,"");try{h(a,(await we("/api/news")).items||[],!0)}catch(V){h(o,V.message||"Fehler beim Laden",!0)}finally{h(r,!1)}}async function v(){try{h(i,(await we("/api/cookbook/upgrades")).upgrades||[],!0)}catch{h(i,[],!0)}}async function g(V,Q){var fe;Q.disabled=!0,Q.textContent="Starte…";try{await we("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:V.repo,role:V.role,params_b:V.params_b,quant:V.quant,hf_token:li()})}),(fe=document.querySelector(".nav-item[data-view='activity']"))==null||fe.dispatchEvent(new MouseEvent("click"))}catch(be){Q.disabled=!1,Q.textContent="Installieren",alert("Fehler: "+be.message)}}function E(){u(),v()}bi(()=>{u(),v()});var f=tu(),y=We(f),T=s(l(y),2),P=s(y,2);{var S=V=>{var Q=Hc(),fe=l(Q),be=s(l(fe),2),Se=l(be),Ne=s(fe,4);st(Ne,21,()=>t(i),rt,(bt,C)=>{var Y=jc(),ue=l(Y),Ue=l(ue),te=l(Ue),Te=l(te),ie=s(te,2),lt=l(ie),je=s(Ue,2),B=l(je),U=s(ue,2);D(ce=>{b(Te,t(C).name),kt(ie,1,`fit-badge ${ce??""}`),b(lt,t(C).fit.text),b(B,`Ersetzt dein „${t(C).old??""}". ${t(C).why??""}`)},[()=>d(t(C).fit.level)]),A("click",U,ce=>g(t(C),ce.currentTarget)),m(bt,Y)}),D(()=>b(Se,t(i).length)),m(V,Q)};K(P,V=>{t(i).length&&V(S)})}var $=s(P,2);{var Ce=V=>{var Q=Jc();m(V,Q)},oe=V=>{var Q=Qc(),fe=l(Q);D(()=>b(fe,t(o))),m(V,Q)},ae=V=>{var Q=Zc();m(V,Q)},xe=V=>{var Q=eu();st(Q,21,()=>t(a),rt,(fe,be,Se)=>{var Ne=Xc();kt(Ne,1,`news-card${Se===0?" featured":""}`);var bt=l(Ne),C=l(bt),Y=l(C),ue=s(C,2);{var Ue=je=>{var B=Yc();m(je,B)};K(ue,je=>{t(be).relevant&&je(Ue)})}var te=s(ue,2),Te=l(te),ie=s(bt,2),lt=l(ie);D(je=>{Ni(Ne,"href",t(be).link),b(Y,t(be).source),b(Te,je),b(lt,t(be).title)},[()=>t(be).ts?c(t(be).ts):""]),m(fe,Ne)}),m(V,Q)};K($,V=>{t(r)?V(Ce):t(o)?V(oe,1):t(a).length?V(xe,-1):V(ae,2)})}A("click",T,E),m(e,f),ia()}xa(["click"]);const au=[{label:"Einstieg",tutorials:[["Dein erster Workflow — in 3 Schritten",`
  1. Modell holen: Tab Cookbook → Anwendungsfall wählen (z.B. „Coden & Programmieren") → Komplettes Setup installieren. Der Download läuft im Tab Aktivität — einfach warten bis der Job grün wird.
  2. @@ -80,32 +91,50 @@ ${ge}

    Scout immer sofort verfügbar halten: Tab Modelle → Konfigurieren → Immer aktiv halten aktivieren (TTL = ∞). Das Modell bleibt dann dauerhaft im RAM und antwortet ohne Wartezeit — ideal für den kleinen, schnellen Allrounder.

    `]]},{label:"Tools einrichten",tutorials:[["Welches Tool ist das richtige für mich?",` -

    Die Antwort hängt davon ab, was du hauptsächlich tun willst:

    +

    Chat — ich will einfach reden, schreiben, fragen:

    -
    Ich will einfach chatten, Texte schreiben, Fragen stellen
    -
    OpenWebUI — klassische Chat-Oberfläche im Browser. - Kein Programmieren, kein Setup. Ideal als Einstieg.
    +
    Einfachster Einstieg
    +
    Jan AI — Desktop-App, Doppelklick-Installer, sofort loslegen. + Vertraut wie ChatGPT, läuft komplett lokal. Kein Admin-Panel, kein Docker.
    -
    Ich programmiere und will KI in meinem Editor
    -
    Cline — KI-Assistent direkt in VS Code, JetBrains, Cursor, Zed u.a. - Zeigt dir jeden Schritt und fragt vor Änderungen.
    -
    -
    -
    Ich will, dass die KI eigenständig ganze Features baut
    -
    OpenCode — autonomer Coding-Agent im Terminal oder als Desktop-App. - Liest Dateien, schreibt Code, führt Befehle aus.
    -
    -
    -
    Ich will einen schnellen Editor mit eingebautem KI-Panel
    -
    Zed — nativer Editor mit direktem Modell-Zugriff. - Schnell, minimalistisch, für Leute die Gewicht auf Performance legen.
    +
    Teams / Power-User
    +
    OpenWebUI — viele Features (RAG, Bilder, Plugins, Mehrbenutzer). + Mehr Setup-Aufwand, aber der mächtigste Chat-Client.
    -

    Faustregel: Fang mit OpenWebUI an. Wenn du merkst dass - du dieselben Aufgaben immer wieder beschreibst und dann manuell umsetzt — wechsle zu - OpenCode oder Cline.

    `],["OpenCode verbinden und die ersten Schritte",` +

    Coding — ich will KI beim Programmieren:

    +
    +
    +
    Simpler Einstieg in VS Code
    +
    Continue — Chat + Autocomplete direkt im Editor, kein Agent-Overhead. + Macht keinen Schritt ohne dich.
    +
    +
    +
    Voller Coding-Agent im Editor
    +
    Cline — liest Dateien, schreibt Code, fragt vor jeder Änderung. + VS Code, JetBrains, Zed u.a.
    +
    +
    +
    Agent-IDE mit VS Code-Feeling
    +
    Antigravity — Googles agentic IDE (VS Code-Fork), kostenlos. + Multi-Agent, planen + coden + testen in einem.
    +
    +
    +
    Autonomer Terminal-Agent
    +
    OpenCode — mächtigster lokaler Agent, lebt im Terminal. + Ideal für „bau mir Feature X komplett fertig".
    +
    +
    +
    Schneller Editor, minimalistisch
    +
    Zed — nativer Editor (Rust), eingebautes KI-Panel. + Für Leute die Performance über Features stellen.
    +
    +
    +

    Faustregel: Fang mit Jan AI zum Chatten an. + Für Coding: Continue als sanfter Einstieg oder gleich Cline/Antigravity + wenn du bereit bist, dem Agenten mehr Kontrolle zu geben.

    `],["OpenCode verbinden und die ersten Schritte",`

    OpenCode ist installiert? Dann in vier Schritten verbinden:

    1. Config-Snippet holen: Tab VerbindenOpenCode auswählen → @@ -168,19 +197,83 @@ ${ge} Achtung: Jedes Zeichen in .clinerules verbraucht Kontext — kurze, präzise Regeln schlagen lange Listen.

      Ausgaben-Limit (seit April 2026): In Settings → Spending Limits kannst du ein Tages- oder Monats-Budget setzen — verhindert dass ein laufender Agent unbemerkt viel Token verbraucht.

      -

      Weitere Infos: cline.bot · Memory Bank Docs

      `],["OpenWebUI — chatten ohne Vorkenntnisse",` -

      OpenWebUI ist installiert? Verbinden in 3 Schritten:

      +

      Weitere Infos: cline.bot · Memory Bank Docs

      `],["Jan AI — einfachstes Chat-Interface",` +

      Jan AI ist die einfachste Art, lokal mit KI zu chatten — + Desktop-App, kein Terminal, kein Docker, kein Admin-Panel.

      +
        +
      1. Jan AI installieren: jan.ai + → Download → Doppelklick-Installer (Windows/macOS/Linux).
      2. +
      3. Remote-Modell hinzufügen: In der linken Leiste auf das Hub-Icon → + oben rechts + Remote-Modell.
      4. +
      5. Verbindung eintragen: Tab VerbindenJan AI auswählen → + Basis-URL und Modell-ID kopieren und in Jan einfügen.
      6. +
      7. API-Key: irgendeinen Text (z.B. local). Speichern.
      8. +
      +

      Danach erscheint das Modell in der Modell-Liste — auswählen und loslegen.

      +

      Gut für: Chatten, Texte schreiben, übersetzen, Fragen stellen — + genauso wie ChatGPT, aber 100% lokal und privat. Bilder mitschicken klappt auch + sobald ein Vision-Modell eingetragen ist.

      +

      Download & Docs: jan.ai · jan.ai/docs

      `],["Continue — Coding-Hilfe in VS Code ohne Agent-Overhead",` +

      Continue ist die einfachste Coding-Erweiterung für VS Code und JetBrains — + kein autonomer Agent, sondern ein KI-Assistent der nur auf Anfrage handelt.

      +
        +
      1. Extension installieren: VS Code → Extensions → „Continue" suchen → Installieren.
        + Oder: continue.dev
      2. +
      3. Config holen: Tab VerbindenContinue auswählen → + Snippet kopieren und in ~/.continue/config.json einfügen.
      4. +
      5. Continue in VS Code neu starten → im Chat-Panel Modell wählen → loslegen.
      6. +
      +

      Was Continue kann:

      +
        +
      • Chat: Frage direkt im Editor — markiere Code und drücke Strg+L
      • +
      • Autocomplete: Ergänzt Code während du tippst (wie Copilot)
      • +
      • Inline-Edit: Markieren → Strg+I → „Refactore das zu TypeScript"
      • +
      +

      Unterschied zu Cline: Continue macht nichts von alleine — du steuerst jeden Schritt. + Ideal als erster Einstieg bevor man mit vollen Agenten arbeitet.

      +

      Weitere Infos: continue.dev + — Hinweis: 2026 von Cursor akquiriert, weiterhin kostenlos & open source.

      `],["Antigravity — Googles agentic IDE",` +

      Antigravity ist Googles agent-first IDE — ein Fork von VS Code, der Planung, + Coding, Testing und Deployment in einem Workflow zusammenführt. Kostenlos für Einzelpersonen.

      +
        +
      1. Antigravity installieren: + antigravityide.net + → Download → läuft wie VS Code.
      2. +
      3. Eigenen Endpoint einrichten: Settings → Models → Custom Endpoint → + hinzufügen.
      4. +
      5. Verbindung eintragen: Tab VerbindenAntigravity auswählen → + Basis-URL und Modell-ID kopieren und eintragen.
      6. +
      7. API-Key: beliebiger Text (z.B. local). Danach das Modell aus der Liste wählen.
      8. +
      +

      Was Antigravity besonders macht:

      +
        +
      • Agent-First: Statt Code-Completion steht der Agent im Mittelpunkt — + du beschreibst, er plant und setzt um
      • +
      • Multi-Agent: Mehrere Agenten arbeiten parallel an verschiedenen Teilen
      • +
      • Manager-Oberfläche: Übersicht über alle laufenden Agenten-Sessions
      • +
      • VS Code-kompatibel: Extensions und Keybindings funktionieren wie gewohnt
      • +
      +

      Wann Antigravity statt OpenCode? Wenn du lieber eine grafische IDE als ein Terminal magst + und trotzdem volle Agenten-Kontrolle willst. OpenCode ist mächtiger im Terminal-Flow; + Antigravity ist komfortabler für Umsteiger aus VS Code.

      +

      Weitere Infos: antigravityide.net · + Google Dev Blog

      `],["OpenWebUI — für Teams und Power-User",` +

      OpenWebUI ist der mächtigste lokale Chat-Client — aber auch der komplexeste. + Empfohlen wenn du mehr als ein einfaches Chat-Interface brauchst.

      +

      Was OpenWebUI besonders kann (gegenüber Jan AI):

      +
        +
      • RAG: eigene Dokumente hochladen, KI liest und beantwortet Fragen dazu
      • +
      • Mehrbenutzer: eigene Accounts für verschiedene Personen im Heimnetz
      • +
      • Plugins und Agenten: erweiterbar mit Tools und Custom-Pipelines
      • +
      • Bilder generieren (mit Stable Diffusion), Sprachausgabe, Web-Suche
      • +
      +

      Verbinden (braucht Docker oder eine lokale Installation):

      1. OpenWebUI im Browser öffnen → Admin PanelConnections.
      2. -
      3. + OpenAI-Verbindung hinzufügen → Basis-URL aus Tab Verbinden (Abschnitt OpenWebUI) kopieren.
      4. -
      5. API-Key: dummy-key (egal was hier steht). Speichern.
      6. +
      7. + OpenAI-Verbindung → Tab VerbindenOpenWebUI → Basis-URL kopieren.
      8. +
      9. API-Key: dummy-key. Speichern.
      -

      Danach oben das Modell wählen (coder, scout oder vision) und loslegen - — genau wie bei ChatGPT, nur lokal und privat.

      -

      Bilder analysieren: Mit einem Vision-Modell (z.B. qwen3-vl) einfach ein Bild - per Drag & Drop ins Chat-Fenster ziehen — das Modell beschreibt und analysiert es.

      -

      Gut für: Texte schreiben, übersetzen, zusammenfassen, erklären lassen, Brainstorming — - alles ohne Programmierkenntnisse.

      +

      Danach Modell auswählen und loslegen. Für einfaches Chatten: Jan AI ist einfacher. + OpenWebUI lohnt sich ab dem Moment, wo du mehr als nur Chat willst.

      Weitere Infos: openwebui.com

      `]]},{label:"Agenten meistern",tutorials:[["Was ein Agent tut — und was er nicht kann",`

      Ein nacktes Modell antwortet auf Text — das war's. Ein Agent ist das Programm drumherum, das das Modell in eine Handlungsschleife bringt:

      @@ -540,4 +633,4 @@ src/
      Strg+Shift+R (Hard Reload). Wenn das nicht hilft: Tab Server → Mission Control → Neu starten.
      - `]]}],tu=[["LLM / Modell","Die KI selbst — versteht und schreibt Text (wie ChatGPT, nur lokal auf deinem PC). Ein Modell ist eine konkrete Datei, oft auf etwas spezialisiert (Code, Bilder, Chat)."],["GGUF","Das lokal lauffähige Dateiformat. llama-swap lädt nur GGUF — Repos ohne GGUF kann die Engine 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 bewährte Sweetspot. Für Coding/Reasoning: Q8_0 (nahezu verlustfrei). Wenn Q4_K_M 1 GB zu groß ist: IQ4_XS als Alternative (ähnliche Qualität, etwas kleiner)."],["Kontextfenster","Das Kurzzeitgedächtnis: wie viel Text sich das Modell gleichzeitig merken kann. Größer = mehr Überblick, mehr Speicher, etwas langsamer."],["Token","Die kleinste Einheit die ein Modell verarbeitet — meist 3–4 Zeichen oder ein kurzes Wort. 1 000 Tokens ≈ 750 Wörter. Kontextfenster, Geschwindigkeit und Kosten werden in Tokens gemessen."],["Auto-Swap","llama-swap lädt/entlädt Modelle automatisch — immer nur eins gleichzeitig. Du managst nichts."],["TTL (Time to Live)","Wie lange ein Modell nach der letzten Anfrage im RAM bleibt bevor es entladen wird. Standard: 5 Minuten. ∞ = bleibt dauerhaft geladen (sinnvoll für den Scout)."],["Agent","Ein Programm (OpenCode, Cline, Continue), das das Modell in einer Handlungsschleife laufen lässt — Dateien lesen/ändern, Befehle ausführen, planen, bis die Aufgabe erledigt ist."],["MCP","Model Context Protocol — der Stecker, über den ein Agent zusätzliche Werkzeuge bekommt (Web, Datenbank, GitHub …). MCP = neue Fähigkeiten."],["Skills / Rules","Kurze Textdatei (AGENTS.md, .clinerules …) mit Anweisungen wie der Agent in deinem Projekt arbeiten soll — einmal geschrieben, immer befolgt. Seit 2026 plattformübergreifender Standard: AGENTS.md wird von über 10 Tools nativ gelesen."],["Memory Bank","Clines Konzept für dauerhaften Projekt-Kontext: projectbrief.md (Ziel & Scope), activeContext.md (aktueller Fokus), progress.md (Stand). Wird zu Beginn jeder Aufgabe automatisch gelesen — ähnlich wie AGENTS.md, aber aufgeteilt nach Zweck."],["System-Prompt","Eine unsichtbare Anweisung die vor deiner Nachricht steht und das Verhalten des Modells grundlegend prägt (Sprache, Ton, Rolle). Skills nutzen oft den System-Prompt."],["Vision","Modelle mit Vision-Fähigkeit können Bilder verstehen — Screenshots, Diagramme, Fehlerfotos. Erkennbar am mmproj-Projektor der mitgeladen wird."]];var nu=k('
      '),au=k('
      '),ru=k('

      '),iu=k('

      Guide

      Schritt für Schritt erklärt — von der ersten Einrichtung bis zu echten Agenten-Workflows.

      Begriffe kurz erklärt

      ',1);function su(e){var t=iu(),a=s(ct(t),2);dt(a,17,()=>eu,ot,(i,o,d)=>{var c=au(),u=l(c),v=l(u),g=s(u,2);dt(g,17,()=>n(o).tutorials,ot,(E,f,y)=>{var T=O(()=>sr(n(f),2));let P=()=>n(T)[0],x=()=>n(T)[1];var D=nu();D.open=d===0&&y===0;var ke=l(D),te=l(ke),ue=s(ke,2);Pe(ue,x,!0),$(()=>b(te,P())),m(E,D)}),$(()=>b(v,n(o).label)),m(i,c)});var r=s(a,4);dt(r,21,()=>tu,ot,(i,o)=>{var d=O(()=>sr(n(o),2));let c=()=>n(d)[0],u=()=>n(d)[1];var v=ru(),g=l(v),E=l(g),f=s(g,2),y=l(f);$(()=>{b(E,c()),b(y,u())}),m(i,v)}),m(e,t)}let Xi={};function lu(){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"),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"),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")),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`:"",g=c.state==="loading"||c.state==="starting"?' lädt…':"";r.innerHTML=`${c.name}${v}${g}`}else r.innerHTML='Kein Modell im VRAM';e.swap_ok?uu():ts(`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,g]of Object.entries(u)){const E=Xi[v];if(E&&E!==g&&(g==="running"||g==="loading")){lu();break}}Xi=u}ou(e),br.set(e)}function ou(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 du(e){da.set(e||[])}function cu(e){Pi.set(e)}function ts(e,t){const a=document.getElementById("alert");a.className="alert"+(t?" warn":""),a.innerHTML=`${e}`,a.style.display="flex"}function uu(){const e=document.getElementById("alert");e&&(e.style.display="none")}const vu=e=>{var t;return(t=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:t.click()};function ei(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=()=>vu(a),i}async function tl(){try{const e=await Me("/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(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 (${a}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 nl(){try{du(await Me("/api/jobs"))}catch{}}function al(){const e=window.location.protocol==="https:"?"wss:":"ws:",t=new WebSocket(`${e}//${window.location.host}/api/system/stream`);t.onmessage=a=>{try{cu(JSON.parse(a.data))}catch{}},t.onclose=()=>{setTimeout(al,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 pu=[["overview",cd],["models",Md],["activity",Id],["server",Ud],["cookbook",Tc],["connect",Gc],["news",Xc],["guides",su]];for(const[e,t]of pu){const a=document.querySelector(`.view[data-view="${e}"]`);a&&xo(t,{target:a})}Vo("overview");const ti=document.getElementById("token");ti&&(ti.value=el(),ti.addEventListener("change",e=>{No(e.target.value),Gr()}));const ni=document.getElementById("hf-token");ni&&(ni.value=ir(),ni.addEventListener("change",e=>Ko(e.target.value)));const ns=document.getElementById("nav-settings"),ai=document.getElementById("settings-modal"),as=document.getElementById("sm-close");ns&&ai&&as&&(ns.addEventListener("click",()=>ai.style.display="flex"),as.addEventListener("click",()=>ai.style.display="none"));function fu(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Gr);Gr();nl();al();setInterval(fu,1e3);setInterval(Gr,3e3);setInterval(nl,1500);tl();setInterval(tl,6e4); + `]]}],iu=[["LLM / Modell","Die KI selbst — versteht und schreibt Text (wie ChatGPT, nur lokal auf deinem PC). Ein Modell ist eine konkrete Datei, oft auf etwas spezialisiert (Code, Bilder, Chat)."],["GGUF","Das lokal lauffähige Dateiformat. llama-swap lädt nur GGUF — Repos ohne GGUF kann die Engine 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 bewährte Sweetspot. Für Coding/Reasoning: Q8_0 (nahezu verlustfrei). Wenn Q4_K_M 1 GB zu groß ist: IQ4_XS als Alternative (ähnliche Qualität, etwas kleiner)."],["Kontextfenster","Das Kurzzeitgedächtnis: wie viel Text sich das Modell gleichzeitig merken kann. Größer = mehr Überblick, mehr Speicher, etwas langsamer."],["Token","Die kleinste Einheit die ein Modell verarbeitet — meist 3–4 Zeichen oder ein kurzes Wort. 1 000 Tokens ≈ 750 Wörter. Kontextfenster, Geschwindigkeit und Kosten werden in Tokens gemessen."],["Auto-Swap","llama-swap lädt/entlädt Modelle automatisch — immer nur eins gleichzeitig. Du managst nichts."],["TTL (Time to Live)","Wie lange ein Modell nach der letzten Anfrage im RAM bleibt bevor es entladen wird. Standard: 5 Minuten. ∞ = bleibt dauerhaft geladen (sinnvoll für den Scout)."],["Agent","Ein Programm (OpenCode, Cline, Continue), das das Modell in einer Handlungsschleife laufen lässt — Dateien lesen/ändern, Befehle ausführen, planen, bis die Aufgabe erledigt ist."],["MCP","Model Context Protocol — der Stecker, über den ein Agent zusätzliche Werkzeuge bekommt (Web, Datenbank, GitHub …). MCP = neue Fähigkeiten."],["Skills / Rules","Kurze Textdatei (AGENTS.md, .clinerules …) mit Anweisungen wie der Agent in deinem Projekt arbeiten soll — einmal geschrieben, immer befolgt. Seit 2026 plattformübergreifender Standard: AGENTS.md wird von über 10 Tools nativ gelesen."],["Memory Bank","Clines Konzept für dauerhaften Projekt-Kontext: projectbrief.md (Ziel & Scope), activeContext.md (aktueller Fokus), progress.md (Stand). Wird zu Beginn jeder Aufgabe automatisch gelesen — ähnlich wie AGENTS.md, aber aufgeteilt nach Zweck."],["System-Prompt","Eine unsichtbare Anweisung die vor deiner Nachricht steht und das Verhalten des Modells grundlegend prägt (Sprache, Ton, Rolle). Skills nutzen oft den System-Prompt."],["Vision","Modelle mit Vision-Fähigkeit können Bilder verstehen — Screenshots, Diagramme, Fehlerfotos. Erkennbar am mmproj-Projektor der mitgeladen wird."]];var ru=w('
      '),su=w('
      '),lu=w('

      '),ou=w('

      Guide

      Schritt für Schritt erklärt — von der ersten Einrichtung bis zu echten Agenten-Workflows.

      Begriffe kurz erklärt

      ',1);function du(e){var n=ou(),a=s(We(n),2);st(a,17,()=>au,rt,(r,o,d)=>{var c=su(),u=l(c),v=l(u),g=s(u,2);st(g,17,()=>t(o).tutorials,rt,(E,f,y)=>{var T=I(()=>Ca(t(f),2));let P=()=>t(T)[0],S=()=>t(T)[1];var $=ru();$.open=d===0&&y===0;var Ce=l($),oe=l(Ce),ae=s(Ce,2);Ae(ae,S,!0),D(()=>b(oe,P())),m(E,$)}),D(()=>b(v,t(o).label)),m(r,c)});var i=s(a,4);st(i,21,()=>iu,rt,(r,o)=>{var d=I(()=>Ca(t(o),2));let c=()=>t(d)[0],u=()=>t(d)[1];var v=lu(),g=l(v),E=l(g),f=s(g,2),y=l(f);D(()=>{b(E,c()),b(y,u())}),m(r,v)}),m(e,n)}let es={};function cu(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function ts(e){var r;const n=document.getElementById("swdot"),a=document.getElementById("swlabel"),i=document.getElementById("top-active-text");if(!e)n&&(n.className="dot off"),a&&(a.textContent="Backend nicht erreichbar"),i&&(i.textContent="Backend offline"),ns("Backend nicht erreichbar – läuft uvicorn?",!1);else{const o=(e.swap_url||"").replace(/^https?:\/\//,"");n&&(n.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(i)if(c){const v=(r=c.meta)!=null&&r.ctx?` · ${Math.round(c.meta.ctx/1024)}k ctx`:"",g=c.state==="loading"||c.state==="starting"?' lädt…':"";i.innerHTML=`${c.name}${v}${g}`}else i.innerHTML='Kein Modell im VRAM';e.swap_ok?fu():ns(`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,g]of Object.entries(u)){const E=es[v];if(E&&E!==g&&(g==="running"||g==="loading")){cu();break}}es=u}uu(e),_i.set(e)}function uu(e){const n=document.getElementById("sec-chip"),a=document.getElementById("sec-chip-tx");!n||!a||(n.classList.toggle("ok",!!(e!=null&&e.secured)),a.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function vu(e){ca.set(e||[])}function pu(e){Pr.set(e)}function ns(e,n){const a=document.getElementById("alert");a.className="alert"+(n?" warn":""),a.innerHTML=`${e}`,a.style.display="flex"}function fu(){const e=document.getElementById("alert");e&&(e.style.display="none")}const hu=e=>{var n;return(n=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:n.click()};function er(e,n,a,i){const r=document.createElement("span");return r.className="upd-badge"+(n?" "+n:""),r.textContent=e,i&&(r.title=i),r.onclick=()=>hu(a),r}async function nl(){try{const e=await we("/api/updates"),n=document.getElementById("update-badges");if(!n)return;const a=e.apt_cache_age_h,i=a!=null&&a>24,r=a!=null?` · apt-Cache: vor ${a}h`:"";n.innerHTML="",n.appendChild(er(e.os>0?`OS: ${e.os} Updates`:i?"OS: ?":"OS: aktuell",e.os>0||i?"warn":"ok","server",e.os>0?`${e.os} Pakete${r}`:i?`apt-Cache veraltet (${a}h)`:`Keine Updates${r}`)),n.appendChild(er(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),n.appendChild(er(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Gi(){try{ts(await we("/api/status"))}catch{ts(null)}}async function al(){try{vu(await we("/api/jobs"))}catch{}}function il(){const e=window.location.protocol==="https:"?"wss:":"ws:",n=new WebSocket(`${e}//${window.location.host}/api/system/stream`);n.onmessage=a=>{try{pu(JSON.parse(a.data))}catch{}},n.onclose=()=>{setTimeout(il,3e3)},n.onerror=()=>n.close()}var os;((os=document.getElementById("logo"))==null?void 0:os.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Ki.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Ki[e.dataset.ic||""]||""});const gu=[["overview",ud],["models",Ed],["activity",Rd],["server",jd],["cookbook",Tc],["connect",Uc],["news",nu],["guides",du]];for(const[e,n]of gu){const a=document.querySelector(`.view[data-view="${e}"]`);a&&So(n,{target:a})}Uo("overview");const tr=document.getElementById("token");tr&&(tr.value=tl(),tr.addEventListener("change",e=>{No(e.target.value),Gi()}));const nr=document.getElementById("hf-token");nr&&(nr.value=li(),nr.addEventListener("change",e=>Go(e.target.value)));const as=document.getElementById("nav-settings"),ar=document.getElementById("settings-modal"),is=document.getElementById("sm-close");as&&ar&&is&&(as.addEventListener("click",()=>ar.style.display="flex"),is.addEventListener("click",()=>ar.style.display="none"));function mu(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Gi);Gi();al();il();setInterval(mu,1e3);setInterval(Gi,3e3);setInterval(al,1500);nl();setInterval(nl,6e4);