Al crear aplicaciones con múltiples herramientas, necesitas manejar escenarios en los que 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 en el que 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)
# Pseudo code
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án 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 el 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 la función de chat ahora devuelve mensajes completos en lugar de solo texto, agrega un auxiliar para extraer el 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.
Por qué importan estos cambios
Estos pasos de refactorización preparan tu código para la realidad de las conversaciones habilitadas con herramientas:
- Múltiples bloques por mensaje - Las respuestas de Claude pueden contener tanto bloques de texto como bloques de uso de herramientas
- Manejo flexible de mensajes - Tus funciones ahora pueden trabajar con varios formatos de mensaje
- Preservación completa del mensaje - Mantienes toda la información que Claude proporciona, no solo las partes de texto
- Soporte de lista de herramientas - Tu función de chat ahora puede recibir y usar múltiples herramientas
Con estos fundamentos en su lugar, estás listo para implementar el bucle de conversación completo que maneja múltiples llamadas a herramientas automáticamente, creando una experiencia fluida en la que Claude puede usar cualquier herramienta que necesite para responder completamente a las preguntas de los usuarios.