From 9ea7908fe435503a7d2d933187793ce5fe48f506 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Tue, 12 May 2026 01:52:04 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20README=20+=20issue=20=E2=80=94=20Proxy-?= =?UTF-8?q?Tool-Use-Patch=20+=20Trigger-Reply-Push=20dokumentiert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 (1M context) --- README.md | 16 ++++++++++------ issue.md | 3 ++- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index f597e8b..6d92798 100644 --- a/README.md +++ b/README.md @@ -216,11 +216,14 @@ Der Proxy-Container (`node:22-alpine`) installiert bei jedem Start: - `@anthropic-ai/claude-code` — Claude Code CLI - `claude-max-api-proxy` — OpenAI-kompatible API -Danach werden per `sed` vier Patches angewendet: -1. **Host-Binding**: Server hoert auf `0.0.0.0` statt localhost -2. **Model-Fallback**: Undefined Model → `claude-sonnet-4` -3. **Content-Format**: Array → String Konvertierung fuer die CLI -4. **Tool-Permissions**: `--dangerously-skip-permissions` Flag injizieren +Danach wird der Proxy gepatcht: +1. **Host-Binding** (sed): Server hoert auf `0.0.0.0` statt localhost +2. **Tool-Permissions** (sed): `--dangerously-skip-permissions` Flag injizieren +3. **Tool-Use-Adapter** (Datei-Overwrite aus [`proxy-patches/`](proxy-patches/)): + - `openai-to-cli.js` injiziert das OpenAI-`tools`-Feld als ``-Block mit Schema-Beschreibungen + Anweisung `{json}` als Antwortformat. `role=tool`-Messages werden als ``-Bloecke eingewoben. Multimodal-Content (Array von Parts) bleibt String-kompatibel. + - `cli-to-openai.js` parsed ``-Bloecke aus Claudes Antwort und liefert sie als echte OpenAI `tool_calls` mit `finish_reason="tool_calls"`. Pre-Tool-Text bleibt im `content`. Mehrere parallele Calls werden korrekt aufgeteilt. Model-Name null-safe. + + **Warum?** Die npm-Version des Proxys ignoriert das `tools`-Feld komplett und reicht nur einen Prompt-String an die CLI weiter. Claude Code nutzt dann ihre internen Tools (Bash, Read, …) und „simuliert" Aktionen — z.B. `sleep 120` statt `trigger_timer`. Mit den eigenen Adaptern landen ARIA-Tools wieder auf der Linie und Side-Effects (Trigger anlegen, Skills aufrufen, GPS-Tracking schalten) funktionieren. **Wichtige Umgebungsvariablen im Proxy:** - `HOST=0.0.0.0` — API von aussen erreichbar (Docker-Netz) @@ -862,7 +865,8 @@ docker exec aria-brain curl localhost:8080/memory/stats - [x] **Phase B Punkt 2:** Migration aus `aria-data/brain-import/` → atomare Memory-Punkte (Identity / Rule / Preference / Tool / Skill, idempotent ueber migration_key) + Bootstrap-Snapshot Export/Import (nur pinned) - [x] **Phase B Punkt 3:** Brain Conversation-Loop (Single-Chat UI, Rolling Window 50 Turns, Schwelle 60 → automatisches Destillat, manueller Trigger) - [x] **Phase B Punkt 4:** Skills-System (Python-only via local-venv, skill_create als Tool, dynamische run_ Tools, Diagnostic Skills-Tab mit Logs/Toggle/Export/Import, skill_created Live-Notification in App+Diagnostic, harte Schwelle "pip → Skill") -- [x] **Phase B Punkt 5:** Triggers-System (passive Aufweck-Quellen — Timer + Watcher mit safe Condition-Parser, GPS-near(), Diagnostic Trigger-Tab, kontinuierliches GPS-Tracking in der App fuer Use-Cases wie Blitzer-Warner) +- [x] **Phase B Punkt 5:** Triggers-System (passive Aufweck-Quellen — Timer + Watcher mit safe Condition-Parser, GPS-near(), Diagnostic Trigger-Tab, kontinuierliches GPS-Tracking in der App fuer Use-Cases wie Blitzer-Warner). Inklusive Brain → Bridge HTTP-Push (Port 8090 intern) damit Trigger-Antworten ueber RVS in App + Diagnostic + TTS landen. +- [x] **Proxy Tool-Use durchreichen**: claude-max-api-proxy patcht via eigene Adapter (`proxy-patches/`) den `tools`/`tool_calls`-Roundtrip — Claude Code rief vorher ihre internen Tools (Bash, sleep) statt der ARIA-Brain-Tools (trigger_timer, skill_*, ...). Jetzt funktioniert Tool-Use End-to-End. - [x] Sprachmodell-Setting wieder funktional (brainModel in runtime.json statt aria-core) - [x] App-Chat-Sync: kompletter Server-Sync bei Reconnect (Server = Source of Truth) + chat_cleared Live-Update. Lokal-only Bubbles (Skill-Notifications, laufende Voice ohne STT) bleiben erhalten. - [x] App: Chat-Suche mit Next/Prev Navigation statt Filter diff --git a/issue.md b/issue.md index f3ec5da..5f4ef1a 100644 --- a/issue.md +++ b/issue.md @@ -55,6 +55,8 @@ Wichtige Mechanismen: ### Bugs / Fixes +- [x] **Trigger-Antworten landen jetzt im Chat** (App + Diagnostic + TTS): Wenn der Brain-Background-Loop einen Timer/Watcher feuert, ruft er `agent.chat()` direkt im eigenen Prozess. Die Antwort wurde nur ins Trigger-Log geschrieben — kein RVS-Broadcast, nichts sichtbar. Fix: Bridge hat jetzt einen kleinen asyncio HTTP-Listener auf Port 8090 (intern, nicht exposed). Brain pusht nach jedem Trigger-Feuer per `urllib.request.urlopen` an `http://aria-bridge:8090/internal/trigger-fired` mit `{reply, trigger_name, type, events}`. Bridge ruft `_handle_trigger_fired` → Side-Channel-Events (skill_created/trigger_created/location_tracking) + `_process_core_response` — exakt derselbe Pfad wie normale Chat-Antworten (Bubble + TTS + chat_backup) +- [x] **Tool-Use im Proxy durchgereicht** (claude-max-api-proxy): Der Proxy nahm das OpenAI-`tools`-Feld an, ignorierte es aber komplett — `openai-to-cli.js` wandelte nur `messages` zu einem String, `manager.js` rief `claude --print` ohne Tools. Claude Code nutzte ihre internen Tools (Bash, Read, ...) und „simulierte" Aktionen wie `sleep 120` statt `trigger_timer` zu rufen. Fix: zwei eigene Adapter-Files unter `proxy-patches/`, die zur Container-Startzeit ueber die npm-Version kopiert werden. `openai-to-cli.js` injiziert die `tools` als ``-Block mit Schema-Beschreibungen und der Anweisung `{json}` als Antwortformat zu verwenden; weiterhin verarbeitet sie `role=tool`-Messages als ``-Bloecke fuer den Loop-Replay. `cli-to-openai.js` parsed die ``-Bloecke aus dem Result-Text zurueck zu OpenAI `tool_calls` mit `finish_reason=tool_calls`. Mehrere Tool-Calls + Pre-Tool-Text werden korrekt aufgeteilt - [x] **Timer "in 2 Minuten" wird wieder angelegt**: ARIA hatte keine Moeglichkeit die aktuelle Zeit zu kennen — kein Bash-Tool, kein Time-Tool, kein Timestamp im System-Prompt. Die Tool-Beschreibung von `trigger_timer` empfahl sogar `date -u -d '+10 minutes'` via Bash, aber Bash gab's nicht. Folge: LLM liess den Tool-Call entweder weg oder riet einen Cutoff-Zeitstempel (Vergangenheit) → Background-Loop feuerte beim naechsten 30s-Tick sofort statt in 2min. Fix: (1) `build_time_section()` in `prompts.py` injiziert UTC + lokale Europa/Berlin-Zeit als `## Aktuelle Zeit`-Block oben im System-Prompt. (2) `trigger_timer` akzeptiert jetzt `in_seconds` als Alternative zu `fires_at` — Server rechnet den absoluten Timestamp, ARIA muss nicht ISO-rechnen - [x] **"ARIA denkt..." haengt nach Brain-Antwort** (App + Diagnostic): `send_to_core` schickte `thinking` direkt via `_send_to_rvs`, hat aber `_last_activity_state` nicht gepflegt — der spaetere `_emit_activity("idle")` wurde dedupliziert und verschluckt. Fix: durchgehend `_emit_activity` fuer beide Zustaende - [x] **Such-Scroll in App-Chat springt jetzt zur Treffer-Bubble**: `scrollToIndex` wurde zu frueh gerufen + `viewPosition: 0.4` schoss vorbei. Fix: `requestAnimationFrame` + `viewPosition: 0.5` + `onScrollToIndexFailed`-Fallback mit averageItemLength-Schaetzung + 250ms-Retry @@ -301,6 +303,5 @@ Skills mit Tool-Use. - [ ] RVS Zombie-Connections endgueltig loesen - [ ] Gamebox: kleine Web-Oberflaeche fuer Credentials/Server-Config oder zentral aus Diagnostic per RVS push - [ ] Erste Skills bauen lassen (yt-dlp, pdf-extract, image-resize, etc.) — durch normale Anfragen, ARIA legt sie selbst an -- [ ] Tool-Use-Verifikation: Live-Test ob claude-max-api-proxy `tools` und `tool_calls` sauber durchreicht - [ ] Heartbeat (periodische Selbst-Checks) - [ ] Lokales LLM als Waechter (Triage vor Claude-Call)