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.
Speichern
'),xd=w(''),Sd=w('
Schließen
Rolle festlegen
Wähle eine Rolle als zweiten, sprechenden Namen. In deinen Tools funktionieren danach beide: der echte Modellname und die Rolle.
Rolle entfernenSpeichern
'),Md=w('
Modelle
Deine konfigurierten Modelle — testen, Kontext anpassen oder aus dem Speicher werfen.
Schnelltest
Schreib eine Nachricht — das gewählte Modell wird automatisch geweckt.
Modelle & Ports
Modelle laden automatisch, sobald eine Anfrage kommt — du musst nichts manuell starten.
',1);function Ed(e,n){aa(n,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr (längere Dateien/Chats), braucht aber mehr Speicher und wird etwas langsamer.",i="Die Rolle ist ein zusätzlicher, sprechender Name (z.B. coder). Du kannst in deinen Tools entweder den echten Modellnamen ODER die Rolle angeben — beides führt zum selben Modell.",r=[{id:"coder",label:"Coder",desc:"Programmieren & Code"},{id:"vision",label:"Vision",desc:"Bilder verstehen"},{id:"scout",label:"Scout",desc:"Schneller Allrounder"},{id:"reviewer",label:"Reviewer",desc:"Code/Texte prüfen"},{id:"manager",label:"Manager",desc:"Planen & koordinieren"}],o=I(()=>{var z;return((z=_i.value)==null?void 0:z.models)||[]});function d(){document.dispatchEvent(new Event("mc:refresh"))}let c=O(""),u=O(""),v=O(""),g=O(!1);const E=I(()=>t(o).filter(z=>!z.incomplete));async function f(){var N;const z=t(c)||((N=t(E)[0])==null?void 0:N.name);if(!(!z||!t(u).trim())){h(g,!0),h(v,"(wecke Modell, kann beim Laden kurz dauern…)");try{const Me=await we("/api/chat",{method:"POST",body:JSON.stringify({model:z,message:t(u)})});h(v,Me.reply,!0)}catch(Me){h(v,"Fehler: "+Me.message)}h(g,!1),d()}}const y=300;let T=O(!1),P=O(null),S=O(8192),$=O(!1);function Ce(z){var N;h(P,t(o).find(Me=>Me.name===z),!0),t(P)&&(h(S,((N=t(P).meta)==null?void 0:N.ctx)||8192,!0),h($,(t(P).ttl??y)>=99999),h(T,!0))}async function oe(){const z=t($)?99999:y;try{await we("/api/update_model",{method:"POST",body:JSON.stringify({alias:t(P).name,ctx:t(S),ttl:z})}),se("Gespeichert — aktiv beim nächsten Modell-Start."),h(T,!1),d()}catch(N){se(N.message,!0)}}let ae=O(!1),xe=O(""),V=O(""),Q=O("");function fe(z){const N=t(o).find(Me=>Me.name===z);h(xe,z,!0),h(Q,(N==null?void 0:N.role)||"",!0),h(V,""),h(ae,!0)}async function be(z){try{await we("/api/set_role",{method:"POST",body:JSON.stringify({alias:t(xe),role:z})}),se(z?`Rolle gesetzt: ${z}`:"Rolle entfernt."),h(ae,!1),d()}catch(N){se(N.message,!0)}}async function Se(z){if(await yn({title:`„${z}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await we("/api/unload?model="+encodeURIComponent(z),{method:"POST"}),se("Entladen: "+z),setTimeout(d,600)}catch(N){se(N.message,!0)}}async function Ne(z){if(await yn({title:`„${z}" wirklich löschen?`,body:"Das Modell wird aus der Konfiguration ausgetragen und seine Dateien werden von der Festplatte gelöscht, um Speicher freizugeben. Das lässt sich nicht rückgängig machen — später brauchst du dafür einen neuen Download.",confirmLabel:"Endgültig löschen",danger:!0}))try{const N=await we("/api/delete_model",{method:"POST",body:JSON.stringify({alias:z})});se(N.note||"Gelöscht: "+z),setTimeout(d,600)}catch(N){se(N.message,!0)}}function bt(z){return z!=null&&z.length?z.map(N=>N==="Code"?'Code':N==="Bild"?'Bild':'Text').join(" "):"–"}function C(z){if(!z)return"–";const N=z.quant||"?",Me=z.ctx?Math.round(z.ctx/1024)+"K":"?",ut=z.size_bytes?(z.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${N} · ${Me} · ${ut}`}function Y(z){var N;(N=navigator.clipboard)==null||N.writeText(z),se("Kopiert: "+z)}var ue=Md(),Ue=s(We(ue),2),te=s(l(Ue),6);st(te,21,()=>t(E),rt,(z,N)=>{var Me=vd(),ut=l(Me),G={};D(()=>{b(ut,t(N).name),G!==(G=t(N).name)&&(Me.value=(Me.__value=t(N).name)??"")}),m(z,Me)});var Te=s(te,4),ie=s(Te,2),lt=l(ie),je=s(ie,2);{var B=z=>{var N=pd(),Me=l(N);D(()=>b(Me,t(v))),m(z,N)};K(je,z=>{t(v)&&z(B)})}var U=s(Ue,2),ce=l(U),Oe=s(l(ce)),he=l(Oe),St=s(ce,4);{var ht=z=>{var N=fd();m(z,N)},Mt=z=>{var N=kd(),Me=s(l(N));st(Me,21,()=>t(o),rt,(ut,G)=>{var ze=di(),He=We(ze);{var Dt=vt=>{var _t=hd(),j=l(_t),ee=l(j),W=s(j,5),J=l(W),x=s(J,2);D(()=>b(ee,t(G).name)),A("click",J,()=>{var L;se("Lade im Cookbook ein Modell und setze den Alias auf: "+t(G).name),(L=document.querySelector(".nav-item[data-view='cookbook']"))==null||L.dispatchEvent(new MouseEvent("click"))}),A("click",x,()=>Ne(t(G).name)),m(vt,_t)},$t=vt=>{var _t=_d(),j=l(_t),ee=l(j),W=l(ee),J=s(W);{var x=ke=>{var Ee=gd(),De=l(Ee);D(()=>b(De,t(G).role)),m(ke,Ee)};K(J,ke=>{t(G).role&&ke(x)})}var L=s(ee,2);{var R=ke=>{var Ee=md(),De=l(Ee);D(()=>b(De,t(G).meta.filename)),m(ke,Ee)};K(L,ke=>{var Ee;(Ee=t(G).meta)!=null&&Ee.filename&&ke(R)})}var ne=s(L,2),Z=s(l(ne),2);st(Z,17,()=>{var ke;return(ke=t(G).api_ids)!=null&&ke.length?t(G).api_ids:[t(G).name]},rt,(ke,Ee)=>{var De=bd(),Ft=l(De);D(()=>b(Ft,t(Ee))),A("click",De,()=>Y(t(Ee))),m(ke,De)});var Je=s(j);Ae(Je,()=>{var ke;return bt((ke=t(G).meta)==null?void 0:ke.caps)},!0);var Qe=s(Je);Ae(Qe,()=>C(t(G).meta),!0);var et=s(Qe);Ae(et,()=>Vo(t(G).state,t(G).download_progress),!0);var M=s(et),H=l(M),Pe=s(M),le=l(Pe),Le=s(le,2),Ze=s(Le,2),tt=s(Ze,2);D(()=>{b(W,`${t(G).name??""} `),b(H,t(G).port??"auto")}),A("click",le,()=>fe(t(G).name)),A("click",Le,()=>Ce(t(G).name)),A("click",Ze,()=>Se(t(G).name)),A("click",tt,()=>Ne(t(G).name)),m(vt,_t)};K(He,vt=>{t(G).incomplete?vt(Dt):vt($t,-1)})}m(ut,ze)}),m(z,N)};K(St,z=>{t(o).length?z(Mt,-1):z(ht)})}var Et=s(U,2);{var At=z=>{var N=yd(),Me=l(N),ut=l(Me),G=s(ut,4),ze=l(G),He=s(G,2),Dt=s(l(He));Ae(Dt,()=>gr(a));var $t=s(He,2),vt=s($t,2);{var _t=R=>{var ne=wd(),Z=l(ne),Je=s(l(Z),2),Qe=l(Je),et=s(Qe,2),M=s(Z,2);D((H,Pe)=>{b(Qe,`Optimal ~${H??""}k → ~${t(P).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),b(et,` Aktuell ~${Pe??""}k → ~${t(P).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(t(P).meta.optimal_ctx/1024),()=>Math.round((t(P).meta.ctx||0)/1024)]),A("click",M,()=>h(S,t(P).meta.optimal_ctx,!0)),m(R,ne)};K(vt,R=>{var ne;(ne=t(P).meta)!=null&&ne.optimal_ctx&&R(_t)})}var j=s(vt,4),ee=s(l(j),2),W=l(ee),J=s(W,2),x=l(J),L=s(j,2);D(()=>{b(ze,t(P).name),fn(J,`color:${t($)?"var(--accent)":"var(--mut)"}`),b(x,t($)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),A("click",N,R=>{R.target.classList.contains("modal-overlay")&&h(T,!1)}),A("click",ut,()=>h(T,!1)),Cn($t,()=>t(S),R=>h(S,R)),Oo(W,()=>t($),R=>h($,R)),A("click",L,oe),m(z,N)};K(Et,z=>{t(T)&&t(P)&&z(At)})}var It=s(Et,2);{var qt=z=>{var N=Sd(),Me=l(N),ut=l(Me),G=s(ut,2),ze=s(l(G));Ae(ze,()=>gr(i));var He=s(G,2),Dt=l(He),$t=s(He,4);st($t,21,()=>r,rt,(W,J)=>{var x=xd(),L=l(x);D(()=>{kt(x,1,t(Q)===t(J).id?"primary":"ghost"),Ni(x,"title",t(J).desc),b(L,t(J).label)}),A("click",x,()=>be(t(J).id)),m(W,x)});var vt=s($t,4),_t=s(vt,2),j=l(_t),ee=s(j,2);D(()=>b(Dt,t(xe))),A("click",N,W=>{W.target.classList.contains("modal-overlay")&&h(ae,!1)}),A("click",ut,()=>h(ae,!1)),Cn(vt,()=>t(V),W=>h(V,W)),A("click",j,()=>be("")),A("click",ee,()=>be(t(V).trim().toLowerCase())),m(z,N)};K(It,z=>{t(ae)&&z(qt)})}D(()=>{ie.disabled=t(g),b(lt,t(g)?"…":"Senden"),b(he,t(o).length?t(o).length+" konfiguriert":"")}),ri(te,()=>t(c),z=>h(c,z)),Cn(Te,()=>t(u),z=>h(u,z)),A("click",ie,f),m(e,ue),ia()}xa(["click"]);var Ad=w('
Prozessor (CPU)
%
Arbeitsspeicher
%
Grafikspeicher
%
System-Metriken (Bosgame)
Live-Auslastung deines Mini-PCs, alle 0,5 Sekunden.
Arbeitsspeicher (RAM)
Grafikspeicher (VRAM + GTT)
Speicherplatz (Disk)
Temperatur (GPU / CPU)
CPU-Verlauf
RAM-Verlauf
VRAM-Verlauf
',1),Cd=w('Verlauf leeren'),Td=w('
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
'),zd=w(''),Pd=w('Abbrechen'),Dd=w('×'),$d=w('
'),Ld=w('
'),Id=w('
'),Bd=w('
Aktivität
Live-Auslastung und laufende Aufgaben (Downloads, Updates) mit Protokoll.
Hintergrund-Aufgaben
Downloads & Updates erscheinen hier mit Live-Protokoll — zum Aufklappen klicken.
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
Verbindung prüfen
Dienste & Applikation
Diese Aktionen sind harmlos und passwortlos — es geht nichts dabei verloren.
↻LLM-Engine neustartenStartet llama-swap neu. Geladene Modelle laden danach automatisch wieder.›↻Dashboard neustartenStartet diese Oberfläche neu (~5 Sek).›⬇Mission Control aktualisierenHolt die neueste Version aus Gitea und startet automatisch neu (~10 Sek).›⚡LLM-Engine aktualisierenLädt die neueste llama.cpp-Version (ROCm) für deine GPU.›🗄Grafikspeicher leerenWirft alle aktuell geladenen Modelle aus dem VRAM. Fragt vorher nach.›
Betriebssystem (Bosgame)
Tiefe Eingriffe — das Dashboard fragt einmalig nach deinem sudo-Passwort.
↻OS-Updates installierenFührt apt update & upgrade aus. Kann ein paar Minuten dauern.›⚡Server neustarten (Reboot)Bootet den ganzen Bosgame neu. Alles ist für ~1 Minute offline.›
Live-Konsole
Live mitlesen, was der Dienst gerade tut.
',1);function jd(e,n){aa(n,!0);const a=I(()=>_i.value),i=I(()=>ca.value);let r=null,o=O(`Verbinde…
+`),d=O("llama-swap"),c,u=O(null),v=O("");const g=new Set,E=I(()=>t(u)?t(i).find(x=>x.id===t(u)):null);Ar(()=>{if(!t(E))return;const x=t(E),L=x.state==="done",R=x.state==="failed",ne=x.state==="canceled";(L||R||ne)&&!g.has(x.id)&&(g.add(x.id),se(L?`✓ ${t(v)} abgeschlossen.`:ne?`${t(v)} abgebrochen.`:`✗ ${t(v)} fehlgeschlagen.`,R),L&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function f(x,L){h(u,x,!0),h(v,L,!0),ca.track(x)}bi(()=>{y()}),qo(()=>{r==null||r.close()});function y(){r==null||r.close();const x=t(d);h(o,`Verbinde mit ${x}…
+`);const L=location.protocol==="https:"?"wss:":"ws:";r=new WebSocket(`${L}//${location.host}/api/logs/${x}?token=${encodeURIComponent(tl())}`),r.onmessage=R=>{h(o,t(o)+R.data),c&&(c.scrollTop=c.scrollHeight)},r.onclose=()=>{h(o,t(o)+`
+— Verbindung getrennt —`)},r.onerror=()=>r==null?void 0:r.close()}async function T(x,L,R){if(await yn({title:L,body:R,confirmLabel:"Neustarten"}))try{await we(`/api/service/${x}/restart`,{method:"POST"}),se("Neustart ausgelöst: "+x),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(ne){se(ne.message,!0)}}async function P(){if(await yn({title:"Mission Control aktualisieren?",body:"Holt die neueste Dashboard-Version aus Gitea und startet automatisch neu. Die Seite trennt kurz und verbindet von selbst wieder (~10 Sek)."}))try{const x=await we("/api/self-update",{method:"POST"});se("Update läuft — Dashboard startet gleich neu."),f(x.job_id,"Mission Control Update")}catch(x){se(x.message,!0)}}async function S(){if(await yn({title:"LLM-Engine aktualisieren?",body:"Lädt die neueste llama.cpp-ROCm-Version und installiert sie. Die Engine ist während des Updates kurz nicht erreichbar."}))try{const x=await we("/api/update",{method:"POST"});se("LLM-Engine-Update läuft."),f(x.job_id,"LLM-Engine-Update")}catch(x){se(x.message,!0)}}async function $(){if(await yn({title:"Grafikspeicher leeren?",body:"Alle geladenen Modelle werden entladen. Sie laden beim nächsten Aufruf automatisch neu — es geht nichts verloren.",confirmLabel:"Leeren"}))try{await we("/api/unload",{method:"POST"}),se("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(x){se(x.message,!0)}}async function Ce(){if(!await yn({title:"OS-Updates installieren?",body:"Führt apt update & upgrade aus. Das kann ein paar Minuten dauern; der Fortschritt erscheint in der Aktivität."}))return;const x=await jr({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(x)try{const L=await we("/api/os-update",{method:"POST",body:JSON.stringify({password:x})});se("OS-Update gestartet."),f(L.job_id,"OS-Update")}catch(L){se(L.message,!0)}}async function oe(){if(!await yn({title:"Server wirklich neu starten?",body:"Der ganze Bosgame startet physisch neu. Alles ist für ~1 Minute offline — auch dieses Dashboard.",confirmLabel:"Reboot",danger:!0}))return;const x=await jr({title:"sudo-Passwort",body:"Für den Reboot wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Jetzt neustarten",danger:!0});if(x)try{await we("/api/reboot",{method:"POST",body:JSON.stringify({password:x})}),se("Reboot ausgelöst — bis gleich.")}catch(L){se(L.message,!0)}}async function ae(){h(xe,"prüfe…");try{const x=await we("/api/integration/test");h(xe,x.ok?`✓ Engine antwortet — ${x.models.length} Modell(e): ${x.models.join(", ")}`:`✗ keine Verbindung: ${x.error}`,!0),h(V,x.ok,!0)}catch(x){h(xe,"✗ "+x.message),h(V,!1)}}let xe=O(""),V=O(!1);const Q=I(()=>{var x;return((x=t(a))==null?void 0:x.models)||[]}),fe=["running","ready","loading","starting"],be=I(()=>t(Q).find(x=>fe.includes(x.state)));function Se(x){if(!x||x.state!=="running")return null;if(typeof x.progress=="number")return Math.min(100,x.progress);const R=((x.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return R?Math.min(100,parseFloat(R[1])):null}var Ne=Ud(),bt=s(We(Ne),2),C=l(bt),Y=s(l(C),2),ue=l(Y),Ue=s(C,4),te=l(Ue),Te=s(l(te)),ie=l(Te),lt=s(te,2),je=s(l(lt),2),B=l(je),U=s(lt,2),ce=s(l(U),2),Oe=l(ce),he=s(Ue,2),St=l(he),ht=s(St,2);{var Mt=x=>{var L=Od(),R=l(L);D(()=>{fn(L,`color:${t(V)?"#7ee29a":"#ff9b95"}`),b(R,t(xe))}),m(x,L)};K(ht,x=>{t(xe)&&x(Mt)})}var Et=s(bt,2),At=s(l(Et),4),It=s(At,2),qt=s(It,2),z=s(qt,2),N=s(z,2),Me=s(Et,2),ut=s(l(Me),4),G=s(ut,2),ze=s(Me,2);{var He=x=>{const L=I(()=>t(E)),R=I(()=>t(L).state==="done"),ne=I(()=>t(L).state==="failed"),Z=I(()=>t(L).state==="canceled"),Je=I(()=>t(R)||t(ne)||t(Z)),Qe=I(()=>Se(t(L)));var et=Vd(),M=l(et),H=s(l(M),2);{var Pe=Fe=>{var gt=Fd();A("click",gt,async()=>{await yn({title:t(v)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&we(`/api/jobs/${t(L).id}/cancel`,{method:"POST"})}),m(Fe,gt)};K(H,Fe=>{t(Je)||Fe(Pe)})}var le=s(H,2),Le=l(le);{var Ze=Fe=>{var gt=qd();m(Fe,gt)},tt=Fe=>{var gt=Nd();m(Fe,gt)},ke=Fe=>{var gt=Kd();m(Fe,gt)},Ee=Fe=>{var gt=Gd();m(Fe,gt)};K(Le,Fe=>{t(R)?Fe(Ze):t(ne)?Fe(tt,1):t(Z)?Fe(ke,2):Fe(Ee,-1)})}var De=s(M,2),Ft=l(De),Nt=s(De,2);{var Jt=Fe=>{var gt=Wd(),Bn=l(gt);D(()=>fn(Bn,`width:${t(Qe)??""}%`)),m(Fe,gt)};K(Nt,Fe=>{t(Qe)!=null&&!t(Je)&&Fe(Jt)})}var an=s(Nt,2),bn=l(an);D(Fe=>{b(Ft,`${t(v)??""}${t(Je)?t(R)?" — erfolgreich.":t(Z)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),b(bn,Fe)},[()=>(t(L).log||[]).join(`
+`)]),m(x,et)};K(ze,x=>{t(E)&&x(He)})}var Dt=s(ze,2),$t=l(Dt),vt=s(l($t),2),_t=l(vt);_t.value=_t.__value="llama-swap";var j=s(_t);j.value=j.__value="mission-control";var ee=s(j);ee.value=ee.__value="system";var W=s($t,4),J=l(W);Fo(W,x=>c=x,()=>c),D(x=>{var L,R,ne;fn(Y,`margin-left:auto;${(L=t(a))!=null&&L.swap_ok?"background:rgba(63,185,80,.12);border-color:rgba(63,185,80,.25);color:#7ee29a":"background:rgba(248,81,73,.12);border-color:rgba(248,81,73,.3);color:#ff9b95"}`),b(ue,(R=t(a))!=null&&R.swap_ok?"● erreichbar":"● offline"),b(ie,(((ne=t(a))==null?void 0:ne.swap_url)||"—")+"/v1"),b(B,t(be)?t(be).name+` (${t(be).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),b(Oe,x),b(J,t(o))},[()=>t(Q).filter(x=>!x.incomplete).length||"keine"]),A("click",St,ae),A("click",At,()=>T("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),A("click",It,()=>T("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),A("click",qt,P),A("click",z,S),A("click",N,$),A("click",ut,Ce),A("click",G,oe),A("change",vt,y),ri(vt,()=>t(d),x=>h(d,x)),m(e,Ne),ia()}xa(["click","change"]);var Hd=w('
Größter Spitzenbedarf: . Es läuft immer nur ein Modell gleichzeitig — das größte bestimmt, ob das Setup passt.
'),hc=w('Alternative: — passt auf dein System.',1),gc=w('
⚠ Dieses Setup übersteigt deinen verfügbaren Speicher.
'),mc=w('
Schließen
'),bc=w('
Lade Dateien von HuggingFace…
'),Yr=w(""),_c=w('
Empfohlener Kontext für deine Hardware: — übernehmen
'),kc=w('
Ressourcen-Check
'),wc=w('
⚠ Diese Datei ist zu groß für deinen Speicher. Kleinere Alternative: — einfach auswählen.
'),yc=w('
⚠ Alle Varianten dieses Modells sind zu groß für deinen Speicher. Ein kleineres Modell aus den Empfehlungen wäre die bessere Wahl.
'),xc=w('
',1),Sc=w('
Keine GGUF-Dateien im Repo gefunden.
'),Mc=w('
Schließen
'),Ec=w('
×
'),Ac=w('
Schließen
Stell dir aus beliebigen Modellen ein eigenes Setup zusammen.
+ Modell hinzufügen
Die Repo-ID findest du über die Profi-Suche weiter unten (z.B. unsloth/Qwen3-8B-GGUF).
'),Cc=w('
Cookbook
Modelle finden, installieren und eigene Setups zusammenstellen.
1 · Anwendungsfall wählen & installieren
+ Eigenes Setup
Hier starten: Fertige Modell-Bundles für deinen Anwendungsfall — ein Klick installiert alles. Die Hardware-Ampel zeigt vorab, ob das Setup auf deinen PC passt.
Aktuell die besten Modelle für dein System
Top-Modelle je Kategorie von HuggingFace — Hardware-Fit wird live für dein System berechnet.
Profi-Suche (HuggingFace)
Direkt HuggingFace durchsuchen — oder eine Modell-URL einfügen für den direkten Sprung.
',1);function Tc(e,n){aa(n,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr, braucht aber mehr Speicher und wird etwas langsamer.",i="MoE (Mixture of Experts): viele Parameter fürs Wissen, aber pro Wort ist nur ein kleiner Teil aktiv → fast große-Modell-Qualität bei hohem Tempo. Ideal für deine APU.",r={perfect:0,marginal:1,too_tight:2},o={vision:"Bilder",coder:"Coden",reasoning:"Logik",agent:"Agenten & Tools",scout:"Allrounder",reviewer:"Review",manager:"Manager"},d=[{label:"Bilder",kw:["-vl-","-vl","vision","llava","multimodal","-mm-","pixtral"]},{label:"Coden",kw:["coder","-code-","code-","codestral","starcoder"]},{label:"Logik",kw:["-r1","deepseek-r1","reasoning","qwq","magistral","-think","thinking","-o1"]},{label:"Agenten & Tools",kw:["hermes","-tool","command-r","watt","-fc-","function"]}];function c(k){const _=(k||"").toLowerCase();for(const q of d)if(q.kw.some(F=>_.includes(F)))return q.label;return"Allrounder"}function u(k=""){const _=k.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(_)||new RegExp("(?{he(),St()});async function he(){h(P,!0);try{const k=await we("/api/cookbook/recipes");h(y,k.recipes||[],!0),h(T,k.recommended_id||null,!0)}catch(k){se(k.message,!0)}h(P,!1)}async function St(k=!1){h($,!0);try{const _=await we("/api/cookbook/discover"+(k?"?force=true":""));h(S,_,!0),h(Ce,_.stale,!0)}catch(_){se("Empfehlungen nicht ladbar: "+_.message,!0)}h($,!1)}function ht(k){k=k.trim();const _=k.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return _?_[1]:/^[\w.-]+\/[\w.-]+$/.test(k)?k:null}async function Mt(){const k=t(oe).trim(),_=ht(k);let q=k;if(t(V)&&!_&&(q=q?q+" "+t(V):t(V)),!q&&!_){h(ae,[],!0);return}h(xe,!0),h(fe,[],!0),h(be,-1);try{if(_)h(ae,[{id:_,author:_.split("/")[0],downloads:0}],!0);else{const F=`https://huggingface.co/api/models?search=${encodeURIComponent(q)}&filter=gguf&sort=${encodeURIComponent(t(Q))}&direction=-1&limit=40`,de=await fetch(F);h(ae,await de.json(),!0)}t(ae).forEach((F,de)=>Et(de,F.id))}catch(F){se(F.message,!0),h(ae,[],!0)}h(xe,!1)}async function Et(k,_){var q;try{const F=await we("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:_,ctx:8192})});if(!((q=F.files)!=null&&q.length)){t(fe)[k]=null,At();return}const de=F.files.find(nt=>{var ot;return(ot=nt.quant)==null?void 0:ot.includes("Q4_K_M")})||F.files[0];t(fe)[k]=de.fit.level,At()}catch{t(fe)[k]=null,At()}}function At(){let k=-1,_=99;t(fe).forEach((q,F)=>{if(q==null)return;const de=r[q]??99;de<_&&(_=de,k=F)}),h(be,k>=0&&_<=1?k:-1,!0)}function It(k){h(Se,t(y).find(_=>_.id===k),!0)}async function qt(k){const _=document.getElementById("cb-r-install-btn");_&&(_.disabled=!0,_.textContent="Starte…");try{const q=await we("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:k,hf_token:li()})});se(`${q.count} Download${q.count!==1?"s":""} läuft — Modelle erscheinen danach automatisch im Modelle-Tab.`),h(Se,null),Oe("activity")}catch(q){se(q.message,!0),_&&(_.disabled=!1,_.textContent="Installieren")}}async function z(k,_){var q,F;h(Ne,!0),h(bt,_,!0),h(C,k,!0),h(Ue,""),h(te,8192),h(Y,null),h(ie,null),h(ue,""),h(Te,!0);try{if(h(Y,await we("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:k,ctx:8192})}),!0),(F=(q=t(Y))==null?void 0:q.files)!=null&&F.length){const de=t(Y).files.find(nt=>{var ot;return(ot=nt.quant)==null?void 0:ot.includes("Q4_K_M")})||t(Y).files[0];h(ue,de.filename,!0),de.optimal_ctx&&t(te)===8192&&h(te,de.optimal_ctx,!0),N()}}catch(de){se(de.message,!0)}h(Te,!1)}function N(){var k,_,q;!((_=(k=t(Y))==null?void 0:k.files)!=null&&_.length)||!t(ue)||(h(ie,t(Y).files.find(F=>F.filename===t(ue))||null,!0),(q=t(ie))!=null&&q.optimal_ctx&&t(te)===8192&&h(te,t(ie).optimal_ctx,!0))}async function Me(){var k,_;if(!t(C)||!t(ue))return se("Bitte eine GGUF-Datei wählen.",!0);h(Te,!0);try{const q=((k=t(Y))==null?void 0:k.params_b)??7,F=((_=t(ie))==null?void 0:_.quant)??"Q4_K_M";await we("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:t(C),role:t(Ue),params_b:q,quant:F,file:t(ue),ctx:t(te),hf_token:li()})}),se("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),h(Ne,!1),Oe("activity")}catch(q){se("Fehler: "+q.message,!0)}h(Te,!1)}async function ut(k,_,q,F){F.disabled=!0,F.textContent="Starte…";try{await we("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:k,role:_,params_b:q,quant:"Q4_K_M",hf_token:li()})}),se("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),Oe("activity")}catch(de){se(de.message,!0),F.disabled=!1,F.textContent="Installieren"}}function G(){h(ce,null),h(je,""),h(B,""),h(U,[{repo:"",role:"",quant:"Q4_K_M"}],!0),h(lt,!0)}function ze(k){const _=t(y).find(q=>q.id===k);_&&(h(ce,k,!0),h(je,_.title,!0),h(B,_.desc||"",!0),h(U,_.models.map(q=>({repo:q.repo,role:q.role,quant:q.quant||"Q4_K_M"})),!0),h(lt,!0))}async function He(){if(!t(je).trim())return se("Bitte einen Titel angeben.",!0);const k=t(U).filter(_=>_.repo.trim());if(!k.length)return se("Mindestens ein Modell (Repo) angeben.",!0);try{t(ce)?(await we("/api/cookbook/user-recipe/"+encodeURIComponent(t(ce)),{method:"PUT",body:JSON.stringify({title:t(je),desc:t(B),models:k})}),se("Setup aktualisiert.")):(await we("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:t(je),desc:t(B),models:k})}),se("Setup gespeichert.")),h(lt,!1),he()}catch(_){se(_.message,!0)}}async function Dt(k){const _=t(y).find(q=>q.id===k);if(await yn({title:`„${(_==null?void 0:_.title)||k}" löschen?`,body:"Dein eigenes Setup wird aus dem Cookbook entfernt. Bereits installierte Modelle bleiben unangetastet.",confirmLabel:"Löschen",danger:!0}))try{await we("/api/cookbook/user-recipe/"+encodeURIComponent(k),{method:"DELETE"}),se("Setup gelöscht."),he()}catch(q){se(q.message,!0)}}function $t(k){if(!u(k))return"";const _=v(k);return`MoE${_?` · ~${_}B aktiv`:""}`}function vt(k){return k?`${$n(k)}`:""}var _t=Cc(),j=s(We(_t),2),ee=l(j),W=s(l(ee),2),J=s(ee,4);{var x=k=>{var _=Hd();m(k,_)},L=k=>{var _=Yd();st(_,21,()=>t(y),rt,(q,F)=>{const de=I(()=>t(F).id===t(T));var nt=Zd(),ot=l(nt);{var re=ge=>{var Ye=Jd(),Gt=We(Ye),zt=s(Gt,2);A("click",Gt,wt=>{wt.stopPropagation(),ze(t(F).id)}),A("keydown",Gt,wt=>{wt.key==="Enter"&&(wt.stopPropagation(),ze(t(F).id))}),A("click",zt,wt=>{wt.stopPropagation(),Dt(t(F).id)}),A("keydown",zt,wt=>{wt.key==="Enter"&&(wt.stopPropagation(),Dt(t(F).id))}),m(ge,Ye)};K(ot,ge=>{t(F).user&&ge(re)})}var me=s(ot,2);{var $e=ge=>{var Ye=Xi();m(ge,Ye)},pt=ge=>{var Ye=Qd();m(ge,Ye)};K(me,ge=>{t(de)?ge($e):t(F).user&&ge(pt,1)})}var Ie=s(me,2),qe=l(Ie),dt=l(qe),Ct=l(dt),Yt=s(qe,2),ft=l(Yt),Be=s(Ie,2),Tt=l(Be),Kt=s(Be,2),mt=l(Kt);D((ge,Ye)=>{kt(nt,1,`card-btn${t(de)?" cb-best":""}`),b(Ct,t(F).title),kt(Yt,1,`fit-badge ${ge??""}`),b(ft,Ye),b(Tt,t(F).desc),b(mt,`${t(F).models.length??""} Modell${t(F).models.length>1?"e":""} im Setup`)},[()=>g(t(F).fit_level),()=>E(t(F).fit_level)]),A("click",nt,()=>It(t(F).id)),m(q,nt)}),m(k,_)};K(J,k=>{t(P)?k(x):k(L,-1)})}var R=s(j,2),ne=l(R),Z=s(l(ne),2),Je=l(Z);{var Qe=k=>{const _=I(()=>Math.round((Date.now()/1e3-t(S).updated)/60));var q=ec(),F=We(q);{var de=$e=>{var pt=ii();D(()=>b(pt,`Quellen befragt vor ${t(_)??""} min`)),m($e,pt)},nt=$e=>{var pt=ii();D(Ie=>b(pt,`Quellen befragt vor ${Ie??""} h`),[()=>Math.round(t(_)/60)]),m($e,pt)},ot=$e=>{var pt=ii();D(Ie=>b(pt,`Quellen befragt vor ${Ie??""} Tg.`),[()=>Math.round(t(_)/1440)]),m($e,pt)};K(F,$e=>{t(_)<60?$e(de):t(_)<1440?$e(nt,1):$e(ot,-1)})}var re=s(F,2);{var me=$e=>{var pt=Xd();m($e,pt)};K(re,$e=>{t(Ce)&&$e(me)})}m(k,q)};K(Je,k=>{var _;(_=t(S))!=null&&_.updated&&k(Qe)})}var et=s(Z,2),M=l(et),H=s(ne,4);{var Pe=k=>{var _=tc();m(k,_)},le=k=>{var _=di(),q=We(_);st(q,17,()=>t(S).categories,rt,(F,de)=>{var nt=sc(),ot=l(nt),re=l(ot),me=l(re),$e=s(ot,2);st($e,21,()=>t(de).models,rt,(pt,Ie)=>{const qe=I(()=>t(de).recommended&&t(Ie).repo===t(de).recommended);var dt=rc(),Ct=l(dt);{var Yt=Xe=>{var it=Xi();m(Xe,it)};K(Ct,Xe=>{t(qe)&&Xe(Yt)})}var ft=s(Ct,2),Be=l(ft),Tt=l(Be),Kt=l(Tt),mt=s(Tt,2),ge=l(mt),Ye=s(Be,2),Gt=l(Ye),zt=s(ft,2),wt=l(zt);Ae(wt,()=>vt(o[t(Ie).role]||c(t(Ie).repo)));var Rn=s(wt,2);Ae(Rn,()=>$t(t(Ie).repo));var Un=s(zt,2),En=l(Un),Sa=s(Un,2);st(Sa,17,()=>t(Ie).requirements||[],rt,(Xe,it)=>{var Lt=nc(),An=l(Lt);D(()=>b(An,`⚠ ${t(it)??""}`)),m(Xe,Lt)});var ct=s(Sa,4),Ke=l(ct);{var at=Xe=>{var it=ac();D(()=>Ni(it,"title",`bereits eingerichtet als ${t(Ie).installed??""}`)),m(Xe,it)},yt=Xe=>{var it=ic();A("click",it,Lt=>ut(t(Ie).repo,t(Ie).role,t(Ie).params_b,Lt.currentTarget)),m(Xe,it)};K(Ke,Xe=>{t(Ie).installed?Xe(at):Xe(yt,-1)})}D((Xe,it,Lt)=>{kt(dt,1,`card${t(qe)?" res-best":""}`),b(Kt,t(Ie).name),b(ge,`${t(Ie).author??""} · ${t(Ie).params_b??""}B`),kt(Ye,1,`fit-badge ${Xe??""}`),b(Gt,t(Ie).fit.text),b(En,`${it??""} · ⬇ ${Lt??""}`)},[()=>g(t(Ie).fit.level),()=>f(t(Ie).fit),()=>(t(Ie).downloads||0).toLocaleString()]),m(pt,dt)}),D(()=>b(me,t(de).title)),m(F,nt)}),m(k,_)};K(H,k=>{var _;t($)&&!t(S)?k(Pe):(_=t(S))!=null&&_.categories&&k(le,1)})}var Le=s(R,2),Ze=s(l(Le),4),tt=l(Ze),ke=s(tt,2),Ee=l(ke);Ee.value=Ee.__value="downloads";var De=s(Ee);De.value=De.__value="trending";var Ft=s(De);Ft.value=Ft.__value="created_at";var Nt=s(ke,2),Jt=l(Nt),an=s(Ze,2);st(an,20,()=>["","coder","vision","reasoning","chat","agent"],rt,(k,_)=>{var q=lc(),F=l(q);D(()=>{kt(q,1,t(V)===_?"primary":"ghost"),b(F,_||"Alle")}),A("click",q,()=>{h(V,_,!0),Mt()}),m(k,q)});var bn=s(an,2);{var Fe=k=>{var _=dc();st(_,21,()=>t(ae),rt,(q,F,de)=>{var nt=oc(),ot=l(nt);{var re=zt=>{var wt=Xi();m(zt,wt)};K(ot,zt=>{de===t(be)&&zt(re)})}var me=s(ot,2),$e=l(me),pt=l($e),Ie=l(pt),qe=s(pt,2),dt=l(qe),Ct=s($e,2),Yt=l(Ct),ft=s(me,2),Be=l(ft);Ae(Be,()=>vt(c(t(F).id)));var Tt=s(Be,2);Ae(Tt,()=>$t(t(F).id));var Kt=s(ft,4),mt=l(Kt),ge=l(mt),Ye=s(mt,2),Gt=l(Ye);D((zt,wt,Rn,Un,En)=>{kt(nt,1,`card${de===t(be)?" res-best":""}`),b(Ie,zt),b(dt,t(F).author||""),kt(Ct,1,`fit-badge ${wt??""}`),b(Yt,Rn),b(ge,Un),b(Gt,`⬇ ${En??""}`)},[()=>t(F).id.split("/").pop(),()=>t(fe)[de]?g(t(fe)[de]):"warn",()=>t(fe)[de]?E(t(fe)[de]):"prüfe…",()=>t(fe)[de]?f({req_gb:0,tps:0}):"Hardware-Fit…",()=>(t(F).downloads||0).toLocaleString()]),A("click",nt,()=>z(t(F).id,t(F).id.split("/").pop())),m(q,nt)}),m(k,_)};K(bn,k=>{t(ae).length&&k(Fe)})}var gt=s(Le,2);{var Bn=k=>{const _=I(()=>t(Se));var q=mc(),F=l(q),de=l(F),nt=s(de,2),ot=l(nt),re=s(nt,2),me=l(re),$e=s(re,2);st($e,21,()=>t(_).models,rt,(ft,Be)=>{var Tt=pc(),Kt=l(Tt),mt=l(Kt),ge=l(mt),Ye=l(ge),Gt=s(ge,2),zt=l(Gt),wt=s(Gt,2);Ae(wt,()=>$t(t(Be).repo));var Rn=s(mt,2);{var Un=at=>{var yt=cc(),Xe=l(yt);D(()=>b(Xe,t(Be).why)),m(at,yt)};K(Rn,at=>{t(Be).why&&at(Un)})}var En=s(Rn,2);{var Sa=at=>{var yt=uc(),Xe=l(yt);D((it,Lt,An)=>b(Xe,`~${it??""} GB · ~${Lt??""} Tok/s · optimal ~${An??""}k Kontext`),[()=>(t(Be).fit.req_gb??0).toFixed(1),()=>Math.round(t(Be).fit.tps??0),()=>Math.round((t(Be).optimal_ctx||8192)/1024)]),m(at,yt)};K(En,at=>{t(Be).fit&&at(Sa)})}var ct=s(Kt,2);{var Ke=at=>{var yt=vc(),Xe=l(yt);D(it=>{kt(yt,1,`fit-badge ${it??""}`),b(Xe,t(Be).fit.text)},[()=>g(t(Be).fit.level)]),m(at,yt)};K(ct,at=>{t(Be).fit&&at(Ke)})}D(()=>{b(Ye,t(Be).name),b(zt,t(Be).role)}),m(ft,Tt)});var pt=s($e,2);{var Ie=ft=>{const Be=I(()=>Math.max(...t(_).models.map(ge=>{var Ye;return((Ye=ge.fit)==null?void 0:Ye.req_gb)??0})));var Tt=fc(),Kt=s(l(Tt)),mt=l(Kt);D(ge=>b(mt,`~${ge??""} GB`),[()=>t(Be).toFixed(1)]),m(ft,Tt)};K(pt,ft=>{t(_).models.length&&t(_).models[0].fit&&ft(Ie)})}var qe=s(pt,2);{var dt=ft=>{const Be=I(()=>t(y).find(ge=>!ge.user&&ge.fit_level!=="too_tight"&&ge.id!==t(_).id));var Tt=gc(),Kt=s(l(Tt));{var mt=ge=>{var Ye=hc(),Gt=s(We(Ye)),zt=l(Gt);D(()=>b(zt,`„${t(Be).title??""}" ansehen`)),A("click",Gt,wt=>{wt.preventDefault(),h(Se,null),setTimeout(()=>It(t(Be).id),50)}),m(ge,Ye)};K(Kt,ge=>{t(Be)&&ge(mt)})}m(ft,Tt)};K(qe,ft=>{t(_).fit_level==="too_tight"&&ft(dt)})}var Ct=s(qe,2),Yt=l(Ct);D(()=>{b(ot,t(_).title),b(me,t(_).desc),kt(Ct,1,`primary${t(_).fit_level==="too_tight"?" warn":""}`),b(Yt,t(_).fit_level==="too_tight"?"Trotzdem installieren (nicht empfohlen)":"Komplettes Setup installieren")}),A("click",q,ft=>{ft.target.classList.contains("modal-overlay")&&h(Se,null)}),A("click",de,()=>h(Se,null)),A("click",Ct,()=>qt(t(_).id)),m(k,q)};K(gt,k=>{t(Se)&&k(Bn)})}var Wn=s(gt,2);{var ra=k=>{var _=Mc(),q=l(_),F=l(q),de=s(F,2),nt=l(de),ot=s(de,2),re=l(ot),me=s(ot,2);{var $e=qe=>{var dt=bc();m(qe,dt)},pt=qe=>{var dt=xc(),Ct=s(We(dt),2);st(Ct,21,()=>t(Y).files,rt,(ct,Ke)=>{const at=I(()=>t(Ke).fit.level==="perfect"?"●":t(Ke).fit.level==="marginal"?"◐":"○");var yt=Yr(),Xe=l(yt),it={};D(()=>{b(Xe,`${t(at)??""} ${t(Ke).filename??""}`),it!==(it=t(Ke).filename)&&(yt.value=(yt.__value=t(Ke).filename)??"")}),m(ct,yt)});var Yt=s(Ct,2),ft=l(Yt),Be=s(l(ft),2),Tt=s(ft,2),Kt=l(Tt),mt=s(l(Kt));Ae(mt,()=>gr(a));var ge=s(Kt,2),Ye=s(Yt,2);{var Gt=ct=>{var Ke=_c(),at=s(l(Ke)),yt=l(at),Xe=s(at,2);D(it=>b(yt,`~${it??""}k`),[()=>Math.round(t(ie).optimal_ctx/1024)]),A("click",Xe,it=>{it.preventDefault(),h(te,t(ie).optimal_ctx,!0)}),m(ct,Ke)};K(Ye,ct=>{var Ke;(Ke=t(ie))!=null&&Ke.optimal_ctx&&ct(Gt)})}var zt=s(Ye,2);{var wt=ct=>{var Ke=kc(),at=l(Ke),yt=s(l(at),2),Xe=l(yt),it=s(at,2),Lt=l(it);D((An,ki,Wi)=>{b(Xe,`~${An??""} GB · ~${ki??""} Tok/s · ${(t(ie).quant||"GGUF")??""}`),kt(it,1,`fit-badge ${Wi??""}`),b(Lt,t(ie).fit.text)},[()=>(t(ie).fit.req_gb??0).toFixed(1),()=>Math.round(t(ie).fit.tps??0),()=>g(t(ie).fit.level)]),m(ct,Ke)};K(zt,ct=>{t(ie)&&ct(wt)})}var Rn=s(zt,2);{var Un=ct=>{const Ke=I(()=>t(Y).files.find(Lt=>Lt.fit.level!=="too_tight"&&Lt.filename!==t(ue)));var at=di(),yt=We(at);{var Xe=Lt=>{var An=wc(),ki=s(l(An)),Wi=l(ki);D(Vi=>b(Wi,`${t(Ke).filename??""} (${Vi??""})`),[()=>E(t(Ke).fit.level)]),A("click",ki,Vi=>{Vi.preventDefault(),h(ue,t(Ke).filename,!0),N()}),m(Lt,An)},it=Lt=>{var An=yc();m(Lt,An)};K(yt,Lt=>{t(Ke)?Lt(Xe):Lt(it,-1)})}m(ct,at)};K(Rn,ct=>{var Ke,at;((Ke=t(ie))==null?void 0:Ke.fit.level)==="too_tight"&&((at=t(Y))!=null&&at.files)&&ct(Un)})}var En=s(Rn,2),Sa=l(En);D(()=>{var ct,Ke;kt(En,1,`primary${((ct=t(ie))==null?void 0:ct.fit.level)==="too_tight"?" warn":""}`),En.disabled=t(Te),b(Sa,t(Te)?"Starte…":((Ke=t(ie))==null?void 0:Ke.fit.level)==="too_tight"?"Trotzdem holen (zu groß — nicht empfohlen)":"Herunterladen & Einpflegen")}),A("change",Ct,N),ri(Ct,()=>t(ue),ct=>h(ue,ct)),Cn(Be,()=>t(Ue),ct=>h(Ue,ct)),Cn(ge,()=>t(te),ct=>h(te,ct)),A("click",En,Me),m(qe,dt)},Ie=qe=>{var dt=Sc();m(qe,dt)};K(me,qe=>{var dt,Ct;t(Te)&&!t(Y)?qe($e):(Ct=(dt=t(Y))==null?void 0:dt.files)!=null&&Ct.length?qe(pt,1):t(Te)||qe(Ie,2)})}D(()=>{b(nt,t(bt)),b(re,t(C))}),A("click",_,qe=>{qe.target.classList.contains("modal-overlay")&&h(Ne,!1)}),A("click",F,()=>h(Ne,!1)),m(k,_)};K(Wn,k=>{t(Ne)&&k(ra)})}var Vn=s(Wn,2);{var ja=k=>{var _=Ac(),q=l(_),F=l(q),de=s(F,2),nt=l(de),ot=s(de,6),re=s(ot,4),me=s(re,4);st(me,17,()=>t(U),rt,(qe,dt,Ct)=>{var Yt=Ec(),ft=l(Yt),Be=s(ft,2),Tt=s(Be,2);st(Tt,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],rt,(mt,ge)=>{var Ye=Yr(),Gt=l(Ye),zt={};D(()=>{b(Gt,ge),zt!==(zt=ge)&&(Ye.__value=ge)}),m(mt,Ye)});var Kt=s(Tt,2);Cn(ft,()=>t(dt).repo,mt=>t(dt).repo=mt),Cn(Be,()=>t(dt).role,mt=>t(dt).role=mt),ri(Tt,()=>t(dt).quant,mt=>t(dt).quant=mt),A("click",Kt,()=>h(U,t(U).filter((mt,ge)=>ge!==Ct),!0)),m(qe,Yt)});var $e=s(me,2),pt=s($e,4),Ie=l(pt);D(()=>{b(nt,t(ce)?"Setup bearbeiten":"Eigenes Setup erstellen"),b(Ie,t(ce)?"Änderungen speichern":"Setup speichern")}),A("click",_,qe=>{qe.target.classList.contains("modal-overlay")&&h(lt,!1)}),A("click",F,()=>h(lt,!1)),Cn(ot,()=>t(je),qe=>h(je,qe)),Cn(re,()=>t(B),qe=>h(B,qe)),A("click",$e,()=>h(U,[...t(U),{repo:"",role:"",quant:"Q4_K_M"}],!0)),A("click",pt,He),m(k,_)};K(Vn,k=>{t(lt)&&k(ja)})}D(()=>{et.disabled=t($),b(M,t($)?"Suche…":"Aktualisieren"),Nt.disabled=t(xe),b(Jt,t(xe)?"Lade…":"Suchen")}),A("click",W,G),A("click",et,()=>St(!0)),A("keydown",tt,k=>k.key==="Enter"&&Mt()),Cn(tt,()=>t(oe),k=>h(oe,k)),ri(ke,()=>t(Q),k=>h(Q,k)),A("click",Nt,Mt),m(e,_t),ia()}xa(["click","keydown","change"]);var zc=w(`
Du öffnest Mission Control über einen Proxy/Namen. Die Engine läuft auf Port 8080 ohne HTTPS direkt am Bosgame.
+ Trag in deinen Tools die LAN-IP ein: http://192.168.178.151:8080/v1 — nicht den Proxy-Namen.
API-Key: ein beliebiger Wert (z.B. local). Danach das Modell in der Model-Liste auswählen.
Antigravity herunterladen: antigravityide.net — kostenlose Einzelperson-Tier, VS Code-basiert.
',1),Oc=w('
Öffne die Zed-Settings mit Cmd/Strg + , und füge diesen Block in deine bestehende settings.json ein. Falls bereits ein "bosgame"-Eintrag existiert: vorher löschen.
Nur diesen Block einfügen, nicht die ganze Datei ersetzen — sonst gehen andere Einstellungen verloren.
Kopieren
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.
Kopieren
Danach in OpenCode /models → wählen.
',1),qc=w('
In Cline/Cursor den Provider „OpenAI Compatible" wählen:
Kopieren
Kopieren
API-Key: ein beliebiger Wert (z.B. local).
',1),Nc=w('
Settings → Admin Panel → Connections → neue OpenAI-Verbindung:
Kopieren
Kopieren
',1),Kc=w('
Bilder einbinden (Vision)
Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.
Kopieren
'),Gc=w('
2 · Modelle auswählen
Wähle, welche Modelle im Config-Snippet erscheinen sollen.
3 · Tool wählen
Für welches Werkzeug brauchst du die Konfiguration?
Chat
Coding-Assistenten
4 · Config-Snippet
',1),Wc=w('
2 · Erst ein Modell installieren
Noch kein Modell eingerichtet
Bevor du ein Tool verbinden kannst, braucht die Engine mindestens ein Modell. Das Config-Snippet wird dann automatisch mit deinen echten Modellnamen befüllt.
→ Zum Cookbook (Modell holen)
'),Vc=w('
Verbinden
Schritt für Schritt: KI-Modelle in deine Tools einbinden — getestet, erklärt, mit Copy-Paste-Config.
1 · Verbindung prüfen
Stelle sicher, dass die LLM-Engine erreichbar ist, bevor du Tools konfigurierst.
Kopieren
Verbindung testen
Wie funktioniert das Auto-Swap?
',1);function Uc(e,n){aa(n,!0);const a=I(()=>_i.value),i=I(()=>{var B;return(((B=t(a))==null?void 0:B.models)||[]).filter(U=>!U.incomplete)}),r=I(v);let o=O("zed"),d=O(Ht([])),c=O(""),u=O(!1);function v(){return`http://${location.hostname}:8080/v1`}function g(B){return/^\d{1,3}(\.\d{1,3}){3}$/.test(B)}function E(){return location.protocol==="https:"||!g(location.hostname)}const f=I(()=>t(d).length?t(d):t(i).map(B=>B.name)),y=I(()=>t(f)[0]||"coder"),T=I(()=>{var B;return(B=t(i).find(U=>{var ce,Oe;return(Oe=(ce=U.meta)==null?void 0:ce.caps)==null?void 0:Oe.includes("Bild")}))==null?void 0:B.name});function P(B,U){const Oe=(U.length?t(i).filter(he=>U.includes(he.name)):t(i).length?t(i):[{name:"coder",meta:{}}]).map(he=>{var Mt,Et;const St=(((Mt=he.meta)==null?void 0:Mt.caps)||[]).some(At=>/Bild|Vision/i.test(At)),ht=((Et=he.meta)==null?void 0:Et.ctx)||131072;return` { "name": "${he.name}", "display_name": "${he.name}", "max_tokens": ${ht}${St?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`,
`);return`"language_models": {
"openai_compatible": {
"bosgame": {
- "api_url": "${L}",
+ "api_url": "${B}",
"available_models": [
-${ge}
+${Oe}
]
}
}
-}`}function x(L,V){const ge=(V.length?n(r).filter(Te=>V.includes(Te.name)):n(r).length?n(r):[{name:"coder",meta:{}}]).map(Te=>{var ft;const bt=((ft=Te.meta)==null?void 0:ft.ctx)||131072;return` "${Te.name}": { "name": "${Te.name}", "contextWindowSize": ${bt} }`}).join(`,
+}`}function S(B,U){const Oe=(U.length?t(i).filter(he=>U.includes(he.name)):t(i).length?t(i):[{name:"coder",meta:{}}]).map(he=>{var ht;const St=((ht=he.meta)==null?void 0:ht.ctx)||131072;return` "${he.name}": { "name": "${he.name}", "contextWindowSize": ${St} }`}).join(`,
`);return`"provider": {
"llama-swap": {
"npm": "@ai-sdk/openai-compatible",
"name": "Bosgame (llama-swap)",
"options": {
- "baseURL": "${L}",
+ "baseURL": "${B}",
"apiKey": "local"
},
"models": {
-${ge}
+${Oe}
}
}
-}`}async function D(){h(c,"Teste…");try{const L=await Me("/api/integration/test");h(u,L.ok,!0),h(c,L.ok?`✓ Verbunden — ${L.models.length} Modell(e): ${L.models.join(", ")}`:`✗ Keine Verbindung: ${L.error}`,!0)}catch(L){h(u,!1),h(c,"✗ "+L.message)}}function ke(L){var ie;const V=L.querySelector("code");V&&((ie=navigator.clipboard)==null||ie.writeText(V.textContent||""))}function te(L){var V;(V=navigator.clipboard)==null||V.writeText(L.value)}var ue=Kc(),Ae=s(ct(ue),2),K=s(l(Ae),6),W=l(K),pe=s(W,2),he=s(K,2);{var De=L=>{var V=Cc();m(L,V)},We=O(()=>E());F(he,L=>{n(We)&&L(De)})}var mt=s(he,2),A=l(mt),H=s(A,2);{var re=L=>{var V=zc(),ie=l(V);$(()=>{fn(V,`color:${n(u)?"#7ee29a":"#ff9b95"}`),b(ie,n(c))}),m(L,V)};F(H,L=>{n(c)&&L(re)})}var Ve=s(Ae,2),Q=s(l(Ve),2);dt(Q,20,()=>[["⚡","Kein manuelles Starten nötig",'Wenn du in Zed oder OpenCode „coder" auswählst und eine Anfrage sendest, lädt llama-swap das Modell automatisch — in ca. 2–5 Sekunden.'],["🔄","Modelle wechseln sich automatisch ab","Rufst du ein anderes Modell auf, entlädt llama-swap das aktuelle (nach TTL-Ablauf) und lädt das neue. Es läuft immer nur eines gleichzeitig."],["🧠","Zwei Modelle gleichzeitig aktiv halten","Du hast 124 GB RAM — genug für z.B. Scout 8B (~5 GB) dauerhaft geladen + ein größeres Modell das swappt. Dafür beim Scout im Modelle-Tab → Konfigurieren die TTL auf 99999 setzen."]],ot,(L,V)=>{var ie=O(()=>sr(V,3));let ge=()=>n(ie)[0],Te=()=>n(ie)[1],bt=()=>n(ie)[2];var ft=Pc(),xt=l(ft),Ct=l(xt),St=s(xt,2),Pt=l(St),Ot=l(Pt),Rt=s(Pt,2),z=l(Rt);$(()=>{b(Ct,ge()),b(Ot,Te()),b(z,bt())}),m(L,ft)});var $e=s(Ve,2);{var Y=L=>{var V=Nc(),ie=ct(V),ge=l(ie),Te=s(l(ge),2),bt=l(Te),ft=s(ge,4);dt(ft,21,()=>n(r),ot,(J,de)=>{const se=O(()=>n(d).includes(n(de).name));var Z=Dc(),be=l(Z);$(()=>{fn(Z,`cursor:pointer;${n(se)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),b(be,n(de).name)}),C("click",Z,()=>h(d,n(se)?n(d).filter(ve=>ve!==n(de).name):[...n(d),n(de).name],!0)),C("keydown",Z,ve=>ve.key==="Enter"&&h(d,n(se)?n(d).filter(ye=>ye!==n(de).name):[...n(d),n(de).name],!0)),m(J,Z)});var xt=s(ft,2);{var Ct=J=>{var de=$c(),se=l(de);C("click",se,Z=>{Z.preventDefault(),h(d,[],!0)}),m(J,de)};F(xt,J=>{n(d).length&&J(Ct)})}var St=s(ie,2),Pt=s(l(St),4);dt(Pt,20,()=>[["zed","Zed","Schneller nativer Editor — Empfohlen"],["opencode","OpenCode","Open-Source Coding-Agent (Terminal/Desktop)"],["cline","Cline / Cursor","VS Code Extension, Bring-Your-Own-Key"],["openwebui","OpenWebUI","Browser-Chat-Interface"]],ot,(J,de)=>{var se=O(()=>sr(de,3));let Z=()=>n(se)[0],be=()=>n(se)[1],ve=()=>n(se)[2];var ye=Lc(),xe=l(ye),_e=l(xe),M=s(xe,2),U=l(M);$(()=>{kt(ye,1,`card-btn${n(o)===Z()?" cb-best":""}`),b(_e,be()),b(U,ve())}),C("click",ye,()=>h(o,Z(),!0)),m(J,ye)});var Ot=s(St,2),Rt=s(l(Ot),2);{var z=J=>{const de=O(()=>P(n(i),n(f)));var se=Oc(),Z=s(ct(se),4),be=l(Z),ve=s(be,2),ye=l(ve),xe=l(ye),_e=s(Z,4),M=s(l(_e)),U=l(M);$(()=>{b(xe,n(de)),b(U,`bosgame / ${n(y)??""}`)}),C("click",be,le=>ke(le.currentTarget.parentElement)),m(J,se)},q=J=>{const de=O(()=>x(n(i),n(f)));var se=Ic(),Z=s(ct(se),6),be=l(Z),ve=s(be,2),ye=l(ve),xe=l(ye),_e=s(Z,2),M=s(l(_e),3),U=l(M);$(()=>{b(xe,n(de)),b(U,`llama-swap/${n(y)??""}`)}),C("click",be,le=>ke(le.currentTarget.parentElement)),m(J,se)},Ce=J=>{var de=Rc(),se=s(ct(de),4),Z=l(se),be=s(Z,2),ve=s(se,4),ye=l(ve),xe=s(ye,2);$(()=>{kr(Z,n(i)),kr(ye,n(y))}),C("click",be,_e=>te(_e.currentTarget.previousElementSibling)),C("click",xe,_e=>te(_e.currentTarget.previousElementSibling)),m(J,de)},ut=J=>{var de=Bc(),se=s(ct(de),4),Z=l(se),be=s(Z,2),ve=s(se,4),ye=l(ve),xe=s(ye,2);$(()=>kr(Z,n(i))),C("click",be,_e=>te(_e.currentTarget.previousElementSibling)),C("click",xe,_e=>te(_e.currentTarget.previousElementSibling)),m(J,de)};F(Rt,J=>{n(o)==="zed"?J(z):n(o)==="opencode"?J(q,1):n(o)==="cline"?J(Ce,2):n(o)==="openwebui"&&J(ut,3)})}var N=s(Ot,2);{var Le=J=>{const de=O(()=>`curl ${n(i)}/chat/completions \\
+}`}function $(B,U){return`{
+ "models": [
+${(U.length?t(i).filter(he=>U.includes(he.name)):t(i).length?t(i):[{name:"coder",meta:{}}]).map(he=>` {
+ "title": "llama-swap / ${he.name}",
+ "provider": "openai",
+ "model": "${he.name}",
+ "apiBase": "${B}",
+ "apiKey": "local"
+ }`).join(`,
+`)}
+ ]
+}`}async function Ce(){h(c,"Teste…");try{const B=await we("/api/integration/test");h(u,B.ok,!0),h(c,B.ok?`✓ Verbunden — ${B.models.length} Modell(e): ${B.models.join(", ")}`:`✗ Keine Verbindung: ${B.error}`,!0)}catch(B){h(u,!1),h(c,"✗ "+B.message)}}function oe(B){var ce;const U=B.querySelector("code");U&&((ce=navigator.clipboard)==null||ce.writeText(U.textContent||""))}function ae(B){var U;(U=navigator.clipboard)==null||U.writeText(B.value)}var xe=Vc(),V=s(We(xe),2),Q=s(l(V),6),fe=l(Q),be=s(fe,2),Se=s(Q,2);{var Ne=B=>{var U=zc();m(B,U)},bt=I(()=>E());K(Se,B=>{t(bt)&&B(Ne)})}var C=s(Se,2),Y=l(C),ue=s(Y,2);{var Ue=B=>{var U=Pc(),ce=l(U);D(()=>{fn(U,`color:${t(u)?"#7ee29a":"#ff9b95"}`),b(ce,t(c))}),m(B,U)};K(ue,B=>{t(c)&&B(Ue)})}var te=s(V,2),Te=s(l(te),2);st(Te,20,()=>[["⚡","Kein manuelles Starten nötig",'Wenn du in Zed oder OpenCode „coder" auswählst und eine Anfrage sendest, lädt llama-swap das Modell automatisch — in ca. 2–5 Sekunden.'],["🔄","Modelle wechseln sich automatisch ab","Rufst du ein anderes Modell auf, entlädt llama-swap das aktuelle (nach TTL-Ablauf) und lädt das neue. Es läuft immer nur eines gleichzeitig."],["🧠","Zwei Modelle gleichzeitig aktiv halten","Du hast 124 GB RAM — genug für z.B. Scout 8B (~5 GB) dauerhaft geladen + ein größeres Modell das swappt. Dafür beim Scout im Modelle-Tab → Konfigurieren die TTL auf 99999 setzen."]],rt,(B,U)=>{var ce=I(()=>Ca(U,3));let Oe=()=>t(ce)[0],he=()=>t(ce)[1],St=()=>t(ce)[2];var ht=Dc(),Mt=l(ht),Et=l(Mt),At=s(Mt,2),It=l(At),qt=l(It),z=s(It,2),N=l(z);D(()=>{b(Et,Oe()),b(qt,he()),b(N,St())}),m(B,ht)});var ie=s(te,2);{var lt=B=>{var U=Gc(),ce=We(U),Oe=l(ce),he=s(l(Oe),2),St=l(he),ht=s(Oe,4);st(ht,21,()=>t(i),rt,(j,ee)=>{const W=I(()=>t(d).includes(t(ee).name));var J=$c(),x=l(J);D(()=>{fn(J,`cursor:pointer;${t(W)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),b(x,t(ee).name)}),A("click",J,()=>h(d,t(W)?t(d).filter(L=>L!==t(ee).name):[...t(d),t(ee).name],!0)),A("keydown",J,L=>L.key==="Enter"&&h(d,t(W)?t(d).filter(R=>R!==t(ee).name):[...t(d),t(ee).name],!0)),m(j,J)});var Mt=s(ht,2);{var Et=j=>{var ee=Lc(),W=l(ee);A("click",W,J=>{J.preventDefault(),h(d,[],!0)}),m(j,ee)};K(Mt,j=>{t(d).length&&j(Et)})}var At=s(ce,2),It=s(l(At),6);st(It,20,()=>[["janai","Jan AI","Einfachstes Chat-Interface — Desktop-App, kein Setup"],["openwebui","OpenWebUI","Browser-Chat für Teams — mehr Features, mehr Setup"]],rt,(j,ee)=>{var W=I(()=>Ca(ee,3));let J=()=>t(W)[0],x=()=>t(W)[1],L=()=>t(W)[2];var R=Xr(),ne=l(R),Z=l(ne),Je=s(ne,2),Qe=l(Je);D(()=>{kt(R,1,`card-btn${t(o)===J()?" cb-best":""}`),b(Z,x()),b(Qe,L())}),A("click",R,()=>h(o,J(),!0)),m(j,R)});var qt=s(It,4);st(qt,20,()=>[["continue","Continue","VS Code/JetBrains — Hilfe ohne Agent-Overhead"],["cline","Cline","VS Code/JetBrains/Zed — voller Coding-Agent"],["antigravity","Antigravity","Googles agentic IDE — VS Code-basiert"],["opencode","OpenCode","Terminal-Agent — autonom, mächtig"],["zed","Zed","Schneller nativer Editor mit KI-Panel"]],rt,(j,ee)=>{var W=I(()=>Ca(ee,3));let J=()=>t(W)[0],x=()=>t(W)[1],L=()=>t(W)[2];var R=Xr(),ne=l(R),Z=l(ne),Je=s(ne,2),Qe=l(Je);D(()=>{kt(R,1,`card-btn${t(o)===J()?" cb-best":""}`),b(Z,x()),b(Qe,L())}),A("click",R,()=>h(o,J(),!0)),m(j,R)});var z=s(At,2),N=s(l(z),2);{var Me=j=>{var ee=Ic(),W=s(We(ee),6),J=l(W),x=s(J,2),L=s(W,4),R=l(L),ne=s(R,2);D(()=>{Hn(J,t(r)),Hn(R,t(y))}),A("click",x,Z=>ae(Z.currentTarget.previousElementSibling)),A("click",ne,Z=>ae(Z.currentTarget.previousElementSibling)),m(j,ee)},ut=j=>{const ee=I(()=>$(t(r),t(f)));var W=Bc(),J=s(We(W),4),x=l(J),L=s(x,2),R=l(L),ne=l(R),Z=s(J,2),Je=s(l(Z)),Qe=l(Je);D(()=>{b(ne,t(ee)),b(Qe,`llama-swap / ${t(y)??""}`)}),A("click",x,et=>oe(et.currentTarget.parentElement)),m(j,W)},G=j=>{var ee=Rc(),W=s(We(ee),6),J=l(W),x=s(J,2),L=s(W,4),R=l(L),ne=s(R,2),Z=s(L,2),Je=s(l(Z),3),Qe=l(Je);D(()=>{Hn(J,t(r)),Hn(R,t(y)),b(Qe,t(y))}),A("click",x,et=>ae(et.currentTarget.previousElementSibling)),A("click",ne,et=>ae(et.currentTarget.previousElementSibling)),m(j,ee)},ze=j=>{const ee=I(()=>P(t(r),t(f)));var W=Oc(),J=s(We(W),4),x=l(J),L=s(x,2),R=l(L),ne=l(R),Z=s(J,4),Je=s(l(Z)),Qe=l(Je);D(()=>{b(ne,t(ee)),b(Qe,`bosgame / ${t(y)??""}`)}),A("click",x,et=>oe(et.currentTarget.parentElement)),m(j,W)},He=j=>{const ee=I(()=>S(t(r),t(f)));var W=Fc(),J=s(We(W),6),x=l(J),L=s(x,2),R=l(L),ne=l(R),Z=s(J,2),Je=s(l(Z),3),Qe=l(Je);D(()=>{b(ne,t(ee)),b(Qe,`llama-swap/${t(y)??""}`)}),A("click",x,et=>oe(et.currentTarget.parentElement)),m(j,W)},Dt=j=>{var ee=qc(),W=s(We(ee),4),J=l(W),x=s(J,2),L=s(W,4),R=l(L),ne=s(R,2);D(()=>{Hn(J,t(r)),Hn(R,t(y))}),A("click",x,Z=>ae(Z.currentTarget.previousElementSibling)),A("click",ne,Z=>ae(Z.currentTarget.previousElementSibling)),m(j,ee)},$t=j=>{var ee=Nc(),W=s(We(ee),4),J=l(W),x=s(J,2),L=s(W,4),R=l(L),ne=s(R,2);D(()=>Hn(J,t(r))),A("click",x,Z=>ae(Z.currentTarget.previousElementSibling)),A("click",ne,Z=>ae(Z.currentTarget.previousElementSibling)),m(j,ee)};K(N,j=>{t(o)==="janai"?j(Me):t(o)==="continue"?j(ut,1):t(o)==="antigravity"?j(G,2):t(o)==="zed"?j(ze,3):t(o)==="opencode"?j(He,4):t(o)==="cline"?j(Dt,5):t(o)==="openwebui"&&j($t,6)})}var vt=s(z,2);{var _t=j=>{const ee=I(()=>`curl ${t(r)}/chat/completions \\
-H "Content-Type: application/json" \\
-d '{
- "model": "${n(T)}",
+ "model": "${t(T)}",
"messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,"}}]}]
-}'`);var se=Fc(),Z=l(se),be=s(l(Z),2),ve=l(be);Pe(ve,()=>Dt("check"));var ye=s(ve),xe=s(Z,4),_e=l(xe),M=s(_e,2),U=l(M),le=l(U);$(()=>{b(ye,` „${n(T)??""}" bereit`),b(le,n(de))}),C("click",_e,Je=>ke(Je.currentTarget.parentElement)),m(J,se)};F(N,J=>{n(T)&&J(Le)})}$(()=>b(bt,n(d).length?`${n(d).length} von ${n(r).length} ausgewählt`:"alle werden eingeschlossen")),m(L,V)},rt=L=>{var V=qc(),ie=s(l(V),2),ge=s(l(ie),4);C("click",ge,()=>{var Te;return(Te=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:Te.dispatchEvent(new MouseEvent("click"))}),m(L,V)};F($e,L=>{n(r).length?L(Y):L(rt,-1)})}$(()=>kr(W,n(i))),C("click",pe,L=>{const V=L.currentTarget.previousElementSibling;te(V)}),C("click",A,D),m(e,ue),aa()}ya(["click","keydown"]);var Wc=k('
Installieren
'),Vc=k('
Für dich: Upgrades
Neuere Modelle, die ein installiertes ersetzen können.
'),Uc=k('
Lade News… (erstes Laden kann kurz dauern)
'),Hc=k('
'),jc=k('
Keine News geladen
Die Quellen sind gerade nicht erreichbar — später nochmal probieren.
'),Jc=k('für dich'),Qc=k('
'),Zc=k(''),Yc=k('
News
Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
Aktualisieren
',1);function Xc(e,t){na(t,!0);let a=I(Vt([])),r=I(Vt([])),i=I(!0),o=I("");const d=K=>K==="perfect"?"ok":K==="marginal"?"warn":"bad";function c(K){const W=Math.max(0,Date.now()/1e3-K);return W<60?W+"s":W<3600?Math.floor(W/60)+"m":W<86400?Math.floor(W/3600)+"h":Math.floor(W/86400)+"d"}async function u(){h(i,!0),h(o,"");try{h(a,(await Me("/api/news")).items||[],!0)}catch(K){h(o,K.message||"Fehler beim Laden",!0)}finally{h(i,!1)}}async function v(){try{h(r,(await Me("/api/cookbook/upgrades")).upgrades||[],!0)}catch{h(r,[],!0)}}async function g(K,W){var pe;W.disabled=!0,W.textContent="Starte…";try{await Me("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:K.repo,role:K.role,params_b:K.params_b,quant:K.quant,hf_token:ir()})}),(pe=document.querySelector(".nav-item[data-view='activity']"))==null||pe.dispatchEvent(new MouseEvent("click"))}catch(he){W.disabled=!1,W.textContent="Installieren",alert("Fehler: "+he.message)}}function E(){u(),v()}mr(()=>{u(),v()});var f=Yc(),y=ct(f),T=s(l(y),2),P=s(y,2);{var x=K=>{var W=Vc(),pe=l(W),he=s(l(pe),2),De=l(he),We=s(pe,4);dt(We,21,()=>n(r),ot,(mt,A)=>{var H=Wc(),re=l(H),Ve=l(re),Q=l(Ve),$e=l(Q),Y=s(Q,2),rt=l(Y),L=s(Ve,2),V=l(L),ie=s(re,2);$(ge=>{b($e,n(A).name),kt(Y,1,`fit-badge ${ge??""}`),b(rt,n(A).fit.text),b(V,`Ersetzt dein „${n(A).old??""}". ${n(A).why??""}`)},[()=>d(n(A).fit.level)]),C("click",ie,ge=>g(n(A),ge.currentTarget)),m(mt,H)}),$(()=>b(De,n(r).length)),m(K,W)};F(P,K=>{n(r).length&&K(x)})}var D=s(P,2);{var ke=K=>{var W=Uc();m(K,W)},te=K=>{var W=Hc(),pe=l(W);$(()=>b(pe,n(o))),m(K,W)},ue=K=>{var W=jc();m(K,W)},Ae=K=>{var W=Zc();dt(W,21,()=>n(a),ot,(pe,he,De)=>{var We=Qc();kt(We,1,`news-card${De===0?" featured":""}`);var mt=l(We),A=l(mt),H=l(A),re=s(A,2);{var Ve=L=>{var V=Jc();m(L,V)};F(re,L=>{n(he).relevant&&L(Ve)})}var Q=s(re,2),$e=l(Q),Y=s(mt,2),rt=l(Y);$(L=>{qr(We,"href",n(he).link),b(H,n(he).source),b($e,L),b(rt,n(he).title)},[()=>n(he).ts?c(n(he).ts):""]),m(pe,We)}),m(K,W)};F(D,K=>{n(i)?K(ke):n(o)?K(te,1):n(a).length?K(Ae,-1):K(ue,2)})}C("click",T,E),m(e,f),aa()}ya(["click"]);const eu=[{label:"Einstieg",tutorials:[["Dein erster Workflow — in 3 Schritten",`
+}'`);var W=Kc(),J=l(W),x=s(l(J),2),L=l(x);Ae(L,()=>Bt("check"));var R=s(L),ne=s(J,4),Z=l(ne),Je=s(Z,2),Qe=l(Je),et=l(Qe);D(()=>{b(R,` „${t(T)??""}" bereit`),b(et,t(ee))}),A("click",Z,M=>oe(M.currentTarget.parentElement)),m(j,W)};K(vt,j=>{t(T)&&j(_t)})}D(()=>b(St,t(d).length?`${t(d).length} von ${t(i).length} ausgewählt`:"alle werden eingeschlossen")),m(B,U)},je=B=>{var U=Wc(),ce=s(l(U),2),Oe=s(l(ce),4);A("click",Oe,()=>{var he;return(he=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:he.dispatchEvent(new MouseEvent("click"))}),m(B,U)};K(ie,B=>{t(i).length?B(lt):B(je,-1)})}D(()=>Hn(fe,t(r))),A("click",be,B=>{const U=B.currentTarget.previousElementSibling;ae(U)}),A("click",Y,Ce),m(e,xe),ia()}xa(["click","keydown"]);var jc=w('
Installieren
'),Hc=w('
Für dich: Upgrades
Neuere Modelle, die ein installiertes ersetzen können.
'),Jc=w('
Lade News… (erstes Laden kann kurz dauern)
'),Qc=w('
'),Zc=w('
Keine News geladen
Die Quellen sind gerade nicht erreichbar — später nochmal probieren.
'),Yc=w('für dich'),Xc=w('
'),eu=w(''),tu=w('
News
Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
Aktualisieren
',1);function nu(e,n){aa(n,!0);let a=O(Ht([])),i=O(Ht([])),r=O(!0),o=O("");const d=V=>V==="perfect"?"ok":V==="marginal"?"warn":"bad";function c(V){const Q=Math.max(0,Date.now()/1e3-V);return Q<60?Q+"s":Q<3600?Math.floor(Q/60)+"m":Q<86400?Math.floor(Q/3600)+"h":Math.floor(Q/86400)+"d"}async function u(){h(r,!0),h(o,"");try{h(a,(await we("/api/news")).items||[],!0)}catch(V){h(o,V.message||"Fehler beim Laden",!0)}finally{h(r,!1)}}async function v(){try{h(i,(await we("/api/cookbook/upgrades")).upgrades||[],!0)}catch{h(i,[],!0)}}async function g(V,Q){var fe;Q.disabled=!0,Q.textContent="Starte…";try{await we("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:V.repo,role:V.role,params_b:V.params_b,quant:V.quant,hf_token:li()})}),(fe=document.querySelector(".nav-item[data-view='activity']"))==null||fe.dispatchEvent(new MouseEvent("click"))}catch(be){Q.disabled=!1,Q.textContent="Installieren",alert("Fehler: "+be.message)}}function E(){u(),v()}bi(()=>{u(),v()});var f=tu(),y=We(f),T=s(l(y),2),P=s(y,2);{var S=V=>{var Q=Hc(),fe=l(Q),be=s(l(fe),2),Se=l(be),Ne=s(fe,4);st(Ne,21,()=>t(i),rt,(bt,C)=>{var Y=jc(),ue=l(Y),Ue=l(ue),te=l(Ue),Te=l(te),ie=s(te,2),lt=l(ie),je=s(Ue,2),B=l(je),U=s(ue,2);D(ce=>{b(Te,t(C).name),kt(ie,1,`fit-badge ${ce??""}`),b(lt,t(C).fit.text),b(B,`Ersetzt dein „${t(C).old??""}". ${t(C).why??""}`)},[()=>d(t(C).fit.level)]),A("click",U,ce=>g(t(C),ce.currentTarget)),m(bt,Y)}),D(()=>b(Se,t(i).length)),m(V,Q)};K(P,V=>{t(i).length&&V(S)})}var $=s(P,2);{var Ce=V=>{var Q=Jc();m(V,Q)},oe=V=>{var Q=Qc(),fe=l(Q);D(()=>b(fe,t(o))),m(V,Q)},ae=V=>{var Q=Zc();m(V,Q)},xe=V=>{var Q=eu();st(Q,21,()=>t(a),rt,(fe,be,Se)=>{var Ne=Xc();kt(Ne,1,`news-card${Se===0?" featured":""}`);var bt=l(Ne),C=l(bt),Y=l(C),ue=s(C,2);{var Ue=je=>{var B=Yc();m(je,B)};K(ue,je=>{t(be).relevant&&je(Ue)})}var te=s(ue,2),Te=l(te),ie=s(bt,2),lt=l(ie);D(je=>{Ni(Ne,"href",t(be).link),b(Y,t(be).source),b(Te,je),b(lt,t(be).title)},[()=>t(be).ts?c(t(be).ts):""]),m(fe,Ne)}),m(V,Q)};K($,V=>{t(r)?V(Ce):t(o)?V(oe,1):t(a).length?V(xe,-1):V(ae,2)})}A("click",T,E),m(e,f),ia()}xa(["click"]);const au=[{label:"Einstieg",tutorials:[["Dein erster Workflow — in 3 Schritten",`
Modell holen: Tab Cookbook → Anwendungsfall wählen (z.B. „Coden & Programmieren") →
Komplettes Setup installieren. Der Download läuft im Tab Aktivität — einfach warten bis der Job grün wird.
@@ -80,32 +91,50 @@ ${ge}
Scout immer sofort verfügbar halten: Tab Modelle → Konfigurieren →
Immer aktiv halten aktivieren (TTL = ∞). Das Modell bleibt dann dauerhaft im RAM
und antwortet ohne Wartezeit — ideal für den kleinen, schnellen Allrounder.
`]]},{label:"Tools einrichten",tutorials:[["Welches Tool ist das richtige für mich?",`
-
Die Antwort hängt davon ab, was du hauptsächlich tun willst:
+
Chat — ich will einfach reden, schreiben, fragen:
-
Ich will einfach chatten, Texte schreiben, Fragen stellen
-
→ OpenWebUI — klassische Chat-Oberfläche im Browser.
- Kein Programmieren, kein Setup. Ideal als Einstieg.
+
Einfachster Einstieg
+
→ Jan AI — Desktop-App, Doppelklick-Installer, sofort loslegen.
+ Vertraut wie ChatGPT, läuft komplett lokal. Kein Admin-Panel, kein Docker.
-
Ich programmiere und will KI in meinem Editor
-
→ Cline — KI-Assistent direkt in VS Code, JetBrains, Cursor, Zed u.a.
- Zeigt dir jeden Schritt und fragt vor Änderungen.
-
-
-
Ich will, dass die KI eigenständig ganze Features baut
-
→ OpenCode — autonomer Coding-Agent im Terminal oder als Desktop-App.
- Liest Dateien, schreibt Code, führt Befehle aus.
-
-
-
Ich will einen schnellen Editor mit eingebautem KI-Panel
-
→ Zed — nativer Editor mit direktem Modell-Zugriff.
- Schnell, minimalistisch, für Leute die Gewicht auf Performance legen.
+
Teams / Power-User
+
→ OpenWebUI — viele Features (RAG, Bilder, Plugins, Mehrbenutzer).
+ Mehr Setup-Aufwand, aber der mächtigste Chat-Client.
-
Faustregel: Fang mit OpenWebUI an. Wenn du merkst dass
- du dieselben Aufgaben immer wieder beschreibst und dann manuell umsetzt — wechsle zu
- OpenCode oder Cline.
`],["OpenCode verbinden und die ersten Schritte",`
+
Coding — ich will KI beim Programmieren:
+
+
+
Simpler Einstieg in VS Code
+
→ Continue — Chat + Autocomplete direkt im Editor, kein Agent-Overhead.
+ Macht keinen Schritt ohne dich.
+
+
+
Voller Coding-Agent im Editor
+
→ Cline — liest Dateien, schreibt Code, fragt vor jeder Änderung.
+ VS Code, JetBrains, Zed u.a.
+
+
+
Agent-IDE mit VS Code-Feeling
+
→ Antigravity — Googles agentic IDE (VS Code-Fork), kostenlos.
+ Multi-Agent, planen + coden + testen in einem.
+
+
+
Autonomer Terminal-Agent
+
→ OpenCode — mächtigster lokaler Agent, lebt im Terminal.
+ Ideal für „bau mir Feature X komplett fertig".
+
+
+
Schneller Editor, minimalistisch
+
→ Zed — nativer Editor (Rust), eingebautes KI-Panel.
+ Für Leute die Performance über Features stellen.
+
+
+
Faustregel: Fang mit Jan AI zum Chatten an.
+ Für Coding: Continue als sanfter Einstieg oder gleich Cline/Antigravity
+ wenn du bereit bist, dem Agenten mehr Kontrolle zu geben.
`],["OpenCode verbinden und die ersten Schritte",`
OpenCode ist installiert? Dann in vier Schritten verbinden:
Ausgaben-Limit (seit April 2026): In Settings → Spending Limits kannst du ein
Tages- oder Monats-Budget setzen — verhindert dass ein laufender Agent unbemerkt viel Token verbraucht.
Jan AI ist die einfachste Art, lokal mit KI zu chatten —
+ Desktop-App, kein Terminal, kein Docker, kein Admin-Panel.
+
+
Jan AI installieren:jan.ai
+ → Download → Doppelklick-Installer (Windows/macOS/Linux).
+
Remote-Modell hinzufügen: In der linken Leiste auf das Hub-Icon →
+ oben rechts + Remote-Modell.
+
Verbindung eintragen: Tab Verbinden → Jan AI auswählen →
+ Basis-URL und Modell-ID kopieren und in Jan einfügen.
+
API-Key: irgendeinen Text (z.B. local). Speichern.
+
+
Danach erscheint das Modell in der Modell-Liste — auswählen und loslegen.
+
Gut für: Chatten, Texte schreiben, übersetzen, Fragen stellen —
+ genauso wie ChatGPT, aber 100% lokal und privat. Bilder mitschicken klappt auch
+ sobald ein Vision-Modell eingetragen ist.
`],["Continue — Coding-Hilfe in VS Code ohne Agent-Overhead",`
+
Continue ist die einfachste Coding-Erweiterung für VS Code und JetBrains —
+ kein autonomer Agent, sondern ein KI-Assistent der nur auf Anfrage handelt.
Config holen: Tab Verbinden → Continue auswählen →
+ Snippet kopieren und in ~/.continue/config.json einfügen.
+
Continue in VS Code neu starten → im Chat-Panel Modell wählen → loslegen.
+
+
Was Continue kann:
+
+
Chat: Frage direkt im Editor — markiere Code und drücke Strg+L
+
Autocomplete: Ergänzt Code während du tippst (wie Copilot)
+
Inline-Edit: Markieren → Strg+I → „Refactore das zu TypeScript"
+
+
Unterschied zu Cline: Continue macht nichts von alleine — du steuerst jeden Schritt.
+ Ideal als erster Einstieg bevor man mit vollen Agenten arbeitet.
+
Weitere Infos: continue.dev
+ — Hinweis: 2026 von Cursor akquiriert, weiterhin kostenlos & open source.
`],["Antigravity — Googles agentic IDE",`
+
Antigravity ist Googles agent-first IDE — ein Fork von VS Code, der Planung,
+ Coding, Testing und Deployment in einem Workflow zusammenführt. Kostenlos für Einzelpersonen.
+
+
Antigravity installieren:
+ antigravityide.net
+ → Download → läuft wie VS Code.
Verbindung eintragen: Tab Verbinden → Antigravity auswählen →
+ Basis-URL und Modell-ID kopieren und eintragen.
+
API-Key: beliebiger Text (z.B. local). Danach das Modell aus der Liste wählen.
+
+
Was Antigravity besonders macht:
+
+
Agent-First: Statt Code-Completion steht der Agent im Mittelpunkt —
+ du beschreibst, er plant und setzt um
+
Multi-Agent: Mehrere Agenten arbeiten parallel an verschiedenen Teilen
+
Manager-Oberfläche: Übersicht über alle laufenden Agenten-Sessions
+
VS Code-kompatibel: Extensions und Keybindings funktionieren wie gewohnt
+
+
Wann Antigravity statt OpenCode? Wenn du lieber eine grafische IDE als ein Terminal magst
+ und trotzdem volle Agenten-Kontrolle willst. OpenCode ist mächtiger im Terminal-Flow;
+ Antigravity ist komfortabler für Umsteiger aus VS Code.
Danach oben das Modell wählen (coder, scout oder vision) und loslegen
- — genau wie bei ChatGPT, nur lokal und privat.
-
Bilder analysieren: Mit einem Vision-Modell (z.B. qwen3-vl) einfach ein Bild
- per Drag & Drop ins Chat-Fenster ziehen — das Modell beschreibt und analysiert es.
-
Gut für: Texte schreiben, übersetzen, zusammenfassen, erklären lassen, Brainstorming —
- alles ohne Programmierkenntnisse.
+
Danach Modell auswählen und loslegen. Für einfaches Chatten: Jan AI ist einfacher.
+ OpenWebUI lohnt sich ab dem Moment, wo du mehr als nur Chat willst.
`]]},{label:"Agenten meistern",tutorials:[["Was ein Agent tut — und was er nicht kann",`
Ein nacktes Modell antwortet auf Text — das war's.
Ein Agent ist das Programm drumherum, das das Modell in eine Handlungsschleife bringt:
@@ -540,4 +633,4 @@ src/
Strg+Shift+R (Hard Reload). Wenn das nicht hilft:
Tab Server → Mission Control → Neu starten.
-
`]]}],tu=[["LLM / Modell","Die KI selbst — versteht und schreibt Text (wie ChatGPT, nur lokal auf deinem PC). Ein Modell ist eine konkrete Datei, oft auf etwas spezialisiert (Code, Bilder, Chat)."],["GGUF","Das lokal lauffähige Dateiformat. llama-swap lädt nur GGUF — Repos ohne GGUF kann die Engine nicht nutzen."],["Quantisierung (Q4_K_M)","Verkleinert ein Modell (16-Bit → 4-Bit), damit es in den Speicher passt — bei kaum Qualitätsverlust. Q4_K_M ist der bewährte Sweetspot. Für Coding/Reasoning: Q8_0 (nahezu verlustfrei). Wenn Q4_K_M 1 GB zu groß ist: IQ4_XS als Alternative (ähnliche Qualität, etwas kleiner)."],["Kontextfenster","Das Kurzzeitgedächtnis: wie viel Text sich das Modell gleichzeitig merken kann. Größer = mehr Überblick, mehr Speicher, etwas langsamer."],["Token","Die kleinste Einheit die ein Modell verarbeitet — meist 3–4 Zeichen oder ein kurzes Wort. 1 000 Tokens ≈ 750 Wörter. Kontextfenster, Geschwindigkeit und Kosten werden in Tokens gemessen."],["Auto-Swap","llama-swap lädt/entlädt Modelle automatisch — immer nur eins gleichzeitig. Du managst nichts."],["TTL (Time to Live)","Wie lange ein Modell nach der letzten Anfrage im RAM bleibt bevor es entladen wird. Standard: 5 Minuten. ∞ = bleibt dauerhaft geladen (sinnvoll für den Scout)."],["Agent","Ein Programm (OpenCode, Cline, Continue), das das Modell in einer Handlungsschleife laufen lässt — Dateien lesen/ändern, Befehle ausführen, planen, bis die Aufgabe erledigt ist."],["MCP","Model Context Protocol — der Stecker, über den ein Agent zusätzliche Werkzeuge bekommt (Web, Datenbank, GitHub …). MCP = neue Fähigkeiten."],["Skills / Rules","Kurze Textdatei (AGENTS.md, .clinerules …) mit Anweisungen wie der Agent in deinem Projekt arbeiten soll — einmal geschrieben, immer befolgt. Seit 2026 plattformübergreifender Standard: AGENTS.md wird von über 10 Tools nativ gelesen."],["Memory Bank","Clines Konzept für dauerhaften Projekt-Kontext: projectbrief.md (Ziel & Scope), activeContext.md (aktueller Fokus), progress.md (Stand). Wird zu Beginn jeder Aufgabe automatisch gelesen — ähnlich wie AGENTS.md, aber aufgeteilt nach Zweck."],["System-Prompt","Eine unsichtbare Anweisung die vor deiner Nachricht steht und das Verhalten des Modells grundlegend prägt (Sprache, Ton, Rolle). Skills nutzen oft den System-Prompt."],["Vision","Modelle mit Vision-Fähigkeit können Bilder verstehen — Screenshots, Diagramme, Fehlerfotos. Erkennbar am mmproj-Projektor der mitgeladen wird."]];var nu=k(''),au=k('
'),ru=k('
'),iu=k('
Guide
Schritt für Schritt erklärt — von der ersten Einrichtung bis zu echten Agenten-Workflows.
Begriffe kurz erklärt
',1);function su(e){var t=iu(),a=s(ct(t),2);dt(a,17,()=>eu,ot,(i,o,d)=>{var c=au(),u=l(c),v=l(u),g=s(u,2);dt(g,17,()=>n(o).tutorials,ot,(E,f,y)=>{var T=O(()=>sr(n(f),2));let P=()=>n(T)[0],x=()=>n(T)[1];var D=nu();D.open=d===0&&y===0;var ke=l(D),te=l(ke),ue=s(ke,2);Pe(ue,x,!0),$(()=>b(te,P())),m(E,D)}),$(()=>b(v,n(o).label)),m(i,c)});var r=s(a,4);dt(r,21,()=>tu,ot,(i,o)=>{var d=O(()=>sr(n(o),2));let c=()=>n(d)[0],u=()=>n(d)[1];var v=ru(),g=l(v),E=l(g),f=s(g,2),y=l(f);$(()=>{b(E,c()),b(y,u())}),m(i,v)}),m(e,t)}let Xi={};function lu(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function es(e){var i;const t=document.getElementById("swdot"),a=document.getElementById("swlabel"),r=document.getElementById("top-active-text");if(!e)t&&(t.className="dot off"),a&&(a.textContent="Backend nicht erreichbar"),r&&(r.textContent="Backend offline"),ts("Backend nicht erreichbar – läuft uvicorn?",!1);else{const o=(e.swap_url||"").replace(/^https?:\/\//,"");t&&(t.className="dot "+(e.swap_ok?"on":"off")),a&&(a.textContent=(e.swap_ok?"LLM-Engine: Online – ":"LLM-Engine: Offline – ")+o);const d=["running","ready","loading","starting"],c=(e.models||[]).find(v=>d.includes(v.state));if(r)if(c){const v=(i=c.meta)!=null&&i.ctx?` · ${Math.round(c.meta.ctx/1024)}k ctx`:"",g=c.state==="loading"||c.state==="starting"?' lädt…':"";r.innerHTML=`${c.name}${v}${g}`}else r.innerHTML='Kein Modell im VRAM';e.swap_ok?uu():ts(`LLM-Engine nicht erreichbar unter ${o} – läuft der llama-swap Dienst?`,!0);const u={};for(const v of e.models||[])u[v.name]=v.state;for(const[v,g]of Object.entries(u)){const E=Xi[v];if(E&&E!==g&&(g==="running"||g==="loading")){lu();break}}Xi=u}ou(e),br.set(e)}function ou(e){const t=document.getElementById("sec-chip"),a=document.getElementById("sec-chip-tx");!t||!a||(t.classList.toggle("ok",!!(e!=null&&e.secured)),a.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function du(e){da.set(e||[])}function cu(e){Pi.set(e)}function ts(e,t){const a=document.getElementById("alert");a.className="alert"+(t?" warn":""),a.innerHTML=`${e}`,a.style.display="flex"}function uu(){const e=document.getElementById("alert");e&&(e.style.display="none")}const vu=e=>{var t;return(t=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:t.click()};function ei(e,t,a,r){const i=document.createElement("span");return i.className="upd-badge"+(t?" "+t:""),i.textContent=e,r&&(i.title=r),i.onclick=()=>vu(a),i}async function tl(){try{const e=await Me("/api/updates"),t=document.getElementById("update-badges");if(!t)return;const a=e.apt_cache_age_h,r=a!=null&&a>24,i=a!=null?` · apt-Cache: vor ${a}h`:"";t.innerHTML="",t.appendChild(ei(e.os>0?`OS: ${e.os} Updates`:r?"OS: ?":"OS: aktuell",e.os>0||r?"warn":"ok","server",e.os>0?`${e.os} Pakete${i}`:r?`apt-Cache veraltet (${a}h)`:`Keine Updates${i}`)),t.appendChild(ei(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),t.appendChild(ei(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Gr(){try{es(await Me("/api/status"))}catch{es(null)}}async function nl(){try{du(await Me("/api/jobs"))}catch{}}function al(){const e=window.location.protocol==="https:"?"wss:":"ws:",t=new WebSocket(`${e}//${window.location.host}/api/system/stream`);t.onmessage=a=>{try{cu(JSON.parse(a.data))}catch{}},t.onclose=()=>{setTimeout(al,3e3)},t.onerror=()=>t.close()}var ls;((ls=document.getElementById("logo"))==null?void 0:ls.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Kr.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Kr[e.dataset.ic||""]||""});const pu=[["overview",cd],["models",Md],["activity",Id],["server",Ud],["cookbook",Tc],["connect",Gc],["news",Xc],["guides",su]];for(const[e,t]of pu){const a=document.querySelector(`.view[data-view="${e}"]`);a&&xo(t,{target:a})}Vo("overview");const ti=document.getElementById("token");ti&&(ti.value=el(),ti.addEventListener("change",e=>{No(e.target.value),Gr()}));const ni=document.getElementById("hf-token");ni&&(ni.value=ir(),ni.addEventListener("change",e=>Ko(e.target.value)));const ns=document.getElementById("nav-settings"),ai=document.getElementById("settings-modal"),as=document.getElementById("sm-close");ns&&ai&&as&&(ns.addEventListener("click",()=>ai.style.display="flex"),as.addEventListener("click",()=>ai.style.display="none"));function fu(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Gr);Gr();nl();al();setInterval(fu,1e3);setInterval(Gr,3e3);setInterval(nl,1500);tl();setInterval(tl,6e4);
+ `]]}],iu=[["LLM / Modell","Die KI selbst — versteht und schreibt Text (wie ChatGPT, nur lokal auf deinem PC). Ein Modell ist eine konkrete Datei, oft auf etwas spezialisiert (Code, Bilder, Chat)."],["GGUF","Das lokal lauffähige Dateiformat. llama-swap lädt nur GGUF — Repos ohne GGUF kann die Engine nicht nutzen."],["Quantisierung (Q4_K_M)","Verkleinert ein Modell (16-Bit → 4-Bit), damit es in den Speicher passt — bei kaum Qualitätsverlust. Q4_K_M ist der bewährte Sweetspot. Für Coding/Reasoning: Q8_0 (nahezu verlustfrei). Wenn Q4_K_M 1 GB zu groß ist: IQ4_XS als Alternative (ähnliche Qualität, etwas kleiner)."],["Kontextfenster","Das Kurzzeitgedächtnis: wie viel Text sich das Modell gleichzeitig merken kann. Größer = mehr Überblick, mehr Speicher, etwas langsamer."],["Token","Die kleinste Einheit die ein Modell verarbeitet — meist 3–4 Zeichen oder ein kurzes Wort. 1 000 Tokens ≈ 750 Wörter. Kontextfenster, Geschwindigkeit und Kosten werden in Tokens gemessen."],["Auto-Swap","llama-swap lädt/entlädt Modelle automatisch — immer nur eins gleichzeitig. Du managst nichts."],["TTL (Time to Live)","Wie lange ein Modell nach der letzten Anfrage im RAM bleibt bevor es entladen wird. Standard: 5 Minuten. ∞ = bleibt dauerhaft geladen (sinnvoll für den Scout)."],["Agent","Ein Programm (OpenCode, Cline, Continue), das das Modell in einer Handlungsschleife laufen lässt — Dateien lesen/ändern, Befehle ausführen, planen, bis die Aufgabe erledigt ist."],["MCP","Model Context Protocol — der Stecker, über den ein Agent zusätzliche Werkzeuge bekommt (Web, Datenbank, GitHub …). MCP = neue Fähigkeiten."],["Skills / Rules","Kurze Textdatei (AGENTS.md, .clinerules …) mit Anweisungen wie der Agent in deinem Projekt arbeiten soll — einmal geschrieben, immer befolgt. Seit 2026 plattformübergreifender Standard: AGENTS.md wird von über 10 Tools nativ gelesen."],["Memory Bank","Clines Konzept für dauerhaften Projekt-Kontext: projectbrief.md (Ziel & Scope), activeContext.md (aktueller Fokus), progress.md (Stand). Wird zu Beginn jeder Aufgabe automatisch gelesen — ähnlich wie AGENTS.md, aber aufgeteilt nach Zweck."],["System-Prompt","Eine unsichtbare Anweisung die vor deiner Nachricht steht und das Verhalten des Modells grundlegend prägt (Sprache, Ton, Rolle). Skills nutzen oft den System-Prompt."],["Vision","Modelle mit Vision-Fähigkeit können Bilder verstehen — Screenshots, Diagramme, Fehlerfotos. Erkennbar am mmproj-Projektor der mitgeladen wird."]];var ru=w(''),su=w('
'),lu=w('
'),ou=w('
Guide
Schritt für Schritt erklärt — von der ersten Einrichtung bis zu echten Agenten-Workflows.
Begriffe kurz erklärt
',1);function du(e){var n=ou(),a=s(We(n),2);st(a,17,()=>au,rt,(r,o,d)=>{var c=su(),u=l(c),v=l(u),g=s(u,2);st(g,17,()=>t(o).tutorials,rt,(E,f,y)=>{var T=I(()=>Ca(t(f),2));let P=()=>t(T)[0],S=()=>t(T)[1];var $=ru();$.open=d===0&&y===0;var Ce=l($),oe=l(Ce),ae=s(Ce,2);Ae(ae,S,!0),D(()=>b(oe,P())),m(E,$)}),D(()=>b(v,t(o).label)),m(r,c)});var i=s(a,4);st(i,21,()=>iu,rt,(r,o)=>{var d=I(()=>Ca(t(o),2));let c=()=>t(d)[0],u=()=>t(d)[1];var v=lu(),g=l(v),E=l(g),f=s(g,2),y=l(f);D(()=>{b(E,c()),b(y,u())}),m(r,v)}),m(e,n)}let es={};function cu(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function ts(e){var r;const n=document.getElementById("swdot"),a=document.getElementById("swlabel"),i=document.getElementById("top-active-text");if(!e)n&&(n.className="dot off"),a&&(a.textContent="Backend nicht erreichbar"),i&&(i.textContent="Backend offline"),ns("Backend nicht erreichbar – läuft uvicorn?",!1);else{const o=(e.swap_url||"").replace(/^https?:\/\//,"");n&&(n.className="dot "+(e.swap_ok?"on":"off")),a&&(a.textContent=(e.swap_ok?"LLM-Engine: Online – ":"LLM-Engine: Offline – ")+o);const d=["running","ready","loading","starting"],c=(e.models||[]).find(v=>d.includes(v.state));if(i)if(c){const v=(r=c.meta)!=null&&r.ctx?` · ${Math.round(c.meta.ctx/1024)}k ctx`:"",g=c.state==="loading"||c.state==="starting"?' lädt…':"";i.innerHTML=`${c.name}${v}${g}`}else i.innerHTML='Kein Modell im VRAM';e.swap_ok?fu():ns(`LLM-Engine nicht erreichbar unter ${o} – läuft der llama-swap Dienst?`,!0);const u={};for(const v of e.models||[])u[v.name]=v.state;for(const[v,g]of Object.entries(u)){const E=es[v];if(E&&E!==g&&(g==="running"||g==="loading")){cu();break}}es=u}uu(e),_i.set(e)}function uu(e){const n=document.getElementById("sec-chip"),a=document.getElementById("sec-chip-tx");!n||!a||(n.classList.toggle("ok",!!(e!=null&&e.secured)),a.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function vu(e){ca.set(e||[])}function pu(e){Pr.set(e)}function ns(e,n){const a=document.getElementById("alert");a.className="alert"+(n?" warn":""),a.innerHTML=`${e}`,a.style.display="flex"}function fu(){const e=document.getElementById("alert");e&&(e.style.display="none")}const hu=e=>{var n;return(n=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:n.click()};function er(e,n,a,i){const r=document.createElement("span");return r.className="upd-badge"+(n?" "+n:""),r.textContent=e,i&&(r.title=i),r.onclick=()=>hu(a),r}async function nl(){try{const e=await we("/api/updates"),n=document.getElementById("update-badges");if(!n)return;const a=e.apt_cache_age_h,i=a!=null&&a>24,r=a!=null?` · apt-Cache: vor ${a}h`:"";n.innerHTML="",n.appendChild(er(e.os>0?`OS: ${e.os} Updates`:i?"OS: ?":"OS: aktuell",e.os>0||i?"warn":"ok","server",e.os>0?`${e.os} Pakete${r}`:i?`apt-Cache veraltet (${a}h)`:`Keine Updates${r}`)),n.appendChild(er(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),n.appendChild(er(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Gi(){try{ts(await we("/api/status"))}catch{ts(null)}}async function al(){try{vu(await we("/api/jobs"))}catch{}}function il(){const e=window.location.protocol==="https:"?"wss:":"ws:",n=new WebSocket(`${e}//${window.location.host}/api/system/stream`);n.onmessage=a=>{try{pu(JSON.parse(a.data))}catch{}},n.onclose=()=>{setTimeout(il,3e3)},n.onerror=()=>n.close()}var os;((os=document.getElementById("logo"))==null?void 0:os.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Ki.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Ki[e.dataset.ic||""]||""});const gu=[["overview",ud],["models",Ed],["activity",Rd],["server",jd],["cookbook",Tc],["connect",Uc],["news",nu],["guides",du]];for(const[e,n]of gu){const a=document.querySelector(`.view[data-view="${e}"]`);a&&So(n,{target:a})}Uo("overview");const tr=document.getElementById("token");tr&&(tr.value=tl(),tr.addEventListener("change",e=>{No(e.target.value),Gi()}));const nr=document.getElementById("hf-token");nr&&(nr.value=li(),nr.addEventListener("change",e=>Go(e.target.value)));const as=document.getElementById("nav-settings"),ar=document.getElementById("settings-modal"),is=document.getElementById("sm-close");as&&ar&&is&&(as.addEventListener("click",()=>ar.style.display="flex"),is.addEventListener("click",()=>ar.style.display="none"));function mu(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Gi);Gi();al();il();setInterval(mu,1e3);setInterval(Gi,3e3);setInterval(al,1500);nl();setInterval(nl,6e4);