Mejores prácticas para el uso de herramientas
Prácticas numeradas para el diseño de esquemas, manejo de errores y bucles de herramientas de múltiples turnos: un resumen de toda la sección que puedes usar como lista de verificación antes de implementar una integración de uso de herramientas basada en el SDK oficial de Python de anthropic.
Cómo usar esta lista
- Lee de principio a fin la primera vez: el diseño del esquema y
tool_choicevienen primero porque afectan si Claude llama a la herramienta correcta, antes de que llegues a la mecánica del bucle. - Trata los elementos 1-2 como trabajo de diseño (hecho una vez por herramienta), los elementos 3-6 como comportamiento en tiempo de solicitud y en tiempo de bucle (hecho en cada llamada), y los elementos 7-9 como preocupaciones de escalado que adoptarás una vez que el conjunto de herramientas o el tráfico crezcan.
- Vuelve a esta página cada vez que agregues una nueva herramienta o veas que Claude elige la herramienta incorrecta, elimina un
tool_resulto se repite más de lo esperado. - Combina esto con las páginas más detalladas vinculadas en "Relacionado": esta página es deliberadamente concisa; las páginas vinculadas contienen las explicaciones completas y ejemplos prácticos.
A - Diseño del esquema
- Dale a cada herramienta un nombre claro y descriptivo. Usa
get_weather, nowotool1; Claude compara tudescriptioncon la intención del usuario, y un nombre vago le da menos información para trabajar. - Escribe descripciones que digan CUÁNDO llamar a la herramienta, no solo lo que hace. "Llama a esto cuando el usuario pregunte sobre los precios actuales" supera a una descripción que solo indica la funcionalidad; los modelos recientes de Claude recurren a las herramientas de forma más conservadora por defecto, por lo que una descripción prescriptiva y con palabras clave mejora notablemente la precisión de la llamada.
- Dale a cada propiedad de
input_schemasu propiadescription. Claude lee las descripciones por propiedad para decidir qué valor extraer y cómo formatearlo; una propiedad indocumentada es una propiedad sobre la que Claude tiene que adivinar. - Usa
enumpara parámetros de elección fija. Si un parámetro siempre toma uno de un conjunto conocido de valores (por ejemplo,"unit": ["celsius", "fahrenheit"]), restringe conenumen lugar de dejarlo como texto de formato libre. - Marca solo los campos verdaderamente requeridos en
required. Marcar demasiados campos como requeridos obliga a Claude a fabricar un valor o a hacer una pregunta aclaratoria innecesaria cuando el campo no se aplica. - Establece
"strict": truecuando necesites una validación de esquema exacta. Agrégalo en el nivel superior de la definición de la herramienta junto conadditionalProperties: falseyrequired; esto hace quetool_use.inputse valide exactamente contra el esquema en lugar de desviarse en casos extremos.
B - Mantén el conjunto de herramientas enfocado
- No registres más herramientas de las que la tarea necesita. Demasiadas herramientas, nombres vagos o descripciones superpuestas pueden hacer que Claude elija la herramienta incorrecta o que no llame a ninguna; un conjunto de herramientas grande e indiferenciado es peor para la precisión que uno pequeño y bien descrito.
- Verifica la superposición de descripciones antes de agregar una nueva herramienta. Si dos herramientas podrían satisfacer plausiblemente la misma solicitud, ajusta el lenguaje "llama a esto cuando" en cada una hasta que sean mutuamente distinguibles.
C - tool_choice
- Por defecto, usa
{"type": "auto"}para agentes de propósito general. Deja que Claude decida si llamar a una herramienta y cuál, basándose en la conversación. - Usa
{"type": "any"}cuando el turno deba terminar en alguna acción pero no te importe qué herramienta. Esto garantiza una llamada a la herramienta sin elegir en nombre de Claude. - Usa
{"type": "tool", "name": "..."}para forzar una herramienta específica. Recurre a esto cuando el flujo de trabajo requiera una llamada a función particular, independientemente de lo que Claude elegiría de otra manera. - Usa
{"type": "none"}para suprimir temporalmente las llamadas a herramientas sin eliminartoolsde la solicitud. Eliminar las definiciones de herramientas por completo invalida el almacenamiento en caché de la solicitud;nonemantiene las definiciones en su lugar y simplemente evita que ese turno en particular llame a una herramienta. - Agrega
disable_parallel_tool_use: truea cualquier valor detool_choicecuando tu código no pueda manejar más de una llamada a herramienta por turno. Funciona junto conauto,any,toolononey limita a Claude a una sola llamada a herramienta en esa respuesta.
response = client.messages.create(
model="claude-sonnet-5",
max_tokens=1024,
tools=[weather_tool, calculate_tool],
tool_choice={"type": "auto", "disable_parallel_tool_use": True},
messages=[{"role": "user", "content": "What's the weather in Austin, TX?"}],
)D - Manejo de errores en bloques tool_result
- Devuelve
is_error: trueen caso de fallo de la herramienta en lugar de eliminar el resultado o generar una excepción. Claude puede entonces reintentar la llamada, probar una herramienta diferente o pedir una aclaración al usuario; untool_resultfaltante o una excepción no manejada deja la conversación en un estado roto.
def run_tool(tool_use):
try:
output = execute(tool_use.name, tool_use.input)
return {
"type": "tool_result",
"tool_use_id": tool_use.id,
"content": str(output),
}
except Exception as exc:
return {
"type": "tool_result",
"tool_use_id": tool_use.id,
"content": f"Error: {exc}",
"is_error": True,
}E - Higiene del bucle de múltiples turnos
- Agrega el
response.contentcompleto de nuevo amessages, no solo el texto extraído. La API necesita que los bloquestool_usese conserven en el turno del asistente; eliminarlos para dejar solo el contenido de texto rompe la siguiente solicitud. - Protege cada bucle con un límite de
max_iterations. Un bucle de uso de herramientas sin límite puede descontrolarse si Claude sigue llamando a herramientas sin producir una respuesta final. - Maneja
stop_reason == "pause_turn"reenviando la conversación tal cual. Este motivo de detención significa que una herramienta del lado del servidor alcanzó su límite de iteración interno; no inyectes un mensaje extra de "Continuar"; la API se reanuda automáticamente porque detecta el bloqueserver_tool_usefinal.
messages = [{"role": "user", "content": "What's the weather in Austin, TX?"}]
for _ in range(max_iterations := 8):
response = client.messages.create(
model="claude-sonnet-5",
max_tokens=1024,
tools=[weather_tool],
messages=messages,
)
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason == "pause_turn":
continue # reenviar tal cual, sin mensaje "Continuar" inyectado
if response.stop_reason != "tool_use":
break
tool_results = [run_tool(block) for block in response.content if block.type == "tool_use"]
messages.append({"role": "user", "content": tool_results})F - Llamadas a herramientas paralelas
- Espera y maneja múltiples bloques
tool_useen un solo turno. Claude puede solicitar varias herramientas en paralelo por defecto; ejecútalas concurrentemente cuando sea práctico en lugar de asumir exactamente una llamada por turno. - Devuelve TODOS los bloques
tool_resultjuntos en un solo mensajeuser. Nunca los dividas en varios mensajes; hacerlo puede degradar el comportamiento futuro de las llamadas paralelas de Claude. - Haz coincidir cada
tool_use_idque Claude envió con untool_result, incluidas las llamadas fallidas. Un bloquetool_usesin untool_resultcorrespondiente (incluso uno conis_error: true) deja el turno incompleto.
G - Escalado a muchas herramientas
- Adopta la herramienta de búsqueda de herramientas (Tool Search Tool) una vez que una biblioteca de herramientas crezca a un rango de docenas a cientos. Usa
tool_search_tool_regex_20251119otool_search_tool_bm25_20251119condefer_loading: trueen herramientas poco usadas para reducir el uso de tokens aproximadamente en un 85%. - Mantén la herramienta de búsqueda en sí y al menos otra herramienta sin diferir. Diferir todas las herramientas, incluida la herramienta de búsqueda, hace que la solicitud sea 400; Claude necesita al menos una herramienta cargada inmediatamente para razonar.
- Prefiere el conector MCP sobre un wrapper del lado del cliente para capacidades remotas/alojadas. Cuando ya existe un servidor MCP adecuado, usa
mcp_serversmás una entradamcp_toolsetcoincidente (betamcp-client-2025-11-20) en lugar de reimplementar un cliente que llama a la misma API remota.
H - Almacenamiento en caché de solicitudes con herramientas
- Recuerda que las definiciones de herramientas se renderizan primero en la solicitud, antes del sistema y los mensajes. Agregar, eliminar o reordenar herramientas invalida el nivel de caché de herramientas/sistema; alternar
tool_choicepor sí solo no lo hace. - Mantén el orden de las herramientas determinista si construyes la lista
toolsdinámicamente. Ordena por nombre (o por otra clave estable) para que el mismo conjunto de herramientas siempre se serialice en el mismo orden y no invalide innecesariamente la caché.
I - Análisis JSON
- Siempre lee
tool_use.inputa través del objeto analizado del SDK, nunca comparándolo con una cadena sin procesar. Los modelos recientes de Claude pueden escapar Unicode o barras diagonales de manera diferente en el JSON generado, por lo que la comparación de cadenas con la carga útil sin procesar es frágil de una manera que un objeto analizado no lo es.
Preguntas frecuentes
¿Qué práctica de esta página es más importante para la precisión de la llamada?
El diseño del esquema, específicamente escribir descripciones que indiquen CUÁNDO llamar a una herramienta en lugar de solo lo que hace. Los modelos recientes de Claude son más conservadores por defecto al recurrir a las herramientas, por lo que una descripción prescriptiva y con palabras clave tiene un efecto desproporcionado.
¿Necesito `"strict": true` en cada herramienta?
No. Úsalo cuando necesites que tool_use.input se valide exactamente contra el esquema, por ejemplo, para alimentar la salida directamente a una función fuertemente tipada. Para casos de uso más flexibles, es opcional.
¿Por qué la lista pone el diseño del esquema antes de tool_choice y la mecánica del bucle?
El diseño del esquema es un trabajo de tiempo de diseño que determina si Claude elige la herramienta correcta. tool_choice y la higiene del bucle son comportamientos en tiempo de solicitud que solo importan una vez que la herramienta correcta ya está en juego.
¿Cuál es el error más grande en los bucles de múltiples turnos?
Agregar solo el texto extraído de response.content de nuevo a messages en lugar de la lista completa de contenido. Eso elimina silenciosamente los bloques tool_use que la API necesita en el siguiente turno.
¿Qué debo hacer cuando stop_reason es "pause_turn"?
Reenviar la conversación tal cual. pause_turn significa que una herramienta del lado del servidor alcanzó su límite de iteración interno; la API detecta el bloque server_tool_use final y se reanuda automáticamente, por lo que inyectar un mensaje extra de "Continuar" es innecesario.
¿Puedo simplemente eliminar un tool_result si la llamada a la herramienta falló?
No. Devuelve un tool_result con is_error: true y un mensaje que describa el fallo. Eliminar el resultado o generar una excepción deja el turno incompleto y Claude no puede reintentar o pedir una aclaración.
¿Necesito ejecutar llamadas a herramientas paralelas de forma concurrente, o puedo ejecutarlas una a la vez?
La concurrencia es una recomendación "cuando sea práctico" para la latencia, no un requisito de corrección. Lo que sí es un requisito de corrección es devolver todos los bloques tool_result resultantes juntos en un solo mensaje user, ya sea que los hayas ejecutado de forma concurrente o secuencial.
¿Cuándo debo recurrir a la herramienta de búsqueda de herramientas en lugar de simplemente registrar todas mis herramientas normalmente?
Una vez que tu biblioteca de herramientas esté en el rango de docenas a cientos. Por debajo de eso, el ahorro de tokens de defer_loading no vale la complejidad adicional; simplemente registra las herramientas directamente.
¿Por qué diferir todas las herramientas causa un error 400?
La herramienta de búsqueda de herramientas y al menos otra herramienta deben permanecer sin diferir para que Claude tenga algo con lo que razonar inmediatamente. Diferir la herramienta de búsqueda en sí junto con todo lo demás no deja nada cargado para que el modelo actúe.
¿Debo construir mi propio wrapper de cliente alrededor de una API remota si ya existe un servidor MCP para ella?
Generalmente no. Prefiere el conector MCP (mcp_servers más una entrada mcp_toolset coincidente) en lugar de reimplementar un wrapper del lado del cliente alrededor de la misma capacidad remota; evita duplicar el mantenimiento de algo que el servidor MCP ya maneja.
¿Cambiar tool_choice entre solicitudes afecta mi tasa de aciertos de caché de solicitudes?
No. Las definiciones de herramientas son lo que se renderiza primero en la solicitud y lo que impulsa el nivel de caché de herramientas/sistema; agregar, eliminar o reordenar herramientas lo invalida. Alternar tool_choice por sí solo no lo hace.
¿Por qué debo ordenar una lista de herramientas construida dinámicamente?
Porque las definiciones de herramientas se renderizan primero en la solicitud y cualquier cambio en su orden invalida el nivel de caché de herramientas/sistema. Ordenar por nombre (o por otra clave estable) mantiene el orden serializado idéntico en las solicitudes que usan el mismo conjunto de herramientas, por lo que el almacenamiento en caché sobrevive.
¿Por qué no simplemente verificar tool_use.input con una coincidencia de cadena sin procesar en lugar del objeto analizado del SDK?
Los modelos recientes de Claude pueden escapar Unicode o barras diagonales de manera diferente al generar JSON. Una coincidencia de cadena sin procesar puede pasar por alto un valor que es semánticamente idéntico pero escapado de manera diferente, mientras que el objeto analizado del SDK maneja esa decodificación por ti.
Relacionado
- Conceptos básicos del uso de herramientas - el viaje completo de solicitud/respuesta que asumen estas prácticas
- Definición de esquemas de herramientas con nombre, descripción e input_schema - el análisis profundo detrás de los elementos de diseño de esquemas anteriores
- Referencia de opciones de tool_choice - referencia completa para los cuatro modos de
tool_choice - Construcción de un bucle de uso de herramientas de múltiples turnos - el ejemplo práctico detrás de los elementos de higiene del bucle anteriores
- Ejecución de llamadas a herramientas paralelas en un solo turno - la explicación completa del manejo paralelo de
tool_use - Escalado a cientos de herramientas con la herramienta de búsqueda de herramientas - el análisis profundo detrás del elemento de escalado anterior
Versiones de la pila: Escrito para la línea de modelos de Claude actual a partir de ~junio de 2026: Claude Fable 5, Claude Opus 4.8, Claude Sonnet 5 (el predeterminado) y Claude Haiku 4.5, y el SDK oficial de Python de
anthropic(última versión 0.x). Los nombres de los modelos, las versiones del SDK y los precios cambian rápidamente; verifica los detalles actuales en platform.claude.com/docs antes de confiar en ellos.