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 playgroundUstaw 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]zawierausage, w tymcostw USD. Nie potrzebujeszstream_options.include_usage. Raportowanie użycia jest zawsze włączone. idjest 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: now nginx), jeśli przekazujesz strumień do przeglądarek. - Wywołania narzędzi są strumieniowane jako fragmenty
delta.tool_calls. Przed parsowaniem połącz stringiargumentswedługindex. Zobacz Tool calling. - Modele rozumujące strumieniują swoje rozumowanie w
delta.reasoningprzed odpowiedzią. Zobacz Reasoning.