# 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

```bash
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:

```bash
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}`
