chimera-budget-the-context
Spendi rispetto a un budget inferiore alla finestra reale, e conta gli schemi delle tool che rinvii a ogni passo — sono il pavimento che la compattazione non può raggiungere.
Conferita da chi ha letto la scheda, non rivendicata dal file su se stesso. Una scheda che l'agente distilla durante un'esecuzione che ha consumato contenuti non affidabili nasce contaminata e resta in attesa di revisione prima di essere mai recuperata.
Quando viene in mente
- l'esecuzione è morta per overflow del contesto
- sto alzando max-steps
- l'agente ha dimenticato cosa stava facendo
- sto aggiungendo un altro server MCP
- decido cosa togliere dal prompt
Il valore di solito sta in Evita e Verifica. Fai è la sezione che scrivono tutti.
Il corpo della scheda qui sopra è una traduzione. L'originale inglese è ciò che la CLI importa, ciò che l'agente legge in esecuzione e ciò che l'hash qui sotto attesta.
Trigger
Stai eseguendo un ciclo che a ogni passo aggiunge in coda a una lista di messaggi — un agente ReAct, un turno di coding, un assistente che chiama tool — e la lista non fa che crescere. Sintomi: il provider solleva un errore di lunghezza del contesto, oppure l'esecuzione sopravvive ma dopo un tratto lungo comincia a lavorare sul file sbagliato.
Non si applica a una chiamata singola il cui prompt hai assemblato tu e puoi misurare una volta sola. Non c'è nessuna politica di eviction da progettare quando non si accumula nulla.
Fai
- Annota due numeri prima di toccare il ciclo: la finestra dichiarata dal modello, e la frazione
di essa che spenderai per il prompt. Chimera ne spende 0.6 (
DEFAULT_BUDGET_FRACTIONinchimera/core/context_budget.py). Il resto paga la completion e lo scarto tra la tua stima dei token e il conteggio reale del provider. - Fai scattare la compattazione su una quota del budget, non della finestra — Chimera la innesca a 0.8 del budget. La compattazione ha bisogno di spazio in cui compattare; un innesco fissato sulla finestra scatta quando non ne resta più.
- Misura il pavimento fisso separatamente dalla parte che cresce. Il messaggio di sistema più il
payload
tools=vengono rispediti a ogni passo e nessuna quantità di compattazione dei messaggi li tocca. Eseguichimera schema-bench(o conta il JSON a mano) prima di dare per scontato che sia la history a costare. Un import MCP o OpenAPI verboso può mettere decine di migliaia di token sotto ogni singolo passo dell'esecuzione. - Se il pavimento è il problema, riduci il pavimento: elimina le chiavi di schema puramente
annotative (
examples,title,default,$comment) e taglia la prosa dei parametri alla prima frase, lasciando intattitype,properties,requirededenumcosì che la selezione delle tool e la validità degli argomenti restino invariate. È ciò che fachimera/tools/schema_compact.py. Se è ancora troppo grande, dichiara meno tool. - Fissa esplicitamente l'ordine di eviction: il messaggio di sistema mai, i turni recenti alla lettera (Chimera ne tiene 6), il tratto più vecchio sostituito da un riassunto o da una nota fattuale. Non riscrivere mai il messaggio di sistema — è il prefisso stabile su cui è indicizzata la prompt cache, e modificarlo invalida ogni turno in cache dietro di esso.
- Dopo aver compattato, reinietta ciò che serve all'esecuzione per restare se stessa: il task alla lettera, il piano, la lista dei task con lo stato, e il file attualmente in modifica. Rileggi il file da disco invece di ripristinare una copia ricordata.
- Quando stimi tu stesso la dimensione in token, conta anche il payload
tool_calls, non solocontent. Gli argomenti delle tool viaggiano sul messaggio assistant e non stanno incontent; una stima che legge solocontentsottostima esattamente i messaggi che sono cresciuti.
Evita
Alzare --max-steps perché un task non è arrivato in fondo. È la mossa ovvia ed è quella che
uccide l'esecuzione: più passi significano una lista di messaggi più lunga contro la stessa finestra.
Buttare via l'enunciato del task. Arriva come messaggio user in testa alla lista, quindi è la prima cosa che un compattatore ingenuo scarta e l'ultima di cui l'agente può fare a meno. Il risultato è un agente che esegue un piano il cui scopo è stato cancellato — ancora sicuro di sé, ancora capace di produrre modifiche, nessun errore da nessuna parte. Un file può rileggerlo; un'istruzione no.
Lasciare un messaggio tool in testa alla coda conservata:
older, recent = body[:-keep_recent], body[-keep_recent:] # can orphan a tool result
contro
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
La maggior parte dei provider rifiuta un messaggio tool il cui tool_call assistant corrispondente
è sparito, quindi la compattazione che doveva salvare l'esecuzione è ciò che la termina.
Evita anche di tarare per prima cosa sulla massima compressione. Calibra dando la priorità al recall: tenere troppo costa token, ed è una bolletta; togliere troppo perde contesto che serviva più avanti, e quei messaggi sono spariti. Uno è un costo, l'altro è irrecuperabile.
Verifica
Abbassa di proposito la finestra — punta il budget su una finta finestra da 4K, oppure esegui un task che sai essere lungo — e conferma tre cose: che la compattazione è scattata, che l'esecuzione è proseguita oltre, e che il messaggio successivo conteneva la stringa del task originale. Cerca con grep, nel prompt composto dopo la compattazione, una frase distintiva del task. Se non c'è, il ripristino non funziona, qualunque cosa dicano i log.
Poi verifica il pavimento con una domanda binaria: il prompt di un singolo passo, con la history
vuota, sta già sopra la tua soglia? Se sì, la compattazione non potrà mai aiutare — compact()
restituisce changed=False su una lista che non riesce a ridurre, e la lettura onesta di un no-op è
"questo non ha aiutato", non "riprova contro lo stesso muro".
Rischio
Un budget fissato troppo basso compatta esecuzioni che non ne avevano bisogno, e ogni compattazione riscrive il suffisso del prompt e butta via i cache hit che stavano dietro. Su una lunga sessione di coding è una bolletta reale, pagata per evitare un overflow che non sarebbe avvenuto.
La compattazione degli schemi ha il suo lato tagliente: tagliare la descrizione di un parametro a una sola frase è sicuro per la validità degli argomenti, ma può rimuovere proprio la frase che diceva al modello quando usare quella tool. Cambia il comportamento di selezione senza cambiare nessuno schema che il validatore controlli, quindi fallisce come una scelta di tool leggermente peggiore anziché come un errore. Misurala con un A/B, non abilitarla perché fa risparmiare token.
E l'intero schema non compra nulla se il task è genuinamente troppo grande per il modello. Fare budget trasforma un tetto rigido in uno morbido; non crea spazio che non c'è.
Come usarla
La scheda è un dato. Clona il repository e importala per percorso — ciò che arriva dalla rete è trattato come contaminato e trattenuto in attesa di approvazione, che è il comportamento desiderabile e il motivo per cui qui non c'è un installatore in una riga.
git clone https://github.com/brcampidelli/chimera-agent.gitchimera skills-import chimera-agent/skills/chimera-budget-the-context/SKILL.mdIntegrità
SHA-256 del file così com'è pubblicato. Chi lo importa può verificare che ciò che ha ricevuto sia ciò che questa pagina mostrava.
63f202117c1ffb79dcc016edf37d12760ef2edd00274900bf5177dc1ee6b33f2