iris-claude-exec: Claude Code kennt das Kontextfenster des Agent-LLM nicht und komprimiert nie #167
Labels
No labels
herkunft/alpha-feedback
status/blockiert
status/zu-testen
typ/bug
typ/docs
typ/enhancement
typ/feature
typ/idea
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
alf/2ndbrain#167
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Befund
Craft Anything (und alles andere über
tools/iris-claude-exec/iris-claude.sh) lief vier Stunden in einer einzigen Claude-Code-Sitzung und endete mitrequest (262307 tokens) exceeds the available context size (262144 tokens). Die Sitzung wurde nie komprimiert; die alte Sitzungsdatei (3,8 MB) ließ sich danach nicht mehr fortsetzen (Claude Code hing ohne Ausgabe), Craft Anything meldete irreführendtools did not start.Warum
iris_agent_common_claude_envsetzt wederCLAUDE_CODE_MAX_CONTEXT_TOKENSnochCLAUDE_CODE_AUTO_COMPACT_WINDOW. Claude Code sieht nur den Modellnamen und kennt das echte Fenster des lokalen Modells (hier llama-server,n_ctx262144) nicht; die Auto-Compact-Schwelle greift daher nicht rechtzeitig. (Ursache nach Lage der Dinge vermutet, in der Binary sind beide Variablen vorhanden; die Wirkung wird beim Umsetzen geprüft.)Lösung
In
tools/iris-agent-common.shdas Kontextfenster des Agent-LLM vom Backend erfragen (/v1/models:max_model_len,context_length,context_window,max_context_length,meta.n_ctx— dieselben Schlüssel wieAnthropicProxyManager.swift) und beide Variablen setzen. Nichts hartcodieren; ist die Größe nicht ermittelbar, bleibt das Verhalten wie bisher.Nicht Teil dieses Issues
Das irreführende
tools did not startvon Craft Anything bei hängendem Resume (anderes Projekt).PR #168 gemergt: fix(tools): Kontextfenster des Agent-LLM an Claude Code übergeben (#167)
http://docker:3000/alf/2ndbrain/pulls/168
Commits:
Befund: Claude Code lief über
iris-claude-execohne Kenntnis des Kontextfensters des Agent-LLM (llama-server,n_ctx262144), komprimierte nie und lief inrequest (262307 tokens) exceeds the available context size (262144 tokens). Die alte Sitzungsdatei (3,8 MB) ließ sich danach nicht mehr fortsetzen.Geändert:
tools/iris-agent-common.sh: neue Funktioniris_agent_common_context_window(fragt/v1/modelsmit denselben Schlüsseln wieAnthropicProxyManager.swift, nuropenaicompatundlmstudio);iris_agent_common_claude_envsetzt damitCLAUDE_CODE_MAX_CONTEXT_TOKENSundCLAUDE_CODE_AUTO_COMPACT_WINDOW. Vom Aufrufer gesetzte Werte haben Vorrang; ist die Größe nicht ermittelbar, bleibt alles wie bisher. Nichts hartcodiert.Geprüft:
bash -n; mit dem laufenden Iris-Agent-LLM liefert die Funktion 262144 und beide Variablen sind danach gesetzt; beide Variablen existieren in der Claude-Code-Binary 2.1.319;iris-claude-exec -pmit gesetzten Variablen läuft fehlerfrei durch.Nicht geprüft: Dass Claude Code damit bei einer langen Sitzung tatsächlich komprimiert. Ein Test mit künstlich kleinem Fenster (20000) an einer kleinen Sitzung zeigte keine Kompaktierung, war aber wegen der kleinen Sitzung nicht aussagekräftig.
iris-claude.sh,iris-hermes,iris-opencodenicht ausgeführt; Backendsollama,openai,openrouter,anthropicunverändert (kein Fenster gesetzt).Grenzen / Offen: Ob die Schwelle bei exakt dem vollen Fenster früh genug greift (Puffer für die Antwort), ist ungeklärt; falls nötig, Wert etwas niedriger ansetzen. Das irreführende „tools did not start" von Craft Anything bei hängendem Resume ist ein eigenes Thema.
PR #351 gemergt: chore(terminal-scripts): Bundle-Kopie von iris-agent-common.sh auf Kontextfenster-Stand (alf/2ndbrain#167)
http://docker:3000/iris/Iris/pulls/351
Commits:
Befund: Die Bundle-Kopie
Iris/Resources/tools/iris-agent-common.sh(wird in die App gebündelt) hatte den Stand von #167 noch nicht;tools/iris-agent-common.shim Wurzel-Repo schon. Folge: Auf dem MacBook blieb die Kopie uncommittet verändert und blockiertepull-all(Fast-Forward nicht möglich).Geändert: Bundle-Kopie auf den Stand von
tools/iris-agent-common.shgebracht —iris_agent_common_context_window()und das Setzen vonCLAUDE_CODE_MAX_CONTEXT_TOKENS/CLAUDE_CODE_AUTO_COMPACT_WINDOWiniris_agent_common_claude_env().Geprüft: Die Datei ist byte-gleich mit
tools/iris-agent-common.sh(Prüfsumme gleich); auf dem MacBook ist die lokale Fassung identisch mit ihr.Nicht geprüft: App neu gebaut und gestartet; das Komprimieren in einer langen Sitzung (siehe Stand-Kommentar zu #167).
Offen: MacBook: lokale Änderungen an den drei Dateien verwerfen und
pull-all(Alf).PR #181 gemergt: fix(tools): Komprimier-Fenster wie in Swift und Ausgabe-Tokens begrenzen, damit Prompt+max_tokens ins Fenster passen (#167)
http://docker:3000/alf/2ndbrain/pulls/181
Commits:
Befund (Fehlerbild vom MacBook, Craft Anything →
iris-claude-exec, Strata mit Kontext 262144):API Error: 400 prompt (201911 tokens) + max tokens (128000) exceeds the context (262144). Im Log (modelUsage): Modellclaude-opus-5-5,contextWindow 1000000,maxOutputTokens 128000. Craft Anything wählt den Modellnamen selbst; Claude Code nimmt daraufhin Fenster und Ausgabegröße des echten Opus an, nicht die des lokalen Modells. Mit 128000 reservierter Antwort scheitert jeder Prompt über ca. 134000 Tokens am Server (kein Abschneiden), und das Komprimieren greift zu spät.Zweiter Fehler im ersten Stand dieses Issues:
iris_agent_common_claude_envsetzteCLAUDE_CODE_AUTO_COMPACT_WINDOWauf den vollen Kontext. Die Swift-Vorlage (AnthropicProxyManager.compactWindow) rechnetmax(Kontext − 42000, 100000).Geändert (
tools/iris-agent-common.sh, dazu die Bundle-Kopie iniris/Iris):max(Kontext − 42000, 100000); unter 100000 keine Setzung (wie Swift).CLAUDE_CODE_MAX_OUTPUT_TOKENS= 32000 (16000 bei Kontext < 150000) für ollama/lmstudio/openaicompat, unabhängig vom Modellnamen.Geprüft: Die Berechnung gegen einen Fake-Backend-Server mit Kontext 262144 (→ Komprimieren bei 220144, Ausgabe 32000), 120000 (→ 100000, 16000) und 80000 (→ keine Komprimier-Setzung, 16000); Aufrufer-Wert 9999 bleibt erhalten;
bash -n.Nicht geprüft: Ein echter langer Lauf in Craft Anything gegen Strata, ob Claude Code bei 220144 tatsächlich komprimiert; ob Claude Code
CLAUDE_CODE_MAX_OUTPUT_TOKENSfür ein Modell namensclaude-opus-5-5wie erwartet übernimmt (die Variable nutzt auch die Swift-Seite, aber nicht für diesen Modellnamen).Offen: Serverseitige Absicherung durch Alf:
"fit_max_tokens": truein derstrata-<model>.json(Hinweis aus der Strata-Fehlermeldung, #545) kürztmax_tokensauf den Rest, statt abzulehnen.PR #352 gemergt: fix(terminal-scripts): Bundle-Kopie von iris-agent-common.sh — Komprimier-Fenster und Ausgabe-Tokens (alf/2ndbrain#167)
http://docker:3000/iris/Iris/pulls/352
Commits:
Befund (Fehlerbild vom MacBook, Craft Anything →
iris-claude-exec, Strata mit Kontext 262144):API Error: 400 prompt (201911 tokens) + max tokens (128000) exceeds the context (262144). Im Log (modelUsage): Modellclaude-opus-5-5,contextWindow 1000000,maxOutputTokens 128000. Craft Anything wählt den Modellnamen selbst; Claude Code nimmt daraufhin Fenster und Ausgabegröße des echten Opus an, nicht die des lokalen Modells. Mit 128000 reservierter Antwort scheitert jeder Prompt über ca. 134000 Tokens am Server (kein Abschneiden), und das Komprimieren greift zu spät.Zweiter Fehler im ersten Stand dieses Issues:
iris_agent_common_claude_envsetzteCLAUDE_CODE_AUTO_COMPACT_WINDOWauf den vollen Kontext. Die Swift-Vorlage (AnthropicProxyManager.compactWindow) rechnetmax(Kontext − 42000, 100000).Geändert (
tools/iris-agent-common.sh, dazu die Bundle-Kopie iniris/Iris):max(Kontext − 42000, 100000); unter 100000 keine Setzung (wie Swift).CLAUDE_CODE_MAX_OUTPUT_TOKENS= 32000 (16000 bei Kontext < 150000) für ollama/lmstudio/openaicompat, unabhängig vom Modellnamen.Geprüft: Die Berechnung gegen einen Fake-Backend-Server mit Kontext 262144 (→ Komprimieren bei 220144, Ausgabe 32000), 120000 (→ 100000, 16000) und 80000 (→ keine Komprimier-Setzung, 16000); Aufrufer-Wert 9999 bleibt erhalten;
bash -n.Nicht geprüft: Ein echter langer Lauf in Craft Anything gegen Strata, ob Claude Code bei 220144 tatsächlich komprimiert; ob Claude Code
CLAUDE_CODE_MAX_OUTPUT_TOKENSfür ein Modell namensclaude-opus-5-5wie erwartet übernimmt (die Variable nutzt auch die Swift-Seite, aber nicht für diesen Modellnamen).Offen: Serverseitige Absicherung durch Alf:
"fit_max_tokens": truein derstrata-<model>.json(Hinweis aus der Strata-Fehlermeldung, #545) kürztmax_tokensauf den Rest, statt abzulehnen.PR #186 gemergt: fix(tools): iris-claude-exec setzt CRAFT_ANYTHING_MCP_LEAN_TOOLS für lokale Backends (#167)
http://docker:3000/alf/2ndbrain/pulls/186
Commits:
Befund (Fortsetzung Fehlerbild Craft Anything auf dem MacBook, Job verloren): Die Sitzung hatte 330 Tools, davon 322 vom craft-anything-MCP-Server (~108.000 Tokens Beschreibungen, mit jeder Anfrage). Nach jeder Komprimierung lag der Prompt wieder bei ~100.000; pro Zyklus blieben ~120.000 Tokens Arbeitsraum. Ursache in Craft Anything: im Deep-Modus hängt es dem MCP-Server
--all-toolsan. Fix dort: iris/craft-anything#20 (PR #21,CRAFT_ANYTHING_MCP_LEAN_TOOLS=1).Geändert:
tools/iris-claude-execsetzt bei ollama/lmstudio/openaicompatCRAFT_ANYTHING_MCP_LEAN_TOOLS=1(ein vom Aufrufer gesetzter Wert bleibt). Claude Code reicht die Variable an den MCP-Server weiter (mit einem Wegwerf-Server geprüft). Gemessen mit dem gebauten CLI: 323 Tools/~108.300 Tokens → 39 Tools/~12.200 Tokens.Nicht geprüft: ein echter Lauf in Craft Anything gegen Strata; ob der Agent im Deep-Studium die nötigen Toolsets selbst per
enable_toolsetaktiviert; ob damit das Komprimieren bis zum Ende des Builds trägt. Warum im verlorenen Lauf die fünfte automatische Komprimierung ausblieb, ist offen (im Claude-Code-Programm gibt es einen Circuit-Breaker und eine Thrashing-Erkennung; in der Sitzung keine Spur davon).Zum Einspielen:
pull-3rd-party craft-anythingbaut die neue Version (der MCP-Server muss das neue Programm sein),pull-allauf dem MacBook holtiris-claude-exec. Eine laufende Sitzung behält die alten Werte.Offen: Praxistest durch Alf. Serverseitig
"fit_max_tokens": truein der Strata-Konfiguration als Sicherheitsnetz (Alf).