Guias

Respostas com streaming

Server-sent events, formato de chunks e como cancelar uma geração de forma limpa.

Defina stream: true e a resposta se torna um text/event-stream de chunks no formato de streaming do OpenAI. Parsers SSE existentes funcionam sem alterações.

Formato do chunk

Cada evento carrega um delta parcial. O stream termina com um [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]

Consumindo o 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);
}

O flag -N importa para o curl: sem ele a saída é bufferizada e o stream parece uma resposta sem streaming lenta.

Cancelando

Aborte a requisição HTTP. O Stac para a geração assim que a conexão é fechada, liberando essa capacidade para a próxima requisição.

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;
}

Erros no meio do stream

Uma vez que os cabeçalhos da resposta são enviados, o status já é 200, então uma falha após esse ponto só pode chegar como uma conexão quebrada, não como um status de erro HTTP. Trate um stream que termina sem um evento [DONE] como uma falha e retente a requisição do zero — não existe retomar parcialmente.