Usamos cookies. Cookies e o armazenamento do navegador mantêm você conectado e lembram suas preferências. Com sua permissão, também medimos como o site é usado. Você pode a qualquer momento. Veja nossa política de cookies.

Streaming

Endpoints

Streaming

Receba tokens em tempo real com server-sent events definindo stream: true, e veja como ler os chunks, tratar erros e encerrar a conexão corretamente.

Teste no playground

Defina stream: true em Chat completions, Responses ou Completions para receber os tokens à medida que são gerados. A resposta usa server-sent events (Content-Type: text/event-stream). O api14 repassa os bytes do upstream para você conforme chegam, sem bufferizá-los.

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api14.com/api/v1",
  apiKey: process.env.API14_API_KEY,
});

const stream = await client.chat.completions.create({
  "model": "openai/gpt-5-mini",
  "messages": [
    {
      "role": "user",
      "content": "Explain vector databases in two sentences."
    }
  ],
  "stream": true
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}

Formato dos eventos

Cada evento é uma linha data: contendo um chunk JSON. O stream termina com data: [DONE].

data: {"id":"gen-1760000000-abc","object":"chat.completion.chunk","model":"openai/gpt-5-mini","choices":[{"index":0,"delta":{"role":"assistant","content":"Hel"}}]}

data: {"id":"gen-1760000000-abc","object":"chat.completion.chunk","model":"openai/gpt-5-mini","choices":[{"index":0,"delta":{"content":"lo!"}}]}

data: {"id":"gen-1760000000-abc","object":"chat.completion.chunk","model":"openai/gpt-5-mini","choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":{"prompt_tokens":10,"completion_tokens":3,"total_tokens":13,"cost":0.0000085}}

data: [DONE]
  • O último chunk antes de [DONE] traz usage, incluindo cost em USD. Você não precisa de stream_options.include_usage. O relatório de uso está sempre ativo.
  • O id é o mesmo em todos os chunks. É o id da geração, que você pode passar para a Consulta de geração.
  • Alguns provedores enviam linhas de comentário SSE (que começam com :) para manter a conexão ativa. Clientes SSE e os SDKs da OpenAI as ignoram. Se você mesmo fizer o parsing do stream, pule as linhas que começam com :.

Cobrança de streams

O gateway lê o chunk final de usage enquanto encaminha o stream e debita seu saldo assim que o stream é encerrado.

Desconectar não cancela a cobrança. Se você fechar a conexão antes de o stream terminar, o provedor upstream pode continuar gerando e cobrar mesmo assim. Nesse caso, o api14 lê o custo a partir do registro da geração. Para limitar o custo, defina max_tokens.

Erros durante um stream

Erros antes do primeiro byte, como uma chave inválida, saldo baixo ou um modelo desconhecido, retornam um erro JSON normal com status 4xx ou 5xx. Veja Erros. Se um provedor falhar no meio do stream, ele pode terminar com um chunk que contém um objeto error e finish_reason: "error":

{ "error": { "code": 502, "message": "Provider disconnected" }, "choices": [{ "delta": { "content": "" }, "finish_reason": "error" }] }

Sempre verifique o finish_reason no último chunk.

Dicas

  • Proxies e plataformas serverless às vezes bufferizam as respostas. Desative o buffering de resposta (ex.: X-Accel-Buffering: no no nginx) se você repassar o stream para navegadores.
  • Chamadas de ferramentas chegam no stream como fragmentos delta.tool_calls. Junte as strings arguments por index antes de fazer o parsing. Veja Chamada de ferramentas.
  • Modelos de raciocínio transmitem seu raciocínio em delta.reasoning antes da resposta. Veja Raciocínio.