Cargando

Al construir aplicaciones de chat con Claude, existe un desafío significativo de experiencia de usuario: las respuestas pueden tardar de 10 a 30 segundos en generarse, dejando a los usuarios mirando un indicador de carga. La solución es el streaming de respuestas, que permite a los usuarios ver el texto aparecer fragmento por fragmento mientras Claude lo genera, creando una sensación mucho más receptiva.

El problema con las respuestas estándar

En una configuración de chat típica, tu servidor envía un mensaje de usuario a Claude y espera la respuesta completa antes de enviar algo al cliente. Esto crea un retraso incómodo en el que los usuarios no tienen ninguna señal de que algo esté sucediendo.

Cómo funciona el streaming

Con el streaming habilitado, Claude envía inmediatamente una respuesta inicial indicando que ha recibido tu solicitud y está comenzando a generar texto. Luego recibes una serie de eventos, cada uno conteniendo una pequeña parte de la respuesta general.

Tu servidor puede reenviar estos fragmentos de texto a tu aplicación cliente a medida que llegan, permitiendo que los usuarios vean la respuesta construirse palabra por palabra. Todos estos eventos son parte de una única solicitud a Claude.

Entendiendo los eventos de stream

Cuando habilitas el streaming, Claude envía varios tipos de eventos:

  • MessageStart - Se está enviando un nuevo mensaje
  • ContentBlockStart - Inicio de un nuevo bloque que contiene texto, uso de herramientas u otro contenido
  • ContentBlockDelta - Fragmentos del texto generado real
  • ContentBlockStop - El bloque de contenido actual se ha completado
  • MessageDelta - El mensaje actual está completo
  • MessageStop - Fin de la información sobre el mensaje actual

Los eventos ContentBlockDelta contienen el texto generado real que querrás mostrar a los usuarios.

Implementación básica de streaming

Para habilitar el streaming, agrega stream=True a tu llamada messages.create:

python
messages = []
add_user_message(messages, "Write a 1 sentence description of a fake database")

stream = client.messages.create(
    model=model,
    max_tokens=1000,
    messages=messages,
    stream=True
)

for event in stream:
    print(event)

Streaming de texto simplificado

En lugar de analizar manualmente los eventos, puedes usar la interfaz de streaming simplificada del SDK que extrae solo el contenido de texto:

python
with client.messages.stream(
    model=model,
    max_tokens=1000,
    messages=messages
) as stream:
    for text in stream.text_stream:
        print(text, end="")

Este enfoque filtra automáticamente todo excepto el contenido de texto real, que es generalmente lo que necesitas para mostrar respuestas a los usuarios.

Obteniendo el mensaje completo

Aunque el streaming de fragmentos individuales es excelente para la experiencia del usuario, a menudo necesitas el mensaje completo para almacenamiento o procesamiento adicional. Después de que el streaming se complete, puedes obtener el mensaje final ensamblado:

python
with client.messages.stream(
    model=model,
    max_tokens=1000,
    messages=messages
) as stream:
    for text in stream.text_stream:
        # Envía cada fragmento a tu cliente
        pass
    
    # Obtén el mensaje completo para almacenarlo en la base de datos
    final_message = stream.get_final_message()

Esto te da lo mejor de ambos mundos: streaming en tiempo real para los usuarios y un objeto de mensaje completo para la lógica de tu aplicación.