Recomendamos usar el modelo Claude Sonnet (4.5) o Claude Opus (4.1) más reciente para herramientas complejas y consultas ambiguas; manejan múltiples herramientas mejor y buscan aclaraciones cuando es necesario.
Usa modelos Claude Haiku para herramientas directas, pero ten en cuenta que pueden inferir parámetros faltantes.
Si usas Claude con uso de herramientas y pensamiento extendido, consulta nuestra guía aquí para más información.
Las herramientas del cliente (tanto las definidas por Anthropic como las definidas por el usuario) se especifican en el parámetro de nivel superior tools de la solicitud de API. Cada definición de herramienta incluye:
| Parámetro | Descripción |
|---|---|
name | El nombre de la herramienta. Debe coincidir con la expresión regular ^[a-zA-Z0-9_-]{1,64}$. |
description | Una descripción detallada en texto plano de qué hace la herramienta, cuándo debe usarse y cómo se comporta. |
input_schema | Un objeto JSON Schema que define los parámetros esperados para la herramienta. |
input_examples | (Opcional, beta) Una matriz de objetos de entrada de ejemplo para ayudar a Claude a entender cómo usar la herramienta. Consulta Proporcionar ejemplos de uso de herramientas. |
Cuando llamas a la API de Claude con el parámetro tools, construimos una indicación del sistema especial a partir de las definiciones de herramientas, la configuración de herramientas y cualquier indicación del sistema especificada por el usuario. La indicación construida está diseñada para instruir al modelo que use las herramientas especificadas y proporcione el contexto necesario para que la herramienta funcione correctamente:
In this environment you have access to a set of tools you can use to answer the user's question.
{{ FORMATTING INSTRUCTIONS }}
String and scalar parameters should be specified as is, while lists and objects should use JSON format. Note that spaces for string values are not stripped. The output is not expected to be valid XML and is parsed with regular expressions.
Here are the functions available in JSONSchema format:
{{ TOOL DEFINITIONS IN JSON SCHEMA }}
{{ USER SYSTEM PROMPT }}
{{ TOOL CONFIGURATION }}Para obtener el mejor rendimiento de Claude al usar herramientas, sigue estas directrices:
input_examples para herramientas complejas. Las descripciones claras son lo más importante, pero para herramientas con entradas complejas, objetos anidados o parámetros sensibles al formato, puedes usar el campo input_examples (beta) para proporcionar ejemplos validados por esquema. Consulta Proporcionar ejemplos de uso de herramientas para más detalles.La buena descripción explica claramente qué hace la herramienta, cuándo usarla, qué datos devuelve y qué significa el parámetro ticker. La descripción deficiente es demasiado breve y deja a Claude con muchas preguntas abiertas sobre el comportamiento y el uso de la herramienta.
Puedes proporcionar ejemplos concretos de entradas de herramientas válidas para ayudar a Claude a entender cómo usar tus herramientas de manera más efectiva. Esto es particularmente útil para herramientas complejas con objetos anidados, parámetros opcionales o entradas sensibles al formato.
Los ejemplos de uso de herramientas es una característica beta. Incluye el encabezado beta apropiado para tu proveedor:
| Proveedor | Encabezado beta | Modelos compatibles |
|---|---|---|
| Claude API, Microsoft Foundry | advanced-tool-use-2025-11-20 | Todos los modelos |
| Vertex AI, Amazon Bedrock | tool-examples-2025-10-29 | Solo Claude Opus 4.5 |
Añade un campo input_examples opcional a tu definición de herramienta con una matriz de objetos de entrada de ejemplo. Cada ejemplo debe ser válido según el input_schema de la herramienta:
Los ejemplos se incluyen en la indicación junto con tu esquema de herramienta, mostrando a Claude patrones concretos para llamadas de herramientas bien formadas. Esto ayuda a Claude a entender cuándo incluir parámetros opcionales, qué formatos usar y cómo estructurar entradas complejas.
input_schema de la herramienta. Los ejemplos inválidos devuelven un error 400El ejecutor de herramientas proporciona una solución lista para usar para ejecutar herramientas con Claude. En lugar de manejar manualmente llamadas de herramientas, resultados de herramientas y gestión de conversaciones, el ejecutor de herramientas automáticamente:
Recomendamos que uses el ejecutor de herramientas para la mayoría de las implementaciones de uso de herramientas.
El ejecutor de herramientas está actualmente en beta y disponible en los SDK de Python, TypeScript y Ruby.
Gestión automática de contexto con compactación
El ejecutor de herramientas admite compactación automática, que genera resúmenes cuando el uso de tokens excede un umbral. Esto permite que las tareas agénticas de larga duración continúen más allá de los límites de la ventana de contexto.
El ejecutor de herramientas del SDK está en beta. El resto de este documento cubre la implementación manual de herramientas.
En algunos casos, es posible que desees que Claude use una herramienta específica para responder la pregunta del usuario, incluso si Claude cree que puede proporcionar una respuesta sin usar una herramienta. Puedes hacer esto especificando la herramienta en el campo tool_choice así:
tool_choice = {"type": "tool", "name": "get_weather"}Cuando se trabaja con el parámetro tool_choice, tenemos cuatro opciones posibles:
auto permite que Claude decida si llamar a cualquiera de las herramientas proporcionadas o no. Este es el valor predeterminado cuando se proporcionan tools.any le dice a Claude que debe usar una de las herramientas proporcionadas, pero no fuerza una herramienta en particular.tool nos permite forzar a Claude a usar siempre una herramienta en particular.none evita que Claude use cualquier herramienta. Este es el valor predeterminado cuando no se proporcionan tools.Cuando se usa almacenamiento en caché de indicaciones, los cambios en el parámetro tool_choice invalidarán los bloques de mensajes en caché. Las definiciones de herramientas y las indicaciones del sistema permanecen en caché, pero el contenido del mensaje debe reprocesarse.
Este diagrama ilustra cómo funciona cada opción:

