Las llamadas de herramientas programáticas permiten que Claude escriba código que llame a tus herramientas de forma programática dentro de un contenedor de ejecución de código, en lugar de requerir viajes de ida y vuelta a través del modelo para cada invocación de herramienta. Esto reduce la latencia para flujos de trabajo con múltiples herramientas y disminuye el consumo de tokens al permitir que Claude filtre o procese datos antes de que lleguen a la ventana de contexto del modelo.
Esta función requiere que la herramienta de ejecución de código esté habilitada.
This feature is not covered by Zero Data Retention (ZDR) arrangements. Data is retained according to the feature's standard retention policy.
Las llamadas de herramientas programáticas están disponibles en los siguientes modelos:
| Modelo | Versión de herramienta |
|---|---|
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 |
Las llamadas de herramientas programáticas están disponibles a través de la API de Claude y Microsoft Foundry.
Aquí hay un ejemplo simple donde Claude consulta una base de datos múltiples veces de forma programática y agrega resultados:
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"]
}
]
}'Cuando configuras una herramienta para que sea invocable desde la ejecución de código y Claude decide usar esa herramienta:
tool_useEste enfoque es particularmente útil para:
Las herramientas personalizadas se convierten en funciones Python asincrónicas para admitir llamadas de herramientas paralelas. Cuando Claude escribe código que llama a tus herramientas, utiliza await (por ejemplo, result = await query_database("<sql>")) e incluye automáticamente la función de envoltura asincrónica apropiada.
La envoltura asincrónica se omite de los ejemplos de código en esta documentación por claridad.
allowed_callersEl campo allowed_callers especifica qué contextos pueden invocar una herramienta:
{
"name": "query_database",
"description": "Execute a SQL query against the database",
"input_schema": {...},
"allowed_callers": ["code_execution_20250825"]
}Valores posibles:
["direct"] - Solo Claude puede llamar a esta herramienta directamente (predeterminado si se omite)["code_execution_20250825"] - Solo invocable desde dentro de la ejecución de código["direct", "code_execution_20250825"] - Invocable tanto directamente como desde la ejecución de códigoRecomendamos elegir ["direct"] o ["code_execution_20250825"] para cada herramienta en lugar de habilitar ambas, ya que esto proporciona una orientación más clara a Claude sobre cómo usar mejor la herramienta.
caller en respuestasCada bloque de uso de herramienta incluye un campo caller que indica cómo fue invocado:
Invocación directa (uso de herramienta tradicional):
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": {"sql": "<sql>"},
"caller": {"type": "direct"}
}Invocación programática:
{
"type": "tool_use",
"id": "toolu_xyz789",
"name": "query_database",
"input": {"sql": "<sql>"},
"caller": {
"type": "code_execution_20250825",
"tool_id": "srvtoolu_abc123"
}
}El tool_id hace referencia a la herramienta de ejecución de código que realizó la llamada programática.
Las llamadas de herramientas programáticas utilizan los mismos contenedores que la ejecución de código:
containerCuando una herramienta se llama de forma programática y el contenedor está esperando tu resultado de herramienta, debes responder antes de que expire el contenedor. Monitorea el campo expires_at. Si el contenedor expira, Claude puede tratar la llamada de herramienta como agotada por tiempo y reintentar.
Aquí se muestra cómo funciona un flujo completo de llamadas de herramientas programáticas:
Envía una solicitud con ejecución de código y una herramienta que permita llamadas programáticas. Para habilitar llamadas programáticas, agrega el campo allowed_callers a tu definición de herramienta.
Proporciona descripciones detalladas del formato de salida de tu herramienta en la descripción de la herramienta. Si especificas que la herramienta devuelve JSON, Claude intentará deserializar y procesar el resultado en código. Cuanto más detalle proporciones sobre el esquema de salida, mejor podrá Claude manejar la respuesta de forma programática.
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"],
},
],
)Claude escribe código que llama a tu herramienta. La API se pausa y devuelve:
{
"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"
}Incluye el historial completo de conversación más tu resultado de herramienta:
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=[...],
)La ejecución de código continúa y procesa los resultados. Si se necesitan llamadas de herramientas adicionales, repite el Paso 3 hasta que se satisfagan todas las llamadas de herramientas.
Una vez que se completa la ejecución de código, Claude proporciona la respuesta 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 puede escribir código que procesa múltiples elementos de forma eficiente:
# 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 patrón:
Claude puede dejar de procesar tan pronto como se cumplan los criterios de éxito:
# 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)Cuando la ejecución de código llama a una herramienta:
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": {"sql": "<sql>"},
"caller": {
"type": "code_execution_20250825",
"tool_id": "srvtoolu_xyz789"
}
}Tu resultado de herramienta se devuelve al código en ejecución:
{
"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}, ...]"
}
]
}Cuando se satisfacen todas las llamadas de herramientas y el código se completa:
{
"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": []
}
}| Error | Descripción | Solución |
|---|---|---|
invalid_tool_input | La entrada de la herramienta no coincide con el esquema | Valida el input_schema de tu herramienta |
tool_not_allowed | La herramienta no permite el tipo de invocador solicitado | Verifica que allowed_callers incluya los contextos correctos |
missing_beta_header | Encabezado beta requerido no proporcionado | Agrega los encabezados beta requeridos a tu solicitud |
Si tu herramienta tarda demasiado en responder, la ejecución de código recibirá un TimeoutError. Claude lo ve en stderr e intentará reintentar típicamente:
{
"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 prevenir tiempos de espera:
expires_at en respuestasSi tu herramienta devuelve un error:
# Provide error information in the tool result
{
"type": "tool_result",
"tool_use_id": "toolu_abc123",
"content": "Error: Query timeout - table lock exceeded 30 seconds",
}El código de Claude recibirá este error y puede manejarlo apropiadamente.
strict: true no son compatibles con llamadas programáticastool_choicedisable_parallel_tool_use: true no es compatible con llamadas programáticasLas siguientes herramientas actualmente no pueden ser llamadas de forma programática, pero el soporte puede agregarse en futuras versiones:
Al responder a llamadas de herramientas programáticas, hay requisitos estrictos de formato:
Respuestas solo de resultado de herramienta: Si hay llamadas de herramientas programáticas pendientes esperando resultados, tu mensaje de respuesta debe contener solo bloques tool_result. No puedes incluir ningún contenido de texto, ni siquiera después de los resultados de la herramienta.
// ❌ INVÁLIDO - No puedes incluir texto al responder a llamadas de herramientas 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?"} // This will cause an error
]
}
// ✅ VÁLIDO - Solo resultados de herramientas al responder a llamadas de herramientas programáticas
{
"role": "user",
"content": [
{"type": "tool_result", "tool_use_id": "toolu_01", "content": "[{\"customer_id\": \"C1\", \"revenue\": 45000}]"}
]
}Esta restricción solo se aplica al responder a llamadas de herramientas programáticas (ejecución de código). Para llamadas de herramientas regulares del lado del cliente, puedes incluir contenido de texto después de los resultados de la herramienta.
Las llamadas de herramientas programáticas están sujetas a los mismos límites de velocidad que las llamadas de herramientas regulares. Cada llamada de herramienta desde la ejecución de código cuenta como una invocación separada.
Al implementar herramientas personalizadas que serán llamadas de forma programática:
Las llamadas de herramientas programáticas pueden reducir significativamente el consumo de tokens:
Por ejemplo, llamar a 10 herramientas directamente usa ~10x los tokens de llamarlas de forma programática y devolver un resumen.
Las llamadas de herramientas programáticas utilizan los mismos precios que la ejecución de código. Consulta los precios de ejecución de código para obtener detalles.
Conteo de tokens para llamadas de herramientas programáticas: Los resultados de herramientas de invocaciones programáticas no cuentan hacia tu uso de tokens de entrada/salida. Solo el resultado final de ejecución de código y la respuesta de Claude cuentan.
Casos de uso buenos:
Casos de uso menos ideales:
Error "Tool not allowed"
"allowed_callers": ["code_execution_20250825"]Expiración del contenedor
expires_at en respuestasResultado de herramienta no analizado correctamente
caller para confirmar invocación programáticaEl entrenamiento de Claude incluye una exposición extensa al código, lo que lo hace efectivo en razonamiento y encadenamiento de llamadas de funciones. Cuando las herramientas se presentan como funciones invocables dentro de un entorno de ejecución de código, Claude puede aprovechar esta fortaleza para:
Este enfoque permite flujos de trabajo que serían impracticables con uso de herramientas tradicional, como procesar archivos de más de 1M tokens, al permitir que Claude trabaje con datos de forma programática en lugar de cargar todo en el contexto de conversación.
Las llamadas de herramientas programáticas son un patrón generalizable que puede implementarse fuera de la ejecución de código administrada de Anthropic. Aquí hay una descripción general de los enfoques:
Proporciona a Claude una herramienta de ejecución de código y describe qué funciones están disponibles en ese entorno. Cuando Claude invoca la herramienta con código, tu aplicación la ejecuta localmente donde esas funciones están definidas.
Ventajas:
Desventajas:
Usar cuando: Tu aplicación puede ejecutar de forma segura código arbitrario, quieres una solución simple, y la oferta administrada de Anthropic no se ajusta a tus necesidades.
El mismo enfoque desde la perspectiva de Claude, pero el código se ejecuta en un contenedor aislado con restricciones de seguridad (por ejemplo, sin salida de red). Si tus herramientas requieren recursos externos, necesitarás un protocolo para ejecutar llamadas de herramientas fuera de la caja de arena.
Ventajas:
Desventajas:
Usar cuando: La seguridad es crítica y la solución administrada de Anthropic no se ajusta a tus requisitos.
Las llamadas de herramientas programáticas de Anthropic son una versión administrada de ejecución aislada con un entorno Python opinado sintonizado para Claude. Anthropic maneja la administración de contenedores, ejecución de código y comunicación segura de invocación de herramientas.
Ventajas:
Recomendamos usar la solución administrada de Anthropic si estás usando la API de Claude.
Aprende sobre la capacidad subyacente de ejecución de código que potencia las llamadas de herramientas programáticas.
Comprende los fundamentos del uso de herramientas con Claude.
Guía paso a paso para implementar herramientas.
Was this page helpful?