fix+docs: Bug-Fixes, vollstaendige Dokumentation v8
Bug-Fixes: - hermes_agent.py: asyncio.get_event_loop() → get_running_loop() (Python 3.10+) - routers/hermes.py: Thread-Lock fuer Whisper-Init, HERMES_WINDOWS_USER Import, Piper stderr logging, __import__ Anti-Pattern entfernt - routers/memory.py: SQLite WAL-Mode, Kategorie-Enum-Validierung (user/instruction/stable/versioned/ephemeral) - HermesPanel.svelte: findLast() → reverse().find() (Browser-Kompatibilitaet) - ConnectPanel.svelte: Hardcoded Username durch Platzhalter ersetzt Docs: - CLAUDE.md: komplett aktualisiert (v7+v8, Hermes, Memory, alle Env-Vars) - ROADMAP.md: v7+v8 als erledigt, naechste Features (v8.1-v9.1) - README.md: komplett neu geschrieben (Agentic OS Konzept, alle Features) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,85 +1,111 @@
|
||||
# Mission Control
|
||||
|
||||
Eine schlanke Steuerzentrale für deinen lokalen `llama-swap`-Stack auf dem Bosgame M5.
|
||||
Ein FastAPI-Backend + ein HTML-Dashboard. Kein Build-Schritt, keine Datenbank.
|
||||
Persönliche Steuerzentrale für einen lokalen LLM-Stack auf dem Bosgame M5.
|
||||
FastAPI-Backend + Svelte 5-Frontend. Kein Cloud-Zwang, keine Datenbank-Abhängigkeit.
|
||||
|
||||
## Was sie kann
|
||||
## Was es kann
|
||||
|
||||
- **Modelle & Ports** sehen — liest `llama-swap` (`/running`, `/v1/models`) + deine `config.yaml`
|
||||
- **Modell holen** — lädt eine GGUF-Datei von HuggingFace (`hf download`) als Hintergrund-Job mit Live-Log
|
||||
- **Einpflegen** — schreibt das Modell automatisch in deine `config.yaml`; `llama-swap` lädt mit `-watch-config` neu
|
||||
- **Wartung** — Container/Toolbox aktualisieren, Modelle aus dem Speicher werfen
|
||||
- **Schnelltest** — Chat-Box, um ein Modell zu wecken und zu prüfen
|
||||
**LLM-Stack verwalten**
|
||||
- Modelle & Status sehen (llama-swap `/running`, `/v1/models`, `config.yaml`)
|
||||
- Modelle von HuggingFace laden — als Hintergrund-Job mit Live-Log
|
||||
- Automatisch in llama-swap einpflegen (`-watch-config`)
|
||||
- Optimale Kontextfenster berechnen (hardware-aware, `hw_math`)
|
||||
|
||||
Was sie **bewusst nicht** macht: Chat-Logs, Inferenz-Monitoring im Detail — dafür hat `llama-swap`
|
||||
schon `/ui` und `/log`. Mission Control ergänzt nur, was fehlt.
|
||||
**Cookbook**
|
||||
- Use-Case-getrieben: Coding · Chat · Vision · Agenten · Schnell & sparsam
|
||||
- Hardware-Ampel pro Setup, „Beste Wahl für dein System"
|
||||
- 1-Klick „Komplettes Setup installieren"
|
||||
|
||||
**Wartung & Server**
|
||||
- OS-Updates, Dienste steuern (llama-swap, Mission Control), Reboot
|
||||
- Live-Logs (journalctl via WebSocket)
|
||||
- Self-Update-Button (git pull → rsync → restart)
|
||||
|
||||
**Verbinden**
|
||||
- Copy-Paste-Configs für Cline, OpenCode, Zed, Continue, Jan AI, OpenWebUI
|
||||
- Gedächtnis-MCP: alle Tools teilen dasselbe persistente Gedächtnis
|
||||
|
||||
**Gedächtnis** *(v7)*
|
||||
- SQLite-Datenbank mit 5 Kategorien: `user` · `instruction` · `stable` · `versioned` · `ephemeral`
|
||||
- MCP-Server (`mcp_memory.py`): Cline, OpenCode, Claude Code teilen dasselbe Gedächtnis
|
||||
- Temporäre Einträge (ephemeral) nach 7 Tagen automatisch gelöscht
|
||||
|
||||
**Hermes Agent** *(v8)*
|
||||
- Lokaler KI-Assistent direkt im Browser — Text und Sprache
|
||||
- Whisper STT (lokal, ROCm-beschleunigt) + Piper TTS (weibliche Stimme Kerstin)
|
||||
- Tool Calling: Dateien lesen, Befehle ausführen, System abfragen, Web suchen
|
||||
- Gedächtnis-Integration: Hermes kennt dich und deinen Stack von Anfang an
|
||||
- Setup-Wizard für Piper + Windows SSH-Zugriff
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
- Python 3.11+
|
||||
- `hf` CLI installiert (`pip install -U "huggingface_hub[cli]"`)
|
||||
- ein laufendes `llama-swap` — gestartet **mit `-watch-config`**, sonst greift das Auto-Einpflegen nicht
|
||||
- `llama-swap` laufend mit `-watch-config`
|
||||
- `hf` CLI (`pip install -U "huggingface_hub[cli]"`)
|
||||
- Für Voice: `faster-whisper` + Piper Binary (Anleitung im Hermes-Tab)
|
||||
|
||||
## Installation
|
||||
## Schnellstart (Bosgame)
|
||||
|
||||
```bash
|
||||
sudo mkdir -p /opt/mission-control && sudo chown $USER /opt/mission-control
|
||||
cp -r *.py routers static /opt/mission-control/
|
||||
git clone http://192.168.178.153:3000/Hitonabi/mission-control.git ~/mission-control
|
||||
rsync -a --exclude='.git' ~/mission-control/ /opt/mission-control/
|
||||
cd /opt/mission-control
|
||||
python3 -m venv .venv && . .venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
uvicorn app:app --host 0.0.0.0 --port 9000
|
||||
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
|
||||
```
|
||||
|
||||
Dann im Browser im LAN: `http://<bosgame-ip>:9000`
|
||||
|
||||
### Als Dienst (Autostart)
|
||||
|
||||
Pfade in `mission-control.service` anpassen, dann:
|
||||
|
||||
Als Dienst:
|
||||
```bash
|
||||
sudo cp mission-control.service /etc/systemd/system/
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable --now mission-control
|
||||
sudo systemctl daemon-reload && sudo systemctl enable --now mission-control
|
||||
```
|
||||
|
||||
## Konfiguration (Umgebungsvariablen)
|
||||
Browser im LAN: `http://192.168.178.151:9000`
|
||||
|
||||
## Konfiguration
|
||||
|
||||
Alle Einstellungen über Umgebungsvariablen in der systemd-Unit:
|
||||
|
||||
| Variable | Default | Zweck |
|
||||
|---|---|---|
|
||||
| `MC_LLAMA_SWAP_URL` | `http://127.0.0.1:8080` | wo `llama-swap` lauscht |
|
||||
| `MC_CONFIG_PATH` | `/etc/llama-swap/config.yaml` | die `llama-swap`-Config |
|
||||
| `MC_MODELS_DIR` | `/srv/models` | wohin GGUFs geladen werden |
|
||||
| `MC_CMD_TEMPLATE` | siehe unten | Startbefehl pro Modell |
|
||||
| `MC_UPDATE_CMD` | _(leer)_ | Befehl für „Container aktualisieren" |
|
||||
| `MC_DEFAULT_TTL` | `300` | Sekunden bis Auto-Unload |
|
||||
| `MC_TOKEN` | _(leer)_ | optionales Zugriffs-Token |
|
||||
| `MC_LLAMA_SWAP_URL` | `http://127.0.0.1:8080` | llama-swap URL |
|
||||
| `MC_CONFIG_PATH` | `/etc/llama-swap/config.yaml` | llama-swap Config |
|
||||
| `MC_MODELS_DIR` | `/srv/models` | GGUF-Ablageort |
|
||||
| `MC_TOKEN` | leer | Auth-Token (optional) |
|
||||
| `MC_UPDATE_CMD` | leer | Engine-Update-Befehl |
|
||||
| `MC_SOURCE_DIR` | `~/mission-control` | Self-Update Quelle |
|
||||
| `MC_MEMORY_DB` | `{MODELS_DIR}/mission-control-memory.db` | Gedächtnis-Datenbank |
|
||||
| `HERMES_SIMPLE_MODEL` | `scout` | Modell für einfache Tasks |
|
||||
| `HERMES_COMPLEX_MODEL` | `coder` | Modell für komplexe Tasks |
|
||||
| `HERMES_WINDOWS_HOST` | leer | Windows-PC IP für SSH-Zugriff |
|
||||
| `PIPER_BIN` | `/opt/mission-control/piper/piper` | Piper TTS Binary |
|
||||
| `PIPER_VOICE` | `.../de_DE-kerstin-low.onnx` | Piper Stimme |
|
||||
| `WHISPER_MODEL` | `medium` | Whisper Modell-Größe |
|
||||
|
||||
### Wichtig: `MC_CMD_TEMPLATE` an deinen Start anpassen
|
||||
## Sicherheit
|
||||
|
||||
Das ist der Befehl, der pro Modell in die `config.yaml` geschrieben wird. `{model}` und `{ctx}`
|
||||
werden von Mission Control ersetzt, **`${PORT}` bleibt stehen** (das ersetzt `llama-swap` selbst).
|
||||
- Ausschließlich im vertrauenswürdigen LAN betreiben
|
||||
- `MC_TOKEN` setzen für minimalen Schutz
|
||||
- Für Remote-Zugriff: SSH-Tunnel oder Tailscale, niemals direktes Port-Forwarding
|
||||
- Hermes-SSH-Key hat nur Zugriff auf explizit freigegebene Windows-Pfade
|
||||
|
||||
## Architektur
|
||||
|
||||
Direkt auf dem Host (llama-server im PATH):
|
||||
```
|
||||
llama-server -m {model} --host 127.0.0.1 --port ${PORT} -c {ctx} -ngl 999 -fa 1 --no-mmap
|
||||
Browser (Windows PC)
|
||||
├── Svelte 5 UI (static/dist/main.js)
|
||||
└── WebSocket (Live-Metriken, Hermes-Chat, Logs)
|
||||
|
||||
FastAPI (Bosgame :9000)
|
||||
├── routers/models.py LLM-Verwaltung
|
||||
├── routers/system.py Live-Metriken (psutil/sysfs)
|
||||
├── routers/maintenance.py Updates, Logs, Neustart
|
||||
├── routers/cookbook.py Modell-Empfehlungen
|
||||
├── routers/memory.py Gedächtnis (SQLite)
|
||||
├── routers/hermes.py Agent-Chat, Voice (Whisper/Piper)
|
||||
└── ...
|
||||
|
||||
llama-swap (:8080) Inference (Qwen3-Familie)
|
||||
SQLite Gedächtnis (/srv/models/mission-control-memory.db)
|
||||
mcp_memory.py MCP-Server für Cline/OpenCode/Claude Code
|
||||
```
|
||||
|
||||
Über den kyuz0-Container (distrobox) — Beispiel, an deinen Toolbox-Namen anpassen:
|
||||
```
|
||||
distrobox enter llama-vulkan-radv -- llama-server -m {model} --host 127.0.0.1 --port ${PORT} -c {ctx} -ngl 999 -fa 1 --no-mmap
|
||||
```
|
||||
|
||||
> `-fa 1` (Flash Attention) und `--no-mmap` sind auf Strix Halo Pflicht, sonst drohen Crashes/Slowdowns.
|
||||
|
||||
## ⚠️ Sicherheit
|
||||
|
||||
Mission Control führt Shell-Befehle aus (Downloads, Updates) und schreibt deine Config.
|
||||
**Niemals offen ins Internet hängen.** Betrieb nur im vertrauenswürdigen LAN. Wenn du
|
||||
trotzdem etwas Schutz willst, setz `MC_TOKEN` und trag es oben rechts im Dashboard ein.
|
||||
Für echten Remote-Zugriff: per SSH-Tunnel oder Tailscale, nicht per Portfreigabe.
|
||||
|
||||
## API (falls du es skripten willst)
|
||||
|
||||
`GET /api/status` · `POST /api/download` · `POST /api/register` · `POST /api/unload[?model=]`
|
||||
· `POST /api/update` · `POST /api/chat` · `GET /api/jobs` · `GET /api/jobs/{id}`
|
||||
|
||||
Reference in New Issue
Block a user