Guías

Respuestas con streaming

Eventos enviados por el servidor, formato de fragmentos y cómo cancelar una generación de forma limpia.

Establece stream: true y la respuesta se convierte en un text/event-stream de fragmentos en el formato de streaming de OpenAI. Los analizadores SSE existentes funcionan sin cambios.

Formato de fragmentos

Cada evento incluye un delta parcial. El stream termina con un [DONE] literal.

stream.txt
data: {"id":"cmpl_9f2a1c","choices":[{"delta":{"role":"assistant"},"index":0}]}
 
data: {"id":"cmpl_9f2a1c","choices":[{"delta":{"content":"Reserved"},"index":0}]}
 
data: {"id":"cmpl_9f2a1c","choices":[{"delta":{"content":" capacity"},"index":0}]}
 
data: {"id":"cmpl_9f2a1c","choices":[{"delta":{},"index":0,"finish_reason":"stop"}]}
 
data: [DONE]

Consumir el stream

stream.tstypescript
const stream = await client.chat.completions.create({
  model: "stac-1",
  messages,
  stream: true,
});
 
for await (const chunk of stream) {
  const delta = chunk.choices[0]?.delta?.content;
  if (delta) process.stdout.write(delta);
}

El flag -N es importante para curl: sin él, la salida se almacena en buffer y el stream parece una respuesta sin streaming lenta.

Cancelar

Aborta la solicitud HTTP. Stac detiene la generación tan pronto como la conexión se cierra, liberando esa capacidad para la siguiente solicitud.

cancel.tstypescript
const controller = new AbortController();
setTimeout(() => controller.abort(), 5000);
 
try {
  const stream = await client.chat.completions.create(
    { model: "stac-1", messages, stream: true },
    { signal: controller.signal }
  );
} catch (error) {
  if (error.name === "AbortError") return;
  throw error;
}

Errores durante el stream

Una vez enviados los encabezados de la respuesta, el estado ya es 200, así que un fallo posterior solo puede llegar como una conexión rota, no como un código de error HTTP. Trata un stream que termina sin un evento [DONE] como un fallo y reintenta la solicitud desde cero: no existe reanudación parcial.