chimera-budget-the-context
Gaste contra um orçamento abaixo da janela real, e conte os schemas de tools que você reenvia a cada passo — eles são o piso que a compactação não alcança.
Conferida por quem revisou e leu o cartão, não reivindicada pelo próprio arquivo. Um cartão que o agente destila durante uma execução que consumiu conteúdo não confiável nasce contaminado e fica retido para revisão antes de alguma vez ser recuperado.
Quando ele vem à mente
- a execução morreu por estouro de contexto
- aumentando o max-steps
- o agente esqueceu o que estava fazendo
- adicionando mais um servidor MCP
- decidindo o que cortar do prompt
Evite e Verifique são onde costuma estar o valor. Faça é a seção que todo mundo escreve.
O corpo do cartão acima é uma tradução. O original em inglês é o que a CLI importa, o que o agente lê em execução e o que o hash abaixo atesta.
Gatilho
Você está rodando um loop que acrescenta a uma lista de mensagens a cada passo — um agente ReAct, um turno de codificação, um assistente que chama tools — e a lista só cresce. Sintomas: o provider levanta erro de tamanho de contexto, ou a execução sobrevive mas passa a trabalhar no arquivo errado depois de um trecho longo.
Não se aplica a uma chamada única (single-shot) cujo prompt você mesmo montou e pode medir uma vez. Não há política de descarte a projetar quando nada acumula.
Faça
- Anote dois números antes de tocar no loop: a janela anunciada pelo modelo, e a fração dela que
você vai gastar no prompt. O Chimera gasta 0.6 (
DEFAULT_BUDGET_FRACTIONemchimera/core/context_budget.py). O restante paga a completion e a diferença entre a sua estimativa de tokens e a contagem real do provider. - Dispare a compactação sobre uma fração do orçamento, não da janela — o Chimera dispara em 0.8 do orçamento. A compactação precisa de espaço para onde compactar; um gatilho colocado na janela dispara quando não sobrou nenhum.
- Meça o piso fixo separadamente da parte que cresce. A system message mais o payload de
tools=são reenviados a cada passo, e nenhuma quantidade de compactação de mensagens toca neles. Rodechimera schema-bench(ou conte o JSON você mesmo) antes de supor que o histórico é o que sai caro. Uma importação verbosa de MCP ou OpenAPI pode colocar dezenas de milhares de tokens sob cada passo da execução. - Se o piso é o problema, encolha o piso: remova as chaves de schema que são só anotação
(
examples,title,default,$comment) e corte a prosa dos parâmetros até a primeira frase, mantendotype,properties,requiredeenumintactos, para que a seleção de tools e a validade dos argumentos não mudem. É o quechimera/tools/schema_compact.pyfaz. Anuncie menos tools se ainda assim for grande demais. - Fixe a ordem de descarte explicitamente: a system message nunca, os turnos recentes na íntegra (o Chimera guarda 6), o trecho mais antigo substituído por um resumo ou uma nota factual. Nunca reescreva a system message — ela é o prefixo estável que serve de chave para o cache de prompt, e editá-la invalida todo turno em cache atrás dela.
- Depois de compactar, reinjete o que a execução precisa para continuar sendo ela mesma: a tarefa na íntegra, o plano, a lista de tarefas com status, e o arquivo que está sendo editado. Releia o arquivo do disco em vez de restaurar uma cópia lembrada.
- Quando você mesmo estimar o tamanho em tokens, conte o payload de
tool_callsalém decontent. Os argumentos das tools viajam na mensagem do assistant e não estão emcontent; uma estimativa de tamanho que lê apenascontentsubestima exatamente as mensagens que cresceram.
Evite
Aumentar --max-steps porque uma tarefa não terminou. É a jogada óbvia e é a que mata a execução:
mais passos significa uma lista de mensagens mais longa contra a mesma janela.
Descartar o enunciado da tarefa. Ele chega como uma mensagem de usuário lá no começo, então é a primeira coisa que um compactador ingênuo descarta e a última sem a qual o agente consegue trabalhar. O resultado é um agente executando um plano cujo propósito foi apagado — igualmente confiante, ainda produzindo edições, sem erro nenhum em lugar algum. Um arquivo ele consegue reler; uma instrução, não.
Deixar uma mensagem tool no início da cauda preservada:
older, recent = body[:-keep_recent], body[-keep_recent:] # can orphan a tool result
contra
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
A maioria dos providers rejeita uma mensagem tool cujo tool_call correspondente do assistant
sumiu, então a compactação que deveria salvar a execução é o que a encerra.
Evite também calibrar primeiro para compressão máxima. Calibre priorizando o que precisa ser recuperado: guardar demais custa tokens, o que é uma fatura; remover demais perde contexto que fazia falta depois, e essas mensagens se foram. Um é um custo, o outro é irrecuperável.
Verifique
Baixe a janela de propósito — aponte o orçamento para uma janela falsa de 4K, ou rode uma tarefa que você sabe ser longa — e confirme três coisas: a compactação disparou, a execução continuou depois dela, e a mensagem seguinte continha a string original da tarefa. Faça um grep no prompt composto atrás de uma frase distintiva da tarefa depois da compactação. Se ela não estiver lá, a restauração não está funcionando, digam os logs o que disserem.
Depois cheque o piso com uma pergunta binária: o prompt de um único passo, com histórico vazio, já
fica acima do seu limiar? Se sim, a compactação nunca poderá ajudar — compact() retorna
changed=False numa lista que não consegue encolher, e a leitura honesta de um no-op é "isto não
ajudou", não "tente de novo contra a mesma parede".
Risco
Um orçamento baixo demais compacta execuções que nunca precisaram disso, e toda compactação reescreve o sufixo do prompt e joga fora os acertos de cache atrás dele. Numa sessão longa de codificação isso é uma fatura real, paga para evitar um estouro que não teria acontecido.
A compactação de schema tem sua própria aresta: cortar a descrição de um parâmetro para uma frase é seguro para a validade dos argumentos, mas pode remover justamente a frase que dizia ao modelo quando usar a tool. Isso muda o comportamento de seleção sem mudar nenhum schema que o validador confere, então falha como uma escolha de tool ligeiramente pior, e não como um erro. Meça isso como um A/B; não ligue porque economiza tokens.
E o padrão inteiro não compra nada se a tarefa é genuinamente grande demais para o modelo. Orçar transforma um teto rígido em um teto flexível; não cria espaço que não existe.
Como usar
O cartão é dado. Clone o repositório e importe pelo caminho — o que chega pela rede é tratado como contaminado e fica retido para aprovação, que é o comportamento desejável e a razão de não haver um instalador de uma linha aqui.
git clone https://github.com/brcampidelli/chimera-agent.gitchimera skills-import chimera-agent/skills/chimera-budget-the-context/SKILL.mdIntegridade
SHA-256 do arquivo como publicado. Quem importa pode conferir que o que recebeu é o que esta página mostrou.
63f202117c1ffb79dcc016edf37d12760ef2edd00274900bf5177dc1ee6b33f2