Ir al contenido

Streaming

Con "stream": true la respuesta llega por partes (Server-Sent Events), en vez de esperar a que termine entera. Es lo que hace que un chat se sienta rápido.

stream = client.chat.completions.create(
model="colibri",
messages=[{"role": "user", "content": "Cuéntame la historia del cajón peruano"}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)

Cada evento es una línea data: con un trozo en JSON, y el último es data: [DONE]:

data: {"choices":[{"index":0,"delta":{"content":"¡Ho"}}], ...}
data: {"choices":[{"index":0,"delta":{"content":"la!"}}], ...}
data: {"choices":[{"index":0,"delta":{},"finish_reason":"stop"}], ...}
data: {"choices":[],"usage":{"prompt_tokens":8,"completion_tokens":3,"total_tokens":11}}
data: [DONE]

Mientras el modelo piensa pueden llegar líneas de comentario : procesando, que mantienen viva la conexión. Los SDK las ignoran solas; si lees el stream a mano, sáltate toda línea que empiece por :.

En el formato Anthropic (/v1/messages) el streaming sigue la secuencia de eventos de esa API: message_start, content_block_start, content_block_delta, content_block_stop, message_delta y message_stop.