Cargando

Conversaciones de múltiples turnos con herramientas

Lección 2610 min

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:

  1. El usuario pregunta: "¿Qué día es 103 días a partir de hoy?"
  2. Claude responde con un bloque de uso de herramientas solicitando get_current_datetime
  3. Tu servidor llama a la función y devuelve el resultado
  4. Claude se da cuenta de que necesita más información y solicita add_duration_to_datetime
  5. Tu servidor llama a esa función y devuelve el resultado
  6. 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:

python
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:

python
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:

python
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 message

Extrayendo texto de los mensajes

Dado que ahora estás devolviendo objetos de mensaje completos, crea un auxiliar para extraer texto cuando sea necesario:

python
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.