# 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 besorgen (einmalig) GGUF nach `xtts/models/` legen. Empfohlen: **Qwen3 8B, Q4_K_M**. ```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: ``` LLM_GGUF=dein-modell.gguf 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. ## 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.