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 playgroundDefina 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]trazusage, incluindocostem USD. Você não precisa destream_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: nono nginx) se você repassar o stream para navegadores. - Chamadas de ferramentas chegam no stream como fragmentos
delta.tool_calls. Junte as stringsargumentsporindexantes de fazer o parsing. Veja Chamada de ferramentas. - Modelos de raciocínio transmitem seu raciocínio em
delta.reasoningantes da resposta. Veja Raciocínio.