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.
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]usage está ausente en todos los fragmentos excepto en el último, y solo
aparece si envías stream_options: { "include_usage": true }.
Consumir el stream
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);
}stream = client.chat.completions.create(
model="stac-1",
messages=messages,
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)curl -N "https://api.trystac.com/v1/chat/completions" \
-H "Authorization: Bearer $STAC_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "model": "your-stack-model", "messages": [...], "stream": true }'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.
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;
}Dejar de leer sin abortar deja la generación ejecutándose hasta su completación sin necesidad. Siempre aborta.
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.

