Używamy plików cookie. Pliki cookie i pamięć przeglądarki pozwalają utrzymać logowanie i zapamiętać Twoje preferencje. Za Twoją zgodą mierzymy też, jak korzystasz ze strony. W każdej chwili możesz . Zobacz naszą politykę cookie.

Streaming

Endpointy

Streaming

Strumieniuj tokeny odpowiedzi przez server-sent events, ustawiając stream: true, i poznaj format zdarzeń oraz sposób odczytu zużycia.

Wypróbuj w playground

Ustaw stream: true w Chat completions, Responses lub Completions, aby otrzymywać tokeny na bieżąco, w miarę ich generowania. Odpowiedź korzysta z server-sent events (Content-Type: text/event-stream). api14 przekazuje ci bajty z upstream od razu, gdy nadchodzą, i ich nie buforuje.

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

Format zdarzeń

Każde zdarzenie to linia data: zawierająca fragment (chunk) JSON. Strumień kończy się linią 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]
  • Ostatni chunk przed [DONE] zawiera usage, w tym cost w USD. Nie potrzebujesz stream_options.include_usage. Raportowanie użycia jest zawsze włączone.
  • id jest taki sam w każdym chunku. To identyfikator generacji, który możesz przekazać do Wyszukiwania generacji.
  • Niektórzy dostawcy wysyłają linie komentarzy SSE (zaczynające się od :), aby utrzymać połączenie. Klienty SSE i SDK OpenAI je ignorują. Jeśli parsujesz strumień samodzielnie, pomijaj linie zaczynające się od :.

Rozliczanie strumieni

Bramka odczytuje końcowy chunk usage podczas przekazywania strumienia i pobiera kwotę z twojego salda po jego zamknięciu.

Rozłączenie nie anuluje opłaty. Jeśli zamkniesz połączenie, zanim strumień się zakończy, dostawca upstream może dalej generować i nadal za to naliczyć opłatę. W takim przypadku api14 odczytuje koszt z rekordu generacji. Aby ograniczyć koszt, ustaw max_tokens.

Błędy w trakcie strumienia

Błędy przed pierwszym bajtem, takie jak nieprawidłowy klucz, zbyt niskie saldo czy nieznany model, zwracają zwykły błąd JSON ze statusem 4xx lub 5xx. Zobacz Błędy. Jeśli dostawca zawiedzie w połowie strumienia, strumień może zakończyć się chunkiem zawierającym obiekt error i finish_reason: "error":

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

Zawsze sprawdzaj finish_reason w ostatnim chunku.

Wskazówki

  • Proxy i platformy serverless czasem buforują odpowiedzi. Wyłącz buforowanie odpowiedzi (np. X-Accel-Buffering: no w nginx), jeśli przekazujesz strumień do przeglądarek.
  • Wywołania narzędzi są strumieniowane jako fragmenty delta.tool_calls. Przed parsowaniem połącz stringi arguments według index. Zobacz Tool calling.
  • Modele rozumujące strumieniują swoje rozumowanie w delta.reasoning przed odpowiedzią. Zobacz Reasoning.