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>
67 lines
2.6 KiB
Markdown
67 lines
2.6 KiB
Markdown
# Local-LLM-Adapter (Gamebox) — Plan B, Phase B0
|
||
|
||
Bringt ein lokales, schnelles LLM (Qwen3 8B) auf die Gamebox und haengt es
|
||
per RVS an ARIA — fuer die einfachen ~80 % der Turns (<1 s), waehrend Claude
|
||
das Tiefen-Hirn bleibt. Siehe `docs/plan-local-llm-router.md` im Repo-Root.
|
||
|
||
## Zwei Container (in `xtts/docker-compose.yml`)
|
||
|
||
- **`llama`** — `llama.cpp`-Server (CUDA), serviert das GGUF OpenAI-kompatibel
|
||
auf `:8081`, nur im Compose-Netz.
|
||
- **`llm-adapter`** — verbindet sich per Token an den RVS (wie f5tts/whisper),
|
||
nimmt `llm_request` entgegen, ruft `llama` lokal, antwortet `llm_response`.
|
||
|
||
## Modell — Auto-Download (nichts manuell ablegen)
|
||
|
||
`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`.
|
||
|
||
Modell/Quant wechseln = in der `.env` der Gamebox setzen (kein Code):
|
||
|
||
```
|
||
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): `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)
|
||
|
||
```bash
|
||
cd xtts
|
||
docker compose up -d --build llama llm-adapter
|
||
docker logs -f aria-llm-adapter # "RVS verbunden — llm-adapter online"
|
||
```
|
||
|
||
## Standalone-Test (ohne ARIA), direkt gegen llama.cpp
|
||
|
||
```bash
|
||
curl http://localhost:8081/v1/chat/completions -H "Content-Type: application/json" -d '{
|
||
"messages":[{"role":"system","content":"Du bist ARIA."},
|
||
{"role":"user","content":"sag kurz hallo"}],
|
||
"max_tokens":64
|
||
}'
|
||
```
|
||
|
||
## VRAM-Hinweis (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` reduzieren, `-ngl` senken (weniger Layer auf GPU),
|
||
oder kleineres Quant (Q4_K_S / IQ4_XS).
|
||
|
||
## Nachrichten-Kontrakt (RVS)
|
||
|
||
- `llm_request` → `{ requestId, messages:[{role,content}], max_tokens?, temperature?, stop? }`
|
||
- `llm_response` ← `{ requestId, ok, content, error?, model, elapsedMs }`
|
||
- `llm_partial` — reserviert fuer B2 (Token-Streaming), noch ungenutzt.
|