A chamada programática de ferramentas permite que Claude escreva código que chama suas ferramentas programaticamente dentro de um container de code execution (execução de código), em vez de exigir idas e voltas ao modelo para cada invocação de ferramenta. Isso reduz a latência em fluxos de trabalho com múltiplas ferramentas e diminui o consumo de tokens ao permitir que 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 básicas de busca melhorou o desempenho em média 11% enquanto usava 24% menos tokens de entrada (consulte Improved web search with dynamic filtering).
Considere verificar a conformidade orçamentária de 20 funcionários: a abordagem tradicional requer 20 idas e voltas separadas ao modelo, trazendo milhares de itens de linha 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 Claude precisa analisar 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.
Este recurso não é elegível para Zero Data Retention (ZDR). Os dados são retidos de acordo com a política de retenção padrão do recurso.
A chamada programática de ferramentas requer code_execution_20260120 ou posterior, que é compatível com os seguintes modelos:
| Modelo |
|---|
| Claude Fable 5 (claude-fable-5) |
| Claude Mythos 5 (claude-mythos-5) |
| Claude Opus 4.8 (claude-opus-4-8) |
| Claude Opus 4.7 (claude-opus-4-7) |
| Claude Opus 4.6 (claude-opus-4-6) |
| Claude Sonnet 5 (claude-sonnet-5) |
| Claude Sonnet 4.6 (claude-sonnet-4-6) |
| Claude Opus 4.5 (claude-opus-4-5-20251101) |
| Claude Sonnet 4.5 (claude-sonnet-4-5-20250929) |
Para a matriz completa de versões da ferramenta de execução de código, consulte a tabela de compatibilidade de modelos da ferramenta de execução de código. A chamada programática de ferramentas está disponível na API do Claude, no Claude Platform on AWS e no Microsoft Foundry. No Microsoft Foundry, a chamada programática de ferramentas requer uma implantação Hosted on Anthropic. Atualmente, não está disponível no Amazon Bedrock ou no Google Cloud.
Aqui está um exemplo em que Claude consulta programaticamente um banco de dados várias vezes e agrega os resultados:
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-8",
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"],
},
],
)
print(response)A resposta para com stop_reason: "tool_use", um ID de container e um bloco tool_use para query_database cujo campo caller identifica a execução de código que o chamou. Retorne o resultado conforme mostrado na Etapa 3 do fluxo de trabalho de exemplo para que o código possa terminar.
Quando você configura uma ferramenta para ser chamável a partir da execução de código e Claude decide usar essa ferramenta:
tool_useEssa abordagem é particularmente útil para:
Ferramentas que permitem um caller de execução de código são expostas ao código do Claude como funções Python assíncronas, para que Claude possa executá-las em paralelo com asyncio.gather. Cada função recebe um único dict de argumentos e retorna uma string: o texto do tool_result que você envia de volta. O código do Claude aguarda essas funções com await de nível superior e analisa os resultados que precisa como dados estruturados, por exemplo rows = json.loads(await query_database({"sql": "<sql>"})).
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"] - Claude é orientado a chamar esta ferramenta diretamente (padrão se omitido)["code_execution_20260120"] - Claude é orientado a chamar esta ferramenta apenas de dentro da execução de código["direct", "code_execution_20260120"] - Claude pode chamar esta ferramenta diretamente ou de dentro da execução de códigoTanto "code_execution_20260120" quanto "code_execution_20260521" são aceitos em allowed_callers e são intercambiáveis: uma requisição usando qualquer uma das versões da ferramenta de execução de código satisfaz ferramentas que listam qualquer um dos callers. Os blocos de resposta sempre marcam o caller como code_execution_20260120, independentemente de qual versão a requisição declarou.
Escolha ["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.
allowed_callers controla como a ferramenta é apresentada ao Claude e é validado em relação a tool_choice, mas não é um bloqueio rígido no nível da API contra invocação direta. Claude é fortemente orientado a respeitá-lo, mas seu cliente ainda deve estar preparado para lidar com um tool_use direto para qualquer ferramenta que ele defina. Não confie em allowed_callers como uma fronteira de segurança.
caller nas respostasTodo bloco de uso de ferramentas inclui um campo caller indicando como foi invocado:
Invocação direta (uso de ferramentas 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_20260120",
"tool_id": "srvtoolu_abc123"
}
}O tool_id é o id do bloco server_tool_use de execução de código que fez a chamada, para que você possa associar cada tool_use programático à execução de código que o produziu.
A chamada programática de ferramentas usa os mesmos containers que a execução de código:
container, junto com um timestamp expires_atexpires_at informa quanto tempo resta ao container. Containers ociosos são atualmente recuperados após cerca de 5 minutos, e nenhum container pode ser reutilizado mais de 30 dias após sua criação.Enquanto o código do Claude está aguardando um resultado de ferramenta programática, a chamada pendente expira após cerca de 4 minutos e gera um TimeoutError dentro do código. Retorne cada resultado de ferramenta bem antes do timestamp expires_at na resposta pausada. Consulte Expiração do container durante chamada de ferramenta.
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, Claude tenta 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.
O formato da requisição é idêntico 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 Claude invoque a partir do código e envie sua mensagem de usuário. As etapas restantes deste fluxo de trabalho usam a mensagem de usuário "Query customer purchase history from the last quarter and identify our top 5 customers by revenue".
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": "import json\n\nrows = json.loads(await query_database({'sql': '<sql>'}))\ntop_customers = sorted(rows, 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": "2026-01-20T14:30:00Z"
},
"stop_reason": "tool_use"
}Envie o histórico completo da conversa mais o resultado da sua ferramenta. Três detalhes são importantes nesta requisição:
tool_result. Consulte Restrições de formatação de mensagens.container da resposta pausada. A API rejeita uma continuação que tenha chamadas programáticas de ferramenta pendentes mas nenhum ID de container.tools da requisição original. A ferramenta de execução de código ainda deve estar presente para que o código pausado seja retomado, e as ferramentas que você envia nesta requisição são as definições que Claude e o código em execução podem usar pelo restante do turno.response = client.messages.create(
model="claude-opus-4-8",
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_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}, ...]',
}
],
},
],
# Mesmo array de ferramentas da requisição original
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"],
},
],
)
print(response)O código retoma de onde pausou e processa seu resultado. Cada resposta de continuação pausa novamente com mais blocos tool_use programáticos, ou conclui a execução de código e permite que Claude continue o turno (Etapa 5). Verifique stop_reason e o caller de cada bloco tool_use para diferenciar os dois casos: uma resposta que pausa aguardando você tem stop_reason: "tool_use" e um bloco tool_use cujo caller nomeia uma versão de execução de código, e você repete a Etapa 3 com um tool_result para cada chamada programática pendente em uma única mensagem de usuário.
Assim 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: [{'customer_id': 'C1', 'revenue': 45000}, {'customer_id': 'C2', 'revenue': 38000}, {'customer_id': 'C5', 'revenue': 32000}, {'customer_id': 'C8', 'revenue': 28500}, {'customer_id': 'C3', 'revenue': 24000}]",
"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:
regions = ["West", "East", "Central", "North", "South"]
results = {}
for region in regions:
rows = json.loads(await query_database({"sql": f"<sql for {region}>"}))
results[region] = sum(row["revenue"] for row in rows)
# Processe os resultados programaticamente
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:
endpoints = ["us-east", "eu-west", "apac"]
for endpoint in endpoints:
status = await check_health({"endpoint": endpoint})
if status == "healthy":
print(f"Found healthy endpoint: {endpoint}")
break # Stop early, don't check remainingpath = "/tmp/example.txt"
file_info = json.loads(await get_file_info({"path": path}))
if file_info["size"] < 10000:
content = await read_full_file({"path": path})
else:
content = await read_file_summary({"path": path})
print(content)server_id = "srv-01"
log_text = await fetch_logs({"server_id": server_id})
errors = [line for line in log_text.splitlines() if "ERROR" in line]
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_20260120",
"tool_id": "srvtoolu_xyz789"
}
}O resultado da sua ferramenta é passado de volta ao 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 | Onde aparece | Descrição | Solução |
|---|---|---|---|
invalid_tool_input | error_code no bloco de erro code_execution_tool_result na resposta | Parâmetros inválidos foram passados para a ferramenta de execução de código | Consulte os erros da ferramenta de execução de código |
invalid_request_error (em tool_choice) | Resposta de erro HTTP 400 | tool_choice nomeia uma ferramenta cujo allowed_callers não inclui "direct" | Adicione "direct" ao allowed_callers dessa ferramenta, ou remova a ferramenta de tool_choice e deixe Claude invocá-la a partir do código |
Se o resultado da sua ferramenta não chegar em cerca de 4 minutos, a chamada pendente gera um TimeoutError dentro do código em execução do Claude. Claude vê o erro em stderr e normalmente tenta a chamada 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 (no response after 270s).",
"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 do Claude recebe esse erro e pode tratá-lo adequadamente.
strict: true não são compatíveis com chamada programáticatool_choicedisable_parallel_tool_use: true não é compatível com chamada programáticaFerramentas personalizadas cujo input_schema contém um $ref recursivo (um ciclo de referência, como um esquema que se refere a si mesmo) não podem ser habilitadas para chamada programática. Incluir uma versão da ferramenta de execução de código em allowed_callers para tal ferramenta faz com que a requisição falhe com um 400 invalid_request_error cuja mensagem contém Circular $ref detected. O mesmo esquema é aceito para chamada direta de ferramenta.
Para contornar isso, faça uma das seguintes opções:
allowed_callers (ou definindo-o como ["direct"]). Outras ferramentas na mesma requisição ainda podem usar chamada programática.description do nível mais interno, ou substitua a propriedade recursiva por um {"type": "object"} simples cuja description explique o formato esperado.As seguintes ferramentas não podem ser chamadas programaticamente:
Ao responder a chamadas programáticas de ferramentas, há requisitos rigorosos de formatação:
Respostas apenas com resultado de ferramenta: Se houver chamadas programáticas de ferramentas 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 de ferramenta.
Inválido - Não é possível incluir texto ao responder a chamadas programáticas de ferramentas:
{
"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 ferramenta ao responder a chamadas programáticas de ferramentas:
{
"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 ferramenta programáticas (execução de código). Para chamadas de ferramenta regulares do lado do cliente, você pode incluir conteúdo de texto após os resultados de ferramenta.
Conteúdo de resultado de ferramenta apenas em texto: O content de cada tool_result que responde a uma chamada programática deve ser uma string ou blocos text. Tipos de bloco de conteúdo de imagem, documento e outros são rejeitados.
Chamadas programáticas de ferramentas estão sujeitas aos mesmos limites de taxa que chamadas regulares de ferramentas. Cada chamada de ferramenta a partir 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 reduz o consumo de tokens de três maneiras:
Por exemplo, chamar 10 ferramentas diretamente usa ~10x os tokens de chamá-las programaticamente e retornar um resumo.
Nas avaliações internas da Anthropic em um modelo Claude de produção:
tools contém de 10 a 49 definições de ferramentas veem economias típicas de tokens de 20% a 40% com a chamada programática de ferramentas habilitada.As economias reais variam com o formato da carga de trabalho. Consulte Quando usar chamada programática.
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 programáticas de ferramentas: Resultados de ferramentas de invocações programáticas não contam para seu uso de tokens de entrada/saída. Apenas o resultado final da execução de código e a resposta do Claude contam.
A chamada programática de ferramentas troca uma pequena sobrecarga fixa (inicialização do container, geração de script) por grandes economias em tokens de resultado de ferramenta e idas e voltas ao modelo. Se essa troca compensa depende do formato da carga de trabalho.
Bom ajuste:
Ajuste fraco:
Se não tiver certeza, meça os tokens de entrada cobrados com e sem allowed_callers em uma amostra representativa do seu tráfego antes de habilitá-lo amplamente.
invalid_request_error ao definir tool_choice
tool_choice não pode nomear uma ferramenta cujo allowed_callers omite "direct". Adicione "direct" ao allowed_callers dessa ferramenta, ou remova a ferramenta de tool_choice e deixe Claude invocá-la a partir do código.Expiração do container
expires_at da resposta pausada. O código do Claude para de aguardar um resultado após cerca de 4 minutos, e containers ociosos são atualmente recuperados após cerca de 5 minutos.Resultado de ferramenta não analisado corretamente
caller para confirmar a invocação programáticaClaude é treinado em grandes quantidades de código, então apresentar ferramentas como funções Python chamáveis permite que ele use essa força:
A chamada programática de ferramentas é um padrão generalizável que também pode ser implementado em sua própria infraestrutura. Veja como as abordagens se comparam:
Forneça ao 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 a menor implementação possível e a oferta gerenciada da Anthropic não atende às suas necessidades.
Mesma abordagem da perspectiva do Claude, mas o código é executado em um container isolado com restrições de segurança (por exemplo, sem saída de rede). Se suas ferramentas requerem recursos externos, você precisará de um protocolo para executar chamadas de ferramenta 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 cuida do gerenciamento de containers, 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 do Claude, o Claude Platform on AWS ou o Microsoft Foundry. No Microsoft Foundry, a chamada programática de ferramentas requer uma implantação Hosted on Anthropic.
A chamada programática de ferramentas é construída sobre a infraestrutura de execução de código e usa os mesmos containers de sandbox. Os dados do container, incluindo artefatos de execução e saídas, são retidos por até 30 dias.
Para elegibilidade ZDR em todos os recursos, consulte API e retenção de dados.
Faça streaming de entradas de ferramentas sem buffer de JSON do lado do servidor para aplicações sensíveis à latência.
Execute código Python e bash em um container isolado para analisar dados, gerar arquivos e iterar em soluções.
Conecte Claude a ferramentas e APIs externas. Veja onde as ferramentas são executadas, quando Claude as chama e qual ferramenta se adapta à sua tarefa.
Especifique esquemas de ferramentas, escreva descrições eficazes e controle quando Claude chama suas ferramentas.
Was this page helpful?