Hitonabi 364939466f Mission Control v2 – Schritt 1: SoC-Refactor + Design 2.0
Architektur auf Separation of Concerns umgestellt – ohne Build-Schritt,
ohne neues Framework, ohne DB (KISS bleibt). Endpoint-URLs unveraendert,
daher 1:1-kompatibel zum bisherigen Stand.

Backend (Top-Level-Helfer + ein Router je Bereich):
- app.py auf duennen Einstieg reduziert (FastAPI + include_router + static)
- config/auth/jobengine/llamaswap als getrennte Helfer-Module
- Endpoints in routers/{models,jobs,maintenance}.py

Frontend (native ES-Module statt Single-File):
- index.html = Huelle: Sidebar-Nav, Topbar, Alert-Banner, Hash-Routing
- css/{base,components}.css – Tokens + Komponenten
- js/core/{api,ui,nav}.js + js/panels/{overview,models,maintenance,jobs}.js + main.js
- Panel-Vertrag: { id, mount?(), onStatus?(s), onJobs?(jobs) }
- Optik an docs/mission-control-overview.png angelehnt (Hero, KPI-Kacheln,
  Listen, Aktivitaets-Stream, getoente Karten)

Doku: CLAUDE.md + README auf die neue Struktur aktualisiert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 20:46:45 +02:00
2026-06-20 20:19:24 +02:00

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) + 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

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+
  • hf CLI 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-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}

S
Description
Mission Control Panel für das AI Arbeitstier (192.168.178.151)
Readme 18 MiB
Languages
Python 44.6%
JavaScript 40.7%
CSS 11.1%
HTML 3.1%
Shell 0.5%