Quando o contexto enche, aprenda a podar
"The agent can forget strategically and keep working forever." Esquecimento estratégico é uma capacidade de engenharia.
Por que compactar?
Com o tempo, o messages[] do agent incha: cada read_file retorna alguns milhares de tokens, cada bash retorna centenas, e cada rodada ainda acumula o texto de raciocínio do modelo. Depois de 50 rodadas, o contexto pode passar de 100K. Duas consequências:
- Atingir o limite do modelo: quando a janela de contexto se esgota, o sistema trava, ou o custo de cada chamada de API cresce linearmente.
- Diluição da atenção: a tarefa atual se perde no meio de 30 rodadas de tool_results irrelevantes, e o modelo começa a divagar.
A estratégia do s06: deixar o agent esquecer ativamente o que não importa, preservando o estado essencial. Três camadas, do mais leve ao mais pesado.
Layer 1 · micro_compact (roda silenciosamente a cada rodada)
A camada mais barata. Roda antes de cada chamada à LLM e substitui tool_results com mais de 3 rodadas de idade por um placeholder:
# a partir da 10ª rodada, a maioria dos tool_results vira: { "type": "tool_result", "tool_use_id": "toolu_01A", "content": "[Previous: used bash]" # de milhares de chars para dezenas }
Há uma exceção: resultados de read_file não são comprimidos. Por quê? Porque o output de read é material de referência — comprimir força o modelo a reler o arquivo, o que custaria ainda mais.
PRESERVE_RESULT_TOOLS = {"read_file"} # nunca comprime
Veja o micro_compact consumindo resultados antigos por turno
Abaixo, simule 10 rodadas de interação, com o micro_compact rodando antes de cada uma. Observe os tool_results antigos virando [Previous: ...], enquanto os 3 mais recentes permanecem intactos.
Layer 2 · auto_compact (acionado ao ultrapassar o limite)
Mesmo com micro rodando sempre, o acúmulo em grande escala ainda pode estourar. O s06 define um threshold (padrão: 50.000 tokens):
- Estima o total de tokens:
len(str(messages)) // 4(estimativa grosseira, mas suficiente). - Ultrapassa o threshold → grava o transcript completo em
.transcripts/transcript_TIMESTAMP.jsonl(backup). - Pede à LLM para gerar um summary do transcript completo.
- Substitui todo o
messagespor uma única entrada"[compressed] SUMMARY...".
A desvantagem é clara — perde-se os outputs específicos das ferramentas e o tom da conversa, restando apenas o esqueleto. Mas o agent pode continuar trabalhando, e esse é o benefício central.
Layer 3 · o modelo chama a ferramenta compact ativamente
O auto_compact é acionado automaticamente pelo harness, sem o modelo saber. A Layer 3 inverte isso: dá ao modelo uma ferramenta compact para que ele mesmo peça a compressão — por exemplo, quando sente que a exploração anterior já não é útil e quer iniciar uma nova fase.
O modelo chama:
tool_use("compact", focus="keep the API design decisions")
O processo é o mesmo do auto, mas com um parâmetro focus que guia o que preservar no summary. Na prática é muito útil — o modelo sabe quais são as "subtarefas encerradas", e essa precisão supera a heurística automática do harness.
Qual camada usar? Questões de julgamento
Para os cenários abaixo, determine qual camada — micro / auto / manual — é mais adequada.