Usamos cookies. Las cookies y el almacenamiento del navegador mantienen tu sesión iniciada y recuerdan tus preferencias. Con tu permiso, también medimos cómo se usa el sitio. Puedes en cualquier momento. Consulta nuestra política de cookies.

Streaming

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 playground

Activa 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] incluye usage, con cost en USD. No necesitas stream_options.include_usage: el informe de uso está siempre activado.
  • El id es 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: no en nginx) si reenvías el stream a navegadores.
  • Las llamadas a herramientas llegan como fragmentos de delta.tool_calls. Une los strings de arguments por index antes de procesarlos. Consulta Llamadas a herramientas.
  • Los modelos de razonamiento transmiten su razonamiento en delta.reasoning antes de la respuesta. Consulta Razonamiento.