feat(local-llm): B0 — GGUF Auto-Download via llama.cpp -hf (kein manuelles Ablegen)

Statt einer manuell abgelegten Datei zieht llama.cpp das Modell beim ersten
Start selbst von Hugging Face (-hf Qwen/Qwen3-8B-GGUF:Q4_K_M, offizielles
Repo verifiziert) und cached es unter xtts/models (persistent). Modell/Quant
via LLM_HF_REPO/LLM_HF_QUANT in der .env wechselbar, kein Code.

Diagnostic-Modellauswahl (on-demand laden/aktivieren mehrerer Modelle) als
Folge-Baustein B0.5 via llama-swap ins Plan-Doc aufgenommen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 10:33:59 +02:00
co-authored by Claude Opus 4.8
parent 98c78af7ad
commit b5ba54d05f
4 changed files with 59 additions and 21 deletions
+3 -2
View File
@@ -80,5 +80,6 @@ __pycache__/
*.swp
*.swo
# Lokale LLM-Modelle (Plan B) — GGUF sind mehrere GB, nicht ins Repo
xtts/models/*.gguf
# Lokale LLM-Modelle (Plan B) — GGUF/HF-Cache sind mehrere GB, nicht ins Repo
xtts/models/*
!xtts/models/.gitkeep
+27
View File
@@ -85,6 +85,33 @@ Das lokale Modell braucht ARIAs Identität, sonst bricht es aus der Rolle
Mini-Classifier?
3. **Tools lokal:** in v1 bewusst KEINE (alles Tool-artige → Claude) — ok?
## Folge-Baustein: Modell-Auswahl in ARIA Diagnostic (B0.5)
Ziel: In Diagnostic ein Modell auswählen; ist es nicht da, lädt der Container
es on-demand und aktiviert es. Spiegelt zwei bestehende Muster: den
`whisperModel`-Hotswap (RVS-Config-Broadcast → Bridge hot-swapped) und die
kuratierte Claude-Tier-Liste aus `models.json`.
**Kernproblem:** `llama.cpp`-Server serviert **ein** Modell pro Prozess —
„anderes aktivieren" = neu laden/swappen.
**Lösung: `llama-swap`** (Proxy vor llama.cpp): kennt eine Liste von Modellen,
lädt bei Anfrage das gewünschte on-demand (Download via `-hf` beim ersten Mal),
swappt bei VRAM-Knappheit das alte raus. OpenAI-kompatibel — der llm-adapter
zeigt statt auf `llama:8081` auf `llama-swap`.
**Bausteine:**
- `llama-swap`-Service in `xtts/docker-compose.yml` (ersetzt/ergänzt `llama`),
Config mit den verfügbaren Modellen (Name → `-hf`-Command).
- Kuratierte Liste `local_models.json` (analog `models.json`) — Diagnostic-UI
liest sie, zeigt Dropdown „Lokales Modell".
- Diagnostic → RVS-Config-Broadcast `localLlmModel` → llm-adapter setzt das
`model`-Feld seiner llama-swap-Requests → swap/Download passiert automatisch.
- Status zurück an Diagnostic (lädt / bereit / VRAM-OOM), analog whisper-Status.
Bis dahin: **ein** Modell via `-hf` Auto-Download (B0, erledigt). Erst end-to-end
grün, dann dieser Komfort-Layer.
## Nicht-Ziele
- Kein echter Gemini-Live-Duplex-Klon (Text-Modell als Hirn).
+12 -4
View File
@@ -93,10 +93,16 @@ services:
# ─── Lokales LLM (Plan B, B0) — llama.cpp-Server (GPU) ────────
# Serviert Qwen3-8B (GGUF Q4_K_M) OpenAI-kompatibel auf :8081, NUR im
# Compose-Netz (kein RVS direkt) — die Bruecke macht der llm-adapter.
# Modell-Datei nach ./models/ legen: siehe llm-adapter/README.md.
#
# AUTO-DOWNLOAD: llama.cpp zieht das GGUF beim ersten Start selbst von
# Hugging Face (-hf <repo>:<quant>) und cached es unter /models (persistent
# via Bind-Mount -> kein Re-Download bei Restart). Kein manuelles Ablegen
# noetig. Modell wechseln = LLM_HF_REPO/LLM_HF_QUANT in der .env aendern +
# Container neu. (Alternativ lokale Datei: command auf -m /models/x.gguf.)
#
# VRAM auf der RTX 3060 (12 GB): whisper-small (~1-2) + f5tts (~1-2) +
# qwen3-8b-q4 (~6) ~= 9-10 GB. Passt, aber knapp — bei OOM: LLM_CTX kleiner
# oder Modell auf Q4_K_S/IQ4 wechseln.
# oder Quant auf Q4_K_S/IQ4_XS wechseln.
llama:
image: ghcr.io/ggml-org/llama.cpp:server-cuda
container_name: aria-llama
@@ -108,9 +114,11 @@ services:
count: 1
capabilities: [gpu]
volumes:
- ./models:/models
- ./models:/models # HF-Download-Cache (persistent)
environment:
- LLAMA_CACHE=/models # llama.cpp legt -hf-Downloads hier ab
command: >
-m /models/${LLM_GGUF:-qwen3-8b-q4_k_m.gguf}
-hf ${LLM_HF_REPO:-Qwen/Qwen3-8B-GGUF}:${LLM_HF_QUANT:-Q4_K_M}
--host 0.0.0.0 --port 8081
-ngl 99 -c ${LLM_CTX:-8192} --jinja
restart: unless-stopped
+17 -15
View File
@@ -11,27 +11,29 @@ das Tiefen-Hirn bleibt. Siehe `docs/plan-local-llm-router.md` im Repo-Root.
- **`llm-adapter`** — verbindet sich per Token an den RVS (wie f5tts/whisper),
nimmt `llm_request` entgegen, ruft `llama` lokal, antwortet `llm_response`.
## Modell besorgen (einmalig)
## Modell — Auto-Download (nichts manuell ablegen)
GGUF nach `xtts/models/` legen. Empfohlen: **Qwen3 8B, Q4_K_M**.
`llama.cpp` zieht das GGUF beim **ersten Start selbst von Hugging Face** und
cached es unter `xtts/models/` (Bind-Mount → kein Re-Download bei Restart).
Default: **Qwen3 8B, Q4_K_M** aus dem offiziellen Repo `Qwen/Qwen3-8B-GGUF`.
```bash
mkdir -p xtts/models
# z.B. von Hugging Face (huggingface-cli oder Browser-Download):
# Suche: "Qwen3-8B-GGUF" -> Datei qwen3-8b-q4_k_m.gguf
# Datei ablegen als:
# xtts/models/qwen3-8b-q4_k_m.gguf
```
Anderer Dateiname? In der `.env` der Gamebox setzen:
Modell/Quant wechseln = in der `.env` der Gamebox setzen (kein Code):
```
LLM_GGUF=dein-modell.gguf
LLM_CTX=8192 # Kontextfenster (kleiner = weniger VRAM)
LLM_HF_REPO=Qwen/Qwen3-8B-GGUF # HF-Repo
LLM_HF_QUANT=Q4_K_M # Quant-Tag (Q4_K_M, Q5_K_M, Q8_0, …)
LLM_CTX=8192 # Kontextfenster (kleiner = weniger VRAM)
```
Mistral statt Qwen testen (A/B): einfach ein Mistral-Small-3-GGUF ablegen und
`LLM_GGUF` umstellen — Ein-Datei-Wechsel, kein Code.
Mistral statt Qwen testen (A/B): `LLM_HF_REPO` auf ein Mistral-Small-3-GGUF-Repo
umstellen + Container neu — Ein-Zeilen-Wechsel, kein Code.
> Der erste Start lädt mehrere GB — Log zeigt den Download-Fortschritt.
> Danach liegt das GGUF im Cache und der Start ist sofort.
**Modell-Auswahl in ARIA Diagnostic** (on-demand laden/aktivieren mehrerer
Modelle) ist ein geplanter Folge-Baustein via `llama-swap` — siehe
`docs/plan-local-llm-router.md`.
## Start (auf der Gamebox)