From 6918ddca61b0c17bffef227d89dcdeab23814d26 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 19 Sep 2026 11:35:35 +0200 Subject: [PATCH] =?UTF-8?q?fix(satellite):=20ARIA=20nutzt=20Satelliten=20f?= =?UTF-8?q?uer=20Geraete=20in=20fremden=20Netzen=20=E2=80=94=20statt=20zu?= =?UTF-8?q?=20fabulieren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Symptom: Frage nach dem Patronenstand des Heim-Druckers -> ARIA antwortet "da komm ich nicht ran", obwohl im Heimnetz ein Satellit online ist, der den Drucker findet UND http.get kann. Sie zieht Drucker-Fakten aus dem Gedaechtnis und gibt auf, ohne den Satelliten zu nutzen. Ursachen + Fixes: - Claude-Pfad: die Seed-Regel triggerte nur auf Formulierungen wie "im Buero"/ "im Netz X". Eine schlichte Geraetefrage (Patronenstand) griff sie nicht. -> Regel umformuliert: IMMER wenn ein Geraet/Host in einem Netz liegt, auf dem ARIA nicht direkt sitzt (Zuhause/Buero/private IP), ZUERST satellite_list pruefen; NIEMALS "erreiche ich nicht" sagen, bevor satellite_list lief. Drucker-http.get-Beispiel ergaenzt. - satellite_list-Tool-Beschreibung als dauerhaften Anker verstaerkt (gilt auch, wenn ein Seed mal driftet). - Lokales Tier hatte gar keine Satelliten-Tools (_LOCAL_TOOL_NAMES) -> konnte strukturell kein Geraet im fremden Netz erreichen und fabulierte. satellite_ list/devices/command ergaenzt, damit auch das lokale Qwen Satelliten nutzt. Greift beim naechsten Brain-Neustart (seed_rules.apply im Lifespan, idempotent per migration_key). Co-Authored-By: Claude Opus 4.8 --- aria-brain/agent.py | 17 +++++++++++------ aria-brain/seed_rules.py | 16 +++++++++++++++- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/aria-brain/agent.py b/aria-brain/agent.py index c8515da..e92670d 100644 --- a/aria-brain/agent.py +++ b/aria-brain/agent.py @@ -1184,9 +1184,11 @@ META_TOOLS = [ "description": ( "Zeigt welche ARIA-Satelliten (Aussenposten-Container in FREMDEN Netzen, " "z.B. 'Buero') gerade ONLINE sind und was sie koennen (discover / " - "dial.launch / wol / http). Nutze das ZUERST, wenn Stefan etwas 'im " - "Buero' / 'im Netz X' / 'auf dem dort' machen will — so weisst " - "Du welche Netze erreichbar sind." + "dial.launch / wol / http). Nutze das ZUERST, wenn es um ein Geraet/einen " + "Host in einem Netz geht, auf dem Du nicht direkt sitzt (Zuhause, Buero, " + "jede private IP wie 192.168.x) — z.B. Drucker-Fuellstand, NAS, Smart-TV. " + "Rufe es IMMER auf, BEVOR Du sagst ein Geraet sei nicht erreichbar — ein " + "Satellit im Zielnetz ist der Weg hinein." ), "parameters": {"type": "object", "properties": {}}, }, @@ -1718,9 +1720,12 @@ class Agent: return False # Kuratierte Tool-Auswahl fuers lokale Tier (B1b): web_search (local-only, - # SearXNG) + memory_search/trigger_timer (aus META_TOOLS) + Spotify-Skill. - # Bewusst klein (Speed + Sicherheit); alles andere → Claude. - _LOCAL_TOOL_NAMES = {"memory_search", "trigger_timer"} + # SearXNG) + memory_search/trigger_timer (aus META_TOOLS) + Spotify-Skill + + # die Satelliten-Tools (Augen/Haende in fremden Netzen — auch das lokale Tier + # muss ein Geraet im Heim-/Buero-Netz erreichen koennen, statt zu fabulieren). + # Sonst bewusst klein (Speed + Sicherheit); alles andere → Claude. + _LOCAL_TOOL_NAMES = {"memory_search", "trigger_timer", + "satellite_list", "satellite_devices", "satellite_command"} def _build_local_tools(self) -> list: tools = [WEB_SEARCH_TOOL] diff --git a/aria-brain/seed_rules.py b/aria-brain/seed_rules.py index 983c221..e9d6ff7 100644 --- a/aria-brain/seed_rules.py +++ b/aria-brain/seed_rules.py @@ -475,13 +475,27 @@ SEED_RULES: List[dict] = [ "zeigt UND steuerbar macht. So erreichst Du Netze, in denen der Haupt-Stack " "NICHT steht.\n" "\n" - "Wenn Stefan etwas 'im Buero' / 'im Netz X' / 'auf dem dort' will:\n" + "WICHTIG — nicht nur bei 'im Buero'/'im Netz X': IMMER wenn eine Anfrage ein " + "GERAET oder einen HOST betrifft, das/der in einem Netz lebt, auf dem Du NICHT " + "direkt sitzt (Stefans Zuhause, Buero, Werkstatt, irgendein LAN mit privater " + "IP wie 192.168.x/10.x) — z.B. Drucker-Fuellstand, NAS, Smart-TV, ein Host per " + "IP — dann pruefe ZUERST `satellite_list`, ob ein Satellit dieses Netz abdeckt. " + "Sage NIEMALS 'da komm ich nicht ran' / 'bin nicht im Netz', BEVOR Du " + "`satellite_list` aufgerufen hast — ein Satellit im Zielnetz ist genau der Weg " + "hinein. Nur wenn wirklich keiner online ist, ist 'erreiche ich nicht' korrekt.\n" + "\n" + "Ablauf:\n" " 1. `satellite_list` — welche Satelliten/Netze sind online + was koennen sie.\n" " 2. `satellite_devices(satellite='Buero')` — welche Geraete gibt es dort " "(Fire TV, Chromecast, Smart-TVs, Drucker, NAS ...). Nutze es um das " "gemeinte Geraet zu finden, BEVOR Du steuerst.\n" " 3. `satellite_command(...)` — Aktion ausfuehren.\n" "\n" + "Beispiel 'Patronenstand vom Drucker zuhause': satellite_list -> Satellit im " + "Heimnetz online? -> satellite_command(satellite='', action='http.get', " + "params={'url':'http:///general/status.html'}) -> Fuellstaende " + "(BK/C/M/Y) aus dem HTML vorlesen. NICHT aus dem Gedaechtnis raten.\n" + "\n" "Beispiel 'spiel YouTube-Video auf dem Buero-Stick':\n" " satellite_command(satellite='Buero', device='Fire TV', " "action='dial.launch', params={'app':'YouTube','v':''})\n"