Was this page helpful?
A chamada programática de ferramentas permite que o Claude escreva código que chama suas ferramentas programaticamente dentro de um contêiner de execução de código, em vez de exigir viagens de ida e volta pelo modelo para cada invocação de ferramenta. Isso reduz a latência para fluxos de trabalho com múltiplas ferramentas e diminui o consumo de tokens ao permitir que o Claude filtre ou processe dados antes que eles cheguem à janela de contexto do modelo. Em benchmarks de busca agêntica como BrowseComp e DeepSearchQA, que testam pesquisa web em múltiplas etapas e recuperação complexa de informações, adicionar chamada programática de ferramentas sobre ferramentas de busca básicas foi o fator chave que desbloqueou completamente o desempenho do agente.
A diferença se multiplica rapidamente em fluxos de trabalho reais. Considere verificar a conformidade de orçamento em 20 funcionários: a abordagem tradicional requer 20 viagens de ida e volta separadas pelo modelo, puxando milhares de itens de despesas para o contexto ao longo do caminho. Com a chamada programática de ferramentas, um único script executa todas as 20 consultas, filtra os resultados e retorna apenas os funcionários que excederam seus limites, reduzindo o que o Claude precisa raciocinar de centenas de kilobytes para apenas algumas linhas.
Para uma análise mais aprofundada dos custos de inferência e contexto que a chamada programática de ferramentas aborda, consulte Advanced tool use.
Este recurso requer que a ferramenta de execução de código esteja habilitada.
This feature is not eligible for Zero Data Retention (ZDR). Data is retained according to the feature's standard retention policy.
Para detalhes de compatibilidade de modelos e versões de ferramentas, consulte a Referência de ferramentas. A chamada programática de ferramentas está disponível via API Claude e Microsoft Foundry.
Aqui está um exemplo simples onde o Claude consulta programaticamente um banco de dados várias vezes e agrega resultados:
Quando você configura uma ferramenta para ser chamável a partir da execução de código e o Claude decide usar essa ferramenta:
tool_useEssa abordagem é particularmente útil para:
Ferramentas personalizadas são convertidas em funções Python assíncronas para suportar chamadas paralelas de ferramentas. Quando o Claude escreve código que chama suas ferramentas, ele usa await (ex.: result = await query_database("<sql>")) e inclui automaticamente a função wrapper assíncrona apropriada.
O wrapper assíncrono é omitido dos exemplos de código nesta documentação para maior clareza.
allowed_callersO campo allowed_callers especifica quais contextos podem invocar uma ferramenta:
{
"name": "query_database",
"description": "Execute a SQL query against the database",
"input_schema": {
// ...
},
"allowed_callers": ["code_execution_20260120"]
}Valores possíveis:
["direct"] - Somente o Claude pode chamar esta ferramenta diretamente (padrão se omitido)["code_execution_20260120"] - Somente chamável de dentro da execução de código["direct", "code_execution_20260120"] - Chamável tanto diretamente quanto a partir da execução de códigoEscolha ["direct"] ou ["code_execution_20260120"] para cada ferramenta em vez de habilitar ambos, pois isso fornece orientação mais clara ao Claude sobre como usar melhor a ferramenta.
caller nas respostasCada bloco de uso de ferramenta inclui um campo caller indicando como foi invocado:
Invocação direta (uso tradicional de ferramentas):
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": { "type": "direct" }
}Invocação programática:
{
"type": "tool_use",
"id": "toolu_xyz789",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": {
"type": "code_execution_20260120",
"tool_id": "srvtoolu_abc123"
}
}O tool_id referencia a ferramenta de execução de código que fez a chamada programática.
A chamada programática de ferramentas usa os mesmos contêineres que a execução de código:
containerQuando uma ferramenta é chamada programaticamente e o contêiner está aguardando o resultado da sua ferramenta, você deve responder antes que o contêiner expire. Monitore o campo expires_at. Se o contêiner expirar, o Claude pode tratar a chamada da ferramenta como expirada por tempo limite e tentar novamente.
Veja como funciona um fluxo completo de chamada programática de ferramentas:
Envie uma requisição com execução de código e uma ferramenta que permite chamada programática. Para habilitar a chamada programática, adicione o campo allowed_callers à definição da sua ferramenta.
Forneça descrições detalhadas do formato de saída da sua ferramenta na descrição da ferramenta. Se você especificar que a ferramenta retorna JSON, o Claude tentará desserializar e processar o resultado no código. Quanto mais detalhes você fornecer sobre o esquema de saída, melhor o Claude poderá lidar com a resposta programaticamente.
A forma da requisição é idêntica ao exemplo de Início rápido: inclua code_execution na sua lista de ferramentas, adicione allowed_callers: ["code_execution_20260120"] a qualquer ferramenta que você queira que o Claude invoque a partir do código, e envie sua mensagem de usuário.
O Claude escreve código que chama sua ferramenta. A API pausa e retorna:
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "I'll query the purchase history and analyze the results."
},
{
"type": "server_tool_use",
"id": "srvtoolu_abc123",
"name": "code_execution",
"input": {
"code": "results = await query_database('<sql>')\ntop_customers = sorted(results, key=lambda x: x['revenue'], reverse=True)[:5]\nprint(f'Top 5 customers: {top_customers}')"
}
},
{
"type": "tool_use",
"id": "toolu_def456",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": {
"type": "code_execution_20260120",
"tool_id": "srvtoolu_abc123"
}
}
],
"container": {
"id": "container_xyz789",
"expires_at": "2025-01-15T14:30:00Z"
},
"stop_reason": "tool_use"
}Inclua o histórico completo da conversa mais o resultado da sua ferramenta:
A execução do código continua e processa os resultados. Se chamadas de ferramentas adicionais forem necessárias, repita a Etapa 3 até que todas as chamadas de ferramentas sejam satisfeitas.
Assim que a execução do código for concluída, Claude fornece a resposta final:
{
"content": [
{
"type": "code_execution_tool_result",
"tool_use_id": "srvtoolu_abc123",
"content": {
"type": "code_execution_result",
"stdout": "Top 5 customers by revenue:\n1. Customer C1: $45,000\n2. Customer C2: $38,000\n3. Customer C5: $32,000\n4. Customer C8: $28,500\n5. Customer C3: $24,000",
"stderr": "",
"return_code": 0,
"content": []
}
},
{
"type": "text",
"text": "I've analyzed the purchase history from last quarter. Your top 5 customers generated $167,500 in total revenue, with Customer C1 leading at $45,000."
}
],
"stop_reason": "end_turn"
}Claude pode escrever código que processa múltiplos itens de forma eficiente:
async def _claude_code():
regions = ["West", "East", "Central", "North", "South"]
results = {}
for region in regions:
data = await query_database(f"<sql for {region}>")
results[region] = sum(row["revenue"] for row in data)
# Process results programmatically
top_region = max(results.items(), key=lambda x: x[1])
print(f"Top region: {top_region[0]} with ${top_region[1]:,} in revenue")
Este padrão:
Claude pode parar o processamento assim que os critérios de sucesso forem atendidos:
async def _claude_code():
endpoints = ["us-east", "eu-west", "apac"]
for endpoint in endpoints:
status = await check_health(endpoint)
if status == "healthy":
print(f"Found healthy endpoint: {endpoint}")
break # Stop early, don't check remaining
async def _claude_code():
file_info = await get_file_info(path)
if file_info["size"] < 10000:
content = await read_full_file(path)
else:
content = await read_file_summary(path)
print(content)
async def _claude_code():
logs = await fetch_logs(server_id)
errors = [log for log in logs if "ERROR" in log]
print(f"Found {len(errors)} errors")
for error in errors[-10:]: # Only return last 10 errors
print(error)
Quando a execução do código chama uma ferramenta:
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": {
"type": "code_execution_20260120",
"tool_id": "srvtoolu_xyz789"
}
}O resultado da sua ferramenta é passado de volta para o código em execução:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_abc123",
"content": "[{\"customer_id\": \"C1\", \"revenue\": 45000, \"orders\": 23}, {\"customer_id\": \"C2\", \"revenue\": 38000, \"orders\": 18}, ...]"
}
]
}Quando todas as chamadas de ferramentas são satisfeitas e o código é concluído:
{
"type": "code_execution_tool_result",
"tool_use_id": "srvtoolu_xyz789",
"content": {
"type": "code_execution_result",
"stdout": "Analysis complete. Top 5 customers identified from 847 total records.",
"stderr": "",
"return_code": 0,
"content": []
}
}| Erro | Descrição | Solução |
|---|---|---|
invalid_tool_input | A entrada da ferramenta não corresponde ao esquema | Valide o input_schema da sua ferramenta |
tool_not_allowed | A ferramenta não permite o tipo de chamador solicitado | Verifique se allowed_callers inclui os contextos corretos |
missing_beta_header | Cabeçalho beta necessário não fornecido (somente Bedrock e Vertex AI; chamada programática de ferramentas está em GA na API Claude de primeira parte) | Adicione os cabeçalhos beta necessários à sua solicitação |
Se sua ferramenta demorar muito para responder, a execução do código recebe um TimeoutError. Claude vê isso no stderr e normalmente tenta novamente:
{
"type": "code_execution_tool_result",
"tool_use_id": "srvtoolu_abc123",
"content": {
"type": "code_execution_result",
"stdout": "",
"stderr": "TimeoutError: Calling tool ['query_database'] timed out.",
"return_code": 0,
"content": []
}
}Para evitar timeouts:
expires_at nas respostasSe sua ferramenta retornar um erro:
{
"type": "tool_result",
"tool_use_id": "toolu_abc123",
"content": "Error: Query timeout - table lock exceeded 30 seconds"
}O código de Claude recebe esse erro e pode tratá-lo adequadamente.
strict: true não são suportadas com chamada programáticatool_choicedisable_parallel_tool_use: true não é suportado com chamada programáticaAs seguintes ferramentas atualmente não podem ser chamadas programaticamente, mas o suporte pode ser adicionado em versões futuras:
Ao responder a chamadas de ferramentas programáticas, há requisitos estritos de formatação:
Respostas somente com resultado de ferramenta: Se houver chamadas de ferramentas programáticas pendentes aguardando resultados, sua mensagem de resposta deve conter apenas blocos tool_result. Você não pode incluir nenhum conteúdo de texto, mesmo após os resultados das ferramentas.
Inválido - Não é possível incluir texto ao responder a chamadas de ferramentas programáticas:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01",
"content": "[{\"customer_id\": \"C1\", \"revenue\": 45000}]"
},
{ "type": "text", "text": "What should I do next?" }
]
}Válido - Apenas resultados de ferramentas ao responder a chamadas de ferramentas programáticas:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01",
"content": "[{\"customer_id\": \"C1\", \"revenue\": 45000}]"
}
]
}Essa restrição se aplica apenas ao responder a chamadas de ferramentas programáticas (de execução de código). Para chamadas de ferramentas regulares do lado do cliente, você pode incluir conteúdo de texto após os resultados das ferramentas.
As chamadas de ferramentas programáticas estão sujeitas aos mesmos limites de taxa que as chamadas de ferramentas regulares. Cada chamada de ferramenta da execução de código conta como uma invocação separada.
Ao implementar ferramentas definidas pelo usuário que serão chamadas programaticamente:
A chamada programática de ferramentas pode reduzir significativamente o consumo de tokens:
Por exemplo, chamar 10 ferramentas diretamente usa aproximadamente 10x os tokens de chamá-las programaticamente e retornar um resumo.
A chamada programática de ferramentas usa os mesmos preços que a execução de código. Consulte os preços de execução de código para detalhes.
Contagem de tokens para chamadas de ferramentas programáticas: Os resultados de ferramentas de invocações programáticas não contam para o uso de tokens de entrada/saída. Apenas o resultado final da execução do código e a resposta de Claude são contabilizados.
Bons casos de uso:
Casos de uso menos ideais:
Erro "Tool not allowed"
"allowed_callers": ["code_execution_20260120"]Expiração do contêiner
expires_at nas respostasResultado da ferramenta não analisado corretamente
caller para confirmar a invocação programáticaO treinamento de Claude inclui ampla exposição a código, tornando-o eficaz no raciocínio e encadeamento de chamadas de funções. Quando as ferramentas são apresentadas como funções chamáveis dentro de um ambiente de execução de código, Claude pode aproveitar essa força para:
Essa abordagem permite fluxos de trabalho que seriam impraticáveis com o uso tradicional de ferramentas (como processar arquivos com mais de 1 milhão de tokens), permitindo que Claude trabalhe com dados programaticamente em vez de carregar tudo no contexto da conversa.
A chamada programática de ferramentas é um padrão generalizável que pode ser implementado fora da execução de código gerenciada da Anthropic. Aqui está uma visão geral das abordagens:
Forneça a Claude uma ferramenta de execução de código e descreva quais funções estão disponíveis nesse ambiente. Quando Claude invoca a ferramenta com código, sua aplicação o executa localmente onde essas funções estão definidas.
Vantagens:
Desvantagens:
Use quando: Sua aplicação pode executar código arbitrário com segurança, você quer uma solução simples e a oferta gerenciada da Anthropic não atende às suas necessidades.
Mesma abordagem da perspectiva de Claude, mas o código é executado em um contêiner em sandbox com restrições de segurança (por exemplo, sem saída de rede). Se suas ferramentas precisarem de recursos externos, você precisará de um protocolo para executar chamadas de ferramentas fora do sandbox.
Vantagens:
Desvantagens:
Use quando: A segurança é crítica e a solução gerenciada da Anthropic não atende aos seus requisitos.
A chamada programática de ferramentas da Anthropic é uma versão gerenciada da execução em sandbox com um ambiente Python opinativo ajustado para Claude. A Anthropic lida com o gerenciamento de contêineres, execução de código e comunicação segura de invocação de ferramentas.
Vantagens:
Considere usar a solução gerenciada da Anthropic se você estiver usando a API Claude.
A chamada programática de ferramentas é construída sobre a infraestrutura de execução de código e usa os mesmos contêineres sandbox. Os dados do contêiner, incluindo artefatos e saídas de execução, são retidos por até 30 dias.
Para elegibilidade de ZDR em todos os recursos, consulte API e retenção de dados.
curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "content-type: application/json" \
--data '{
"model": "claude-opus-4-6",
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": "Query sales data for the West, East, and Central regions, then tell me which region had the highest revenue"
}
],
"tools": [
{
"type": "code_execution_20260120",
"name": "code_execution"
},
{
"name": "query_database",
"description": "Execute a SQL query against the sales database. Returns a list of rows as JSON objects.",
"input_schema": {
"type": "object",
"properties": {
"sql": {
"type": "string",
"description": "SQL query to execute"
}
},
"required": ["sql"]
},
"allowed_callers": ["code_execution_20260120"]
}
]
}'ant messages create <<'YAML'
model: claude-opus-4-6
max_tokens: 4096
container: container_xyz789
messages:
- role: user
content: >-
Query customer purchase history from the last quarter and identify our
top 5 customers by revenue
- role: assistant
content:
- type: text
text: I'll query the purchase history and analyze the results.
- type: server_tool_use
id: srvtoolu_abc123
name: code_execution
input:
code: "..."
- type: tool_use
id: toolu_def456
name: query_database
input:
sql: "<sql>"
caller:
type: code_execution_20260120
tool_id: srvtoolu_abc123
- role: user
content:
- type: tool_result
tool_use_id: toolu_def456
content: >-
[{"customer_id": "C1", "revenue": 45000}, {"customer_id": "C2",
"revenue": 38000}, ...]
tools: [...]
YAMLEntenda os fundamentos do uso de ferramentas com Claude.