BazaarLinkBazaarLink
Đăng nhập
Tài liệuTham chiếu APITham chiếu SDKSử dụng AgentKỹ năng AI
Mục lục

Streaming

Streaming

Đặt stream: true để nhận luồng Server-Sent Events (SSE). Mỗi sự kiện chứa một phần của phản hồi.

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)

Định dạng 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]
Sử dụng trong streaming
Khi streaming, dữ liệu sử dụng được trả về trong phần cuối cùng trước tin nhắn [DONE], cùng với mảng choices có delta rỗng và finish_reason: "stop".

Keep-alive & chunk cuối

Stream có thể chứa dòng chú thích SSE và sự kiện unknown hoặc ping làm keep-alive; hãy bỏ qua và phân tích data frame. Data frame cuối có thể chứa usage trước 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]

Hủy Stream

Yêu cầu streaming có thể bị hủy bằng cách đóng kết nối phía client — ví dụ gọi AbortController.abort() hoặc đóng đối tượng stream. BazaarLink sẽ ngừng chuyển tiếp các chunk tiếp theo và hủy yêu cầu gửi đến nhà cung cấp ngay khi nhận được lệnh hủy.

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();
Không tính phí cho stream bị gián đoạn
Nếu stream kết thúc trước khi chunk usage cuối cùng đến — kể cả khi client chủ động hủy — sẽ không có căn cứ số token đáng tin cậy cho yêu cầu đó, vì vậy BazaarLink hoàn lại toàn bộ khoản đã giữ trước. Bạn không bị tính phí cho nội dung đã gửi tới client trước khi hủy.
Không đảm bảo dừng ngay lập tức ở phía nhà cung cấp
Đóng kết nối khiến BazaarLink ngừng chuyển tiếp và tính phí token ngay lập tức, nhưng việc nhà cung cấp upstream có dừng sinh nội dung trên máy chủ của họ ngay khi kết nối bị ngắt hay không tùy thuộc vào nhà cung cấp đó — một số có thể vẫn xử lý thêm một chút sau khi ngắt kết nối.

Lỗi Giữa Luồng

Khung lỗi không có trường choices
Nếu lỗi xảy ra sau khi streaming đã bắt đầu (ví dụ kết nối upstream bị ngắt), bạn sẽ nhận được một SSE data frame dạng {error:{message,type,code}} thay vì {choices:[...]} thông thường — không có thay đổi trạng thái HTTP vì header đã được gửi. Hãy kiểm tra trường error trước khi đọc choices[0].delta, và chỉ các token đã stream mới bị tính phí (áp dụng tính phí một phần).
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