Por que JSON Malformado?
LLMs frequentemente geram JSON invalido em seus argumentos de tool call. Isso acontece porque modelos de linguagem trabalham com tokens, nao com validacao de sintaxe:| Problema | Exemplo | Frequencia |
|---|---|---|
| Aspas simples em vez de duplas | {'cmd': 'read'} | Muito comum |
| Chaves sem aspas | {cmd: "read", file: "main.go"} | Comum |
| Virgulas finais | {"cmd":"read","file":"main.go",} | Comum |
| Valor puro sem objeto | main.go em vez de {"file":"main.go"} | Frequente |
| Mix de estilos | {cmd: 'read', "file": main.go} | Ocasional |
| Texto CLI em vez de JSON | read --file main.go | Frequente |
| Literais de objeto JS | {cmd: read, file: main.go} | Ocasional |
As 7 Estrategias de Recuperacao
O sistemaNormalizeToolArgs aplica ate 7 estrategias em sequencia, parando na primeira que produz JSON valido:
1. Parse JSON Padrao
1. Parse JSON Padrao
Tenta parsing direto com
json.Unmarshal. Se o JSON ja e valido, retorna imediatamente sem modificacoes.2. Aspas Simples para Duplas
2. Aspas Simples para Duplas
Converte aspas simples para duplas com tratamento correto de escaping. Preserva aspas simples dentro de strings e escapa aspas duplas internas.
3. Chaves sem Aspas
3. Chaves sem Aspas
Adiciona aspas duplas a chaves que nao estao entre aspas. Usa regex para detectar o padrao
{key: ou , key:.4. Combinado: Aspas + Chaves
4. Combinado: Aspas + Chaves
Aplica a correcao de aspas simples primeiro e depois a correcao de chaves sem aspas. Resolve casos onde ambos os problemas coexistem.
5. Virgulas Finais
5. Virgulas Finais
Remove virgulas antes de
} ou ] que tornam o JSON invalido.6. Plain String Wrapping
6. Plain String Wrapping
Quando o modelo envia apenas um valor puro em vez de um objeto JSON, o sistema o envolve no campo correto baseado no nome da ferramenta.O mapeamento cobre 30+ ferramentas e aliases, incluindo funcoes nativas (
read_file, write_file) e subcomandos do coder (read, exec, search).7. Fix Agressivo de Literais de Objeto
7. Fix Agressivo de Literais de Objeto
Para literais de objeto sem nenhum tipo de aspas, o sistema faz parse manual de pares Valores sao interpretados inteligentemente:
chave: valor e reconstroi JSON valido.true/false→ booleans- Numeros → numeros JSON
null/none→ null- Strings entre aspas → strings (aspas removidas)
- Tudo mais → string
Mapeamento Tool → Campo
O plain string wrapping usa um mapeamento extenso de nomes de ferramenta para o campo primario de entrada:- Ferramentas Nativas
- Subcomandos Coder
- Aliases Genericos
| Ferramenta | Campo | Exemplo |
|---|---|---|
read_file | file | main.go → {"file":"main.go"} |
write_file | file | output.txt → {"file":"output.txt"} |
list_directory | dir | ./src → {"dir":"./src"} |
search_files | term | TODO → {"term":"TODO"} |
run_command | cmd | go build → {"cmd":"go build"} |
run_tests | dir | ./pkg → {"dir":"./pkg"} |
O wrapping so e aplicado quando o valor nao se parece com argumentos CLI (sem
--flags) e nao comeca com { ou [. Isso evita conflitos com o parser de argumentos CLI existente.Normalizacao de Aspas Unicode
Alem do JSON recovery, o ChatCLI normaliza aspas curvas (Unicode) para aspas retas (ASCII) automaticamente. LLMs frequentemente geram aspas tipograficas que causam erros de compilacao:| Caracter | Unicode | Substituicao |
|---|---|---|
' ' | U+2018, U+2019 | ' (aspas simples reta) |
" " | U+201C, U+201D | " (aspas dupla reta) |
' | U+2032 (primo) | ' |
" | U+2033 (duplo primo) | " |
<< >> | U+00AB, U+00BB | << >> |
Configuracao
O sistema de recuperacao funciona automaticamente sem configuracao. Todas as estrategias sao aplicadas em ordem ate que uma produza JSON valido.| Variavel | Descricao | Default |
|---|---|---|
| (nenhuma) | O JSON recovery nao possui variaveis de ambiente dedicadas | Ativo sempre |
As estrategias de recuperacao sao nao-destrutivas: se nenhuma produzir JSON valido, o texto original e passado adiante para que o parser CLI tente interpretar como argumentos posicionais.
Proximos Passos
Plugin @coder
Referencia completa das ferramentas que usam JSON recovery.
Tool Use Nativo
Com tool use nativo, o JSON vem validado pela API — menos necessidade de recovery.
Gerenciamento de Resultados
Como resultados de ferramentas sao gerenciados apos execucao.
Modo Coder
O fluxo completo de engenharia com tool calls.