diff --git a/frontend/src/panels/HermesPanel.svelte b/frontend/src/panels/HermesPanel.svelte index 3e24cf0..8edba35 100644 --- a/frontend/src/panels/HermesPanel.svelte +++ b/frontend/src/panels/HermesPanel.svelte @@ -255,7 +255,18 @@ {#if status?.piper !== 'ready'} -
{"# Auf dem Bosgame:\nmkdir -p /opt/mission-control/piper/voices\n# Piper Binary + Thorsten-Stimme (Anleitung in Guides)"}{[
+ '# 1. Piper Binary (Linux x86_64)',
+ 'mkdir -p /opt/mission-control/piper/voices',
+ 'cd /tmp && wget -q https://github.com/rhasspy/piper/releases/download/2023.11.14-2/piper_linux_x86_64.tar.gz',
+ 'tar -xzf piper_linux_x86_64.tar.gz -C /opt/mission-control/piper/ --strip-components=1',
+ '',
+ '# 2. Deutsche Stimme (Thorsten, medium ~65 MB)',
+ 'wget -q -O /opt/mission-control/piper/voices/de_DE-thorsten-medium.onnx \\',
+ ' "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/thorsten/medium/de_DE-thorsten-medium.onnx"',
+ 'wget -q -O /opt/mission-control/piper/voices/de_DE-thorsten-medium.onnx.json \\',
+ ' "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/thorsten/medium/de_DE-thorsten-medium.onnx.json"',
+ ].join('\n')}${n}
'),_d=b('| Modell | Kann | Details | Status | Port | Aktionen |
|---|
'),_d=b('| Modell | Kann | Details | Status | Port | Aktionen |
|---|
apt update & upgrade aus. Das kann ein paar Minuten dauern; der Fortschritt erscheint in der Aktivität."}))return;const L=await Ur({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(L)try{const de=await $e("/api/os-update",{method:"POST",body:JSON.stringify({password:L})});ne("OS-Update gestartet."),y(de.job_id,"OS-Update")}catch(de){ne(de.message,!0)}}async function ke(){if(!await mn({title:"Server wirklich neu starten?",body:"Der ganze Bosgame startet physisch neu. Alles ist für ~1 Minute offline — auch dieses Dashboard.",confirmLabel:"Reboot",danger:!0}))return;const L=await Ur({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(L)try{await $e("/api/reboot",{method:"POST",body:JSON.stringify({password:L})}),ne("Reboot ausgelöst — bis gleich.")}catch(de){ne(de.message,!0)}}async function xe(){u(Ae,"prüfe…");try{const L=await $e("/api/integration/test");u(Ae,L.ok?`✓ Engine antwortet — ${L.models.length} Modell(e): ${L.models.join(", ")}`:`✗ keine Verbindung: ${L.error}`,!0),u(q,L.ok,!0)}catch(L){u(Ae,"✗ "+L.message),u(q,!1)}}let Ae=O(""),q=O(!1);const te=K(()=>{var L;return((L=t(a))==null?void 0:L.models)||[]}),we=["running","ready","loading","starting"],Ce=K(()=>t(te).find(L=>we.includes(L.state)));function Be(L){if(!L||L.state!=="running")return null;if(typeof L.progress=="number")return Math.min(100,L.progress);const Te=((L.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return Te?Math.min(100,parseFloat(Te[1])):null}var Ue=jd(),mt=r(et(Ue),2),z=i(mt),ie=r(i(z),2),ge=i(ie),tt=r(z,4),oe=i(tt),Ke=r(i(oe)),ue=i(Ke),N=r(oe,2),Y=r(i(N),2),pe=i(Y),fe=r(N,2),Ne=r(i(fe),2),Ye=i(Ne),ft=r(tt,2),dt=i(ft),st=r(dt,2);{var Re=L=>{var de=Rd(),Te=i(de);P(()=>{It(de,`color:${t(q)?"#7ee29a":"#ff9b95"}`),g(Te,t(Ae))}),f(L,de)};F(st,L=>{t(Ae)&&L(Re)})}var Fe=r(mt,2),bt=r(i(Fe),4),W=r(bt,2),X=r(W,2),E=r(X,2),I=r(E,2),le=r(Fe,2),se=r(i(le),4),m=r(se,2),$=r(le,2);{var ae=L=>{const de=K(()=>t(C)),Te=K(()=>t(de).state==="done"),ze=K(()=>t(de).state==="failed"),me=K(()=>t(de).state==="canceled"),Tt=K(()=>t(Te)||t(ze)||t(me)),Bt=K(()=>Be(t(de)));var Dt=Vd(),A=i(Dt),Z=r(i(A),2);{var Ve=De=>{var xt=Fd();S("click",xt,async()=>{await mn({title:t(p)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&$e(`/api/jobs/${t(de).id}/cancel`,{method:"POST"})}),f(De,xt)};F(Z,De=>{t(Tt)||De(Ve)})}var he=r(Z,2),G=i(he);{var Q=De=>{var xt=Kd();f(De,xt)},V=De=>{var xt=Nd();f(De,xt)},R=De=>{var xt=qd();f(De,xt)},H=De=>{var xt=Wd();f(De,xt)};F(G,De=>{t(Te)?De(Q):t(ze)?De(V,1):t(me)?De(R,2):De(H,-1)})}var ee=r(A,2),ve=i(ee),Ie=r(ee,2);{var Ee=De=>{var xt=Gd(),Rn=i(xt);P(()=>It(Rn,`width:${t(Bt)??""}%`)),f(De,xt)};F(Ie,De=>{t(Bt)!=null&&!t(Tt)&&De(Ee)})}var ct=r(Ie,2),Et=i(ct);P(De=>{g(ve,`${t(p)??""}${t(Tt)?t(Te)?" — erfolgreich.":t(me)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),g(Et,De)},[()=>(t(de).log||[]).join(`
-`)]),f(L,Dt)};F($,L=>{t(C)&&L(ae)})}var re=r($,2),U=i(re),be=r(i(U),2),_e=i(be);_e.value=_e.__value="llama-swap";var Le=r(_e);Le.value=Le.__value="mission-control";var Qe=r(Le);Qe.value=Qe.__value="system";var Me=r(U,4),Ze=i(Me);Fo(Me,L=>d=L,()=>d),P(L=>{var de,Te,ze;It(ie,`margin-left:auto;${(de=t(a))!=null&&de.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"}`),g(ge,(Te=t(a))!=null&&Te.swap_ok?"● erreichbar":"● offline"),g(ue,(((ze=t(a))==null?void 0:ze.swap_url)||"—")+"/v1"),g(pe,t(Ce)?t(Ce).name+` (${t(Ce).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),g(Ye,L),g(Ze,t(o))},[()=>t(te).filter(L=>!L.incomplete).length||"keine"]),S("click",dt,xe),S("click",bt,()=>T("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),S("click",W,()=>T("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),S("click",X,D),S("click",E,M),S("click",I,B),S("click",se,We),S("click",m,ke),S("change",be,x),xa(be,()=>t(c),L=>u(c,L)),f(e,Ue),Bn()}jn(["click","change"]);var Hd=b('apt update & upgrade aus. Das kann ein paar Minuten dauern; der Fortschritt erscheint in der Aktivität."}))return;const L=await Ur({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(L)try{const de=await $e("/api/os-update",{method:"POST",body:JSON.stringify({password:L})});ne("OS-Update gestartet."),y(de.job_id,"OS-Update")}catch(de){ne(de.message,!0)}}async function xe(){if(!await mn({title:"Server wirklich neu starten?",body:"Der ganze Bosgame startet physisch neu. Alles ist für ~1 Minute offline — auch dieses Dashboard.",confirmLabel:"Reboot",danger:!0}))return;const L=await Ur({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(L)try{await $e("/api/reboot",{method:"POST",body:JSON.stringify({password:L})}),ne("Reboot ausgelöst — bis gleich.")}catch(de){ne(de.message,!0)}}async function ke(){u(Ae,"prüfe…");try{const L=await $e("/api/integration/test");u(Ae,L.ok?`✓ Engine antwortet — ${L.models.length} Modell(e): ${L.models.join(", ")}`:`✗ keine Verbindung: ${L.error}`,!0),u(q,L.ok,!0)}catch(L){u(Ae,"✗ "+L.message),u(q,!1)}}let Ae=O(""),q=O(!1);const te=K(()=>{var L;return((L=t(a))==null?void 0:L.models)||[]}),we=["running","ready","loading","starting"],Ce=K(()=>t(te).find(L=>we.includes(L.state)));function Be(L){if(!L||L.state!=="running")return null;if(typeof L.progress=="number")return Math.min(100,L.progress);const Te=((L.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return Te?Math.min(100,parseFloat(Te[1])):null}var Ue=jd(),mt=r(et(Ue),2),z=i(mt),ie=r(i(z),2),ge=i(ie),tt=r(z,4),oe=i(tt),Ke=r(i(oe)),ue=i(Ke),N=r(oe,2),Y=r(i(N),2),pe=i(Y),fe=r(N,2),Ne=r(i(fe),2),Ye=i(Ne),ft=r(tt,2),dt=i(ft),st=r(dt,2);{var Re=L=>{var de=Rd(),Te=i(de);P(()=>{Ot(de,`color:${t(q)?"#7ee29a":"#ff9b95"}`),g(Te,t(Ae))}),f(L,de)};F(st,L=>{t(Ae)&&L(Re)})}var Fe=r(mt,2),bt=r(i(Fe),4),W=r(bt,2),X=r(W,2),E=r(X,2),I=r(E,2),le=r(Fe,2),se=r(i(le),4),m=r(se,2),$=r(le,2);{var ae=L=>{const de=K(()=>t(C)),Te=K(()=>t(de).state==="done"),ze=K(()=>t(de).state==="failed"),me=K(()=>t(de).state==="canceled"),Tt=K(()=>t(Te)||t(ze)||t(me)),$t=K(()=>Be(t(de)));var zt=Vd(),A=i(zt),Z=r(i(A),2);{var Ve=De=>{var kt=Fd();S("click",kt,async()=>{await mn({title:t(p)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&$e(`/api/jobs/${t(de).id}/cancel`,{method:"POST"})}),f(De,kt)};F(Z,De=>{t(Tt)||De(Ve)})}var he=r(Z,2),G=i(he);{var Q=De=>{var kt=Kd();f(De,kt)},V=De=>{var kt=Nd();f(De,kt)},R=De=>{var kt=qd();f(De,kt)},H=De=>{var kt=Wd();f(De,kt)};F(G,De=>{t(Te)?De(Q):t(ze)?De(V,1):t(me)?De(R,2):De(H,-1)})}var ee=r(A,2),ve=i(ee),Ie=r(ee,2);{var Ee=De=>{var kt=Gd(),Rn=i(kt);P(()=>Ot(Rn,`width:${t($t)??""}%`)),f(De,kt)};F(Ie,De=>{t($t)!=null&&!t(Tt)&&De(Ee)})}var ct=r(Ie,2),Et=i(ct);P(De=>{g(ve,`${t(p)??""}${t(Tt)?t(Te)?" — erfolgreich.":t(me)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),g(Et,De)},[()=>(t(de).log||[]).join(`
+`)]),f(L,zt)};F($,L=>{t(C)&&L(ae)})}var re=r($,2),U=i(re),be=r(i(U),2),_e=i(be);_e.value=_e.__value="llama-swap";var Le=r(_e);Le.value=Le.__value="mission-control";var Qe=r(Le);Qe.value=Qe.__value="system";var Me=r(U,4),Ze=i(Me);Fo(Me,L=>d=L,()=>d),P(L=>{var de,Te,ze;Ot(ie,`margin-left:auto;${(de=t(a))!=null&&de.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"}`),g(ge,(Te=t(a))!=null&&Te.swap_ok?"● erreichbar":"● offline"),g(ue,(((ze=t(a))==null?void 0:ze.swap_url)||"—")+"/v1"),g(pe,t(Ce)?t(Ce).name+` (${t(Ce).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),g(Ye,L),g(Ze,t(o))},[()=>t(te).filter(L=>!L.incomplete).length||"keine"]),S("click",dt,ke),S("click",bt,()=>T("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),S("click",W,()=>T("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),S("click",X,D),S("click",E,M),S("click",I,B),S("click",se,We),S("click",m,xe),S("change",be,k),ka(be,()=>t(c),L=>u(c,L)),f(e,Ue),Bn()}jn(["click","change"]);var Hd=b('http://192.168.178.151:8080/v1 — nicht den Proxy-Namen.Jan AI ist eine Desktop-App — kein Browser, kein Server, kein Admin-Panel. Einfach installieren und loslegen.
Jan AI öffnen → linke Leiste → Remote-Modelle → + Modell hinzufügen:
local). Jan AI fragt danach beim Einrichten.Datei anlegen oder öffnen: ~/.continue/config.json
config.json vorhanden: nur den "models"-Eintrag ergänzen, nicht die ganze Datei ersetzen. Danach Continue in VS Code neu starten → im Chat-Panel das Modell wählen.
Antigravity (Googles agentic IDE, VS Code-basiert) unterstützt OpenAI-kompatible Endpoints direkt:
Settings → Models → Custom Endpoint → + hinzufügen:
local). Danach das Modell in der Model-Liste auswählen.Öffne die Zed-Settings mit Cmd/Strg + , und füge diesen Block in deine bestehende settings.json ein. Falls bereits ein "bosgame"-Eintrag existiert: vorher löschen.
API-Key: Öffne den Agent-Panel → Anbieter bosgame → trag irgendeinen Wert ein (z.B. local).
Datei anlegen oder öffnen:
Windows: %USERPROFILE%\\.config\\opencode\\opencode.json
"provider"-Block einfügen. Falls bereits ein "llama-swap"-Eintrag vorhanden: vorher löschen, sonst erscheinen Modelle doppelt. Danach in OpenCode /models → wählen.
In Cline/Cursor den Provider „OpenAI Compatible" wählen:
local).Settings → Admin Panel → Connections → neue OpenAI-Verbindung:
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.
pip install mcp httpx ausführen — danach mcp_memory.py aus dem Repo-Ordner erreichbar machen (Pfad im Snippet anpassen).Block in ~/.config/opencode/opencode.json unter "mcpServers" einfügen.
pip install mcp httpx — und Pfad zu mcp_memory.py im Snippet anpassen.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.
pip install faster-whisper ssh-keygen -t ed25519 -C "hermes-agent@bosgame" -f ~/.ssh/id_ed25519_hermes_agent -N ""Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0HERMES_WINDOWS_HOST=192.168.178.XXXpip install faster-whisper ssh-keygen -t ed25519 -C "hermes-agent@bosgame" -f ~/.ssh/id_ed25519_hermes_agent -N ""Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0HERMES_WINDOWS_HOST=192.168.178.XXX