Was this page helpful?
A chamada de ferramentas programática permite que 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 através do 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 permitindo que Claude filtre ou processe dados antes que atinjam a janela de contexto do modelo.
Este recurso requer que a ferramenta de execução de código esteja habilitada.
This feature is not covered by Zero Data Retention (ZDR) arrangements. Data is retained according to the feature's standard retention policy.
A chamada de ferramentas programática está disponível nos seguintes modelos:
| Modelo | Versão da Ferramenta |
|---|---|
Claude Opus 4.6 (claude-opus-4-6) | code_execution_20250825 |
Claude Sonnet 4.6 (claude-sonnet-4-6) | code_execution_20250825 |
Claude Sonnet 4.5 (claude-sonnet-4-5-20250929) | code_execution_20250825 |
Claude Opus 4.5 (claude-opus-4-5-20251101) | code_execution_20250825 |
A chamada de ferramentas programática está disponível via Claude API e Microsoft Foundry.
Aqui está um exemplo simples onde 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 Claude decide usar essa ferramenta:
tool_useEsta abordagem é particularmente útil para:
As ferramentas personalizadas são convertidas em funções Python assíncronas para suportar chamadas de ferramentas paralelas. Quando Claude escreve código que chama suas ferramentas, ele usa await (por exemplo, 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 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_20250825"]
}Valores possíveis:
["direct"] - Apenas Claude pode chamar esta ferramenta diretamente (padrão se omitido)["code_execution_20250825"] - Apenas chamável de dentro da execução de código["direct", "code_execution_20250825"] - Chamável tanto diretamente quanto a partir da execução de códigoRecomendamos escolher ["direct"] ou ["code_execution_20250825"] para cada ferramenta em vez de habilitar ambos, pois isso fornece orientação mais clara a Claude sobre como melhor usar a ferramenta.
caller em respostasCada bloco de uso de ferramenta inclui um campo caller indicando como foi invocado:
Invocação direta (uso de ferramenta tradicional):
{
"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_20250825",
"tool_id": "srvtoolu_abc123"
}
}O tool_id referencia a ferramenta de execução de código que fez a chamada programática.
A chamada de ferramentas programática usa os mesmos contêineres que a execução de código:
containerQuando uma ferramenta é chamada programaticamente e o contêiner está aguardando seu resultado de ferramenta, você deve responder antes que o contêiner expire. Monitore o campo expires_at. Se o contêiner expirar, Claude pode tratar a chamada de ferramenta como expirada e tentar novamente.
Aqui está como funciona um fluxo completo de chamada de ferramentas programática:
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 à sua definição de ferramenta.
Forneça descrições detalhadas do formato de saída de sua ferramenta na descrição da ferramenta. Se você especificar que a ferramenta retorna JSON, Claude tentará desserializar e processar o resultado em código. Quanto mais detalhes você fornecer sobre o esquema de saída, melhor Claude poderá lidar com a resposta programaticamente.
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_20250825",
"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 seu resultado de ferramenta:
A execução de código continua e processa os resultados. Se chamadas de ferramenta adicionais forem necessárias, repita a Etapa 3 até que todas as chamadas de ferramenta sejam satisfeitas.
Uma vez que a execução de código é 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 eficientemente:
# async wrapper omitted for clarity
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 de processar assim que os critérios de sucesso forem atendidos:
# async wrapper omitted for clarity
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 wrapper omitted for clarity
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 wrapper omitted for clarity
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 de código chama uma ferramenta:
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": {"sql": "<sql>"},
"caller": {
"type": "code_execution_20250825",
"tool_id": "srvtoolu_xyz789"
}
}Seu resultado de 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 ferramenta 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 de 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 | Adicione os cabeçalhos beta necessários à sua requisição |
Se sua ferramenta demorar muito para responder, a execução de código receberá um TimeoutError. Claude vê isso em stderr e normalmente tentará 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 em respostasSe sua ferramenta retornar um erro:
# Provide error information in the tool result
{
"type": "tool_result",
"tool_use_id": "toolu_abc123",
"content": "Error: Query timeout - table lock exceeded 30 seconds",
}O código de Claude receberá este erro e pode lidar com ele apropriadamente.
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 não podem ser chamadas programaticamente no momento, mas o suporte pode ser adicionado em versões futuras:
Ao responder a chamadas de ferramenta programática, há requisitos de formatação rigorosos:
Respostas apenas de resultado de ferramenta: Se houver chamadas de ferramenta programática 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 da ferramenta.
// ❌ INVÁLIDO - Não pode incluir texto ao responder a chamadas de ferramenta programática
{
"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?"} // This will cause an error
]
}
// ✅ VÁLIDO - Apenas resultados de ferramenta ao responder a chamadas de ferramenta programática
{
"role": "user",
"content": [
{"type": "tool_result", "tool_use_id": "toolu_01", "content": "[{\"customer_id\": \"C1\", \"revenue\": 45000}]"}
]
}Esta restrição se aplica apenas ao responder a chamadas de ferramenta programática (execução de código). Para chamadas de ferramenta regulares do lado do cliente, você pode incluir conteúdo de texto após resultados de ferramenta.
As chamadas de ferramentas programáticas estão sujeitas aos mesmos limites de taxa que as chamadas de ferramenta regulares. Cada chamada de ferramenta a partir da execução de código conta como uma invocação separada.
Ao implementar ferramentas personalizadas que serão chamadas programaticamente:
A chamada de ferramentas programática pode reduzir significativamente o consumo de tokens:
Por exemplo, chamar 10 ferramentas diretamente usa ~10x os tokens de chamá-las programaticamente e retornar um resumo.
A chamada de ferramentas programática usa o mesmo preço que a execução de código. Veja o preço de execução de código para detalhes.
Contagem de tokens para chamadas de ferramentas programáticas: Resultados de ferramenta de invocações programáticas não contam para seu uso de tokens de entrada/saída. Apenas o resultado final de execução de código e a resposta de Claude contam.
Bons casos de uso:
Casos de uso menos ideais:
Erro "Tool not allowed"
"allowed_callers": ["code_execution_20250825"]Expiração de contêiner
expires_at em respostasResultado de ferramenta não analisado corretamente
caller para confirmar invocação programáticaO treinamento de Claude inclui exposição extensiva a código, tornando-o eficaz no raciocínio através e encadeamento de chamadas de função. Quando 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:
Esta abordagem permite fluxos de trabalho que seriam impraticáveis com uso de ferramenta tradicional—como processar arquivos com mais de 1M tokens—permitindo que Claude trabalhe com dados programaticamente em vez de carregar tudo no contexto de conversa.
A chamada de ferramentas programática é 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 a executa localmente onde essas funções são definidas.
Vantagens:
Desvantagens:
Use quando: Sua aplicação pode executar com segurança código arbitrário, você quer uma solução simples, e a oferta gerenciada da Anthropic não se encaixa em 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 exigem recursos externos, você precisará de um protocolo para executar chamadas de ferramenta fora do sandbox.
Vantagens:
Desvantagens:
Use quando: Segurança é crítica e a solução gerenciada da Anthropic não se encaixa em seus requisitos.
A chamada de ferramentas programática da Anthropic é uma versão gerenciada de execução em sandbox com um ambiente Python opinativo ajustado para Claude. Anthropic lida com gerenciamento de contêiner, execução de código e comunicação segura de invocação de ferramenta.
Vantagens:
Recomendamos usar a solução gerenciada da Anthropic se você estiver usando a Claude API.
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_20250825",
"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_20250825"]
}
]
}'response = client.messages.create(
model="claude-opus-4-6",
max_tokens=4096,
messages=[
{
"role": "user",
"content": "Query customer purchase history from the last quarter and identify our top 5 customers by revenue",
}
],
tools=[
{"type": "code_execution_20250825", "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": {...},
"allowed_callers": ["code_execution_20250825"],
},
],
)response = client.messages.create(
model="claude-opus-4-6",
max_tokens=4096,
container="container_xyz789", # Reuse the container
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_20250825",
"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=[...],
)Entenda os fundamentos do uso de ferramenta com Claude.