Wir verwenden Cookies. Cookies und Browserspeicher halten Sie angemeldet und merken sich Ihre Einstellungen. Mit Ihrer Zustimmung messen wir außerdem, wie die Website genutzt wird. Sie können jederzeit . Siehe unsere Cookie-Richtlinie.

Streaming

Endpunkte

Streaming

Streamen Sie Tokens per Server-Sent Events, indem Sie stream: true setzen: Eventformat, Nutzungsdaten im letzten Chunk, Abbruch und Fehlerbehandlung.

Im Playground testen

Setzen 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ält usage, einschließlich cost in USD. Sie brauchen stream_options.include_usage nicht. Die Nutzungsmeldung ist immer aktiv.
  • Die id ist 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: no bei nginx), wenn Sie den Stream an Browser weiterreichen.
  • Tool-Calls werden als delta.tool_calls-Fragmente gestreamt. Fügen Sie die arguments-Strings anhand von index zusammen, bevor Sie sie parsen. Siehe Tool Calling.
  • Reasoning-Modelle streamen ihr Reasoning in delta.reasoning vor der Antwort. Siehe Reasoning.