Endpoints
Streaming
Recibe los tokens a medida que se generan con server-sent events activando stream: true, y aprende el formato de los eventos, el uso y los errores.
Pruébalo en el playgroundActiva stream: true en Chat completions, Responses o Completions para recibir los tokens a medida que se generan. La respuesta usa server-sent events (Content-Type: text/event-stream). api14 te reenvía los bytes del upstream en cuanto llegan, sin almacenarlos en búfer.
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 de los eventos
Cada evento es una línea data: que contiene un fragmento JSON. El stream termina con 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]
- El último fragmento antes de
[DONE]incluyeusage, concosten USD. No necesitasstream_options.include_usage: el informe de uso está siempre activado. - El
ides el mismo en todos los fragmentos. Es el id de generación que puedes pasar a Consulta de generaciones. - Algunos proveedores envían líneas de comentario SSE (que empiezan por
:) para mantener viva la conexión. Los clientes SSE y los SDK de OpenAI las ignoran. Si procesas el stream tú mismo, omite las líneas que empiezan por:.
Facturación de los streams
La pasarela lee el fragmento final de usage mientras reenvía el stream y descuenta el importe de tu saldo cuando el stream se cierra.
Desconectarte no cancela el cargo. Si cierras la conexión antes de que termine el stream, el proveedor upstream puede seguir generando y cobrarlo igualmente. En ese caso, api14 obtiene el coste del registro de la generación. Para limitar el coste, fija max_tokens.
Errores durante un stream
Los errores anteriores al primer byte, como una clave no válida, un saldo insuficiente o un modelo desconocido, devuelven un error JSON normal con un estado 4xx o 5xx. Consulta Errores. Si un proveedor falla a mitad del stream, este puede terminar con un fragmento que contiene un objeto error y finish_reason: "error":
{ "error": { "code": 502, "message": "Provider disconnected" }, "choices": [{ "delta": { "content": "" }, "finish_reason": "error" }] }
Comprueba siempre finish_reason en el último fragmento.
Consejos
- Los proxies y las plataformas serverless a veces almacenan las respuestas en búfer. Desactiva el búfer de respuesta (p. ej.
X-Accel-Buffering: noen nginx) si reenvías el stream a navegadores. - Las llamadas a herramientas llegan como fragmentos de
delta.tool_calls. Une los strings deargumentsporindexantes de procesarlos. Consulta Llamadas a herramientas. - Los modelos de razonamiento transmiten su razonamiento en
delta.reasoningantes de la respuesta. Consulta Razonamiento.