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 playgroundZet 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]bevatusage, inclusiefcostin USD. Je hebtstream_options.include_usageniet nodig. Gebruiksrapportage staat altijd aan. - De
idis 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: noop nginx) als je de stream doorgeeft aan browsers. - Tool calls worden gestreamd als
delta.tool_calls-fragmenten. Voeg dearguments-strings perindexsamen voordat je ze parset. Zie Tool calling. - Reasoning-modellen streamen hun redenering in
delta.reasoningvóór het antwoord. Zie Reasoning.