Como implementar o uso de ferramentas
Escolhendo um modelo
Recomendamos usar o modelo Claude Sonnet (4.5) ou Claude Opus (4.1) mais recente para ferramentas complexas e consultas ambíguas; eles lidam melhor com múltiplas ferramentas e buscam esclarecimentos quando necessário.
Use modelos Claude Haiku para ferramentas diretas, mas observe que eles podem inferir parâmetros ausentes.
Se estiver usando Claude com uso de ferramentas e pensamento estendido, consulte nosso guia aqui para mais informações.
Especificando ferramentas do cliente
As ferramentas do cliente (tanto definidas pela Anthropic quanto definidas pelo usuário) são especificadas no parâmetro de nível superior tools da solicitação da API. Cada definição de ferramenta inclui:
| Parâmetro | Descrição |
|---|---|
name | O nome da ferramenta. Deve corresponder à regex ^[a-zA-Z0-9_-]{1,64}$. |
description | Uma descrição detalhada em texto simples do que a ferramenta faz, quando deve ser usada e como se comporta. |
input_schema | Um objeto JSON Schema que define os parâmetros esperados para a ferramenta. |
Prompt do sistema de uso de ferramentas
Quando você chama a API Claude com o parâmetro tools, construímos um prompt do sistema especial a partir das definições de ferramentas, configuração de ferramentas e qualquer prompt do sistema especificado pelo usuário. O prompt construído é projetado para instruir o modelo a usar as ferramentas especificadas e fornecer o contexto necessário para que a ferramenta funcione corretamente:
In this environment you have access to a set of tools you can use to answer the user's question.
{{ FORMATTING INSTRUCTIONS }}
String and scalar parameters should be specified as is, while lists and objects should use JSON format. Note that spaces for string values are not stripped. The output is not expected to be valid XML and is parsed with regular expressions.
Here are the functions available in JSONSchema format:
{{ TOOL DEFINITIONS IN JSON SCHEMA }}
{{ USER SYSTEM PROMPT }}
{{ TOOL CONFIGURATION }}Melhores práticas para definições de ferramentas
Para obter o melhor desempenho do Claude ao usar ferramentas, siga estas diretrizes:
- Forneça descrições extremamente detalhadas. Este é de longe o fator mais importante no desempenho da ferramenta. Suas descrições devem explicar cada detalhe sobre a ferramenta, incluindo:
- O que a ferramenta faz
- Quando deve ser usada (e quando não deve)
- O que cada parâmetro significa e como afeta o comportamento da ferramenta
- Quaisquer ressalvas ou limitações importantes, como quais informações a ferramenta não retorna se o nome da ferramenta for pouco claro. Quanto mais contexto você puder fornecer ao Claude sobre suas ferramentas, melhor ele será em decidir quando e como usá-las. Procure por pelo menos 3-4 frases por descrição de ferramenta, mais se a ferramenta for complexa.
- Priorize descrições sobre exemplos. Embora você possa incluir exemplos de como usar uma ferramenta em sua descrição ou no prompt acompanhante, isso é menos importante do que ter uma explicação clara e abrangente do propósito e parâmetros da ferramenta. Adicione exemplos apenas depois de ter desenvolvido completamente a descrição.
A boa descrição explica claramente o que a ferramenta faz, quando usá-la, quais dados ela retorna e o que o parâmetro ticker significa. A descrição ruim é muito breve e deixa Claude com muitas questões em aberto sobre o comportamento e uso da ferramenta.
Executor de ferramentas (beta)
O executor de ferramentas fornece uma solução pronta para executar ferramentas com Claude. Em vez de lidar manualmente com chamadas de ferramentas, resultados de ferramentas e gerenciamento de conversas, o executor de ferramentas automaticamente:
- Executa ferramentas quando Claude as chama
- Lida com o ciclo de solicitação/resposta
- Gerencia o estado da conversa
- Fornece segurança de tipo e validação
Recomendamos que você use o executor de ferramentas para a maioria das implementações de uso de ferramentas.
O executor de ferramentas está atualmente em beta e disponível apenas nos SDKs Python e TypeScript.
Uso básico
O executor de ferramentas do SDK está em beta. O resto deste documento cobre implementação manual de ferramentas.
Controlando a saída de Claude
Forçando o uso de ferramentas
Em alguns casos, você pode querer que Claude use uma ferramenta específica para responder à pergunta do usuário, mesmo que Claude pense que pode fornecer uma resposta sem usar uma ferramenta. Você pode fazer isso especificando a ferramenta no campo tool_choice assim:
tool_choice = {"type": "tool", "name": "get_weather"}Ao trabalhar com o parâmetro tool_choice, temos quatro opções possíveis:
autopermite que Claude decida se deve chamar qualquer ferramenta fornecida ou não. Este é o valor padrão quandotoolssão fornecidas.anydiz a Claude que ele deve usar uma das ferramentas fornecidas, mas não força uma ferramenta particular.toolnos permite forçar Claude a sempre usar uma ferramenta particular.noneimpede Claude de usar qualquer ferramenta. Este é o valor padrão quando nenhumatoolsé fornecida.
Ao usar cache de prompt, mudanças no parâmetro tool_choice invalidarão blocos de mensagens em cache. Definições de ferramentas e prompts do sistema permanecem em cache, mas o conteúdo da mensagem deve ser reprocessado.
Este diagrama ilustra como cada opção funciona:

