Referencia
Streaming
Recibir la respuesta mientras se genera (Server-Sent Events).
Con "stream": true la respuesta llega en trozos mientras se genera, como en el chat de Sabiuco. Es lo recomendable para interfaces conversacionales: la primera palabra aparece en menos de un segundo.
La respuesta usa Server-Sent Events (Content-Type: text/event-stream): cada trozo es una línea data: {…} seguida de una línea en blanco, y el final se marca con data: [DONE].
Ejemplo con curl
curl -N https://sabiuco.app/api/v1/chat/completions \
-H "Authorization: Bearer $SABIUCO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "sabiuco",
"stream": true,
"stream_options": { "include_usage": true },
"messages": [{ "role": "user", "content": "Escribe un haiku sobre el mar." }]
}'Qué llega
data: {"id":"chatcmpl-hx…","object":"chat.completion.chunk","model":"sabiuco","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
data: {"id":"chatcmpl-hx…","object":"chat.completion.chunk","model":"sabiuco","choices":[{"index":0,"delta":{"content":"Olas "},"finish_reason":null}]}
data: {"id":"chatcmpl-hx…","object":"chat.completion.chunk","model":"sabiuco","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: {"id":"chatcmpl-hx…","object":"chat.completion.chunk","model":"sabiuco","choices":[],"usage":{"prompt_tokens":262,"completion_tokens":44,"total_tokens":306,"completion_tokens_details":{"reasoning_tokens":30}}}
data: [DONE]- El primer trozo trae
role: "assistant"y el contenido vacío. - Los siguientes traen el texto en
choices[0].delta.content: ve concatenándolos. - El penúltimo trae
finish_reason. - Si pediste
include_usage, llega un trozo conchoicesvacío y el consumo enusage. data: [DONE]cierra la respuesta.
Mientras el modelo razona, o si pasa un rato sin texto nuevo, llega cada 15 segundos una línea de comentario, : ok. Sirve para mantener abierta la conexión; las librerías de OpenAI la ignoran y, si lees el flujo a mano, basta con saltar las líneas que empiezan por :.
Mientras el modelo razona puede pasar un rato sin trozos de texto: es normal, el razonamiento no se envía. Si quieres que empiece a escribir al instante, usa sabiuco-rapido o reasoning_effort: "none".
Python
stream = cliente.chat.completions.create(
model="sabiuco",
messages=[{"role": "user", "content": "Escribe un haiku sobre el mar."}],
stream=True,
)
for trozo in stream:
if trozo.choices and trozo.choices[0].delta.content:
print(trozo.choices[0].delta.content, end="", flush=True)JavaScript
const stream = await cliente.chat.completions.create({
model: "sabiuco",
messages: [{ role: "user", content: "Escribe un haiku sobre el mar." }],
stream: true,
})
for await (const trozo of stream) {
process.stdout.write(trozo.choices[0]?.delta?.content ?? "")
}Errores a mitad de respuesta
Si la generación se corta cuando ya ha empezado, recibirás un último evento de error antes de que se cierre la conexión:
data: {"error":{"message":"La respuesta se ha cortado. Inténtalo de nuevo.","type":"api_error","code":"stream_interrupted"}}Si cierras la conexión antes de terminar, la generación se detiene y solo se contabiliza lo generado hasta entonces.