Zum Inhalt springen

Skills

chimera-budget-the-context

Rechne gegen ein Budget unterhalb des echten Fensters, und zähle die Tool-Schemas mit, die du bei jedem Schritt erneut mitschickst — sie sind der Boden, den Compaction nicht erreicht.

MusterHerkunft: cleanStatus: activev0.1.0 · Apache-2.0

Verliehen von der Person, die die Karte gelesen hat — nicht von der Datei über sich selbst behauptet. Eine Karte, die der Agent während eines Laufs mit nicht vertrauenswürdigen Inhalten destilliert, kommt kontaminiert zur Welt und wird bis zur Prüfung zurückgehalten, bevor sie jemals abgerufen wird.

Wann sie in den Sinn kommt

  • der Lauf ist am Kontextüberlauf gescheitert
  • max-steps erhöhen
  • der Agent weiß nicht mehr, woran er arbeitet
  • noch einen MCP-Server einbinden
  • entscheiden, was aus dem Prompt fliegt

In Vermeiden und Prüfen steckt meist der Wert. Tun ist der Abschnitt, den alle schreiben.

Der Kartentext oben ist eine Übersetzung. Das englische Original ist das, was die CLI importiert, was der Agent zur Laufzeit liest und was der Hash unten bezeugt.

Auslöser

Sie betreiben eine Schleife, die bei jedem Schritt an eine Nachrichtenliste anhängt — ein ReAct-Agent, eine Coding-Runde, ein Tool-aufrufender Assistent — und die Liste wächst immer nur. Symptome: Der Provider wirft einen Fehler wegen der Kontextlänge, oder der Lauf überlebt, arbeitet aber nach einer langen Strecke an der falschen Datei.

Das gilt nicht für einen einmaligen Aufruf, dessen Prompt Sie selbst zusammengestellt haben und einmal messen können. Es gibt keine Verdrängungsstrategie zu entwerfen, wenn sich nichts ansammelt.

Tun

  1. Schreiben Sie zwei Zahlen auf, bevor Sie die Schleife anfassen: das beworbene Fenster des Modells und den Anteil davon, den Sie für den Prompt ausgeben werden. Chimera gibt 0,6 aus (DEFAULT_BUDGET_FRACTION in chimera/core/context_budget.py). Der Rest bezahlt die Completion und die Lücke zwischen Ihrer Token-Schätzung und der echten Zählung des Providers.
  2. Lösen Sie die Compaction bei einem Anteil des Budgets aus, nicht des Fensters — Chimera löst bei 0,8 des Budgets aus. Compaction braucht Platz, in den hinein sie verdichten kann; ein Auslöser am Fenster feuert dann, wenn keiner mehr übrig ist.
  3. Messen Sie den festen Sockel getrennt vom wachsenden Teil. Die System-Nachricht plus die tools=-Payload werden bei jedem Schritt erneut mitgeschickt, und keine noch so gründliche Nachrichten-Compaction rührt sie an. Führen Sie chimera schema-bench aus (oder zählen Sie das JSON selbst), bevor Sie annehmen, dass die Historie das Teure ist. Ein geschwätziger MCP- oder OpenAPI-Import kann Zehntausende Tokens unter jeden einzelnen Schritt des Laufs legen.
  4. Wenn der Sockel das Problem ist, verkleinern Sie den Sockel: Entfernen Sie rein annotierende Schema-Schlüssel (examples, title, default, $comment) und kürzen Sie Parameter-Prosa auf den ersten Satz, wobei type, properties, required und enum unangetastet bleiben, damit Tool-Auswahl und Argument-Gültigkeit unverändert sind. Genau das macht chimera/tools/schema_compact.py. Bieten Sie weniger Tools an, wenn es immer noch zu groß ist.
  5. Legen Sie die Verdrängungsreihenfolge ausdrücklich fest: System-Nachricht nie, jüngste Runden wörtlich (Chimera behält 6), der ältere Abschnitt ersetzt durch eine Zusammenfassung oder eine sachliche Notiz. Schreiben Sie die System-Nachricht niemals um — sie ist das stabile Präfix, auf das der Prompt-Cache geschlüsselt ist, und sie zu bearbeiten macht jede zwischengespeicherte Runde dahinter ungültig.
  6. Injizieren Sie nach dem Verdichten wieder, was der Lauf braucht, um noch er selbst zu sein: die Aufgabe wörtlich, den Plan, die Aufgabenliste mit Status und die Datei, die gerade bearbeitet wird. Lesen Sie die Datei erneut von der Platte, statt eine erinnerte Kopie wiederherzustellen.
  7. Wenn Sie die Token-Größe selbst schätzen, zählen Sie die tool_calls-Payload mit, nicht nur content. Tool-Argumente reisen auf der Assistant-Nachricht mit und stehen nicht in content; eine Größenschätzung, die nur content liest, meldet genau die Nachrichten zu niedrig, die gewachsen sind.

