antonio leandro

claude, na prática

Tool use with Claude

tutorial · núcleo · 02 · ferramentas · Anthropic ·

a tese

a pergunta útil sobre uma ferramenta não é o que ela faz, é onde o código roda: client tool devolve um bloco tool_use e para o turno esperando você; server tool volta com o resultado pronto na mesma resposta

o que fica

  1. A linha que organiza o catálogo inteiro é onde o código executa: client tools param o turno com stop_reason "tool_use" e esperam sua aplicação executar, enquanto server tools rodam na infraestrutura da Anthropic e já voltam com o resultado.
  2. Ferramentas com schema definido pela Anthropic — bash, text_editor, memory, computer use, browser use — continuam sendo client tools: a Anthropic publica o schema e treina o modelo nele, mas quem executa e devolve o tool_result é você.
  3. Só declarar ferramentas já custa tokens: a API injeta um system prompt próprio de tool use, que no Claude Opus 5 são 286 tokens com tool_choice auto ou none e 406 tokens com any ou tool.
  4. Esse overhead não decresce de forma limpa entre versões — o Claude Opus 4.7 pedia 675 tokens e o Opus 5 pede 286 —, então é um número para consultar por modelo, não para estimar de cabeça.
  5. Quando Claude decide chamar uma ferramenta é comportamento steerable pelo system prompt, não regra fixa; se você precisa de garantia em vez de tendência, o lugar é tool_choice, e para conformidade de schema é strict: true.
  6. A separação entre client e server vaza num caso específico: se Claude chama um server tool no mesmo grupo de chamadas paralelas que um client tool seu, você volta a ter que lidar com a execução.

o problema

Um modelo de linguagem responde com o que está no contexto e com o que ficou dos dados de treino. Pergunte o clima em São Francisco agora e nenhuma dessas duas fontes sabe a resposta. O caminho óbvio é deixar o modelo pedir a informação a alguém que sabe — mas aí aparece o problema real, que é o formato do pedido.

Se a saída do modelo é texto livre, quem pede vira quem faz parser. Você inventa um marcador, escreve uma regex, trata o caso em que ele escreveu o nome da função errado, trata o caso em que ele passou um argumento a menos. E sobra a segunda metade do problema: decidir quando pedir. Uma pergunta sobre a capital da França não precisa de chamada externa nenhuma; uma sobre o rover em Marte precisa. Essa decisão tem que morar em algum lugar, e o único lugar que enxerga a pergunta e o catálogo ao mesmo tempo é o modelo.

a ideia

Tool use resolve as duas metades com uma peça só: você descreve a ferramenta, e a descrição é ao mesmo tempo a documentação que o modelo lê para decidir e o contrato que ele preenche para chamar. Nome, description em prosa e um input_schema em JSON Schema. Claude usa a descrição para julgar se a pergunta cai naquela capacidade, e usa o schema para emitir uma chamada estruturada — um bloco tool_use com id, nome e input já validável — em vez de uma frase que você teria que interpretar.

Em cima disso, a documentação organiza o resto por um eixo que não é temático: é operacional. A pergunta não é o que a ferramenta faz, é de quem é o processo que executa. Isso divide o mundo em client tools, que rodam na sua aplicação, e server tools, que rodam na infraestrutura da Anthropic. Tudo que muda na sua vida — quem escreve o handler, quem trata erro, quanto isso custa, quantas viagens de rede você faz — cai desse lado da divisão.

como funciona

O ciclo de uma client tool tem duas requisições. Na primeira você manda a lista de tools junto com as mensagens. Claude volta com stop_reason: "tool_use" e um ou mais blocos tool_use. Você executa a operação e faz a segunda requisição com o histórico acrescido de duas mensagens: a resposta do assistant como veio, e uma mensagem de user contendo blocos tool_result com o tool_use_id correspondente.

tools = [{
    "name": "get_weather",
    "description": "Get the current weather for a given location.",
    "input_schema": {
        "type": "object",
        "properties": {"location": {"type": "string"}},
        "required": ["location"],
    },
}]

response = client.messages.create(
    model="claude-opus-5", max_tokens=1024, tools=tools,
    tool_choice={"type": "auto", "disable_parallel_tool_use": True},
    messages=messages,
)
tool_use = next(b for b in response.content if b.type == "tool_use")

messages += [
    {"role": "assistant", "content": response.content},
    {"role": "user", "content": [
        {"type": "tool_result", "tool_use_id": tool_use.id, "content": weather}
    ]},
]

Server tool é outra história: você declara {"type": "web_search_20260209", "name": "web_search"} e pronto. A busca roda do lado da Anthropic e os resultados voltam citados na mesma resposta, sem handler nenhum.

Os controles ficam em tool_choice. O default é auto — Claude decide a cada turno. disable_parallel_tool_use limita a uma chamada por turno. any e tool forçam a chamada em vez de torcer por ela. E strict: true na definição garante que o input venha exatamente no formato do seu schema.

o que isso custou

O custo mais fácil de ignorar é o de existir. A API injeta um system prompt próprio de tool use sempre que você passa ferramentas: 286 tokens no Claude Opus 5 com auto ou none, 406 com any ou tool. E esse número não segue uma curva — o Opus 4.7 cobrava 675, o Sonnet 5 cobra 354. É tabela para consultar, não intuição para aplicar. Só o caso de zero ferramentas com tool_choice: none custa zero.

Somam-se a isso o próprio bloco tools, os tool_use e os tool_result — e como o round trip reenvia o histórico, cada passo de um loop agêntico carrega todos os anteriores. Não à toa a documentação tem páginas separadas para gerenciar contexto de ferramentas e para combinar tool use com prompt caching. Server tools ainda cobram por uso, além dos tokens: web search cobra por busca realizada.

O comportamento também não é determinístico por construção. Se Claude não está chamando a ferramenta quando você espera, o ajuste sugerido é redação de system prompt — “Use the tools to investigate before responding.” empurra, “Always call a tool first before responding.” empurra mais, “Use your judgment” segura. Isso é influência, não garantia; a garantia é tool_choice. E a separação limpa entre client e server tem uma fresta admitida: se Claude chama um server tool no mesmo grupo de chamadas paralelas de um client tool seu, você volta a lidar com a execução.

onde isso aparece hoje

O round trip manual virou opcional: o Tool Runner dos SDKs executa suas ferramentas e devolve os resultados sozinho. O catálogo de client tools com schema da Anthropic — bash, text editor, memory, computer use, browser use — é o substrato dos agentes de código; são as mesmas primitivas, publicadas como interface estável.

Do lado do escalonamento, a tool search tool existe porque declarar tudo de uma vez não sobrevive à conta de tokens acima: com milhares de ferramentas, você descobre e carrega sob demanda. E o MCP connector conecta servidores MCP remotos direto pela Messages API, sem cliente MCP separado — o mesmo formato de chamada, com o catálogo vindo de fora.

lido na íntegra por pipeline de llm, revisado por antonio leandro antes de publicar ·