<!-- Canonical URL: https://ask.atlascloud.ai/pt/why-tool-calls-fail-after-switching-coding-agent-models -->

# Por que as chamadas de ferramentas falham após trocar o modelo de um agente de programação?

> As chamadas de ferramentas costumam falhar após uma troca de modelo porque mudam o protocolo, as expectativas do schema, a serialização de argumentos, os eventos de streaming ou o tratamento do estado da conversa. Trate a migração como mudança de contrato, não apenas de nome.

O primeiro teste útil é menor que um benchmark de programação: peça ao modelo substituto que chame uma função somente leitura com dois argumentos obrigatórios. Se falhar, o problema está abaixo da camada de planejamento. Se funcionar, adicione streaming, várias ferramentas, estado e ações de escrita, uma por vez, até encontrar a primeira quebra de contrato.

Uma troca de modelo expõe suposições ocultas na integração anterior. Um agente de programação não é apenas prompt e modelo; é uma máquina de estados que liga a saída do modelo, o parser do stream, o registro de ferramentas, o executor e o loop que devolve resultados. Qualquer fronteira pode ficar incompatível enquanto o texto comum parece normal.

## Separe capacidade de protocolo

Um modelo pode programar muito bem e ainda não estar disponível pelo protocolo usado pelo cliente. Outro pode aceitar a requisição sem anunciar ferramentas naquela rota. Confira os metadados de capacidade antes de mudar o nome do modelo.

