01
A ferramenta tem três contratos, e o time testa só um
Quando um desenvolvedor escreve uma ferramenta para o agente, ele enxerga uma função: recebe argumentos, chama um serviço, devolve dados. O teste que ele escreve reflete essa visão e cobre bem o caminho da execução. Só que o modelo não interage com a função, ele interage com a descrição dela. Entre o prompt e o serviço existem três contratos independentes, e cada um pode regredir sozinho sem derrubar os outros dois.
O primeiro é o contrato de descoberta: nome da ferramenta, descrição, nomes e descrições dos parâmetros, enumerações, obrigatoriedade. É o texto que o modelo lê para decidir se aquela ferramenta serve para a pergunta. O segundo é o contrato de invocação: o esquema que valida os argumentos que o modelo produziu, incluindo tipos, formatos e valores aceitos. O terceiro é o contrato de retorno: a forma dos dados que voltam para dentro da janela de contexto e viram base da resposta ao cliente. Renomear um campo do retorno não quebra o esquema de entrada, não quebra a chamada HTTP e não gera exceção. Só faz o agente responder que não encontrou a informação.
| Camada | Quem consome | Como regride na prática | Teste que pega |
|---|---|---|---|
| Descoberta | O modelo, ao escolher a ferramenta | Descrição reescrita para ficar "mais clara" e a taxa de seleção cai | Suíte de seleção com casos rotulados |
| Invocação | O validador de argumentos | Parâmetro vira obrigatório ou muda de formato de data | Snapshot do esquema mais teste de compatibilidade |
| Retorno | O modelo, ao redigir a resposta | Campo renomeado ou aninhado em um nível novo | Contrato de resposta com dados gravados |
| Efeito colateral | O sistema de destino | Ação passa a exigir confirmação ou vira assíncrona | Teste de integração com serviço real ou dublê fiel |
| Erro | O modelo, ao decidir se tenta de novo | Formato de erro muda e o agente entra em laço de repetição | Casos de falha explícitos na suíte |
A última linha merece atenção porque produz o incidente mais caro da lista. Quando o formato de erro muda, o modelo perde a única pista que tinha sobre o que fazer a seguir, e o comportamento padrão de quase todo agente nessa situação é tentar de novo com os mesmos argumentos. O resultado é uma conversa que consome dez chamadas de ferramenta e três vezes o orçamento de tokens para terminar em uma resposta genérica de indisponibilidade. Nenhum teste de API pega isso, porque do ponto de vista da API o erro foi devolvido corretamente.