Las llamadas a herramientas programáticas permiten que Claude escriba código que invoca 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 en 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. En benchmarks de búsqueda agéntica como BrowseComp y DeepSearchQA, que prueban la investigación web de múltiples pasos y la recuperación de información compleja, agregar llamadas a herramientas programáticas sobre las herramientas de búsqueda básicas fue el factor clave que desbloqueó completamente el rendimiento del agente.
La diferencia se amplifica rápidamente en flujos de trabajo reales. Considera verificar el cumplimiento del presupuesto en 20 empleados: el enfoque tradicional requiere 20 viajes de ida y vuelta al modelo por separado, extrayendo miles de líneas de gastos al contexto en el camino. Con las llamadas a herramientas programáticas, un único script ejecuta las 20 consultas, filtra los resultados y devuelve solo los empleados que superaron sus límites, reduciendo lo que Claude necesita razonar de cientos de kilobytes a unas pocas líneas.
Para una visión más profunda de los costos de inferencia y contexto que abordan las llamadas a herramientas programáticas, consulta Advanced tool use.
Esta función requiere que la herramienta de ejecución de código esté habilitada.
This feature is not eligible for Zero Data Retention (ZDR). Data is retained according to the feature's standard retention policy.
Para detalles de compatibilidad de modelos y versiones de herramientas, consulta la referencia de herramientas. Las llamadas a 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 programáticamente una base de datos varias veces 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_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"]
}
]
}'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 asíncronas para admitir llamadas a herramientas en paralelo. Cuando Claude escribe código que llama a tus herramientas, usa await (p. ej., result = await query_database("<sql>")) e incluye automáticamente la función de envoltura asíncrona apropiada.
La envoltura asíncrona 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_20260120"]
}Valores posibles:
["direct"] - Solo Claude puede llamar a esta herramienta directamente (valor predeterminado si se omite)["code_execution_20260120"] - Solo se puede llamar desde dentro de la ejecución de código["direct", "code_execution_20260120"] - Se puede llamar tanto directamente como desde la ejecución de códigoElige ["direct"] o ["code_execution_20260120"] para cada herramienta en lugar de habilitar ambos, ya que esto proporciona una guía más clara a Claude sobre cómo usar mejor la herramienta.
caller en las respuestasCada bloque de uso de herramienta incluye un campo caller que indica cómo fue invocado:
Invocación directa (uso tradicional de herramientas):
{
"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_20260120",
"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 a herramientas programáticas utilizan los mismos contenedores que la ejecución de código:
containerCuando una herramienta se llama programáticamente y el contenedor está esperando el resultado de tu herramienta, debes responder antes de que el contenedor expire. Monitorea el campo expires_at. Si el contenedor expira, Claude puede tratar la llamada a la herramienta como agotada y volver a intentarla.
Así es como funciona un flujo completo de llamadas a herramientas programáticas:
Envía una solicitud con ejecución de código y una herramienta que permita llamadas programáticas. Para habilitar las llamadas programáticas, agrega el campo allowed_callers a la definición de tu 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 intenta deserializar y procesar el resultado en el código. Cuanto más detalle proporciones sobre el esquema de salida, mejor podrá Claude manejar la respuesta de forma programática.
La forma de la solicitud es idéntica al ejemplo de Inicio rápido: incluye code_execution en tu lista de herramientas, agrega allowed_callers: ["code_execution_20260120"] a cualquier herramienta que quieras que Claude invoque desde el código, y envía tu mensaje de usuario.
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_20260120",
"tool_id": "srvtoolu_abc123"
}
}
],
"container": {
"id": "container_xyz789",
"expires_at": "2025-01-15T14:30:00Z"
},
"stop_reason": "tool_use"
}Incluye el historial completo de la conversación más el resultado de tu herramienta:
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: [...]
YAMLLa ejecución de código continúa y procesa los resultados. Si se necesitan llamadas a herramientas adicionales, repite el Paso 3 hasta que todas las llamadas a herramientas estén satisfechas.
Una vez que la ejecución de código se completa, 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 procese múltiples elementos de manera 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 patrón:
Claude puede dejar de procesar tan pronto como se cumplan los criterios de éxito:
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)
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_20260120",
"tool_id": "srvtoolu_xyz789"
}
}El resultado de tu herramienta se pasa de vuelta 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 todas las llamadas a herramientas están satisfechas 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 llamador solicitado | Verifica que allowed_callers incluya los contextos correctos |
missing_beta_header | No se proporcionó el encabezado beta requerido (solo para Bedrock y Vertex AI; las llamadas programáticas a herramientas están en GA en la API de Claude de primera parte) | Agrega los encabezados beta requeridos a tu solicitud |
Si tu herramienta tarda demasiado en responder, la ejecución de código recibe un TimeoutError. Claude lo ve en stderr y normalmente reintenta:
{
"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 agotados:
expires_at en las respuestasSi tu herramienta devuelve un error:
{
"type": "tool_result",
"tool_use_id": "toolu_abc123",
"content": "Error: Query timeout - table lock exceeded 30 seconds"
}El código de Claude recibe este error y puede manejarlo de manera apropiada.
strict: true no son compatibles con las llamadas programáticastool_choicedisable_parallel_tool_use: true no es compatible con las llamadas programáticasLas siguientes herramientas actualmente no pueden ser llamadas de forma programática, pero el soporte puede añadirse en versiones futuras:
Al responder a llamadas programáticas a herramientas, existen requisitos de formato estrictos:
Respuestas solo con resultado de herramienta: Si hay llamadas programáticas a herramientas pendientes esperando resultados, tu mensaje de respuesta debe contener únicamente bloques tool_result. No puedes incluir ningún contenido de texto, ni siquiera después de los resultados de las herramientas.
Inválido - No se puede incluir texto al responder a llamadas programáticas a herramientas:
{
"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 - Solo resultados de herramientas al responder a llamadas programáticas a herramientas:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01",
"content": "[{\"customer_id\": \"C1\", \"revenue\": 45000}]"
}
]
}Esta restricción solo aplica cuando se responde a llamadas programáticas (de ejecución de código) a herramientas. Para llamadas regulares a herramientas del lado del cliente, puedes incluir contenido de texto después de los resultados de las herramientas.
Las llamadas programáticas a herramientas están sujetas a los mismos límites de velocidad que las llamadas regulares a herramientas. Cada llamada a herramienta desde la ejecución de código cuenta como una invocación separada.
Al implementar herramientas definidas por el usuario que serán llamadas de forma programática:
Las llamadas programáticas a herramientas pueden reducir significativamente el consumo de tokens:
Por ejemplo, llamar a 10 herramientas directamente usa aproximadamente 10 veces más tokens que llamarlas de forma programática y devolver un resumen.
Las llamadas programáticas a herramientas utilizan los mismos precios que la ejecución de código. Consulta los precios de ejecución de código para más detalles.
Conteo de tokens para llamadas programáticas a herramientas: Los resultados de herramientas de invocaciones programáticas no cuentan para el uso de tokens de entrada/salida. Solo el resultado final de la ejecución de código y la respuesta de Claude cuentan.
Buenos casos de uso:
Casos de uso menos ideales:
Error "Tool not allowed"
"allowed_callers": ["code_execution_20260120"]Expiración del contenedor
expires_at en las respuestasEl resultado de la herramienta no se analiza correctamente
caller para confirmar la invocación programáticaEl entrenamiento de Claude incluye una exposición extensa al código, lo que lo hace efectivo para razonar y encadenar llamadas a 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 el uso tradicional de herramientas (como procesar archivos de más de 1 millón de tokens) al permitir que Claude trabaje con datos de forma programática en lugar de cargar todo en el contexto de la conversación.
Las llamadas programáticas a herramientas son un patrón generalizable que puede implementarse fuera de la ejecución de código gestionada 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 lo ejecuta localmente donde esas funciones están definidas.
Ventajas:
Desventajas:
Úsalo cuando: Tu aplicación puede ejecutar código arbitrario de forma segura, quieres una solución simple y la oferta gestionada de Anthropic no se adapta a tus necesidades.
El mismo enfoque desde la perspectiva de Claude, pero el código se ejecuta en un contenedor con sandbox con restricciones de seguridad (p. ej., sin salida de red). Si tus herramientas requieren recursos externos, necesitarás un protocolo para ejecutar llamadas a herramientas fuera del sandbox.
Ventajas:
Desventajas:
Úsalo cuando: La seguridad es crítica y la solución gestionada de Anthropic no se adapta a tus requisitos.
Las llamadas programáticas a herramientas de Anthropic son una versión gestionada de la ejecución en sandbox con un entorno Python con opiniones ajustado para Claude. Anthropic gestiona la administración de contenedores, la ejecución de código y la comunicación segura de invocación de herramientas.
Ventajas:
Considera usar la solución gestionada de Anthropic si estás usando la API de Claude.
Las llamadas programáticas a herramientas están construidas sobre la infraestructura de ejecución de código y utilizan los mismos contenedores sandbox. Los datos del contenedor, incluidos los artefactos y salidas de ejecución, se retienen por hasta 30 días.
Para la elegibilidad de ZDR en todas las características, consulta Retención de datos y API.
Aprende sobre la capacidad subyacente de ejecución de código que impulsa las llamadas programáticas a herramientas.
Comprende los fundamentos del uso de herramientas con Claude.
Guía paso a paso para definir herramientas.
Was this page helpful?