SabiucoAPI

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

Bash
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

Texto
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]
  1. El primer trozo trae role: "assistant" y el contenido vacío.
  2. Los siguientes traen el texto en choices[0].delta.content: ve concatenándolos.
  3. El penúltimo trae finish_reason.
  4. Si pediste include_usage, llega un trozo con choices vacío y el consumo en usage.
  5. 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

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

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:

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