Al crear aplicaciones con múltiples herramientas, necesitas manejar escenarios donde Claude podría necesitar llamar a varias herramientas en secuencia para responder a una sola pregunta del usuario. Por ejemplo, si un usuario pregunta "¿Qué día es 103 días a partir de hoy?", Claude necesita primero obtener la fecha actual, y luego sumarle 103 días.

Esto crea un patrón de conversación de múltiples turnos donde Claude realiza múltiples solicitudes de herramientas antes de proporcionar una respuesta final. Tu aplicación necesita manejar esto automáticamente.
El patrón de herramientas de múltiples turnos
Esto es lo que sucede detrás de escena cuando Claude necesita múltiples herramientas:
- El usuario pregunta: "¿Qué día es 103 días a partir de hoy?"
- Claude responde con un bloque de uso de herramientas solicitando
get_current_datetime - Tu servidor llama a la función y devuelve el resultado
- Claude se da cuenta de que necesita más información y solicita
add_duration_to_datetime - Tu servidor llama a esa función y devuelve el resultado
- Claude ahora tiene suficiente información para proporcionar la respuesta final

Construyendo un bucle de conversación
Para manejar este patrón, necesitas un bucle de conversación que continúe hasta que Claude deje de solicitar herramientas:
def run_conversation(messages):
while True:
response = chat(messages)
add_assistant_message(messages, response)
# Pseudocódigo
if response isn't asking for a tool:
break
tool_result_blocks = run_tools(response)
add_user_message(messages, tool_result_blocks)
return messages
Refactorizando funciones auxiliares
Antes de implementar el bucle de conversación, necesitas actualizar tus funciones auxiliares para manejar correctamente múltiples bloques de mensajes.
Actualizando los manejadores de mensajes
Tus funciones add_user_message y add_assistant_message actualmente asumen que siempre estás trabajando con texto plano. Actualízalas para manejar objetos de mensaje completos:
from anthropic.types import Message
def add_user_message(messages, message):
user_message = {
"role": "user",
"content": message.content if isinstance(message, Message) else message
}
messages.append(user_message)Esto te permite pasar ya sea una cadena de texto, una lista de bloques, o un objeto de mensaje completo.
Actualizando la función de chat
Modifica tu función de chat para aceptar una lista de herramientas y devolver el mensaje completo en lugar de solo texto:
def chat(messages, system=None, temperature=1.0, stop_sequences=[], tools=None):
params = {
"model": model,
"max_tokens": 1000,
"messages": messages,
"temperature": temperature,
"stop_sequences": stop_sequences,
}
if tools:
params["tools"] = tools
if system:
params["system"] = system
message = client.messages.create(**params)
return messageExtrayendo texto de los mensajes
Dado que ahora estás devolviendo objetos de mensaje completos, crea un auxiliar para extraer texto cuando sea necesario:
def text_from_message(message):
return "\n".join(
[block.text for block in message.content if block.type == "text"]
)Esta función encuentra todos los bloques de texto en un mensaje y los une, lo cual es útil cuando necesitas mostrar la respuesta final a los usuarios.
Mejoras clave
Estos pasos de refactorización preparan tu código para un manejo robusto de herramientas:
- Manejo flexible de mensajes - Tus funciones auxiliares ahora pueden trabajar con diferentes formatos de mensaje
- Soporte de herramientas en el chat - La función de chat puede recibir y pasar esquemas de herramientas
- Devoluciones de mensajes completos - Obtienes objetos de mensaje completos en lugar de solo texto, preservando todos los bloques
- Utilidad de extracción de texto - Una forma fácil de obtener texto legible de mensajes complejos
Con estos fundamentos en su lugar, estás listo para implementar el bucle de conversación que maneja múltiples llamadas a herramientas automáticamente, creando una experiencia fluida donde Claude puede usar tantas herramientas como sea necesario para responder a las preguntas de los usuarios.