fix(brain): Skill-stdout-Limit von 2000 auf 50000 — Track-Daten wurden abgeschnitten
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) <noreply@anthropic.com>
This commit is contained in:
+13
-4
@@ -1284,12 +1284,21 @@ class Agent:
|
|||||||
skill_name = cand_name
|
skill_name = cand_name
|
||||||
break
|
break
|
||||||
res = skills_mod.run_skill(skill_name, args=arguments)
|
res = skills_mod.run_skill(skill_name, args=arguments)
|
||||||
snippet = (res.get("stdout") or "")[:2000] or "(kein stdout)"
|
# 2000 Zeichen war viel zu wenig — Spotify-JSON ist 5-15 KB,
|
||||||
err = (res.get("stderr") or "")[:500]
|
# 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']})"
|
marker = "OK" if res["ok"] else f"FEHLER (exit={res['exit_code']})"
|
||||||
out = f"{marker} · {res['duration_sec']}s\nstdout:\n{snippet}"
|
out = f"{marker} · {res['duration_sec']}s\nstdout:\n{snippet}"
|
||||||
if err:
|
if stderr:
|
||||||
out += f"\nstderr:\n{err}"
|
out += f"\nstderr:\n{stderr}"
|
||||||
return out
|
return out
|
||||||
if name == "trigger_timer":
|
if name == "trigger_timer":
|
||||||
fires_at_iso = arguments.get("fires_at")
|
fires_at_iso = arguments.get("fires_at")
|
||||||
|
|||||||
Reference in New Issue
Block a user