Kami menggunakan cookie. Cookie dan penyimpanan browser menjaga Anda tetap masuk dan mengingat preferensi Anda. Dengan izin Anda, kami juga mengukur cara situs digunakan. Anda dapat kapan saja. Lihat kebijakan cookie kami.

Streaming

Endpoint

Streaming

Stream token lewat server-sent events dengan mengatur stream: true, lengkap dengan format event, usage pada chunk akhir, dan contoh kode.

Coba di playground

Atur stream: true pada Chat completions, Responses, atau Completions untuk menerima token saat token tersebut dihasilkan. Response memakai server-sent events (Content-Type: text/event-stream). api14 meneruskan byte dari upstream kepada Anda begitu tiba, tanpa mem-buffer-nya.

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 event

Setiap event adalah baris data: yang berisi satu chunk JSON. Stream diakhiri dengan 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]
  • Chunk terakhir sebelum [DONE] membawa usage, termasuk cost dalam USD. Anda tidak perlu stream_options.include_usage. Pelaporan pemakaian selalu aktif.
  • id sama di setiap chunk. Itulah generation id yang bisa Anda berikan ke Pencarian generation.
  • Beberapa penyedia mengirim baris komentar SSE (diawali :) untuk menjaga koneksi tetap hidup. Klien SSE dan SDK OpenAI mengabaikannya. Jika Anda mem-parse stream sendiri, lewati baris yang diawali :.

Penagihan untuk stream

Gateway membaca chunk usage terakhir sambil meneruskan stream dan memotong saldo Anda setelah stream ditutup.

Memutus koneksi tidak membatalkan tagihan. Jika Anda menutup koneksi sebelum stream selesai, penyedia upstream mungkin tetap melanjutkan generate dan tetap menagihnya. Dalam kasus itu, api14 membaca biaya dari catatan generation. Untuk membatasi biaya, atur max_tokens.

Error saat stream berlangsung

Error sebelum byte pertama, seperti key tidak valid, saldo tidak cukup, atau model tidak dikenal, mengembalikan error JSON biasa dengan status 4xx atau 5xx. Lihat Error. Jika penyedia gagal di tengah stream, stream bisa berakhir dengan chunk yang berisi objek error dan finish_reason: "error":

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

Selalu periksa finish_reason pada chunk terakhir.

Tips

  • Proxy dan platform serverless terkadang mem-buffer response. Nonaktifkan buffering response (misalnya X-Accel-Buffering: no di nginx) jika Anda meneruskan stream ke browser.
  • Tool call di-stream sebagai fragmen delta.tool_calls. Gabungkan string arguments berdasarkan index sebelum mem-parse-nya. Lihat Tool calling.
  • Model reasoning men-stream proses berpikirnya di delta.reasoning sebelum jawaban. Lihat Reasoning.