Learn to wire real tools into the support-request agent using the Anthropic SDK tool-use API, and understand why shared tool context beats isolated parallel calls.
Quando conectei pela primeira vez uma busca na base de conhecimento ao agente de solicitações de suporte que estava construindo, cometi um erro que levou um dia inteiro para diagnosticar. A chamada de ferramenta funcionou — a busca na KB retornou resultados — mas a resposta final do agente foi pior do que antes de eu adicionar a ferramenta.
O problema não era a ferramenta em si. Era a contaminação de contexto. Eu estava alimentando resultados brutos da KB diretamente no próximo prompt sem controlar como o modelo os interpretaria. O agente começou a tratar artigos da KB como instruções autoritativas em vez de material de referência, e suas respostas desviaram. Eu havia adicionado uma capacidade sem entender o que aterrissaria no contexto de conversa compartilhado como resultado.
Essa falha me ensinou a lição real por trás da orquestração de ferramentas: não se trata de quantas ferramentas você conecta, ou quão inteligentemente você roteia entre elas. Trata-se do que aterra no contexto compartilhado após cada chamada de ferramenta, e se o modelo pode raciocinar claramente a partir dessa imagem acumulada.
Esta é a tese anti-multi-agente no nível das ferramentas. Chamadas paralelas de ferramentas que escrevem em contextos isolados falham pela mesma razão que agentes paralelos falham — cada chamada faz suposições que as outras não conseguem ver. Um padrão sequencial de uso de ferramentas onde cada resultado é acrescentado ao histórico de conversa compartilhado é quase sempre mais confiável, mesmo quando é mais lento.
Pense nas ferramentas como tomadas elétricas em uma oficina. A tomada não se importa com o que você conecta, mas o que você conecta determina tudo sobre o trabalho. Uma tomada bem posicionada alimentando a ferramenta certa supera seis tomadas conectadas às coisas erradas.
Insight chave: A API de uso de ferramentas não apenas adiciona capacidades — ela controla quais informações chegam ao contexto de conversa. Como você estrutura os resultados das ferramentas molda tudo que o modelo sabe a seguir.
Antes de conectar ferramentas ao agente de suporte, quero mostrar a forma real da API, porque o modelo mental importa tanto quanto o código. O fluxo de uso de ferramentas do SDK da Anthropic tem três etapas.
Cada etapa é uma chamada de API separada, e cada chamada estende a lista messages compartilhada.
O modelo nunca chama sua função diretamente — ele emite uma solicitação estruturada para que você
a chame, e você alimenta o resultado de volta como uma mensagem. Esse design é deliberado: o único
contato do modelo com o mundo exterior é através das mensagens que envia e recebe. Tudo que ele
sabe sobre o que a ferramenta retornou está nessa lista.
Primeiro, você envia uma mensagem com definições de ferramentas anexadas. Segundo, o modelo
responde com um bloco tool_use que nomeia a ferramenta e fornece seus inputs. Terceiro, você
chama a função real, depois envia o resultado de volta como um bloco tool_result. O modelo
termina com uma resposta em texto simples na próxima chamada.
A coisa crítica a internalizar é a etapa três: você sempre é quem executa a função. O modelo nunca tem acesso direto ao seu código ou à sua infraestrutura. Ele produz uma solicitação estruturada; você a executa; você retorna a saída. Essa fronteira é o que torna os agentes aumentados por ferramentas inspecionáveis — cada chamada de ferramenta e seu resultado é uma mensagem visível no histórico de conversa.
Aqui está o baseline mínimo — uma chamada regular sem ferramentas, para ancorar a forma antes de adicionarmos complexidade:
O objeto de resposta carrega stop_reason, usage e uma lista content. Para uma resposta em
texto simples, content[0] é um TextBlock e stop_reason é "end_turn". Esses dois valores
ancoram tudo que segue: stop_reason diz o que o modelo quer fazer a seguir, e content diz
o que ele produziu neste turno.
Agora adicione uma definição de ferramenta. O SDK da Anthropic usa input_schema — não
parameters — para descrever os inputs esperados da ferramenta:
Os campos description não são metadados decorativos. O modelo lê a descrição da ferramenta e
cada descrição de propriedade ao decidir se chama a ferramenta e qual valor passar. Uma descrição
vaga produz inputs inconsistentes; "Consulta de busca derivada do conteúdo do ticket" ancora o
modelo ao texto do ticket.
Erro comum: Usar "parameters" em vez de "input_schema" nas definições de ferramentas.
O SDK da Anthropic requer input_schema. Usar parameters produz silenciosamente um erro de
chave inesperada quando a ferramenta é acionada.
O agente de suporte precisa de duas ferramentas: busca na KB para encontrar artigos relevantes e histórico de tickets para ver o que aconteceu com este cliente antes. Ter ambas permite ao modelo triangular — uma resposta correta da KB combinada com se esse problema exato já surgiu antes.
Aqui está a segunda definição de ferramenta, seguindo o mesmo formato input_schema:
Quando stop_reason == "tool_use", o modelo nomeou uma ferramenta e forneceu seus inputs. Você
extrai esse bloco, chama sua função, depois acrescenta o bloco tool_use do modelo e seu
tool_result à lista de mensagens antes da próxima chamada:
A ordem de acréscimo importa. A mensagem assistant carregando response.content vai primeiro,
depois a mensagem user carregando o tool_result. Isso preserva a estrutura de papel alternado
que a API requer. O tool_use_id no bloco tool_result é como o modelo corresponde cada
resultado à chamada que o produziu.
Montando tudo: o loop do agente chama ferramentas conforme necessário, acrescentando cada resultado
ao contexto compartilhado, até que o modelo produza uma resposta final "end_turn":
O que está funcionando aqui: Cada resultado de ferramenta é acrescentado às messages antes
da próxima chamada. O modelo sempre vê o histórico completo — o que foi consultado, o que foi
encontrado, em sequência. Isso é contexto compartilhado, não resultados isolados.
Pause e preveja: se a busca na KB retornar três artigos e o histórico de tickets mostrar que o cliente abriu o mesmo problema duas vezes no mês passado, o que o modelo sabe ao entrar em sua resposta final?
Ele sabe ambos. Esse é o ponto. A lista messages acumula tudo — o ticket original, quais
ferramentas foram chamadas, o que elas retornaram — e o modelo raciocina a partir do quadro
completo.
Chamadas sequenciais de ferramentas com contexto compartilhado não é uma limitação de desempenho a contornar. É a arquitetura que funciona.
Prompt reflexivo: Quando você limitaria o número de ferramentas disponíveis? Um modelo com dez ferramentas deve escolher entre dez antes de fazer qualquer coisa útil. Um modelo com duas ferramentas focadas no problema quase sempre faz seleções melhores e mais confiantes de ferramentas — e gasta menos tokens na decisão em si.
O agente de suporte que construí acabou com exatamente duas ferramentas — busca na KB e histórico de tickets — porque adicionar mais ferramentas aumentou a incerteza na seleção de ferramentas sem melhorar a qualidade das respostas. O modelo estava gastando tokens decidindo qual das oito ferramentas chamar em vez de chamar as duas que precisava.
Duas ferramentas focadas com descrições claras e resultados formatados. Esse foi o padrão que funcionou.
Contaminação de contexto: Se sua ferramenta retornar dados brutos — blobs JSON, linhas de banco de dados, respostas de API não formatadas — o contexto se enche de ruído que o modelo tem que analisar antes de poder raciocinar. Formate os resultados das ferramentas como resumos legíveis. O trabalho da ferramenta não é apenas buscar dados; é contribuir com sinal limpo para o contexto compartilhado.
O próximo módulo adiciona um revisor humano a este mesmo agente: quando a confiança do modelo é baixa após consultar as ferramentas, uma pessoa intervém antes de a resposta ser enviada. Esse padrão de escalação constrói diretamente sobre o loop de uso de ferramentas que você tem aqui — o contexto compartilhado que se acumula entre as chamadas de ferramentas é exatamente o que o revisor humano irá ler.
Application-level questions on tool-use API shape, shared context, and common failure modes.
1. What value does `response.stop_reason` hold when the model wants to call a tool?
Correct Answer: B
The Anthropic SDK uses `"tool_use"` as the stop_reason when the model wants to invoke a tool. `"end_turn"` means the model produced a final text response. The other strings are not valid Anthropic stop reasons.
2. A developer writes a tool definition using `"parameters"` instead of `"input_schema"`. What is the most likely outcome?
Correct Answer: D
The Anthropic SDK requires `input_schema`. Using `parameters` is silently accepted by the API but produces an unexpected-key error when the model actually tries to fire the tool. Always use `input_schema`.
3. After calling a tool and receiving a result, what `role` should the tool_result message use?
Correct Answer: D
Tool results are sent with `role: "user"` and `content` containing a list with one object of `type: "tool_result"`. The assistant's `tool_use` block must be appended first (as `role: "assistant"`), then the tool result as `role: "user"`.
4. Why must you append the assistant's `tool_use` block to `messages` before appending the `tool_result`?
Correct Answer: B
The Anthropic API requires a `tool_use` block from the assistant to precede a matching `tool_result`. Without it, the conversation is malformed and the API rejects the request. Including both keeps the shared context coherent — the model sees what it asked for and what came back.
5. If you called KB search and ticket history in parallel and merged their results into a single message, what context would the model lose?
Correct Answer: B
When tool results are merged before sending, the model receives facts but loses the conversational thread — which question each tool was answering, what the model was thinking when it chose each tool, and the ordering of decisions. Sequential tool calls with shared context preserve this implicit reasoning trace.
6. The model returns `stop_reason == "end_turn"` on the very first call, before any tool has been invoked. What does this mean?
Correct Answer: B
A model with tools available will use them only when it judges they are needed. `end_turn` on the first response means the model produced a text answer directly. This is correct behavior — tool use is optional, not mandatory.
7. What is 'context contamination' in tool orchestration?
Correct Answer: C
Context contamination happens when tool results land in the conversation as JSON blobs, database rows, or raw API responses the model must interpret before it can use them. Formatting tool results as readable summaries reduces noise and lets the model reason more accurately from the accumulated context.
8. When should you actively limit the number of tools available to the model?
Correct Answer: C
A model choosing among ten tools spends tokens on tool-selection reasoning before doing any useful work. Two focused tools with clear descriptions almost always outperform ten loosely defined tools. The goal is to focus the model on the problem, not to maximize available capabilities.