Endpunkte
Streaming
Streamen Sie Tokens per Server-Sent Events, indem Sie stream: true setzen: Eventformat, Nutzungsdaten im letzten Chunk, Abbruch und Fehlerbehandlung.
Im Playground testenSetzen Sie stream: true bei Chat Completions, Responses oder Completions, um Tokens zu erhalten, sobald sie generiert werden. Die Antwort verwendet Server-Sent Events (Content-Type: text/event-stream). api14 reicht die Upstream-Bytes direkt beim Eintreffen an Sie durch und puffert sie nicht.
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 ?? "");
}
Event-Format
Jedes Event ist eine data:-Zeile mit einem JSON-Chunk. Der Stream endet mit 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]
- Der letzte Chunk vor
[DONE]enthältusage, einschließlichcostin USD. Sie brauchenstream_options.include_usagenicht. Die Nutzungsmeldung ist immer aktiv. - Die
idist in jedem Chunk gleich. Es ist die Generation-ID, die Sie an die Generation-Abfrage übergeben können. - Manche Anbieter senden SSE-Kommentarzeilen (beginnend mit
:), um die Verbindung offen zu halten. SSE-Clients und die OpenAI-SDKs ignorieren sie. Wenn Sie den Stream selbst parsen, überspringen Sie Zeilen, die mit:beginnen.
Abrechnung bei Streams
Das Gateway liest beim Weiterleiten des Streams den abschließenden usage-Chunk und bucht den Betrag von Ihrem Guthaben ab, sobald der Stream geschlossen ist.
Ein Verbindungsabbruch storniert die Rechnung nicht. Wenn Sie die Verbindung schließen, bevor der Stream fertig ist, kann der Upstream-Anbieter weiter generieren und das trotzdem berechnen. In diesem Fall liest api14 die Kosten aus dem Generation-Eintrag. Um die Kosten zu begrenzen, setzen Sie max_tokens.
Fehler während eines Streams
Fehler vor dem ersten Byte, etwa ein ungültiger Schlüssel, zu wenig Guthaben oder ein unbekanntes Modell, liefern einen normalen JSON-Fehler mit einem 4xx- oder 5xx-Status. Siehe Fehler. Fällt ein Anbieter mitten im Stream aus, kann der Stream mit einem Chunk enden, der ein error-Objekt und finish_reason: "error" enthält:
{ "error": { "code": 502, "message": "Provider disconnected" }, "choices": [{ "delta": { "content": "" }, "finish_reason": "error" }] }
Prüfen Sie immer finish_reason im letzten Chunk.
Tipps
- Proxys und Serverless-Plattformen puffern Antworten manchmal. Deaktivieren Sie das Response-Buffering (z. B.
X-Accel-Buffering: nobei nginx), wenn Sie den Stream an Browser weiterreichen. - Tool-Calls werden als
delta.tool_calls-Fragmente gestreamt. Fügen Sie diearguments-Strings anhand vonindexzusammen, bevor Sie sie parsen. Siehe Tool Calling. - Reasoning-Modelle streamen ihr Reasoning in
delta.reasoningvor der Antwort. Siehe Reasoning.