Modelle erscheinen jetzt mit ihrem ECHTEN Namen (= API-Name, den man in Zed/ OpenCode angibt) statt unter "coder"/"vision". Die Rolle wird ein zusaetzlicher, sprechender Name (llama-swap-`aliases`) -> in der API funktionieren BEIDE. - llamaswap.py: model_id_from_path (Repo-Ordner ohne -GGUF) + set_role_alias (Rolle als eindeutiger Alias, beim Setzen bei anderen Modellen entfernt) + ROLE_IDS (vision/coder/scout/reviewer/manager). - models.py: register schreibt Key=Modellname, Rolle als Alias; /status liefert role + aliases + api_ids; neuer POST /set_role. Rueckwaertskompatibel: Legacy- Eintraege (coder/vision ohne Alias) behalten ihren Key als Rolle. - cookbook.py: install-recipe/-model nutzen dasselbe Schema (Name + Rollen-Alias). - models.js: Zeile zeigt echten Namen + Rollen-Tag + API-Name (klick=kopieren); neuer "Rolle"-Dialog mit 5 Schnellwahl-Rollen + freier Eingabe. - cookbook.js: Profi-Download-Feld ist jetzt optionale Rolle (Name kommt vom Modell), Pflichtfeld-Pruefung entsprechend gelockert. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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.
Was sie kann
- Modelle & Ports sehen — liest
llama-swap(/running,/v1/models) + deineconfig.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-swaplädt mit-watch-configneu - Wartung — Container/Toolbox aktualisieren, Modelle aus dem Speicher werfen
- Schnelltest — Chat-Box, um ein Modell zu wecken und zu prüfen
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.
Voraussetzungen
- Python 3.11+
hfCLI installiert (pip install -U "huggingface_hub[cli]")- ein laufendes
llama-swap— gestartet mit-watch-config, sonst greift das Auto-Einpflegen nicht
Installation
sudo mkdir -p /opt/mission-control && sudo chown $USER /opt/mission-control
cp -r *.py routers static /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
Dann im Browser im LAN: http://<bosgame-ip>:9000
Als Dienst (Autostart)
Pfade in mission-control.service anpassen, dann:
sudo cp mission-control.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now mission-control
Konfiguration (Umgebungsvariablen)
| 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 |
Wichtig: MC_CMD_TEMPLATE an deinen Start anpassen
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).
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
Ü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-mmapsind 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}