Pareamento de Tool Results
Todatool_use (chamada de ferramenta pelo modelo) deve ter um tool_result correspondente no histórico de conversacao. Quando essa correspondencia quebra — por interrupcao, timeout ou erro silencioso — a API rejeita o histórico.
O sistema EnsureToolResultPairing valida e repara automaticamente:
| Problema | Acao de Reparo |
|---|---|
tool_use sem tool_result (orfao) | Injeta resultado sintetico de erro |
tool_result sem tool_use (orfao) | Remove do histórico |
IDs de tool_use duplicados | Mantém apenas a primeira ocorrencia |
Resultados Sinteticos
Quando uma tool_use não tem resultado correspondente, o ChatCLI injeta:Validação em 3 Fases
Coleta de IDs
Percorre todo o histórico coletando IDs de
tool_use (de mensagens assistant) e IDs de tool_result (de mensagens tool).Detecção de Desalinhamentos
Compara os dois conjuntos de IDs. Tool uses sem resultado sao “missing”. Tool results sem uso sao “orphans”. IDs duplicados sao marcados para dedup.
Orcamento de Resultados (Budget Enforcement)
Resultados de ferramentas como leitura de arquivos grandes ou saida de comandos podem consumir rapidamente a janela de contexto. O sistema de orcamento limita o tamanho agregado em três niveis:| Nivel | Limite | Variável / Override | Default |
|---|---|---|---|
| Per-tool (novo) | Cap aplicado dentro do dispatch antes da agregação | Capability TruncationAware.MaxResultChars() por plugin | 30.000 chars (global) |
| Por resultado | Tamanho máximo de um unico resultado | CHATCLI_TOOL_RESULT_MAX_CHARS | 20.000 chars |
| Por turno | Tamanho agregado de todos os resultados no turno | CHATCLI_TOOL_RESULT_BUDGET_CHARS | 200.000 chars |
Per-tool truncation (capability)
Plugins que implementamplugins.TruncationAware declaram seu próprio cap — útil quando o tool tem necessidade de contexto fora do padrão:
| Plugin | Cap | Justificativa |
|---|---|---|
@read | 80 000 | Arquivos grandes (~1500 linhas) são primary code-learning surface; cap baixo cega o modelo |
@search | 60 000 | Output estruturado breadth-oriented (file:line:match) — modelo precisa de amplitude |
@tree | 50 000 | Listagens de monorepo facilmente passam de 30k |
| Demais plugins | 30 000 | Default global |
[TRUNCATED N chars omitted, M kept]).
Como Funciona o Enforcement
O orcamento e aplicado em duas passadas:- Passada 1: Por Resultado
- Passada 2: Por Turno
Cada resultado individual e verificado contra
DefaultPerResultMaxChars (20KB). Se exceder, o conteúdo completo e salvo em disco e substituido por um preview:Persistência em Disco
Resultados truncados são salvos em arquivos temporários dentro do Workspace de Sessão, em vez do antigo diretório global/tmp/chatcli-tool-results/:
- Isolamento entre sessões. Múltiplas instâncias de
chatclirodando em paralelo no mesmo host não compartilham mais o pool de overflow. - Leitura sob demanda pelo agente. O scratch dir está na allowlist de leitura do agente, então quando o modelo encontra a marca
[full output saved to ...]no preview, ele consegue abrir o arquivo comread_file:
Preview: Head + Tail
O preview mantem o inicio e o final do resultado para maximizar utilidade:| Componente | Tamanho |
|---|---|
| Head (inicio) | 4.000 chars (corta na ultima quebra de linha) |
| Referência | Caminho do arquivo em disco |
| Tail (final) | 1.000 chars (corta na primeira quebra de linha) |
Microcompactacao Progressiva
A microcompactacao reduz progressivamente o tamanho de resultados antigos de ferramentas conforme a conversa avanca, sem perder informação crítica:| Idade do Resultado | Acao | Detalhes |
|---|---|---|
| Turno atual e anterior | Sem alteracao | Resultados preservados integralmente |
| 2+ turnos atras | Truncado | Head (2.000 chars) + tail (500 chars) |
| 4+ turnos atras | Resumido | Uma linha descritiva: [Old tool result cleared — 450 lines, 28K chars, Go source] |
Detecção de Tipo de Conteúdo
O resumo identifica automaticamente o tipo do conteúdo para contexto:| Conteúdo | Tipo Detectado |
|---|---|
Comeca com { ou [ | JSON |
Contem package | Go source |
Contem def | Python source |
Contem function | JavaScript source |
Comeca com diff ou --- | diff |
Comeca com commit | git log |
| Outros | text |
Configuração da Microcompactacao
| Variável | Descricao | Default |
|---|---|---|
CHATCLI_MICROCOMPACT_TRUNCATE_TURNS | Turnos antes de truncar | 2 |
CHATCLI_MICROCOMPACT_SUMMARIZE_TURNS | Turnos antes de resumir | 4 |
Apenas resultados com mais de 3.000 chars sao compactados. Resultados pequenos sao sempre preservados. Resultados de ferramentas de escrita e execução sao preservados por conterem informações críticas de erro.
Fluxo Completo
O gerenciamento de resultados e aplicado nesta ordem durante o loop do agente:Configuração Completa
| Variável de Ambiente | Descricao | Default |
|---|---|---|
CHATCLI_TOOL_RESULT_BUDGET_CHARS | Orcamento agregado por turno | 200.000 |
CHATCLI_TOOL_RESULT_MAX_CHARS | Tamanho máximo por resultado | 20.000 |
CHATCLI_MICROCOMPACT_TRUNCATE_TURNS | Turnos para iniciar truncamento | 2 |
CHATCLI_MICROCOMPACT_SUMMARIZE_TURNS | Turnos para iniciar sumarizacao | 4 |
Próximos Passos
Workspace de Sessão
Onde os arquivos de overflow vivem e como o agente os lê.
Subagent Delegation
Estratégia complementar para evitar saturar o contexto com dados brutos.
Recuperação de Contexto
O que acontece quando mesmo com orçamento o contexto transborda.
Cost Tracking
Monitore o consumo de tokens incluindo tool results.