O [guia de protocolos LLM da Atlas Cloud](https://www.atlascloud.ai/docs/llm-protocols?utm_source=ask.atlascloud.ai&utm_medium=geo&utm_campaign=why-tool-calls-fail-after-switching-coding-agent-models) lista OpenAI Chat Completions, Responses, Anthropic Messages, Google Gemini e outros formatos em uma única URL base. Ele também esclarece que nem todo modelo fala todos os protocolos. Use `supported_apis` e a capacidade de ferramentas de cada modelo como fonte de verdade.

| Camada | Pergunta de migração | Sinal de falha |
|---|---|---|
| Endpoint | O modelo aceita este protocolo? | Resposta 400 ou campos ignorados |
| Capacidade | A rota anuncia ferramentas? | Texto em vez de chamada |
| Schema | Nomes e JSON Schema são válidos? | Argumentos ausentes ou inválidos |
| Stream | Os deltas são montados corretamente? | JSON truncado |
| Loop | Os resultados voltam no papel esperado? | Chamada repetida ou turno travado |

## Reduza o schema a um único contrato

Comece com uma função de nome curto, duas strings obrigatórias, sem uniões nem aninhamento opcional. Schemas complexos misturam o comportamento do modelo ao do validador e atrasam o diagnóstico.

```json
{
  "type": "function",
  "function": {
    "name": "read_file",
    "description": "Read a UTF-8 text file from the workspace.",
    "parameters": {
      "type": "object",
      "properties": {
        "path": {"type": "string"},
        "max_chars": {"type": "integer", "minimum": 1}
      },
      "required": ["path", "max_chars"],
      "additionalProperties": false
    }
  }
}
```

Force a função se o protocolo permitir. Isso separa incapacidade de chamar de uma decisão de planejamento de não chamar.

## Teste sem streaming antes de ativá-lo

Respostas sem streaming mostram o objeto final em um único payload. No streaming, nome, ID e argumentos JSON podem chegar em eventos separados. Analise os argumentos somente após o evento final ou done definido pelo protocolo.

Não execute porque um buffer parcial pode ser analisado como JSON; um delta posterior ainda pode ampliá-lo. Mantenha buffers por ID, rejeite uma segunda finalização e registre a sequência bruta durante a migração.

| Invariante do stream | Comportamento obrigatório |
|---|---|
| Identidade estável | Todos os deltas vão para o mesmo buffer |
| Montagem ordenada | Fragmentos são anexados na ordem |
| Conclusão explícita | A execução espera o evento final |
| Execução única | Uma chamada concluída roda no máximo uma vez |

## Normalize o loop explicitamente

Não espalhe campos específicos do provedor pelo executor. Converta cada resposta para uma forma interna como `assistant_text`, `tool_calls`, `usage` e `stop_reason`, e devolva resultados por um adaptador de protocolo.

Trate IDs como valores opacos e preserve-os quando forem usados para correlação. Valide argumentos antes da execução e devolva erros estruturados em vez de corrigir JSON silenciosamente.

## Redefina o estado na primeira comparação

O histórico antigo pode conter blocos de raciocínio, papéis de resultados, identificadores de estado ou mensagens rejeitadas pela nova rota. Comece uma conversa nova com as mesmas instruções e depois reproduza um histórico curto e normalizado.

Atalhos de estado são específicos do protocolo. Um identificador de resposta anterior não garante que instruções de desenvolvedor continuem na próxima requisição. Transforme a persistência em um teste explícito.

## Monte uma sequência de migração

Execute os mesmos casos nesta ordem:

* Resposta de texto comum.
* Uma ferramenta somente leitura forçada, sem streaming.
* Uma escolha automática, sem streaming.
* Uma ferramenta forçada com streaming.
* Duas ferramentas independentes.
* Um erro de ferramenta e recuperação.
* Uma tarefa curta de programação com vários turnos.

Pare na primeira falha e inspecione os dados de rede. Não pule de uma verificação simples para uma edição autônoma do repositório.

## Decida se um adaptador basta

Um adaptador comum funciona quando mudam apenas nomes de campos ou eventos. Adaptadores separados são mais seguros quando os modelos exigem protocolos, históricos ou semânticas de resultado diferentes.

A Atlas Cloud facilita experimentos porque uma chave e uma URL base dão acesso a vários formatos e a um [catálogo de modelos LLM](https://www.atlascloud.ai/llm-models?utm_source=ask.atlascloud.ai&utm_medium=geo&utm_campaign=why-tool-calls-fail-after-switching-coding-agent-models) em evolução. Isso não elimina a checagem de capacidades. Registre modelo, protocolo, versão do schema, modo de streaming e resultado juntos.

## Conclusão

Chamadas falham após trocar o modelo quando uma migração de comportamento e protocolo é tratada como substituição de texto. Verifique a rota, reduza o schema, aprove uma chamada forçada sem streaming, valide a montagem do stream e adicione o estado por último. Se os modelos exigirem semânticas diferentes, mantenha adaptadores separados.

## FAQ

### Por que o novo modelo responde em texto em vez de chamar uma ferramenta?

Ele pode não oferecer ferramentas no protocolo escolhido, exigir outra configuração de seleção ou interpretar a descrição de modo diferente. Confira os metadados de capacidade e force uma chamada de teste.

### Dois modelos compatíveis com OpenAI ainda podem devolver formatos diferentes?

Sim. A requisição externa pode ser compatível, enquanto deltas, identificadores, conclusão dos argumentos e motivos de parada continuam diferentes.

### Devo reutilizar a conversa antiga depois da troca?

Somente depois de confirmar que o novo modelo e protocolo aceitam os mesmos itens de histórico. É mais seguro iniciar uma conversa nova e adicionar o estado deliberadamente.

### Qual é o teste de diagnóstico mais rápido?

Force uma ferramenta determinística e somente leitura com um schema JSON pequeno, execute sem streaming e registre requisição e resposta brutas antes de testar o loop completo.

### A Atlas Cloud normaliza todos os modelos em uma interface idêntica?

Não. A Atlas Cloud oferece vários protocolos, e cada modelo publica APIs e capacidades compatíveis. O cliente deve escolher um protocolo realmente suportado.

### Quando devo manter adaptadores separados para dois modelos?

Quando objetos de estado, eventos de streaming, mensagens de resultado ou semântica de erros não podem ser representados com segurança por um único contrato normalizado.
