Vi använder cookies. Cookies och webbläsarlagring håller dig inloggad och kommer ihåg dina preferenser. Med ditt tillstånd mäter vi också hur webbplatsen används. Du kan när som helst. Läs vår cookiepolicy.

Streaming

Endpoints

Streaming

Strömma tokens från vilken textmodell som helst med server-sent events genom att sätta stream: true, med exempel på hur du läser strömmen.

Testa i playground

Sätt stream: true på Chat completions, Responses eller Completions för att ta emot tokens i takt med att de genereras. Svaret använder server-sent events (Content-Type: text/event-stream). api14 skickar vidare bytes från uppströmsleverantören till dig när de kommer in och buffrar dem inte.

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

Händelseformat

Varje händelse är en data:-rad med en JSON-chunk. Strömmen avslutas med 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]
  • Den sista chunken före [DONE] innehåller usage, inklusive cost i USD. Du behöver inte stream_options.include_usage. Användningsrapportering är alltid påslagen.
  • id är detsamma i varje chunk. Det är genererings-id:t som du kan skicka till Uppslag av generering.
  • Vissa leverantörer skickar SSE-kommentarsrader (som börjar med :) för att hålla anslutningen vid liv. SSE-klienter och OpenAI-SDK:erna ignorerar dem. Om du parsar strömmen själv, hoppa över rader som börjar med :.

Debitering av strömmar

Gatewayen läser den sista usage-chunken medan strömmen vidarebefordras och drar beloppet från ditt saldo när strömmen stängs.

Att koppla ner avbryter inte debiteringen. Om du stänger anslutningen innan strömmen är klar kan leverantören uppströms fortsätta generera och ändå ta betalt för det. I så fall läser api14 kostnaden från genereringsposten. Sätt max_tokens för att begränsa kostnaden.

Fel under en ström

Fel som uppstår före första byten, som en ogiltig nyckel, för lågt saldo eller en okänd modell, returnerar ett vanligt JSON-fel med en 4xx- eller 5xx-status. Se Fel. Om en leverantör fallerar mitt i strömmen kan strömmen avslutas med en chunk som innehåller ett error-objekt och finish_reason: "error":

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

Kontrollera alltid finish_reason i den sista chunken.

Tips

  • Proxyer och serverlösa plattformar buffrar ibland svar. Stäng av svarsbuffring (t.ex. X-Accel-Buffering: no i nginx) om du vidarebefordrar strömmen till webbläsare.
  • Verktygsanrop strömmas som delta.tool_calls-fragment. Sätt ihop arguments-strängarna per index innan du parsar dem. Se Verktygsanrop.
  • Resonerande modeller strömmar sitt resonemang i delta.reasoning före svaret. Se Resonemang.