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.
'),Md=g(''),Ed=g('
Rolle festlegen
Wähle eine Rolle als zweiten, sprechenden Namen. In deinen Tools funktionieren danach beide: der echte Modellname und die Rolle.
'),Ad=g('
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 Cd(e,n){$n(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.",s="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.",l=[{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 A;return((A=xi.value)==null?void 0:A.models)||[]});function d(){document.dispatchEvent(new Event("mc:refresh"))}let c=I(""),v=I(""),f=I(""),b=I(!1);const T=q(()=>t(o).filter(A=>!A.incomplete));async function _(){var B;const A=t(c)||((B=t(T)[0])==null?void 0:B.name);if(!(!A||!t(v).trim())){u(b,!0),u(f,"(wecke Modell, kann beim Laden kurz dauern…)");try{const ke=await Te("/api/chat",{method:"POST",body:JSON.stringify({model:A,message:t(v)})});u(f,ke.reply,!0)}catch(ke){u(f,"Fehler: "+ke.message)}u(b,!1),d()}}const y=300;let P=I(!1),O=I(null),S=I(8192),F=I(!1);function Oe(A){var B;u(O,t(o).find(ke=>ke.name===A),!0),t(O)&&(u(S,((B=t(O).meta)==null?void 0:B.ctx)||8192,!0),u(F,(t(O).ttl??y)>=99999),u(P,!0))}async function Ee(){const A=t(F)?99999:y;try{await Te("/api/update_model",{method:"POST",body:JSON.stringify({alias:t(O).name,ctx:t(S),ttl:A})}),pe("Gespeichert — aktiv beim nächsten Modell-Start."),u(P,!1),d()}catch(B){pe(B.message,!0)}}let ze=I(!1),Ke=I(""),Y=I(""),Z=I("");function me(A){const B=t(o).find(ke=>ke.name===A);u(Ke,A,!0),u(Z,(B==null?void 0:B.role)||"",!0),u(Y,""),u(ze,!0)}async function Be(A){try{await Te("/api/set_role",{method:"POST",body:JSON.stringify({alias:t(Ke),role:A})}),pe(A?`Rolle gesetzt: ${A}`:"Rolle entfernt."),u(ze,!1),d()}catch(B){pe(B.message,!0)}}async function Ve(A){if(await xn({title:`„${A}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await Te("/api/unload?model="+encodeURIComponent(A),{method:"POST"}),pe("Entladen: "+A),setTimeout(d,600)}catch(B){pe(B.message,!0)}}async function Qe(A){if(await xn({title:`„${A}" 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 B=await Te("/api/delete_model",{method:"POST",body:JSON.stringify({alias:A})});pe(B.note||"Gelöscht: "+A),setTimeout(d,600)}catch(B){pe(B.message,!0)}}function vt(A){return A!=null&&A.length?A.map(B=>B==="Code"?'Code':B==="Bild"?'Bild':'Text').join(" "):"–"}function D(A){if(!A)return"–";const B=A.quant||"?",ke=A.ctx?Math.round(A.ctx/1024)+"K":"?",re=A.size_bytes?(A.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${B} · ${ke} · ${re}`}function le(A){var B;(B=navigator.clipboard)==null||B.writeText(A),pe("Kopiert: "+A)}var Ae=Ad(),tt=i(nt(Ae),2),N=i(r(tt),6);Ze(N,21,()=>t(T),et,(A,B)=>{var ke=fd(),re=r(ke),$={};z(()=>{h(re,t(B).name),$!==($=t(B).name)&&(ke.value=(ke.__value=t(B).name)??"")}),p(A,ke)});var oe=i(N,4),de=i(oe,2),He=r(de),je=i(de,2);{var at=A=>{var B=hd(),ke=r(B);z(()=>h(ke,t(f))),p(A,B)};L(je,A=>{t(f)&&A(at)})}var st=i(tt,2),it=r(st),mt=i(r(it)),Tt=r(mt),zt=i(it,4);{var Kt=A=>{var B=gd();p(A,B)},It=A=>{var B=kd(),ke=i(r(B));Ze(ke,21,()=>t(o),et,(re,$)=>{var ae=Ua(),we=nt(ae);{var Ce=K=>{var Q=md(),fe=r(Q),se=r(fe),Me=i(fe,5),Se=r(Me),C=i(Se,2);z(()=>h(se,t($).name)),w("click",Se,()=>{var H;pe("Lade im Cookbook ein Modell und setze den Alias auf: "+t($).name),(H=document.querySelector(".nav-item[data-view='cookbook']"))==null||H.dispatchEvent(new MouseEvent("click"))}),w("click",C,()=>Qe(t($).name)),p(K,Q)},M=K=>{var Q=xd(),fe=r(Q),se=r(fe),Me=r(se),Se=i(Me);{var C=Pe=>{var V=bd(),U=r(V);z(()=>h(U,t($).role)),p(Pe,V)};L(Se,Pe=>{t($).role&&Pe(C)})}var H=i(se,2);{var ve=Pe=>{var V=_d(),U=r(V);z(()=>h(U,t($).meta.filename)),p(Pe,V)};L(H,Pe=>{var V;(V=t($).meta)!=null&&V.filename&&Pe(ve)})}var De=i(H,2),G=i(r(De),2);Ze(G,17,()=>{var Pe;return(Pe=t($).api_ids)!=null&&Pe.length?t($).api_ids:[t($).name]},et,(Pe,V)=>{var U=yd(),J=r(U);z(()=>h(J,t(V))),w("click",U,()=>le(t(V))),p(Pe,U)});var ie=i(fe);Xe(ie,()=>{var Pe;return vt((Pe=t($).meta)==null?void 0:Pe.caps)},!0);var Re=i(ie);Xe(Re,()=>D(t($).meta),!0);var be=i(Re);Xe(be,()=>Uo(t($).state,t($).download_progress),!0);var E=i(be),W=r(E),_e=i(E),te=r(_e),Ie=i(te,2),qe=i(Ie,2),Ge=i(qe,2);z(()=>{h(Me,`${t($).name??""} `),h(W,t($).port??"auto")}),w("click",te,()=>me(t($).name)),w("click",Ie,()=>Oe(t($).name)),w("click",qe,()=>Ve(t($).name)),w("click",Ge,()=>Qe(t($).name)),p(K,Q)};L(we,K=>{t($).incomplete?K(Ce):K(M,-1)})}p(re,ae)}),p(A,B)};L(zt,A=>{t(o).length?A(It,-1):A(Kt)})}var Dt=i(st,2);{var Lt=A=>{var B=Sd(),ke=r(B),re=r(ke),$=i(re,4),ae=r($),we=i($,2),Ce=i(r(we));Xe(Ce,()=>br(a));var M=i(we,2),K=i(M,2);{var Q=ve=>{var De=wd(),G=r(De),ie=i(r(G),2),Re=r(ie),be=i(Re,2),E=i(G,2);z((W,_e)=>{h(Re,`Optimal ~${W??""}k → ~${t(O).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),h(be,` Aktuell ~${_e??""}k → ~${t(O).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(t(O).meta.optimal_ctx/1024),()=>Math.round((t(O).meta.ctx||0)/1024)]),w("click",E,()=>u(S,t(O).meta.optimal_ctx,!0)),p(ve,De)};L(K,ve=>{var De;(De=t(O).meta)!=null&&De.optimal_ctx&&ve(Q)})}var fe=i(K,4),se=i(r(fe),2),Me=r(se),Se=i(Me,2),C=r(Se),H=i(fe,2);z(()=>{h(ae,t(O).name),Ct(Se,`color:${t(F)?"var(--accent)":"var(--mut)"}`),h(C,t(F)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),w("click",B,ve=>{ve.target.classList.contains("modal-overlay")&&u(P,!1)}),w("click",re,()=>u(P,!1)),dn(M,()=>t(S),ve=>u(S,ve)),Ko(Me,()=>t(F),ve=>u(F,ve)),w("click",H,Ee),p(A,B)};L(Dt,A=>{t(P)&&t(O)&&A(Lt)})}var j=i(Dt,2);{var ce=A=>{var B=Ed(),ke=r(B),re=r(ke),$=i(re,2),ae=i(r($));Xe(ae,()=>br(s));var we=i($,2),Ce=r(we),M=i(we,4);Ze(M,21,()=>l,et,(Me,Se)=>{var C=Md(),H=r(C);z(()=>{At(C,1,t(Z)===t(Se).id?"primary":"ghost"),Aa(C,"title",t(Se).desc),h(H,t(Se).label)}),w("click",C,()=>Be(t(Se).id)),p(Me,C)});var K=i(M,4),Q=i(K,2),fe=r(Q),se=i(fe,2);z(()=>h(Ce,t(Ke))),w("click",B,Me=>{Me.target.classList.contains("modal-overlay")&&u(ze,!1)}),w("click",re,()=>u(ze,!1)),dn(K,()=>t(Y),Me=>u(Y,Me)),w("click",fe,()=>Be("")),w("click",se,()=>Be(t(Y).trim().toLowerCase())),p(A,B)};L(j,A=>{t(ze)&&A(ce)})}z(()=>{de.disabled=t(b),h(He,t(b)?"…":"Senden"),h(Tt,t(o).length?t(o).length+" konfiguriert":"")}),Jn(N,()=>t(c),A=>u(c,A)),dn(oe,()=>t(v),A=>u(v,A)),w("click",de,_),p(e,Ae),Pn()}qn(["click"]);var Td=g('
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),zd=g(''),$d=g('
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
'),Pd=g(''),Dd=g(''),Id=g(''),Ld=g('
'),Od=g('
'),Bd=g('
'),Rd=g('
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 Jd(e,n){$n(n,!0);const a=q(()=>xi.value),s=q(()=>fa.value);let l=null,o=I(`Verbinde…
-`),d=I("llama-swap"),c,v=I(null),f=I("");const b=new Set,T=q(()=>t(v)?t(s).find(C=>C.id===t(v)):null);bi(()=>{if(!t(T))return;const C=t(T),H=C.state==="done",ve=C.state==="failed",De=C.state==="canceled";(H||ve||De)&&!b.has(C.id)&&(b.add(C.id),pe(H?`✓ ${t(f)} abgeschlossen.`:De?`${t(f)} abgebrochen.`:`✗ ${t(f)} fehlgeschlagen.`,ve),H&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function _(C,H){u(v,C,!0),u(f,H,!0),fa.track(C)}yi(()=>{y()}),qo(()=>{l==null||l.close()});function y(){l==null||l.close();const C=t(d);u(o,`Verbinde mit ${C}…
-`);const H=location.protocol==="https:"?"wss:":"ws:";l=new WebSocket(`${H}//${location.host}/api/logs/${C}?token=${encodeURIComponent(al())}`),l.onmessage=ve=>{u(o,t(o)+ve.data),c&&(c.scrollTop=c.scrollHeight)},l.onclose=()=>{u(o,t(o)+`
-— Verbindung getrennt —`)},l.onerror=()=>l==null?void 0:l.close()}async function P(C,H,ve){if(await xn({title:H,body:ve,confirmLabel:"Neustarten"}))try{await Te(`/api/service/${C}/restart`,{method:"POST"}),pe("Neustart ausgelöst: "+C),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(De){pe(De.message,!0)}}async function O(){if(await xn({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 Te("/api/self-update",{method:"POST"});pe("Update läuft — Dashboard startet gleich neu."),_(C.job_id,"Mission Control Update")}catch(C){pe(C.message,!0)}}async function S(){if(!await xn({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."}))return;const C=await er({title:"sudo-Passwort",body:"Für das Engine-Update wird einmalig dein sudo-Passwort gebraucht (für den Update-Befehl).",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Update starten"});if(C!==null)try{const H=await Te("/api/update",{method:"POST",body:JSON.stringify({password:C})});pe("LLM-Engine-Update läuft."),_(H.job_id,"LLM-Engine-Update")}catch(H){pe(H.message,!0)}}async function F(){if(await xn({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 Te("/api/unload",{method:"POST"}),pe("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(C){pe(C.message,!0)}}async function Oe(){if(!await xn({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 er({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 H=await Te("/api/os-update",{method:"POST",body:JSON.stringify({password:C})});pe("OS-Update gestartet."),_(H.job_id,"OS-Update")}catch(H){pe(H.message,!0)}}async function Ee(){if(!await xn({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 er({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 Te("/api/reboot",{method:"POST",body:JSON.stringify({password:C})}),pe("Reboot ausgelöst — bis gleich.")}catch(H){pe(H.message,!0)}}async function ze(){u(Ke,"prüfe…");try{const C=await Te("/api/integration/test");u(Ke,C.ok?`✓ Engine antwortet — ${C.models.length} Modell(e): ${C.models.join(", ")}`:`✗ keine Verbindung: ${C.error}`,!0),u(Y,C.ok,!0)}catch(C){u(Ke,"✗ "+C.message),u(Y,!1)}}let Ke=I(""),Y=I(!1);const Z=q(()=>{var C;return((C=t(a))==null?void 0:C.models)||[]}),me=["running","ready","loading","starting"],Be=q(()=>t(Z).find(C=>me.includes(C.state)));function Ve(C){if(!C||C.state!=="running")return null;if(typeof C.progress=="number")return Math.min(100,C.progress);const ve=((C.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return ve?Math.min(100,parseFloat(ve[1])):null}var Qe=Hd(),vt=i(nt(Qe),2),D=r(vt),le=i(r(D),2),Ae=r(le),tt=i(D,4),N=r(tt),oe=i(r(N)),de=r(oe),He=i(N,2),je=i(r(He),2),at=r(je),st=i(He,2),it=i(r(st),2),mt=r(it),Tt=i(tt,2),zt=r(Tt),Kt=i(zt,2);{var It=C=>{var H=Kd(),ve=r(H);z(()=>{Ct(H,`color:${t(Y)?"#7ee29a":"#ff9b95"}`),h(ve,t(Ke))}),p(C,H)};L(Kt,C=>{t(Ke)&&C(It)})}var Dt=i(vt,2),Lt=i(r(Dt),4),j=i(Lt,2),ce=i(j,2),A=i(ce,2),B=i(A,2),ke=i(Dt,2),re=i(r(ke),4),$=i(re,2),ae=i(ke,2);{var we=C=>{const H=q(()=>t(T)),ve=q(()=>t(H).state==="done"),De=q(()=>t(H).state==="failed"),G=q(()=>t(H).state==="canceled"),ie=q(()=>t(ve)||t(De)||t(G)),Re=q(()=>Ve(t(H)));var be=Ud(),E=r(be),W=i(r(E),2);{var _e=ue=>{var ge=Nd();w("click",ge,async()=>{await xn({title:t(f)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&Te(`/api/jobs/${t(H).id}/cancel`,{method:"POST"})}),p(ue,ge)};L(W,ue=>{t(ie)||ue(_e)})}var te=i(W,2),Ie=r(te);{var qe=ue=>{var ge=qd();p(ue,ge)},Ge=ue=>{var ge=Gd();p(ue,ge)},Pe=ue=>{var ge=Vd();p(ue,ge)},V=ue=>{var ge=Wd();p(ue,ge)};L(Ie,ue=>{t(ve)?ue(qe):t(De)?ue(Ge,1):t(G)?ue(Pe,2):ue(V,-1)})}var U=i(E,2),J=r(U),R=i(U,2);{var X=ue=>{var ge=jd(),xt=r(ge);z(()=>Ct(xt,`width:${t(Re)??""}%`)),p(ue,ge)};L(R,ue=>{t(Re)!=null&&!t(ie)&&ue(X)})}var ye=i(R,2),he=r(ye);z(ue=>{h(J,`${t(f)??""}${t(ie)?t(ve)?" — erfolgreich.":t(G)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),h(he,ue)},[()=>(t(H).log||[]).join(`
-`)]),p(C,be)};L(ae,C=>{t(T)&&C(we)})}var Ce=i(ae,2),M=r(Ce),K=i(r(M),2),Q=r(K);Q.value=Q.__value="llama-swap";var fe=i(Q);fe.value=fe.__value="mission-control";var se=i(fe);se.value=se.__value="system";var Me=i(M,4),Se=r(Me);No(Me,C=>c=C,()=>c),z(C=>{var H,ve,De;Ct(le,`margin-left:auto;${(H=t(a))!=null&&H.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"}`),h(Ae,(ve=t(a))!=null&&ve.swap_ok?"● erreichbar":"● offline"),h(de,(((De=t(a))==null?void 0:De.swap_url)||"—")+"/v1"),h(at,t(Be)?t(Be).name+` (${t(Be).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),h(mt,C),h(Se,t(o))},[()=>t(Z).filter(C=>!C.incomplete).length||"keine"]),w("click",zt,ze),w("click",Lt,()=>P("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),w("click",j,()=>P("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),w("click",ce,O),w("click",A,S),w("click",B,F),w("click",re,Oe),w("click",$,Ee),w("change",K,y),Jn(K,()=>t(d),C=>u(d,C)),p(e,Qe),Pn()}qn(["click","change"]);var Qd=g('
Größter Spitzenbedarf: . Es läuft immer nur ein Modell gleichzeitig — das größte bestimmt, ob das Setup passt.
'),mc=g('Alternative: — passt auf dein System.',1),bc=g('
⚠ Dieses Setup übersteigt deinen verfügbaren Speicher.
'),_c=g('
'),yc=g('
Lade Dateien von HuggingFace…
'),Yr=g(""),xc=g('
Empfohlener Kontext für deine Hardware: — übernehmen
'),kc=g('
Ressourcen-Check
'),wc=g('
⚠ Diese Datei ist zu groß für deinen Speicher. Kleinere Alternative: — einfach auswählen.
'),Sc=g('
⚠ Alle Varianten dieses Modells sind zu groß für deinen Speicher. Ein kleineres Modell aus den Empfehlungen wäre die bessere Wahl.
'),Mc=g('
',1),Ec=g('
Keine GGUF-Dateien im Repo gefunden.
'),Ac=g('
'),Cc=g('
'),Tc=g('
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).
'),zc=g('
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,n){$n(n,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr, braucht aber mehr Speicher und wird etwas langsamer.",s="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.",l={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(x){const k=(x||"").toLowerCase();for(const ne of d)if(ne.kw.some(ee=>k.includes(ee)))return ne.label;return"Allrounder"}function v(x=""){const k=x.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(k)||new RegExp("(?{Tt(),zt()});async function Tt(){u(O,!0);try{const x=await Te("/api/cookbook/recipes");u(y,x.recipes||[],!0),u(P,x.recommended_id||null,!0)}catch(x){pe(x.message,!0)}u(O,!1)}async function zt(x=!1){u(F,!0);try{const k=await Te("/api/cookbook/discover"+(x?"?force=true":""));u(S,k,!0),u(Oe,k.stale,!0)}catch(k){pe("Empfehlungen nicht ladbar: "+k.message,!0)}u(F,!1)}function Kt(x){x=x.trim();const k=x.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return k?k[1]:/^[\w.-]+\/[\w.-]+$/.test(x)?x:null}async function It(){const x=t(Ee).trim(),k=Kt(x);let ne=x;if(t(Y)&&!k&&(ne=ne?ne+" "+t(Y):t(Y)),!ne&&!k){u(ze,[],!0);return}u(Ke,!0),u(me,[],!0),u(Be,-1);try{if(k)u(ze,[{id:k,author:k.split("/")[0],downloads:0}],!0);else{const ee=`https://huggingface.co/api/models?search=${encodeURIComponent(ne)}&filter=gguf&sort=${encodeURIComponent(t(Z))}&direction=-1&limit=40`,Le=await fetch(ee);u(ze,await Le.json(),!0)}t(ze).forEach((ee,Le)=>Dt(Le,ee.id))}catch(ee){pe(ee.message,!0),u(ze,[],!0)}u(Ke,!1)}async function Dt(x,k){var ne;try{const ee=await Te("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:k,ctx:8192})});if(!((ne=ee.files)!=null&&ne.length)){t(me)[x]=null,Lt();return}const Le=ee.files.find(bt=>{var kt;return(kt=bt.quant)==null?void 0:kt.includes("Q4_K_M")})||ee.files[0];t(me)[x]=Le.fit.level,Lt()}catch{t(me)[x]=null,Lt()}}function Lt(){let x=-1,k=99;t(me).forEach((ne,ee)=>{if(ne==null)return;const Le=l[ne]??99;Le=0&&k<=1?x:-1,!0)}function j(x){u(Ve,t(y).find(k=>k.id===x),!0)}async function ce(x){const k=document.getElementById("cb-r-install-btn");k&&(k.disabled=!0,k.textContent="Starte…");try{const ne=await Te("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:x,hf_token:di()})});pe(`${ne.count} Download${ne.count!==1?"s":""} läuft — Modelle erscheinen danach automatisch im Modelle-Tab.`),u(Ve,null),mt("activity")}catch(ne){pe(ne.message,!0),k&&(k.disabled=!1,k.textContent="Installieren")}}async function A(x,k){var ne,ee;u(Qe,!0),u(vt,k,!0),u(D,x,!0),u(tt,""),u(N,8192),u(le,null),u(de,null),u(Ae,""),u(oe,!0);try{if(u(le,await Te("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:x,ctx:8192})}),!0),(ee=(ne=t(le))==null?void 0:ne.files)!=null&&ee.length){const Le=t(le).files.find(bt=>{var kt;return(kt=bt.quant)==null?void 0:kt.includes("Q4_K_M")})||t(le).files[0];u(Ae,Le.filename,!0),Le.optimal_ctx&&t(N)===8192&&u(N,Le.optimal_ctx,!0),B()}}catch(Le){pe(Le.message,!0)}u(oe,!1)}function B(){var x,k,ne;!((k=(x=t(le))==null?void 0:x.files)!=null&&k.length)||!t(Ae)||(u(de,t(le).files.find(ee=>ee.filename===t(Ae))||null,!0),(ne=t(de))!=null&&ne.optimal_ctx&&t(N)===8192&&u(N,t(de).optimal_ctx,!0))}async function ke(){var x,k;if(!t(D)||!t(Ae))return pe("Bitte eine GGUF-Datei wählen.",!0);u(oe,!0);try{const ne=((x=t(le))==null?void 0:x.params_b)??7,ee=((k=t(de))==null?void 0:k.quant)??"Q4_K_M";await Te("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:t(D),role:t(tt),params_b:ne,quant:ee,file:t(Ae),ctx:t(N),hf_token:di()})}),pe("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),u(Qe,!1),mt("activity")}catch(ne){pe("Fehler: "+ne.message,!0)}u(oe,!1)}async function re(x,k,ne,ee){ee.disabled=!0,ee.textContent="Starte…";try{await Te("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:x,role:k,params_b:ne,quant:"Q4_K_M",hf_token:di()})}),pe("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),mt("activity")}catch(Le){pe(Le.message,!0),ee.disabled=!1,ee.textContent="Installieren"}}function $(){u(it,null),u(je,""),u(at,""),u(st,[{repo:"",role:"",quant:"Q4_K_M"}],!0),u(He,!0)}function ae(x){const k=t(y).find(ne=>ne.id===x);k&&(u(it,x,!0),u(je,k.title,!0),u(at,k.desc||"",!0),u(st,k.models.map(ne=>({repo:ne.repo,role:ne.role,quant:ne.quant||"Q4_K_M"})),!0),u(He,!0))}async function we(){if(!t(je).trim())return pe("Bitte einen Titel angeben.",!0);const x=t(st).filter(k=>k.repo.trim());if(!x.length)return pe("Mindestens ein Modell (Repo) angeben.",!0);try{t(it)?(await Te("/api/cookbook/user-recipe/"+encodeURIComponent(t(it)),{method:"PUT",body:JSON.stringify({title:t(je),desc:t(at),models:x})}),pe("Setup aktualisiert.")):(await Te("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:t(je),desc:t(at),models:x})}),pe("Setup gespeichert.")),u(He,!1),Tt()}catch(k){pe(k.message,!0)}}async function Ce(x){const k=t(y).find(ne=>ne.id===x);if(await xn({title:`„${(k==null?void 0:k.title)||x}" löschen?`,body:"Dein eigenes Setup wird aus dem Cookbook entfernt. Bereits installierte Modelle bleiben unangetastet.",confirmLabel:"Löschen",danger:!0}))try{await Te("/api/cookbook/user-recipe/"+encodeURIComponent(x),{method:"DELETE"}),pe("Setup gelöscht."),Tt()}catch(ne){pe(ne.message,!0)}}function M(x){if(!v(x))return"";const k=f(x);return`MoE${k?` · ~${k}B aktiv`:""}`}function K(x){return x?`${Fn(x)}`:""}var Q=zc(),fe=i(nt(Q),2),se=r(fe),Me=i(r(se),2),Se=i(se,4);{var C=x=>{var k=Qd();p(x,k)},H=x=>{var k=ec();Ze(k,21,()=>t(y),et,(ne,ee)=>{const Le=q(()=>t(ee).id===t(P));var bt=Xd(),kt=r(bt);{var $e=We=>{var ht=Zd(),Zt=nt(ht),Gt=i(Zt,2);w("click",Zt,Bt=>{Bt.stopPropagation(),ae(t(ee).id)}),w("keydown",Zt,Bt=>{Bt.key==="Enter"&&(Bt.stopPropagation(),ae(t(ee).id))}),w("click",Gt,Bt=>{Bt.stopPropagation(),Ce(t(ee).id)}),w("keydown",Gt,Bt=>{Bt.key==="Enter"&&(Bt.stopPropagation(),Ce(t(ee).id))}),p(We,ht)};L(kt,We=>{t(ee).user&&We($e)})}var Ue=i(kt,2);{var rt=We=>{var ht=tr();p(We,ht)},Mt=We=>{var ht=Yd();p(We,ht)};L(Ue,We=>{t(Le)?We(rt):t(ee).user&&We(Mt,1)})}var lt=i(Ue,2),ct=r(lt),wt=r(ct),Nt=r(wt),rn=i(ct,2),Et=r(rn),ot=i(lt,2),qt=r(ot),Qt=i(ot,2),Pt=r(Qt);z((We,ht)=>{At(bt,1,`card-btn${t(Le)?" cb-best":""}`),h(Nt,t(ee).title),At(rn,1,`fit-badge ${We??""}`),h(Et,ht),h(qt,t(ee).desc),h(Pt,`${t(ee).models.length??""} Modell${t(ee).models.length>1?"e":""} im Setup`)},[()=>b(t(ee).fit_level),()=>T(t(ee).fit_level)]),w("click",bt,()=>j(t(ee).id)),p(ne,bt)}),p(x,k)};L(Se,x=>{t(O)?x(C):x(H,-1)})}var ve=i(fe,2),De=r(ve),G=i(r(De),2),ie=r(G);{var Re=x=>{const k=q(()=>Math.round((Date.now()/1e3-t(S).updated)/60));var ne=nc(),ee=nt(ne);{var Le=rt=>{var Mt=li();z(()=>h(Mt,`Quellen befragt vor ${t(k)??""} min`)),p(rt,Mt)},bt=rt=>{var Mt=li();z(lt=>h(Mt,`Quellen befragt vor ${lt??""} h`),[()=>Math.round(t(k)/60)]),p(rt,Mt)},kt=rt=>{var Mt=li();z(lt=>h(Mt,`Quellen befragt vor ${lt??""} Tg.`),[()=>Math.round(t(k)/1440)]),p(rt,Mt)};L(ee,rt=>{t(k)<60?rt(Le):t(k)<1440?rt(bt,1):rt(kt,-1)})}var $e=i(ee,2);{var Ue=rt=>{var Mt=tc();p(rt,Mt)};L($e,rt=>{t(Oe)&&rt(Ue)})}p(x,ne)};L(ie,x=>{var k;(k=t(S))!=null&&k.updated&&x(Re)})}var be=i(G,2),E=r(be),W=i(De,4);{var _e=x=>{var k=ac();p(x,k)},te=x=>{var k=Ua(),ne=nt(k);Ze(ne,17,()=>t(S).categories,et,(ee,Le)=>{var bt=oc(),kt=r(bt),$e=r(kt),Ue=r($e),rt=i(kt,2);Ze(rt,21,()=>t(Le).models,et,(Mt,lt)=>{const ct=q(()=>t(Le).recommended&&t(lt).repo===t(Le).recommended);var wt=lc(),Nt=r(wt);{var rn=gt=>{var yt=tr();p(gt,yt)};L(Nt,gt=>{t(ct)&>(rn)})}var Et=i(Nt,2),ot=r(Et),qt=r(ot),Qt=r(qt),Pt=i(qt,2),We=r(Pt),ht=i(ot,2),Zt=r(ht),Gt=i(Et,2),Bt=r(Gt);Xe(Bt,()=>K(o[t(lt).role]||c(t(lt).repo)));var Gn=i(Bt,2);Xe(Gn,()=>M(t(lt).repo));var Yn=i(Gt,2),Dn=r(Yn),Ca=i(Yn,2);Ze(Ca,17,()=>t(lt).requirements||[],et,(gt,yt)=>{var Wt=ic(),In=r(Wt);z(()=>h(In,`⚠ ${t(yt)??""}`)),p(gt,Wt)});var St=i(Ca,4),ut=r(St);{var _t=gt=>{var yt=rc();z(()=>Aa(yt,"title",`bereits eingerichtet als ${t(lt).installed??""}`)),p(gt,yt)},Rt=gt=>{var yt=sc();w("click",yt,Wt=>re(t(lt).repo,t(lt).role,t(lt).params_b,Wt.currentTarget)),p(gt,yt)};L(ut,gt=>{t(lt).installed?gt(_t):gt(Rt,-1)})}z((gt,yt,Wt)=>{At(wt,1,`card${t(ct)?" res-best":""}`),h(Qt,t(lt).name),h(We,`${t(lt).author??""} · ${t(lt).params_b??""}B`),At(ht,1,`fit-badge ${gt??""}`),h(Zt,t(lt).fit.text),h(Dn,`${yt??""} · ⬇ ${Wt??""}`)},[()=>b(t(lt).fit.level),()=>_(t(lt).fit),()=>(t(lt).downloads||0).toLocaleString()]),p(Mt,wt)}),z(()=>h(Ue,t(Le).title)),p(ee,bt)}),p(x,k)};L(W,x=>{var k;t(F)&&!t(S)?x(_e):(k=t(S))!=null&&k.categories&&x(te,1)})}var Ie=i(ve,2),qe=i(r(Ie),4),Ge=r(qe),Pe=i(Ge,2),V=r(Pe);V.value=V.__value="downloads";var U=i(V);U.value=U.__value="trending";var J=i(U);J.value=J.__value="created_at";var R=i(Pe,2),X=r(R),ye=i(qe,2);Ze(ye,20,()=>["","coder","vision","reasoning","chat","agent"],et,(x,k)=>{var ne=dc(),ee=r(ne);z(()=>{At(ne,1,t(Y)===k?"primary":"ghost"),h(ee,k||"Alle")}),w("click",ne,()=>{u(Y,k,!0),It()}),p(x,ne)});var he=i(ye,2);{var ue=x=>{var k=vc();Ze(k,21,()=>t(ze),et,(ne,ee,Le)=>{var bt=cc(),kt=r(bt);{var $e=Gt=>{var Bt=tr();p(Gt,Bt)};L(kt,Gt=>{Le===t(Be)&&Gt($e)})}var Ue=i(kt,2),rt=r(Ue),Mt=r(rt),lt=r(Mt),ct=i(Mt,2),wt=r(ct),Nt=i(rt,2),rn=r(Nt),Et=i(Ue,2),ot=r(Et);Xe(ot,()=>K(c(t(ee).id)));var qt=i(ot,2);Xe(qt,()=>M(t(ee).id));var Qt=i(Et,4),Pt=r(Qt),We=r(Pt),ht=i(Pt,2),Zt=r(ht);z((Gt,Bt,Gn,Yn,Dn)=>{At(bt,1,`card${Le===t(Be)?" res-best":""}`),h(lt,Gt),h(wt,t(ee).author||""),At(Nt,1,`fit-badge ${Bt??""}`),h(rn,Gn),h(We,Yn),h(Zt,`⬇ ${Dn??""}`)},[()=>t(ee).id.split("/").pop(),()=>t(me)[Le]?b(t(me)[Le]):"warn",()=>t(me)[Le]?T(t(me)[Le]):"prüfe…",()=>t(me)[Le]?_({req_gb:0,tps:0}):"Hardware-Fit…",()=>(t(ee).downloads||0).toLocaleString()]),w("click",bt,()=>A(t(ee).id,t(ee).id.split("/").pop())),p(ne,bt)}),p(x,k)};L(he,x=>{t(ze).length&&x(ue)})}var ge=i(Ie,2);{var xt=x=>{const k=q(()=>t(Ve));var ne=_c(),ee=r(ne),Le=r(ee),bt=i(Le,2),kt=r(bt),$e=i(bt,2),Ue=r($e),rt=i($e,2);Ze(rt,21,()=>t(k).models,et,(Et,ot)=>{var qt=hc(),Qt=r(qt),Pt=r(Qt),We=r(Pt),ht=r(We),Zt=i(We,2),Gt=r(Zt),Bt=i(Zt,2);Xe(Bt,()=>M(t(ot).repo));var Gn=i(Pt,2);{var Yn=_t=>{var Rt=uc(),gt=r(Rt);z(()=>h(gt,t(ot).why)),p(_t,Rt)};L(Gn,_t=>{t(ot).why&&_t(Yn)})}var Dn=i(Gn,2);{var Ca=_t=>{var Rt=pc(),gt=r(Rt);z((yt,Wt,In)=>h(gt,`~${yt??""} GB · ~${Wt??""} Tok/s · optimal ~${In??""}k Kontext`),[()=>(t(ot).fit.req_gb??0).toFixed(1),()=>Math.round(t(ot).fit.tps??0),()=>Math.round((t(ot).optimal_ctx||8192)/1024)]),p(_t,Rt)};L(Dn,_t=>{t(ot).fit&&_t(Ca)})}var St=i(Qt,2);{var ut=_t=>{var Rt=fc(),gt=r(Rt);z(yt=>{At(Rt,1,`fit-badge ${yt??""}`),h(gt,t(ot).fit.text)},[()=>b(t(ot).fit.level)]),p(_t,Rt)};L(St,_t=>{t(ot).fit&&_t(ut)})}z(()=>{h(ht,t(ot).name),h(Gt,t(ot).role)}),p(Et,qt)});var Mt=i(rt,2);{var lt=Et=>{const ot=q(()=>Math.max(...t(k).models.map(We=>{var ht;return((ht=We.fit)==null?void 0:ht.req_gb)??0})));var qt=gc(),Qt=i(r(qt)),Pt=r(Qt);z(We=>h(Pt,`~${We??""} GB`),[()=>t(ot).toFixed(1)]),p(Et,qt)};L(Mt,Et=>{t(k).models.length&&t(k).models[0].fit&&Et(lt)})}var ct=i(Mt,2);{var wt=Et=>{const ot=q(()=>t(y).find(We=>!We.user&&We.fit_level!=="too_tight"&&We.id!==t(k).id));var qt=bc(),Qt=i(r(qt));{var Pt=We=>{var ht=mc(),Zt=i(nt(ht)),Gt=r(Zt);z(()=>h(Gt,`„${t(ot).title??""}" ansehen`)),w("click",Zt,Bt=>{Bt.preventDefault(),u(Ve,null),setTimeout(()=>j(t(ot).id),50)}),p(We,ht)};L(Qt,We=>{t(ot)&&We(Pt)})}p(Et,qt)};L(ct,Et=>{t(k).fit_level==="too_tight"&&Et(wt)})}var Nt=i(ct,2),rn=r(Nt);z(()=>{h(kt,t(k).title),h(Ue,t(k).desc),At(Nt,1,`primary${t(k).fit_level==="too_tight"?" warn":""}`),h(rn,t(k).fit_level==="too_tight"?"Trotzdem installieren (nicht empfohlen)":"Komplettes Setup installieren")}),w("click",ne,Et=>{Et.target.classList.contains("modal-overlay")&&u(Ve,null)}),w("click",Le,()=>u(Ve,null)),w("click",Nt,()=>ce(t(k).id)),p(x,ne)};L(ge,x=>{t(Ve)&&x(xt)})}var $t=i(ge,2);{var Ot=x=>{var k=Ac(),ne=r(k),ee=r(ne),Le=i(ee,2),bt=r(Le),kt=i(Le,2),$e=r(kt),Ue=i(kt,2);{var rt=ct=>{var wt=yc();p(ct,wt)},Mt=ct=>{var wt=Mc(),Nt=i(nt(wt),2);Ze(Nt,21,()=>t(le).files,et,(St,ut)=>{const _t=q(()=>t(ut).fit.level==="perfect"?"●":t(ut).fit.level==="marginal"?"◐":"○");var Rt=Yr(),gt=r(Rt),yt={};z(()=>{h(gt,`${t(_t)??""} ${t(ut).filename??""}`),yt!==(yt=t(ut).filename)&&(Rt.value=(Rt.__value=t(ut).filename)??"")}),p(St,Rt)});var rn=i(Nt,2),Et=r(rn),ot=i(r(Et),2),qt=i(Et,2),Qt=r(qt),Pt=i(r(Qt));Xe(Pt,()=>br(a));var We=i(Qt,2),ht=i(rn,2);{var Zt=St=>{var ut=xc(),_t=i(r(ut)),Rt=r(_t),gt=i(_t,2);z(yt=>h(Rt,`~${yt??""}k`),[()=>Math.round(t(de).optimal_ctx/1024)]),w("click",gt,yt=>{yt.preventDefault(),u(N,t(de).optimal_ctx,!0)}),p(St,ut)};L(ht,St=>{var ut;(ut=t(de))!=null&&ut.optimal_ctx&&St(Zt)})}var Gt=i(ht,2);{var Bt=St=>{var ut=kc(),_t=r(ut),Rt=i(r(_t),2),gt=r(Rt),yt=i(_t,2),Wt=r(yt);z((In,ki,Wi)=>{h(gt,`~${In??""} GB · ~${ki??""} Tok/s · ${(t(de).quant||"GGUF")??""}`),At(yt,1,`fit-badge ${Wi??""}`),h(Wt,t(de).fit.text)},[()=>(t(de).fit.req_gb??0).toFixed(1),()=>Math.round(t(de).fit.tps??0),()=>b(t(de).fit.level)]),p(St,ut)};L(Gt,St=>{t(de)&&St(Bt)})}var Gn=i(Gt,2);{var Yn=St=>{const ut=q(()=>t(le).files.find(Wt=>Wt.fit.level!=="too_tight"&&Wt.filename!==t(Ae)));var _t=Ua(),Rt=nt(_t);{var gt=Wt=>{var In=wc(),ki=i(r(In)),Wi=r(ki);z(ji=>h(Wi,`${t(ut).filename??""} (${ji??""})`),[()=>T(t(ut).fit.level)]),w("click",ki,ji=>{ji.preventDefault(),u(Ae,t(ut).filename,!0),B()}),p(Wt,In)},yt=Wt=>{var In=Sc();p(Wt,In)};L(Rt,Wt=>{t(ut)?Wt(gt):Wt(yt,-1)})}p(St,_t)};L(Gn,St=>{var ut,_t;((ut=t(de))==null?void 0:ut.fit.level)==="too_tight"&&((_t=t(le))!=null&&_t.files)&&St(Yn)})}var Dn=i(Gn,2),Ca=r(Dn);z(()=>{var St,ut;At(Dn,1,`primary${((St=t(de))==null?void 0:St.fit.level)==="too_tight"?" warn":""}`),Dn.disabled=t(oe),h(Ca,t(oe)?"Starte…":((ut=t(de))==null?void 0:ut.fit.level)==="too_tight"?"Trotzdem holen (zu groß — nicht empfohlen)":"Herunterladen & Einpflegen")}),w("change",Nt,B),Jn(Nt,()=>t(Ae),St=>u(Ae,St)),dn(ot,()=>t(tt),St=>u(tt,St)),dn(We,()=>t(N),St=>u(N,St)),w("click",Dn,ke),p(ct,wt)},lt=ct=>{var wt=Ec();p(ct,wt)};L(Ue,ct=>{var wt,Nt;t(oe)&&!t(le)?ct(rt):(Nt=(wt=t(le))==null?void 0:wt.files)!=null&&Nt.length?ct(Mt,1):t(oe)||ct(lt,2)})}z(()=>{h(bt,t(vt)),h($e,t(D))}),w("click",k,ct=>{ct.target.classList.contains("modal-overlay")&&u(Qe,!1)}),w("click",ee,()=>u(Qe,!1)),p(x,k)};L($t,x=>{t(Qe)&&x(Ot)})}var hn=i($t,2);{var da=x=>{var k=Tc(),ne=r(k),ee=r(ne),Le=i(ee,2),bt=r(Le),kt=i(Le,6),$e=i(kt,4),Ue=i($e,4);Ze(Ue,17,()=>t(st),et,(ct,wt,Nt)=>{var rn=Cc(),Et=r(rn),ot=i(Et,2),qt=i(ot,2);Ze(qt,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],et,(Pt,We)=>{var ht=Yr(),Zt=r(ht),Gt={};z(()=>{h(Zt,We),Gt!==(Gt=We)&&(ht.__value=We)}),p(Pt,ht)});var Qt=i(qt,2);dn(Et,()=>t(wt).repo,Pt=>t(wt).repo=Pt),dn(ot,()=>t(wt).role,Pt=>t(wt).role=Pt),Jn(qt,()=>t(wt).quant,Pt=>t(wt).quant=Pt),w("click",Qt,()=>u(st,t(st).filter((Pt,We)=>We!==Nt),!0)),p(ct,rn)});var rt=i(Ue,2),Mt=i(rt,4),lt=r(Mt);z(()=>{h(bt,t(it)?"Setup bearbeiten":"Eigenes Setup erstellen"),h(lt,t(it)?"Änderungen speichern":"Setup speichern")}),w("click",k,ct=>{ct.target.classList.contains("modal-overlay")&&u(He,!1)}),w("click",ee,()=>u(He,!1)),dn(kt,()=>t(je),ct=>u(je,ct)),dn($e,()=>t(at),ct=>u(at,ct)),w("click",rt,()=>u(st,[...t(st),{repo:"",role:"",quant:"Q4_K_M"}],!0)),w("click",Mt,we),p(x,k)};L(hn,x=>{t(He)&&x(da)})}z(()=>{be.disabled=t(F),h(E,t(F)?"Suche…":"Aktualisieren"),R.disabled=t(Ke),h(X,t(Ke)?"Lade…":"Suchen")}),w("click",Me,$),w("click",be,()=>zt(!0)),w("keydown",Ge,x=>x.key==="Enter"&&It()),dn(Ge,()=>t(Ee),x=>u(Ee,x)),Jn(Pe,()=>t(Z),x=>u(Z,x)),w("click",R,It),p(e,Q),Pn()}qn(["click","keydown","change"]);var Pc=g(`
Du öffnest Mission Control über einen Proxy/Namen. Die Engine läuft auf Port 8080 ohne HTTPS direkt am Bosgame.
+
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.
'),Md=g(''),Ed=g('
Rolle festlegen
Wähle eine Rolle als zweiten, sprechenden Namen. In deinen Tools funktionieren danach beide: der echte Modellname und die Rolle.
'),Ad=g('
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 Cd(e,n){$n(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.",s="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.",l=[{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 F;return((F=xi.value)==null?void 0:F.models)||[]});function d(){document.dispatchEvent(new Event("mc:refresh"))}let c=I(""),v=I(""),f=I(""),b=I(!1);const T=q(()=>t(o).filter(F=>!F.incomplete));async function _(){var Y;const F=t(c)||((Y=t(T)[0])==null?void 0:Y.name);if(!(!F||!t(v).trim())){u(b,!0),u(f,"(wecke Modell, kann beim Laden kurz dauern…)");try{const $=await we("/api/chat",{method:"POST",body:JSON.stringify({model:F,message:t(v)})});u(f,$.reply,!0)}catch($){u(f,"Fehler: "+$.message)}u(b,!1),d()}}const y=300;let P=I(!1),O=I(null),M=I(8192),K=I(!1);function Oe(F){var Y;u(O,t(o).find($=>$.name===F),!0),t(O)&&(u(M,((Y=t(O).meta)==null?void 0:Y.ctx)||8192,!0),u(K,(t(O).ttl??y)>=99999),u(P,!0))}async function Ee(){const F=t(K)?99999:y;try{await we("/api/update_model",{method:"POST",body:JSON.stringify({alias:t(O).name,ctx:t(M),ttl:F})}),ce("Gespeichert — aktiv beim nächsten Modell-Start."),u(P,!1),d()}catch(Y){ce(Y.message,!0)}}let Ce=I(!1),Re=I(""),te=I(""),X=I("");function be(F){const Y=t(o).find($=>$.name===F);u(Re,F,!0),u(X,(Y==null?void 0:Y.role)||"",!0),u(te,""),u(Ce,!0)}async function Be(F){try{await we("/api/set_role",{method:"POST",body:JSON.stringify({alias:t(Re),role:F})}),ce(F?`Rolle gesetzt: ${F}`:"Rolle entfernt."),u(Ce,!1),d()}catch(Y){ce(Y.message,!0)}}async function Ne(F){if(await hn({title:`„${F}" 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(F),{method:"POST"}),ce("Entladen: "+F),setTimeout(d,600)}catch(Y){ce(Y.message,!0)}}async function Ze(F){if(await hn({title:`„${F}" 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 Y=await we("/api/delete_model",{method:"POST",body:JSON.stringify({alias:F})});ce(Y.note||"Gelöscht: "+F),setTimeout(d,600)}catch(Y){ce(Y.message,!0)}}function ut(F){return F!=null&&F.length?F.map(Y=>Y==="Code"?'Code':Y==="Bild"?'Bild':'Text').join(" "):"–"}function D(F){if(!F)return"–";const Y=F.quant||"?",$=F.ctx?Math.round(F.ctx/1024)+"K":"?",G=F.size_bytes?(F.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${Y} · ${$} · ${G}`}function ue(F){var Y;(Y=navigator.clipboard)==null||Y.writeText(F),ce("Kopiert: "+F)}var Ae=Ad(),He=i(tt(Ae),2),N=i(r(He),6);Je(N,21,()=>t(T),Xe,(F,Y)=>{var $=fd(),G=r($),E={};z(()=>{h(G,t(Y).name),E!==(E=t(Y).name)&&($.value=($.__value=t(Y).name)??"")}),p(F,$)});var ve=i(N,4),pe=i(ve,2),je=r(pe),Ve=i(pe,2);{var nt=F=>{var Y=hd(),$=r(Y);z(()=>h($,t(f))),p(F,Y)};L(Ve,F=>{t(f)&&F(nt)})}var it=i(He,2),et=r(it),bt=i(r(et)),wt=r(bt),Ct=i(et,4);{var Kt=F=>{var Y=gd();p(F,Y)},Pt=F=>{var Y=kd(),$=i(r(Y));Je($,21,()=>t(o),Xe,(G,E)=>{var Z=Ua(),ke=tt(Z);{var Pe=B=>{var se=md(),ie=r(se),ee=r(ie),Se=i(ie,5),de=r(Se),A=i(de,2);z(()=>h(ee,t(E).name)),S("click",de,()=>{var j;ce("Lade im Cookbook ein Modell und setze den Alias auf: "+t(E).name),(j=document.querySelector(".nav-item[data-view='cookbook']"))==null||j.dispatchEvent(new MouseEvent("click"))}),S("click",A,()=>Ze(t(E).name)),p(B,se)},C=B=>{var se=xd(),ie=r(se),ee=r(ie),Se=r(ee),de=i(Se);{var A=De=>{var W=bd(),J=r(W);z(()=>h(J,t(E).role)),p(De,W)};L(de,De=>{t(E).role&&De(A)})}var j=i(ee,2);{var oe=De=>{var W=_d(),J=r(W);z(()=>h(J,t(E).meta.filename)),p(De,W)};L(j,De=>{var W;(W=t(E).meta)!=null&&W.filename&&De(oe)})}var Me=i(j,2),U=i(r(Me),2);Je(U,17,()=>{var De;return(De=t(E).api_ids)!=null&&De.length?t(E).api_ids:[t(E).name]},Xe,(De,W)=>{var J=yd(),Q=r(J);z(()=>h(Q,t(W))),S("click",J,()=>ue(t(W))),p(De,J)});var le=i(ie);Ye(le,()=>{var De;return ut((De=t(E).meta)==null?void 0:De.caps)},!0);var Te=i(le);Ye(Te,()=>D(t(E).meta),!0);var ze=i(Te);Ye(ze,()=>Uo(t(E).state,t(E).download_progress),!0);var x=i(ze),H=r(x),he=i(x),V=r(he),xe=i(V,2),Ie=i(xe,2),Fe=i(Ie,2);z(()=>{h(Se,`${t(E).name??""} `),h(H,t(E).port??"auto")}),S("click",V,()=>be(t(E).name)),S("click",xe,()=>Oe(t(E).name)),S("click",Ie,()=>Ne(t(E).name)),S("click",Fe,()=>Ze(t(E).name)),p(B,se)};L(ke,B=>{t(E).incomplete?B(Pe):B(C,-1)})}p(G,Z)}),p(F,Y)};L(Ct,F=>{t(o).length?F(Pt,-1):F(Kt)})}var Dt=i(it,2);{var Lt=F=>{var Y=Sd(),$=r(Y),G=r($),E=i(G,4),Z=r(E),ke=i(E,2),Pe=i(r(ke));Ye(Pe,()=>br(a));var C=i(ke,2),B=i(C,2);{var se=oe=>{var Me=wd(),U=r(Me),le=i(r(U),2),Te=r(le),ze=i(Te,2),x=i(U,2);z((H,he)=>{h(Te,`Optimal ~${H??""}k → ~${t(O).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),h(ze,` Aktuell ~${he??""}k → ~${t(O).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(t(O).meta.optimal_ctx/1024),()=>Math.round((t(O).meta.ctx||0)/1024)]),S("click",x,()=>u(M,t(O).meta.optimal_ctx,!0)),p(oe,Me)};L(B,oe=>{var Me;(Me=t(O).meta)!=null&&Me.optimal_ctx&&oe(se)})}var ie=i(B,4),ee=i(r(ie),2),Se=r(ee),de=i(Se,2),A=r(de),j=i(ie,2);z(()=>{h(Z,t(O).name),At(de,`color:${t(K)?"var(--accent)":"var(--mut)"}`),h(A,t(K)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),S("click",Y,oe=>{oe.target.classList.contains("modal-overlay")&&u(P,!1)}),S("click",G,()=>u(P,!1)),dn(C,()=>t(M),oe=>u(M,oe)),Ko(Se,()=>t(K),oe=>u(K,oe)),S("click",j,Ee),p(F,Y)};L(Dt,F=>{t(P)&&t(O)&&F(Lt)})}var It=i(Dt,2);{var Tt=F=>{var Y=Ed(),$=r(Y),G=r($),E=i(G,2),Z=i(r(E));Ye(Z,()=>br(s));var ke=i(E,2),Pe=r(ke),C=i(ke,4);Je(C,21,()=>l,Xe,(Se,de)=>{var A=Md(),j=r(A);z(()=>{Et(A,1,t(X)===t(de).id?"primary":"ghost"),Aa(A,"title",t(de).desc),h(j,t(de).label)}),S("click",A,()=>Be(t(de).id)),p(Se,A)});var B=i(C,4),se=i(B,2),ie=r(se),ee=i(ie,2);z(()=>h(Pe,t(Re))),S("click",Y,Se=>{Se.target.classList.contains("modal-overlay")&&u(Ce,!1)}),S("click",G,()=>u(Ce,!1)),dn(B,()=>t(te),Se=>u(te,Se)),S("click",ie,()=>Be("")),S("click",ee,()=>Be(t(te).trim().toLowerCase())),p(F,Y)};L(It,F=>{t(Ce)&&F(Tt)})}z(()=>{pe.disabled=t(b),h(je,t(b)?"…":"Senden"),h(wt,t(o).length?t(o).length+" konfiguriert":"")}),Jn(N,()=>t(c),F=>u(c,F)),dn(ve,()=>t(v),F=>u(v,F)),S("click",pe,_),p(e,Ae),Pn()}qn(["click"]);var Td=g('
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),zd=g(''),$d=g('
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
'),Pd=g(''),Dd=g(''),Id=g(''),Ld=g('
'),Od=g('
'),Bd=g('
'),Rd=g('
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 Jd(e,n){$n(n,!0);const a=q(()=>xi.value),s=q(()=>fa.value);let l=null,o=I(`Verbinde…
+`),d=I("llama-swap"),c,v=I(null),f=I("");const b=new Set,T=q(()=>t(v)?t(s).find(A=>A.id===t(v)):null);bi(()=>{if(!t(T))return;const A=t(T),j=A.state==="done",oe=A.state==="failed",Me=A.state==="canceled";(j||oe||Me)&&!b.has(A.id)&&(b.add(A.id),ce(j?`✓ ${t(f)} abgeschlossen.`:Me?`${t(f)} abgebrochen.`:`✗ ${t(f)} fehlgeschlagen.`,oe),j&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function _(A,j){u(v,A,!0),u(f,j,!0),fa.track(A)}yi(()=>{y()}),qo(()=>{l==null||l.close()});function y(){l==null||l.close();const A=t(d);u(o,`Verbinde mit ${A}…
+`);const j=location.protocol==="https:"?"wss:":"ws:";l=new WebSocket(`${j}//${location.host}/api/logs/${A}?token=${encodeURIComponent(al())}`),l.onmessage=oe=>{u(o,t(o)+oe.data),c&&(c.scrollTop=c.scrollHeight)},l.onclose=()=>{u(o,t(o)+`
+— Verbindung getrennt —`)},l.onerror=()=>l==null?void 0:l.close()}async function P(A,j,oe){if(await hn({title:j,body:oe,confirmLabel:"Neustarten"}))try{await we(`/api/service/${A}/restart`,{method:"POST"}),ce("Neustart ausgelöst: "+A),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(Me){ce(Me.message,!0)}}async function O(){if(await hn({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 A=await we("/api/self-update",{method:"POST"});ce("Update läuft — Dashboard startet gleich neu."),_(A.job_id,"Mission Control Update")}catch(A){ce(A.message,!0)}}async function M(){if(!await hn({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."}))return;const A=await er({title:"sudo-Passwort",body:"Für das Engine-Update wird einmalig dein sudo-Passwort gebraucht (für den Update-Befehl).",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Update starten"});if(A!==null)try{const j=await we("/api/update",{method:"POST",body:JSON.stringify({password:A})});ce("LLM-Engine-Update läuft."),_(j.job_id,"LLM-Engine-Update")}catch(j){ce(j.message,!0)}}async function K(){if(await hn({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"}),ce("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(A){ce(A.message,!0)}}async function Oe(){if(!await hn({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 A=await er({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(A)try{const j=await we("/api/os-update",{method:"POST",body:JSON.stringify({password:A})});ce("OS-Update gestartet."),_(j.job_id,"OS-Update")}catch(j){ce(j.message,!0)}}async function Ee(){if(!await hn({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 A=await er({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(A)try{await we("/api/reboot",{method:"POST",body:JSON.stringify({password:A})}),ce("Reboot ausgelöst — bis gleich.")}catch(j){ce(j.message,!0)}}async function Ce(){u(Re,"prüfe…");try{const A=await we("/api/integration/test");u(Re,A.ok?`✓ Engine antwortet — ${A.models.length} Modell(e): ${A.models.join(", ")}`:`✗ keine Verbindung: ${A.error}`,!0),u(te,A.ok,!0)}catch(A){u(Re,"✗ "+A.message),u(te,!1)}}let Re=I(""),te=I(!1);const X=q(()=>{var A;return((A=t(a))==null?void 0:A.models)||[]}),be=["running","ready","loading","starting"],Be=q(()=>t(X).find(A=>be.includes(A.state)));function Ne(A){if(!A||A.state!=="running")return null;if(typeof A.progress=="number")return Math.min(100,A.progress);const oe=((A.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return oe?Math.min(100,parseFloat(oe[1])):null}var Ze=Hd(),ut=i(tt(Ze),2),D=r(ut),ue=i(r(D),2),Ae=r(ue),He=i(D,4),N=r(He),ve=i(r(N)),pe=r(ve),je=i(N,2),Ve=i(r(je),2),nt=r(Ve),it=i(je,2),et=i(r(it),2),bt=r(et),wt=i(He,2),Ct=r(wt),Kt=i(Ct,2);{var Pt=A=>{var j=Kd(),oe=r(j);z(()=>{At(j,`color:${t(te)?"#7ee29a":"#ff9b95"}`),h(oe,t(Re))}),p(A,j)};L(Kt,A=>{t(Re)&&A(Pt)})}var Dt=i(ut,2),Lt=i(r(Dt),4),It=i(Lt,2),Tt=i(It,2),F=i(Tt,2),Y=i(F,2),$=i(Dt,2),G=i(r($),4),E=i(G,2),Z=i($,2);{var ke=A=>{const j=q(()=>t(T)),oe=q(()=>t(j).state==="done"),Me=q(()=>t(j).state==="failed"),U=q(()=>t(j).state==="canceled"),le=q(()=>t(oe)||t(Me)||t(U)),Te=q(()=>Ne(t(j)));var ze=Ud(),x=r(ze),H=i(r(x),2);{var he=fe=>{var me=Nd();S("click",me,async()=>{await hn({title:t(f)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&we(`/api/jobs/${t(j).id}/cancel`,{method:"POST"})}),p(fe,me)};L(H,fe=>{t(le)||fe(he)})}var V=i(H,2),xe=r(V);{var Ie=fe=>{var me=qd();p(fe,me)},Fe=fe=>{var me=Gd();p(fe,me)},De=fe=>{var me=Vd();p(fe,me)},W=fe=>{var me=Wd();p(fe,me)};L(xe,fe=>{t(oe)?fe(Ie):t(Me)?fe(Fe,1):t(U)?fe(De,2):fe(W,-1)})}var J=i(x,2),Q=r(J),R=i(J,2);{var ne=fe=>{var me=jd(),_t=r(me);z(()=>At(_t,`width:${t(Te)??""}%`)),p(fe,me)};L(R,fe=>{t(Te)!=null&&!t(le)&&fe(ne)})}var _e=i(R,2),ge=r(_e);z(fe=>{h(Q,`${t(f)??""}${t(le)?t(oe)?" — erfolgreich.":t(U)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),h(ge,fe)},[()=>(t(j).log||[]).join(`
+`)]),p(A,ze)};L(Z,A=>{t(T)&&A(ke)})}var Pe=i(Z,2),C=r(Pe),B=i(r(C),2),se=r(B);se.value=se.__value="llama-swap";var ie=i(se);ie.value=ie.__value="mission-control";var ee=i(ie);ee.value=ee.__value="system";var Se=i(C,4),de=r(Se);No(Se,A=>c=A,()=>c),z(A=>{var j,oe,Me;At(ue,`margin-left:auto;${(j=t(a))!=null&&j.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"}`),h(Ae,(oe=t(a))!=null&&oe.swap_ok?"● erreichbar":"● offline"),h(pe,(((Me=t(a))==null?void 0:Me.swap_url)||"—")+"/v1"),h(nt,t(Be)?t(Be).name+` (${t(Be).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),h(bt,A),h(de,t(o))},[()=>t(X).filter(A=>!A.incomplete).length||"keine"]),S("click",Ct,Ce),S("click",Lt,()=>P("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),S("click",It,()=>P("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),S("click",Tt,O),S("click",F,M),S("click",Y,K),S("click",G,Oe),S("click",E,Ee),S("change",B,y),Jn(B,()=>t(d),A=>u(d,A)),p(e,Ze),Pn()}qn(["click","change"]);var Qd=g('
Größter Spitzenbedarf: . Es läuft immer nur ein Modell gleichzeitig — das größte bestimmt, ob das Setup passt.
'),mc=g('Alternative: — passt auf dein System.',1),bc=g('
⚠ Dieses Setup übersteigt deinen verfügbaren Speicher.
'),_c=g('
'),yc=g('
Lade Dateien von HuggingFace…
'),Yr=g(""),xc=g('
Empfohlener Kontext für deine Hardware: — übernehmen
'),kc=g('
Ressourcen-Check
'),wc=g('
⚠ Diese Datei ist zu groß für deinen Speicher. Kleinere Alternative: — einfach auswählen.
'),Sc=g('
⚠ Alle Varianten dieses Modells sind zu groß für deinen Speicher. Ein kleineres Modell aus den Empfehlungen wäre die bessere Wahl.
'),Mc=g('
',1),Ec=g('
Keine GGUF-Dateien im Repo gefunden.
'),Ac=g('
'),Cc=g('
'),Tc=g('
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).
'),zc=g('
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,n){$n(n,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr, braucht aber mehr Speicher und wird etwas langsamer.",s="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.",l={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 w=(k||"").toLowerCase();for(const re of d)if(re.kw.some(ae=>w.includes(ae)))return re.label;return"Allrounder"}function v(k=""){const w=k.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(w)||new RegExp("(?{wt(),Ct()});async function wt(){u(O,!0);try{const k=await we("/api/cookbook/recipes");u(y,k.recipes||[],!0),u(P,k.recommended_id||null,!0)}catch(k){ce(k.message,!0)}u(O,!1)}async function Ct(k=!1){u(K,!0);try{const w=await we("/api/cookbook/discover"+(k?"?force=true":""));u(M,w,!0),u(Oe,w.stale,!0)}catch(w){ce("Empfehlungen nicht ladbar: "+w.message,!0)}u(K,!1)}function Kt(k){k=k.trim();const w=k.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return w?w[1]:/^[\w.-]+\/[\w.-]+$/.test(k)?k:null}async function Pt(){const k=t(Ee).trim(),w=Kt(k);let re=k;if(t(te)&&!w&&(re=re?re+" "+t(te):t(te)),!re&&!w){u(Ce,[],!0);return}u(Re,!0),u(be,[],!0),u(Be,-1);try{if(w)u(Ce,[{id:w,author:w.split("/")[0],downloads:0}],!0);else{const ae=`https://huggingface.co/api/models?search=${encodeURIComponent(re)}&filter=gguf&sort=${encodeURIComponent(t(X))}&direction=-1&limit=40`,Le=await fetch(ae);u(Ce,await Le.json(),!0)}t(Ce).forEach((ae,Le)=>Dt(Le,ae.id))}catch(ae){ce(ae.message,!0),u(Ce,[],!0)}u(Re,!1)}async function Dt(k,w){var re;try{const ae=await we("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:w,ctx:8192})});if(!((re=ae.files)!=null&&re.length)){t(be)[k]=null,Lt();return}const Le=ae.files.find(ht=>{var yt;return(yt=ht.quant)==null?void 0:yt.includes("Q4_K_M")})||ae.files[0];t(be)[k]=Le.fit.level,Lt()}catch{t(be)[k]=null,Lt()}}function Lt(){let k=-1,w=99;t(be).forEach((re,ae)=>{if(re==null)return;const Le=l[re]??99;Le=0&&w<=1?k:-1,!0)}function It(k){u(Ne,t(y).find(w=>w.id===k),!0)}async function Tt(k){const w=document.getElementById("cb-r-install-btn");w&&(w.disabled=!0,w.textContent="Starte…");try{const re=await we("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:k,hf_token:di()})});ce(`${re.count} Download${re.count!==1?"s":""} läuft — Modelle erscheinen danach automatisch im Modelle-Tab.`),u(Ne,null),bt("activity")}catch(re){ce(re.message,!0),w&&(w.disabled=!1,w.textContent="Installieren")}}async function F(k,w){var re,ae;u(Ze,!0),u(ut,w,!0),u(D,k,!0),u(He,""),u(N,8192),u(ue,null),u(pe,null),u(Ae,""),u(ve,!0);try{if(u(ue,await we("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:k,ctx:8192})}),!0),(ae=(re=t(ue))==null?void 0:re.files)!=null&&ae.length){const Le=t(ue).files.find(ht=>{var yt;return(yt=ht.quant)==null?void 0:yt.includes("Q4_K_M")})||t(ue).files[0];u(Ae,Le.filename,!0),Le.optimal_ctx&&t(N)===8192&&u(N,Le.optimal_ctx,!0),Y()}}catch(Le){ce(Le.message,!0)}u(ve,!1)}function Y(){var k,w,re;!((w=(k=t(ue))==null?void 0:k.files)!=null&&w.length)||!t(Ae)||(u(pe,t(ue).files.find(ae=>ae.filename===t(Ae))||null,!0),(re=t(pe))!=null&&re.optimal_ctx&&t(N)===8192&&u(N,t(pe).optimal_ctx,!0))}async function $(){var k,w;if(!t(D)||!t(Ae))return ce("Bitte eine GGUF-Datei wählen.",!0);u(ve,!0);try{const re=((k=t(ue))==null?void 0:k.params_b)??7,ae=((w=t(pe))==null?void 0:w.quant)??"Q4_K_M";await we("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:t(D),role:t(He),params_b:re,quant:ae,file:t(Ae),ctx:t(N),hf_token:di()})}),ce("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),u(Ze,!1),bt("activity")}catch(re){ce("Fehler: "+re.message,!0)}u(ve,!1)}async function G(k,w,re,ae){ae.disabled=!0,ae.textContent="Starte…";try{await we("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:k,role:w,params_b:re,quant:"Q4_K_M",hf_token:di()})}),ce("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),bt("activity")}catch(Le){ce(Le.message,!0),ae.disabled=!1,ae.textContent="Installieren"}}function E(){u(et,null),u(Ve,""),u(nt,""),u(it,[{repo:"",role:"",quant:"Q4_K_M"}],!0),u(je,!0)}function Z(k){const w=t(y).find(re=>re.id===k);w&&(u(et,k,!0),u(Ve,w.title,!0),u(nt,w.desc||"",!0),u(it,w.models.map(re=>({repo:re.repo,role:re.role,quant:re.quant||"Q4_K_M"})),!0),u(je,!0))}async function ke(){if(!t(Ve).trim())return ce("Bitte einen Titel angeben.",!0);const k=t(it).filter(w=>w.repo.trim());if(!k.length)return ce("Mindestens ein Modell (Repo) angeben.",!0);try{t(et)?(await we("/api/cookbook/user-recipe/"+encodeURIComponent(t(et)),{method:"PUT",body:JSON.stringify({title:t(Ve),desc:t(nt),models:k})}),ce("Setup aktualisiert.")):(await we("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:t(Ve),desc:t(nt),models:k})}),ce("Setup gespeichert.")),u(je,!1),wt()}catch(w){ce(w.message,!0)}}async function Pe(k){const w=t(y).find(re=>re.id===k);if(await hn({title:`„${(w==null?void 0:w.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"}),ce("Setup gelöscht."),wt()}catch(re){ce(re.message,!0)}}function C(k){if(!v(k))return"";const w=f(k);return`MoE${w?` · ~${w}B aktiv`:""}`}function B(k){return k?`${Fn(k)}`:""}var se=zc(),ie=i(tt(se),2),ee=r(ie),Se=i(r(ee),2),de=i(ee,4);{var A=k=>{var w=Qd();p(k,w)},j=k=>{var w=ec();Je(w,21,()=>t(y),Xe,(re,ae)=>{const Le=q(()=>t(ae).id===t(P));var ht=Xd(),yt=r(ht);{var $e=Ge=>{var pt=Zd(),Zt=tt(pt),Gt=i(Zt,2);S("click",Zt,Bt=>{Bt.stopPropagation(),Z(t(ae).id)}),S("keydown",Zt,Bt=>{Bt.key==="Enter"&&(Bt.stopPropagation(),Z(t(ae).id))}),S("click",Gt,Bt=>{Bt.stopPropagation(),Pe(t(ae).id)}),S("keydown",Gt,Bt=>{Bt.key==="Enter"&&(Bt.stopPropagation(),Pe(t(ae).id))}),p(Ge,pt)};L(yt,Ge=>{t(ae).user&&Ge($e)})}var We=i(yt,2);{var at=Ge=>{var pt=tr();p(Ge,pt)},St=Ge=>{var pt=Yd();p(Ge,pt)};L(We,Ge=>{t(Le)?Ge(at):t(ae).user&&Ge(St,1)})}var rt=i(We,2),ot=r(rt),xt=r(ot),Nt=r(xt),rn=i(ot,2),Mt=r(rn),st=i(rt,2),qt=r(st),Qt=i(st,2),$t=r(Qt);z((Ge,pt)=>{Et(ht,1,`card-btn${t(Le)?" cb-best":""}`),h(Nt,t(ae).title),Et(rn,1,`fit-badge ${Ge??""}`),h(Mt,pt),h(qt,t(ae).desc),h($t,`${t(ae).models.length??""} Modell${t(ae).models.length>1?"e":""} im Setup`)},[()=>b(t(ae).fit_level),()=>T(t(ae).fit_level)]),S("click",ht,()=>It(t(ae).id)),p(re,ht)}),p(k,w)};L(de,k=>{t(O)?k(A):k(j,-1)})}var oe=i(ie,2),Me=r(oe),U=i(r(Me),2),le=r(U);{var Te=k=>{const w=q(()=>Math.round((Date.now()/1e3-t(M).updated)/60));var re=nc(),ae=tt(re);{var Le=at=>{var St=li();z(()=>h(St,`Quellen befragt vor ${t(w)??""} min`)),p(at,St)},ht=at=>{var St=li();z(rt=>h(St,`Quellen befragt vor ${rt??""} h`),[()=>Math.round(t(w)/60)]),p(at,St)},yt=at=>{var St=li();z(rt=>h(St,`Quellen befragt vor ${rt??""} Tg.`),[()=>Math.round(t(w)/1440)]),p(at,St)};L(ae,at=>{t(w)<60?at(Le):t(w)<1440?at(ht,1):at(yt,-1)})}var $e=i(ae,2);{var We=at=>{var St=tc();p(at,St)};L($e,at=>{t(Oe)&&at(We)})}p(k,re)};L(le,k=>{var w;(w=t(M))!=null&&w.updated&&k(Te)})}var ze=i(U,2),x=r(ze),H=i(Me,4);{var he=k=>{var w=ac();p(k,w)},V=k=>{var w=Ua(),re=tt(w);Je(re,17,()=>t(M).categories,Xe,(ae,Le)=>{var ht=oc(),yt=r(ht),$e=r(yt),We=r($e),at=i(yt,2);Je(at,21,()=>t(Le).models,Xe,(St,rt)=>{const ot=q(()=>t(Le).recommended&&t(rt).repo===t(Le).recommended);var xt=lc(),Nt=r(xt);{var rn=ft=>{var mt=tr();p(ft,mt)};L(Nt,ft=>{t(ot)&&ft(rn)})}var Mt=i(Nt,2),st=r(Mt),qt=r(st),Qt=r(qt),$t=i(qt,2),Ge=r($t),pt=i(st,2),Zt=r(pt),Gt=i(Mt,2),Bt=r(Gt);Ye(Bt,()=>B(o[t(rt).role]||c(t(rt).repo)));var Gn=i(Bt,2);Ye(Gn,()=>C(t(rt).repo));var Yn=i(Gt,2),Dn=r(Yn),Ca=i(Yn,2);Je(Ca,17,()=>t(rt).requirements||[],Xe,(ft,mt)=>{var Wt=ic(),In=r(Wt);z(()=>h(In,`⚠ ${t(mt)??""}`)),p(ft,Wt)});var kt=i(Ca,4),dt=r(kt);{var gt=ft=>{var mt=rc();z(()=>Aa(mt,"title",`bereits eingerichtet als ${t(rt).installed??""}`)),p(ft,mt)},Rt=ft=>{var mt=sc();S("click",mt,Wt=>G(t(rt).repo,t(rt).role,t(rt).params_b,Wt.currentTarget)),p(ft,mt)};L(dt,ft=>{t(rt).installed?ft(gt):ft(Rt,-1)})}z((ft,mt,Wt)=>{Et(xt,1,`card${t(ot)?" res-best":""}`),h(Qt,t(rt).name),h(Ge,`${t(rt).author??""} · ${t(rt).params_b??""}B`),Et(pt,1,`fit-badge ${ft??""}`),h(Zt,t(rt).fit.text),h(Dn,`${mt??""} · ⬇ ${Wt??""}`)},[()=>b(t(rt).fit.level),()=>_(t(rt).fit),()=>(t(rt).downloads||0).toLocaleString()]),p(St,xt)}),z(()=>h(We,t(Le).title)),p(ae,ht)}),p(k,w)};L(H,k=>{var w;t(K)&&!t(M)?k(he):(w=t(M))!=null&&w.categories&&k(V,1)})}var xe=i(oe,2),Ie=i(r(xe),4),Fe=r(Ie),De=i(Fe,2),W=r(De);W.value=W.__value="downloads";var J=i(W);J.value=J.__value="trending";var Q=i(J);Q.value=Q.__value="created_at";var R=i(De,2),ne=r(R),_e=i(Ie,2);Je(_e,20,()=>["","coder","vision","reasoning","chat","agent"],Xe,(k,w)=>{var re=dc(),ae=r(re);z(()=>{Et(re,1,t(te)===w?"primary":"ghost"),h(ae,w||"Alle")}),S("click",re,()=>{u(te,w,!0),Pt()}),p(k,re)});var ge=i(_e,2);{var fe=k=>{var w=vc();Je(w,21,()=>t(Ce),Xe,(re,ae,Le)=>{var ht=cc(),yt=r(ht);{var $e=Gt=>{var Bt=tr();p(Gt,Bt)};L(yt,Gt=>{Le===t(Be)&&Gt($e)})}var We=i(yt,2),at=r(We),St=r(at),rt=r(St),ot=i(St,2),xt=r(ot),Nt=i(at,2),rn=r(Nt),Mt=i(We,2),st=r(Mt);Ye(st,()=>B(c(t(ae).id)));var qt=i(st,2);Ye(qt,()=>C(t(ae).id));var Qt=i(Mt,4),$t=r(Qt),Ge=r($t),pt=i($t,2),Zt=r(pt);z((Gt,Bt,Gn,Yn,Dn)=>{Et(ht,1,`card${Le===t(Be)?" res-best":""}`),h(rt,Gt),h(xt,t(ae).author||""),Et(Nt,1,`fit-badge ${Bt??""}`),h(rn,Gn),h(Ge,Yn),h(Zt,`⬇ ${Dn??""}`)},[()=>t(ae).id.split("/").pop(),()=>t(be)[Le]?b(t(be)[Le]):"warn",()=>t(be)[Le]?T(t(be)[Le]):"prüfe…",()=>t(be)[Le]?_({req_gb:0,tps:0}):"Hardware-Fit…",()=>(t(ae).downloads||0).toLocaleString()]),S("click",ht,()=>F(t(ae).id,t(ae).id.split("/").pop())),p(re,ht)}),p(k,w)};L(ge,k=>{t(Ce).length&&k(fe)})}var me=i(xe,2);{var _t=k=>{const w=q(()=>t(Ne));var re=_c(),ae=r(re),Le=r(ae),ht=i(Le,2),yt=r(ht),$e=i(ht,2),We=r($e),at=i($e,2);Je(at,21,()=>t(w).models,Xe,(Mt,st)=>{var qt=hc(),Qt=r(qt),$t=r(Qt),Ge=r($t),pt=r(Ge),Zt=i(Ge,2),Gt=r(Zt),Bt=i(Zt,2);Ye(Bt,()=>C(t(st).repo));var Gn=i($t,2);{var Yn=gt=>{var Rt=uc(),ft=r(Rt);z(()=>h(ft,t(st).why)),p(gt,Rt)};L(Gn,gt=>{t(st).why&>(Yn)})}var Dn=i(Gn,2);{var Ca=gt=>{var Rt=pc(),ft=r(Rt);z((mt,Wt,In)=>h(ft,`~${mt??""} GB · ~${Wt??""} Tok/s · optimal ~${In??""}k Kontext`),[()=>(t(st).fit.req_gb??0).toFixed(1),()=>Math.round(t(st).fit.tps??0),()=>Math.round((t(st).optimal_ctx||8192)/1024)]),p(gt,Rt)};L(Dn,gt=>{t(st).fit&>(Ca)})}var kt=i(Qt,2);{var dt=gt=>{var Rt=fc(),ft=r(Rt);z(mt=>{Et(Rt,1,`fit-badge ${mt??""}`),h(ft,t(st).fit.text)},[()=>b(t(st).fit.level)]),p(gt,Rt)};L(kt,gt=>{t(st).fit&>(dt)})}z(()=>{h(pt,t(st).name),h(Gt,t(st).role)}),p(Mt,qt)});var St=i(at,2);{var rt=Mt=>{const st=q(()=>Math.max(...t(w).models.map(Ge=>{var pt;return((pt=Ge.fit)==null?void 0:pt.req_gb)??0})));var qt=gc(),Qt=i(r(qt)),$t=r(Qt);z(Ge=>h($t,`~${Ge??""} GB`),[()=>t(st).toFixed(1)]),p(Mt,qt)};L(St,Mt=>{t(w).models.length&&t(w).models[0].fit&&Mt(rt)})}var ot=i(St,2);{var xt=Mt=>{const st=q(()=>t(y).find(Ge=>!Ge.user&&Ge.fit_level!=="too_tight"&&Ge.id!==t(w).id));var qt=bc(),Qt=i(r(qt));{var $t=Ge=>{var pt=mc(),Zt=i(tt(pt)),Gt=r(Zt);z(()=>h(Gt,`„${t(st).title??""}" ansehen`)),S("click",Zt,Bt=>{Bt.preventDefault(),u(Ne,null),setTimeout(()=>It(t(st).id),50)}),p(Ge,pt)};L(Qt,Ge=>{t(st)&&Ge($t)})}p(Mt,qt)};L(ot,Mt=>{t(w).fit_level==="too_tight"&&Mt(xt)})}var Nt=i(ot,2),rn=r(Nt);z(()=>{h(yt,t(w).title),h(We,t(w).desc),Et(Nt,1,`primary${t(w).fit_level==="too_tight"?" warn":""}`),h(rn,t(w).fit_level==="too_tight"?"Trotzdem installieren (nicht empfohlen)":"Komplettes Setup installieren")}),S("click",re,Mt=>{Mt.target.classList.contains("modal-overlay")&&u(Ne,null)}),S("click",Le,()=>u(Ne,null)),S("click",Nt,()=>Tt(t(w).id)),p(k,re)};L(me,k=>{t(Ne)&&k(_t)})}var zt=i(me,2);{var Ot=k=>{var w=Ac(),re=r(w),ae=r(re),Le=i(ae,2),ht=r(Le),yt=i(Le,2),$e=r(yt),We=i(yt,2);{var at=ot=>{var xt=yc();p(ot,xt)},St=ot=>{var xt=Mc(),Nt=i(tt(xt),2);Je(Nt,21,()=>t(ue).files,Xe,(kt,dt)=>{const gt=q(()=>t(dt).fit.level==="perfect"?"●":t(dt).fit.level==="marginal"?"◐":"○");var Rt=Yr(),ft=r(Rt),mt={};z(()=>{h(ft,`${t(gt)??""} ${t(dt).filename??""}`),mt!==(mt=t(dt).filename)&&(Rt.value=(Rt.__value=t(dt).filename)??"")}),p(kt,Rt)});var rn=i(Nt,2),Mt=r(rn),st=i(r(Mt),2),qt=i(Mt,2),Qt=r(qt),$t=i(r(Qt));Ye($t,()=>br(a));var Ge=i(Qt,2),pt=i(rn,2);{var Zt=kt=>{var dt=xc(),gt=i(r(dt)),Rt=r(gt),ft=i(gt,2);z(mt=>h(Rt,`~${mt??""}k`),[()=>Math.round(t(pe).optimal_ctx/1024)]),S("click",ft,mt=>{mt.preventDefault(),u(N,t(pe).optimal_ctx,!0)}),p(kt,dt)};L(pt,kt=>{var dt;(dt=t(pe))!=null&&dt.optimal_ctx&&kt(Zt)})}var Gt=i(pt,2);{var Bt=kt=>{var dt=kc(),gt=r(dt),Rt=i(r(gt),2),ft=r(Rt),mt=i(gt,2),Wt=r(mt);z((In,ki,Wi)=>{h(ft,`~${In??""} GB · ~${ki??""} Tok/s · ${(t(pe).quant||"GGUF")??""}`),Et(mt,1,`fit-badge ${Wi??""}`),h(Wt,t(pe).fit.text)},[()=>(t(pe).fit.req_gb??0).toFixed(1),()=>Math.round(t(pe).fit.tps??0),()=>b(t(pe).fit.level)]),p(kt,dt)};L(Gt,kt=>{t(pe)&&kt(Bt)})}var Gn=i(Gt,2);{var Yn=kt=>{const dt=q(()=>t(ue).files.find(Wt=>Wt.fit.level!=="too_tight"&&Wt.filename!==t(Ae)));var gt=Ua(),Rt=tt(gt);{var ft=Wt=>{var In=wc(),ki=i(r(In)),Wi=r(ki);z(ji=>h(Wi,`${t(dt).filename??""} (${ji??""})`),[()=>T(t(dt).fit.level)]),S("click",ki,ji=>{ji.preventDefault(),u(Ae,t(dt).filename,!0),Y()}),p(Wt,In)},mt=Wt=>{var In=Sc();p(Wt,In)};L(Rt,Wt=>{t(dt)?Wt(ft):Wt(mt,-1)})}p(kt,gt)};L(Gn,kt=>{var dt,gt;((dt=t(pe))==null?void 0:dt.fit.level)==="too_tight"&&((gt=t(ue))!=null&>.files)&&kt(Yn)})}var Dn=i(Gn,2),Ca=r(Dn);z(()=>{var kt,dt;Et(Dn,1,`primary${((kt=t(pe))==null?void 0:kt.fit.level)==="too_tight"?" warn":""}`),Dn.disabled=t(ve),h(Ca,t(ve)?"Starte…":((dt=t(pe))==null?void 0:dt.fit.level)==="too_tight"?"Trotzdem holen (zu groß — nicht empfohlen)":"Herunterladen & Einpflegen")}),S("change",Nt,Y),Jn(Nt,()=>t(Ae),kt=>u(Ae,kt)),dn(st,()=>t(He),kt=>u(He,kt)),dn(Ge,()=>t(N),kt=>u(N,kt)),S("click",Dn,$),p(ot,xt)},rt=ot=>{var xt=Ec();p(ot,xt)};L(We,ot=>{var xt,Nt;t(ve)&&!t(ue)?ot(at):(Nt=(xt=t(ue))==null?void 0:xt.files)!=null&&Nt.length?ot(St,1):t(ve)||ot(rt,2)})}z(()=>{h(ht,t(ut)),h($e,t(D))}),S("click",w,ot=>{ot.target.classList.contains("modal-overlay")&&u(Ze,!1)}),S("click",ae,()=>u(Ze,!1)),p(k,w)};L(zt,k=>{t(Ze)&&k(Ot)})}var gn=i(zt,2);{var da=k=>{var w=Tc(),re=r(w),ae=r(re),Le=i(ae,2),ht=r(Le),yt=i(Le,6),$e=i(yt,4),We=i($e,4);Je(We,17,()=>t(it),Xe,(ot,xt,Nt)=>{var rn=Cc(),Mt=r(rn),st=i(Mt,2),qt=i(st,2);Je(qt,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],Xe,($t,Ge)=>{var pt=Yr(),Zt=r(pt),Gt={};z(()=>{h(Zt,Ge),Gt!==(Gt=Ge)&&(pt.__value=Ge)}),p($t,pt)});var Qt=i(qt,2);dn(Mt,()=>t(xt).repo,$t=>t(xt).repo=$t),dn(st,()=>t(xt).role,$t=>t(xt).role=$t),Jn(qt,()=>t(xt).quant,$t=>t(xt).quant=$t),S("click",Qt,()=>u(it,t(it).filter(($t,Ge)=>Ge!==Nt),!0)),p(ot,rn)});var at=i(We,2),St=i(at,4),rt=r(St);z(()=>{h(ht,t(et)?"Setup bearbeiten":"Eigenes Setup erstellen"),h(rt,t(et)?"Änderungen speichern":"Setup speichern")}),S("click",w,ot=>{ot.target.classList.contains("modal-overlay")&&u(je,!1)}),S("click",ae,()=>u(je,!1)),dn(yt,()=>t(Ve),ot=>u(Ve,ot)),dn($e,()=>t(nt),ot=>u(nt,ot)),S("click",at,()=>u(it,[...t(it),{repo:"",role:"",quant:"Q4_K_M"}],!0)),S("click",St,ke),p(k,w)};L(gn,k=>{t(je)&&k(da)})}z(()=>{ze.disabled=t(K),h(x,t(K)?"Suche…":"Aktualisieren"),R.disabled=t(Re),h(ne,t(Re)?"Lade…":"Suchen")}),S("click",Se,E),S("click",ze,()=>Ct(!0)),S("keydown",Fe,k=>k.key==="Enter"&&Pt()),dn(Fe,()=>t(Ee),k=>u(Ee,k)),Jn(De,()=>t(X),k=>u(X,k)),S("click",R,Pt),p(e,se),Pn()}qn(["click","keydown","change"]);var Pc=g(`
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),Kc=g('
Ö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).
Den "providers"-Block in die bestehende opencode.jsonc einfügen (nicht die ganze Datei ersetzen). Falls bereits ein "llama-swap"-Eintrag existiert: vorher löschen.
Settings → Admin Panel → Connections → neue OpenAI-Verbindung:
',1),Vc=g('
Bilder einbinden (Vision)
Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.
'),Wc=g('
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),jc=g('
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.
'),Uc=g(''),Hc=g('
In Cline: MCP-Einstellungen öffnen (Stecker-Icon in der Cline-Sidebar) → „Add MCP Server" → diesen Block einfügen.
In Claude Code: Block in ~/.claude/settings.json unter "mcpServers" einfügen.
Einmalig auf dem Windows-PC: pip install mcp httpx ausführen — danach mcp_memory.py aus dem Repo-Ordner erreichbar machen (Pfad im Snippet anpassen).
',1),Jc=g('
Block in ~/.config/opencode/opencode.json unter "mcpServers" einfügen.
Einmalig: pip install mcp httpx — und Pfad zu mcp_memory.py im Snippet anpassen.
',1),Qc=g('
Block in die MCP-Config des jeweiligen Tools einfügen. Der Bosgame-Pfad /opt/mission-control/mcp_memory.py ist bereits korrekt — kein weiteres Setup nötig.
'),Zc=g(`
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?
Gedächtnis-MCP
Neu in v7
Damit Cline, OpenCode und Claude Code sich Projektfakten, Entscheidungen und Präferenzen
- über Sessions hinweg merken — geteilt über alle Tools, verwaltet im Gedächtnis-Tab.
`,1);function Yc(e,n){$n(n,!0);const a=q(()=>xi.value),s=q(()=>{var C;return(((C=t(a))==null?void 0:C.models)||[]).filter(B=>!B.incomplete)});let l=I("zed"),o=I(jt([])),d=I(""),c=I(!1),v=I("cline"),f=I(jt(localStorage.getItem("mc_ip_override")||""));function b(C){return/^\d{1,3}(\.\d{1,3}){3}$/.test(C)}function T(){return location.protocol==="https:"||!b(location.hostname)}function _(){return`http://${t(f).trim()||location.hostname}:8080/v1`}const y=q(_);function P(){const C=t(f).trim();C?localStorage.setItem("mc_ip_override",C):localStorage.removeItem("mc_ip_override")}const O=q(()=>Be(t(v))),M=q(()=>t(o).length?t(o):t(s).map(C=>C.name)),K=q(()=>t(M)[0]||"coder"),Oe=q(()=>{var C;return(C=t(s).find(B=>{var se,ie;return(ie=(se=B.meta)==null?void 0:se.caps)==null?void 0:ie.includes("Bild")}))==null?void 0:C.name});function Ee(C,B){const ie=(B.length?t(s).filter(ee=>B.includes(ee.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(ee=>{var A,j;const Se=(((A=ee.meta)==null?void 0:A.caps)||[]).some(oe=>/Bild|Vision/i.test(oe)),de=((j=ee.meta)==null?void 0:j.ctx)||131072;return` { "name": "${ee.name}", "display_name": "${ee.name}", "max_tokens": ${de}${Se?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`,
`);return`"language_models": {
"openai_compatible": {
"bosgame": {
- "api_url": "${M}",
+ "api_url": "${C}",
"available_models": [
-${fe}
+${ie}
]
}
}
-}`}function ze(M,K){const fe=(K.length?t(s).filter(se=>K.includes(se.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(se=>{var Se;const Me=((Se=se.meta)==null?void 0:Se.ctx)||131072;return` "${se.name}": { "name": "${se.name}", "contextWindowSize": ${Me} }`}).join(`,
+}`}function Ce(C,B){const ie=(B.length?t(s).filter(ee=>B.includes(ee.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(ee=>{var de;const Se=((de=ee.meta)==null?void 0:de.ctx)||131072;return` "${ee.name}": { "name": "${ee.name}", "contextWindowSize": ${Se} }`}).join(`,
`);return`"providers": {
"llama-swap": {
"npm": "@ai-sdk/openai-compatible",
"name": "Bosgame (llama-swap)",
"options": {
- "baseURL": "${M}",
+ "baseURL": "${C}",
"apiKey": "local"
},
"models": {
-${fe}
+${ie}
}
}
-}`}function Ke(M,K){return`{
+}`}function Re(C,B){return`{
"models": [
-${(K.length?t(s).filter(se=>K.includes(se.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(se=>` {
- "title": "llama-swap / ${se.name}",
+${(B.length?t(s).filter(ee=>B.includes(ee.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(ee=>` {
+ "title": "llama-swap / ${ee.name}",
"provider": "openai",
- "model": "${se.name}",
- "apiBase": "${M}",
+ "model": "${ee.name}",
+ "apiBase": "${C}",
"apiKey": "local"
}`).join(`,
`)}
]
-}`}async function Y(){u(d,"Teste…");try{const M=await Te("/api/integration/test");u(c,M.ok,!0),u(d,M.ok?`✓ Verbunden — ${M.models.length} Modell(e): ${M.models.join(", ")}`:`✗ Keine Verbindung: ${M.error}`,!0)}catch(M){u(c,!1),u(d,"✗ "+M.message)}}function Z(M){var Q;const K=M.querySelector("code");K&&((Q=navigator.clipboard)==null||Q.writeText(K.textContent||""))}function me(M){var K;(K=navigator.clipboard)==null||K.writeText(M.value)}function Be(M){return`{
+}`}async function te(){u(d,"Teste…");try{const C=await we("/api/integration/test");u(c,C.ok,!0),u(d,C.ok?`✓ Verbunden — ${C.models.length} Modell(e): ${C.models.join(", ")}`:`✗ Keine Verbindung: ${C.error}`,!0)}catch(C){u(c,!1),u(d,"✗ "+C.message)}}function X(C){var se;const B=C.querySelector("code");B&&((se=navigator.clipboard)==null||se.writeText(B.textContent||""))}function be(C){var B;(B=navigator.clipboard)==null||B.writeText(C.value)}function Be(C){return`{
"mcpServers": {
"mission-control-memory": {
- "command": "${M==="bosgame"?"/opt/mission-control/.venv/bin/python":"python"}",
- "args": ["${M==="bosgame"?"/opt/mission-control/mcp_memory.py":"C:\\\\Users\\\\\\\\mission-control\\\\mcp_memory.py"}"],
+ "command": "${C==="bosgame"?"/opt/mission-control/.venv/bin/python":"python"}",
+ "args": ["${C==="bosgame"?"/opt/mission-control/mcp_memory.py":"C:\\\\Users\\\\\\\\mission-control\\\\mcp_memory.py"}"],
"env": {
"MC_URL": "http://192.168.178.151:9000"
}
}
}
-}`}var Ve=Zc(),Qe=i(nt(Ve),2),vt=i(r(Qe),6),D=r(vt),le=i(D,2),Ae=i(vt,2),tt=r(Ae),N=i(Ae,2);{var oe=M=>{var K=Pc();p(M,K)},de=q(()=>T());L(N,M=>{t(de)&&M(oe)})}var He=i(N,2),je=r(He),at=i(je,2);{var st=M=>{var K=Dc(),Q=r(K);z(()=>{Ct(K,`color:${t(c)?"#7ee29a":"#ff9b95"}`),h(Q,t(d))}),p(M,K)};L(at,M=>{t(d)&&M(st)})}var it=i(Qe,2),mt=i(r(it),2);Ze(mt,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."]],et,(M,K)=>{var Q=q(()=>Hn(K,3));let fe=()=>t(Q)[0],se=()=>t(Q)[1],Me=()=>t(Q)[2];var Se=Ic(),C=r(Se),H=r(C),ve=i(C,2),De=r(ve),G=r(De),ie=i(De,2),Re=r(ie);z(()=>{h(H,fe()),h(G,se()),h(Re,Me())}),p(M,Se)});var Tt=i(it,2);{var zt=M=>{var K=Wc(),Q=nt(K),fe=r(Q),se=i(r(fe),2),Me=r(se),Se=i(fe,4);Ze(Se,21,()=>t(s),et,(V,U)=>{const J=q(()=>t(o).includes(t(U).name));var R=Lc(),X=r(R);z(()=>{Ct(R,`cursor:pointer;${t(J)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),h(X,t(U).name)}),w("click",R,()=>u(o,t(J)?t(o).filter(ye=>ye!==t(U).name):[...t(o),t(U).name],!0)),w("keydown",R,ye=>ye.key==="Enter"&&u(o,t(J)?t(o).filter(he=>he!==t(U).name):[...t(o),t(U).name],!0)),p(V,R)});var C=i(Se,2);{var H=V=>{var U=Oc(),J=r(U);w("click",J,R=>{R.preventDefault(),u(o,[],!0)}),p(V,U)};L(C,V=>{t(o).length&&V(H)})}var ve=i(Q,2),De=i(r(ve),6);Ze(De,20,()=>[["janai","Jan AI","Einfachstes Chat-Interface — Desktop-App, kein Setup"],["openwebui","OpenWebUI","Browser-Chat für Teams — mehr Features, mehr Setup"]],et,(V,U)=>{var J=q(()=>Hn(U,3));let R=()=>t(J)[0],X=()=>t(J)[1],ye=()=>t(J)[2];var he=Xr(),ue=r(he),ge=r(ue),xt=i(ue,2),$t=r(xt);z(()=>{At(he,1,`card-btn${t(l)===R()?" cb-best":""}`),h(ge,X()),h($t,ye())}),w("click",he,()=>u(l,R(),!0)),p(V,he)});var G=i(De,4);Ze(G,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"]],et,(V,U)=>{var J=q(()=>Hn(U,3));let R=()=>t(J)[0],X=()=>t(J)[1],ye=()=>t(J)[2];var he=Xr(),ue=r(he),ge=r(ue),xt=i(ue,2),$t=r(xt);z(()=>{At(he,1,`card-btn${t(l)===R()?" cb-best":""}`),h(ge,X()),h($t,ye())}),w("click",he,()=>u(l,R(),!0)),p(V,he)});var ie=i(ve,2),Re=i(r(ie),2);{var be=V=>{var U=Bc(),J=i(nt(U),6),R=r(J),X=i(R,2),ye=i(J,4),he=r(ye),ue=i(he,2);z(()=>{ea(R,t(y)),ea(he,t(F))}),w("click",X,ge=>me(ge.currentTarget.previousElementSibling)),w("click",ue,ge=>me(ge.currentTarget.previousElementSibling)),p(V,U)},E=V=>{const U=q(()=>Ke(t(y),t(S)));var J=Rc(),R=i(nt(J),4),X=r(R),ye=i(X,2),he=r(ye),ue=r(he),ge=i(R,2),xt=i(r(ge)),$t=r(xt);z(()=>{h(ue,t(U)),h($t,`llama-swap / ${t(F)??""}`)}),w("click",X,Ot=>Z(Ot.currentTarget.parentElement)),p(V,J)},W=V=>{var U=Fc(),J=i(nt(U),6),R=r(J),X=i(R,2),ye=i(J,4),he=r(ye),ue=i(he,2),ge=i(ye,2),xt=i(r(ge),3),$t=r(xt);z(()=>{ea(R,t(y)),ea(he,t(F)),h($t,t(F))}),w("click",X,Ot=>me(Ot.currentTarget.previousElementSibling)),w("click",ue,Ot=>me(Ot.currentTarget.previousElementSibling)),p(V,U)},_e=V=>{const U=q(()=>Ee(t(y),t(S)));var J=Kc(),R=i(nt(J),4),X=r(R),ye=i(X,2),he=r(ye),ue=r(he),ge=i(R,4),xt=i(r(ge)),$t=r(xt);z(()=>{h(ue,t(U)),h($t,`bosgame / ${t(F)??""}`)}),w("click",X,Ot=>Z(Ot.currentTarget.parentElement)),p(V,J)},te=V=>{const U=q(()=>ze(t(y),t(S)));var J=Nc(),R=i(nt(J),6),X=r(R),ye=i(X,2),he=r(ye),ue=r(he),ge=i(R,2),xt=i(r(ge),3),$t=r(xt);z(()=>{h(ue,t(U)),h($t,`llama-swap/${t(F)??""}`)}),w("click",X,Ot=>Z(Ot.currentTarget.parentElement)),p(V,J)},Ie=V=>{var U=qc(),J=i(nt(U),4),R=r(J),X=i(R,2),ye=i(J,4),he=r(ye),ue=i(he,2);z(()=>{ea(R,t(y)),ea(he,t(F))}),w("click",X,ge=>me(ge.currentTarget.previousElementSibling)),w("click",ue,ge=>me(ge.currentTarget.previousElementSibling)),p(V,U)},qe=V=>{var U=Gc(),J=i(nt(U),4),R=r(J),X=i(R,2),ye=i(J,4),he=r(ye),ue=i(he,2);z(()=>ea(R,t(y))),w("click",X,ge=>me(ge.currentTarget.previousElementSibling)),w("click",ue,ge=>me(ge.currentTarget.previousElementSibling)),p(V,U)};L(Re,V=>{t(l)==="janai"?V(be):t(l)==="continue"?V(E,1):t(l)==="antigravity"?V(W,2):t(l)==="zed"?V(_e,3):t(l)==="opencode"?V(te,4):t(l)==="cline"?V(Ie,5):t(l)==="openwebui"&&V(qe,6)})}var Ge=i(ie,2);{var Pe=V=>{const U=q(()=>`curl ${t(y)}/chat/completions \\
+}`}var Ne=Zc(),Ze=i(tt(Ne),2),ut=i(r(Ze),6),D=r(ut),ue=i(D,2),Ae=i(ut,2),He=r(Ae),N=i(Ae,2);{var ve=C=>{var B=Pc();p(C,B)},pe=q(()=>T());L(N,C=>{t(pe)&&C(ve)})}var je=i(N,2),Ve=r(je),nt=i(Ve,2);{var it=C=>{var B=Dc(),se=r(B);z(()=>{At(B,`color:${t(c)?"#7ee29a":"#ff9b95"}`),h(se,t(d))}),p(C,B)};L(nt,C=>{t(d)&&C(it)})}var et=i(Ze,2),bt=i(r(et),2);Je(bt,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."]],Xe,(C,B)=>{var se=q(()=>Hn(B,3));let ie=()=>t(se)[0],ee=()=>t(se)[1],Se=()=>t(se)[2];var de=Ic(),A=r(de),j=r(A),oe=i(A,2),Me=r(oe),U=r(Me),le=i(Me,2),Te=r(le);z(()=>{h(j,ie()),h(U,ee()),h(Te,Se())}),p(C,de)});var wt=i(et,2);{var Ct=C=>{var B=Wc(),se=tt(B),ie=r(se),ee=i(r(ie),2),Se=r(ee),de=i(ie,4);Je(de,21,()=>t(s),Xe,(W,J)=>{const Q=q(()=>t(o).includes(t(J).name));var R=Lc(),ne=r(R);z(()=>{At(R,`cursor:pointer;${t(Q)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),h(ne,t(J).name)}),S("click",R,()=>u(o,t(Q)?t(o).filter(_e=>_e!==t(J).name):[...t(o),t(J).name],!0)),S("keydown",R,_e=>_e.key==="Enter"&&u(o,t(Q)?t(o).filter(ge=>ge!==t(J).name):[...t(o),t(J).name],!0)),p(W,R)});var A=i(de,2);{var j=W=>{var J=Oc(),Q=r(J);S("click",Q,R=>{R.preventDefault(),u(o,[],!0)}),p(W,J)};L(A,W=>{t(o).length&&W(j)})}var oe=i(se,2),Me=i(r(oe),6);Je(Me,20,()=>[["janai","Jan AI","Einfachstes Chat-Interface — Desktop-App, kein Setup"],["openwebui","OpenWebUI","Browser-Chat für Teams — mehr Features, mehr Setup"]],Xe,(W,J)=>{var Q=q(()=>Hn(J,3));let R=()=>t(Q)[0],ne=()=>t(Q)[1],_e=()=>t(Q)[2];var ge=Xr(),fe=r(ge),me=r(fe),_t=i(fe,2),zt=r(_t);z(()=>{Et(ge,1,`card-btn${t(l)===R()?" cb-best":""}`),h(me,ne()),h(zt,_e())}),S("click",ge,()=>u(l,R(),!0)),p(W,ge)});var U=i(Me,4);Je(U,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"]],Xe,(W,J)=>{var Q=q(()=>Hn(J,3));let R=()=>t(Q)[0],ne=()=>t(Q)[1],_e=()=>t(Q)[2];var ge=Xr(),fe=r(ge),me=r(fe),_t=i(fe,2),zt=r(_t);z(()=>{Et(ge,1,`card-btn${t(l)===R()?" cb-best":""}`),h(me,ne()),h(zt,_e())}),S("click",ge,()=>u(l,R(),!0)),p(W,ge)});var le=i(oe,2),Te=i(r(le),2);{var ze=W=>{var J=Bc(),Q=i(tt(J),6),R=r(Q),ne=i(R,2),_e=i(Q,4),ge=r(_e),fe=i(ge,2);z(()=>{ea(R,t(y)),ea(ge,t(K))}),S("click",ne,me=>be(me.currentTarget.previousElementSibling)),S("click",fe,me=>be(me.currentTarget.previousElementSibling)),p(W,J)},x=W=>{const J=q(()=>Re(t(y),t(M)));var Q=Rc(),R=i(tt(Q),4),ne=r(R),_e=i(ne,2),ge=r(_e),fe=r(ge),me=i(R,2),_t=i(r(me)),zt=r(_t);z(()=>{h(fe,t(J)),h(zt,`llama-swap / ${t(K)??""}`)}),S("click",ne,Ot=>X(Ot.currentTarget.parentElement)),p(W,Q)},H=W=>{var J=Fc(),Q=i(tt(J),6),R=r(Q),ne=i(R,2),_e=i(Q,4),ge=r(_e),fe=i(ge,2),me=i(_e,2),_t=i(r(me),3),zt=r(_t);z(()=>{ea(R,t(y)),ea(ge,t(K)),h(zt,t(K))}),S("click",ne,Ot=>be(Ot.currentTarget.previousElementSibling)),S("click",fe,Ot=>be(Ot.currentTarget.previousElementSibling)),p(W,J)},he=W=>{const J=q(()=>Ee(t(y),t(M)));var Q=Kc(),R=i(tt(Q),4),ne=r(R),_e=i(ne,2),ge=r(_e),fe=r(ge),me=i(R,4),_t=i(r(me)),zt=r(_t);z(()=>{h(fe,t(J)),h(zt,`bosgame / ${t(K)??""}`)}),S("click",ne,Ot=>X(Ot.currentTarget.parentElement)),p(W,Q)},V=W=>{const J=q(()=>Ce(t(y),t(M)));var Q=Nc(),R=i(tt(Q),6),ne=r(R),_e=i(ne,2),ge=r(_e),fe=r(ge),me=i(R,2),_t=i(r(me),3),zt=r(_t);z(()=>{h(fe,t(J)),h(zt,`llama-swap/${t(K)??""}`)}),S("click",ne,Ot=>X(Ot.currentTarget.parentElement)),p(W,Q)},xe=W=>{var J=qc(),Q=i(tt(J),4),R=r(Q),ne=i(R,2),_e=i(Q,4),ge=r(_e),fe=i(ge,2);z(()=>{ea(R,t(y)),ea(ge,t(K))}),S("click",ne,me=>be(me.currentTarget.previousElementSibling)),S("click",fe,me=>be(me.currentTarget.previousElementSibling)),p(W,J)},Ie=W=>{var J=Gc(),Q=i(tt(J),4),R=r(Q),ne=i(R,2),_e=i(Q,4),ge=r(_e),fe=i(ge,2);z(()=>ea(R,t(y))),S("click",ne,me=>be(me.currentTarget.previousElementSibling)),S("click",fe,me=>be(me.currentTarget.previousElementSibling)),p(W,J)};L(Te,W=>{t(l)==="janai"?W(ze):t(l)==="continue"?W(x,1):t(l)==="antigravity"?W(H,2):t(l)==="zed"?W(he,3):t(l)==="opencode"?W(V,4):t(l)==="cline"?W(xe,5):t(l)==="openwebui"&&W(Ie,6)})}var Fe=i(le,2);{var De=W=>{const J=q(()=>`curl ${t(y)}/chat/completions \\
-H "Content-Type: application/json" \\
-d '{
"model": "${t(Oe)}",
"messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,"}}]}]
-}'`);var J=Vc(),R=r(J),X=i(r(R),2),ye=r(X);Xe(ye,()=>Ut("check"));var he=i(ye),ue=i(R,4),ge=r(ue),xt=i(ge,2),$t=r(xt),Ot=r($t);z(()=>{h(he,` „${t(Oe)??""}" bereit`),h(Ot,t(U))}),w("click",ge,hn=>Z(hn.currentTarget.parentElement)),p(V,J)};L(Ge,V=>{t(Oe)&&V(Pe)})}z(()=>h(Me,t(o).length?`${t(o).length} von ${t(s).length} ausgewählt`:"alle werden eingeschlossen")),p(M,K)},Kt=M=>{var K=jc(),Q=i(r(K),2),fe=i(r(Q),4);w("click",fe,()=>{var se;return(se=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:se.dispatchEvent(new MouseEvent("click"))}),p(M,K)};L(Tt,M=>{t(s).length?M(zt):M(Kt,-1)})}var It=i(Tt,2),Dt=i(r(It),2),Lt=i(r(Dt)),j=i(Dt,2);Ze(j,20,()=>[["cline","Cline / Claude Code","Windows — Tools auf dem Entwicklungs-PC"],["opencode","OpenCode","Windows — Terminal-Agent"],["bosgame","Direkt am Bosgame","Wenn das Tool am Server läuft"]],et,(M,K)=>{var Q=q(()=>Hn(K,3));let fe=()=>t(Q)[0],se=()=>t(Q)[1],Me=()=>t(Q)[2];var Se=Uc(),C=r(Se),H=r(C),ve=i(C,2),De=r(ve);z(()=>{At(Se,1,`card-btn${t(v)===fe()?" cb-best":""}`),h(H,se()),h(De,Me())}),w("click",Se,()=>u(v,fe(),!0)),p(M,Se)});var ce=i(j,2),A=r(ce),B=i(A,2),ke=r(B),re=r(ke),$=i(ce,2);{var ae=M=>{var K=Hc();p(M,K)},we=M=>{var K=Jc();p(M,K)},Ce=M=>{var K=Qc();p(M,K)};L($,M=>{t(v)==="cline"?M(ae):t(v)==="opencode"?M(we,1):M(Ce,-1)})}z(()=>{ea(D,t(y)),h(re,t(O))}),w("click",le,M=>{const K=M.currentTarget.previousElementSibling;me(K)}),w("input",tt,P),dn(tt,()=>t(f),M=>u(f,M)),w("click",je,Y),w("click",Lt,M=>{var K;M.preventDefault(),(K=document.querySelector(".nav-item[data-view='memory']"))==null||K.click()}),w("click",A,M=>Z(M.currentTarget.parentElement)),p(e,Ve),Pn()}qn(["click","input","keydown"]);var Xc=g('
'),ev=g('
Für dich: Upgrades
Neuere Modelle, die ein installiertes ersetzen können.
'),tv=g('
Lade News… (erstes Laden kann kurz dauern)
'),nv=g('
'),av=g('
Keine News geladen
Die Quellen sind gerade nicht erreichbar — später nochmal probieren.
'),iv=g('für dich'),rv=g('
'),sv=g(''),lv=g('
News
Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
',1);function ov(e,n){$n(n,!0);let a=I(jt([])),s=I(jt([])),l=I(!0),o=I("");const d=Y=>Y==="perfect"?"ok":Y==="marginal"?"warn":"bad";function c(Y){const Z=Math.max(0,Date.now()/1e3-Y);return Z<60?Z+"s":Z<3600?Math.floor(Z/60)+"m":Z<86400?Math.floor(Z/3600)+"h":Math.floor(Z/86400)+"d"}async function v(){u(l,!0),u(o,"");try{u(a,(await Te("/api/news")).items||[],!0)}catch(Y){u(o,Y.message||"Fehler beim Laden",!0)}finally{u(l,!1)}}async function f(){try{u(s,(await Te("/api/cookbook/upgrades")).upgrades||[],!0)}catch{u(s,[],!0)}}async function b(Y,Z){var me;Z.disabled=!0,Z.textContent="Starte…";try{await Te("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:Y.repo,role:Y.role,params_b:Y.params_b,quant:Y.quant,hf_token:di()})}),(me=document.querySelector(".nav-item[data-view='activity']"))==null||me.dispatchEvent(new MouseEvent("click"))}catch(Be){Z.disabled=!1,Z.textContent="Installieren",alert("Fehler: "+Be.message)}}function T(){v(),f()}yi(()=>{v(),f()});var _=lv(),y=nt(_),P=i(r(y),2),O=i(y,2);{var S=Y=>{var Z=ev(),me=r(Z),Be=i(r(me),2),Ve=r(Be),Qe=i(me,4);Ze(Qe,21,()=>t(s),et,(vt,D)=>{var le=Xc(),Ae=r(le),tt=r(Ae),N=r(tt),oe=r(N),de=i(N,2),He=r(de),je=i(tt,2),at=r(je),st=i(Ae,2);z(it=>{h(oe,t(D).name),At(de,1,`fit-badge ${it??""}`),h(He,t(D).fit.text),h(at,`Ersetzt dein „${t(D).old??""}". ${t(D).why??""}`)},[()=>d(t(D).fit.level)]),w("click",st,it=>b(t(D),it.currentTarget)),p(vt,le)}),z(()=>h(Ve,t(s).length)),p(Y,Z)};L(O,Y=>{t(s).length&&Y(S)})}var F=i(O,2);{var Oe=Y=>{var Z=tv();p(Y,Z)},Ee=Y=>{var Z=nv(),me=r(Z);z(()=>h(me,t(o))),p(Y,Z)},ze=Y=>{var Z=av();p(Y,Z)},Ke=Y=>{var Z=sv();Ze(Z,21,()=>t(a),et,(me,Be,Ve)=>{var Qe=rv();At(Qe,1,`news-card${Ve===0?" featured":""}`);var vt=r(Qe),D=r(vt),le=r(D),Ae=i(D,2);{var tt=je=>{var at=iv();p(je,at)};L(Ae,je=>{t(Be).relevant&&je(tt)})}var N=i(Ae,2),oe=r(N),de=i(vt,2),He=r(de);z(je=>{Aa(Qe,"href",t(Be).link),h(le,t(Be).source),h(oe,je),h(He,t(Be).title)},[()=>t(Be).ts?c(t(Be).ts):""]),p(me,Qe)}),p(Y,Z)};L(F,Y=>{t(l)?Y(Oe):t(o)?Y(Ee,1):t(a).length?Y(Ke,-1):Y(ze,2)})}w("click",P,T),p(e,_),Pn()}qn(["click"]);const es=[{label:"Einstieg",tutorials:[["Dein erster Workflow — in 3 Schritten",`
+}'`);var Q=Vc(),R=r(Q),ne=i(r(R),2),_e=r(ne);Ye(_e,()=>Ut("check"));var ge=i(_e),fe=i(R,4),me=r(fe),_t=i(me,2),zt=r(_t),Ot=r(zt);z(()=>{h(ge,` „${t(Oe)??""}" bereit`),h(Ot,t(J))}),S("click",me,gn=>X(gn.currentTarget.parentElement)),p(W,Q)};L(Fe,W=>{t(Oe)&&W(De)})}z(()=>h(Se,t(o).length?`${t(o).length} von ${t(s).length} ausgewählt`:"alle werden eingeschlossen")),p(C,B)},Kt=C=>{var B=jc(),se=i(r(B),2),ie=i(r(se),4);S("click",ie,()=>{var ee;return(ee=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:ee.dispatchEvent(new MouseEvent("click"))}),p(C,B)};L(wt,C=>{t(s).length?C(Ct):C(Kt,-1)})}var Pt=i(wt,2),Dt=i(r(Pt),2),Lt=i(r(Dt)),It=i(Dt,2);Je(It,20,()=>[["cline","Cline / Claude Code","Windows — Tools auf dem Entwicklungs-PC"],["opencode","OpenCode","Windows — Terminal-Agent"],["bosgame","Direkt am Bosgame","Wenn das Tool am Server läuft"]],Xe,(C,B)=>{var se=q(()=>Hn(B,3));let ie=()=>t(se)[0],ee=()=>t(se)[1],Se=()=>t(se)[2];var de=Uc(),A=r(de),j=r(A),oe=i(A,2),Me=r(oe);z(()=>{Et(de,1,`card-btn${t(v)===ie()?" cb-best":""}`),h(j,ee()),h(Me,Se())}),S("click",de,()=>u(v,ie(),!0)),p(C,de)});var Tt=i(It,2),F=r(Tt),Y=i(F,2),$=r(Y),G=r($),E=i(Tt,2);{var Z=C=>{var B=Hc();p(C,B)},ke=C=>{var B=Jc();p(C,B)},Pe=C=>{var B=Qc();p(C,B)};L(E,C=>{t(v)==="cline"?C(Z):t(v)==="opencode"?C(ke,1):C(Pe,-1)})}z(()=>{ea(D,t(y)),h(G,t(O))}),S("click",ue,C=>{const B=C.currentTarget.previousElementSibling;be(B)}),S("input",He,P),dn(He,()=>t(f),C=>u(f,C)),S("click",Ve,te),S("click",Lt,C=>{var B;C.preventDefault(),(B=document.querySelector(".nav-item[data-view='memory']"))==null||B.click()}),S("click",F,C=>X(C.currentTarget.parentElement)),p(e,Ne),Pn()}qn(["click","input","keydown"]);var Xc=g('
'),ev=g('
Für dich: Upgrades
Neuere Modelle, die ein installiertes ersetzen können.
'),tv=g('
Lade News… (erstes Laden kann kurz dauern)
'),nv=g('
'),av=g('
Keine News geladen
Die Quellen sind gerade nicht erreichbar — später nochmal probieren.
'),iv=g('für dich'),rv=g('
'),sv=g(''),lv=g('
News
Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
',1);function ov(e,n){$n(n,!0);let a=I(jt([])),s=I(jt([])),l=I(!0),o=I("");const d=te=>te==="perfect"?"ok":te==="marginal"?"warn":"bad";function c(te){const X=Math.max(0,Date.now()/1e3-te);return X<60?X+"s":X<3600?Math.floor(X/60)+"m":X<86400?Math.floor(X/3600)+"h":Math.floor(X/86400)+"d"}async function v(){u(l,!0),u(o,"");try{u(a,(await we("/api/news")).items||[],!0)}catch(te){u(o,te.message||"Fehler beim Laden",!0)}finally{u(l,!1)}}async function f(){try{u(s,(await we("/api/cookbook/upgrades")).upgrades||[],!0)}catch{u(s,[],!0)}}async function b(te,X){var be;X.disabled=!0,X.textContent="Starte…";try{await we("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:te.repo,role:te.role,params_b:te.params_b,quant:te.quant,hf_token:di()})}),(be=document.querySelector(".nav-item[data-view='activity']"))==null||be.dispatchEvent(new MouseEvent("click"))}catch(Be){X.disabled=!1,X.textContent="Installieren",alert("Fehler: "+Be.message)}}function T(){v(),f()}yi(()=>{v(),f()});var _=lv(),y=tt(_),P=i(r(y),2),O=i(y,2);{var M=te=>{var X=ev(),be=r(X),Be=i(r(be),2),Ne=r(Be),Ze=i(be,4);Je(Ze,21,()=>t(s),Xe,(ut,D)=>{var ue=Xc(),Ae=r(ue),He=r(Ae),N=r(He),ve=r(N),pe=i(N,2),je=r(pe),Ve=i(He,2),nt=r(Ve),it=i(Ae,2);z(et=>{h(ve,t(D).name),Et(pe,1,`fit-badge ${et??""}`),h(je,t(D).fit.text),h(nt,`Ersetzt dein „${t(D).old??""}". ${t(D).why??""}`)},[()=>d(t(D).fit.level)]),S("click",it,et=>b(t(D),et.currentTarget)),p(ut,ue)}),z(()=>h(Ne,t(s).length)),p(te,X)};L(O,te=>{t(s).length&&te(M)})}var K=i(O,2);{var Oe=te=>{var X=tv();p(te,X)},Ee=te=>{var X=nv(),be=r(X);z(()=>h(be,t(o))),p(te,X)},Ce=te=>{var X=av();p(te,X)},Re=te=>{var X=sv();Je(X,21,()=>t(a),Xe,(be,Be,Ne)=>{var Ze=rv();Et(Ze,1,`news-card${Ne===0?" featured":""}`);var ut=r(Ze),D=r(ut),ue=r(D),Ae=i(D,2);{var He=Ve=>{var nt=iv();p(Ve,nt)};L(Ae,Ve=>{t(Be).relevant&&Ve(He)})}var N=i(Ae,2),ve=r(N),pe=i(ut,2),je=r(pe);z(Ve=>{Aa(Ze,"href",t(Be).link),h(ue,t(Be).source),h(ve,Ve),h(je,t(Be).title)},[()=>t(Be).ts?c(t(Be).ts):""]),p(be,Ze)}),p(te,X)};L(K,te=>{t(l)?te(Oe):t(o)?te(Ee,1):t(a).length?te(Re,-1):te(Ce,2)})}S("click",P,T),p(e,_),Pn()}qn(["click"]);const es=[{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.
@@ -649,17 +649,17 @@ src/
Strg+Shift+R (Hard Reload). Wenn das nicht hilft:
Tab Server → Mission Control → Neu starten.
- `]]}],dv=[["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 cv=g('
'),vv=g(""),uv=g(''),pv=g('
'),fv=g('
Guide
Schritt für Schritt erklärt — von der ersten Einrichtung bis zu echten Agenten-Workflows.
Füge Erkenntnisse aus anderen KI-Sessions ein — jede Zeile wird ein eigener Eintrag.
'),bv=g('
Neuer Eintrag
Strg+Enter zum Speichern
'),_v=g(''),yv=g('
Lade…
'),xv=g(''),kv=g('
'),wv=g('
',1),Sv=g('
'),Mv=g(""),Ev=g(''),Av=g(`
Gedächtnis
Fakten, Entscheidungen und Kontext — geteilt von allen KI-Tools via MCP.
Filter:
Wie KI-Tools dieses Gedächtnis nutzen
Cline, OpenCode und Claude Code greifen über den Memory MCP-Server auf diese Einträge zu.
+
`]]}],dv=[["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 cv=g('
'),vv=g(""),uv=g(''),pv=g('
'),fv=g('
Guide
Schritt für Schritt erklärt — von der ersten Einrichtung bis zu echten Agenten-Workflows.
Füge Erkenntnisse aus anderen KI-Sessions ein — jede Zeile wird ein eigener Eintrag.
'),bv=g('
Neuer Eintrag
Strg+Enter zum Speichern
'),_v=g(''),yv=g('
Lade…
'),xv=g(''),kv=g('
'),wv=g('
',1),Sv=g('
'),Mv=g(""),Ev=g(''),Av=g(`
Gedächtnis
Fakten, Entscheidungen und Kontext — geteilt von allen KI-Tools via MCP.
Filter:
Wie KI-Tools dieses Gedächtnis nutzen
Cline, OpenCode und Claude Code greifen über den Memory MCP-Server auf diese Einträge zu.
Beim Start einer Session lädt der Agent automatisch alle Einträge — er kennt dann deinen Stack,
- deine Präferenzen und frühere Entscheidungen. Den Setup-Guide findest du unter Verbinden → Gedächtnis-MCP.
Über mich = wer du bist, Präferenzen · Verhalten = Regeln für alle KI-Tools · Stabil = Projektfakten · Versioniert = Tech-Versionen · Temporär = 7 Tage, dann weg
`,1);function Cv(e,n){$n(n,!0);let a=I(jt([])),s=I(!0),l=I("all"),o=I(!1),d=I(""),c=I("stable"),v=I(null),f=I(""),b=I("stable"),T=I(!1),_=I(""),y=I("stable"),P=I("import"),O=I(!1);const S=q(()=>t(_).split(`
-`).map(j=>j.trim()).filter(j=>j.length>0)),F=q(()=>t(l)==="all"?t(a):t(a).filter(j=>j.category===t(l))),Oe={user:{label:"Über mich",color:"#a78bfa"},instruction:{label:"Verhalten",color:"#fb923c"},stable:{label:"Stabil",color:"var(--accent)"},versioned:{label:"Versioniert",color:"#f59e0b"},ephemeral:{label:"Temporär",color:"var(--mut)"}};function Ee(j){const ce=Math.floor((Date.now()-new Date(j).getTime())/1e3);return ce<60?"gerade eben":ce<3600?`vor ${Math.floor(ce/60)} Min`:ce<86400?`vor ${Math.floor(ce/3600)} Std`:`vor ${Math.floor(ce/86400)} Tagen`}function ze(j){return t(a).filter(ce=>ce.category===j).length}async function Ke(){try{u(a,await Te("/api/memory"),!0)}catch(j){pe("Laden fehlgeschlagen: "+j.message,!0)}finally{u(s,!1)}}async function Y(){if(t(d).trim())try{const j=await Te("/api/memory",{method:"POST",body:JSON.stringify({content:t(d).trim(),category:t(c),source:"manual"})});u(a,[j,...t(a)],!0),u(d,""),u(c,"stable"),u(o,!1),pe("Gespeichert")}catch(j){pe("Fehler: "+j.message,!0)}}async function Z(j){try{const ce=await Te(`/api/memory/${j.id}`,{method:"PUT",body:JSON.stringify({content:t(f),category:t(b)})});u(a,t(a).map(A=>A.id===j.id?ce:A),!0),u(v,null),pe("Aktualisiert")}catch(ce){pe("Fehler: "+ce.message,!0)}}async function me(j){if(await xn({title:"Eintrag löschen?",body:`„${j.content.length>80?j.content.slice(0,80)+"…":j.content}" wird dauerhaft entfernt.`,danger:!0}))try{await Te(`/api/memory/${j.id}`,{method:"DELETE"}),u(a,t(a).filter(A=>A.id!==j.id),!0),pe("Gelöscht")}catch(A){pe("Fehler: "+A.message,!0)}}function Be(j){u(v,j.id,!0),u(f,j.content,!0),u(b,j.category,!0)}async function Ve(){if(t(S).length===0)return;u(O,!0);let j=0;for(const ce of t(S))try{const A=await Te("/api/memory",{method:"POST",body:JSON.stringify({content:ce,category:t(y),source:t(P)})});u(a,[A,...t(a)],!0),j++}catch{}u(O,!1),u(T,!1),u(_,""),pe(`${j} von ${t(S).length} Einträgen importiert`)}bi(()=>{Ke()});var Qe=Av(),vt=nt(Qe),D=i(r(vt),2),le=r(D),Ae=r(le),tt=i(le,2),N=r(tt),oe=i(vt,2);{var de=j=>{var ce=mv(),A=i(r(ce),6);Aa(A,"placeholder",`Tobi arbeitet am liebsten abends.
+ deine Präferenzen und frühere Entscheidungen. Den Setup-Guide findest du unter Verbinden → Gedächtnis-MCP.
Über mich = wer du bist, Präferenzen · Verhalten = Regeln für alle KI-Tools · Stabil = Projektfakten · Versioniert = Tech-Versionen · Temporär = 7 Tage, dann weg
`,1);function Cv(e,n){$n(n,!0);let a=I(jt([])),s=I(!0),l=I("all"),o=I(!1),d=I(""),c=I("stable"),v=I(null),f=I(""),b=I("stable"),T=I(!1),_=I(""),y=I("stable"),P=I("import"),O=I(!1);const M=q(()=>t(_).split(`
+`).map($=>$.trim()).filter($=>$.length>0)),K=q(()=>t(l)==="all"?t(a):t(a).filter($=>$.category===t(l))),Oe={user:{label:"Über mich",color:"#a78bfa"},instruction:{label:"Verhalten",color:"#fb923c"},stable:{label:"Stabil",color:"var(--accent)"},versioned:{label:"Versioniert",color:"#f59e0b"},ephemeral:{label:"Temporär",color:"var(--mut)"}};function Ee($){const G=Math.floor((Date.now()-new Date($).getTime())/1e3);return G<60?"gerade eben":G<3600?`vor ${Math.floor(G/60)} Min`:G<86400?`vor ${Math.floor(G/3600)} Std`:`vor ${Math.floor(G/86400)} Tagen`}function Ce($){return t(a).filter(G=>G.category===$).length}async function Re(){try{u(a,await we("/api/memory"),!0)}catch($){ce("Laden fehlgeschlagen: "+$.message,!0)}finally{u(s,!1)}}async function te(){if(t(d).trim())try{const $=await we("/api/memory",{method:"POST",body:JSON.stringify({content:t(d).trim(),category:t(c),source:"manual"})});u(a,[$,...t(a)],!0),u(d,""),u(c,"stable"),u(o,!1),ce("Gespeichert")}catch($){ce("Fehler: "+$.message,!0)}}async function X($){try{const G=await we(`/api/memory/${$.id}`,{method:"PUT",body:JSON.stringify({content:t(f),category:t(b)})});u(a,t(a).map(E=>E.id===$.id?G:E),!0),u(v,null),ce("Aktualisiert")}catch(G){ce("Fehler: "+G.message,!0)}}async function be($){if(await hn({title:"Eintrag löschen?",body:`„${$.content.length>80?$.content.slice(0,80)+"…":$.content}" wird dauerhaft entfernt.`,danger:!0}))try{await we(`/api/memory/${$.id}`,{method:"DELETE"}),u(a,t(a).filter(E=>E.id!==$.id),!0),ce("Gelöscht")}catch(E){ce("Fehler: "+E.message,!0)}}function Be($){u(v,$.id,!0),u(f,$.content,!0),u(b,$.category,!0)}let Ne=I(!1);async function Ze(){u(Ne,!0);try{const $=await we("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!1})});if($.duplicate_count===0){ce("Keine Dubletten gefunden 🎉");return}if(!await hn({title:`${$.duplicate_count} Dubletten entfernen?`,body:`${$.duplicate_count} doppelte Einträge werden gelöscht; die ${$.groups.length} vollständigeren bleiben erhalten. Nur exakte/enthaltene/sehr ähnliche Einträge derselben Kategorie.`,danger:!0}))return;const E=await we("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!0})});ce(`${E.removed} Dubletten entfernt`),await Re()}catch($){ce("Fehler: "+$.message,!0)}finally{u(Ne,!1)}}async function ut(){if(t(M).length===0)return;u(O,!0);let $=0;for(const G of t(M))try{const E=await we("/api/memory",{method:"POST",body:JSON.stringify({content:G,category:t(y),source:t(P)})});u(a,[E,...t(a)],!0),$++}catch{}u(O,!1),u(T,!1),u(_,""),ce(`${$} von ${t(M).length} Einträgen importiert`)}bi(()=>{Re()});var D=Av(),ue=tt(D),Ae=i(r(ue),2),He=r(Ae),N=r(He),ve=i(He,2),pe=r(ve),je=i(ve,2),Ve=r(je),nt=i(ue,2);{var it=$=>{var G=mv(),E=i(r(G),6);Aa(E,"placeholder",`Tobi arbeitet am liebsten abends.
Projektsprache: Deutsch.
Bosgame M5 läuft mit Ubuntu 26.04.
-...`);var B=i(A,2),ke=r(B),re=i(r(ke),2),$=r(re);$.value=$.__value="user";var ae=i($);ae.value=ae.__value="instruction";var we=i(ae);we.value=we.__value="stable";var Ce=i(we);Ce.value=Ce.__value="versioned";var M=i(Ce);M.value=M.__value="ephemeral";var K=i(ke,2),Q=i(r(K),2),fe=r(Q);fe.value=fe.__value="import";var se=i(fe);se.value=se.__value="claude";var Me=i(se);Me.value=Me.__value="gemini";var Se=i(Me);Se.value=Se.__value="chatgpt";var C=i(Se);C.value=C.__value="manual";var H=i(B,2);{var ve=be=>{var E=gv(),W=r(E);z(()=>h(W,`${t(S).length??""} Eintrag/Einträge erkannt`)),p(be,E)};L(H,be=>{t(S).length>0&&be(ve)})}var De=i(H,2),G=r(De),ie=r(G),Re=i(G,2);z(()=>{G.disabled=t(S).length===0||t(O),h(ie,t(O)?"Importiere…":`${t(S).length} Einträge speichern`)}),dn(A,()=>t(_),be=>u(_,be)),Jn(re,()=>t(y),be=>u(y,be)),Jn(Q,()=>t(P),be=>u(P,be)),w("click",G,Ve),w("click",Re,()=>{u(T,!1),u(_,"")}),p(j,ce)};L(oe,j=>{t(T)&&j(de)})}var He=i(oe,2);{var je=j=>{var ce=bv(),A=i(r(ce),4),B=i(A,4),ke=r(B);ke.value=ke.__value="user";var re=i(ke);re.value=re.__value="instruction";var $=i(re);$.value=$.__value="stable";var ae=i($);ae.value=ae.__value="versioned";var we=i(ae);we.value=we.__value="ephemeral";var Ce=i(B,2),M=r(Ce),K=i(M,2);z(Q=>M.disabled=Q,[()=>!t(d).trim()]),w("keydown",A,Q=>{Q.key==="Enter"&&(Q.ctrlKey||Q.metaKey)&&Y()}),dn(A,()=>t(d),Q=>u(d,Q)),Jn(B,()=>t(c),Q=>u(c,Q)),w("click",M,Y),w("click",K,()=>{u(o,!1),u(d,"")}),p(j,ce)};L(He,j=>{t(o)&&j(je)})}var at=i(He,2),st=r(at),it=i(r(st),2);Ze(it,17,()=>[["all","Alle","",t(a).length],["user","Über mich","#a78bfa",ze("user")],["instruction","Verhalten","#fb923c",ze("instruction")],["stable","Stabil","var(--accent)",ze("stable")],["versioned","Versioniert","#f59e0b",ze("versioned")],["ephemeral","Temporär","var(--mut)",ze("ephemeral")]],et,(j,ce)=>{var A=q(()=>Hn(t(ce),4));let B=()=>t(A)[0],ke=()=>t(A)[1],re=()=>t(A)[2],$=()=>t(A)[3];var ae=_v(),we=r(ae),Ce=i(we),M=r(Ce);z(()=>{Ct(ae,`cursor:pointer;${t(l)===B()?`background:rgba(45,212,191,.12);border-color:${re()||"var(--accent)"};color:${re()||"var(--accent)"}`:""}`),h(we,`${ke()??""} `),h(M,$())}),w("click",ae,()=>u(l,B(),!0)),w("keydown",ae,K=>K.key==="Enter"&&u(l,B(),!0)),p(j,ae)});var mt=i(at,2);{var Tt=j=>{var ce=yv();p(j,ce)},zt=j=>{var ce=kv(),A=r(ce),B=r(A),ke=r(B),re=i(B,2),$=r(re),ae=i(re,2);{var we=Ce=>{var M=xv();w("click",M,()=>u(o,!0)),p(Ce,M)};L(ae,Ce=>{t(a).length===0&&Ce(we)})}z(()=>{h(ke,t(a).length===0?"Noch keine Einträge":"Keine Treffer"),h($,t(a).length===0?'Klicke „+ Eintrag" um manuell etwas zu speichern, oder verbinde ein KI-Tool via MCP.':"Andere Kategorie wählen oder Eintrag anlegen.")}),p(j,ce)},Kt=j=>{var ce=Ev();Ze(ce,23,()=>t(F),A=>A.id,(A,B,ke)=>{var re=Mv(),$=r(re);{var ae=Ce=>{var M=wv(),K=nt(M),Q=i(K,2),fe=r(Q);fe.value=fe.__value="user";var se=i(fe);se.value=se.__value="instruction";var Me=i(se);Me.value=Me.__value="stable";var Se=i(Me);Se.value=Se.__value="versioned";var C=i(Se);C.value=C.__value="ephemeral";var H=i(Q,2),ve=r(H),De=i(ve,2);dn(K,()=>t(f),G=>u(f,G)),Jn(Q,()=>t(b),G=>u(b,G)),w("click",ve,()=>Z(t(B))),w("click",De,()=>u(v,null)),p(Ce,M)},we=Ce=>{var M=Sv(),K=r(M),Q=r(K),fe=r(Q),se=i(Q,2),Me=r(se),Se=r(Me),C=i(Me,2),H=r(C),ve=i(C,2),De=r(ve),G=i(K,2),ie=r(G),Re=i(ie,2);z(be=>{var E,W,_e;h(fe,t(B).content),Ct(Me,`border-color:${(((E=Oe[t(B).category])==null?void 0:E.color)||"var(--mut)")??""};color:${(((W=Oe[t(B).category])==null?void 0:W.color)||"var(--mut)")??""}`),h(Se,((_e=Oe[t(B).category])==null?void 0:_e.label)||t(B).category),h(H,t(B).source),h(De,be)},[()=>Ee(t(B).updated_at)]),w("click",ie,()=>Be(t(B))),w("click",Re,()=>me(t(B))),p(Ce,M)};L($,Ce=>{t(v)===t(B).id?Ce(ae):Ce(we,-1)})}z(()=>Ct(re,`padding:14px 16px;${t(ke){t(s)?j(Tt):t(F).length===0?j(zt,1):j(Kt,-1)})}var It=i(mt,2),Dt=i(r(It),2),Lt=i(r(Dt),3);z(()=>{h(Ae,t(T)?"Abbrechen":"⇩ Import"),h(N,t(o)?"Abbrechen":"+ Eintrag")}),w("click",le,()=>{u(T,!t(T)),u(o,!1),u(_,"")}),w("click",tt,()=>{u(o,!t(o)),u(T,!1),u(d,"")}),w("click",Lt,j=>{var ce;j.preventDefault(),(ce=document.querySelector(".nav-item[data-view='connect']"))==null||ce.click()}),p(e,Qe),Pn()}qn(["click","keydown"]);var ts=g(''),Tv=g('Sessions'),zv=g('Nachrichten'),$v=g('Tool-Calls'),Pv=g('Tokens'),Dv=g('aktiv'),Iv=g('
'),Lv=g('
Meistgenutzte Tools
',1),Ov=g('
Aktivität(letzte 30 Tage)
'),Bv=g('
'),Rv=g('
'),Fv=g('
'),Kv=g('
Was Hermes über dich gelernt hat(automatisches Profil)
'),Nv=g(`
Keine geplanten Jobs. Hermes kann selbst welche anlegen — sag ihm z. B.
+...`);var Z=i(E,2),ke=r(Z),Pe=i(r(ke),2),C=r(Pe);C.value=C.__value="user";var B=i(C);B.value=B.__value="instruction";var se=i(B);se.value=se.__value="stable";var ie=i(se);ie.value=ie.__value="versioned";var ee=i(ie);ee.value=ee.__value="ephemeral";var Se=i(ke,2),de=i(r(Se),2),A=r(de);A.value=A.__value="import";var j=i(A);j.value=j.__value="claude";var oe=i(j);oe.value=oe.__value="gemini";var Me=i(oe);Me.value=Me.__value="chatgpt";var U=i(Me);U.value=U.__value="manual";var le=i(Z,2);{var Te=V=>{var xe=gv(),Ie=r(xe);z(()=>h(Ie,`${t(M).length??""} Eintrag/Einträge erkannt`)),p(V,xe)};L(le,V=>{t(M).length>0&&V(Te)})}var ze=i(le,2),x=r(ze),H=r(x),he=i(x,2);z(()=>{x.disabled=t(M).length===0||t(O),h(H,t(O)?"Importiere…":`${t(M).length} Einträge speichern`)}),dn(E,()=>t(_),V=>u(_,V)),Jn(Pe,()=>t(y),V=>u(y,V)),Jn(de,()=>t(P),V=>u(P,V)),S("click",x,ut),S("click",he,()=>{u(T,!1),u(_,"")}),p($,G)};L(nt,$=>{t(T)&&$(it)})}var et=i(nt,2);{var bt=$=>{var G=bv(),E=i(r(G),4),Z=i(E,4),ke=r(Z);ke.value=ke.__value="user";var Pe=i(ke);Pe.value=Pe.__value="instruction";var C=i(Pe);C.value=C.__value="stable";var B=i(C);B.value=B.__value="versioned";var se=i(B);se.value=se.__value="ephemeral";var ie=i(Z,2),ee=r(ie),Se=i(ee,2);z(de=>ee.disabled=de,[()=>!t(d).trim()]),S("keydown",E,de=>{de.key==="Enter"&&(de.ctrlKey||de.metaKey)&&te()}),dn(E,()=>t(d),de=>u(d,de)),Jn(Z,()=>t(c),de=>u(c,de)),S("click",ee,te),S("click",Se,()=>{u(o,!1),u(d,"")}),p($,G)};L(et,$=>{t(o)&&$(bt)})}var wt=i(et,2),Ct=r(wt),Kt=i(r(Ct),2);Je(Kt,17,()=>[["all","Alle","",t(a).length],["user","Über mich","#a78bfa",Ce("user")],["instruction","Verhalten","#fb923c",Ce("instruction")],["stable","Stabil","var(--accent)",Ce("stable")],["versioned","Versioniert","#f59e0b",Ce("versioned")],["ephemeral","Temporär","var(--mut)",Ce("ephemeral")]],Xe,($,G)=>{var E=q(()=>Hn(t(G),4));let Z=()=>t(E)[0],ke=()=>t(E)[1],Pe=()=>t(E)[2],C=()=>t(E)[3];var B=_v(),se=r(B),ie=i(se),ee=r(ie);z(()=>{At(B,`cursor:pointer;${t(l)===Z()?`background:rgba(45,212,191,.12);border-color:${Pe()||"var(--accent)"};color:${Pe()||"var(--accent)"}`:""}`),h(se,`${ke()??""} `),h(ee,C())}),S("click",B,()=>u(l,Z(),!0)),S("keydown",B,Se=>Se.key==="Enter"&&u(l,Z(),!0)),p($,B)});var Pt=i(wt,2);{var Dt=$=>{var G=yv();p($,G)},Lt=$=>{var G=kv(),E=r(G),Z=r(E),ke=r(Z),Pe=i(Z,2),C=r(Pe),B=i(Pe,2);{var se=ie=>{var ee=xv();S("click",ee,()=>u(o,!0)),p(ie,ee)};L(B,ie=>{t(a).length===0&&ie(se)})}z(()=>{h(ke,t(a).length===0?"Noch keine Einträge":"Keine Treffer"),h(C,t(a).length===0?'Klicke „+ Eintrag" um manuell etwas zu speichern, oder verbinde ein KI-Tool via MCP.':"Andere Kategorie wählen oder Eintrag anlegen.")}),p($,G)},It=$=>{var G=Ev();Je(G,23,()=>t(K),E=>E.id,(E,Z,ke)=>{var Pe=Mv(),C=r(Pe);{var B=ie=>{var ee=wv(),Se=tt(ee),de=i(Se,2),A=r(de);A.value=A.__value="user";var j=i(A);j.value=j.__value="instruction";var oe=i(j);oe.value=oe.__value="stable";var Me=i(oe);Me.value=Me.__value="versioned";var U=i(Me);U.value=U.__value="ephemeral";var le=i(de,2),Te=r(le),ze=i(Te,2);dn(Se,()=>t(f),x=>u(f,x)),Jn(de,()=>t(b),x=>u(b,x)),S("click",Te,()=>X(t(Z))),S("click",ze,()=>u(v,null)),p(ie,ee)},se=ie=>{var ee=Sv(),Se=r(ee),de=r(Se),A=r(de),j=i(de,2),oe=r(j),Me=r(oe),U=i(oe,2),le=r(U),Te=i(U,2),ze=r(Te),x=i(Se,2),H=r(x),he=i(H,2);z(V=>{var xe,Ie,Fe;h(A,t(Z).content),At(oe,`border-color:${(((xe=Oe[t(Z).category])==null?void 0:xe.color)||"var(--mut)")??""};color:${(((Ie=Oe[t(Z).category])==null?void 0:Ie.color)||"var(--mut)")??""}`),h(Me,((Fe=Oe[t(Z).category])==null?void 0:Fe.label)||t(Z).category),h(le,t(Z).source),h(ze,V)},[()=>Ee(t(Z).updated_at)]),S("click",H,()=>Be(t(Z))),S("click",he,()=>be(t(Z))),p(ie,ee)};L(C,ie=>{t(v)===t(Z).id?ie(B):ie(se,-1)})}z(()=>At(Pe,`padding:14px 16px;${t(ke){t(s)?$(Dt):t(K).length===0?$(Lt,1):$(It,-1)})}var Tt=i(Pt,2),F=i(r(Tt),2),Y=i(r(F),3);z(()=>{He.disabled=t(Ne),h(N,t(Ne)?"…":"🧹 Aufräumen"),h(pe,t(T)?"Abbrechen":"⇩ Import"),h(Ve,t(o)?"Abbrechen":"+ Eintrag")}),S("click",He,Ze),S("click",ve,()=>{u(T,!t(T)),u(o,!1),u(_,"")}),S("click",je,()=>{u(o,!t(o)),u(T,!1),u(d,"")}),S("click",Y,$=>{var G;$.preventDefault(),(G=document.querySelector(".nav-item[data-view='connect']"))==null||G.click()}),p(e,D),Pn()}qn(["click","keydown"]);var ts=g(''),Tv=g('Sessions'),zv=g('Nachrichten'),$v=g('Tool-Calls'),Pv=g('Tokens'),Dv=g('aktiv'),Iv=g('
'),Lv=g('
Meistgenutzte Tools
',1),Ov=g('
Aktivität(letzte 30 Tage)
'),Bv=g('
'),Rv=g('
'),Fv=g('
'),Kv=g('
Was Hermes über dich gelernt hat(automatisches Profil)
'),Nv=g(`
Keine geplanten Jobs. Hermes kann selbst welche anlegen — sag ihm z. B.
„Erinnere mich jeden Morgen um 9 Uhr an die offenen Modell-Upgrades".
`),qv=g(''),Gv=g(``),Vv=g(''),Wv=g('
Keine Skills geladen (oder Agent offline).
'),jv=g(''),Uv=g(''),Hv=g('
'),Jv=g(''),Qv=g('
Agent-Cockpit
Status
Hermes-Gateway-Dienst (:8642) auf dem Bosgame
Geplante Aufgaben
Skills
'),Zv=g('
pip install faster-whisper
'),Yv=g('
'),Xv=g('
4. Bosgame-Key eintragen (in Windows PowerShell):
'),eu=g('
SSH-Key nicht gefunden — bitte auf dem Bosgame generieren: ssh-keygen -t ed25519 -C "hermes-agent@bosgame" -f ~/.ssh/id_ed25519_hermes_agent -N ""
'),tu=g('
Einrichtung (einmalig, ~3 Minuten):
1. PowerShell als Admin — OpenSSH Server installieren: