We gebruiken cookies. Cookies en browseropslag houden je ingelogd en onthouden je voorkeuren. Met je toestemming meten we ook hoe de site wordt gebruikt. Je kunt je wanneer je wilt. Zie ons cookiebeleid.

Streaming

Endpoints

Streaming

Stream tokens met server-sent events door stream: true in te stellen: eventformaat, usage in de laatste chunk, annuleren en veelvoorkomende problemen.

Probeer het in de playground

Zet stream: true bij Chat completions, Responses of Completions om tokens te ontvangen terwijl ze worden gegenereerd. De response gebruikt server-sent events (Content-Type: text/event-stream). api14 geeft de upstream-bytes direct aan je door zodra ze binnenkomen en buffert ze niet.

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 ?? "");
}

Eventformaat

Elk event is een data:-regel met een JSON-chunk. De stream eindigt met 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]
  • De laatste chunk vóór [DONE] bevat usage, inclusief cost in USD. Je hebt stream_options.include_usage niet nodig. Gebruiksrapportage staat altijd aan.
  • De id is in elke chunk hetzelfde. Het is de generatie-id die je kunt doorgeven aan Generatie opzoeken.
  • Sommige providers sturen SSE-commentaarregels (die met : beginnen) om de verbinding open te houden. SSE-clients en de OpenAI-SDK's negeren ze. Parse je de stream zelf, sla dan regels over die met : beginnen.

Facturering van streams

De gateway leest de laatste usage-chunk terwijl hij de stream doorstuurt, en schrijft het bedrag van je saldo af zodra de stream sluit.

Verbreken annuleert de rekening niet. Sluit je de verbinding voordat de stream klaar is, dan kan de upstream-provider gewoon doorgaan met genereren en dat alsnog in rekening brengen. In dat geval leest api14 de kosten uit het generatierecord. Wil je de kosten beperken, stel dan max_tokens in.

Fouten tijdens een stream

Fouten vóór de eerste byte, zoals een ongeldige key, een te laag saldo of een onbekend model, geven een gewone JSON-fout terug met een 4xx- of 5xx-status. Zie Fouten. Faalt een provider halverwege de stream, dan kan de stream eindigen met een chunk die een error-object en finish_reason: "error" bevat:

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

Controleer altijd finish_reason in de laatste chunk.

Tips

  • Proxy's en serverless platforms bufferen responses soms. Schakel response-buffering uit (bijv. X-Accel-Buffering: no op nginx) als je de stream doorgeeft aan browsers.
  • Tool calls worden gestreamd als delta.tool_calls-fragmenten. Voeg de arguments-strings per index samen voordat je ze parset. Zie Tool calling.
  • Reasoning-modellen streamen hun redenering in delta.reasoning vóór het antwoord. Zie Reasoning.