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 de 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 puntos de referencia de búsqueda agéntica como BrowseComp y DeepSearchQA, que prueban investigación web de múltiples pasos y recuperación de información compleja, agregar llamadas de herramientas programáticas además de herramientas de búsqueda básicas fue el factor clave que desbloqueó completamente el rendimiento del agente.
La diferencia se compone 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 separados del modelo, extrayendo miles de elementos de gastos al contexto en el camino. Con llamadas de herramientas programáticas, un único script ejecuta las 20 búsquedas, filtra los resultados y devuelve solo los empleados que excedieron sus límites, reduciendo lo que Claude necesita razonar de cientos de kilobytes a solo algunas líneas.
Para una mirada más profunda a los costos de inferencia y contexto que abordan las llamadas de herramientas programáticas, consulta Uso avanzado de herramientas.
Esta característica 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.
Las llamadas de herramientas programáticas requieren code_execution_20260120, que es compatible con los siguientes modelos:
| Modelo |
|---|
Claude Opus 4.7 (claude-opus-4-7) |
Claude Opus 4.6 (claude-opus-4-6) |
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 la matriz completa de versiones de la herramienta de ejecución de código, consulta la tabla de compatibilidad de modelos de la herramienta de ejecución de código. 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 de forma programática varias veces y agrega resultados:
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-7",
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)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_20260120"]
}Valores posibles:
["direct"] - Solo Claude puede llamar a esta herramienta directamente (predeterminado si se omite)["code_execution_20260120"] - Solo invocable desde dentro de la ejecución de código["direct", "code_execution_20260120"] - Invocable tanto directamente como desde la ejecución de códigoElige ["direct"] o ["code_execution_20260120"] 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 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 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 el resultado de tu 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 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 intenta 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.
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 desees que Claude invoque desde 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 conversación más tu resultado de herramienta:
response = client.messages.create(
model="claude-opus-4-7",
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}, ...]',
}
],
},
],
tools=[...],
)
print(response)La ejecución de código continúa y procesa los resultados. Si se necesitan llamadas de herramienta adicionales, repite el Paso 3 hasta que se satisfagan todas las llamadas de herramienta.
Una vez que se completa la ejecución del 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 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"
}
}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 herramienta 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 | Encabezado beta requerido no proporcionado (solo en Bedrock y Vertex AI; la llamada de herramienta programática es GA en la API 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 ve esto en stderr e típicamente reintentos:
{
"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:
{
"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 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 programáticamente, pero el soporte puede agregarse en futuras versiones:
Al responder a llamadas de herramienta programáticas, hay requisitos estrictos de formato:
Respuestas solo de resultado de herramienta: Si hay llamadas de herramienta 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 herramienta 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 - Solo resultados de herramienta al responder a llamadas de herramienta 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 herramienta programáticas (ejecución de código). Para llamadas de herramienta regulares del lado del cliente, puedes incluir contenido de texto después de resultados de herramienta.
Las llamadas de herramienta programáticas están sujetas a los mismos límites de velocidad que las llamadas de herramienta regulares. Cada llamada de 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 programáticamente:
Las llamadas de herramienta programáticas pueden reducir significativamente el consumo de tokens:
Por ejemplo, llamar a 10 herramientas directamente usa ~10x los tokens de llamarlas programáticamente y devolver un resumen.
Las llamadas de herramienta programáticas usan 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 herramienta programáticas: Los resultados de herramienta 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_20260120"]Expiración de contenedor
expires_at en respuestasResultado de herramienta no analizado correctamente
caller para confirmar invocación programáticaEl entrenamiento de Claude incluye exposición extensa a código, lo que lo hace efectivo en razonar y encadenar llamadas de función. 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 habilita flujos de trabajo que serían impracticables con uso de herramienta tradicional (como procesar archivos sobre 1M tokens) al permitir que Claude trabaje con datos programáticamente en lugar de cargar todo en el contexto de conversación.
Las llamadas de herramienta 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 código arbitrario de manera segura, 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 en caja de arena con restricciones de seguridad (p. ej., sin salida de red). Si tus herramientas requieren recursos externos, necesitarás un protocolo para ejecutar llamadas de herramienta 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 herramienta programáticas de Anthropic son una versión administrada de ejecución en caja de arena con un entorno Python opinado sintonizado para Claude. Anthropic maneja la administración de contenedor, ejecución de código y comunicación segura de invocación de herramienta.
Ventajas:
Considera usar la solución administrada de Anthropic si estás usando la API de Claude.
Las llamadas de herramienta programáticas se construyen sobre la infraestructura de ejecución de código y usan los mismos contenedores de caja de arena. Los datos de contenedor, incluyendo artefactos de ejecución y salidas, se retienen hasta 30 días.
Para elegibilidad de ZDR en todas las características, consulta Retención de API y datos.
Aprende sobre la capacidad de ejecución de código subyacente que potencia las llamadas de herramienta programáticas.
Entiende los fundamentos del uso de herramienta con Claude.
Guía paso a paso para definir herramientas.
Was this page helpful?