diff --git a/docs/plan-local-llm-router.md b/docs/plan-local-llm-router.md index 6f65a38..e3b83d3 100644 --- a/docs/plan-local-llm-router.md +++ b/docs/plan-local-llm-router.md @@ -73,27 +73,53 @@ hat keine Tools; das ist ein Gespraechs-Eval-Modus, kein Voll-ARIA. Fast-Path Das lokale Modell braucht ARIAs Identität, sonst bricht es aus der Rolle (gelernt aus dem `--system-prompt`-Debakel). Aber **schlanker**: - IDENTITY_SEED + Kern-Persona: ja. -- Volles Memory / alle Skill-Schemas / Tool-Block: **nein** (Tier 1 macht keine - Tools). Hält den lokalen Prompt klein → schnell. +- Volles Memory / ALLE Skill-Schemas: **nein** — nur eine **kuratierte, kleine + Tool-Auswahl** (siehe unten). Haelt den lokalen Prompt klein → schnell. - Persona kommt lokal auch als echter System-Prompt (llama.cpp `system`-Rolle). +## Tool-Calling lokal (kuratierte Auswahl) + +Das lokale LLM DARF Werkzeuge nutzen (Qwen3 = natives OpenAI-Tool-Calling, von +llama.cpp `--jinja` unterstuetzt). Ablauf wie bei Claude: Brain schickt +messages + tools → Qwen antwortet mit `tool_calls` → Brain fuehrt via +`_dispatch_tool` aus → Ergebnis zurueck → finale Antwort. Tool-Loop im Brain, +Ziel = lokales LLM statt Claude-Proxy. + +**Kritische Regel: klein halten.** Der Wert des lokalen Tiers ist Speed; das +volle Arsenal (~49 K Zeichen Schemas) wuerde den Prompt sprengen und das kleine +Modell ueberfordern. Daher nur ein **Start-Satz haeufiger, risikoarmer Tools**: +- Lokal: Wetter, Uhrzeit, `memory_search` (lesen), `trigger_timer`, + Spotify-Steuerung (Nicht-Fast-Path-Saetze), Licht/Smart-Home. +- Bleibt bei Claude: `skill_create/update/delete`, `oauth_*`, `project_*`, + `flux_generate`, `memory_save` (schreiben) — erst spaeter evtl. lokal. + +Escalation-Netz bleibt: braucht ein Turn ein Tool, das lokal nicht dabei ist → +`<>` → Claude mit vollem Arsenal. + +Implementierung (B1): Adapter reicht `tools` an llama.cpp + gibt `tool_calls` +zurueck; Bridge schleust beides durch (llm_request/llm_response); Brain-Tool-Loop +mit Ziel lokal. + ## Phasen - **B0 — Infra:** llama.cpp-Container + RVS-Adapter auf der Gamebox, `ALLOWED_TYPES`, `local_llm_chat()` im Brain. Isoliert testen („sag hallo"). -- **B1 — Router:** Heuristik Tier-1/2 + Escalation, schlanke Persona lokal. - Einfache Turns → lokal. Messen: Trefferquote & Latenz. +- **B1 — Router + lokale Tools:** Heuristik Tier-1/2 + Escalation, schlanke + Persona lokal, **kuratierte Tool-Auswahl lokal** (Adapter/Bridge/Brain-Tool- + Loop, siehe oben) + „Nur lokales LLM"-Checkbox. Einfache Turns → lokal. + Messen: Trefferquote, Tool-Zuverlaessigkeit & Latenz. - **B2 — Streaming/Voice:** `llm_partial` → TTS beginnt beim ersten Satz → der „live"-Sprung. **Hier den Gong-/Ohr-Re-Arm-Bug mit-fixen** (Barge-In, sauberes Re-Listen). -- **B3 (optional):** dem lokalen Modell ein paar schnelle, sichere Tools geben. +- **B3 (optional):** lokalen Tool-Satz erweitern, sobald Qwen sich als + zuverlaessig erweist (z.B. `memory_save`). ## Offene Entscheidungen (für Stefan) 1. **Modell:** Qwen3 8B (Tool-Calling) — oder doch Mistral Small 3 7B (Speed)? -2. **Routing v1:** rein heuristisch + Escalation (empfohlen) — oder gleich ein - Mini-Classifier? -3. **Tools lokal:** in v1 bewusst KEINE (alles Tool-artige → Claude) — ok? +2. **Routing v1:** rein heuristisch + Escalation (entschieden). +3. **Tools lokal:** kuratierte kleine Auswahl (entschieden — Start-Satz oben; + Stefan bestaetigt/justiert die konkrete Liste vor dem B1-Bau). ## Folge-Baustein: Modell-Auswahl in ARIA Diagnostic (B0.5)