Melhores Práticas de Uso de Ferramentas
Práticas numeradas para design de esquema, tratamento de erros e loops de ferramenta de múltiplos turnos - um resumo de toda a seção que você pode usar como um checklist antes de publicar uma integração de uso de ferramentas baseada no SDK oficial anthropic para Python.
Como Usar Esta Lista
- Leia de cima para baixo na primeira vez - o design de esquema e a escolha de ferramenta (
tool_choice) vêm primeiro porque afetam se Claude chama a ferramenta certa ou não, antes de você chegar à mecânica do loop. - Trate os itens 1-2 como trabalho em tempo de design (feito uma vez por ferramenta), os itens 3-6 como comportamento em tempo de requisição e tempo de loop (feito em cada chamada), e os itens 7-9 como preocupações de escalabilidade que você adota assim que o conjunto de ferramentas ou o tráfego cresce.
- Volte a esta página sempre que adicionar uma nova ferramenta ou vir Claude escolhendo a ferramenta errada, perdendo um
tool_result, ou em loop por mais tempo que o esperado. - Emparelhe isso com as páginas mais aprofundadas vinculadas em "Relacionados" - esta página é deliberadamente concisa; as páginas vinculadas carregam as explicações completas e exemplos práticos.
A - Design de Esquema
- Dê a cada ferramenta um nome claro e descritivo. Use
get_weather, nãowoutool1- Claude compara suadescriptioncom a intenção do usuário, e um nome vago lhe dá menos com o que trabalhar. - Escreva descrições que digam QUANDO chamar a ferramenta, não apenas o que ela faz. "Chame isso quando o usuário perguntar sobre preços atuais" supera uma descrição que apenas afirma a funcionalidade - modelos Claude recentes alcançam ferramentas de forma mais conservadora por padrão, então uma descrição prescritiva e com palavras-gatilho melhora medidamente a precisão do "deve chamar".
- Dê a cada propriedade
input_schemasua própriadescription. Claude lê as descrições por propriedade para decidir qual valor extrair e como formatá-lo - uma propriedade não documentada é uma propriedade sobre a qual Claude tem que adivinhar. - Use
enumpara parâmetros de escolha fixa. Se um parâmetro só pode ter um de um conjunto conhecido de valores (por exemplo,"unit": ["celsius", "fahrenheit"]), restrinja-o comenumem vez de deixá-lo como texto livre. - Marque apenas campos verdadeiramente obrigatórios em
required. Marcar campos em excesso como obrigatórios força Claude a fabricar um valor ou fazer uma pergunta de esclarecimento desnecessária quando o campo não se aplica. - Defina
"strict": truequando precisar de validação exata do esquema. Adicione-o no nível superior da definição da ferramenta junto comadditionalProperties: falseerequired- isso faz com quetool_use.inputvalide exatamente contra o esquema em vez de desviar em casos extremos.
B - Mantenha o Conjunto de Ferramentas Focado
- Não registre mais ferramentas do que a tarefa necessita. Muitas ferramentas, nomes vagos ou descrições sobrepostas podem fazer com que Claude escolha a ferramenta errada ou pule a chamada de uma delas - um grande conjunto de ferramentas indiferenciado é pior para a precisão do que um pequeno e bem descrito.
- Verifique sobreposição de descrições antes de adicionar uma nova ferramenta. Se duas ferramentas puderem plausivelmente satisfazer a mesma solicitação, restrinja a linguagem "chame isso quando" em cada uma delas até que sejam mutuamente distinguíveis.
C - tool_choice
- Use
{"type": "auto"}como padrão para agentes de propósito geral. Deixe Claude decidir se deve chamar uma ferramenta e qual delas, com base na conversa. - Use
{"type": "any"}quando o turno deve terminar com alguma ação, mas você não se importa com qual ferramenta. Isso garante uma chamada de ferramenta sem escolher em nome de Claude. - Use
{"type": "tool", "name": "..."}para forçar uma ferramenta específica. Use isso quando o fluxo de trabalho exigir uma chamada de função específica, independentemente do que Claude escolheria de outra forma. - Use
{"type": "none"}para suprimir temporariamente chamadas de ferramentas sem removertoolsda requisição. Remover definições de ferramentas inteiramente invalida o cache do prompt -nonemantém as definições no lugar e apenas impede que esse turno chame uma ferramenta. - Adicione
disable_parallel_tool_use: truea qualquer valor detool_choicequando seu código não puder lidar com mais de uma chamada de ferramenta por turno. Funciona em conjunto comauto,any,toolounonee limita Claude a uma única chamada de ferramenta nessa resposta.
response = client.messages.create(
model="claude-sonnet-5",
max_tokens=1024,
tools=[weather_tool, calculate_tool],
tool_choice={"type": "auto", "disable_parallel_tool_use": True},
messages=[{"role": "user", "content": "Qual é o tempo em Austin, TX?"}],
)D - Tratamento de Erros em Blocos tool_result
- Retorne
is_error: trueem caso de falha da ferramenta em vez de descartar o resultado ou gerar uma exceção. Claude pode então tentar novamente a chamada, tentar uma ferramenta diferente ou pedir esclarecimentos ao usuário - umtool_resultausente ou uma exceção não tratada deixa a conversa em um estado quebrado.
def run_tool(tool_use):
try:
output = execute(tool_use.name, tool_use.input)
return {
"type": "tool_result",
"tool_use_id": tool_use.id,
"content": str(output),
}
except Exception as exc:
return {
"type": "tool_result",
"tool_use_id": tool_use.id,
"content": f"Erro: {exc}",
"is_error": True,
}E - Higiene de Loop de Múltiplos Turnos
- Anexe o
response.contentcompleto de volta emmessages, não apenas o texto extraído. A API precisa dos blocostool_usepreservados no turno do assistente - removê-los para conteúdo apenas de texto quebra a próxima requisição. - Proteja cada loop com um limite
max_iterations. Um loop de uso de ferramenta sem teto pode ficar descontrolado se Claude continuar chamando ferramentas sem produzir uma resposta final. - Lide com
stop_reason == "pause_turn"reenviando a conversa como está. Esta razão de parada significa que uma ferramenta do lado do servidor atingiu seu limite interno de iteração - não injete uma mensagem extra "Continuar"; a API retoma automaticamente porque detecta o blocoserver_tool_usefinal.
messages = [{"role": "user", "content": "Qual é o tempo em Austin, TX?"}]
for _ in range(max_iterations := 8):
response = client.messages.create(
model="claude-sonnet-5",
max_tokens=1024,
tools=[weather_tool],
messages=messages,
)
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason == "pause_turn":
continue # reenviar como está, sem mensagem "Continuar" injetada
if response.stop_reason != "tool_use":
break
tool_results = [run_tool(block) for block in response.content if block.type == "tool_use"]
messages.append({"role": "user", "content": tool_results})F - Chamadas Paralelas de Ferramentas
- Espere e lide com múltiplos blocos
tool_useem um turno. Claude pode solicitar várias ferramentas em paralelo por padrão - execute-as concorrentemente onde for prático, em vez de assumir exatamente uma chamada por turno. - Retorne TODOS os blocos
tool_resultjuntos em uma única mensagemuser. Nunca os divida em várias mensagens - fazer isso pode degradar o comportamento futuro de chamadas paralelas de Claude. - Corresponda a cada
tool_use_idque Claude enviou com umtool_result, incluindo chamadas falhas. Um blocotool_usesem umtool_resultcorrespondente (mesmo um comis_error: true) deixa o turno incompleto.
G - Escalando para Muitas Ferramentas
- Adote a Ferramenta de Busca de Ferramentas assim que uma biblioteca de ferramentas crescer para dezenas a centenas. Use
tool_search_tool_regex_20251119outool_search_tool_bm25_20251119comdefer_loading: trueem ferramentas raramente usadas para cortar o uso de tokens em aproximadamente 85%. - Mantenha a própria ferramenta de busca e pelo menos outra ferramenta não adiadas. Adiar todas as ferramentas, incluindo a ferramenta de busca, torna a requisição 400 - Claude precisa de pelo menos uma ferramenta carregada imediatamente para raciocinar.
- Prefira o conector MCP em vez de um wrapper do lado do cliente para capacidades remotas/hospedadas. Quando um servidor MCP adequado já existe, use
mcp_serversmais uma entradamcp_toolsetcorrespondente (betamcp-client-2025-11-20) em vez de reimplementar um cliente que chama a mesma API remota.
H - Cache de Prompt com Ferramentas
- Lembre-se de que as definições de ferramentas são renderizadas primeiro no prompt, antes do sistema e das mensagens. Adicionar, remover ou reordenar ferramentas invalida o tier de cache de ferramentas/sistema - alternar
tool_choicesozinho não o faz. - Mantenha a ordenação das ferramentas determinística se você construir a lista
toolsdinamicamente. Ordene por nome (ou outra chave estável) para que o mesmo conjunto de ferramentas sempre serialize na mesma ordem e não quebre o cache desnecessariamente.
I - Análise de JSON
- Sempre leia
tool_use.inputatravés do objeto analisado do SDK, nunca comparando a string bruta. Modelos Claude recentes podem escapar Unicode ou barras invertidas de forma diferente em JSON gerado, então a correspondência de strings com o payload bruto é frágil de maneiras que um objeto analisado não é.
FAQs
Qual prática nesta página é mais importante para a precisão do "deve chamar"?
O design do esquema, especificamente a escrita de descrições que indicam QUANDO chamar uma ferramenta em vez de apenas o que ela faz. Modelos Claude recentes são mais conservadores por padrão em relação a alcançar ferramentas, então uma descrição prescritiva e com palavras-gatilho tem um efeito desproporcional.
Preciso de `"strict": true` em todas as ferramentas?
Não. Use-o quando precisar que tool_use.input valide exatamente contra o esquema - por exemplo, alimentando a saída diretamente em uma função fortemente tipada. Para casos de uso mais flexíveis, é opcional.
Por que a lista coloca o design de esquema antes do tool_choice e da mecânica de loop?
O design de esquema é um trabalho em tempo de design que determina se Claude escolhe a ferramenta certa. O tool_choice e a higiene do loop são comportamentos em tempo de requisição que só importam quando a ferramenta certa já está em jogo.
Qual é o maior erro em loops de múltiplos turnos?
Anexar apenas o texto extraído de response.content de volta em messages em vez da lista completa de conteúdo. Isso descarta silenciosamente os blocos tool_use que a API precisa no próximo turno.
O que devo fazer quando stop_reason é "pause_turn"?
Reenvie a conversa como está. pause_turn significa que uma ferramenta do lado do servidor atingiu seu limite interno de iteração - a API detecta o bloco server_tool_use final e retoma automaticamente, então injetar uma mensagem extra "Continuar" é desnecessário.
Posso simplesmente descartar um tool_result se a chamada da ferramenta falhou?
Não. Retorne um tool_result com is_error: true e uma mensagem descrevendo a falha. Descartar o resultado ou gerar uma exceção deixa o turno incompleto e Claude não pode tentar novamente ou pedir esclarecimentos.
Preciso executar chamadas paralelas de ferramentas concorrentemente, ou posso executá-las uma de cada vez?
A concorrência é uma recomendação "onde for prático" para latência, não um requisito de correção. O que é um requisito de correção é retornar todos os blocos tool_result resultantes juntos em uma única mensagem user, quer você os tenha executado concorrentemente ou sequencialmente.
Quando devo usar a Ferramenta de Busca de Ferramentas em vez de apenas registrar todas as minhas ferramentas normalmente?
Assim que sua biblioteca de ferramentas atingir dezenas a centenas. Abaixo disso, a economia de tokens de defer_loading não vale a complexidade adicionada - apenas registre as ferramentas diretamente.
Por que adiar todas as ferramentas causa um erro 400?
A Ferramenta de Busca de Ferramentas e pelo menos outra ferramenta devem permanecer não adiadas para que Claude tenha algo com que raciocinar imediatamente. Adiar a própria ferramenta de busca junto com todo o resto deixa nada carregado para o modelo agir.
Devo construir meu próprio wrapper de cliente em torno de uma API remota se um servidor MCP para ela já existir?
Geralmente não. Prefira o conector MCP (mcp_servers mais uma entrada mcp_toolset correspondente) em vez de reimplementar um wrapper do lado do cliente em torno da mesma capacidade remota - isso evita duplicar a manutenção para algo que o servidor MCP já lida.
Alterar tool_choice entre requisições prejudica minha taxa de acertos do cache de prompt?
Não. As definições de ferramentas são o que são renderizadas primeiro no prompt e impulsionam o tier de cache de ferramentas/sistema - adicionar, remover ou reordenar ferramentas o invalidam. Alternar tool_choice sozinho não o faz.
Por que devo ordenar uma lista de ferramentas construída dinamicamente?
Porque as definições de ferramentas são renderizadas primeiro no prompt e qualquer alteração em sua ordem invalida o tier de cache de ferramentas/sistema. Ordenar por nome (ou outra chave estável) mantém a ordem serializada idêntica entre requisições que usam o mesmo conjunto de ferramentas, para que o cache sobreviva.
Por que não verificar tool_use.input com uma correspondência de string bruta em vez do objeto analisado do SDK?
Modelos Claude recentes podem escapar Unicode ou barras invertidas de forma diferente ao gerar JSON. Uma correspondência de string bruta pode perder um valor que é semanticamente idêntico, mas escapado de forma diferente, enquanto o objeto analisado do SDK lida com essa decodificação para você.
Relacionados
- Noções Básicas de Uso de Ferramentas - o ciclo completo de requisição/resposta que essas práticas assumem
- Definindo Esquemas de Ferramentas com nome, description e input_schema - o mergulho profundo por trás dos itens de design de esquema acima
- Referência de Opções de Escolha de Ferramenta - referência completa para os quatro modos de
tool_choice - Construindo um Loop de Uso de Ferramenta de Múltiplos Turnos - o exemplo prático por trás dos itens de higiene de loop acima
- Executando Chamadas Paralelas de Ferramentas em um Único Turno - a explicação completa do tratamento paralelo de
tool_use - Escalando para Centenas de Ferramentas com a Ferramenta de Busca de Ferramentas - o mergulho profundo por trás do item de escalabilidade acima
Versões de Stack: Escrito contra a linha de modelos Claude atual em ~junho de 2026 - Claude Fable 5, Claude Opus 4.8, Claude Sonnet 5 (o padrão), e Claude Haiku 4.5 - e o SDK oficial
anthropicpara Python (última versão 0.x). Nomes de modelos, versões de SDK e preços mudam rapidamente - verifique os detalhes atuais em platform.claude.com/docs antes de confiar neles.