BazaarLinkBazaarLink
Masuk
DokumentasiReferensi APIReferensi SDKPenggunaan AgentikSkill AI
Daftar isi

Streaming

Streaming

Atur stream: true untuk menerima stream Server-Sent Events (SSE). Setiap event berisi potongan respons.

from openai import OpenAI

client = OpenAI(
    base_url="https://api.bazaarlink.ai/v1",
    api_key="sk-bl-YOUR_API_KEY",
)

stream = client.chat.completions.create(
    model="anthropic/claude-sonnet-4.6",
    messages=[{"role": "user", "content": "Count to 10 slowly."}],
    stream=True,
)

for chunk in stream:
    content = chunk.choices[0].delta.content
    if content:
        print(content, end="", flush=True)

Format SSE

data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":"Hello"},"index":0}]}

data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":" world"},"index":0}]}

data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{"prompt_tokens":10,"completion_tokens":4,"total_tokens":14}}

data: [DONE]
Penggunaan dalam streaming
Saat streaming, data penggunaan dikembalikan dalam potongan terakhir sebelum pesan [DONE], bersama array choices dengan delta kosong dan finish_reason: "stop".

Keep-alive & chunk terakhir

Stream dapat berisi baris komentar SSE dan event unknown atau ping sebagai keep-alive. Abaikan dan parse data frame; data frame terakhir dapat memuat usage sebelum data: [DONE].

: keepalive          <- SSE comment line — ignore, do NOT JSON.parse

data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":"Hi"},"index":0}]}

data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{...}}

data: [DONE]

Pembatalan Stream

Permintaan streaming dapat dibatalkan dengan menutup koneksi klien — misalnya memanggil AbortController.abort() atau menutup objek stream. BazaarLink berhenti meneruskan chunk berikutnya dan membatalkan permintaan ke provider segera setelah pembatalan diterima.

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.bazaarlink.ai/v1",
  apiKey: "sk-bl-YOUR_API_KEY",
});

const controller = new AbortController();

const stream = await client.chat.completions.create(
  {
    model: "anthropic/claude-sonnet-4.6",
    messages: [{ role: "user", content: "Write a long story." }],
    stream: true,
  },
  { signal: controller.signal }
);

for await (const chunk of stream) {
  const content = chunk.choices[0]?.delta?.content;
  if (content) process.stdout.write(content);
}

// e.g. on a "Stop" button click:
controller.abort();
Tidak ada biaya untuk stream yang terputus
Jika stream berakhir sebelum chunk usage terakhir tiba — termasuk pembatalan dari sisi klien — tidak ada data jumlah token yang valid untuk permintaan tersebut, sehingga BazaarLink mengembalikan penuh reservasi. Anda tidak dikenakan biaya untuk konten yang sudah terkirim ke klien sebelum pembatalan.
Tidak dijamin langsung berhenti di sisi provider
Menutup koneksi langsung menghentikan BazaarLink dari meneruskan dan menagih token berikutnya, tetapi apakah provider upstream benar-benar menghentikan generasi di server mereka sendiri saat koneksi terputus tergantung pada provider tersebut — beberapa mungkin masih memproses sebentar setelah terputus.

Error di Tengah Stream

Tidak ada field choices pada frame error
Jika terjadi kegagalan setelah streaming sudah dimulai (mis. koneksi upstream terputus), Anda akan menerima SSE data frame berbentuk {error:{message,type,code}} alih-alih {choices:[...]} yang biasa — tanpa perubahan status HTTP, karena header sudah terkirim. Periksa field error sebelum membaca choices[0].delta, dan hanya token yang sudah di-stream yang ditagih (berlaku billing parsial).
data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":"The capital of "},"index":0}]}

data: {"error":{"message":"The request could not be completed.","type":"upstream_error","code":502}}

data: [DONE]
Support
Hi! How can we help you?
Send a message and we'll get back to you soon.
Streaming | BazaarLink