章節導覽
串流
串流
設定 stream: true 以接收 Server-Sent Events (SSE) 串流。每個事件包含一個回應片段。
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 收到取消訊號後會立刻停止轉發後續內容,並中止對上游供應商的請求。
被中斷的串流不收費
如果串流在最後的 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]