Ten en cuenta que cuando tienes tool_choice como any o tool, rellenaremos previamente el mensaje del asistente para forzar el uso de una herramienta. Esto significa que los modelos no emitirán una respuesta en lenguaje natural o explicación antes de los bloques de contenido tool_use, incluso si se les pide explícitamente que lo hagan.
Cuando se usa pensamiento extendido con uso de herramientas, tool_choice: {"type": "any"} y tool_choice: {"type": "tool", "name": "..."} no son compatibles y resultarán en un error. Solo tool_choice: {"type": "auto"} (el predeterminado) y tool_choice: {"type": "none"} son compatibles con pensamiento extendido.
Nuestras pruebas han demostrado que esto no debería reducir el rendimiento. Si deseas que el modelo proporcione contexto en lenguaje natural o explicaciones mientras aún solicitas que el modelo use una herramienta específica, puedes usar {"type": "auto"} para tool_choice (el predeterminado) y añadir instrucciones explícitas en un mensaje user. Por ejemplo: ¿Cuál es el clima en Londres? Usa la herramienta get_weather en tu respuesta.
Llamadas de herramientas garantizadas con herramientas estrictas
Combina tool_choice: {"type": "any"} con uso de herramientas estrictas para garantizar tanto que una de tus herramientas será llamada COMO que las entradas de la herramienta sigan estrictamente tu esquema. Establece strict: true en tus definiciones de herramientas para habilitar la validación de esquema.
Las herramientas no necesariamente tienen que ser funciones del cliente — puedes usar herramientas en cualquier momento que desees que el modelo devuelva una salida JSON que siga un esquema proporcionado. Por ejemplo, podrías usar una herramienta record_summary con un esquema particular. Consulta Uso de herramientas con Claude para un ejemplo completo que funciona.
Al usar herramientas, Claude a menudo comentará sobre lo que está haciendo o responderá naturalmente al usuario antes de invocar herramientas.
Por ejemplo, dado el mensaje "¿Cuál es el clima en San Francisco ahora mismo, y qué hora es allí?", Claude podría responder con:
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "Te ayudaré a verificar el clima actual y la hora en San Francisco."
},
{
"type": "tool_use",
"id": "toolu_01A09q90qw90lq917835lq9",
"name": "get_weather",
"input": {"location": "San Francisco, CA"}
}
]
}Este estilo de respuesta natural ayuda a los usuarios a entender qué está haciendo Claude y crea una interacción más conversacional. Puedes guiar el estilo y contenido de estas respuestas a través de tus mensajes del sistema y proporcionando <examples> en tus mensajes.
Es importante notar que Claude puede usar varias frases y enfoques al explicar sus acciones. Tu código debe tratar estas respuestas como cualquier otro texto generado por el asistente, y no depender de convenciones de formato específicas.
Por defecto, Claude puede usar múltiples herramientas para responder a una consulta del usuario. Puedes desactivar este comportamiento mediante:
disable_parallel_tool_use=true cuando el tipo de tool_choice es auto, lo que asegura que Claude use como máximo una herramientadisable_parallel_tool_use=true cuando el tipo de tool_choice es any o tool, lo que asegura que Claude use exactamente una herramientaAunque los modelos Claude 4 tienen excelentes capacidades de uso paralelo de herramientas por defecto, puedes aumentar la probabilidad de ejecución paralela de herramientas en todos los modelos con indicaciones dirigidas:
Uso paralelo de herramientas con Claude Sonnet 3.7
Claude Sonnet 3.7 puede ser menos probable que realice llamadas paralelas de herramientas en una respuesta, incluso cuando no hayas configurado disable_parallel_tool_use. Recomendamos actualizar a modelos Claude 4, que tienen uso de herramientas eficiente en tokens y llamadas paralelas de herramientas mejoradas.
Si aún estás usando Claude Sonnet 3.7, puedes habilitar el encabezado beta token-efficient-tools-2025-02-19 beta header, que ayuda a fomentar que Claude use herramientas paralelas. También puedes introducir una "herramienta de lote" que pueda actuar como una meta-herramienta para envolver invocaciones a otras herramientas simultáneamente.
Consulta este ejemplo en nuestro cookbook para saber cómo usar esta solución alternativa.
Más simple con Tool runner: El manejo manual de herramientas descrito en esta sección se gestiona automáticamente mediante tool runner. Usa esta sección cuando necesites control personalizado sobre la ejecución de herramientas.
La respuesta de Claude difiere según si usa una herramienta de cliente o servidor.
La respuesta tendrá un stop_reason de tool_use y uno o más bloques de contenido tool_use que incluyen:
id: Un identificador único para este bloque de uso de herramienta en particular. Esto se usará para hacer coincidir los resultados de la herramienta más adelante.name: El nombre de la herramienta que se está usando.input: Un objeto que contiene la entrada que se pasa a la herramienta, conforme al input_schema de la herramienta.Cuando recibas una respuesta de uso de herramienta para una herramienta de cliente, debes:
name, id e input del bloque tool_use.input de la herramienta.role de user y un bloque de content que contenga el tipo tool_result y la siguiente información:
tool_use_id: El id de la solicitud de uso de herramienta para la cual esto es un resultado.content: El resultado de la herramienta, como una cadena (p. ej. ), una lista de bloques de contenido anidados (p. ej. ), o una lista de bloques de documento (p. ej. ). Estos bloques de contenido pueden usar los tipos , o .Requisitos de formato importantes:
Por ejemplo, esto causará un error 400:
{"role": "user", "content": [
{"type": "text", "text": "Aquí están los resultados:"}, // ❌ Texto antes de tool_result
{"type": "tool_result", "tool_use_id": "toolu_01", ...}
]}Después de recibir el resultado de la herramienta, Claude usará esa información para continuar generando una respuesta a la solicitud original del usuario.
Claude ejecuta la herramienta internamente e incorpora los resultados directamente en su respuesta sin requerir interacción adicional del usuario.
Diferencias de otras APIs
A diferencia de las APIs que separan el uso de herramientas o usan roles especiales como tool o function, la API de Claude integra herramientas directamente en la estructura de mensaje user y assistant.
Los mensajes contienen arrays de bloques text, image, tool_use y tool_result. Los mensajes user incluyen contenido de cliente y tool_result, mientras que los mensajes assistant contienen contenido generado por IA y tool_use.
max_tokensSi la respuesta de Claude se corta debido a alcanzar el límite max_tokens, y la respuesta truncada contiene un bloque de uso de herramienta incompleto, necesitarás reintentar la solicitud con un valor max_tokens más alto para obtener el uso de herramienta completo.
pause_turnCuando se usan herramientas de servidor como búsqueda web, la API puede devolver una razón de parada pause_turn, indicando que la API ha pausado un turno de larga duración.
Aquí se explica cómo manejar la razón de parada pause_turn:
Al manejar pause_turn:
Manejo de errores integrado: Tool runner proporciona manejo automático de errores para la mayoría de escenarios comunes. Esta sección cubre el manejo manual de errores para casos de uso avanzados.
Hay varios tipos diferentes de errores que pueden ocurrir al usar herramientas con Claude:
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
betas=["advanced-tool-use-2025-11-20"],
tools=[
{
"name": "get_weather",
"description": "Get the current weather in a given location",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "The unit of temperature"
}
},
"required": ["location"]
},
"input_examples": [
{
"location": "San Francisco, CA",
"unit": "fahrenheit"
},
{
"location": "Tokyo, Japan",
"unit": "celsius"
},
{
"location": "New York, NY" # 'unit' is optional
}
]
}
],
messages=[
{"role": "user", "content": "What's the weather like in San Francisco?"}
]
)"content": "15 grados""content": [{"type": "text", "text": "15 grados"}]"content": ["type": "document", "source": {"type": "text", "media_type": "text/plain", "data": "15 grados"}]textimagedocumentis_error (opcional): Configura a true si la ejecución de la herramienta resultó en un error.Esto es correcto:
{"role": "user", "content": [
{"type": "tool_result", "tool_use_id": "toolu_01", ...},
{"type": "text", "text": "¿Qué debo hacer a continuación?"} // ✅ Texto después de tool_result
]}Si recibes un error como "tool_use ids were found without tool_result blocks immediately after", verifica que tus resultados de herramientas estén formateados correctamente.
# Verificar si la respuesta fue truncada durante el uso de herramienta
if response.stop_reason == "max_tokens":
# Verificar si el último bloque de contenido es un tool_use incompleto
last_block = response.content[-1]
if last_block.type == "tool_use":
# Enviar la solicitud con max_tokens más alto
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=4096, # Límite aumentado
messages=messages,
tools=tools
)import anthropic
client = anthropic.Anthropic()
# Solicitud inicial con búsqueda web
response = client.messages.create(
model="claude-3-7-sonnet-latest",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Busca información completa sobre avances en computación cuántica en 2025"
}
],
tools=[{
"type": "web_search_20250305",
"name": "web_search",
"max_uses": 10
}]
)
# Verificar si la respuesta tiene razón de parada pause_turn
if response.stop_reason == "pause_turn":
# Continuar la conversación con el contenido pausado
messages = [
{"role": "user", "content": "Busca información completa sobre avances en computación cuántica en 2025"},
{"role": "assistant", "content": response.content}
]
# Enviar la solicitud de continuación
continuation = client.messages.create(
model="claude-3-7-sonnet-latest",
max_tokens=1024,
messages=messages,
tools=[{
"type": "web_search_20250305",
"name": "web_search",
"max_uses": 10
}]
)
print(continuation)
else:
print(response)