Vermeiden

--max-steps zu erhöhen, weil eine Aufgabe nicht fertig wurde. Das ist der naheliegende Schritt, und es ist der, der den Lauf umbringt: mehr Schritte bedeuten eine längere Nachrichtenliste gegen dasselbe Fenster.

Die Aufgabenstellung fallen zu lassen. Sie kommt als User-Nachricht ganz vorne an, ist also das Erste, was ein naiver Compactor verdrängt, und das Letzte, ohne das der Agent arbeiten kann. Das Ergebnis ist ein Agent, der einen Plan ausführt, dessen Zweck gelöscht wurde — weiterhin zuversichtlich, weiterhin Änderungen produzierend, nirgends ein Fehler. Eine Datei kann er erneut lesen; eine Anweisung nicht.

Eine tool-Nachricht am Kopf des behaltenen Endstücks stehen zu lassen:

older, recent = body[:-keep_recent], body[-keep_recent:]   # can orphan a tool result

gegenüber

older, recent = body[:-keep_recent], body[-keep_recent:]
while recent and recent[0].get("role") == "tool":
    older.append(recent.pop(0))                            # tail starts on a legal turn

Die meisten Provider lehnen eine tool-Nachricht ab, deren zugehöriger Assistant-tool_call verschwunden ist — die Compaction, die den Lauf retten sollte, ist damit das, was ihn beendet.

Vermeiden Sie außerdem, zuerst auf maximale Kompression zu optimieren. Kalibrieren Sie zuerst auf Erinnerbarkeit: zu viel zu behalten kostet Tokens, das ist eine Rechnung; zu viel zu entfernen verliert Kontext, der später gebraucht wurde, und diese Nachrichten sind weg. Das eine ist ein Kostenpunkt, das andere ist nicht wiederherstellbar.

Prüfen

Setzen Sie das Fenster absichtlich niedrig — richten Sie das Budget auf ein künstliches 4K-Fenster, oder lassen Sie eine Aufgabe laufen, von der Sie wissen, dass sie lang ist — und bestätigen Sie drei Dinge: Die Compaction hat ausgelöst, der Lauf ging darüber hinaus weiter, und die darauf folgende Nachricht enthielt den ursprünglichen Aufgabentext. Grepen Sie den zusammengesetzten Prompt nach einer markanten Formulierung aus der Aufgabe, nachdem verdichtet wurde. Steht sie nicht drin, funktioniert die Wiederherstellung nicht, was auch immer die Logs sagen.

Prüfen Sie dann den Sockel mit einer binären Frage: Liegt der Prompt eines einzelnen Schritts mit leerer Historie bereits über Ihrer Schwelle? Wenn ja, kann Compaction niemals helfen — compact() gibt changed=False auf einer Liste zurück, die es nicht verkleinern kann, und die ehrliche Lesart eines No-ops ist „das hat nicht geholfen", nicht „noch einmal gegen dieselbe Wand".

Risiko

Ein zu niedrig gesetztes Budget verdichtet Läufe, die das nie gebraucht hätten, und jede Compaction schreibt das Prompt-Suffix um und wirft die Cache-Treffer dahinter weg. In einer langen Coding-Sitzung ist das eine echte Rechnung, bezahlt, um einen Überlauf zu vermeiden, der nicht eingetreten wäre.

Die Schema-Compaction hat ihre eigene Kante: Eine Parameterbeschreibung auf einen Satz zu kürzen ist für die Argument-Gültigkeit unbedenklich, kann aber den Satz entfernen, der dem Modell sagte, wann das Tool zu verwenden ist. Es verändert das Auswahlverhalten, ohne irgendein Schema zu verändern, das der Validator prüft — es scheitert also als leicht schlechtere Tool-Wahl statt als Fehler. Messen Sie es als A/B, aktivieren Sie es nicht, weil es Tokens spart.

Und das ganze Muster bringt nichts, wenn die Aufgabe für das Modell schlicht zu groß ist. Budgetierung macht aus einer harten Decke eine weiche; sie schafft keinen Platz, der nicht da ist.

Verwenden

Die Karte ist Daten. Klonen Sie das Repository und importieren Sie sie über den Pfad — was über das Netz kommt, gilt als kontaminiert und wird bis zur Freigabe zurückgehalten. Das ist das gewünschte Verhalten und der Grund, warum es hier keinen Einzeiler-Installer gibt.

git clone https://github.com/brcampidelli/chimera-agent.git
chimera skills-import chimera-agent/skills/chimera-budget-the-context/SKILL.md

Integrität

SHA-256 der Datei in der veröffentlichten Fassung. Wer sie importiert, kann prüfen, dass das Empfangene dem entspricht, was diese Seite gezeigt hat.

63f202117c1ffb79dcc016edf37d12760ef2edd00274900bf5177dc1ee6b33f2

Die Karte im Repository lesen