Files
ARIA-AGENT/xtts/llm-adapter
duffyduckandClaude Opus 5.5 864237ff2c feat(llm): Download-Fortschritt beim Modell-Laden — und "Laden" kommt endlich an
Eigentlicher Fehler zuerst: llm_provision_model/_result und llm_remove_model
standen nie in der RVS-Allow-List. Der RVS verwirft unbekannte Typen mit einem
stillen return — jeder Klick auf "Laden" im Modell-Katalog ist seit Stage D
(19.09.) an dieser Liste gestorben, die Box hat nie davon erfahren. Laden
liessen sich nur die Modelle aus der Basis-Config der Box.

Gefunden, weil grep rvs/server.js fuer eine Binaerdatei hielt und still
uebersprang: in Zeile 164 stand seit a7998bcd ein ECHTES Nullbyte im
Template-String statt eines Escapes. Node stoert das nicht, aber git zeigte
fuer jede Aenderung am RVS nur noch "Binary files differ". Jetzt \u0000 —
zur Laufzeit derselbe String.

Fortschritt: llama.cpp zieht das GGUF per -hf selbst und meldet nichts. Der
llm-adapter fragt vorab bei Hugging Face, welche Dateien (Groesse, sha256)
kommen, und misst genau diese im HF-Cache-Layout, das llama.cpp verwendet:
  /models/models--org--repo/blobs/<sha256>.downloadInProgress  (waechst)
  /models/models--org--repo/blobs/<sha256>                     (fertig)
Layout gegen den echten llama.cpp-Server ausprobiert, nicht angenommen. Geht
auch bei gesplitteten Modellen und zwei Downloads gleichzeitig; Fallback fuer
aeltere Layouts ueber alle *.downloadInProgress. Phasen: queued → start →
download (%, MB/s, Restzeit) → load ("laedt in die Karte") → ready ("in Karte
N geladen", Name + VRAM aus nvidia-smi) bzw. error.

Mitgefixt: der Warmup wartete LLM_TIMEOUT_SEC (Default 60 s). Ein Modell mit
mehreren GB meldete deshalb "Fehler", waehrend llama-swap weiterlud. Jetzt
LLM_WARMUP_TIMEOUT_S (1900 s, ueber llama-swaps healthCheckTimeout).

Diagnostic: Knopf "⬇ Downloads" neben "Von HuggingFace aktualisieren" mit
Zaehler fuer laufende; "Laden" oeffnet das Fenster direkt. Der Server merkt
sich den Stand pro (Box, Modell), ein spaeter geoeffneter Tab sieht laufende
Downloads. Antwortet die Box nicht, steht nach 30 s eine Warnung da statt
nichts.

Compose (KI-Box): llm-adapter bekommt LLM_GPU (Karte fuer die Meldung) und
HF_TOKEN (Dateiliste gesperrter Repos).

Test: Fortschritt gegen einen echten llama.cpp-Download (Qwen2.5-0.5B Q8,
676 MB): Prozent steigend 0 → 91.6, dann load; zweiter Lauf aus dem Cache
direkt load mit cached=true.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 15:33:54 +02:00
..

Local-LLM-Adapter (AI-Box) — Plan B, Phase B0

Bringt ein lokales, schnelles LLM (Qwen3 8B) auf die AI-Box 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 AI-Box 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 AI-Box)

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

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.