Öffne die Zed-Settings mit Cmd/Strg + , und füge diesen Block in deine bestehende settings.json ein. Falls bereits ein "bosgame"-Eintrag existiert: vorher löschen.
-
Nur diesen Block einfügen, nicht die ganze Datei ersetzen — sonst gehen andere Einstellungen verloren.
-
-
-
{block}
-
-
API-Key: Öffne den Agent-Panel → Anbieter bosgame → trag irgendeinen Wert ein (z.B. local).
-
Danach im Agent-Panel das Modell bosgame / {firstModel} auswählen.
Öffne die Zed-Settings mit Cmd/Strg + , und füge diesen Block in deine bestehende settings.json ein. Falls bereits ein "bosgame"-Eintrag existiert: vorher löschen.
+
Nur diesen Block einfügen, nicht die ganze Datei ersetzen — sonst gehen andere Einstellungen verloren.
+
+
+
{block}
+
+
API-Key: Öffne den Agent-Panel → Anbieter bosgame → trag irgendeinen Wert ein (z.B. local).
+
Danach im Agent-Panel das Modell bosgame / {firstModel} auswählen.
Nur den "provider"-Block einfügen. Falls bereits ein "llama-swap"-Eintrag vorhanden: vorher löschen, sonst erscheinen Modelle doppelt.
+
+
+
{block}
+
+
Danach in OpenCode /models → llama-swap/{firstModel} wählen.
+ {:else if selectedTool === 'cline'}
+
In Cline/Cursor den Provider „OpenAI Compatible" wählen:
+
+
+
+
+
+
+
+
+
+
+
API-Key: ein beliebiger Wert (z.B. local).
+ {:else if selectedTool === 'openwebui'}
+
Settings → Admin Panel → Connections → neue OpenAI-Verbindung:
+
+
+
+
+
+
+
+
+
+
+ {/if}
+
+
+
+ {#if visionModel}
+ {@const snippet = `curl ${url}/chat/completions \\\n -H "Content-Type: application/json" \\\n -d '{\n "model": "${visionModel}",\n "messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,"}}]}]\n}'`}
+
+
+
Bilder einbinden (Vision)
+ {@html icon('check')} „{visionModel}" bereit
+
+
Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.
+
+
+
{snippet}
+
{/if}
-
-
-{#if visionModel}
- {@const snippet = `curl ${url}/chat/completions \\\n -H "Content-Type: application/json" \\\n -d '{\n "model": "${visionModel}",\n "messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,"}}]}]\n}'`}
+{:else}
+
-
-
Bilder einbinden (Vision)
- {@html icon('check')} „{visionModel}" bereit
-
-
Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.
-
-
-
{snippet}
+
2 · Erst ein Modell installieren
+
+
Noch kein Modell eingerichtet
+
Bevor du ein Tool verbinden kannst, braucht die Engine mindestens ein Modell. Das Config-Snippet wird dann automatisch mit deinen echten Modellnamen befüllt.
Fertige Modell-Bundles für deinen Anwendungsfall. Hardware-Ampel zeigt, ob es auf deinen PC passt.
+
Hier starten: Fertige Modell-Bundles für deinen Anwendungsfall — ein Klick installiert alles. Die Hardware-Ampel zeigt vorab, ob das Setup auf deinen PC passt.
Es läuft immer nur ein Modell gleichzeitig — ein größerer Kontext hier beeinflusst deine anderen Modelle nicht.
Immer aktiv halten
Modell bleibt dauerhaft im RAM — nie automatisch entladen. Ideal für den kleinen Scout (~5 GB), der immer schnell antworten soll.
'),_d=k(''),md=k('
Rolle festlegen
Wähle eine Rolle als zweiten, sprechenden Namen. In deinen Tools funktionieren danach beide: der echte Modellname und die Rolle.
'),bd=k('
Modelle
Deine konfigurierten Modelle — testen, Kontext anpassen oder aus dem Speicher werfen.
Schnelltest
Schreib eine Nachricht — das gewählte Modell wird automatisch geweckt.
Modelle & Ports
Modelle laden automatisch, sobald eine Anfrage kommt — du musst nichts manuell starten.
',1);function yd(e,t){ra(t,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr (längere Dateien/Chats), braucht aber mehr Speicher und wird etwas langsamer.",r="Die Rolle ist ein zusätzlicher, sprechender Name (z.B. coder). Du kannst in deinen Tools entweder den echten Modellnamen ODER die Rolle angeben — beides führt zum selben Modell.",i=[{id:"coder",label:"Coder",desc:"Programmieren & Code"},{id:"vision",label:"Vision",desc:"Bilder verstehen"},{id:"scout",label:"Scout",desc:"Schneller Allrounder"},{id:"reviewer",label:"Reviewer",desc:"Code/Texte prüfen"},{id:"manager",label:"Manager",desc:"Planen & koordinieren"}],o=I(()=>{var x;return((x=gr.value)==null?void 0:x.models)||[]});function d(){document.dispatchEvent(new Event("mc:refresh"))}let c=B(""),u=B(""),v=B(""),h=B(!1);const E=I(()=>n(o).filter(x=>!x.incomplete));async function p(){var z;const x=n(c)||((z=n(E)[0])==null?void 0:z.name);if(!(!x||!n(u).trim())){g(h,!0),g(v,"(wecke Modell, kann beim Laden kurz dauern…)");try{const K=await ge("/api/chat",{method:"POST",body:JSON.stringify({model:x,message:n(u)})});g(v,K.reply,!0)}catch(K){g(v,"Fehler: "+K.message)}g(h,!1),d()}}const w=300;let A=B(!1),L=B(null),M=B(8192),R=B(!1);function Se(x){var z;g(L,n(o).find(K=>K.name===x),!0),n(L)&&(g(M,((z=n(L).meta)==null?void 0:z.ctx)||8192,!0),g(R,(n(L).ttl??w)>=99999),g(A,!0))}async function re(){const x=n(R)?99999:w;try{await ge("/api/update_model",{method:"POST",body:JSON.stringify({alias:n(L).name,ctx:n(M),ttl:x})}),te("Gespeichert — aktiv beim nächsten Modell-Start."),g(A,!1),d()}catch(z){te(z.message,!0)}}let ve=B(!1),be=B(""),F=B(""),H=B("");function ue(x){const z=n(o).find(K=>K.name===x);g(be,x,!0),g(H,(z==null?void 0:z.role)||"",!0),g(F,""),g(ve,!0)}async function fe(x){try{await ge("/api/set_role",{method:"POST",body:JSON.stringify({alias:n(be),role:x})}),te(x?`Rolle gesetzt: ${x}`:"Rolle entfernt."),g(ve,!1),d()}catch(z){te(z.message,!0)}}async function Ee(x){if(await Mn({title:`„${x}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await ge("/api/unload?model="+encodeURIComponent(x),{method:"POST"}),te("Entladen: "+x),setTimeout(d,600)}catch(z){te(z.message,!0)}}async function ze(x){if(await Mn({title:`„${x}" wirklich löschen?`,body:"Das Modell wird aus der Konfiguration ausgetragen und seine Dateien werden von der Festplatte gelöscht, um Speicher freizugeben. Das lässt sich nicht rückgängig machen — später brauchst du dafür einen neuen Download.",confirmLabel:"Endgültig löschen",danger:!0}))try{const z=await ge("/api/delete_model",{method:"POST",body:JSON.stringify({alias:x})});te(z.note||"Gelöscht: "+x),setTimeout(d,600)}catch(z){te(z.message,!0)}}function nt(x){return x!=null&&x.length?x.map(z=>z==="Code"?'Code':z==="Bild"?'Bild':'Text').join(" "):"–"}function T(x){if(!x)return"–";const z=x.quant||"?",K=x.ctx?Math.round(x.ctx/1024)+"K":"?",ie=x.size_bytes?(x.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${z} · ${K} · ${ie}`}function J(x){var z;(z=navigator.clipboard)==null||z.writeText(x),te("Kopiert: "+x)}var oe=bd(),Pe=s(_t(oe),2),Q=s(l(Pe),6);Ze(Q,21,()=>n(E),Ye,(x,z)=>{var K=sd(),ie=l(K),$={};O(()=>{m(ie,n(z).name),$!==($=n(z).name)&&(K.value=(K.__value=n(z).name)??"")}),b(x,K)});var ye=s(Q,4),ne=s(ye,2),Ke=l(ne),Ie=s(ne,2);{var He=x=>{var z=ld(),K=l(z);O(()=>m(K,n(v))),b(x,z)};G(Ie,x=>{n(v)&&x(He)})}var Ve=s(Pe,2),We=l(Ve),Tt=s(l(We)),Pt=l(Tt),Ot=s(We,4);{var Rt=x=>{var z=od();b(x,z)},qt=x=>{var z=pd(),K=s(l(z));Ze(K,21,()=>n(o),Ye,(ie,$)=>{var V=Br(),ae=_t(V);{var we=Ae=>{var at=dd(),it=l(at),mt=l(it),et=s(it,5),bt=l(et),C=s(bt,2);O(()=>m(mt,n($).name)),P("click",bt,()=>{var X;te("Lade im Cookbook ein Modell und setze den Alias auf: "+n($).name),(X=document.querySelector(".nav-item[data-view='cookbook']"))==null||X.dispatchEvent(new MouseEvent("click"))}),P("click",C,()=>ze(n($).name)),b(Ae,at)},Xe=Ae=>{var at=fd(),it=l(at),mt=l(it),et=l(mt),bt=s(et);{var C=Je=>{var pt=cd(),S=l(pt);O(()=>m(S,n($).role)),b(Je,pt)};G(bt,Je=>{n($).role&&Je(C)})}var X=s(mt,2);{var pe=Je=>{var pt=ud(),S=l(pt);O(()=>m(S,n($).meta.filename)),b(Je,pt)};G(X,Je=>{var pt;(pt=n($).meta)!=null&&pt.filename&&Je(pe)})}var je=s(X,2),Ne=s(l(je),2);Ze(Ne,17,()=>{var Je;return(Je=n($).api_ids)!=null&&Je.length?n($).api_ids:[n($).name]},Ye,(Je,pt)=>{var S=vd(),ee=l(S);O(()=>m(ee,n(pt))),P("click",S,()=>J(n(pt))),b(Je,S)});var Bt=s(it);qe(Bt,()=>{var Je;return nt((Je=n($).meta)==null?void 0:Je.caps)},!0);var Ht=s(Bt);qe(Ht,()=>T(n($).meta),!0);var It=s(Ht);qe(It,()=>Fo(n($).state,n($).download_progress),!0);var Yt=s(It),sn=l(Yt),bn=s(Yt),$n=l(bn),ln=s($n,2),on=s(ln,2),yn=s(on,2);O(()=>{m(et,`${n($).name??""} `),m(sn,n($).port??"auto")}),P("click",$n,()=>ue(n($).name)),P("click",ln,()=>Se(n($).name)),P("click",on,()=>Ee(n($).name)),P("click",yn,()=>ze(n($).name)),b(Ae,at)};G(ae,Ae=>{n($).incomplete?Ae(we):Ae(Xe,-1)})}b(ie,V)}),b(x,z)};G(Ot,x=>{n(o).length?x(qt,-1):x(Rt)})}var D=s(Ve,2);{var U=x=>{var z=gd(),K=l(z),ie=l(K),$=s(ie,4),V=l($),ae=s($,2),we=s(l(ae));qe(we,()=>fi(a));var Xe=s(ae,2),Ae=s(Xe,2);{var at=pe=>{var je=hd(),Ne=l(je),Bt=s(l(Ne),2),Ht=l(Bt),It=s(Ht,2),Yt=s(Ne,2);O((sn,bn)=>{m(Ht,`Optimal ~${sn??""}k → ~${n(L).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),m(It,` Aktuell ~${bn??""}k → ~${n(L).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(n(L).meta.optimal_ctx/1024),()=>Math.round((n(L).meta.ctx||0)/1024)]),P("click",Yt,()=>g(M,n(L).meta.optimal_ctx,!0)),b(pe,je)};G(Ae,pe=>{var je;(je=n(L).meta)!=null&&je.optimal_ctx&&pe(at)})}var it=s(Ae,4),mt=s(l(it),2),et=l(mt),bt=s(et,2),C=l(bt),X=s(it,2);O(()=>{m(V,n(L).name),hn(bt,`color:${n(R)?"var(--accent)":"var(--mut)"}`),m(C,n(R)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),P("click",z,pe=>{pe.target.classList.contains("modal-overlay")&&g(A,!1)}),P("click",ie,()=>g(A,!1)),Ln(Xe,()=>n(M),pe=>g(M,pe)),Do(et,()=>n(R),pe=>g(R,pe)),P("click",X,re),b(x,z)};G(D,x=>{n(A)&&n(L)&&x(U)})}var Z=s(D,2);{var le=x=>{var z=md(),K=l(z),ie=l(K),$=s(ie,2),V=s(l($));qe(V,()=>fi(r));var ae=s($,2),we=l(ae),Xe=s(ae,4);Ze(Xe,21,()=>i,Ye,(et,bt)=>{var C=_d(),X=l(C);O(()=>{vt(C,1,n(H)===n(bt).id?"primary":"ghost"),Ir(C,"title",n(bt).desc),m(X,n(bt).label)}),P("click",C,()=>fe(n(bt).id)),b(et,C)});var Ae=s(Xe,4),at=s(Ae,2),it=l(at),mt=s(it,2);O(()=>m(we,n(be))),P("click",z,et=>{et.target.classList.contains("modal-overlay")&&g(ve,!1)}),P("click",ie,()=>g(ve,!1)),Ln(Ae,()=>n(F),et=>g(F,et)),P("click",it,()=>fe("")),P("click",mt,()=>fe(n(F).trim().toLowerCase())),b(x,z)};G(Z,x=>{n(ve)&&x(le)})}O(()=>{ne.disabled=n(h),m(Ke,n(h)?"…":"Senden"),m(Pt,n(o).length?n(o).length+" konfiguriert":"")}),nr(Q,()=>n(c),x=>g(c,x)),Ln(ye,()=>n(u),x=>g(u,x)),P("click",ne,p),b(e,oe),ia()}ka(["click"]);var wd=k('
Prozessor (CPU)
%
Arbeitsspeicher
%
Grafikspeicher
%
System-Metriken (Bosgame)
Live-Auslastung deines Mini-PCs, alle 0,5 Sekunden.
Arbeitsspeicher (RAM)
Grafikspeicher (VRAM + GTT)
Speicherplatz (Disk)
Temperatur (GPU / CPU)
CPU-Verlauf
RAM-Verlauf
VRAM-Verlauf
',1),xd=k(''),kd=k('
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
'),Md=k(''),Sd=k(''),Ed=k(''),Td=k('
'),$d=k('
'),Ad=k('
'),Cd=k('
Aktivität
Live-Auslastung und laufende Aufgaben (Downloads, Updates) mit Protokoll.
Hintergrund-Aufgaben
Downloads & Updates erscheinen hier mit Live-Protokoll — zum Aufklappen klicken.
Dienste steuern, Updates einspielen und live mitlesen — ganz ohne SSH oder Terminal.
LLM-Engine (llama-swap)
Das Herzstück: lädt bei jeder Anfrage automatisch das passende Modell.
Adresse (für deine Tools)
Aktuell geladen
Konfigurierte Modelle
Dienste & Applikation
Diese Aktionen sind harmlos und passwortlos — es geht nichts dabei verloren.
Betriebssystem (Bosgame)
Tiefe Eingriffe — das Dashboard fragt einmalig nach deinem sudo-Passwort.
Live-Konsole
Live mitlesen, was der Dienst gerade tut.
',1);function Fd(e,t){ra(t,!0);const a=I(()=>gr.value),r=I(()=>ca.value);let i=null,o=B(`Verbinde…
-`),d=B("llama-swap"),c,u=B(null),v=B("");const h=new Set,E=I(()=>n(u)?n(r).find(C=>C.id===n(u)):null);Mi(()=>{if(!n(E))return;const C=n(E),X=C.state==="done",pe=C.state==="failed",je=C.state==="canceled";(X||pe||je)&&!h.has(C.id)&&(h.add(C.id),te(X?`✓ ${n(v)} abgeschlossen.`:je?`${n(v)} abgebrochen.`:`✗ ${n(v)} fehlgeschlagen.`,pe),X&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function p(C,X){g(u,C,!0),g(v,X,!0),ca.track(C)}hr(()=>{w()}),Ro(()=>{i==null||i.close()});function w(){i==null||i.close();const C=n(d);g(o,`Verbinde mit ${C}…
-`);const X=location.protocol==="https:"?"wss:":"ws:";i=new WebSocket(`${X}//${location.host}/api/logs/${C}?token=${encodeURIComponent(Ys())}`),i.onmessage=pe=>{g(o,n(o)+pe.data),c&&(c.scrollTop=c.scrollHeight)},i.onclose=()=>{g(o,n(o)+`
-— Verbindung getrennt —`)},i.onerror=()=>i==null?void 0:i.close()}async function A(C,X,pe){if(await Mn({title:X,body:pe,confirmLabel:"Neustarten"}))try{await ge(`/api/service/${C}/restart`,{method:"POST"}),te("Neustart ausgelöst: "+C),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(je){te(je.message,!0)}}async function L(){if(await Mn({title:"Mission Control aktualisieren?",body:"Holt die neueste Dashboard-Version aus Gitea und startet automatisch neu. Die Seite trennt kurz und verbindet von selbst wieder (~10 Sek)."}))try{const C=await ge("/api/self-update",{method:"POST"});te("Update läuft — Dashboard startet gleich neu."),p(C.job_id,"Mission Control Update")}catch(C){te(C.message,!0)}}async function M(){if(await Mn({title:"LLM-Engine aktualisieren?",body:"Lädt die neueste llama.cpp-ROCm-Version und installiert sie. Die Engine ist während des Updates kurz nicht erreichbar."}))try{const C=await ge("/api/update",{method:"POST"});te("LLM-Engine-Update läuft."),p(C.job_id,"LLM-Engine-Update")}catch(C){te(C.message,!0)}}async function R(){if(await Mn({title:"Grafikspeicher leeren?",body:"Alle geladenen Modelle werden entladen. Sie laden beim nächsten Aufruf automatisch neu — es geht nichts verloren.",confirmLabel:"Leeren"}))try{await ge("/api/unload",{method:"POST"}),te("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(C){te(C.message,!0)}}async function Se(){if(!await Mn({title:"OS-Updates installieren?",body:"Führt apt update & upgrade aus. Das kann ein paar Minuten dauern; der Fortschritt erscheint in der Aktivität."}))return;const C=await Ui({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(C)try{const X=await ge("/api/os-update",{method:"POST",body:JSON.stringify({password:C})});te("OS-Update gestartet."),p(X.job_id,"OS-Update")}catch(X){te(X.message,!0)}}async function re(){if(!await Mn({title:"Server wirklich neu starten?",body:"Der ganze Bosgame startet physisch neu. Alles ist für ~1 Minute offline — auch dieses Dashboard.",confirmLabel:"Reboot",danger:!0}))return;const C=await Ui({title:"sudo-Passwort",body:"Für den Reboot wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Jetzt neustarten",danger:!0});if(C)try{await ge("/api/reboot",{method:"POST",body:JSON.stringify({password:C})}),te("Reboot ausgelöst — bis gleich.")}catch(X){te(X.message,!0)}}async function ve(){g(be,"prüfe…");try{const C=await ge("/api/integration/test");g(be,C.ok?`✓ Engine antwortet — ${C.models.length} Modell(e): ${C.models.join(", ")}`:`✗ keine Verbindung: ${C.error}`,!0),g(F,C.ok,!0)}catch(C){g(be,"✗ "+C.message),g(F,!1)}}let be=B(""),F=B(!1);const H=I(()=>{var C;return((C=n(a))==null?void 0:C.models)||[]}),ue=["running","ready","loading","starting"],fe=I(()=>n(H).find(C=>ue.includes(C.state)));function Ee(C){if(!C||C.state!=="running")return null;if(typeof C.progress=="number")return Math.min(100,C.progress);const pe=((C.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return pe?Math.min(100,parseFloat(pe[1])):null}var ze=Nd(),nt=s(_t(ze),2),T=l(nt),J=s(l(T),2),oe=l(J),Pe=s(T,4),Q=l(Pe),ye=s(l(Q)),ne=l(ye),Ke=s(Q,2),Ie=s(l(Ke),2),He=l(Ie),Ve=s(Ke,2),We=s(l(Ve),2),Tt=l(We),Pt=s(Pe,2),Ot=l(Pt),Rt=s(Ot,2);{var qt=C=>{var X=zd(),pe=l(X);O(()=>{hn(X,`color:${n(F)?"#7ee29a":"#ff9b95"}`),m(pe,n(be))}),b(C,X)};G(Rt,C=>{n(be)&&C(qt)})}var D=s(nt,2),U=s(l(D),4),Z=s(U,2),le=s(Z,2),x=s(le,2),z=s(x,2),K=s(D,2),ie=s(l(K),4),$=s(ie,2),V=s(K,2);{var ae=C=>{const X=I(()=>n(E)),pe=I(()=>n(X).state==="done"),je=I(()=>n(X).state==="failed"),Ne=I(()=>n(X).state==="canceled"),Bt=I(()=>n(pe)||n(je)||n(Ne)),Ht=I(()=>Ee(n(X)));var It=Id(),Yt=l(It),sn=s(l(Yt),2);{var bn=_e=>{var Qe=Pd();P("click",Qe,async()=>{await Mn({title:n(v)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&ge(`/api/jobs/${n(X).id}/cancel`,{method:"POST"})}),b(_e,Qe)};G(sn,_e=>{n(Bt)||_e(bn)})}var $n=s(sn,2),ln=l($n);{var on=_e=>{var Qe=Dd();b(_e,Qe)},yn=_e=>{var Qe=Od();b(_e,Qe)},Je=_e=>{var Qe=Rd();b(_e,Qe)},pt=_e=>{var Qe=qd();b(_e,Qe)};G(ln,_e=>{n(pe)?_e(on):n(je)?_e(yn,1):n(Ne)?_e(Je,2):_e(pt,-1)})}var S=s(Yt,2),ee=l(S),st=s(S,2);{var xe=_e=>{var Qe=Bd(),dn=l(Qe);O(()=>hn(dn,`width:${n(Ht)??""}%`)),b(_e,Qe)};G(st,_e=>{n(Ht)!=null&&!n(Bt)&&_e(xe)})}var rt=s(st,2),Vt=l(rt);O(_e=>{m(ee,`${n(v)??""}${n(Bt)?n(pe)?" — erfolgreich.":n(Ne)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),m(Vt,_e)},[()=>(n(X).log||[]).join(`
-`)]),b(C,It)};G(V,C=>{n(E)&&C(ae)})}var we=s(V,2),Xe=l(we),Ae=s(l(Xe),2),at=l(Ae);at.value=at.__value="llama-swap";var it=s(at);it.value=it.__value="mission-control";var mt=s(it);mt.value=mt.__value="system";var et=s(Xe,4),bt=l(et);Oo(et,C=>c=C,()=>c),O(C=>{var X,pe,je;hn(J,`margin-left:auto;${(X=n(a))!=null&&X.swap_ok?"background:rgba(63,185,80,.12);border-color:rgba(63,185,80,.25);color:#7ee29a":"background:rgba(248,81,73,.12);border-color:rgba(248,81,73,.3);color:#ff9b95"}`),m(oe,(pe=n(a))!=null&&pe.swap_ok?"● erreichbar":"● offline"),m(ne,(((je=n(a))==null?void 0:je.swap_url)||"—")+"/v1"),m(He,n(fe)?n(fe).name+` (${n(fe).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),m(Tt,C),m(bt,n(o))},[()=>n(H).filter(C=>!C.incomplete).length||"keine"]),P("click",Ot,ve),P("click",U,()=>A("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),P("click",Z,()=>A("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),P("click",le,L),P("click",x,M),P("click",z,R),P("click",ie,Se),P("click",$,re),P("change",Ae,w),nr(Ae,()=>n(d),C=>g(d,C)),b(e,ze),ia()}ka(["click","change"]);var Kd=k('
Größter Spitzenbedarf: . Es läuft immer nur ein Modell gleichzeitig — das größte bestimmt, ob das Setup passt.
'),dc=k('
'),cc=k('
Lade Dateien von HuggingFace…
'),Ji=k(""),uc=k('
Empfohlener Kontext für deine Hardware: — übernehmen
'),vc=k('
Ressourcen-Check
'),fc=k('
',1),pc=k('
Keine GGUF-Dateien im Repo gefunden.
'),hc=k('
'),gc=k('
'),_c=k('
Stell dir aus beliebigen Modellen ein eigenes Setup zusammen.
Die Repo-ID findest du über die Profi-Suche weiter unten (z.B. unsloth/Qwen3-8B-GGUF).
'),mc=k('
Cookbook
Modelle finden, installieren und eigene Setups zusammenstellen.
Use-Case-Setups
Fertige Modell-Bundles für deinen Anwendungsfall. Hardware-Ampel zeigt, ob es auf deinen PC passt.
Aktuell die besten Modelle für dein System
Top-Modelle je Kategorie von HuggingFace — Hardware-Fit wird live für dein System berechnet.
Profi-Suche (HuggingFace)
Direkt HuggingFace durchsuchen — oder eine Modell-URL einfügen für den direkten Sprung.
',1);function bc(e,t){ra(t,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr, braucht aber mehr Speicher und wird etwas langsamer.",r="MoE (Mixture of Experts): viele Parameter fürs Wissen, aber pro Wort ist nur ein kleiner Teil aktiv → fast große-Modell-Qualität bei hohem Tempo. Ideal für deine APU.",i={perfect:0,marginal:1,too_tight:2},o={vision:"Bilder",coder:"Coden",reasoning:"Logik",agent:"Agenten & Tools",scout:"Allrounder",reviewer:"Review",manager:"Manager"},d=[{label:"Bilder",kw:["-vl-","-vl","vision","llava","multimodal","-mm-","pixtral"]},{label:"Coden",kw:["coder","-code-","code-","codestral","starcoder"]},{label:"Logik",kw:["-r1","deepseek-r1","reasoning","qwq","magistral","-think","thinking","-o1"]},{label:"Agenten & Tools",kw:["hermes","-tool","command-r","watt","-fc-","function"]}];function c(_){const y=(_||"").toLowerCase();for(const N of d)if(N.kw.some(q=>y.includes(q)))return N.label;return"Allrounder"}function u(_=""){const y=_.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(y)||new RegExp("(?{Pt(),Ot()});async function Pt(){g(L,!0);try{const _=await ge("/api/cookbook/recipes");g(w,_.recipes||[],!0),g(A,_.recommended_id||null,!0)}catch(_){te(_.message,!0)}g(L,!1)}async function Ot(_=!1){g(R,!0);try{const y=await ge("/api/cookbook/discover"+(_?"?force=true":""));g(M,y,!0),g(Se,y.stale,!0)}catch(y){te("Empfehlungen nicht ladbar: "+y.message,!0)}g(R,!1)}function Rt(_){_=_.trim();const y=_.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return y?y[1]:/^[\w.-]+\/[\w.-]+$/.test(_)?_:null}async function qt(){const _=n(re).trim(),y=Rt(_);let N=_;if(n(F)&&!y&&(N=N?N+" "+n(F):n(F)),!N&&!y){g(ve,[],!0);return}g(be,!0),g(ue,[],!0),g(fe,-1);try{if(y)g(ve,[{id:y,author:y.split("/")[0],downloads:0}],!0);else{const q=`https://huggingface.co/api/models?search=${encodeURIComponent(N)}&filter=gguf&sort=${encodeURIComponent(n(H))}&direction=-1&limit=40`,Y=await fetch(q);g(ve,await Y.json(),!0)}n(ve).forEach((q,Y)=>D(Y,q.id))}catch(q){te(q.message,!0),g(ve,[],!0)}g(be,!1)}async function D(_,y){var N;try{const q=await ge("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:y,ctx:8192})});if(!((N=q.files)!=null&&N.length)){n(ue)[_]=null,U();return}const Y=q.files.find(Ce=>{var Le;return(Le=Ce.quant)==null?void 0:Le.includes("Q4_K_M")})||q.files[0];n(ue)[_]=Y.fit.level,U()}catch{n(ue)[_]=null,U()}}function U(){let _=-1,y=99;n(ue).forEach((N,q)=>{if(N==null)return;const Y=i[N]??99;Y=0&&y<=1?_:-1,!0)}function Z(_){g(Ee,n(w).find(y=>y.id===_),!0)}async function le(_){const y=document.getElementById("cb-r-install-btn");y&&(y.disabled=!0,y.textContent="Starte…");try{const N=await ge("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:_,hf_token:rr()})});te(`${N.count} Downloads gestartet — siehe Aktivität.`),g(Ee,null),Tt("activity")}catch(N){te(N.message,!0),y&&(y.disabled=!1,y.textContent="Installieren")}}async function x(_,y){var N,q;g(ze,!0),g(nt,y,!0),g(T,_,!0),g(Pe,""),g(Q,8192),g(J,null),g(ne,null),g(oe,""),g(ye,!0);try{if(g(J,await ge("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:_,ctx:8192})}),!0),(q=(N=n(J))==null?void 0:N.files)!=null&&q.length){const Y=n(J).files.find(Ce=>{var Le;return(Le=Ce.quant)==null?void 0:Le.includes("Q4_K_M")})||n(J).files[0];g(oe,Y.filename,!0),Y.optimal_ctx&&n(Q)===8192&&g(Q,Y.optimal_ctx,!0),z()}}catch(Y){te(Y.message,!0)}g(ye,!1)}function z(){var _,y,N;!((y=(_=n(J))==null?void 0:_.files)!=null&&y.length)||!n(oe)||(g(ne,n(J).files.find(q=>q.filename===n(oe))||null,!0),(N=n(ne))!=null&&N.optimal_ctx&&n(Q)===8192&&g(Q,n(ne).optimal_ctx,!0))}async function K(){if(!n(T)||!n(oe))return te("Bitte eine GGUF-Datei wählen.",!0);g(ye,!0);try{const _=await ge("/api/download",{method:"POST",body:JSON.stringify({repo:n(T),file:n(oe),hf_token:rr()})});await ge("/api/register",{method:"POST",body:JSON.stringify({role:n(Pe),model_path:_.expected_path,ctx:n(Q)})}),te("Download gestartet — siehe Aktivität."),g(ze,!1),Tt("activity")}catch(_){te("Fehler: "+_.message,!0)}g(ye,!1)}async function ie(_,y,N,q){q.disabled=!0,q.textContent="Starte…";try{await ge("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:_,role:y,params_b:N,quant:"Q4_K_M",hf_token:rr()})}),te("Download gestartet — siehe Aktivität."),Tt("activity")}catch(Y){te(Y.message,!0),q.disabled=!1,q.textContent="Installieren"}}function $(){g(We,null),g(Ie,""),g(He,""),g(Ve,[{repo:"",role:"",quant:"Q4_K_M"}],!0),g(Ke,!0)}function V(_){const y=n(w).find(N=>N.id===_);y&&(g(We,_,!0),g(Ie,y.title,!0),g(He,y.desc||"",!0),g(Ve,y.models.map(N=>({repo:N.repo,role:N.role,quant:N.quant||"Q4_K_M"})),!0),g(Ke,!0))}async function ae(){if(!n(Ie).trim())return te("Bitte einen Titel angeben.",!0);const _=n(Ve).filter(y=>y.repo.trim());if(!_.length)return te("Mindestens ein Modell (Repo) angeben.",!0);try{n(We)?(await ge("/api/cookbook/user-recipe/"+encodeURIComponent(n(We)),{method:"PUT",body:JSON.stringify({title:n(Ie),desc:n(He),models:_})}),te("Setup aktualisiert.")):(await ge("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:n(Ie),desc:n(He),models:_})}),te("Setup gespeichert.")),g(Ke,!1),Pt()}catch(y){te(y.message,!0)}}async function we(_){const y=n(w).find(N=>N.id===_);if(await Mn({title:`„${(y==null?void 0:y.title)||_}" löschen?`,body:"Dein eigenes Setup wird aus dem Cookbook entfernt. Bereits installierte Modelle bleiben unangetastet.",confirmLabel:"Löschen",danger:!0}))try{await ge("/api/cookbook/user-recipe/"+encodeURIComponent(_),{method:"DELETE"}),te("Setup gelöscht."),Pt()}catch(N){te(N.message,!0)}}function Xe(_){if(!u(_))return"";const y=v(_);return`MoE${y?` · ~${y}B aktiv`:""}`}function Ae(_){return _?`${Rn(_)}`:""}var at=mc(),it=s(_t(at),2),mt=l(it),et=s(l(mt),2),bt=s(mt,4);{var C=_=>{var y=Kd();b(_,y)},X=_=>{var y=Vd();Ze(y,21,()=>n(w),Ye,(N,q)=>{const Y=I(()=>n(q).id===n(A));var Ce=Hd(),Le=l(Ce);{var lt=Ue=>{var ct=Gd(),Zt=_t(ct),wt=s(Zt,2);P("click",Zt,xt=>{xt.stopPropagation(),V(n(q).id)}),P("keydown",Zt,xt=>{xt.key==="Enter"&&(xt.stopPropagation(),V(n(q).id))}),P("click",wt,xt=>{xt.stopPropagation(),we(n(q).id)}),P("keydown",wt,xt=>{xt.key==="Enter"&&(xt.stopPropagation(),we(n(q).id))}),b(Ue,ct)};G(Le,Ue=>{n(q).user&&Ue(lt)})}var yt=s(Le,2);{var Te=Ue=>{var ct=Qr();b(Ue,ct)},De=Ue=>{var ct=Ud();b(Ue,ct)};G(yt,Ue=>{n(Y)?Ue(Te):n(q).user&&Ue(De,1)})}var Me=s(yt,2),ke=l(Me),Fe=l(ke),Ge=l(Fe),Oe=s(ke,2),j=l(Oe),ce=s(Me,2),ot=l(ce),$t=s(ce,2),dt=l($t);O((Ue,ct)=>{vt(Ce,1,`card-btn${n(Y)?" cb-best":""}`),m(Ge,n(q).title),vt(Oe,1,`fit-badge ${Ue??""}`),m(j,ct),m(ot,n(q).desc),m(dt,`${n(q).models.length??""} Modell${n(q).models.length>1?"e":""} im Setup`)},[()=>h(n(q).fit_level),()=>E(n(q).fit_level)]),P("click",Ce,()=>Z(n(q).id)),b(N,Ce)}),b(_,y)};G(bt,_=>{n(L)?_(C):_(X,-1)})}var pe=s(it,2),je=l(pe),Ne=s(l(je),2),Bt=l(Ne);{var Ht=_=>{const y=I(()=>Math.round((Date.now()/1e3-n(M).updated)/60));var N=jd(),q=_t(N);{var Y=Te=>{var De=tr();O(()=>m(De,`Quellen befragt vor ${n(y)??""} min`)),b(Te,De)},Ce=Te=>{var De=tr();O(Me=>m(De,`Quellen befragt vor ${Me??""} h`),[()=>Math.round(n(y)/60)]),b(Te,De)},Le=Te=>{var De=tr();O(Me=>m(De,`Quellen befragt vor ${Me??""} Tg.`),[()=>Math.round(n(y)/1440)]),b(Te,De)};G(q,Te=>{n(y)<60?Te(Y):n(y)<1440?Te(Ce,1):Te(Le,-1)})}var lt=s(q,2);{var yt=Te=>{var De=Wd();b(Te,De)};G(lt,Te=>{n(Se)&&Te(yt)})}b(_,N)};G(Bt,_=>{var y;(y=n(M))!=null&&y.updated&&_(Ht)})}var It=s(Ne,2),Yt=l(It),sn=s(je,4);{var bn=_=>{var y=Jd();b(_,y)},$n=_=>{var y=Br(),N=_t(y);Ze(N,17,()=>n(M).categories,Ye,(q,Y)=>{var Ce=ec(),Le=l(Ce),lt=l(Le),yt=l(lt),Te=s(Le,2);Ze(Te,21,()=>n(Y).models,Ye,(De,Me)=>{const ke=I(()=>n(Y).recommended&&n(Me).repo===n(Y).recommended);var Fe=Xd(),Ge=l(Fe);{var Oe=Et=>{var Kt=Qr();b(Et,Kt)};G(Ge,Et=>{n(ke)&&Et(Oe)})}var j=s(Ge,2),ce=l(j),ot=l(ce),$t=l(ot),dt=s(ot,2),Ue=l(dt),ct=s(ce,2),Zt=l(ct),wt=s(j,2),xt=l(wt);qe(xt,()=>Ae(o[n(Me).role]||c(n(Me).repo)));var Cn=s(xt,2);qe(Cn,()=>Xe(n(Me).repo));var Wn=s(wt,2),tt=l(Wn),ut=s(Wn,2);Ze(ut,17,()=>n(Me).requirements||[],Ye,(Et,Kt)=>{var jn=Qd(),Kr=l(jn);O(()=>m(Kr,`⚠ ${n(Kt)??""}`)),b(Et,jn)});var ht=s(ut,4),kt=l(ht);{var Xt=Et=>{var Kt=Yd();O(()=>Ir(Kt,"title",`bereits eingerichtet als ${n(Me).installed??""}`)),b(Et,Kt)},Ft=Et=>{var Kt=Zd();P("click",Kt,jn=>ie(n(Me).repo,n(Me).role,n(Me).params_b,jn.currentTarget)),b(Et,Kt)};G(kt,Et=>{n(Me).installed?Et(Xt):Et(Ft,-1)})}O((Et,Kt,jn)=>{vt(Fe,1,`card${n(ke)?" res-best":""}`),m($t,n(Me).name),m(Ue,`${n(Me).author??""} · ${n(Me).params_b??""}B`),vt(ct,1,`fit-badge ${Et??""}`),m(Zt,n(Me).fit.text),m(tt,`${Kt??""} · ⬇ ${jn??""}`)},[()=>h(n(Me).fit.level),()=>p(n(Me).fit),()=>(n(Me).downloads||0).toLocaleString()]),b(De,Fe)}),O(()=>m(yt,n(Y).title)),b(q,Ce)}),b(_,y)};G(sn,_=>{var y;n(R)&&!n(M)?_(bn):(y=n(M))!=null&&y.categories&&_($n,1)})}var ln=s(pe,2),on=s(l(ln),4),yn=l(on),Je=s(yn,2),pt=l(Je);pt.value=pt.__value="downloads";var S=s(pt);S.value=S.__value="trending";var ee=s(S);ee.value=ee.__value="created_at";var st=s(Je,2),xe=l(st),rt=s(on,2);Ze(rt,20,()=>["","coder","vision","reasoning","chat","agent"],Ye,(_,y)=>{var N=tc(),q=l(N);O(()=>{vt(N,1,n(F)===y?"primary":"ghost"),m(q,y||"Alle")}),P("click",N,()=>{g(F,y,!0),qt()}),b(_,N)});var Vt=s(rt,2);{var _e=_=>{var y=ac();Ze(y,21,()=>n(ve),Ye,(N,q,Y)=>{var Ce=nc(),Le=l(Ce);{var lt=wt=>{var xt=Qr();b(wt,xt)};G(Le,wt=>{Y===n(fe)&&wt(lt)})}var yt=s(Le,2),Te=l(yt),De=l(Te),Me=l(De),ke=s(De,2),Fe=l(ke),Ge=s(Te,2),Oe=l(Ge),j=s(yt,2),ce=l(j);qe(ce,()=>Ae(c(n(q).id)));var ot=s(ce,2);qe(ot,()=>Xe(n(q).id));var $t=s(j,4),dt=l($t),Ue=l(dt),ct=s(dt,2),Zt=l(ct);O((wt,xt,Cn,Wn,tt)=>{vt(Ce,1,`card${Y===n(fe)?" res-best":""}`),m(Me,wt),m(Fe,n(q).author||""),vt(Ge,1,`fit-badge ${xt??""}`),m(Oe,Cn),m(Ue,Wn),m(Zt,`⬇ ${tt??""}`)},[()=>n(q).id.split("/").pop(),()=>n(ue)[Y]?h(n(ue)[Y]):"warn",()=>n(ue)[Y]?E(n(ue)[Y]):"prüfe…",()=>n(ue)[Y]?p({req_gb:0,tps:0}):"Hardware-Fit…",()=>(n(q).downloads||0).toLocaleString()]),P("click",Ce,()=>x(n(q).id,n(q).id.split("/").pop())),b(N,Ce)}),b(_,y)};G(Vt,_=>{n(ve).length&&_(_e)})}var Qe=s(ln,2);{var dn=_=>{const y=I(()=>n(Ee));var N=dc(),q=l(N),Y=l(q),Ce=s(Y,2),Le=l(Ce),lt=s(Ce,2),yt=l(lt),Te=s(lt,2);Ze(Te,21,()=>n(y).models,Ye,(Ge,Oe)=>{var j=lc(),ce=l(j),ot=l(ce),$t=l(ot),dt=l($t),Ue=s($t,2),ct=l(Ue),Zt=s(Ue,2);qe(Zt,()=>Xe(n(Oe).repo));var wt=s(ot,2);{var xt=ht=>{var kt=rc(),Xt=l(kt);O(()=>m(Xt,n(Oe).why)),b(ht,kt)};G(wt,ht=>{n(Oe).why&&ht(xt)})}var Cn=s(wt,2);{var Wn=ht=>{var kt=ic(),Xt=l(kt);O((Ft,Et,Kt)=>m(Xt,`~${Ft??""} GB · ~${Et??""} Tok/s · optimal ~${Kt??""}k Kontext`),[()=>(n(Oe).fit.req_gb??0).toFixed(1),()=>Math.round(n(Oe).fit.tps??0),()=>Math.round((n(Oe).optimal_ctx||8192)/1024)]),b(ht,kt)};G(Cn,ht=>{n(Oe).fit&&ht(Wn)})}var tt=s(ce,2);{var ut=ht=>{var kt=sc(),Xt=l(kt);O(Ft=>{vt(kt,1,`fit-badge ${Ft??""}`),m(Xt,n(Oe).fit.text)},[()=>h(n(Oe).fit.level)]),b(ht,kt)};G(tt,ht=>{n(Oe).fit&&ht(ut)})}O(()=>{m(dt,n(Oe).name),m(ct,n(Oe).role)}),b(Ge,j)});var De=s(Te,2);{var Me=Ge=>{const Oe=I(()=>Math.max(...n(y).models.map($t=>{var dt;return((dt=$t.fit)==null?void 0:dt.req_gb)??0})));var j=oc(),ce=s(l(j)),ot=l(ce);O($t=>m(ot,`~${$t??""} GB`),[()=>n(Oe).toFixed(1)]),b(Ge,j)};G(De,Ge=>{n(y).models.length&&n(y).models[0].fit&&Ge(Me)})}var ke=s(De,2),Fe=l(ke);O(()=>{m(Le,n(y).title),m(yt,n(y).desc),vt(ke,1,`primary${n(y).fit_level==="too_tight"?" warn":""}`),m(Fe,n(y).fit_level==="too_tight"?"Trotzdem installieren (zu groß)":"Komplettes Setup installieren")}),P("click",N,Ge=>{Ge.target.classList.contains("modal-overlay")&&g(Ee,null)}),P("click",Y,()=>g(Ee,null)),P("click",ke,()=>le(n(y).id)),b(_,N)};G(Qe,_=>{n(Ee)&&_(dn)})}var Nt=s(Qe,2);{var In=_=>{var y=hc(),N=l(y),q=l(N),Y=s(q,2),Ce=l(Y),Le=s(Y,2),lt=l(Le),yt=s(Le,2);{var Te=ke=>{var Fe=cc();b(ke,Fe)},De=ke=>{var Fe=fc(),Ge=s(_t(Fe),2);Ze(Ge,21,()=>n(J).files,Ye,(tt,ut)=>{const ht=I(()=>n(ut).fit.level==="perfect"?"●":n(ut).fit.level==="marginal"?"◐":"○");var kt=Ji(),Xt=l(kt),Ft={};O(()=>{m(Xt,`${n(ht)??""} ${n(ut).filename??""}`),Ft!==(Ft=n(ut).filename)&&(kt.value=(kt.__value=n(ut).filename)??"")}),b(tt,kt)});var Oe=s(Ge,2),j=l(Oe),ce=s(l(j),2),ot=s(j,2),$t=l(ot),dt=s(l($t));qe(dt,()=>fi(a));var Ue=s($t,2),ct=s(Oe,2);{var Zt=tt=>{var ut=uc(),ht=s(l(ut)),kt=l(ht),Xt=s(ht,2);O(Ft=>m(kt,`~${Ft??""}k`),[()=>Math.round(n(ne).optimal_ctx/1024)]),P("click",Xt,Ft=>{Ft.preventDefault(),g(Q,n(ne).optimal_ctx,!0)}),b(tt,ut)};G(ct,tt=>{var ut;(ut=n(ne))!=null&&ut.optimal_ctx&&tt(Zt)})}var wt=s(ct,2);{var xt=tt=>{var ut=vc(),ht=l(ut),kt=s(l(ht),2),Xt=l(kt),Ft=s(ht,2),Et=l(Ft);O((Kt,jn,Kr)=>{m(Xt,`~${Kt??""} GB · ~${jn??""} Tok/s · ${(n(ne).quant||"GGUF")??""}`),vt(Ft,1,`fit-badge ${Kr??""}`),m(Et,n(ne).fit.text)},[()=>(n(ne).fit.req_gb??0).toFixed(1),()=>Math.round(n(ne).fit.tps??0),()=>h(n(ne).fit.level)]),b(tt,ut)};G(wt,tt=>{n(ne)&&tt(xt)})}var Cn=s(wt,2),Wn=l(Cn);O(()=>{var tt,ut;vt(Cn,1,`primary${((tt=n(ne))==null?void 0:tt.fit.level)==="too_tight"?" warn":""}`),Cn.disabled=n(ye),m(Wn,n(ye)?"Starte…":((ut=n(ne))==null?void 0:ut.fit.level)==="too_tight"?"Trotzdem holen (zu groß)":"Herunterladen & Einpflegen")}),P("change",Ge,z),nr(Ge,()=>n(oe),tt=>g(oe,tt)),Ln(ce,()=>n(Pe),tt=>g(Pe,tt)),Ln(Ue,()=>n(Q),tt=>g(Q,tt)),P("click",Cn,K),b(ke,Fe)},Me=ke=>{var Fe=pc();b(ke,Fe)};G(yt,ke=>{var Fe,Ge;n(ye)&&!n(J)?ke(Te):(Ge=(Fe=n(J))==null?void 0:Fe.files)!=null&&Ge.length?ke(De,1):n(ye)||ke(Me,2)})}O(()=>{m(Ce,n(nt)),m(lt,n(T))}),P("click",y,ke=>{ke.target.classList.contains("modal-overlay")&&g(ze,!1)}),P("click",q,()=>g(ze,!1)),b(_,y)};G(Nt,_=>{n(ze)&&_(In)})}var Nn=s(Nt,2);{var An=_=>{var y=_c(),N=l(y),q=l(N),Y=s(q,2),Ce=l(Y),Le=s(Y,6),lt=s(Le,4),yt=s(lt,4);Ze(yt,17,()=>n(Ve),Ye,(ke,Fe,Ge)=>{var Oe=gc(),j=l(Oe),ce=s(j,2),ot=s(ce,2);Ze(ot,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],Ye,(dt,Ue)=>{var ct=Ji(),Zt=l(ct),wt={};O(()=>{m(Zt,Ue),wt!==(wt=Ue)&&(ct.__value=Ue)}),b(dt,ct)});var $t=s(ot,2);Ln(j,()=>n(Fe).repo,dt=>n(Fe).repo=dt),Ln(ce,()=>n(Fe).role,dt=>n(Fe).role=dt),nr(ot,()=>n(Fe).quant,dt=>n(Fe).quant=dt),P("click",$t,()=>g(Ve,n(Ve).filter((dt,Ue)=>Ue!==Ge),!0)),b(ke,Oe)});var Te=s(yt,2),De=s(Te,4),Me=l(De);O(()=>{m(Ce,n(We)?"Setup bearbeiten":"Eigenes Setup erstellen"),m(Me,n(We)?"Änderungen speichern":"Setup speichern")}),P("click",y,ke=>{ke.target.classList.contains("modal-overlay")&&g(Ke,!1)}),P("click",q,()=>g(Ke,!1)),Ln(Le,()=>n(Ie),ke=>g(Ie,ke)),Ln(lt,()=>n(He),ke=>g(He,ke)),P("click",Te,()=>g(Ve,[...n(Ve),{repo:"",role:"",quant:"Q4_K_M"}],!0)),P("click",De,ae),b(_,y)};G(Nn,_=>{n(Ke)&&_(An)})}O(()=>{It.disabled=n(R),m(Yt,n(R)?"Suche…":"Aktualisieren"),st.disabled=n(be),m(xe,n(be)?"Lade…":"Suchen")}),P("click",et,$),P("click",It,()=>Ot(!0)),P("keydown",yn,_=>_.key==="Enter"&&qt()),Ln(yn,()=>n(re),_=>g(re,_)),nr(Je,()=>n(H),_=>g(H,_)),P("click",st,qt),b(e,at),ia()}ka(["click","keydown","change"]);var yc=k(`
Du öffnest Mission Control über einen Proxy/Namen. Die Engine läuft auf Port 8080 ohne HTTPS direkt am Bosgame.
- Trag in deinen Tools die LAN-IP ein: http://192.168.178.151:8080/v1 — nicht den Proxy-Namen.
Wähle, welche Modelle im Config-Snippet erscheinen sollen.
'),Ec=k(''),Tc=k('
Öffne die Zed-Settings mit Cmd/Strg + , und füge diesen Block in deine bestehende settings.json ein. Falls bereits ein "bosgame"-Eintrag existiert: vorher löschen.
Nur diesen Block einfügen, nicht die ganze Datei ersetzen — sonst gehen andere Einstellungen verloren.
API-Key: Öffne den Agent-Panel → Anbieter bosgame → trag irgendeinen Wert ein (z.B. local).
Es läuft immer nur ein Modell gleichzeitig — ein größerer Kontext hier beeinflusst deine anderen Modelle nicht.
Immer aktiv halten
Modell bleibt dauerhaft im RAM — nie automatisch entladen. Ideal für den kleinen Scout (~5 GB), der immer schnell antworten soll.
'),xd=w(''),kd=w('
Rolle festlegen
Wähle eine Rolle als zweiten, sprechenden Namen. In deinen Tools funktionieren danach beide: der echte Modellname und die Rolle.
'),Md=w('
Modelle
Deine konfigurierten Modelle — testen, Kontext anpassen oder aus dem Speicher werfen.
Schnelltest
Schreib eine Nachricht — das gewählte Modell wird automatisch geweckt.
Modelle & Ports
Modelle laden automatisch, sobald eine Anfrage kommt — du musst nichts manuell starten.
',1);function Sd(e,t){tn(t,!0);const n="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr (längere Dateien/Chats), braucht aber mehr Speicher und wird etwas langsamer.",r="Die Rolle ist ein zusätzlicher, sprechender Name (z.B. coder). Du kannst in deinen Tools entweder den echten Modellnamen ODER die Rolle angeben — beides führt zum selben Modell.",i=[{id:"coder",label:"Coder",desc:"Programmieren & Code"},{id:"vision",label:"Vision",desc:"Bilder verstehen"},{id:"scout",label:"Scout",desc:"Schneller Allrounder"},{id:"reviewer",label:"Reviewer",desc:"Code/Texte prüfen"},{id:"manager",label:"Manager",desc:"Planen & koordinieren"}],o=q(()=>{var C;return((C=mr.value)==null?void 0:C.models)||[]});function d(){document.dispatchEvent(new Event("mc:refresh"))}let c=O(""),v=O(""),u=O(""),h=O(!1);const E=q(()=>a(o).filter(C=>!C.incomplete));async function p(){var F;const C=a(c)||((F=a(E)[0])==null?void 0:F.name);if(!(!C||!a(v).trim())){g(h,!0),g(u,"(wecke Modell, kann beim Laden kurz dauern…)");try{const $e=await Me("/api/chat",{method:"POST",body:JSON.stringify({model:C,message:a(v)})});g(u,$e.reply,!0)}catch($e){g(u,"Fehler: "+$e.message)}g(h,!1),d()}}const x=300;let $=O(!1),L=O(null),k=O(8192),D=O(!1);function Pe(C){var F;g(L,a(o).find($e=>$e.name===C),!0),a(L)&&(g(k,((F=a(L).meta)==null?void 0:F.ctx)||8192,!0),g(D,(a(L).ttl??x)>=99999),g($,!0))}async function ne(){const C=a(D)?99999:x;try{await Me("/api/update_model",{method:"POST",body:JSON.stringify({alias:a(L).name,ctx:a(k),ttl:C})}),ee("Gespeichert — aktiv beim nächsten Modell-Start."),g($,!1),d()}catch(F){ee(F.message,!0)}}let pe=O(!1),Ee=O(""),K=O(""),U=O("");function ue(C){const F=a(o).find($e=>$e.name===C);g(Ee,C,!0),g(U,(F==null?void 0:F.role)||"",!0),g(K,""),g(pe,!0)}async function he(C){try{await Me("/api/set_role",{method:"POST",body:JSON.stringify({alias:a(Ee),role:C})}),ee(C?`Rolle gesetzt: ${C}`:"Rolle entfernt."),g(pe,!1),d()}catch(F){ee(F.message,!0)}}async function Le(C){if(await wa({title:`„${C}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await Me("/api/unload?model="+encodeURIComponent(C),{method:"POST"}),ee("Entladen: "+C),setTimeout(d,600)}catch(F){ee(F.message,!0)}}async function Ue(C){if(await wa({title:`„${C}" wirklich löschen?`,body:"Das Modell wird aus der Konfiguration ausgetragen und seine Dateien werden von der Festplatte gelöscht, um Speicher freizugeben. Das lässt sich nicht rückgängig machen — später brauchst du dafür einen neuen Download.",confirmLabel:"Endgültig löschen",danger:!0}))try{const F=await Me("/api/delete_model",{method:"POST",body:JSON.stringify({alias:C})});ee(F.note||"Gelöscht: "+C),setTimeout(d,600)}catch(F){ee(F.message,!0)}}function _t(C){return C!=null&&C.length?C.map(F=>F==="Code"?'Code':F==="Bild"?'Bild':'Text').join(" "):"–"}function T(C){if(!C)return"–";const F=C.quant||"?",$e=C.ctx?Math.round(C.ctx/1024)+"K":"?",dt=C.size_bytes?(C.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${F} · ${$e} · ${dt}`}function W(C){var F;(F=navigator.clipboard)==null||F.writeText(C),ee("Kopiert: "+C)}var re=Md(),He=s(ot(re),2),J=s(l(He),6);ft(J,21,()=>a(E),ut,(C,F)=>{var $e=vd(),dt=l($e),N={};z(()=>{m(dt,a(F).name),N!==(N=a(F).name)&&($e.value=($e.__value=a(F).name)??"")}),_(C,$e)});var ze=s(J,4),Z=s(ze,2),rt=l(Z),P=s(Z,2);{var H=C=>{var F=ud(),$e=l(F);z(()=>m($e,a(u))),_(C,F)};I(P,C=>{a(u)&&C(H)})}var ie=s(He,2),ge=l(ie),Te=s(l(ge)),mt=l(Te),pt=s(ge,4);{var kt=C=>{var F=fd();_(C,F)},At=C=>{var F=bd(),$e=s(l(F));ft($e,21,()=>a(o),ut,(dt,N)=>{var De=or(),Q=ot(De);{var de=Y=>{var me=pd(),ve=l(me),we=l(ve),xe=s(ve,5),be=l(xe),S=s(be,2);z(()=>m(we,a(N).name)),A("click",be,()=>{var V;ee("Lade im Cookbook ein Modell und setze den Alias auf: "+a(N).name),(V=document.querySelector(".nav-item[data-view='cookbook']"))==null||V.dispatchEvent(new MouseEvent("click"))}),A("click",S,()=>Ue(a(N).name)),_(Y,me)},se=Y=>{var me=md(),ve=l(me),we=l(ve),xe=l(we),be=s(xe);{var S=ke=>{var Ae=hd(),Oe=l(Ae);z(()=>m(Oe,a(N).role)),_(ke,Ae)};I(be,ke=>{a(N).role&&ke(S)})}var V=s(we,2);{var le=ke=>{var Ae=gd(),Oe=l(Ae);z(()=>m(Oe,a(N).meta.filename)),_(ke,Ae)};I(V,ke=>{var Ae;(Ae=a(N).meta)!=null&&Ae.filename&&ke(le)})}var Qe=s(V,2),Je=s(l(Qe),2);ft(Je,17,()=>{var ke;return(ke=a(N).api_ids)!=null&&ke.length?a(N).api_ids:[a(N).name]},ut,(ke,Ae)=>{var Oe=_d(),Ot=l(Oe);z(()=>m(Ot,a(Ae))),A("click",Oe,()=>W(a(Ae))),_(ke,Oe)});var Jt=s(ve);Ce(Jt,()=>{var ke;return _t((ke=a(N).meta)==null?void 0:ke.caps)},!0);var Yt=s(Jt);Ce(Yt,()=>T(a(N).meta),!0);var Vt=s(Yt);Ce(Vt,()=>Uo(a(N).state,a(N).download_progress),!0);var M=s(Vt),G=l(M),qe=s(M),te=l(qe),Be=s(te,2),Ye=s(Be,2),et=s(Ye,2);z(()=>{m(xe,`${a(N).name??""} `),m(G,a(N).port??"auto")}),A("click",te,()=>ue(a(N).name)),A("click",Be,()=>Pe(a(N).name)),A("click",Ye,()=>Le(a(N).name)),A("click",et,()=>Ue(a(N).name)),_(Y,me)};I(Q,Y=>{a(N).incomplete?Y(de):Y(se,-1)})}_(dt,De)}),_(C,F)};I(pt,C=>{a(o).length?C(At,-1):C(kt)})}var Mt=s(ie,2);{var Lt=C=>{var F=wd(),$e=l(F),dt=l($e),N=s(dt,4),De=l(N),Q=s(N,2),de=s(l(Q));Ce(de,()=>gi(n));var se=s(Q,2),Y=s(se,2);{var me=le=>{var Qe=yd(),Je=l(Qe),Jt=s(l(Je),2),Yt=l(Jt),Vt=s(Yt,2),M=s(Je,2);z((G,qe)=>{m(Yt,`Optimal ~${G??""}k → ~${a(L).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),m(Vt,` Aktuell ~${qe??""}k → ~${a(L).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(a(L).meta.optimal_ctx/1024),()=>Math.round((a(L).meta.ctx||0)/1024)]),A("click",M,()=>g(k,a(L).meta.optimal_ctx,!0)),_(le,Qe)};I(Y,le=>{var Qe;(Qe=a(L).meta)!=null&&Qe.optimal_ctx&&le(me)})}var ve=s(Y,4),we=s(l(ve),2),xe=l(we),be=s(xe,2),S=l(be),V=s(ve,2);z(()=>{m(De,a(L).name),fa(be,`color:${a(D)?"var(--accent)":"var(--mut)"}`),m(S,a(D)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),A("click",F,le=>{le.target.classList.contains("modal-overlay")&&g($,!1)}),A("click",dt,()=>g($,!1)),Ta(se,()=>a(k),le=>g(k,le)),Ro(xe,()=>a(D),le=>g(D,le)),A("click",V,ne),_(C,F)};I(Mt,C=>{a($)&&a(L)&&C(Lt)})}var qt=s(Mt,2);{var Rt=C=>{var F=kd(),$e=l(F),dt=l($e),N=s(dt,2),De=s(l(N));Ce(De,()=>gi(r));var Q=s(N,2),de=l(Q),se=s(Q,4);ft(se,21,()=>i,ut,(xe,be)=>{var S=xd(),V=l(S);z(()=>{wt(S,1,a(U)===a(be).id?"primary":"ghost"),Fr(S,"title",a(be).desc),m(V,a(be).label)}),A("click",S,()=>he(a(be).id)),_(xe,S)});var Y=s(se,4),me=s(Y,2),ve=l(me),we=s(ve,2);z(()=>m(de,a(Ee))),A("click",F,xe=>{xe.target.classList.contains("modal-overlay")&&g(pe,!1)}),A("click",dt,()=>g(pe,!1)),Ta(Y,()=>a(K),xe=>g(K,xe)),A("click",ve,()=>he("")),A("click",we,()=>he(a(K).trim().toLowerCase())),_(C,F)};I(qt,C=>{a(pe)&&C(Rt)})}z(()=>{Z.disabled=a(h),m(rt,a(h)?"…":"Senden"),m(mt,a(o).length?a(o).length+" konfiguriert":"")}),nr(J,()=>a(c),C=>g(c,C)),Ta(ze,()=>a(v),C=>g(v,C)),A("click",Z,p),_(e,re),an()}xn(["click"]);var Ed=w('
Prozessor (CPU)
%
Arbeitsspeicher
%
Grafikspeicher
%
System-Metriken (Bosgame)
Live-Auslastung deines Mini-PCs, alle 0,5 Sekunden.
Arbeitsspeicher (RAM)
Grafikspeicher (VRAM + GTT)
Speicherplatz (Disk)
Temperatur (GPU / CPU)
CPU-Verlauf
RAM-Verlauf
VRAM-Verlauf
',1),Td=w(''),$d=w('
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
'),Ad=w(''),Cd=w(''),Ld=w(''),zd=w('
'),Dd=w('
'),Pd=w('
'),qd=w('
Aktivität
Live-Auslastung und laufende Aufgaben (Downloads, Updates) mit Protokoll.
Hintergrund-Aufgaben
Downloads & Updates erscheinen hier mit Live-Protokoll — zum Aufklappen klicken.
Dienste steuern, Updates einspielen und live mitlesen — ganz ohne SSH oder Terminal.
LLM-Engine (llama-swap)
Das Herzstück: lädt bei jeder Anfrage automatisch das passende Modell.
Adresse (für deine Tools)
Aktuell geladen
Konfigurierte Modelle
Dienste & Applikation
Diese Aktionen sind harmlos und passwortlos — es geht nichts dabei verloren.
Betriebssystem (Bosgame)
Tiefe Eingriffe — das Dashboard fragt einmalig nach deinem sudo-Passwort.
Live-Konsole
Live mitlesen, was der Dienst gerade tut.
',1);function Vd(e,t){tn(t,!0);const n=q(()=>mr.value),r=q(()=>dn.value);let i=null,o=O(`Verbinde…
+`),d=O("llama-swap"),c,v=O(null),u=O("");const h=new Set,E=q(()=>a(v)?a(r).find(S=>S.id===a(v)):null);Ti(()=>{if(!a(E))return;const S=a(E),V=S.state==="done",le=S.state==="failed",Qe=S.state==="canceled";(V||le||Qe)&&!h.has(S.id)&&(h.add(S.id),ee(V?`✓ ${a(u)} abgeschlossen.`:Qe?`${a(u)} abgebrochen.`:`✗ ${a(u)} fehlgeschlagen.`,le),V&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function p(S,V){g(v,S,!0),g(u,V,!0),dn.track(S)}_r(()=>{x()}),Io(()=>{i==null||i.close()});function x(){i==null||i.close();const S=a(d);g(o,`Verbinde mit ${S}…
+`);const V=location.protocol==="https:"?"wss:":"ws:";i=new WebSocket(`${V}//${location.host}/api/logs/${S}?token=${encodeURIComponent(el())}`),i.onmessage=le=>{g(o,a(o)+le.data),c&&(c.scrollTop=c.scrollHeight)},i.onclose=()=>{g(o,a(o)+`
+— Verbindung getrennt —`)},i.onerror=()=>i==null?void 0:i.close()}async function $(S,V,le){if(await wa({title:V,body:le,confirmLabel:"Neustarten"}))try{await Me(`/api/service/${S}/restart`,{method:"POST"}),ee("Neustart ausgelöst: "+S),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(Qe){ee(Qe.message,!0)}}async function L(){if(await wa({title:"Mission Control aktualisieren?",body:"Holt die neueste Dashboard-Version aus Gitea und startet automatisch neu. Die Seite trennt kurz und verbindet von selbst wieder (~10 Sek)."}))try{const S=await Me("/api/self-update",{method:"POST"});ee("Update läuft — Dashboard startet gleich neu."),p(S.job_id,"Mission Control Update")}catch(S){ee(S.message,!0)}}async function k(){if(await wa({title:"LLM-Engine aktualisieren?",body:"Lädt die neueste llama.cpp-ROCm-Version und installiert sie. Die Engine ist während des Updates kurz nicht erreichbar."}))try{const S=await Me("/api/update",{method:"POST"});ee("LLM-Engine-Update läuft."),p(S.job_id,"LLM-Engine-Update")}catch(S){ee(S.message,!0)}}async function D(){if(await wa({title:"Grafikspeicher leeren?",body:"Alle geladenen Modelle werden entladen. Sie laden beim nächsten Aufruf automatisch neu — es geht nichts verloren.",confirmLabel:"Leeren"}))try{await Me("/api/unload",{method:"POST"}),ee("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(S){ee(S.message,!0)}}async function Pe(){if(!await wa({title:"OS-Updates installieren?",body:"Führt apt update & upgrade aus. Das kann ein paar Minuten dauern; der Fortschritt erscheint in der Aktivität."}))return;const S=await Wi({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(S)try{const V=await Me("/api/os-update",{method:"POST",body:JSON.stringify({password:S})});ee("OS-Update gestartet."),p(V.job_id,"OS-Update")}catch(V){ee(V.message,!0)}}async function ne(){if(!await wa({title:"Server wirklich neu starten?",body:"Der ganze Bosgame startet physisch neu. Alles ist für ~1 Minute offline — auch dieses Dashboard.",confirmLabel:"Reboot",danger:!0}))return;const S=await Wi({title:"sudo-Passwort",body:"Für den Reboot wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Jetzt neustarten",danger:!0});if(S)try{await Me("/api/reboot",{method:"POST",body:JSON.stringify({password:S})}),ee("Reboot ausgelöst — bis gleich.")}catch(V){ee(V.message,!0)}}async function pe(){g(Ee,"prüfe…");try{const S=await Me("/api/integration/test");g(Ee,S.ok?`✓ Engine antwortet — ${S.models.length} Modell(e): ${S.models.join(", ")}`:`✗ keine Verbindung: ${S.error}`,!0),g(K,S.ok,!0)}catch(S){g(Ee,"✗ "+S.message),g(K,!1)}}let Ee=O(""),K=O(!1);const U=q(()=>{var S;return((S=a(n))==null?void 0:S.models)||[]}),ue=["running","ready","loading","starting"],he=q(()=>a(U).find(S=>ue.includes(S.state)));function Le(S){if(!S||S.state!=="running")return null;if(typeof S.progress=="number")return Math.min(100,S.progress);const le=((S.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return le?Math.min(100,parseFloat(le[1])):null}var Ue=Hd(),_t=s(ot(Ue),2),T=l(_t),W=s(l(T),2),re=l(W),He=s(T,4),J=l(He),ze=s(l(J)),Z=l(ze),rt=s(J,2),P=s(l(rt),2),H=l(P),ie=s(rt,2),ge=s(l(ie),2),Te=l(ge),mt=s(He,2),pt=l(mt),kt=s(pt,2);{var At=S=>{var V=Rd(),le=l(V);z(()=>{fa(V,`color:${a(K)?"#7ee29a":"#ff9b95"}`),m(le,a(Ee))}),_(S,V)};I(kt,S=>{a(Ee)&&S(At)})}var Mt=s(_t,2),Lt=s(l(Mt),4),qt=s(Lt,2),Rt=s(qt,2),C=s(Rt,2),F=s(C,2),$e=s(Mt,2),dt=s(l($e),4),N=s(dt,2),De=s($e,2);{var Q=S=>{const V=q(()=>a(E)),le=q(()=>a(V).state==="done"),Qe=q(()=>a(V).state==="failed"),Je=q(()=>a(V).state==="canceled"),Jt=q(()=>a(le)||a(Qe)||a(Je)),Yt=q(()=>Le(a(V)));var Vt=Ud(),M=l(Vt),G=s(l(M),2);{var qe=Ke=>{var ht=Bd();A("click",ht,async()=>{await wa({title:a(u)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&Me(`/api/jobs/${a(V).id}/cancel`,{method:"POST"})}),_(Ke,ht)};I(G,Ke=>{a(Jt)||Ke(qe)})}var te=s(G,2),Be=l(te);{var Ye=Ke=>{var ht=Id();_(Ke,ht)},et=Ke=>{var ht=Nd();_(Ke,ht)},ke=Ke=>{var ht=Fd();_(Ke,ht)},Ae=Ke=>{var ht=Kd();_(Ke,ht)};I(Be,Ke=>{a(le)?Ke(Ye):a(Qe)?Ke(et,1):a(Je)?Ke(ke,2):Ke(Ae,-1)})}var Oe=s(M,2),Ot=l(Oe),Bt=s(Oe,2);{var Wt=Ke=>{var ht=Gd(),qa=l(ht);z(()=>fa(qa,`width:${a(Yt)??""}%`)),_(Ke,ht)};I(Bt,Ke=>{a(Yt)!=null&&!a(Jt)&&Ke(Wt)})}var na=s(Bt,2),_a=l(na);z(Ke=>{m(Ot,`${a(u)??""}${a(Jt)?a(le)?" — erfolgreich.":a(Je)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),m(_a,Ke)},[()=>(a(V).log||[]).join(`
+`)]),_(S,Vt)};I(De,S=>{a(E)&&S(Q)})}var de=s(De,2),se=l(de),Y=s(l(se),2),me=l(Y);me.value=me.__value="llama-swap";var ve=s(me);ve.value=ve.__value="mission-control";var we=s(ve);we.value=we.__value="system";var xe=s(se,4),be=l(xe);Bo(xe,S=>c=S,()=>c),z(S=>{var V,le,Qe;fa(W,`margin-left:auto;${(V=a(n))!=null&&V.swap_ok?"background:rgba(63,185,80,.12);border-color:rgba(63,185,80,.25);color:#7ee29a":"background:rgba(248,81,73,.12);border-color:rgba(248,81,73,.3);color:#ff9b95"}`),m(re,(le=a(n))!=null&&le.swap_ok?"● erreichbar":"● offline"),m(Z,(((Qe=a(n))==null?void 0:Qe.swap_url)||"—")+"/v1"),m(H,a(he)?a(he).name+` (${a(he).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),m(Te,S),m(be,a(o))},[()=>a(U).filter(S=>!S.incomplete).length||"keine"]),A("click",pt,pe),A("click",Lt,()=>$("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),A("click",qt,()=>$("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),A("click",Rt,L),A("click",C,k),A("click",F,D),A("click",dt,Pe),A("click",N,ne),A("change",Y,x),nr(Y,()=>a(d),S=>g(d,S)),_(e,Ue),an()}xn(["click","change"]);var Wd=w('
Größter Spitzenbedarf: . Es läuft immer nur ein Modell gleichzeitig — das größte bestimmt, ob das Setup passt.
'),pc=w('Alternative: — passt auf dein System.',1),hc=w('
⚠ Dieses Setup übersteigt deinen verfügbaren Speicher.
'),gc=w('
'),_c=w('
Lade Dateien von HuggingFace…
'),Zi=w(""),mc=w('
Empfohlener Kontext für deine Hardware: — übernehmen
'),bc=w('
Ressourcen-Check
'),yc=w('
⚠ Diese Datei ist zu groß für deinen Speicher. Kleinere Alternative: — einfach auswählen.
'),wc=w('
⚠ Alle Varianten dieses Modells sind zu groß für deinen Speicher. Ein kleineres Modell aus den Empfehlungen wäre die bessere Wahl.
'),xc=w('
',1),kc=w('
Keine GGUF-Dateien im Repo gefunden.
'),Mc=w('
'),Sc=w('
'),Ec=w('
Stell dir aus beliebigen Modellen ein eigenes Setup zusammen.
Die Repo-ID findest du über die Profi-Suche weiter unten (z.B. unsloth/Qwen3-8B-GGUF).
'),Tc=w('
Cookbook
Modelle finden, installieren und eigene Setups zusammenstellen.
1 · Anwendungsfall wählen & installieren
Hier starten: Fertige Modell-Bundles für deinen Anwendungsfall — ein Klick installiert alles. Die Hardware-Ampel zeigt vorab, ob das Setup auf deinen PC passt.
Aktuell die besten Modelle für dein System
Top-Modelle je Kategorie von HuggingFace — Hardware-Fit wird live für dein System berechnet.
Profi-Suche (HuggingFace)
Direkt HuggingFace durchsuchen — oder eine Modell-URL einfügen für den direkten Sprung.
',1);function $c(e,t){tn(t,!0);const n="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr, braucht aber mehr Speicher und wird etwas langsamer.",r="MoE (Mixture of Experts): viele Parameter fürs Wissen, aber pro Wort ist nur ein kleiner Teil aktiv → fast große-Modell-Qualität bei hohem Tempo. Ideal für deine APU.",i={perfect:0,marginal:1,too_tight:2},o={vision:"Bilder",coder:"Coden",reasoning:"Logik",agent:"Agenten & Tools",scout:"Allrounder",reviewer:"Review",manager:"Manager"},d=[{label:"Bilder",kw:["-vl-","-vl","vision","llava","multimodal","-mm-","pixtral"]},{label:"Coden",kw:["coder","-code-","code-","codestral","starcoder"]},{label:"Logik",kw:["-r1","deepseek-r1","reasoning","qwq","magistral","-think","thinking","-o1"]},{label:"Agenten & Tools",kw:["hermes","-tool","command-r","watt","-fc-","function"]}];function c(y){const b=(y||"").toLowerCase();for(const B of d)if(B.kw.some(R=>b.includes(R)))return B.label;return"Allrounder"}function v(y=""){const b=y.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(b)||new RegExp("(?{mt(),pt()});async function mt(){g(L,!0);try{const y=await Me("/api/cookbook/recipes");g(x,y.recipes||[],!0),g($,y.recommended_id||null,!0)}catch(y){ee(y.message,!0)}g(L,!1)}async function pt(y=!1){g(D,!0);try{const b=await Me("/api/cookbook/discover"+(y?"?force=true":""));g(k,b,!0),g(Pe,b.stale,!0)}catch(b){ee("Empfehlungen nicht ladbar: "+b.message,!0)}g(D,!1)}function kt(y){y=y.trim();const b=y.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return b?b[1]:/^[\w.-]+\/[\w.-]+$/.test(y)?y:null}async function At(){const y=a(ne).trim(),b=kt(y);let B=y;if(a(K)&&!b&&(B=B?B+" "+a(K):a(K)),!B&&!b){g(pe,[],!0);return}g(Ee,!0),g(ue,[],!0),g(he,-1);try{if(b)g(pe,[{id:b,author:b.split("/")[0],downloads:0}],!0);else{const R=`https://huggingface.co/api/models?search=${encodeURIComponent(B)}&filter=gguf&sort=${encodeURIComponent(a(U))}&direction=-1&limit=40`,ae=await fetch(R);g(pe,await ae.json(),!0)}a(pe).forEach((R,ae)=>Mt(ae,R.id))}catch(R){ee(R.message,!0),g(pe,[],!0)}g(Ee,!1)}async function Mt(y,b){var B;try{const R=await Me("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:b,ctx:8192})});if(!((B=R.files)!=null&&B.length)){a(ue)[y]=null,Lt();return}const ae=R.files.find(tt=>{var it;return(it=tt.quant)==null?void 0:it.includes("Q4_K_M")})||R.files[0];a(ue)[y]=ae.fit.level,Lt()}catch{a(ue)[y]=null,Lt()}}function Lt(){let y=-1,b=99;a(ue).forEach((B,R)=>{if(B==null)return;const ae=i[B]??99;ae=0&&b<=1?y:-1,!0)}function qt(y){g(Le,a(x).find(b=>b.id===y),!0)}async function Rt(y){const b=document.getElementById("cb-r-install-btn");b&&(b.disabled=!0,b.textContent="Starte…");try{const B=await Me("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:y,hf_token:ir()})});ee(`${B.count} Download${B.count!==1?"s":""} läuft — Modelle erscheinen danach automatisch im Modelle-Tab.`),g(Le,null),Te("activity")}catch(B){ee(B.message,!0),b&&(b.disabled=!1,b.textContent="Installieren")}}async function C(y,b){var B,R;g(Ue,!0),g(_t,b,!0),g(T,y,!0),g(He,""),g(J,8192),g(W,null),g(Z,null),g(re,""),g(ze,!0);try{if(g(W,await Me("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:y,ctx:8192})}),!0),(R=(B=a(W))==null?void 0:B.files)!=null&&R.length){const ae=a(W).files.find(tt=>{var it;return(it=tt.quant)==null?void 0:it.includes("Q4_K_M")})||a(W).files[0];g(re,ae.filename,!0),ae.optimal_ctx&&a(J)===8192&&g(J,ae.optimal_ctx,!0),F()}}catch(ae){ee(ae.message,!0)}g(ze,!1)}function F(){var y,b,B;!((b=(y=a(W))==null?void 0:y.files)!=null&&b.length)||!a(re)||(g(Z,a(W).files.find(R=>R.filename===a(re))||null,!0),(B=a(Z))!=null&&B.optimal_ctx&&a(J)===8192&&g(J,a(Z).optimal_ctx,!0))}async function $e(){var y,b;if(!a(T)||!a(re))return ee("Bitte eine GGUF-Datei wählen.",!0);g(ze,!0);try{const B=((y=a(W))==null?void 0:y.params_b)??7,R=((b=a(Z))==null?void 0:b.quant)??"Q4_K_M";await Me("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:a(T),role:a(He),params_b:B,quant:R,file:a(re),ctx:a(J),hf_token:ir()})}),ee("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),g(Ue,!1),Te("activity")}catch(B){ee("Fehler: "+B.message,!0)}g(ze,!1)}async function dt(y,b,B,R){R.disabled=!0,R.textContent="Starte…";try{await Me("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:y,role:b,params_b:B,quant:"Q4_K_M",hf_token:ir()})}),ee("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),Te("activity")}catch(ae){ee(ae.message,!0),R.disabled=!1,R.textContent="Installieren"}}function N(){g(ge,null),g(P,""),g(H,""),g(ie,[{repo:"",role:"",quant:"Q4_K_M"}],!0),g(rt,!0)}function De(y){const b=a(x).find(B=>B.id===y);b&&(g(ge,y,!0),g(P,b.title,!0),g(H,b.desc||"",!0),g(ie,b.models.map(B=>({repo:B.repo,role:B.role,quant:B.quant||"Q4_K_M"})),!0),g(rt,!0))}async function Q(){if(!a(P).trim())return ee("Bitte einen Titel angeben.",!0);const y=a(ie).filter(b=>b.repo.trim());if(!y.length)return ee("Mindestens ein Modell (Repo) angeben.",!0);try{a(ge)?(await Me("/api/cookbook/user-recipe/"+encodeURIComponent(a(ge)),{method:"PUT",body:JSON.stringify({title:a(P),desc:a(H),models:y})}),ee("Setup aktualisiert.")):(await Me("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:a(P),desc:a(H),models:y})}),ee("Setup gespeichert.")),g(rt,!1),mt()}catch(b){ee(b.message,!0)}}async function de(y){const b=a(x).find(B=>B.id===y);if(await wa({title:`„${(b==null?void 0:b.title)||y}" löschen?`,body:"Dein eigenes Setup wird aus dem Cookbook entfernt. Bereits installierte Modelle bleiben unangetastet.",confirmLabel:"Löschen",danger:!0}))try{await Me("/api/cookbook/user-recipe/"+encodeURIComponent(y),{method:"DELETE"}),ee("Setup gelöscht."),mt()}catch(B){ee(B.message,!0)}}function se(y){if(!v(y))return"";const b=u(y);return`MoE${b?` · ~${b}B aktiv`:""}`}function Y(y){return y?`${za(y)}`:""}var me=Tc(),ve=s(ot(me),2),we=l(ve),xe=s(l(we),2),be=s(we,4);{var S=y=>{var b=Wd();_(y,b)},V=y=>{var b=Yd();ft(b,21,()=>a(x),ut,(B,R)=>{const ae=q(()=>a(R).id===a($));var tt=Jd(),it=l(tt);{var X=fe=>{var Ze=jd(),Nt=ot(Ze),Tt=s(Nt,2);A("click",Nt,bt=>{bt.stopPropagation(),De(a(R).id)}),A("keydown",Nt,bt=>{bt.key==="Enter"&&(bt.stopPropagation(),De(a(R).id))}),A("click",Tt,bt=>{bt.stopPropagation(),de(a(R).id)}),A("keydown",Tt,bt=>{bt.key==="Enter"&&(bt.stopPropagation(),de(a(R).id))}),_(fe,Ze)};I(it,fe=>{a(R).user&&fe(X)})}var _e=s(it,2);{var Re=fe=>{var Ze=Xr();_(fe,Ze)},ct=fe=>{var Ze=Qd();_(fe,Ze)};I(_e,fe=>{a(ae)?fe(Re):a(R).user&&fe(ct,1)})}var Ie=s(_e,2),Ge=l(Ie),st=l(Ge),St=l(st),Zt=s(Ge,2),vt=l(Zt),Ne=s(Ie,2),Et=l(Ne),It=s(Ne,2),gt=l(It);z((fe,Ze)=>{wt(tt,1,`card-btn${a(ae)?" cb-best":""}`),m(St,a(R).title),wt(Zt,1,`fit-badge ${fe??""}`),m(vt,Ze),m(Et,a(R).desc),m(gt,`${a(R).models.length??""} Modell${a(R).models.length>1?"e":""} im Setup`)},[()=>h(a(R).fit_level),()=>E(a(R).fit_level)]),A("click",tt,()=>qt(a(R).id)),_(B,tt)}),_(y,b)};I(be,y=>{a(L)?y(S):y(V,-1)})}var le=s(ve,2),Qe=l(le),Je=s(l(Qe),2),Jt=l(Je);{var Yt=y=>{const b=q(()=>Math.round((Date.now()/1e3-a(k).updated)/60));var B=Xd(),R=ot(B);{var ae=Re=>{var ct=ar();z(()=>m(ct,`Quellen befragt vor ${a(b)??""} min`)),_(Re,ct)},tt=Re=>{var ct=ar();z(Ie=>m(ct,`Quellen befragt vor ${Ie??""} h`),[()=>Math.round(a(b)/60)]),_(Re,ct)},it=Re=>{var ct=ar();z(Ie=>m(ct,`Quellen befragt vor ${Ie??""} Tg.`),[()=>Math.round(a(b)/1440)]),_(Re,ct)};I(R,Re=>{a(b)<60?Re(ae):a(b)<1440?Re(tt,1):Re(it,-1)})}var X=s(R,2);{var _e=Re=>{var ct=Zd();_(Re,ct)};I(X,Re=>{a(Pe)&&Re(_e)})}_(y,B)};I(Jt,y=>{var b;(b=a(k))!=null&&b.updated&&y(Yt)})}var Vt=s(Je,2),M=l(Vt),G=s(Qe,4);{var qe=y=>{var b=ec();_(y,b)},te=y=>{var b=or(),B=ot(b);ft(B,17,()=>a(k).categories,ut,(R,ae)=>{var tt=ic(),it=l(tt),X=l(it),_e=l(X),Re=s(it,2);ft(Re,21,()=>a(ae).models,ut,(ct,Ie)=>{const Ge=q(()=>a(ae).recommended&&a(Ie).repo===a(ae).recommended);var st=rc(),St=l(st);{var Zt=Xe=>{var nt=Xr();_(Xe,nt)};I(St,Xe=>{a(Ge)&&Xe(Zt)})}var vt=s(St,2),Ne=l(vt),Et=l(Ne),It=l(Et),gt=s(Et,2),fe=l(gt),Ze=s(Ne,2),Nt=l(Ze),Tt=s(vt,2),bt=l(Tt);Ce(bt,()=>Y(o[a(Ie).role]||c(a(Ie).repo)));var Oa=s(bt,2);Ce(Oa,()=>se(a(Ie).repo));var Ha=s(Tt,2),Sa=l(Ha),kn=s(Ha,2);ft(kn,17,()=>a(Ie).requirements||[],ut,(Xe,nt)=>{var Ct=tc(),Ea=l(Ct);z(()=>m(Ea,`⚠ ${a(nt)??""}`)),_(Xe,Ct)});var lt=s(kn,4),Ve=l(lt);{var at=Xe=>{var nt=ac();z(()=>Fr(nt,"title",`bereits eingerichtet als ${a(Ie).installed??""}`)),_(Xe,nt)},yt=Xe=>{var nt=nc();A("click",nt,Ct=>dt(a(Ie).repo,a(Ie).role,a(Ie).params_b,Ct.currentTarget)),_(Xe,nt)};I(Ve,Xe=>{a(Ie).installed?Xe(at):Xe(yt,-1)})}z((Xe,nt,Ct)=>{wt(st,1,`card${a(Ge)?" res-best":""}`),m(It,a(Ie).name),m(fe,`${a(Ie).author??""} · ${a(Ie).params_b??""}B`),wt(Ze,1,`fit-badge ${Xe??""}`),m(Nt,a(Ie).fit.text),m(Sa,`${nt??""} · ⬇ ${Ct??""}`)},[()=>h(a(Ie).fit.level),()=>p(a(Ie).fit),()=>(a(Ie).downloads||0).toLocaleString()]),_(ct,st)}),z(()=>m(_e,a(ae).title)),_(R,tt)}),_(y,b)};I(G,y=>{var b;a(D)&&!a(k)?y(qe):(b=a(k))!=null&&b.categories&&y(te,1)})}var Be=s(le,2),Ye=s(l(Be),4),et=l(Ye),ke=s(et,2),Ae=l(ke);Ae.value=Ae.__value="downloads";var Oe=s(Ae);Oe.value=Oe.__value="trending";var Ot=s(Oe);Ot.value=Ot.__value="created_at";var Bt=s(ke,2),Wt=l(Bt),na=s(Ye,2);ft(na,20,()=>["","coder","vision","reasoning","chat","agent"],ut,(y,b)=>{var B=sc(),R=l(B);z(()=>{wt(B,1,a(K)===b?"primary":"ghost"),m(R,b||"Alle")}),A("click",B,()=>{g(K,b,!0),At()}),_(y,B)});var _a=s(na,2);{var Ke=y=>{var b=oc();ft(b,21,()=>a(pe),ut,(B,R,ae)=>{var tt=lc(),it=l(tt);{var X=Tt=>{var bt=Xr();_(Tt,bt)};I(it,Tt=>{ae===a(he)&&Tt(X)})}var _e=s(it,2),Re=l(_e),ct=l(Re),Ie=l(ct),Ge=s(ct,2),st=l(Ge),St=s(Re,2),Zt=l(St),vt=s(_e,2),Ne=l(vt);Ce(Ne,()=>Y(c(a(R).id)));var Et=s(Ne,2);Ce(Et,()=>se(a(R).id));var It=s(vt,4),gt=l(It),fe=l(gt),Ze=s(gt,2),Nt=l(Ze);z((Tt,bt,Oa,Ha,Sa)=>{wt(tt,1,`card${ae===a(he)?" res-best":""}`),m(Ie,Tt),m(st,a(R).author||""),wt(St,1,`fit-badge ${bt??""}`),m(Zt,Oa),m(fe,Ha),m(Nt,`⬇ ${Sa??""}`)},[()=>a(R).id.split("/").pop(),()=>a(ue)[ae]?h(a(ue)[ae]):"warn",()=>a(ue)[ae]?E(a(ue)[ae]):"prüfe…",()=>a(ue)[ae]?p({req_gb:0,tps:0}):"Hardware-Fit…",()=>(a(R).downloads||0).toLocaleString()]),A("click",tt,()=>C(a(R).id,a(R).id.split("/").pop())),_(B,tt)}),_(y,b)};I(_a,y=>{a(pe).length&&y(Ke)})}var ht=s(Be,2);{var qa=y=>{const b=q(()=>a(Le));var B=gc(),R=l(B),ae=l(R),tt=s(ae,2),it=l(tt),X=s(tt,2),_e=l(X),Re=s(X,2);ft(Re,21,()=>a(b).models,ut,(vt,Ne)=>{var Et=uc(),It=l(Et),gt=l(It),fe=l(gt),Ze=l(fe),Nt=s(fe,2),Tt=l(Nt),bt=s(Nt,2);Ce(bt,()=>se(a(Ne).repo));var Oa=s(gt,2);{var Ha=at=>{var yt=dc(),Xe=l(yt);z(()=>m(Xe,a(Ne).why)),_(at,yt)};I(Oa,at=>{a(Ne).why&&at(Ha)})}var Sa=s(Oa,2);{var kn=at=>{var yt=cc(),Xe=l(yt);z((nt,Ct,Ea)=>m(Xe,`~${nt??""} GB · ~${Ct??""} Tok/s · optimal ~${Ea??""}k Kontext`),[()=>(a(Ne).fit.req_gb??0).toFixed(1),()=>Math.round(a(Ne).fit.tps??0),()=>Math.round((a(Ne).optimal_ctx||8192)/1024)]),_(at,yt)};I(Sa,at=>{a(Ne).fit&&at(kn)})}var lt=s(It,2);{var Ve=at=>{var yt=vc(),Xe=l(yt);z(nt=>{wt(yt,1,`fit-badge ${nt??""}`),m(Xe,a(Ne).fit.text)},[()=>h(a(Ne).fit.level)]),_(at,yt)};I(lt,at=>{a(Ne).fit&&at(Ve)})}z(()=>{m(Ze,a(Ne).name),m(Tt,a(Ne).role)}),_(vt,Et)});var ct=s(Re,2);{var Ie=vt=>{const Ne=q(()=>Math.max(...a(b).models.map(fe=>{var Ze;return((Ze=fe.fit)==null?void 0:Ze.req_gb)??0})));var Et=fc(),It=s(l(Et)),gt=l(It);z(fe=>m(gt,`~${fe??""} GB`),[()=>a(Ne).toFixed(1)]),_(vt,Et)};I(ct,vt=>{a(b).models.length&&a(b).models[0].fit&&vt(Ie)})}var Ge=s(ct,2);{var st=vt=>{const Ne=q(()=>a(x).find(fe=>!fe.user&&fe.fit_level!=="too_tight"&&fe.id!==a(b).id));var Et=hc(),It=s(l(Et));{var gt=fe=>{var Ze=pc(),Nt=s(ot(Ze)),Tt=l(Nt);z(()=>m(Tt,`„${a(Ne).title??""}" ansehen`)),A("click",Nt,bt=>{bt.preventDefault(),g(Le,null),setTimeout(()=>qt(a(Ne).id),50)}),_(fe,Ze)};I(It,fe=>{a(Ne)&&fe(gt)})}_(vt,Et)};I(Ge,vt=>{a(b).fit_level==="too_tight"&&vt(st)})}var St=s(Ge,2),Zt=l(St);z(()=>{m(it,a(b).title),m(_e,a(b).desc),wt(St,1,`primary${a(b).fit_level==="too_tight"?" warn":""}`),m(Zt,a(b).fit_level==="too_tight"?"Trotzdem installieren (nicht empfohlen)":"Komplettes Setup installieren")}),A("click",B,vt=>{vt.target.classList.contains("modal-overlay")&&g(Le,null)}),A("click",ae,()=>g(Le,null)),A("click",St,()=>Rt(a(b).id)),_(y,B)};I(ht,y=>{a(Le)&&y(qa)})}var Ga=s(ht,2);{var nn=y=>{var b=Mc(),B=l(b),R=l(B),ae=s(R,2),tt=l(ae),it=s(ae,2),X=l(it),_e=s(it,2);{var Re=Ge=>{var st=_c();_(Ge,st)},ct=Ge=>{var st=xc(),St=s(ot(st),2);ft(St,21,()=>a(W).files,ut,(lt,Ve)=>{const at=q(()=>a(Ve).fit.level==="perfect"?"●":a(Ve).fit.level==="marginal"?"◐":"○");var yt=Zi(),Xe=l(yt),nt={};z(()=>{m(Xe,`${a(at)??""} ${a(Ve).filename??""}`),nt!==(nt=a(Ve).filename)&&(yt.value=(yt.__value=a(Ve).filename)??"")}),_(lt,yt)});var Zt=s(St,2),vt=l(Zt),Ne=s(l(vt),2),Et=s(vt,2),It=l(Et),gt=s(l(It));Ce(gt,()=>gi(n));var fe=s(It,2),Ze=s(Zt,2);{var Nt=lt=>{var Ve=mc(),at=s(l(Ve)),yt=l(at),Xe=s(at,2);z(nt=>m(yt,`~${nt??""}k`),[()=>Math.round(a(Z).optimal_ctx/1024)]),A("click",Xe,nt=>{nt.preventDefault(),g(J,a(Z).optimal_ctx,!0)}),_(lt,Ve)};I(Ze,lt=>{var Ve;(Ve=a(Z))!=null&&Ve.optimal_ctx&<(Nt)})}var Tt=s(Ze,2);{var bt=lt=>{var Ve=bc(),at=l(Ve),yt=s(l(at),2),Xe=l(yt),nt=s(at,2),Ct=l(nt);z((Ea,br,Ur)=>{m(Xe,`~${Ea??""} GB · ~${br??""} Tok/s · ${(a(Z).quant||"GGUF")??""}`),wt(nt,1,`fit-badge ${Ur??""}`),m(Ct,a(Z).fit.text)},[()=>(a(Z).fit.req_gb??0).toFixed(1),()=>Math.round(a(Z).fit.tps??0),()=>h(a(Z).fit.level)]),_(lt,Ve)};I(Tt,lt=>{a(Z)&<(bt)})}var Oa=s(Tt,2);{var Ha=lt=>{const Ve=q(()=>a(W).files.find(Ct=>Ct.fit.level!=="too_tight"&&Ct.filename!==a(re)));var at=or(),yt=ot(at);{var Xe=Ct=>{var Ea=yc(),br=s(l(Ea)),Ur=l(br);z(Hr=>m(Ur,`${a(Ve).filename??""} (${Hr??""})`),[()=>E(a(Ve).fit.level)]),A("click",br,Hr=>{Hr.preventDefault(),g(re,a(Ve).filename,!0),F()}),_(Ct,Ea)},nt=Ct=>{var Ea=wc();_(Ct,Ea)};I(yt,Ct=>{a(Ve)?Ct(Xe):Ct(nt,-1)})}_(lt,at)};I(Oa,lt=>{var Ve,at;((Ve=a(Z))==null?void 0:Ve.fit.level)==="too_tight"&&((at=a(W))!=null&&at.files)&<(Ha)})}var Sa=s(Oa,2),kn=l(Sa);z(()=>{var lt,Ve;wt(Sa,1,`primary${((lt=a(Z))==null?void 0:lt.fit.level)==="too_tight"?" warn":""}`),Sa.disabled=a(ze),m(kn,a(ze)?"Starte…":((Ve=a(Z))==null?void 0:Ve.fit.level)==="too_tight"?"Trotzdem holen (zu groß — nicht empfohlen)":"Herunterladen & Einpflegen")}),A("change",St,F),nr(St,()=>a(re),lt=>g(re,lt)),Ta(Ne,()=>a(He),lt=>g(He,lt)),Ta(fe,()=>a(J),lt=>g(J,lt)),A("click",Sa,$e),_(Ge,st)},Ie=Ge=>{var st=kc();_(Ge,st)};I(_e,Ge=>{var st,St;a(ze)&&!a(W)?Ge(Re):(St=(st=a(W))==null?void 0:st.files)!=null&&St.length?Ge(ct,1):a(ze)||Ge(Ie,2)})}z(()=>{m(tt,a(_t)),m(X,a(T))}),A("click",b,Ge=>{Ge.target.classList.contains("modal-overlay")&&g(Ue,!1)}),A("click",R,()=>g(Ue,!1)),_(y,b)};I(Ga,y=>{a(Ue)&&y(nn)})}var Ua=s(Ga,2);{var Hn=y=>{var b=Ec(),B=l(b),R=l(B),ae=s(R,2),tt=l(ae),it=s(ae,6),X=s(it,4),_e=s(X,4);ft(_e,17,()=>a(ie),ut,(Ge,st,St)=>{var Zt=Sc(),vt=l(Zt),Ne=s(vt,2),Et=s(Ne,2);ft(Et,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],ut,(gt,fe)=>{var Ze=Zi(),Nt=l(Ze),Tt={};z(()=>{m(Nt,fe),Tt!==(Tt=fe)&&(Ze.__value=fe)}),_(gt,Ze)});var It=s(Et,2);Ta(vt,()=>a(st).repo,gt=>a(st).repo=gt),Ta(Ne,()=>a(st).role,gt=>a(st).role=gt),nr(Et,()=>a(st).quant,gt=>a(st).quant=gt),A("click",It,()=>g(ie,a(ie).filter((gt,fe)=>fe!==St),!0)),_(Ge,Zt)});var Re=s(_e,2),ct=s(Re,4),Ie=l(ct);z(()=>{m(tt,a(ge)?"Setup bearbeiten":"Eigenes Setup erstellen"),m(Ie,a(ge)?"Änderungen speichern":"Setup speichern")}),A("click",b,Ge=>{Ge.target.classList.contains("modal-overlay")&&g(rt,!1)}),A("click",R,()=>g(rt,!1)),Ta(it,()=>a(P),Ge=>g(P,Ge)),Ta(X,()=>a(H),Ge=>g(H,Ge)),A("click",Re,()=>g(ie,[...a(ie),{repo:"",role:"",quant:"Q4_K_M"}],!0)),A("click",ct,Q),_(y,b)};I(Ua,y=>{a(rt)&&y(Hn)})}z(()=>{Vt.disabled=a(D),m(M,a(D)?"Suche…":"Aktualisieren"),Bt.disabled=a(Ee),m(Wt,a(Ee)?"Lade…":"Suchen")}),A("click",xe,N),A("click",Vt,()=>pt(!0)),A("keydown",et,y=>y.key==="Enter"&&At()),Ta(et,()=>a(ne),y=>g(ne,y)),nr(ke,()=>a(U),y=>g(U,y)),A("click",Bt,At),_(e,me),an()}xn(["click","keydown","change"]);var Ac=w(`
Du öffnest Mission Control über einen Proxy/Namen. Die Engine läuft auf Port 8080 ohne HTTPS direkt am Bosgame.
+ Trag in deinen Tools die LAN-IP ein: http://192.168.178.151:8080/v1 — nicht den Proxy-Namen.
Ö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).
Nur den "provider"-Block einfügen. Falls bereits ein "llama-swap"-Eintrag vorhanden: vorher löschen, sonst erscheinen Modelle doppelt.
Danach in OpenCode /models → wählen.
',1),Rc=w('
In Cline/Cursor den Provider „OpenAI Compatible" wählen:
API-Key: ein beliebiger Wert (z.B. local).
',1),Bc=w('
Settings → Admin Panel → Connections → neue OpenAI-Verbindung:
',1),Ic=w('
Bilder einbinden (Vision)
Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.
'),Nc=w('
2 · Modelle auswählen
Wähle, welche Modelle im Config-Snippet erscheinen sollen.
3 · Tool wählen
Für welches Werkzeug brauchst du die Konfiguration?
4 · Config-Snippet
',1),Fc=w('
2 · Erst ein Modell installieren
Noch kein Modell eingerichtet
Bevor du ein Tool verbinden kannst, braucht die Engine mindestens ein Modell. Das Config-Snippet wird dann automatisch mit deinen echten Modellnamen befüllt.
'),Kc=w('
Verbinden
Schritt für Schritt: KI-Modelle in deine Tools einbinden — getestet, erklärt, mit Copy-Paste-Config.
1 · Verbindung prüfen
Stelle sicher, dass die LLM-Engine erreichbar ist, bevor du Tools konfigurierst.
Wie funktioniert das Auto-Swap?
',1);function Gc(e,t){tn(t,!0);const n=q(()=>mr.value),r=q(()=>{var P;return(((P=a(n))==null?void 0:P.models)||[]).filter(H=>!H.incomplete)}),i=q(u);let o=O("zed"),d=O(Ht([])),c=O(""),v=O(!1);function u(){return`http://${location.hostname}:8080/v1`}function h(P){return/^\d{1,3}(\.\d{1,3}){3}$/.test(P)}function E(){return location.protocol==="https:"||!h(location.hostname)}const p=q(()=>a(d).length?a(d):a(r).map(P=>P.name)),x=q(()=>a(p)[0]||"coder"),$=q(()=>{var P;return(P=a(r).find(H=>{var ie,ge;return(ge=(ie=H.meta)==null?void 0:ie.caps)==null?void 0:ge.includes("Bild")}))==null?void 0:P.name});function L(P,H){const ge=(H.length?a(r).filter(Te=>H.includes(Te.name)):a(r).length?a(r):[{name:"coder",meta:{}}]).map(Te=>{var kt,At;const mt=(((kt=Te.meta)==null?void 0:kt.caps)||[]).some(Mt=>/Bild|Vision/i.test(Mt)),pt=((At=Te.meta)==null?void 0:At.ctx)||131072;return` { "name": "${Te.name}", "display_name": "${Te.name}", "max_tokens": ${pt}${mt?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`,
`);return`"language_models": {
"openai_compatible": {
"bosgame": {
- "api_url": "${D}",
+ "api_url": "${P}",
"available_models": [
-${le}
+${ge}
]
}
}
-}`}function M(D,U){const le=(U.length?n(r).filter(x=>U.includes(x.name)):n(r).length?n(r):[{name:"coder",meta:{}}]).map(x=>{var K;const z=((K=x.meta)==null?void 0:K.ctx)||131072;return` "${x.name}": { "name": "${x.name}", "contextWindowSize": ${z} }`}).join(`,
+}`}function k(P,H){const ge=(H.length?a(r).filter(Te=>H.includes(Te.name)):a(r).length?a(r):[{name:"coder",meta:{}}]).map(Te=>{var pt;const mt=((pt=Te.meta)==null?void 0:pt.ctx)||131072;return` "${Te.name}": { "name": "${Te.name}", "contextWindowSize": ${mt} }`}).join(`,
`);return`"provider": {
"llama-swap": {
"npm": "@ai-sdk/openai-compatible",
"name": "Bosgame (llama-swap)",
"options": {
- "baseURL": "${D}",
+ "baseURL": "${P}",
"apiKey": "local"
},
"models": {
-${le}
+${ge}
}
}
-}`}async function R(){g(c,"Teste…");try{const D=await ge("/api/integration/test");g(u,D.ok,!0),g(c,D.ok?`✓ Verbunden — ${D.models.length} Modell(e): ${D.models.join(", ")}`:`✗ Keine Verbindung: ${D.error}`,!0)}catch(D){g(u,!1),g(c,"✗ "+D.message)}}function Se(D){var Z;const U=D.querySelector("code");U&&((Z=navigator.clipboard)==null||Z.writeText(U.textContent||""))}function re(D){var U;(U=navigator.clipboard)==null||U.writeText(D.value)}var ve=zc(),be=s(_t(ve),2),F=s(l(be),6),H=l(F),ue=s(H,2),fe=s(F,2);{var Ee=D=>{var U=yc();b(D,U)},ze=I(()=>E());G(fe,D=>{n(ze)&&D(Ee)})}var nt=s(fe,2),T=l(nt),J=s(T,2);{var oe=D=>{var U=wc(),Z=l(U);O(()=>{hn(U,`color:${n(u)?"#7ee29a":"#ff9b95"}`),m(Z,n(c))}),b(D,U)};G(J,D=>{n(c)&&D(oe)})}var Pe=s(be,2),Q=s(l(Pe),2);Ze(Q,20,()=>[["⚡","Kein manuelles Starten nötig",'Wenn du in Zed oder OpenCode „coder" auswählst und eine Anfrage sendest, lädt llama-swap das Modell automatisch — in ca. 2–5 Sekunden.'],["🔄","Modelle wechseln sich automatisch ab","Rufst du ein anderes Modell auf, entlädt llama-swap das aktuelle (nach TTL-Ablauf) und lädt das neue. Es läuft immer nur eines gleichzeitig."],["🧠","Zwei Modelle gleichzeitig aktiv halten","Du hast 124 GB RAM — genug für z.B. Scout 8B (~5 GB) dauerhaft geladen + ein größeres Modell das swappt. Dafür beim Scout im Modelle-Tab → Konfigurieren die TTL auf 99999 setzen."]],Ye,(D,U)=>{var Z=I(()=>ir(U,3));let le=()=>n(Z)[0],x=()=>n(Z)[1],z=()=>n(Z)[2];var K=xc(),ie=l(K),$=l(ie),V=s(ie,2),ae=l(V),we=l(ae),Xe=s(ae,2),Ae=l(Xe);O(()=>{m($,le()),m(we,x()),m(Ae,z())}),b(D,K)});var ye=s(Pe,2);{var ne=D=>{var U=Sc(),Z=l(U),le=s(l(Z),2),x=l(le),z=s(Z,4);Ze(z,21,()=>n(r),Ye,($,V)=>{const ae=I(()=>n(d).includes(n(V).name));var we=kc(),Xe=l(we);O(()=>{hn(we,`cursor:pointer;${n(ae)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),m(Xe,n(V).name)}),P("click",we,()=>g(d,n(ae)?n(d).filter(Ae=>Ae!==n(V).name):[...n(d),n(V).name],!0)),P("keydown",we,Ae=>Ae.key==="Enter"&&g(d,n(ae)?n(d).filter(at=>at!==n(V).name):[...n(d),n(V).name],!0)),b($,we)});var K=s(z,2);{var ie=$=>{var V=Mc(),ae=l(V);P("click",ae,we=>{we.preventDefault(),g(d,[],!0)}),b($,V)};G(K,$=>{n(d).length&&$(ie)})}O(()=>m(x,n(d).length?`${n(d).length} von ${n(r).length} ausgewählt`:"alle werden eingeschlossen")),b(D,U)};G(ye,D=>{n(r).length&&D(ne)})}var Ke=s(ye,2),Ie=s(l(Ke),4);Ze(Ie,20,()=>[["zed","Zed","Schneller nativer Editor — Empfohlen"],["opencode","OpenCode","Open-Source Coding-Agent (Terminal/Desktop)"],["cline","Cline / Cursor","VS Code Extension, Bring-Your-Own-Key"],["openwebui","OpenWebUI","Browser-Chat-Interface"]],Ye,(D,U)=>{var Z=I(()=>ir(U,3));let le=()=>n(Z)[0],x=()=>n(Z)[1],z=()=>n(Z)[2];var K=Ec(),ie=l(K),$=l(ie),V=s(ie,2),ae=l(V);O(()=>{vt(K,1,`card-btn${n(o)===le()?" cb-best":""}`),m($,x()),m(ae,z())}),P("click",K,()=>g(o,le(),!0)),b(D,K)});var He=s(Ke,2),Ve=s(l(He),2);{var We=D=>{const U=I(()=>L(n(i),n(p)));var Z=Tc(),le=s(_t(Z),4),x=l(le),z=s(x,2),K=l(z),ie=l(K),$=s(le,4),V=s(l($)),ae=l(V);O(()=>{m(ie,n(U)),m(ae,`bosgame / ${n(w)??""}`)}),P("click",x,we=>Se(we.currentTarget.parentElement)),b(D,Z)},Tt=D=>{const U=I(()=>M(n(i),n(p)));var Z=$c(),le=s(_t(Z),6),x=l(le),z=s(x,2),K=l(z),ie=l(K),$=s(le,2),V=s(l($),3),ae=l(V);O(()=>{m(ie,n(U)),m(ae,`llama-swap/${n(w)??""}`)}),P("click",x,we=>Se(we.currentTarget.parentElement)),b(D,Z)},Pt=D=>{var U=Ac(),Z=s(_t(U),4),le=l(Z),x=s(le,2),z=s(Z,4),K=l(z),ie=s(K,2);O(()=>{mr(le,n(i)),mr(K,n(w))}),P("click",x,$=>re($.currentTarget.previousElementSibling)),P("click",ie,$=>re($.currentTarget.previousElementSibling)),b(D,U)},Ot=D=>{var U=Cc(),Z=s(_t(U),4),le=l(Z),x=s(le,2),z=s(Z,4),K=l(z),ie=s(K,2);O(()=>mr(le,n(i))),P("click",x,$=>re($.currentTarget.previousElementSibling)),P("click",ie,$=>re($.currentTarget.previousElementSibling)),b(D,U)};G(Ve,D=>{n(o)==="zed"?D(We):n(o)==="opencode"?D(Tt,1):n(o)==="cline"?D(Pt,2):n(o)==="openwebui"&&D(Ot,3)})}var Rt=s(He,2);{var qt=D=>{const U=I(()=>`curl ${n(i)}/chat/completions \\
+}`}async function D(){g(c,"Teste…");try{const P=await Me("/api/integration/test");g(v,P.ok,!0),g(c,P.ok?`✓ Verbunden — ${P.models.length} Modell(e): ${P.models.join(", ")}`:`✗ Keine Verbindung: ${P.error}`,!0)}catch(P){g(v,!1),g(c,"✗ "+P.message)}}function Pe(P){var ie;const H=P.querySelector("code");H&&((ie=navigator.clipboard)==null||ie.writeText(H.textContent||""))}function ne(P){var H;(H=navigator.clipboard)==null||H.writeText(P.value)}var pe=Kc(),Ee=s(ot(pe),2),K=s(l(Ee),6),U=l(K),ue=s(U,2),he=s(K,2);{var Le=P=>{var H=Ac();_(P,H)},Ue=q(()=>E());I(he,P=>{a(Ue)&&P(Le)})}var _t=s(he,2),T=l(_t),W=s(T,2);{var re=P=>{var H=Cc(),ie=l(H);z(()=>{fa(H,`color:${a(v)?"#7ee29a":"#ff9b95"}`),m(ie,a(c))}),_(P,H)};I(W,P=>{a(c)&&P(re)})}var He=s(Ee,2),J=s(l(He),2);ft(J,20,()=>[["⚡","Kein manuelles Starten nötig",'Wenn du in Zed oder OpenCode „coder" auswählst und eine Anfrage sendest, lädt llama-swap das Modell automatisch — in ca. 2–5 Sekunden.'],["🔄","Modelle wechseln sich automatisch ab","Rufst du ein anderes Modell auf, entlädt llama-swap das aktuelle (nach TTL-Ablauf) und lädt das neue. Es läuft immer nur eines gleichzeitig."],["🧠","Zwei Modelle gleichzeitig aktiv halten","Du hast 124 GB RAM — genug für z.B. Scout 8B (~5 GB) dauerhaft geladen + ein größeres Modell das swappt. Dafür beim Scout im Modelle-Tab → Konfigurieren die TTL auf 99999 setzen."]],ut,(P,H)=>{var ie=q(()=>sr(H,3));let ge=()=>a(ie)[0],Te=()=>a(ie)[1],mt=()=>a(ie)[2];var pt=Lc(),kt=l(pt),At=l(kt),Mt=s(kt,2),Lt=l(Mt),qt=l(Lt),Rt=s(Lt,2),C=l(Rt);z(()=>{m(At,ge()),m(qt,Te()),m(C,mt())}),_(P,pt)});var ze=s(He,2);{var Z=P=>{var H=Nc(),ie=ot(H),ge=l(ie),Te=s(l(ge),2),mt=l(Te),pt=s(ge,4);ft(pt,21,()=>a(r),ut,(Q,de)=>{const se=q(()=>a(d).includes(a(de).name));var Y=zc(),me=l(Y);z(()=>{fa(Y,`cursor:pointer;${a(se)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),m(me,a(de).name)}),A("click",Y,()=>g(d,a(se)?a(d).filter(ve=>ve!==a(de).name):[...a(d),a(de).name],!0)),A("keydown",Y,ve=>ve.key==="Enter"&&g(d,a(se)?a(d).filter(we=>we!==a(de).name):[...a(d),a(de).name],!0)),_(Q,Y)});var kt=s(pt,2);{var At=Q=>{var de=Dc(),se=l(de);A("click",se,Y=>{Y.preventDefault(),g(d,[],!0)}),_(Q,de)};I(kt,Q=>{a(d).length&&Q(At)})}var Mt=s(ie,2),Lt=s(l(Mt),4);ft(Lt,20,()=>[["zed","Zed","Schneller nativer Editor — Empfohlen"],["opencode","OpenCode","Open-Source Coding-Agent (Terminal/Desktop)"],["cline","Cline / Cursor","VS Code Extension, Bring-Your-Own-Key"],["openwebui","OpenWebUI","Browser-Chat-Interface"]],ut,(Q,de)=>{var se=q(()=>sr(de,3));let Y=()=>a(se)[0],me=()=>a(se)[1],ve=()=>a(se)[2];var we=Pc(),xe=l(we),be=l(xe),S=s(xe,2),V=l(S);z(()=>{wt(we,1,`card-btn${a(o)===Y()?" cb-best":""}`),m(be,me()),m(V,ve())}),A("click",we,()=>g(o,Y(),!0)),_(Q,we)});var qt=s(Mt,2),Rt=s(l(qt),2);{var C=Q=>{const de=q(()=>L(a(i),a(p)));var se=qc(),Y=s(ot(se),4),me=l(Y),ve=s(me,2),we=l(ve),xe=l(we),be=s(Y,4),S=s(l(be)),V=l(S);z(()=>{m(xe,a(de)),m(V,`bosgame / ${a(x)??""}`)}),A("click",me,le=>Pe(le.currentTarget.parentElement)),_(Q,se)},F=Q=>{const de=q(()=>k(a(i),a(p)));var se=Oc(),Y=s(ot(se),6),me=l(Y),ve=s(me,2),we=l(ve),xe=l(we),be=s(Y,2),S=s(l(be),3),V=l(S);z(()=>{m(xe,a(de)),m(V,`llama-swap/${a(x)??""}`)}),A("click",me,le=>Pe(le.currentTarget.parentElement)),_(Q,se)},$e=Q=>{var de=Rc(),se=s(ot(de),4),Y=l(se),me=s(Y,2),ve=s(se,4),we=l(ve),xe=s(we,2);z(()=>{wr(Y,a(i)),wr(we,a(x))}),A("click",me,be=>ne(be.currentTarget.previousElementSibling)),A("click",xe,be=>ne(be.currentTarget.previousElementSibling)),_(Q,de)},dt=Q=>{var de=Bc(),se=s(ot(de),4),Y=l(se),me=s(Y,2),ve=s(se,4),we=l(ve),xe=s(we,2);z(()=>wr(Y,a(i))),A("click",me,be=>ne(be.currentTarget.previousElementSibling)),A("click",xe,be=>ne(be.currentTarget.previousElementSibling)),_(Q,de)};I(Rt,Q=>{a(o)==="zed"?Q(C):a(o)==="opencode"?Q(F,1):a(o)==="cline"?Q($e,2):a(o)==="openwebui"&&Q(dt,3)})}var N=s(qt,2);{var De=Q=>{const de=q(()=>`curl ${a(i)}/chat/completions \\
-H "Content-Type: application/json" \\
-d '{
- "model": "${n(A)}",
+ "model": "${a($)}",
"messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,"}}]}]
-}'`);var Z=Lc(),le=l(Z),x=s(l(le),2),z=l(x);qe(z,()=>tn("check"));var K=s(z),ie=s(le,4),$=l(ie),V=s($,2),ae=l(V),we=l(ae);O(()=>{m(K,` „${n(A)??""}" bereit`),m(we,n(U))}),P("click",$,Xe=>Se(Xe.currentTarget.parentElement)),b(D,Z)};G(Rt,D=>{n(A)&&D(qt)})}O(()=>mr(H,n(i))),P("click",ue,D=>{const U=D.currentTarget.previousElementSibling;re(U)}),P("click",T,R),b(e,ve),ia()}ka(["click","keydown"]);var Dc=k('
'),Oc=k('
Für dich: Upgrades
Neuere Modelle, die ein installiertes ersetzen können.
'),Rc=k('
Lade News… (erstes Laden kann kurz dauern)
'),qc=k('
'),Bc=k('
Keine News geladen
Die Quellen sind gerade nicht erreichbar — später nochmal probieren.
'),Ic=k('für dich'),Nc=k('
'),Fc=k(''),Kc=k('
News
Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
',1);function Gc(e,t){ra(t,!0);let a=B(Dt([])),r=B(Dt([])),i=B(!0),o=B("");const d=F=>F==="perfect"?"ok":F==="marginal"?"warn":"bad";function c(F){const H=Math.max(0,Date.now()/1e3-F);return H<60?H+"s":H<3600?Math.floor(H/60)+"m":H<86400?Math.floor(H/3600)+"h":Math.floor(H/86400)+"d"}async function u(){g(i,!0),g(o,"");try{g(a,(await ge("/api/news")).items||[],!0)}catch(F){g(o,F.message||"Fehler beim Laden",!0)}finally{g(i,!1)}}async function v(){try{g(r,(await ge("/api/cookbook/upgrades")).upgrades||[],!0)}catch{g(r,[],!0)}}async function h(F,H){var ue;H.disabled=!0,H.textContent="Starte…";try{await ge("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:F.repo,role:F.role,params_b:F.params_b,quant:F.quant,hf_token:rr()})}),(ue=document.querySelector(".nav-item[data-view='activity']"))==null||ue.dispatchEvent(new MouseEvent("click"))}catch(fe){H.disabled=!1,H.textContent="Installieren",alert("Fehler: "+fe.message)}}function E(){u(),v()}hr(()=>{u(),v()});var p=Kc(),w=_t(p),A=s(l(w),2),L=s(w,2);{var M=F=>{var H=Oc(),ue=l(H),fe=s(l(ue),2),Ee=l(fe),ze=s(ue,4);Ze(ze,21,()=>n(r),Ye,(nt,T)=>{var J=Dc(),oe=l(J),Pe=l(oe),Q=l(Pe),ye=l(Q),ne=s(Q,2),Ke=l(ne),Ie=s(Pe,2),He=l(Ie),Ve=s(oe,2);O(We=>{m(ye,n(T).name),vt(ne,1,`fit-badge ${We??""}`),m(Ke,n(T).fit.text),m(He,`Ersetzt dein „${n(T).old??""}". ${n(T).why??""}`)},[()=>d(n(T).fit.level)]),P("click",Ve,We=>h(n(T),We.currentTarget)),b(nt,J)}),O(()=>m(Ee,n(r).length)),b(F,H)};G(L,F=>{n(r).length&&F(M)})}var R=s(L,2);{var Se=F=>{var H=Rc();b(F,H)},re=F=>{var H=qc(),ue=l(H);O(()=>m(ue,n(o))),b(F,H)},ve=F=>{var H=Bc();b(F,H)},be=F=>{var H=Fc();Ze(H,21,()=>n(a),Ye,(ue,fe,Ee)=>{var ze=Nc();vt(ze,1,`news-card${Ee===0?" featured":""}`);var nt=l(ze),T=l(nt),J=l(T),oe=s(T,2);{var Pe=Ie=>{var He=Ic();b(Ie,He)};G(oe,Ie=>{n(fe).relevant&&Ie(Pe)})}var Q=s(oe,2),ye=l(Q),ne=s(nt,2),Ke=l(ne);O(Ie=>{Ir(ze,"href",n(fe).link),m(J,n(fe).source),m(ye,Ie),m(Ke,n(fe).title)},[()=>n(fe).ts?c(n(fe).ts):""]),b(ue,ze)}),b(F,H)};G(R,F=>{n(i)?F(Se):n(o)?F(re,1):n(a).length?F(be,-1):F(ve,2)})}P("click",A,E),b(e,p),ia()}ka(["click"]);const Uc=[["Dein erster Workflow — in 3 Schritten",`
+}'`);var se=Ic(),Y=l(se),me=s(l(Y),2),ve=l(me);Ce(ve,()=>zt("check"));var we=s(ve),xe=s(Y,4),be=l(xe),S=s(be,2),V=l(S),le=l(V);z(()=>{m(we,` „${a($)??""}" bereit`),m(le,a(de))}),A("click",be,Qe=>Pe(Qe.currentTarget.parentElement)),_(Q,se)};I(N,Q=>{a($)&&Q(De)})}z(()=>m(mt,a(d).length?`${a(d).length} von ${a(r).length} ausgewählt`:"alle werden eingeschlossen")),_(P,H)},rt=P=>{var H=Fc(),ie=s(l(H),2),ge=s(l(ie),4);A("click",ge,()=>{var Te;return(Te=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:Te.dispatchEvent(new MouseEvent("click"))}),_(P,H)};I(ze,P=>{a(r).length?P(Z):P(rt,-1)})}z(()=>wr(U,a(i))),A("click",ue,P=>{const H=P.currentTarget.previousElementSibling;ne(H)}),A("click",T,D),_(e,pe),an()}xn(["click","keydown"]);var Uc=w('
'),Hc=w('
Für dich: Upgrades
Neuere Modelle, die ein installiertes ersetzen können.
'),Vc=w('
Lade News… (erstes Laden kann kurz dauern)
'),Wc=w('
'),jc=w('
Keine News geladen
Die Quellen sind gerade nicht erreichbar — später nochmal probieren.
'),Qc=w('für dich'),Jc=w('
'),Yc=w(''),Zc=w('
News
Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
',1);function Xc(e,t){tn(t,!0);let n=O(Ht([])),r=O(Ht([])),i=O(!0),o=O("");const d=K=>K==="perfect"?"ok":K==="marginal"?"warn":"bad";function c(K){const U=Math.max(0,Date.now()/1e3-K);return U<60?U+"s":U<3600?Math.floor(U/60)+"m":U<86400?Math.floor(U/3600)+"h":Math.floor(U/86400)+"d"}async function v(){g(i,!0),g(o,"");try{g(n,(await Me("/api/news")).items||[],!0)}catch(K){g(o,K.message||"Fehler beim Laden",!0)}finally{g(i,!1)}}async function u(){try{g(r,(await Me("/api/cookbook/upgrades")).upgrades||[],!0)}catch{g(r,[],!0)}}async function h(K,U){var ue;U.disabled=!0,U.textContent="Starte…";try{await Me("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:K.repo,role:K.role,params_b:K.params_b,quant:K.quant,hf_token:ir()})}),(ue=document.querySelector(".nav-item[data-view='activity']"))==null||ue.dispatchEvent(new MouseEvent("click"))}catch(he){U.disabled=!1,U.textContent="Installieren",alert("Fehler: "+he.message)}}function E(){v(),u()}_r(()=>{v(),u()});var p=Zc(),x=ot(p),$=s(l(x),2),L=s(x,2);{var k=K=>{var U=Hc(),ue=l(U),he=s(l(ue),2),Le=l(he),Ue=s(ue,4);ft(Ue,21,()=>a(r),ut,(_t,T)=>{var W=Uc(),re=l(W),He=l(re),J=l(He),ze=l(J),Z=s(J,2),rt=l(Z),P=s(He,2),H=l(P),ie=s(re,2);z(ge=>{m(ze,a(T).name),wt(Z,1,`fit-badge ${ge??""}`),m(rt,a(T).fit.text),m(H,`Ersetzt dein „${a(T).old??""}". ${a(T).why??""}`)},[()=>d(a(T).fit.level)]),A("click",ie,ge=>h(a(T),ge.currentTarget)),_(_t,W)}),z(()=>m(Le,a(r).length)),_(K,U)};I(L,K=>{a(r).length&&K(k)})}var D=s(L,2);{var Pe=K=>{var U=Vc();_(K,U)},ne=K=>{var U=Wc(),ue=l(U);z(()=>m(ue,a(o))),_(K,U)},pe=K=>{var U=jc();_(K,U)},Ee=K=>{var U=Yc();ft(U,21,()=>a(n),ut,(ue,he,Le)=>{var Ue=Jc();wt(Ue,1,`news-card${Le===0?" featured":""}`);var _t=l(Ue),T=l(_t),W=l(T),re=s(T,2);{var He=P=>{var H=Qc();_(P,H)};I(re,P=>{a(he).relevant&&P(He)})}var J=s(re,2),ze=l(J),Z=s(_t,2),rt=l(Z);z(P=>{Fr(Ue,"href",a(he).link),m(W,a(he).source),m(ze,P),m(rt,a(he).title)},[()=>a(he).ts?c(a(he).ts):""]),_(ue,Ue)}),_(K,U)};I(D,K=>{a(i)?K(Pe):a(o)?K(ne,1):a(n).length?K(Ee,-1):K(pe,2)})}A("click",$,E),_(e,p),an()}xn(["click"]);const ev=[["Dein erster Workflow — in 3 Schritten",`
Modell holen: Tab Cookbook → wähle deinen Anwendungsfall (z.B. „Coden") →
Komplettes Setup installieren. Der Download läuft im Tab Aktivität.
@@ -111,4 +111,4 @@ ${le}
OpenWebUI: Klassische Chat-Oberfläche für Fragen/Texte.
Tipp: starkes Modell (coder) für schwere Aufgaben, schnelles
- (scout) für einfache — du wählst es einfach im Tool aus.
`]],Hc=[["LLM / Modell","Die KI selbst — versteht und schreibt Text (wie ChatGPT, nur lokal auf deinem PC). Ein Modell ist eine konkrete Datei davon, oft auf etwas spezialisiert (Code, Bilder, Chat)."],["GGUF","Das lokal lauffähige Dateiformat. Unsere Engine lädt nur GGUF — Repos ohne GGUF kann sie nicht nutzen."],["Quantisierung (Q4_K_M)","Verkleinert ein Modell (16-Bit → 4-Bit), damit es in den Speicher passt — bei kaum Qualitätsverlust. Q4_K_M ist der beliebte Sweetspot."],["Kontextfenster","Das Kurzzeitgedächtnis: wie viel Text sich das Modell gleichzeitig merkt. Größer = mehr Überblick, mehr Speicher, etwas langsamer."],["Auto-Swap","llama-swap lädt/entlädt Modelle automatisch — immer nur eins gleichzeitig. Du managst nichts."],["Agent","Ein Programm (OpenCode, Cline, Continue), das das Modell handeln lässt — Dateien lesen/ändern, Befehle ausführen, planen, im Loop bis die Aufgabe erledigt ist."],["MCP","Model Context Protocol — der Anschluss, über den ein Agent zusätzliche Werkzeuge bekommt (Web, Dateien, Datenbank). MCP = Werkzeuge."],["Skills","Verpackte Anleitung für wiederkehrende Aufgaben — der Agent liest sie und macht es jedes Mal wie du willst. Skills = Anleitungen."],["Rules / Commands","Die konkrete Form von Skills je Tool: AGENTS.md (OpenCode), .clinerules (Cline), Rules/Prompts (Continue)."]];var Vc=k(''),Wc=k('
'),jc=k('
Guide für Einsteiger
Praktische Workflows + die Local-LLM-Welt in Klartext — ohne Vorwissen.
Tutorials & Workflows
Konzepte kurz erklärt
',1);function Jc(e){var t=jc(),a=s(_t(t),4);Ze(a,21,()=>Uc,Ye,(i,o,d)=>{var c=I(()=>ir(n(o),2));let u=()=>n(c)[0],v=()=>n(c)[1];var h=Vc();h.open=d===0;var E=l(h),p=l(E),w=s(E,2);qe(w,v,!0),O(()=>m(p,u())),b(i,h)});var r=s(a,4);Ze(r,21,()=>Hc,Ye,(i,o)=>{var d=I(()=>ir(n(o),2));let c=()=>n(d)[0],u=()=>n(d)[1];var v=Wc(),h=l(v),E=l(h),p=s(h,2),w=l(p);O(()=>{m(E,c()),m(w,u())}),b(i,v)}),b(e,t)}let Qi={};function Qc(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function Yi(e){var i;const t=document.getElementById("swdot"),a=document.getElementById("swlabel"),r=document.getElementById("top-active-text");if(!e)t&&(t.className="dot off"),a&&(a.textContent="Backend nicht erreichbar"),r&&(r.textContent="Backend offline"),Zi("Backend nicht erreichbar – läuft uvicorn?",!1);else{const o=(e.swap_url||"").replace(/^https?:\/\//,"");t&&(t.className="dot "+(e.swap_ok?"on":"off")),a&&(a.textContent=(e.swap_ok?"LLM-Engine: Online – ":"LLM-Engine: Offline – ")+o);const d=["running","ready","loading","starting"],c=(e.models||[]).find(v=>d.includes(v.state));if(r)if(c){const v=(i=c.meta)!=null&&i.ctx?` · ${Math.round(c.meta.ctx/1024)}k ctx`:"",h=c.state==="loading"||c.state==="starting"?' lädt…':"";r.innerHTML=`${c.name}${v}${h}`}else r.innerHTML='Kein Modell im VRAM';e.swap_ok?eu():Zi(`LLM-Engine nicht erreichbar unter ${o} – läuft der llama-swap Dienst?`,!0);const u={};for(const v of e.models||[])u[v.name]=v.state;for(const[v,h]of Object.entries(u)){const E=Qi[v];if(E&&E!==h&&(h==="running"||h==="loading")){Qc();break}}Qi=u}Yc(e),gr.set(e)}function Yc(e){const t=document.getElementById("sec-chip"),a=document.getElementById("sec-chip-tx");!t||!a||(t.classList.toggle("ok",!!(e!=null&&e.secured)),a.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function Zc(e){ca.set(e||[])}function Xc(e){$i.set(e)}function Zi(e,t){const a=document.getElementById("alert");a.className="alert"+(t?" warn":""),a.innerHTML=`${e}`,a.style.display="flex"}function eu(){const e=document.getElementById("alert");e&&(e.style.display="none")}const tu=e=>{var t;return(t=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:t.click()};function Yr(e,t,a,r){const i=document.createElement("span");return i.className="upd-badge"+(t?" "+t:""),i.textContent=e,r&&(i.title=r),i.onclick=()=>tu(a),i}async function Zs(){try{const e=await ge("/api/updates"),t=document.getElementById("update-badges");if(!t)return;const a=e.apt_cache_age_h,r=a!=null&&a>24,i=a!=null?` · apt-Cache: vor ${a}h`:"";t.innerHTML="",t.appendChild(Yr(e.os>0?`OS: ${e.os} Updates`:r?"OS: ?":"OS: aktuell",e.os>0||r?"warn":"ok","server",e.os>0?`${e.os} Pakete${i}`:r?`apt-Cache veraltet (${a}h)`:`Keine Updates${i}`)),t.appendChild(Yr(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),t.appendChild(Yr(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Fr(){try{Yi(await ge("/api/status"))}catch{Yi(null)}}async function Xs(){try{Zc(await ge("/api/jobs"))}catch{}}function el(){const e=window.location.protocol==="https:"?"wss:":"ws:",t=new WebSocket(`${e}//${window.location.host}/api/system/stream`);t.onmessage=a=>{try{Xc(JSON.parse(a.data))}catch{}},t.onclose=()=>{setTimeout(el,3e3)},t.onerror=()=>t.close()}var rs;((rs=document.getElementById("logo"))==null?void 0:rs.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Nr.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Nr[e.dataset.ic||""]||""});const nu=[["overview",id],["models",yd],["activity",Ld],["server",Fd],["cookbook",bc],["connect",Pc],["news",Gc],["guides",Jc]];for(const[e,t]of nu){const a=document.querySelector(`.view[data-view="${e}"]`);a&&yo(t,{target:a})}Ko("overview");const Zr=document.getElementById("token");Zr&&(Zr.value=Ys(),Zr.addEventListener("change",e=>{qo(e.target.value),Fr()}));const Xr=document.getElementById("hf-token");Xr&&(Xr.value=rr(),Xr.addEventListener("change",e=>Io(e.target.value)));const Xi=document.getElementById("nav-settings"),ei=document.getElementById("settings-modal"),es=document.getElementById("sm-close");Xi&&ei&&es&&(Xi.addEventListener("click",()=>ei.style.display="flex"),es.addEventListener("click",()=>ei.style.display="none"));function au(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Fr);Fr();Xs();el();setInterval(au,1e3);setInterval(Fr,3e3);setInterval(Xs,1500);Zs();setInterval(Zs,6e4);
+ (scout) für einfache — du wählst es einfach im Tool aus.`]],tv=[["LLM / Modell","Die KI selbst — versteht und schreibt Text (wie ChatGPT, nur lokal auf deinem PC). Ein Modell ist eine konkrete Datei davon, oft auf etwas spezialisiert (Code, Bilder, Chat)."],["GGUF","Das lokal lauffähige Dateiformat. Unsere Engine lädt nur GGUF — Repos ohne GGUF kann sie nicht nutzen."],["Quantisierung (Q4_K_M)","Verkleinert ein Modell (16-Bit → 4-Bit), damit es in den Speicher passt — bei kaum Qualitätsverlust. Q4_K_M ist der beliebte Sweetspot."],["Kontextfenster","Das Kurzzeitgedächtnis: wie viel Text sich das Modell gleichzeitig merkt. Größer = mehr Überblick, mehr Speicher, etwas langsamer."],["Auto-Swap","llama-swap lädt/entlädt Modelle automatisch — immer nur eins gleichzeitig. Du managst nichts."],["Agent","Ein Programm (OpenCode, Cline, Continue), das das Modell handeln lässt — Dateien lesen/ändern, Befehle ausführen, planen, im Loop bis die Aufgabe erledigt ist."],["MCP","Model Context Protocol — der Anschluss, über den ein Agent zusätzliche Werkzeuge bekommt (Web, Dateien, Datenbank). MCP = Werkzeuge."],["Skills","Verpackte Anleitung für wiederkehrende Aufgaben — der Agent liest sie und macht es jedes Mal wie du willst. Skills = Anleitungen."],["Rules / Commands","Die konkrete Form von Skills je Tool: AGENTS.md (OpenCode), .clinerules (Cline), Rules/Prompts (Continue)."]];var av=w(''),nv=w('
'),rv=w('
Guide für Einsteiger
Praktische Workflows + die Local-LLM-Welt in Klartext — ohne Vorwissen.
Tutorials & Workflows
Konzepte kurz erklärt
',1);function iv(e){var t=rv(),n=s(ot(t),4);ft(n,21,()=>ev,ut,(i,o,d)=>{var c=q(()=>sr(a(o),2));let v=()=>a(c)[0],u=()=>a(c)[1];var h=av();h.open=d===0;var E=l(h),p=l(E),x=s(E,2);Ce(x,u,!0),z(()=>m(p,v())),_(i,h)});var r=s(n,4);ft(r,21,()=>tv,ut,(i,o)=>{var d=q(()=>sr(a(o),2));let c=()=>a(d)[0],v=()=>a(d)[1];var u=nv(),h=l(u),E=l(h),p=s(h,2),x=l(p);z(()=>{m(E,c()),m(x,v())}),_(i,u)}),_(e,t)}let Xi={};function sv(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function es(e){var i;const t=document.getElementById("swdot"),n=document.getElementById("swlabel"),r=document.getElementById("top-active-text");if(!e)t&&(t.className="dot off"),n&&(n.textContent="Backend nicht erreichbar"),r&&(r.textContent="Backend offline"),ts("Backend nicht erreichbar – läuft uvicorn?",!1);else{const o=(e.swap_url||"").replace(/^https?:\/\//,"");t&&(t.className="dot "+(e.swap_ok?"on":"off")),n&&(n.textContent=(e.swap_ok?"LLM-Engine: Online – ":"LLM-Engine: Offline – ")+o);const d=["running","ready","loading","starting"],c=(e.models||[]).find(u=>d.includes(u.state));if(r)if(c){const u=(i=c.meta)!=null&&i.ctx?` · ${Math.round(c.meta.ctx/1024)}k ctx`:"",h=c.state==="loading"||c.state==="starting"?' lädt…':"";r.innerHTML=`${c.name}${u}${h}`}else r.innerHTML='Kein Modell im VRAM';e.swap_ok?cv():ts(`LLM-Engine nicht erreichbar unter ${o} – läuft der llama-swap Dienst?`,!0);const v={};for(const u of e.models||[])v[u.name]=u.state;for(const[u,h]of Object.entries(v)){const E=Xi[u];if(E&&E!==h&&(h==="running"||h==="loading")){sv();break}}Xi=v}lv(e),mr.set(e)}function lv(e){const t=document.getElementById("sec-chip"),n=document.getElementById("sec-chip-tx");!t||!n||(t.classList.toggle("ok",!!(e!=null&&e.secured)),n.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function ov(e){dn.set(e||[])}function dv(e){Li.set(e)}function ts(e,t){const n=document.getElementById("alert");n.className="alert"+(t?" warn":""),n.innerHTML=`${e}`,n.style.display="flex"}function cv(){const e=document.getElementById("alert");e&&(e.style.display="none")}const vv=e=>{var t;return(t=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:t.click()};function ei(e,t,n,r){const i=document.createElement("span");return i.className="upd-badge"+(t?" "+t:""),i.textContent=e,r&&(i.title=r),i.onclick=()=>vv(n),i}async function tl(){try{const e=await Me("/api/updates"),t=document.getElementById("update-badges");if(!t)return;const n=e.apt_cache_age_h,r=n!=null&&n>24,i=n!=null?` · apt-Cache: vor ${n}h`:"";t.innerHTML="",t.appendChild(ei(e.os>0?`OS: ${e.os} Updates`:r?"OS: ?":"OS: aktuell",e.os>0||r?"warn":"ok","server",e.os>0?`${e.os} Pakete${i}`:r?`apt-Cache veraltet (${n}h)`:`Keine Updates${i}`)),t.appendChild(ei(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),t.appendChild(ei(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Gr(){try{es(await Me("/api/status"))}catch{es(null)}}async function al(){try{ov(await Me("/api/jobs"))}catch{}}function nl(){const e=window.location.protocol==="https:"?"wss:":"ws:",t=new WebSocket(`${e}//${window.location.host}/api/system/stream`);t.onmessage=n=>{try{dv(JSON.parse(n.data))}catch{}},t.onclose=()=>{setTimeout(nl,3e3)},t.onerror=()=>t.close()}var ls;((ls=document.getElementById("logo"))==null?void 0:ls.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Kr.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Kr[e.dataset.ic||""]||""});const uv=[["overview",cd],["models",Sd],["activity",Od],["server",Vd],["cookbook",$c],["connect",Gc],["news",Xc],["guides",iv]];for(const[e,t]of uv){const n=document.querySelector(`.view[data-view="${e}"]`);n&&ko(t,{target:n})}Ho("overview");const ti=document.getElementById("token");ti&&(ti.value=el(),ti.addEventListener("change",e=>{No(e.target.value),Gr()}));const ai=document.getElementById("hf-token");ai&&(ai.value=ir(),ai.addEventListener("change",e=>Ko(e.target.value)));const as=document.getElementById("nav-settings"),ni=document.getElementById("settings-modal"),ns=document.getElementById("sm-close");as&&ni&&ns&&(as.addEventListener("click",()=>ni.style.display="flex"),ns.addEventListener("click",()=>ni.style.display="none"));function fv(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Gr);Gr();al();nl();setInterval(fv,1e3);setInterval(Gr,3e3);setInterval(al,1500);tl();setInterval(tl,6e4);