Observe que quando você tem tool_choice como any ou tool, preencheremos previamente a mensagem do assistente para forçar o uso de uma ferramenta. Isso significa que os modelos não emitirão uma resposta em linguagem natural ou explicação antes dos blocos de conteúdo tool_use, mesmo se explicitamente solicitado.
Ao usar pensamento estendido com uso de ferramentas, tool_choice: {"type": "any"} e tool_choice: {"type": "tool", "name": "..."} não são suportados e resultarão em um erro. Apenas tool_choice: {"type": "auto"} (o padrão) e tool_choice: {"type": "none"} são compatíveis com pensamento estendido.
Nossos testes mostraram que isso não deve reduzir o desempenho. Se você gostaria que o modelo fornecesse contexto em linguagem natural ou explicações enquanto ainda solicitava que o modelo usasse uma ferramenta específica, você pode usar {"type": "auto"} para tool_choice (o padrão) e adicionar instruções explícitas em uma mensagem user. Por exemplo: What's the weather like in London? Use the get_weather tool in your response.
Saída JSON
Ferramentas não precisam necessariamente ser funções do cliente — você pode usar ferramentas sempre que quiser que o modelo retorne uma saída JSON que siga um esquema fornecido. Por exemplo, você pode usar uma ferramenta record_summary com um esquema particular. Veja Uso de ferramentas com Claude para um exemplo completo funcionando.
Respostas do modelo com ferramentas
Ao usar ferramentas, Claude frequentemente comentará sobre o que está fazendo ou responderá naturalmente ao usuário antes de invocar ferramentas.
Por exemplo, dada a solicitação "What's the weather like in San Francisco right now, and what time is it there?", Claude pode responder com:
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "I'll help you check the current weather and time in San Francisco."
},
{
"type": "tool_use",
"id": "toolu_01A09q90qw90lq917835lq9",
"name": "get_weather",
"input": {"location": "San Francisco, CA"}
}
]
}Este estilo de resposta natural ajuda os usuários a entender o que Claude está fazendo e cria uma interação mais conversacional. Você pode guiar o estilo e conteúdo dessas respostas através de seus prompts do sistema e fornecendo <examples> em seus prompts.
É importante notar que Claude pode usar várias frases e abordagens ao explicar suas ações. Seu código deve tratar essas respostas como qualquer outro texto gerado pelo assistente, e não confiar em convenções de formatação específicas.
Uso paralelo de ferramentas
Por padrão, Claude pode usar múltiplas ferramentas para responder a uma consulta do usuário. Você pode desabilitar esse comportamento por:
- Configurar
disable_parallel_tool_use=truequando o tipo de tool_choice éauto, o que garante que Claude use no máximo uma ferramenta - Configurar
disable_parallel_tool_use=truequando o tipo de tool_choice éanyoutool, o que garante que Claude use exatamente uma ferramenta
Maximizando o uso paralelo de ferramentas
Embora os modelos Claude 4 tenham excelentes capacidades de uso paralelo de ferramentas por padrão, você pode aumentar a probabilidade de execução paralela de ferramentas em todos os modelos com prompting direcionado:
Uso paralelo de ferramentas com Claude Sonnet 3.7
Claude Sonnet 3.7 pode ser menos provável de fazer chamadas paralelas de ferramentas em uma resposta, mesmo quando você não tiver configurado disable_parallel_tool_use. Para contornar isso, recomendamos ativar uso eficiente de ferramentas em termos de tokens, que ajuda a incentivar Claude a usar ferramentas paralelas. Este recurso beta também reduz a latência e economiza uma média de 14% em tokens de saída.
Se você preferir não optar pelo beta de uso eficiente de ferramentas em termos de tokens, você também pode introduzir uma "ferramenta em lote" que pode atuar como uma meta-ferramenta para envolver invocações para outras ferramentas simultaneamente. Descobrimos que se esta ferramenta estiver presente, o modelo a usará para chamar simultaneamente múltiplas ferramentas em paralelo para você.
Veja este exemplo em nosso cookbook para como usar esta solução alternativa.
Tratando blocos de conteúdo de uso de ferramentas e resultado de ferramentas
Mais simples com executor de ferramentas: O tratamento manual de ferramentas descrito nesta seção é gerenciado automaticamente por executor de ferramentas. Use esta seção quando precisar de controle personalizado sobre a execução de ferramentas.
A resposta de Claude difere dependendo se ela usa uma ferramenta de cliente ou servidor.
Tratando resultados de ferramentas de cliente
A resposta terá um stop_reason de tool_use e um ou mais blocos de conteúdo tool_use que incluem:
id: Um identificador único para este bloco de uso de ferramenta particular. Isso será usado para corresponder aos resultados da ferramenta mais tarde.name: O nome da ferramenta sendo usada.input: Um objeto contendo a entrada sendo passada para a ferramenta, em conformidade com oinput_schemada ferramenta.
Quando você recebe uma resposta de uso de ferramenta para uma ferramenta de cliente, você deve:
- Extrair o
name,ideinputdo blocotool_use. - Executar a ferramenta real em sua base de código correspondente a esse nome de ferramenta, passando a
inputda ferramenta. - Continuar a conversa enviando uma nova mensagem com o
roledeusere um blococontentcontendo o tipotool_resulte as seguintes informações:tool_use_id: Oidda solicitação de uso de ferramenta para a qual este é um resultado.content: O resultado da ferramenta, como uma string (por exemplo,"content": "15 degrees"), uma lista de blocos de conteúdo aninhados (por exemplo,"content": [{"type": "text", "text": "15 degrees"}]), ou uma lista de blocos de documento (por exemplo,"content": ["type": "document", "source": {"type": "text", "media_type": "text/plain", "data": "15 degrees"}]). Estes blocos de conteúdo podem usar os tipostext,imageoudocument.is_error(opcional): Defina comotruese a execução da ferramenta resultou em um erro.
Requisitos importantes de formatação:
- Blocos de resultado de ferramenta devem seguir imediatamente seus blocos de uso de ferramenta correspondentes no histórico de mensagens. Você não pode incluir nenhuma mensagem entre a mensagem de uso de ferramenta do assistente e a mensagem de resultado de ferramenta do usuário.
- Na mensagem do usuário contendo resultados de ferramentas, os blocos tool_result devem vir PRIMEIRO no array de conteúdo. Qualquer texto deve vir DEPOIS de todos os resultados de ferramentas.
Por exemplo, isto causará um erro 400:
{"role": "user", "content": [
{"type": "text", "text": "Here are the results:"}, // ❌ Text before tool_result
{"type": "tool_result", "tool_use_id": "toolu_01", ...}
]}Isto está correto:
{"role": "user", "content": [
{"type": "tool_result", "tool_use_id": "toolu_01", ...},
{"type": "text", "text": "What should I do next?"} // ✅ Text after tool_result
]}Se você receber um erro como "tool_use ids were found without tool_result blocks immediately after", verifique se seus resultados de ferramentas estão formatados corretamente.
Após receber o resultado da ferramenta, Claude usará essa informação para continuar gerando uma resposta ao prompt original do usuário.
Tratando resultados de ferramentas de servidor
Claude executa a ferramenta internamente e incorpora os resultados diretamente em sua resposta sem exigir interação adicional do usuário.
Diferenças de outras APIs
Ao contrário de APIs que separam o uso de ferramentas ou usam funções especiais como tool ou function, a API Claude integra ferramentas diretamente na estrutura de mensagem user e assistant.
As mensagens contêm arrays de blocos text, image, tool_use e tool_result. Mensagens user incluem conteúdo do cliente e tool_result, enquanto mensagens assistant contêm conteúdo gerado por IA e tool_use.
Tratando o motivo de parada max_tokens
max_tokensSe a resposta de Claude for cortada devido ao limite max_tokens, e a resposta truncada contiver um bloco de uso de ferramenta incompleto, você precisará repetir a solicitação com um valor max_tokens mais alto para obter o uso de ferramenta completo.
# Check if response was truncated during tool use
if response.stop_reason == "max_tokens":
# Check if the last content block is an incomplete tool_use
last_block = response.content[-1]
if last_block.type == "tool_use":
# Send the request with higher max_tokens
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=4096, # Increased limit
messages=messages,
tools=tools
)Tratando o motivo de parada pause_turn
Ao usar ferramentas de servidor como busca na web, a API pode retornar um motivo de parada pause_turn, indicando que a API pausou um turno de longa duração.
Aqui está como tratar o motivo de parada pause_turn:
import anthropic
client = anthropic.Anthropic()
# Initial request with web search
response = client.messages.create(
model="claude-3-7-sonnet-latest",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Search for comprehensive information about quantum computing breakthroughs in 2025"
}
],
tools=[{
"type": "web_search_20250305",
"name": "web_search",
"max_uses": 10
}]
)
# Check if the response has pause_turn stop reason
if response.stop_reason == "pause_turn":
# Continue the conversation with the paused content
messages = [
{"role": "user", "content": "Search for comprehensive information about quantum computing breakthroughs in 2025"},
{"role": "assistant", "content": response.content}
]
# Send the continuation request
continuation = client.messages.create(
model="claude-3-7-sonnet-latest",
max_tokens=1024,
messages=messages,
tools=[{
"type": "web_search_20250305",
"name": "web_search",
"max_uses": 10
}]
)
print(continuation)
else:
print(response)Ao tratar pause_turn:
- Continue a conversa: Passe a resposta pausada como está em uma solicitação subsequente para deixar Claude continuar seu turno
- Modifique se necessário: Você pode opcionalmente modificar o conteúdo antes de continuar se quiser interromper ou redirecionar a conversa
- Preserve o estado da ferramenta: Inclua as mesmas ferramentas na solicitação de continuação para manter a funcionalidade
Resolvendo problemas de erros
Tratamento de erros integrado: Executor de ferramentas fornece tratamento automático de erros para a maioria dos cenários comuns. Esta seção cobre tratamento manual de erros para casos de uso avançados.
Existem alguns tipos diferentes de erros que podem ocorrer ao usar ferramentas com Claude: