From fef2a32c507a7150343bdeb4381943b5126c6202 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 30 May 2026 01:37:28 +0200 Subject: [PATCH] =?UTF-8?q?fix(brain):=20Skill-stdout-Limit=20von=202000?= =?UTF-8?q?=20auf=2050000=20=E2=80=94=20Track-Daten=20wurden=20abgeschnitt?= =?UTF-8?q?en?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DER eigentliche Bug warum ARIA Spotify-Tracks halluziniert hat. Lange Diagnose-Session am 30.05.2026 zeigte: ARIA RUFT run_spotify echt auf (im Brain-Log zu sehen als tool_calls=1 + skill liefert echte Daten). Aber bevor das Ergebnis an Claude zurueckging, hat dieser Code: snippet = (res.get("stdout") or "")[:2000] es auf 2000 Zeichen abgeschnitten. Spotify-JSON ist 5-15 KB — "album":{"name":"..."} steht frueh drin (kommt durch), aber "item":{"name":"..."} (Track-Name selbst) und alle Detail-Felder liegen weiter hinten und wurden verworfen. Folge: ARIA bekam nur den Anfang vom JSON inkl. Album-Name, hat dann den bekanntesten Track aus dem Album geraten (Album "Loneliness" -> Track "Loneliness"; Album "Sound Of Belgium" -> Track "House of House"). Semi-Halluzination weil halbe Information. Fix: 50000 Zeichen Limit fuer stdout (Claude verkraftet das locker, hunderte KB Context). stderr von 500 auf 4000. Bei Ueberlauf wird die Original-Byte-Anzahl im Result mitgegeben damit ARIA weiss dass mehr Daten da gewesen waeren. Co-Authored-By: Claude Opus 4.7 (1M context) --- aria-brain/agent.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/aria-brain/agent.py b/aria-brain/agent.py index eb9ade6..60985aa 100644 --- a/aria-brain/agent.py +++ b/aria-brain/agent.py @@ -1284,12 +1284,21 @@ class Agent: skill_name = cand_name break res = skills_mod.run_skill(skill_name, args=arguments) - snippet = (res.get("stdout") or "")[:2000] or "(kein stdout)" - err = (res.get("stderr") or "")[:500] + # 2000 Zeichen war viel zu wenig — Spotify-JSON ist 5-15 KB, + # da wurde der Track-Name regelmaessig abgeschnitten und ARIA + # hat aus dem Album-Kontext halluziniert. Claude kann hunderte + # KB Context, 50 KB pro Tool-Result sind locker drin. + stdout = (res.get("stdout") or "") + stderr = (res.get("stderr") or "") + if len(stdout) > 50000: + stdout = stdout[:50000] + f"\n...(abgeschnitten, original {len(res.get('stdout',''))} bytes)" + if len(stderr) > 4000: + stderr = stderr[:4000] + f"\n...(abgeschnitten)" + snippet = stdout or "(kein stdout)" marker = "OK" if res["ok"] else f"FEHLER (exit={res['exit_code']})" out = f"{marker} · {res['duration_sec']}s\nstdout:\n{snippet}" - if err: - out += f"\nstderr:\n{err}" + if stderr: + out += f"\nstderr:\n{stderr}" return out if name == "trigger_timer": fires_at_iso = arguments.get("fires_at")