BazaarLinkBazaarLink
登入
文件API 參考SDK 參考Agent 應用AI Skills
章節導覽

串流

串流

設定 stream: true 以接收 Server-Sent Events (SSE) 串流。每個事件包含一個回應片段。

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)

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]
串流中的使用量
串流時,使用量資料會在 [DONE] 訊息之前的最後一個區塊中返回,該區塊的 choices 陣列帶有一個空 delta 與 finish_reason: "stop"。

Keep-alive 與收尾行為

串流可能包含 SSE 註解列及未知或 ping keep-alive 事件;請忽略這些內容並解析 data frame。最後一個 data frame 可能在 data: [DONE] 前帶有 usage。

: 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]

串流取消

串流請求可透過關閉客戶端連線來取消 — 例如呼叫 AbortController.abort() 或關閉 stream 物件。BazaarLink 收到取消訊號後會立刻停止轉發後續內容,並中止對上游供應商的請求。

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();
被中斷的串流不收費
如果串流在最後的 usage chunk 抵達前就結束 — 包含客戶端主動取消的情況 — 這筆請求就沒有可信的 token 用量依據,BazaarLink 會全額退還預扣的額度。取消前已送到你客戶端的內容不會計費。
不保證上游立即停止
關閉連線會讓 BazaarLink 立刻停止轉發並停止為後續 token 計費,但上游供應商是否會在自己的伺服器上瞬間停止生成,取決於該供應商本身 — 有些供應商斷線後仍會短暫繼續運算。

串流中途出錯

錯誤幀沒有 choices 欄位
如果串流已經開始後才發生失敗(例如上游連線中斷),您會收到一個 {error:{message,type,code}} 形狀的 SSE 資料幀,而不是平常的 {choices:[...]} —— HTTP 狀態不會改變,因為 header 早就送出了。讀取 choices[0].delta 前請先檢查是否有 error 欄位;計費只會算到已經串流出去的 token(適用部分計費)。
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]
客服
您好!有什麼可以協助?
請留下訊息,我們會盡快回覆。
串流 | BazaarLink