Streaming y conversaciones multiturno
- Transmitir respuestas en streaming token a token para que los usuarios vean la salida de inmediato
- Entender por qué la API es sin estado y cómo llevar tú mismo el historial de la conversación
- Continuar una conversación multiturno reenviando todo el intercambio previo
- Evitar que las conversaciones largas disparen la ventana de contexto y el coste
Crear experiencias tipo chat con la API se reduce a dos realidades prácticas: usa streaming para que los usuarios vean la salida de inmediato, y gestiona tú mismo el historial porque la API es sin estado. Domina ambas y tu UX de chat se sentirá rápida y lo recordará todo.
Streaming
Sin streaming, el usuario espera a la respuesta completa. Con streaming, los tokens llegan a medida que se generan, lo que da una velocidad percibida mucho mejor.
- Usa el ayudante de streaming del SDK en lugar de analizar los eventos crudos a mano: gestiona por ti el ciclo de vida de los eventos.
- Python
- TypeScript
with client.messages.stream(
model="claude-sonnet-5", max_tokens=1024,
messages=[{"role": "user", "content": "Explain RAG in two sentences."}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
const stream = client.messages.stream({
model: "claude-sonnet-5", max_tokens: 1024,
messages: [{ role: "user", content: "Explain RAG in two sentences." }],
});
for await (const event of stream) {
if (event.type === "content_block_delta") process.stdout.write(event.delta.text ?? "");
}
Multiturno: tú gestionas el historial
La API no tiene memoria entre llamadas (por qué). Para continuar una conversación, vuelve a enviar todo el intercambio previo cada vez.
Guided walkthrough1 of 4
- Envía el primer mensaje del usuario en la lista de mensajes.
- Lee el texto de la respuesta del asistente desde el resultado.
- Agrega la respuesta del asistente y el siguiente mensaje del usuario a la misma lista de mensajes.
- Envía de nuevo la lista de mensajes completa: así es como Claude 'recuerda' el intercambio.
messages = [{"role": "user", "content": "Hi, I'm planning a trip."}]
# ... get assistant reply, then append both turns:
messages.append({"role": "assistant", "content": assistant_text})
messages.append({"role": "user", "content": "Make it 3 days."})
# send the full `messages` list again
Las conversaciones largas llenan la ventana
A medida que crece el historial, consume la ventana de contexto y el coste aumenta. Estrategias para mantenerlo bajo control:
- Resume/compacta los turnos más antiguos en un breve recordatorio que arrastres hacia adelante.
- Recorta los turnos anteriores irrelevantes.
- Combínalo con la caché de prompts para evitar volver a pagar por un prefijo estable.
- Cada llamada reenvía todo el historial: las conversaciones largas cuestan más y, con el tiempo, pueden superar la ventana de contexto si nunca compactas ni recortas.
- Transmite tokens en streaming para una velocidad percibida rápida; el ayudante del SDK gestiona el ciclo de vida de los eventos.
- La API es sin estado: no tiene memoria entre llamadas.
- Continúa una conversación añadiendo cada turno y reenviando la lista de mensajes completa.
- Compacta, recorta y usa caché para controlar el coste y el tamaño de las conversaciones largas.