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

Tài liệu BazaarLink

BazaarLink là cổng API AI thống nhất cho Đài Loan — cung cấp truy cập đến hàng trăm mô hình từ OpenAI, Anthropic, Google, Meta và nhiều hơn nữa qua một endpoint API tương thích OpenAI.

Tệp kỹ năng AI Agent
Tải tệp kỹ năng vào trợ lý AI (Claude, Cursor, Copilot...) để cung cấp kiến thức đầy đủ về API BazaarLink:
Read https://bazaarlink.ai/skill.md and follow the instructions to integrate BazaarLink into your app.
Mô hình miễn phí & giới hạn tốc độ
Cần thông tin về mô hình miễn phí, giới hạn yêu cầu mỗi phút và tín dụng miễn phí? Xem Giới hạn tốc độ · Câu hỏi thường gặp

Bảng giá

BazaarLink định giá mức sử dụng mô hình ở mức tăng bằng 0 (giống hệt với giá niêm yết chính thức của mỗi nhà cung cấp). Phí nền tảng được tính khi nạp tiền (tiền gửi): phí giao dịch 10%, cộng với 5% Đài Loan VAT trên các kênh TWD. Được lập hóa đơn bằng USD với báo giá TWD và hóa đơn thống nhất điện tử. Tự nạp tiền khi bạn sử dụng; doanh nghiệp có thể thu xếp thanh toán hàng tháng (Net-30, có thể thương lượng).

Cách hoạt động

  • Consumption (ghi nợ): mỗi lệnh gọi API được tính phí theo mức sử dụng mã thông báo thực tế theo giá niêm yết USD chính thức của nhà cung cấp, được khấu trừ từ số dư của bạn — không cộng dồn, không tính thêm phí tiêu thụ.
  • Nạp tiền (tiền gửi): TWD được chuyển đổi thành USD theo tỷ giá bán theo thời gian thực và được thêm vào số dư của bạn; phí giao dịch 10% được tính khi nạp tiền.
  • → Phương thức thanh toán và phí theo từng kênh được hiển thị tại trang thanh toán trực tiếp.
  • → Kênh TWD đủ điều kiện hiển thị thuế áp dụng và điều kiện hóa đơn điện tử Đài Loan trước khi trả tiền.
  • → Chuyển khoản ngân hàng: đối với các khoản nạp tiền lớn hơn hoặc dành cho doanh nghiệp, hãy liên hệ với chúng tôi để sắp xếp chuyển khoản ngân hàng và lập hóa đơn tùy chỉnh.
  • Hóa đơn chỉ có qua kênh đang được cung cấp và đánh dấu đủ điều kiện, hoặc theo điều khoản doanh nghiệp đã xác nhận. Nếu cần mã số thuế, báo giá hoặc thanh toán hàng tháng, hãy liên hệ kinh doanh trước khi trả tiền.
Ví dụ
Khi mua US$10.00 tín dụng, trang thanh toán trực tiếp hiển thị phương thức hiện có, tổng tiền, phí hoặc thuế và điều kiện biên lai hay hóa đơn trước khi xác nhận. Số dư sau đó dùng theo giá niêm yết chính thức, không cộng biên mô hình.

Về tỷ giá hối đoái

Chuyển đổi ngoại hối sử dụng tỷ giá thời gian thực; thanh toán hàng tháng sử dụng tỷ giá tại thời điểm thanh toán (sao kê), trong khi các khoản nạp tiền trả trước chuyển đổi theo tỷ giá tại thời điểm nạp tiền. Tỷ lệ và dấu thời gian được giữ lại cùng với hồ sơ thanh toán.

Bảo vệ thanh toán cho yêu cầu thất bại

Nếu yêu cầu upstream thất bại mà không có dữ liệu sử dụng có thể quyết toán, BazaarLink tự động hoàn lại toàn bộ khoản đã giữ. Lần gọi đó bị tính 0 USD ngay cả khi stream đã bắt đầu trước khi lỗi.

Khi nào bạn không bị tính phí
Không cần bật cài đặt. Quy tắc này tự động áp dụng cho API suy luận công khai và API phương tiện. BazaarLink có thể tự chịu chi phí mà nhà cung cấp upstream đã tính thay vì chuyển chi phí của yêu cầu thất bại cho bạn.
  • Không thể kết nối upstream, yêu cầu bị từ chối hoặc không có kết quả sử dụng được
  • Stream dừng trước khi nhận bản ghi usage cuối cùng, kể cả sau khi đã trả một phần nội dung
  • Phản hồi không có usage hoặc chỉ có đối tượng usage rỗng với mọi giá trị bằng 0

0 token đầu ra không phải lúc nào cũng miễn phí

usage.cost là số USD tính cho yêu cầu. Phản hồi có 0 output token vẫn có thể bị tính input token; xem usage.cost hoặc bản ghi Activity để biết số tiền cuối cùng.

Bắt đầu nhanh

Ba cách tích hợp

Cách tiếp cận
Phù hợp với
Bắt đầu
API thuầnBất kỳ ngôn ngữ nào, không phụ thuộc thư viện, toàn quyền kiểm soát request→
OpenAI / Anthropic SDKĐang dùng SDK chính thức — chỉ cần đổi base URL và khóa API→
Framework agentLangChain, Vercel AI SDK, CrewAI và các ứng dụng agent khác→
Tất cả các yêu cầu đều được tự động kiểm duyệt trước khi gửi đến mô hình; các yêu cầu vi phạm chính sách sử dụng của chúng tôi sẽ bị từ chối và trả về lỗi 403.

Bắt đầu trong vòng 5 phút. BazaarLink hoàn toàn tương thích với OpenAI SDK — chỉ cần thay đổi

Với các yêu cầu dài hơn 100 giây, nên dùng stream:true. Với yêu cầu không stream, sau khoảng 12 giây (giá trị mặc định, có thể điều chỉnh qua cấu hình deployment), hệ thống sẽ trả về 200 trước và bắt đầu gửi khoảng trắng keepalive; nếu xảy ra lỗi sau đó, lỗi sẽ được trả về dưới dạng 200 + error JSON. Keepalive là khoảng trắng trước JSON body và parser JSON tiêu chuẩn sẽ bỏ qua phần này.

Base URL

https://api.bazaarlink.ai/v1

api.bazaarlink.ai là điểm vào chỉ dành cho API, được triển khai tách biệt với trang web. Base URL trước đây https://bazaarlink.ai/api/v1 vẫn được hỗ trợ đầy đủ — các tích hợp hiện có không cần thay đổi.

Sử dụng OpenAI SDK

BazaarLink hoàn toàn tương thích với OpenAI SDK. Chỉ cần thay đổi base URL và khóa API — tất cả code khác giữ nguyên.

from openai import OpenAI

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

completion = client.chat.completions.create(
    model="openai/gpt-4o",
    messages=[
        {"role": "user", "content": "What is the meaning of life?"}
    ],
)

print(completion.choices[0].message.content)
Cần khóa API?
Lấy khóa API từ trang Khóa API. Tất cả khóa bắt đầu bằng sk-bl-.
Gọi trực tiếp từ trình duyệt (CORS)
API công khai trả về Access-Control-Allow-Origin: * cho mọi phản hồi /v1, nên bạn có thể gọi trực tiếp từ JavaScript trên trình duyệt bằng fetch hoặc OpenAI SDK. Đừng bao giờ đưa khóa API vào mã front-end — bất kỳ ai mở trang đều đọc được; hãy dùng khóa có thể thu hồi và giới hạn chi tiêu, hoặc chuyển tiếp lời gọi qua backend của riêng bạn.
Định dạng ID mô hình — nên dùng định dạng provider/model-name
GET /v1/models liệt kê id như "claude-sonnet-4.6" và alias chuẩn như "anthropic/claude-sonnet-4.6". Yêu cầu chấp nhận cả hai dạng; dùng giá trị trong danh sách.
✓ claude-sonnet-4.6   anthropic/claude-sonnet-4.6

Dùng khóa riêng của bạn (BYOK)

Kết nối khóa API upstream với tài khoản cá nhân hoặc tổ chức. Yêu cầu đủ điều kiện sẽ dùng khóa của bạn trước. Sau lỗi upstream, yêu cầu có thể thử một nguồn khả dụng khác; nếu không có, yêu cầu sẽ trả lỗi. Quản lý khóa cá nhân ở trang khóa và khóa tổ chức trong cài đặt tổ chức. Đến cài đặt BYOK →

Lọc nội dung

Bảo vệ nội dung hai chiều cho lưu lượng API của bạn: yêu cầu chứa prompt injection bị chặn (400), dữ liệu nhạy cảm trong yêu cầu và phản hồi (khóa API, số thẻ, số định danh, v.v.) được tự động che. Quy tắc và danh sách miễn trừ có thể tùy chỉnh, kèm thống kê sử dụng. Đến cài đặt lọc nội dung →

Dữ liệu mạng xã hội (:social)

Thêm :social vào sau tên mô hình khi câu hỏi liên quan đến một nền tảng mạng xã hội. Trước khi mô hình trả lời, BazaarLink lấy các bài đăng, hồ sơ hoặc bình luận phù hợp từ nền tảng đó và cung cấp làm tài liệu tham khảo. Nếu không lấy kịp dữ liệu từ nền tảng, yêu cầu sẽ chuyển dự phòng sang tìm kiếm web thông thường, nên bạn vẫn nhận được câu trả lời.

Ví dụ

curl https://bazaarlink.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  --max-time 60 \
  -d '{
    "model": "gpt-5.4-mini:social",
    "messages": [{ "role": "user", "content": "Các bài đăng gần đây trên X về GPT-6" }]
  }'

Cần lưu ý

  • Thời gian chờ: dữ liệu mạng xã hội được lấy trực tiếp, nên một yêu cầu :social có thể mất 20 đến 40 giây trước khi câu trả lời bắt đầu. Sau 40 giây, yêu cầu chuyển dự phòng sang tìm kiếm web. Hãy đặt timeout của client ít nhất 60 giây. :online vẫn nhanh vì đó là tìm kiếm web thông thường.
  • Giá: các truy vấn được trả lời bằng dữ liệu mạng xã hội dùng chung hạn mức tìm kiếm miễn phí hằng ngày với :online (5 lượt mỗi ngày nếu không có số dư, 10 lượt nếu có số dư hoặc gói đăng ký, đặt lại vào 00:00 UTC). Vượt hạn mức, mỗi truy vấn được tính theo bảng giá Data API (xem GET /v1/data/catalog), cộng thêm phí token của chính mô hình. Truy vấn chuyển dự phòng sang tìm kiếm web được tính như :online.
  • Phạm vi: :social chỉ đọc một số nền tảng mạng xã hội, danh sách phụ thuộc vào cấu hình đang bật; danh sách hiện tại nằm ở /solutions/data-api#social-suffix. Nền tảng có trong danh mục Data API nhưng không có trong danh sách đó sẽ không được :social đọc, nên truy vấn về nền tảng đó, hoặc không nêu nền tảng nào, được trả lời bằng tìm kiếm web.
  • Tương thích: hoạt động trên POST /api/v1/chat/completions, /api/v1/messages và /api/v1/responses, cả streaming và không streaming, với cùng cách trích dẫn như :online. Không thể kết hợp :online và :social trong cùng một tên mô hình (400 invalid_web_search_options).

Di chuyển từ OpenRouter

API của BazaarLink tương thích với OpenRouter — hầu hết các tích hợp chỉ cần đổi hai giá trị: base URL thành https://api.bazaarlink.ai/v1 và khóa API thành khóa BazaarLink bắt đầu bằng sk-bl-.

  1. Cơ sở URL: https://openrouter.ai/api/v1 → https://api.bazaarlink.ai/v1
  2. Khóa API: sk-or-... → sk-bl-... (tạo tại /keys)
  3. ID mô hình: cùng định dạng provider/model (ví dụ anthropic/claude-sonnet-4.6); danh mục đầy đủ tại GET /v1/models
  4. Dự phòng models[], streaming, gọi công cụ và đầu ra có cấu trúc dùng cùng cấu trúc request
  from openai import OpenAI

  client = OpenAI(
-     base_url="https://openrouter.ai/api/v1",
-     api_key="sk-or-...",
+     base_url="https://api.bazaarlink.ai/v1",
+     api_key="sk-bl-...",
  )
Note
Thanh toán bằng USD và có hóa đơn điện tử Đài Loan. Các điều khiển định tuyến riêng của upstream như :nitro bị bỏ qua. Xem Tham chiếu API để biết các tùy chọn định tuyến BazaarLink hỗ trợ.

Xác thực

Tất cả yêu cầu API cần header Authorization với khóa API.

Authorization: Bearer sk-bl-YOUR_API_KEY

Lấy khóa API từ bảng điều khiển. Giữ khóa an toàn — không để lộ trong code phía client.

Lưu ý bảo mật
Không bao giờ để lộ khóa API trong JavaScript phía client. Luôn proxy yêu cầu qua backend server.

Header tùy chọn

HTTP-Referer
string
URL trang web của bạn, để theo dõi sử dụng và phân tích (tùy chọn)
X-Title
string
Tên ứng dụng, hiển thị trong bảng điều khiển (tùy chọn)

Nguyên tắc

BazaarLink được thiết kế dựa trên ba nguyên tắc cốt lõi:

1. Giao diện thống nhất

Một API, một SDK, hàng trăm mô hình. Chuyển đổi giữa OpenAI, Anthropic, Google Gemini, Meta Llama và các nhà cung cấp khác mà không cần thay đổi code — chỉ thay đổi ID mô hình.

2. Tối ưu giá

BazaarLink tự động định tuyến đến nhà cung cấp hiệu quả chi phí nhất cho mô hình bạn chọn. Bạn chỉ trả cho những gì sử dụng, thanh toán USD với hỗ trợ hóa đơn đầy đủ.

3. Xử lý yêu cầu

Khi nguồn upstream gặp sự cố, yêu cầu có thể thử một nguồn khác đang khả dụng. Nếu không có nguồn nào khả dụng, yêu cầu sẽ trả lỗi.

Đa phương thức

BazaarLink hỗ trợ đầu vào đa phương thức — gửi hình ảnh, âm thanh và tệp cùng với văn bản đến các mô hình hỗ trợ. Nội dung được chuyển tiếp đến nhà cung cấp upstream.

Phương thức được hỗ trợ

Đầu vào
Mô tả
Mô hình mẫu
Văn bảnTin nhắn văn bản tiêu chuẩnTất cả mô hình
Hình ảnhURL hoặc data URI base64 — PNG, JPEG, WebP, GIFopenai/gpt-6-lunaanthropic/claude-sonnet-4.6google/gemini-4-argon+98 nữa
Tệp / PDFTài liệu qua data URI base64 (`data:application/pdf;base64,...`)openai/gpt-6-lunaanthropic/claude-sonnet-4.6google/gemini-4-argon+41 nữa
Âm thanhBase64 thô — không hỗ trợ URL. Cần trường `format`google/gemini-4-argonelevenlabs/scribe-v2google/gemini-3.1-flash-lite-preview+15 nữa
VideoURL (CDN) hoặc data URI base64google/gemini-4-argonqwen/qwen3.8-maxminimax/minimax-m3+39 nữa

Ví dụ:

# Image — URL or base64 data URI
curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"google/gemini-3.5-flash","messages":[{"role":"user","content":[
        {"type":"text","text":"What is in this?"},
        {"type":"image_url","image_url":{"url":"https://example.com/photo.jpg"}}
      ]}]}'

# File / PDF — base64 data URI only, no URL
curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"google/gemini-3.5-flash","messages":[{"role":"user","content":[
        {"type":"file","file":{"filename":"doc.pdf","file_data":"data:application/pdf;base64,JVBER..."}},
        {"type":"text","text":"Summarize this."}
      ]}]}'

# Audio — raw base64, no URL. "format" is required
curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"google/gemini-3.5-flash","messages":[{"role":"user","content":[
        {"type":"text","text":"Transcribe this."},
        {"type":"input_audio","input_audio":{"data":"UklGRi...","format":"wav"}}
      ]}]}'

# Video — URL (CDN) or base64 data URI
curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"google/gemini-3.5-flash","messages":[{"role":"user","content":[
        {"type":"text","text":"Describe this video."},
        {"type":"video_url","video_url":{"url":"https://example.com/clip.mp4"}}
      ]}]}'

Gửi hình ảnh

Sử dụng định dạng mảng content với các phần image_url. Định dạng hỗ trợ: PNG, JPEG, WebP và GIF (bao gồm GIF động). Bạn có thể bao gồm nhiều hình ảnh trong một tin nhắn — mỗi cái là một phần image_url riêng:

curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-bl-YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o",
    "messages": [{"role":"user","content":[
      {"type":"text","text":"What is in this image?"},
      {"type":"image_url","image_url":{"url":"https://example.com/photo.jpg","detail":"auto"}}
    ]}]
  }'
Gửi hình ảnh
Luôn bao gồm phần văn bản cùng với hình ảnh. Thứ tự văn bản trước (phần text trước phần image) được khuyến nghị để tương thích tốt nhất với tất cả nhà cung cấp.
Gửi hình ảnh
Kiểm tra trang Mô hình để biết phương thức đầu vào được hỗ trợ cho mỗi mô hình. Cột phương thức hiển thị mỗi mô hình chấp nhận đầu vào nào.

Giới hạn

BazaarLink áp dụng hai giới hạn độc lập: giới hạn tốc độ cho số yêu cầu mỗi phút, và giới hạn tín dụng cho chi tiêu tài khoản. Vượt giới hạn tốc độ sẽ nhận HTTP 429; hết tín dụng sẽ nhận HTTP 402.

Giới hạn tốc độ

Giới hạn tốc độ theo người dùng (không theo khóa), đo bằng yêu cầu mỗi phút (RPM). Không có giới hạn hàng ngày. Tier được xác định tự động bởi số dư tín dụng tài khoản.

Tier
RPM
Sử dụng hàng ngày
Ghi chú
Miễn phí (< $5 tín dụng)20 RPMKhông giới hạnPhát triển & thử nghiệm
Trả phí (≥ $5 tín dụng)200 RPMKhông giới hạnTải sản xuất

Khi vượt giới hạn tốc độ, bạn nhận phản hồi 429 với header Retry-After. Triển khai exponential backoff khi thử lại.

Response

Phản hồi có thể có x-request-id; x-generation-id với phản hồi không stream; x-ratelimit-*; retry-after khi áp dụng; và x-auto-resolved-model cho định tuyến auto hoặc auto:free.

x-request-id: 85e6f35c71a31f19-SJC
x-generation-id: 85e6f35c71a31f19-SJC
x-ratelimit-limit: 200
x-ratelimit-remaining: 198
x-ratelimit-reset: 1740000060
retry-after: 5
x-auto-resolved-model: openai/gpt-4o

Giới hạn tín dụng

Phản hồi 402 nghĩa là số dư tài khoản hoặc hạn mức chi tiêu của khóa đã về 0 — không phải do bạn gửi yêu cầu quá nhanh. Phản hồi này không có header rate limit, và nếu giới hạn bị chạm giữa lúc streaming, bạn sẽ nhận sự kiện lỗi SSE thay vì thay đổi mã trạng thái HTTP.

402 Tín dụng không đủ
Khi số dư của bạn về $0, API trả về HTTP 402 với thông báo "Insufficient credits. Please top up to continue." — hãy theo dõi usage.cost trong response để giám sát chi tiêu theo thời gian thực.

Danh sách cho phép IP

Bạn có thể đặt danh sách cho phép IP riêng cho từng khóa API, để chỉ các yêu cầu từ IP nguồn được chỉ định mới sử dụng được khóa đó.

Khi nào nên dùng

Tính năng này phù hợp với máy chủ production có IP outbound cố định. Nếu ứng dụng gửi yêu cầu từ mạng gia đình, mạng di động hoặc địa chỉ thay đổi, hãy kiểm tra IP outbound có ổn định trước; nếu không, bạn có thể tự khóa mình bên ngoài.

Cách thiết lập

Mở /keys , mở menu "⋯" của khóa cần dùng, chọn "Danh sách cho phép IP", nhập các mục rồi lưu.

Bạn cũng có thể dùng PATCH /api/v1/keys/:id với session đã đăng nhập hoặc Management API key:

PATCH https://api.bazaarlink.ai/v1/keys/KEY_ID
Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY
Content-Type: application/json

{
  "allowedCidrs": [
    "203.0.113.7",
    "198.51.100.0/24"
  ]
}

# Clear the allowlist and return to unrestricted access
{"allowedCidrs": []}

Định dạng mục

Trong UI, nhập một giá trị trên mỗi dòng. Trong API, gửi các giá trị tương tự trong mảng `allowedCidrs`. Chấp nhận IPv4 thuần, IPv4 CIDR hoặc IPv6 literal (chỉ so khớp chính xác).

203.0.113.7
198.51.100.0/24
2001:db8::1

Cách hoạt động

Để trống (gửi mảng [] rỗng) nghĩa là không giới hạn IP nguồn. Đây là mặc định nên hành vi của các khóa hiện có không thay đổi.

IP nguồn được lấy từ header `cf-connecting-ip`.

Nếu danh sách không rỗng nhưng không thể xác định IP nguồn, yêu cầu sẽ bị từ chối (fail-closed).

⚠️ Quan trọng: yêu cầu bị từ chối chỉ trả về 401 chung
Yêu cầu từ ngoài danh sách, hoặc yêu cầu không xác định được IP nguồn, nhận đúng HTTP 401 chung như khóa không hợp lệ và không có thông báo lỗi riêng. Đây là thiết kế bảo mật có chủ đích để người có được khóa không biết danh sách cho phép tồn tại. Đổi lại, cấu hình sai trông giống hệt khóa không hợp lệ và rất khó gỡ lỗi. Trước khi lưu, hãy xác nhận IP outbound của máy chủ đã nằm trong danh sách.
⚠️ Quan trọng: IPv6 chỉ hỗ trợ so khớp chuỗi chính xác
IPv6 không thực hiện tính subnet; chuỗi địa chỉ phải giống hệt nhau. Nếu địa chỉ IPv6 thay đổi, bạn có thể bị khóa bên ngoài. Dải CIDR /0–/32 chỉ được hỗ trợ cho IPv4.
Khi nào thay đổi có hiệu lực
Sau khi PATCH hoặc lưu trên UI thành công, instance thực hiện cập nhật sẽ xóa cache ngay. Trong điều kiện bình thường, các instance khác đồng bộ trong khoảng tối đa 15 giây. Nếu Redis dùng chung tạm thời không khả dụng, việc vô hiệu hóa giữa các instance không thể lan truyền ngay và có thể chậm đến TTL cache một giờ.

Phanh Khẩn Cấp Cá Nhân

Hạn mức chi tiêu USD cố định theo cửa sổ 1 phút và 1 giờ, áp dụng cho tất cả API key của bạn. Khi vượt ngưỡng, các yêu cầu mới nhận HTTP 429; cửa sổ tự động đặt lại theo ranh giới đồng hồ.

cbEnabled
boolean
Bật
cbMinuteUsd
number | null
Hạn mức USD mỗi phút · Dùng mặc định
cbHourlyUsd
number | null
Hạn mức USD mỗi giờ · Dùng mặc định
(đang kế thừa mặc định)
Giá trị tối thiểu là 0,01 (hoặc để trống để dùng mặc định)
Phanh Khẩn Cấp Cá Nhân · Điều chỉnh →

Bảo mật tài khoản

Ngoài mật khẩu, BazaarLink còn hỗ trợ xác minh hai bước để tăng thêm một lớp bảo vệ khi đăng nhập.

Bật xác minh hai bước (TOTP)

  1. Vào trang “Cài đặt”, tìm mục “Xác minh hai bước (TOTP)”, sau đó nhấn “Bật xác minh hai bước”.
  2. Quét mã QR trên màn hình bằng ứng dụng authenticator (như Google Authenticator), hoặc nhập thủ công secret hiển thị bên dưới.
  3. Nhập mã 6 chữ số do ứng dụng authenticator tạo ra và xác nhận để hoàn tất việc bật tính năng.

Sau khi bật, hệ thống sẽ hiển thị 8 mã dự phòng (chỉ hiển thị một lần) — mỗi mã gồm 10 ký tự và chỉ dùng được một lần. Hãy ghi lại hoặc sao chép và lưu ngay ở nơi an toàn khác ngoài điện thoại; dùng mã dự phòng để đăng nhập khi mất điện thoại hoặc không truy cập được ứng dụng authenticator.

Đăng nhập sau khi bật tính năng
Kể từ đó, mỗi lần đăng nhập bạn sẽ cần nhập thêm mã từ ứng dụng authenticator hoặc một mã dự phòng, ngoài mật khẩu (hoặc đăng nhập bằng Google).

Cách khác để bảo vệ tài khoản của bạn

Kết hợp các tính năng sau với xác minh hai bước để giảm thêm thiệt hại nếu key bị rò rỉ hoặc bị lạm dụng:

  • Danh sách cho phép IP — giới hạn API key chỉ dùng được từ các IP nguồn được chỉ định.
  • Phanh Khẩn Cấp Cá Nhân — đặt hạn mức chi tiêu theo phút và theo giờ, tự động tạm dừng khi vượt ngưỡng.
  • Hạn mức chi tiêu theo từng key — đặt hạn mức chi tiêu theo ngày, tuần hoặc tháng khi tạo hoặc cập nhật API key.

Tạo hình ảnh

Tạo hình ảnh qua /v1/chat/completions với modalities:["image"], hoặc /v1/images/generations tương thích OpenAI DALL·E.

curl -N https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"openai/gpt-5.4-image-2","messages":[{"role":"user","content":"a red cat on a sofa"}],"modalities":["image","text"],"stream":true}'

Luồng đầy đủ (streaming, chỉnh sửa ảnh, giao thức SSE, danh sách mô hình) xem tại API Reference →

Tạo video

Luồng 3 bước không đồng bộ (submit → poll → content). Tạo video mất từ 30 giây đến 5 phút.

curl https://api.bazaarlink.ai/v1/videos \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"bytedance/seedance-2.0","prompt":"a bird flying over mountains","duration":3}'
# → 202 { "id": "vjob_xxx", "status": "pending" }

Luồng đầy đủ (polling, tải xuống, loại tác vụ, lưu ý) xem tại API Reference →

Đầu vào PDF

Gửi tài liệu PDF trực tiếp trong tin nhắn đến các mô hình hỗ trợ đầu vào PDF gốc (ví dụ: Claude, Gemini). BazaarLink chuyển tệp thẳng đến mô hình — tính phí như input token thông thường, không phụ phí hay bước xử lý thêm.

Định dạng được hỗ trợ

  • Tài liệu PDF (văn bản, hình ảnh, bảng, quét)
  • URL dữ liệu base64
  • Tài liệu nhiều trang
  • Chỉ PDF không có mật khẩu
import base64

with open("document.pdf", "rb") as f:
    pdf_data = base64.b64encode(f.read()).decode()

response = client.chat.completions.create(
    model="anthropic/claude-sonnet-4.6",
    messages=[{
        "role": "user",
        "content": [
            {
                "type": "file",
                "file": {
                    "filename": "document.pdf",
                    "file_data": f"data:application/pdf;base64,{pdf_data}",
                },
            },
            {"type": "text", "text": "Summarize this document."},
        ],
    }],
)

Đầu vào video

Gửi tệp video đến các mô hình hỗ trợ đầu vào video để phân tích, tạo chú thích, hoặc trả lời câu hỏi về cảnh và sự kiện. Dùng được URL trực tiếp hoặc base64 data URI — URL hiệu quả hơn cho video công khai; base64 dành cho tệp cục bộ hoặc video riêng tư.

Định dạng được hỗ trợ

MP4 (H.264)MPEGMOVWebM
response = client.chat.completions.create(
    model="google/gemini-3.5-flash",
    messages=[{
        "role": "user",
        "content": [
            {
                "type": "video_url",
                "video_url": {"url": "https://example.com/video.mp4"},
            },
            {"type": "text", "text": "What is happening in this video?"},
        ],
    }],
)

Tài liệu tham khảo API đầy đủ →

OAuth PKCE

OAuth 2.0 PKCE cho phép ứng dụng client công khai gọi API thay mặt người dùng.

Khi nào sử dụng OAuth PKCE

  • SPA hoặc ứng dụng di động cần thanh toán theo người dùng
  • SaaS đa thuê
  • Client công khai
  • Cần khóa riêng, có thể thu hồi cho từng người dùng (không tự hết hạn) thay vì một khóa API dùng chung

Người dùng của bạn sẽ thấy gì

Hãy mô tả các bước này trên màn hình đăng nhập của riêng bạn:

  1. Trong ứng dụng của bạn, họ chọn "Đăng nhập bằng BazaarLink" (hoặc tên nút bạn đặt).
  2. Trình duyệt của họ mở trang cấp quyền của BazaarLink. Nếu chưa đăng nhập, họ đăng nhập trước rồi tự động quay lại trang này.
  3. Trang hiển thị địa chỉ ứng dụng của bạn và điều sẽ xảy ra nếu họ cho phép: một khóa API mới được tạo cho ứng dụng, mức sử dụng được tính vào số dư BazaarLink của họ, và họ có thể thu hồi khóa bất cứ lúc nào. Họ có thể đặt tên khóa và đặt hạn mức chi tiêu hằng tháng (cả hai đều không bắt buộc).
  4. Họ nhấp Cho phép và được chuyển về ứng dụng của bạn. Nếu nhấp Từ chối, không có khóa nào được tạo, ứng dụng của bạn không được thông báo và họ thấy trang "Đã từ chối truy cập".
  5. Để thu hồi quyền truy cập sau này, họ mở trang Khóa API (https://bazaarlink.ai/keys) và vô hiệu hóa hoặc xóa khóa được đặt tên theo ứng dụng của bạn.

Cách hoạt động

Bước 1 — Khởi tạo xác thực — Tạo code_verifier ngẫu nhiên và hash SHA-256 làm code_challenge.

https://bazaarlink.ai/auth?callback_url=https://yourapp.com/callback&code_challenge=CODE_CHALLENGE&code_challenge_method=S256

Tham số URL ủy quyền

  • callback_url (bắt buộc) — nơi người dùng quay lại sau khi cho phép. Quy tắc bên dưới.
  • code_challenge (bắt buộc) — SHA-256 của code_verifier được mã hóa base64url (43 ký tự, không có padding).
  • code_challenge_method (bắt buộc) — phải là S256.
  • state (tùy chọn) — giá trị CSRF mờ đục của riêng bạn, từ 1 đến 256 ký tự ASCII in được. BazaarLink trả lại nguyên vẹn dưới dạng &state=… ngay sau code. State sai định dạng sẽ khiến trang cấp quyền hiển thị "Yêu cầu cấp quyền không hợp lệ".
  • key_label (tùy chọn) — tối đa 100 ký tự. Điền sẵn tên khóa trên trang đồng ý (người dùng vẫn có thể thay đổi). Nhãn quá dài hoặc để trống sẽ bị bỏ qua.
  • Headless tools (CLI / desktop, no callback_url) — omit callback_url. After the user allows, the page shows a one-time code (valid 5 minutes, single use) for them to enter into your tool; exchange it exactly like a redirected code. The page cannot show which app is asking, so tell users to enter the code only in a tool they started themselves.

Không được hỗ trợ

  • workspace_id và required_workspace_id — không được hỗ trợ. Khóa luôn thuộc về tài khoản của chính người dùng.
  • code_challenge_method=plain — không được hỗ trợ (chỉ S256).

Quy tắc của callback_url

  • Phải là https://. http:// chỉ được chấp nhận cho localhost, 127.0.0.1 và [::1] (mọi cổng); khi đó trang đồng ý hiển thị cảnh báo phát triển cục bộ.
  • Không có fragment (#), không có tên người dùng hoặc mật khẩu trong URL, tối đa 2048 ký tự.
  • Trang đồng ý hiển thị tên host callback của bạn để người dùng biết ứng dụng nào đang yêu cầu.
  • Sau khi người dùng cho phép, trình duyệt được chuyển đến callback_url của bạn kèm code=… (và state=… nếu bạn đã gửi; query string hiện có được giữ nguyên). Code có hiệu lực 10 phút và chỉ dùng được một lần.

Bước 2 — Đổi code lấy khóa API — Sau khi người dùng ủy quyền yêu cầu, BazaarLink chuyển hướng đến callback_url của bạn kèm một code dùng một lần. Code có hiệu lực 10 phút và chỉ dùng được một lần; code_verifier sai sẽ làm code bị hủy. POST code, code_verifier và code_challenge_method (cả ba đều bắt buộc) để nhận khóa API của người dùng.

curl https://bazaarlink.ai/api/v1/auth/keys \
  -H "Content-Type: application/json" \
  -d '{
    "code": "<CODE_FROM_CALLBACK_URL>",
    "code_verifier": "<CODE_VERIFIER>",
    "code_challenge_method": "S256"
  }'

# Response
# { "key": "sk-bl-...", "user_id": "..." }

Bước 3 — Sử dụng khóa — Khóa trả về là khóa API BazaarLink thông thường thuộc về người dùng đã ủy quyền — mức sử dụng được tính vào số dư của người dùng đó, không phải của bạn.

curl https://bazaarlink.ai/api/v1/chat/completions \
  -H "Authorization: Bearer sk-bl-..." \
  -H "Content-Type: application/json" \
  -d '{"model": "google/gemini-3.5-flash", "messages": [{"role": "user", "content": "Hello"}]}'

Ví dụ JavaScript (trình duyệt)

// 1) Create a verifier + S256 challenge, then send the user to BazaarLink
const b64url = (buf) => btoa(String.fromCharCode(...new Uint8Array(buf)))
  .replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
const verifier = b64url(crypto.getRandomValues(new Uint8Array(32)));
const challenge = b64url(await crypto.subtle.digest("SHA-256", new TextEncoder().encode(verifier)));
sessionStorage.setItem("bl_verifier", verifier);
// "state" is optional: BazaarLink hands it back unchanged next to the code.
const state = b64url(crypto.getRandomValues(new Uint8Array(16)));
sessionStorage.setItem("bl_state", state);
location.href =
  "https://bazaarlink.ai/auth?callback_url=" + encodeURIComponent(location.origin + "/callback") +
  "&code_challenge=" + challenge + "&code_challenge_method=S256&state=" + state;

// 2) On /callback: check your own state, then exchange the one-time code for a user key
const params = new URLSearchParams(location.search);
if (params.get("state") !== sessionStorage.getItem("bl_state")) throw new Error("state mismatch");
const res = await fetch("https://bazaarlink.ai/api/v1/auth/keys", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    code: params.get("code"),
    code_verifier: sessionStorage.getItem("bl_verifier"),
    code_challenge_method: "S256",
  }),
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? "exchange failed"); // 403 invalid_code: ask the user to authorize again
const { key } = await res.json(); // use as: Authorization: Bearer <key>
Bảo mật: Chỉ S256
Đặt code_challenge_method thành S256. Chỉ hỗ trợ S256: yêu cầu dùng plain hoặc không có code_challenge_method sẽ bị từ chối với HTTP 400.
Ghi chú
Nếu người dùng từ chối, BazaarLink không chuyển hướng về callback_url của bạn và không thông báo cho ứng dụng của bạn. Chỉ hiển thị trang "Đã từ chối truy cập", nên /auth không thể trở thành open redirect. Hãy xử lý trạng thái chưa được cấp quyền trong ứng dụng của bạn (ví dụ bằng timeout hoặc nút thử lại).

Trang /auth và POST /api/v1/auth/keys được phục vụ từ https://bazaarlink.ai (không phải api.bazaarlink.ai). Khóa bạn nhận được dùng được với cả hai base URL: https://bazaarlink.ai/api/v1 và https://api.bazaarlink.ai/v1.

Nếu người dùng đặt hạn mức chi tiêu khi cấp quyền, đó là hạn mức hằng tháng và được đặt lại theo chu kỳ tháng của tài khoản.

Lỗi

Lỗi dùng định dạng kiểu OpenAI {"error":{"message","type","code"}}. POST /api/v1/auth/keys có thể trả về:

  • 400 invalid_code_challenge_method — thiếu code_challenge_method, là plain, hoặc khác S256.
  • 400 — nội dung JSON không hợp lệ, hoặc thiếu code / code_verifier.
  • 403 invalid_code — code không tồn tại, đã hết hạn hoặc đã dùng, code_verifier sai, hoặc tài khoản không còn được phép. Tất cả các trường hợp này cố ý trả về cùng một thông báo để bên gọi không thể phân biệt. code_verifier sai cũng làm code bị hủy: hãy yêu cầu người dùng ủy quyền lại.
  • 429 rate_limited — hơn 30 lần thử đổi trong 10 phút từ một IP (xem header Retry-After).
  • 429 key_total_cap — tài khoản đã có tối đa 200 khóa API.
  • 405 — chỉ chấp nhận POST.

Tạo mã từ máy chủ của bạn (khóa quản lý)

Chủ sở hữu khóa quản lý (Management Key) cá nhân có thể tạo mã ủy quyền trực tiếp bằng POST /api/v1/auth/keys/code mà không cần đưa người dùng qua trang trình duyệt (tương thích với OpenRouter). Mã gắn với chủ sở hữu khóa quản lý, nên khóa nhận được khi đổi là một khóa tiêu chuẩn trong tài khoản của chủ sở hữu đó, với hạn mức, chu kỳ, thời hạn và tên được chọn tại đây. Dùng khi công cụ của bạn đã có khóa quản lý và muốn trao cho một ứng dụng một khóa bị giới hạn. Bước đổi mã (POST /api/v1/auth/keys) giống như ở trên.

  • callback_url (bắt buộc) và code_challenge + code_challenge_method=S256 (bắt buộc) — cùng quy tắc với URL ủy quyền.
  • key_label (tùy chọn) — tối đa 100 ký tự; tên của khóa. Mặc định: "App: <host callback của bạn>".
  • limit (tùy chọn) — hạn mức chi tiêu bằng USD, từ 0 trở lên; 0 hoặc bỏ trống nghĩa là không giới hạn.
  • usage_limit_type (tùy chọn) — daily, weekly hoặc monthly: tần suất đặt lại hạn mức. Chỉ dùng cùng với limit; mặc định là monthly.
  • expires_at (tùy chọn) — thời điểm khóa hết hạn: thời gian ISO 8601 UTC trong tương lai có kèm giây, ví dụ 2026-12-31T23:59:59Z. Giá trị chỉ chính xác đến phút sẽ bị từ chối. Nếu bỏ trống, khóa vẫn có hiệu lực cho đến khi bị thu hồi.
  • workspace_id — không được hỗ trợ (400). spawn_agent và spawn_cloud được chấp nhận nhưng bị bỏ qua.
curl https://bazaarlink.ai/api/v1/auth/keys/code \
  -H "Authorization: Bearer sk-bl-YOUR_MGMT_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "callback_url": "https://yourapp.com/callback",
    "code_challenge": "<CODE_CHALLENGE>",
    "code_challenge_method": "S256",
    "key_label": "My app",
    "limit": 10,
    "usage_limit_type": "monthly",
    "expires_at": "2026-12-31T23:59:59Z"
  }'

# Response
# { "data": { "id": "<ONE_TIME_CODE>", "app_id": 123456789, "created_at": "2026-10-22T12:00:00.000Z" } }
# Then POST { "code": "<ONE_TIME_CODE>", "code_verifier": "<CODE_VERIFIER>", "code_challenge_method": "S256" } to /api/v1/auth/keys

Phản hồi: { "data": { "id", "app_id", "created_at" } }. id là mã dùng một lần để đổi (có hiệu lực 10 phút, chỉ một lần). BazaarLink không có sổ đăng ký ứng dụng, nên app_id là một số nguyên cố định suy ra từ địa chỉ callback của bạn: cùng một địa chỉ luôn nhận cùng một app_id.

  • 401 unauthorized — không có khóa Bearer, hoặc khóa không tồn tại.
  • 403 management_key_required — khóa không phải khóa quản lý cá nhân (khóa tiêu chuẩn và khóa quản lý của tổ chức bị từ chối).
  • 403 account_not_allowed — chủ sở hữu khóa đã bị đình chỉ hoặc xóa.
  • 400 — invalid_callback_url, invalid_code_challenge_method, invalid_code_challenge, invalid_expires_at, workspace_not_supported, hoặc nội dung yêu cầu sai định dạng.
  • 429 rate_limited — hơn 30 mã mỗi giờ cho một chủ sở hữu hoặc 120 mã mỗi giờ từ một IP (xem Retry-After).

Khóa bạn nhận được

  • Một khóa API BazaarLink tiêu chuẩn (sk-bl-…), cùng loại với khóa tạo trên trang Khóa API. Khóa không tự hết hạn.
  • Mức sử dụng được tính vào số dư BazaarLink của người dùng. Nếu người dùng đặt hạn mức chi tiêu trên trang đồng ý, đó là hạn mức hằng tháng.
  • Hoạt động với cả hai base URL: https://bazaarlink.ai/api/v1 và https://api.bazaarlink.ai/v1.
  • Được tính vào giới hạn 200 khóa của tài khoản và hiển thị trong danh sách Khóa API của người dùng, nơi họ có thể vô hiệu hóa hoặc xóa bất cứ lúc nào.
  • Tài khoản bị đình chỉ hoặc đã xóa không thể cấp quyền cho ứng dụng, và code được cấp trước khi đình chỉ sẽ bị từ chối khi đổi (403 invalid_code).

Bạn nhận được gì

  • Luồng Authorization Code + PKCE
  • Thanh toán theo người dùng: mỗi người dùng tự trả cho mức sử dụng của mình từ số dư của chính họ
  • Mỗi người dùng có một khóa riêng, hiển thị trên trang Khóa API của họ để họ có thể thu hồi

Khóa API quản lý

Khóa quản lý được thiết kế để quản lý khóa theo chương trình. Không thể gọi mô hình AI.

Ghi chú
Khóa quản lý không thể gọi mô hình AI. Sử dụng khóa API tiêu chuẩn.

Tạo khóa quản lý

Vào trang Management API Keys và nhấp "Create" — đây là trang riêng, không phải lựa chọn loại trên trang API Keys thông thường.

Liệt kê khóa

GET https://api.bazaarlink.ai/v1/keys
Authorization: Bearer sk-bl-YOUR_MGMT_KEY

# Response
{
  "keys": [
    {
      "id": "clxyz123...",
      "name": "Production Key",
      "keyType": "standard",
      "keyPrefix": "sk-bl-abc1",
      "keySuffix": "XyZ9",
      "enabled": true,
      "spendLimitUsd": 10.00,
      "spendLimitPeriod": "month",
      "expiresAt": null,
      "createdAt": "2026-01-01T00:00:00.000Z",
      "lastUsed": "2026-03-01T12:34:56.000Z",
      "requestCount": 1234,
      "totalTokens": 5678901
    }
  ]
}

Tạo khóa con

POST https://api.bazaarlink.ai/v1/keys
Authorization: Bearer sk-bl-YOUR_MGMT_KEY
Content-Type: application/json

{
  "name": "Agent Key",
  "limit": 10.00,
  "limit_reset": "monthly",
  "expires_at": "2026-12-31T23:59:59Z"
}

# limit_reset: daily | weekly | monthly
# expires_at:  ISO 8601 datetime (optional)

# Response — save the key value, it won't be shown again
{
  "id": "clxyz789...",
  "name": "Agent Key",
  "key": "sk-bl-xyz789abcdef...",
  "keyType": "standard",
  "spendLimitUsd": 10.00,
  "spendLimitPeriod": "month",
  "expiresAt": "2026-12-31T23:59:59.000Z",
  "enabled": true,
  "createdAt": "2026-03-01T00:00:00.000Z"
}

Cập nhật khóa

PATCH https://api.bazaarlink.ai/v1/keys/:id
Authorization: Bearer sk-bl-YOUR_MGMT_KEY
Content-Type: application/json

{"enabled": false}              # disable key
{"spendLimitUsd": 5, "spendLimitPeriod": "week"}  # set spend limit
{"spendLimitUsd": null}         # remove spend limit
# Response: {"updated": true}

Thu hồi khóa

DELETE https://api.bazaarlink.ai/v1/keys/:id
Authorization: Bearer sk-bl-YOUR_MGMT_KEY

# Returns 204 No Content on success

Truy vấn số dư

GET https://api.bazaarlink.ai/v1/credits
Authorization: Bearer sk-bl-YOUR_MGMT_KEY

# Response
{
  "data": {
    "total_credits": 12.345,
    "total_usage": 3.210
  }
}

Truy vấn sử dụng

GET https://api.bazaarlink.ai/v1/usage?period=month
Authorization: Bearer sk-bl-YOUR_MGMT_KEY

# period: day | week | month | year

Ghi nhận ứng dụng

Xác định ứng dụng trong header yêu cầu.

Ghi chú
Các header này hoàn toàn tùy chọn.

Header khả dụng

HeaderDescription
HTTP-RefererURL trang web của bạn, để theo dõi sử dụng và phân tích (tùy chọn)
X-TitleTên ứng dụng, hiển thị trong bảng điều khiển (tùy chọn)
from openai import OpenAI

client = OpenAI(
    base_url="https://api.bazaarlink.ai/v1",
    api_key="sk-bl-YOUR_KEY",
    default_headers={
        "HTTP-Referer": "https://yourapp.com",  # Optional: your site URL
        "X-Title": "My Application",             # Optional: your app name
    },
)

response = client.chat.completions.create(
    model="openai/gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}],
)

Mã lỗi

Error Trạng thái

Envelope lỗi khác nhau theo endpoint. Dựa vào HTTP status và error.type nếu có. error.code có thể là chuỗi hoặc số, đôi khi không có; error.message chỉ để hiển thị.

{
  "error": {
    "message": "Insufficient credits. Please top up to continue.",
    "type": "invalid_request_error",
    "code": "insufficient_credits"
  }
}

HTTP và error.code

Envelope lỗi khác nhau theo endpoint. Dựa vào HTTP status và error.type nếu có. error.code có thể là chuỗi hoặc số, đôi khi không có; error.message chỉ để hiển thị.

Mã
Tên
Mô tả
424Lỗi phụ thuộcKhóa BYOK do bạn tự cấu hình đã bị nhà cung cấp upstream từ chối; hãy kiểm tra hoặc xoay vòng khóa trong phần cài đặt BYOK. Lỗi này chỉ xuất hiện ở chế độ strict
400Yêu cầu xấuYêu cầu không hợp lệ, mảng messages rỗng, hoặc thiếu trường bắt buộc
401Không được phépKhóa API bị thiếu, không hợp lệ, hoặc bị vô hiệu hóa
402Yêu cầu thanh toánKhông đủ tín dụng tài khoản, đạt giới hạn chi tiêu theo khóa, hoặc vượt ngân sách hàng tháng/tuần
403Bị cấmTài khoản bị tạm ngưng hoặc không có quyền
404Không tìm thấyRequested model, generation, key, or other resource does not exist
409Xung độtResource is not in the required state, such as an incomplete video job
410Không còn nữaRequested model has been retired and must be replaced
413Tải trọng quá lớnBody yêu cầu vượt quá 10 MB; giảm kích thước nội dung hoặc chia yêu cầu
416Range không thỏa mãnRequested byte range is invalid for generated video content
429Quá nhiều yêu cầu Lỗi máy chủVượt giới hạn tốc độ; kiểm tra header Retry-After trước khi thử lại
432Hết hạn mức miễn phíCác endpoint tương thích Tavily (/v1/search, /v1/extract, /v1/crawl, /v1/map): hạn mức tìm kiếm miễn phí đã dùng hết, hoặc số dư bằng 0 hoặc âm; hãy nạp thêm credit để tiếp tục. Nội dung phản hồi theo định dạng Tavily: {"detail":{"error":"..."}}
500CổngLỗi nội bộ BazaarLink
502BadKhông có nguồn upstream nào xử lý được yêu cầu; yêu cầu sẽ trả lỗi.
503Dịch vụ không khả dụngKhông có nhà cung cấp upstream được cấu hình cho mô hình này; liên hệ admin
504Gateway Hết thời gian chờUpstream connection or stream stalled and timed out

Mã thanh toán có thể đọc được bằng máy

A 402 can represent different controls. Use these stable codes to choose the correct action.

Mã
Mô tả
byok_key_invalidKhóa BYOK do bạn tự cấu hình đã bị nhà cung cấp upstream từ chối; hãy kiểm tra hoặc xoay vòng khóa trong phần cài đặt BYOK. Lỗi này chỉ xuất hiện ở chế độ strict.
budget_cap_reachedA weekly or monthly budget cap was reached; raise or reset the cap.
credit_limit_exceededA monthly-billing organization's credit line was exhausted; contact billing.
insufficient_creditsThe prepaid balance is insufficient; add credits.
spend_limit_exceededThe API key reached its daily, weekly, or monthly spend limit.
capacity_unavailableThis model is temporarily at capacity. Retry shortly; the Retry-After header says how long to wait.

Stable error.code catalog

These string codes are emitted by public inference and media paths. Branch on the string code when present; the HTTP status remains the broad failure class.

Mô hình và điểm cuối Các lỗi tra cứu mô hình, vòng đời, giá cả, phương thức và điểm cuối của
.
Mã
HTTP
unknown_model400
invalid_model_id400
model_not_found404
model_retired410
model_endpoint_mismatch400
embedding_on_chat_endpoint400
model_not_priced400
invalid_modality_for_model400
Yêu cầu và an toàn
Các tham số, ngữ cảnh, công cụ, lược đồ và từ chối an toàn nội dung không hợp lệ.
Mã
HTTP
missing_required_field400
unsupported_param400
max_tokens_invalid400
context_too_long400
tool_use_unsupported400
malformed_tool_messages400
invalid_response_format_schema400
invalid_tools_definition400
content_moderation403
content_filter403
unknown_4xx400
Tạo và chỉnh sửa hình ảnh
Lỗi đầu vào hình ảnh, chỉnh sửa nhiều phần, đầu ra và đường dẫn hình ảnh.
Mã
HTTP
invalid_image_url400
input_images_not_supported400
invalid_content_type400
mask_not_supported400
unsupported_response_format400
missing_prompt400
missing_image400
too_many_images400
invalid_image_type400
image_too_large400
invalid_n400
pipeline_error502
no_images502
Định tuyến ngược dòng
Các lỗi kết nối, xác thực, điều chỉnh và tính khả dụng của nhà cung cấp đã được vệ sinh.
Mã
HTTP
upstream_unreachable502
upstream_auth_failed502
upstream_rate_limited429
capacity_unavailable429
upstream_unavailable502/503
byok_key_invalid424

Kiểm duyệt nội dung

Tất cả các yêu cầu đều được tự động kiểm duyệt trước khi gửi đến mô hình. Các yêu cầu vi phạm chính sách sử dụng của chúng tôi sẽ bị từ chối trước khi đến mô hình và trả về lỗi 403.

Các danh mục nội dung sẽ bị chặn

Việc kiểm duyệt dựa trên Chính sách Sử dụng Được chấp nhận (Acceptable Use Policy) của chúng tôi và chủ yếu chặn các danh mục nội dung sau:

  • Nội dung bóc lột tình dục
  • Đe dọa bạo lực
  • Hướng dẫn thực hiện hành vi bất hợp pháp
  • Nội dung liên quan đến nguy cơ sinh học

Định dạng phản hồi 403

Một yêu cầu bị chặn bởi kiểm duyệt sẽ trả về lỗi theo định dạng sau:

{
  "error": {
    "message": "Your prompt was blocked by content moderation.",
    "type": "invalid_request_error",
    "code": "content_filter"
  }
}

Các yêu cầu bị chặn sẽ không bị tính phí — bạn sẽ không bị tính phí cho một yêu cầu bị từ chối.

Khiếu nại khi bị chặn nhầm

Nếu bạn cho rằng một yêu cầu đã bị chặn không chính xác, vui lòng liên hệ bộ phận hỗ trợ kèm theo thời gian yêu cầu và (nếu thuận tiện) request id — chúng tôi sẽ xem xét lại.

Quyền riêng tư

Yêu cầu được tự động kiểm duyệt an toàn nội dung; văn bản và hình ảnh trong đầu vào mới nhất của bạn có thể được gửi tới dịch vụ chấm điểm an toàn nội dung của bên thứ ba.

Với yêu cầu bị xác định là vi phạm, nghi vi phạm, gần ngưỡng hoặc được lấy mẫu ngẫu nhiên, chúng tôi có thể lưu toàn văn hoặc phần đầu làm bằng chứng tuân thủ, xử lý tranh chấp và kiểm toán, và không cam kết thời hạn xóa cố định.

Các yêu cầu thành công thông thường khác không được lưu prompt và phản hồi; yêu cầu dùng khóa ZDR không thuộc hai điểm đầu.

Giới hạn tỷ lệ, ngân sách và phanh khẩn cấp

These controls can reject an otherwise valid request and require different recovery actions.

Điều khiển
HTTP
Làm thế nào để xác định nó Giới hạn tốc độ yêu cầu
429Mã string hoặc mã số 429; sử dụng header Retry-After và X-RateLimit-*.
Khối hình phạt giới hạn tỷ lệ429Mã số 429 và thông báo hạn chế tạm thời; sử dụng Thử lại sau. Phanh khẩn cấp
Global503Mã số 503, thông báo giới hạn chi tiêu toàn cầu và Thử lại sau 30 hoặc 300 giây.
Scoped spend brake429Numeric code 429 and a spend circuit-breaker message naming the scope.
Kiểm soát thanh toán và ngân sách402Sử dụng mã chuỗi thanh toán ổn định được liệt kê ở trên.

Envelope lỗi khác nhau theo endpoint. Dựa vào HTTP status và error.type nếu có. error.code có thể là chuỗi hoặc số, đôi khi không có; error.message chỉ để hiển thị.

Trạng thái tài nguyên video và phương tiện

Video validation commonly returns numeric code 400. Missing jobs return 404, retired models 410, unfinished video content 409, and invalid video byte ranges 416.

Chính sách thử lại

Retry only failures that may recover without changing the request. Honor Retry-After or use exponential backoff with jitter. Do not stack SDK and manual retries.

Thử lại với thời gian chờ
429, 502, 503, and 504. Check the original generation job before creating another after an ambiguous network failure.
Fix trước khi thử lại
400, 401, 402, 403, 404, 409, 410, 413, and 416. Fix the request, credentials, balance, permissions, resource state, or Range header first.

Xử lý lỗi

import random
import time
from openai import OpenAI, APIStatusError

client = OpenAI(
    base_url="https://api.bazaarlink.ai/v1",
    api_key="sk-bl-YOUR_API_KEY",
    max_retries=0,  # Avoid double retries; this example handles them.
)

RETRYABLE = {429, 502, 503, 504}

for attempt in range(5):
    try:
        response = client.chat.completions.create(
            model="openai/gpt-4o",
            messages=[{"role": "user", "content": "Hello!"}],
        )
        break
    except APIStatusError as error:
        if error.status_code not in RETRYABLE or attempt == 4:
            raise
        retry_after = error.response.headers.get("Retry-After")
        delay = (
            float(retry_after)
            if retry_after
            else min(8, 0.5 * (2 ** attempt)) + random.uniform(0, 0.25)
        )
        time.sleep(delay)

Định dạng lỗi Streaming

Lỗi xảy ra trước khi stream token trả về phản hồi HTTP lỗi tiêu chuẩn với body JSON.

Sau khi stream bắt đầu, phản hồi HTTP đã là 200. Hãy phân tích từng SSE data frame và coi error cấp cao nhất hoặc choices[0].finish_reason === "error" là phản hồi thất bại, chưa hoàn chỉnh.

Nếu stream thất bại sau khi bắt đầu, BazaarLink có thể phát sự kiện SSE cuối cùng chứa đối tượng error cấp cao nhất, theo sau là data: [DONE]. Hãy coi phản hồi là chưa hoàn chỉnh; không dùng đầu ra một phần như kết quả đã hoàn tất.

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

data: [DONE]

// Branch on error.code; error.type can vary by failure path.

Gọi công cụ

Gọi công cụ (còn gọi là gọi hàm) cho phép mô hình gọi các hàm bên ngoài mà bạn định nghĩa. Mô hình quyết định khi nào gọi công cụ và tạo tham số có cấu trúc — code của bạn thực thi hàm và trả về kết quả để tiếp tục hội thoại.

Mô hình được hỗ trợ

Hầu hết mô hình tiên tiến hỗ trợ gọi công cụ. Dưới đây là một số lựa chọn phổ biến:

Định nghĩa công cụ

Mỗi công cụ là đối tượng JSON mô tả hàm mô hình có thể gọi. Trường parameters sử dụng JSON Schema.

namebắt buộc
string
Tên hàm (a-z, A-Z, 0-9, gạch dưới, gạch ngang)
descriptionbắt buộc
string
Mô tả rõ ràng khi nào và cách sử dụng hàm
parametersbắt buộc
object
Đối tượng JSON Schema định nghĩa tham số hàm

Tùy chọn tool_choice

Giá trị
Hành vi
"auto"Mô hình quyết định có gọi công cụ không (mặc định)
"none"Mô hình sẽ không gọi bất kỳ công cụ nào
"required"Mô hình phải gọi ít nhất một công cụ
{"type": "function", "function": {"name": "get_weather"}}Mô hình phải gọi hàm được chỉ định

Luồng hoàn chỉnh

Gọi công cụ là quy trình đa lượt: (1) gửi yêu cầu với công cụ → (2) mô hình trả về tool_calls → (3) thực thi hàm → (4) gửi kết quả lại → (5) mô hình tạo phản hồi cuối cùng.

curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o",
    "messages": [{"role":"user","content":"What is the weather in Taipei?"}],
    "tools": [{
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "Get current weather for a city",
        "parameters": {
          "type": "object",
          "properties": {
            "city": {"type": "string", "description": "City name"},
            "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
          },
          "required": ["city"]
        }
      }
    }],
    "tool_choice": "auto"
  }'
# Response carries tool_calls — run get_weather() yourself, then send the
# result back with role:"tool" (same shape as the Python/TS steps 3-5) to
# get the model's final answer.

Gọi công cụ song song

Một số mô hình có thể gọi nhiều công cụ trong một phản hồi. Xử lý từng lệnh gọi và trả về tất cả kết quả:

# Model may return multiple tool_calls
if message.tool_calls:
    messages = [
        {"role": "user", "content": "Weather and time in Tokyo?"},
        message,
    ]

    for tool_call in message.tool_calls:
        # Execute each function
        if tool_call.function.name == "get_weather":
            result = {"temperature": 22, "condition": "Clear"}
        elif tool_call.function.name == "get_time":
            result = {"time": "2026-02-23T15:30:00+09:00"}

        messages.append({
            "role": "tool",
            "tool_call_id": tool_call.id,
            "content": json.dumps(result),
        })

    # Send all results back at once
    final = client.chat.completions.create(
        model="openai/gpt-4o",
        messages=messages,
        tools=tools,
    )
    print(final.choices[0].message.content)

Gọi công cụ khi streaming

Khi streaming, các lệnh gọi công cụ đến dưới dạng delta từng phần được đánh chỉ số theo vị trí — tích lũy chuỗi tham số của mỗi delta theo chỉ số cho đến khi finish_reason trở thành "tool_calls", báo hiệu lệnh gọi đã hoàn tất.

# Streaming: tool_calls arrive as partial deltas indexed by position —
# accumulate function.arguments per index until finish_reason == "tool_calls".
stream = client.chat.completions.create(
    model="openai/gpt-4o",
    messages=[{"role": "user", "content": "What's the weather in Taipei?"}],
    tools=tools,
    tool_choice="auto",
    stream=True,
)

tool_calls = {}
for chunk in stream:
    delta = chunk.choices[0].delta
    if delta.tool_calls:
        for tc in delta.tool_calls:
            entry = tool_calls.setdefault(tc.index, {"id": "", "name": "", "arguments": ""})
            if tc.id:
                entry["id"] = tc.id
            if tc.function.name:
                entry["name"] = tc.function.name
            if tc.function.arguments:
                entry["arguments"] += tc.function.arguments
    if chunk.choices[0].finish_reason == "tool_calls":
        for call in tool_calls.values():
            print(call["name"], json.loads(call["arguments"]))

Vòng lặp Agent đơn giản

Một mẫu chung tiếp tục gọi mô hình khi mô hình còn yêu cầu công cụ, và dừng lại khi mô hình trả về câu trả lời cuối cùng — dùng max_iterations để tránh vòng lặp vô hạn.

# Generic loop: keep calling the model while it keeps requesting tools,
# stop once it returns a plain answer. max_iterations guards against loops.
messages = [{"role": "user", "content": "What's the weather in Taipei, and what time is it there?"}]
max_iterations = 10

for _ in range(max_iterations):
    response = client.chat.completions.create(
        model="openai/gpt-4o",
        messages=messages,
        tools=tools,
    )
    message = response.choices[0].message
    messages.append(message)

    if not message.tool_calls:
        break  # model gave a final answer

    for tool_call in message.tool_calls:
        args = json.loads(tool_call.function.arguments)
        result = TOOL_MAPPING[tool_call.function.name](**args)
        messages.append({
            "role": "tool",
            "tool_call_id": tool_call.id,
            "content": json.dumps(result),
        })
else:
    print("Warning: max_iterations reached without a final answer")

print(messages[-1].content)

Thực hành tốt nhất khi định nghĩa hàm

  • Dùng tên cụ thể, rõ nghĩa — get_weather_forecast thay vì chỉ weather.
  • Viết mô tả rõ ràng về chức năng và thời điểm nên dùng — mô hình chỉ dựa vào đoạn văn bản này để quyết định có gọi hay không.
  • Giới hạn giá trị bằng enum khi có thể và thêm ví dụ trong mô tả để giảm khả năng tham số bị sai định dạng.
  • Chỉ đánh dấu required cho các trường thực sự bắt buộc — trường tùy chọn phải thực sự có thể bỏ qua.

Đầu ra có cấu trúc

Buộc mô hình trả về JSON hợp lệ khớp với schema. Điều này thiết yếu để xây dựng ứng dụng đáng tin cậy phân tích đầu ra mô hình theo chương trình.

Phương pháp 1: response_format (JSON Schema)

để bắt buộc tuân thủ JSON Schema nghiêm ngặt:

typebắt buộc
string
Phải là "json_schema"
json_schema.namebắt buộc
string
Tên cho schema (dùng cho bộ nhớ đệm)
json_schema.strict
boolean
Khi true, đảm bảo tuân thủ schema chính xác
json_schema.schemabắt buộc
object
Định nghĩa JSON Schema
curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o",
    "messages": [{"role":"user","content":"Review the movie Inception"}],
    "response_format": {
      "type": "json_schema",
      "json_schema": {
        "name": "movie_review",
        "strict": true,
        "schema": {
          "type": "object",
          "properties": {
            "title": {"type": "string"},
            "rating": {"type": "integer", "description": "Rating 1-10"},
            "summary": {"type": "string"},
            "pros": {"type": "array", "items": {"type": "string"}},
            "cons": {"type": "array", "items": {"type": "string"}}
          },
          "required": ["title", "rating", "summary", "pros", "cons"],
          "additionalProperties": false
        }
      }
    }
  }'

Mẹo

  • Sử dụng tên thuộc tính rõ ràng, mô tả — mô hình sử dụng chúng làm ngữ cảnh.
  • Thêm mô tả vào thuộc tính schema để hướng dẫn mô hình.
  • Đặt strict: true để đảm bảo tuân thủ schema (có thể tăng độ trễ nhẹ).
  • Giữ schema đơn giản — schema lồng sâu có thể giảm chất lượng đầu ra.
  • Thử nghiệm với các mô hình khác nhau — một số xử lý schema phức tạp tốt hơn.

AHỗ trợ điền trước

Thêm một tin nhắn assistant chưa hoàn chỉnh làm mục cuối để yêu cầu tiếp tục trên các tuyến mô hình tương thích.

curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-sonnet-4.6",
    "messages": [
      {"role":"user","content":"What is the capital of France?"},
      {"role":"assistant","content":"The capital of France is"}
    ]
  }'
# Model continues: " Paris, known for the Eiffel Tower..."
Cách hoạt động
BazaarLink giữ nguyên và chuyển tiếp tin nhắn assistant cuối cùng. Hành vi tiếp tục do mô hình và nhà cung cấp upstream được chọn triển khai, vì vậy không được bảo đảm trên mọi tuyến.

Chuyển đổi tin nhắn

The client-supplied transforms field is ignored and removed before an upstream request. It cannot enable or disable message transformations. BazaarLink may apply context handling under its own server-side rules; shorten the input or select a model with a larger context window when needed.

Unsupported request field
Do not rely on transforms values such as middle-out; they do not change how this request is routed or processed.

Không lưu trữ dữ liệu

Với các yêu cầu thành công thông thường, BazaarLink không lưu trữ nội dung tin nhắn (ngoại lệ: xem Chính sách quyền riêng tư); chế độ khóa ZDR cung cấp zero data retention nghiêm ngặt hơn.

Xử lý dữ liệu hiện tại

  • Nội dung tin nhắn: không lưu trữ với yêu cầu thành công thông thường (ngoại lệ: xem Chính sách quyền riêng tư); chế độ khóa ZDR nghiêm ngặt hơn
  • Bản ghi mức sử dụng cho thanh toán và vận hành: số token, thời gian, mô hình, chi phí, độ trễ và trạng thái
  • Nhật ký sử dụng: với yêu cầu thành công thông thường chỉ có thống kê mức sử dụng, không có nội dung tin nhắn
  • Chuyển tiếp upstream: tuân theo chính sách quyền riêng tư của họ

Bộ nhớ đệm Prompt

Bộ nhớ đệm prompt tái sử dụng token prompt đã tính toán, giảm đáng kể chi phí và độ trễ.

Note
BazaarLink tự động theo dõi tiết kiệm cache và phản ánh trong thanh toán.

Cách hoạt động

Việc có cần cấu hình hay không tùy thuộc vào nhà cung cấp. Các mô hình họ OpenAI tự động cache tiền tố prompt dài và lặp lại — không cần thay đổi request. Các mô hình Claude (Anthropic) chỉ cache khi request chứa điểm ngắt cache_control rõ ràng; BazaarLink không tự thêm điều này thay bạn, nên một request Claude không có marker sẽ không bao giờ được cache. BazaarLink chuyển tiếp nguyên vẹn các cache marker bạn gửi và báo cáo số token cache đọc/ghi thực tế trong phản hồi usage.

# OpenAI-family models: nothing to add, long repeated prefixes cache automatically.
response = client.chat.completions.create(
    model="openai/gpt-4o",
    messages=[
        {"role": "system", "content": "You are an expert..."},  # cached automatically if long/repeated
        {"role": "user", "content": "Question here"},
    ],
)

# Check cache savings in the response usage
usage = response.usage
print(f"Prompt tokens: {usage.prompt_tokens}")
print(f"Cached tokens: {usage.prompt_tokens_details.cached_tokens}")
print(f"Cache savings: {usage.prompt_tokens_details.cached_tokens / usage.prompt_tokens * 100:.1f}%")
Claude cần marker cache_control rõ ràng
Thêm cache_control: {"type": "ephemeral"} vào khối nội dung bạn muốn cache, như ví dụ bên dưới. Anthropic cũng áp đặt độ dài prompt tối thiểu riêng — dưới ngưỡng đó, dù có marker vẫn không được cache mà không báo lỗi. Hãy kiểm tra cached_tokens (định dạng OpenAI) hoặc cache_read_input_tokens / cache_creation_input_tokens (định dạng Anthropic) trong phản hồi để xác nhận có cache hit hay không.
# Claude models: you must mark the block to cache yourself.
response = client.chat.completions.create(
    model="anthropic/claude-sonnet-4.6",
    messages=[
        {
            "role": "system",
            "content": [
                {"type": "text", "text": "You are an expert...", "cache_control": {"type": "ephemeral"}}
            ],
        },  # BazaarLink does not add cache_control on your behalf
        {"role": "user", "content": "Question here"},
    ],
)

usage = response.usage
print(f"Cache read tokens: {getattr(usage, 'cache_read_input_tokens', 0)}")
print(f"Cache write tokens: {getattr(usage, 'cache_creation_input_tokens', 0)}")

Token suy luận

Mô hình suy luận (ví dụ DeepSeek R1, o1 series) suy nghĩ nội bộ trước khi tạo câu trả lời cuối cùng. Các token nội bộ này được tính phí riêng.

Note
BazaarLink báo cáo token suy luận trong `usage.completion_tokens_details.reasoning_tokens`.

Đọc token suy luận từ phản hồi

response = client.chat.completions.create(
    model="deepseek/deepseek-r1",
    messages=[{"role": "user", "content": "Solve: if f(x) = x^2 + 3x, what is f(5)?"}],
)

# Read reasoning tokens from usage
usage = response.usage
print(f"Completion tokens: {usage.completion_tokens}")
if hasattr(usage, "completion_tokens_details"):
    details = usage.completion_tokens_details
    print(f"Reasoning tokens: {details.reasoning_tokens}")
    print(f"Output tokens: {details.accepted_prediction_tokens}")
const response = await client.chat.completions.create({
  model: "openai/gpt-5.5",
  messages: [{ role: "user", content: "Prove that sqrt(2) is irrational." }],
  // @ts-ignore - BazaarLink extension
  reasoning_effort: "high",  // low | medium | high
});

const usage = response.usage;
console.log("Reasoning tokens:", usage?.completion_tokens_details?.reasoning_tokens);

Điều khiển chế độ suy nghĩ

Một số mô hình hỗ trợ bật/tắt chế độ "suy nghĩ".

Dòng mô hìnhTham sốMặc định
qwen3-*enable_thinking: booleanfalse (mặc định nền tảng)
openai/gpt-5.5, gpt-5.6-sol, gpt-5.4reasoning_effort: "low" | "medium" | "high"medium
deepseek/deepseek-r1—Luôn bật (không thể tắt)
# Qwen3: explicitly enable thinking mode
response = client.chat.completions.create(
    model="qwen/qwen3.7-flash",
    messages=[{"role": "user", "content": "Prove the Pythagorean theorem"}],
    extra_body={"enable_thinking": True},  # opt-in to thinking
)

# usage.completion_tokens_details.reasoning_tokens shows thinking token count

Đối tượng reasoning thống nhất (Formaat mới)

BazaarLink cũng hỗ trợ đối tượng reasoning thống nhất, hoạt động trên tất cả dòng mô hình:

TrườngGiá trịÁp dụng cho
reasoning.effort"xhigh" | "high" | "medium" | "low" | "none"OpenAI o-series, Grok
reasoning.max_tokensintegerAnthropic Claude, Gemini
reasoning.excludebooleanẨn suy nghĩ khỏi phản hồi (mô hình vẫn suy luận)
// Claude extended thinking — specify thinking budget in tokens
const response = await client.chat.completions.create({
  model: "anthropic/claude-sonnet-4.5",
  messages: [{ role: "user", content: "Prove the Pythagorean theorem" }],
  // @ts-ignore - BazaarLink extension
  reasoning: { max_tokens: 5000 },
});

// OpenAI GPT-5.6 Sol — specify effort level
const response2 = await client.chat.completions.create({
  model: "openai/gpt-5.6-sol",
  messages: [{ role: "user", content: "Solve this math problem..." }],
  // @ts-ignore - BazaarLink extension
  reasoning: { effort: "high" },
});

// Hide thinking content from response (model still thinks)
const response3 = await client.chat.completions.create({
  model: "anthropic/claude-sonnet-4.5",
  messages: [{ role: "user", content: "What is 2+2?" }],
  // @ts-ignore - BazaarLink extension
  reasoning: { max_tokens: 2000, exclude: true },
});

Đọc nội dung suy nghĩ

Mô hình suy luận có thể trả về nội dung suy nghĩ cùng với câu trả lời. Với các mô hình liệt kê bên dưới, chế độ suy nghĩ được bật theo mặc định: yêu cầu không gửi tham số suy luận nào sẽ chạy với suy nghĩ được bật, trả về nội dung suy nghĩ và bị tính phí theo số token suy nghĩ thực tế đã dùng. Gửi reasoning: { exclude: true } hoặc include_reasoning: false để tắt. Mọi mô hình khác chỉ trả về nội dung suy nghĩ khi bạn yêu cầu: gửi reasoning_effort, đối tượng reasoning, include_reasoning: true, thinking hoặc enable_thinking.

Các mô hình suy nghĩ theo mặc định: gemini-4-argon, deepseek-v4.1-flash, deepseek-v4.1-flash-1017

Cách yêu cầu

Gửi một trong các tham số sau trong yêu cầu: reasoning_effort (low, medium hoặc high), đối tượng reasoning (effort, max_tokens), include_reasoning: true, thinking: { type: "enabled" } hoặc enable_thinking: true. Gửi reasoning.exclude: true hoặc include_reasoning: false để tắt nội dung suy nghĩ (mô hình vẫn suy luận).

TrườngVị tríÝ nghĩa
reasoningchoices[].message.reasoningNội dung suy nghĩ (chuỗi)
reasoning_detailschoices[].message.reasoning_detailsNội dung suy nghĩ dưới dạng danh sách mục, mỗi mục chỉ có type và text
reasoningchoices[].delta.reasoningStreaming: nội dung suy nghĩ đến theo từng phần (delta.reasoning và delta.reasoning_details), trước văn bản trả lời trong delta.content
Note
Không có tham số: các mô hình liệt kê ở trên suy nghĩ theo mặc định, nên bạn nhận được nội dung suy nghĩ và trả phí cho token suy nghĩ (usage.completion_tokens_details.reasoning_tokens). Với mọi mô hình khác, không có tham số thì không có nội dung suy nghĩ: bạn chỉ nhận câu trả lời (message.content), y hệt như trước. Để tắt suy nghĩ trên mô hình đã liệt kê, gửi reasoning.exclude: true hoặc include_reasoning: false: không có suy nghĩ nào được chạy và không tính phí token suy nghĩ. Trên các mô hình suy luận khác, exclude chỉ ẩn văn bản; token suy luận của chúng vẫn được tính.

Xem mô hình hỗ trợ mức nào bằng GET /v1/models: mỗi mô hình reasoning liệt kê reasoning.supported_efforts, reasoning.default_effort và reasoning.mandatory (ví dụ gemini-4-argon hỗ trợ high, medium và low).

Ví dụ: gemini-4-argon

response = client.chat.completions.create(
    model="gemini-4-argon",
    messages=[{"role": "user", "content": "Which is larger, 9.11 or 9.9?"}],
    reasoning_effort="high",  # or: extra_body={"include_reasoning": True}
)

message = response.choices[0].message
print(message.reasoning)          # the thinking text (only returned because we asked)
print(message.content)            # the answer
const stream = await client.chat.completions.create({
  model: "gemini-4-argon",
  messages: [{ role: "user", content: "Which is larger, 9.11 or 9.9?" }],
  stream: true,
  // @ts-ignore - BazaarLink extension
  reasoning: { effort: "high" },
});

for await (const chunk of stream) {
  const delta: any = chunk.choices[0]?.delta;
  if (delta?.reasoning) process.stdout.write(delta.reasoning); // thinking text
  if (delta?.content) process.stdout.write(delta.content);     // answer
}

Với /v1/responses, yêu cầu bằng reasoning: { effort, summary: "auto" }; nội dung suy nghĩ được trả về trong mục reasoning của mảng output. Với /v1/messages, gửi thinking: { type: "enabled", budget_tokens } để nhận khối thinking.

Giá
Token suy nghĩ được tính như token completion. Một số nhà cung cấp tính giá cao hơn cho chế độ suy nghĩ.

Độ trễ & Hiệu suất

Tối ưu hóa độ trễ phản hồi API AI rất quan trọng cho trải nghiệm người dùng.

Note
BazaarLink ghi nhận `duration_ms` (độ trễ đầu-cuối) và `throughput` (token/giây) cho mỗi yêu cầu — tra cứu qua GET /v1/generation?id=... hoặc trong CSV Activity Export.

Yếu tố ảnh hưởng độ trễ

  • Kích thước mô hình: mô hình lớn hơn (70B+) thường chậm hơn
  • Tải nhà cung cấp: thay đổi theo nhà cung cấp và thời điểm
  • Số lượng token: max_tokens cao hơn = thời gian hoàn thành lâu hơn
  • Streaming vs. không streaming: stream: true cung cấp token đầu tiên nhanh hơn
  • Độ dài ngữ cảnh: ngữ cảnh rất dài tăng thời gian xử lý

Mẹo tối ưu

  • Ưu tiên streaming (stream: true) để cải thiện độ trễ cảm nhận
  • Chọn mô hình nhỏ hơn (flash/mini/haiku) cho tình huống nhạy cảm độ trễ
  • Bật bộ nhớ đệm prompt để giảm độ trễ cho yêu cầu lặp lại
import time

# Measure time to first token with streaming
start = time.time()
first_token_time = None

stream = client.chat.completions.create(
    model="google/gemini-3.5-flash",  # Fast model
    messages=[{"role": "user", "content": "Hello!"}],
    stream=True,
)

for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content and not first_token_time:
        first_token_time = time.time() - start

print(f"Time to first token: {first_token_time:.3f}s")
# Look up per-request latency and throughput after the fact, using the
# generation ID from the response (or the final streamed chunk).
curl "https://api.bazaarlink.ai/v1/generation?id=BAZAARLINK_REQUEST_ID" \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY"

# Response
{
  "data": {
    "id": "85e6f35c71a31f19-SJC",
    "model": "google/gemini-3.5-flash",
    "duration_ms": 842,
    "throughput": 61.2,
    "usage": { "prompt_tokens": 12, "completion_tokens": 48, "total_tokens": 60 }
  }
}

Tối ưu hóa Uptime

Sau lỗi upstream, yêu cầu có thể thử một nguồn khả dụng khác. Nếu không nguồn nào xử lý được, yêu cầu sẽ trả lỗi. Circuit breaker giới hạn việc thử lại và trạng thái nhà cung cấp được theo dõi.

Note
BazaarLink theo dõi tính khả dụng cho tất cả nhà cung cấp upstream.

Cơ chế khả dụng

  • Circuit breaker: tự động phát hiện và cô lập nhà cung cấp thất bại
  • Khi nguồn upstream gặp sự cố, yêu cầu có thể thử một nguồn khác đang khả dụng. Nếu không có nguồn nào khả dụng, yêu cầu sẽ trả lỗi.
  • Giám sát sức khỏe: theo dõi liên tục tỷ lệ lỗi và độ trễ
  • Logic thử lại: lỗi tạm thời (5xx) được tự động thử lại

Z

# If an upstream source returns an error, the request can try another available source.
# Requests handled by a platform model are billed at that model's catalog price.

response = client.chat.completions.create(
    model="openai/gpt-4o",       # Primary model
    messages=[{"role": "user", "content": "Hello!"}],
    extra_body={
        "models": [              # Local fallback chain, tried in order
            "openai/gpt-4o",
            "anthropic/claude-sonnet-4.6",
            "google/gemini-3.5-flash",
        ],
    },
)

# Check whether another source handled the request (in usage logs)
# "is_failover": true indicates the primary provider was bypassed
Giám sát tình trạng nhà cung cấp chỉ dành cho vận hành nội bộ
GET /api/admin/provider-health là endpoint nội bộ cho dashboard vận hành, yêu cầu xác thực quản trị viên. Nó trả về dữ liệu vận hành đầy đủ (lượng yêu cầu, tỷ lệ lỗi, phân vị độ trễ, thống kê failover theo từng nhà cung cấp, v.v.) — không phải API công khai cho khách hàng thông thường, nên chúng tôi không tái hiện các trường thực tế ở đây.

Rào chắn

Thêm cơ chế an toàn nội dung vào yêu cầu API để lọc nội dung có hại và thực thi chính sách tuân thủ. BazaarLink hiện chỉ cung cấp rào chắn lọc nội dung có thể tùy chỉnh ở cấp tổ chức (Organization); khóa API cá nhân (không thuộc tổ chức) không có thiết lập tương đương — an toàn nội dung hoàn toàn phụ thuộc vào hệ thống an toàn tích hợp riêng của từng nhà cung cấp mô hình upstream.

Phạm vi hiện tại
Khóa API cá nhân không có rào chắn tùy chỉnh tích hợp sẵn — an toàn nội dung hoàn toàn phụ thuộc vào hệ thống an toàn của nhà cung cấp upstream. Nếu bạn cần quy tắc lọc nội dung tùy chỉnh (chặn/che giấu/ghi nhận, quy tắc từ khóa và regex, mẫu PII tích hợp), hãy tạo một tổ chức và dùng khóa API tổ chức — cấu hình tại "Content Filter Guardrails."

Tính năng dự kiến (chưa có cho cả khóa cá nhân lẫn tổ chức)

Rào chắn
Mô tả
Phát hiện PIIPhát hiện và che giấu thông tin nhận dạng cá nhân
Hạn chế chủ đềHạn chế phản hồi mô hình chỉ cho các chủ đề được phê duyệt
Xác thực đầu raXác thực đầu ra mô hình theo quy tắc tùy chỉnh trước khi trả về

Hành vi hiện tại

Khóa API cá nhân: tất cả nhà cung cấp upstream có hệ thống an toàn nội dung riêng — phản hồi mô hình kích hoạt bộ lọc nội dung sẽ trả về với finish_reason: "content_filter", và BazaarLink không áp dụng lọc bổ sung. Khóa API tổ chức: org_admin có thể cấu hình quy tắc tùy chỉnh (chặn/che giấu/ghi nhận) tại "Content Filter Guardrails," áp dụng trước khi văn bản đến mô hình.

Cursor IDE

Đặt BazaarLink làm Override URL của OpenAI trong Cursor. Cài đặt với chuyển đổi Responses API tự động, chuẩn hóa định dạng tool, và quy ước tiền tố bz- cho các mô hình Claude.

Thiết lập nhanh

Trong Cursor, mở Settings → Models, sau đó:

  1. Đặt Override OpenAI Base URL thành https://api.bazaarlink.ai/v1
  2. Đặt Override OpenAI API Key thành khóa BazaarLink sk-bl-... của bạn
  3. Thêm tên mô hình mong muốn — xem bên dưới cho Claude (tiền tố bz-).
Tương thích ngược
Endpoint tương thích /cursor cũ vẫn hoạt động, trên cả hai host (https://api.bazaarlink.ai/v1/cursor và https://bazaarlink.ai/api/v1/cursor). Nó chỉ là một lớp chuyển tiếp mỏng của /v1/chat/completions — các thiết lập mới nên dùng base URL ở trên.

Tiền tố bz- (cho mô hình Claude)

Kiểm tra phía client của Cursor sẽ định tuyến mọi tên mô hình bắt đầu bằng claude- qua tích hợp Anthropic riêng của Cursor, bỏ qua Override URL của bạn. Để buộc Cursor gửi yêu cầu đến BazaarLink, thêm tiền tố bz- vào tên mô hình. Server gỡ tiền tố và phân giải phần còn lại qua alias map.

Nhập trong CursorPhân giải thành
bz-claude-sonnet-4.6anthropic/claude-sonnet-4.6
bz-claude-opus-4.7anthropic/claude-opus-4.7
gpt-4oopenai/gpt-4o
gemini-3.5-flashgoogle/gemini-3.5-flash

Các biến thể dấu chấm/gạch ngang được chuẩn hóa: bz-claude-sonnet-4.6 và bz-claude-sonnet-4-6 đều phân giải đến cùng mô hình.

Biến môi trường CURSOR_MODEL_MAP (override của vận hành)

Với BazaarLink tự host, đặt biến môi trường này để ánh xạ lại tên model phía Cursor sang canonical id của danh mục:

CURSOR_MODEL_MAP=gpt-claude-sonnet:anthropic/claude-sonnet-4.6,gpt-opus:anthropic/claude-opus-4.7

Bây giờ gpt-claude-sonnet được nhập trong Cursor sẽ ánh xạ thành anthropic/claude-sonnet-4.6 ở phía server. Hữu ích khi bạn muốn Cursor nghĩ một mô hình thuộc họ GPT (để định tuyến qua Override URL) trong khi thực tế bạn phục vụ Claude.

Điều gì xảy ra tự động

Khi một yêu cầu đến /v1/chat/completions, BazaarLink áp dụng các chuyển đổi tương thích này một cách trong suốt — bạn không cần làm gì phía client:

  • Tự phát hiện thân Responses API — nếu thân có input thay vì messages, nó được chuyển sang dạng Chat Completions (Cursor gửi định dạng Responses API cho các mô hình họ GPT).
  • Bọc các định nghĩa tool phẳng — Cursor Agent gửi { name, description, parameters } không có wrapper function. Chúng tôi bọc để upstream không từ chối với Tool '' not found in provided tools.
  • Ép định dạng tool_choice không đúng — Cursor gửi { type: "auto" } (dạng object, không có function). Quy chuẩn OpenAI yêu cầu dạng chuỗi cho auto/none/required, nên chúng tôi ép kiểu.
  • Loại bỏ các trường dành riêng cho nhà cung cấp khi upstream không hỗ trợ — parallel_tool_calls, logprobs, top_logprobs, logit_bias, service_tier, user được loại bỏ trước khi chuyển tiếp (nếu không upstream trả về 400).
  • Ánh xạ max_output_tokens → max_tokens và loại bỏ các trường chỉ dành cho Responses-API (previous_response_id, truncation, background, store). Trường reasoning được giữ lại cho các thân Chat-Completions gốc.

Chế độ Cursor Agent

Gọi tool hoạt động qua luồng tool-call Chat Completions tiêu chuẩn. Cursor gửi tools (Shell, Read, Write, Grep, v.v.) với tool_choice: "auto"; BazaarLink chuyển tiếp đến nhà cung cấp của mô hình bạn chọn, nơi quyết định có gọi tool hay không. Các lời gọi tool trả về dưới dạng các delta tool_calls tiêu chuẩn của OpenAI; Cursor thực thi cục bộ và tiếp tục cuộc hội thoại. Hoạt động giống nhau cho dù bạn chọn gpt-4o (OpenAI gốc) hay bz-claude-sonnet-4.6.

Gỡ lỗi từ chối từ upstream
Nếu bạn thấy lỗi 4xx từ nhà cung cấp, kiểm tra bảng admin Provider Health. Mọi phản hồi 4xx được lưu với toàn bộ thân lỗi upstream và bản tóm tắt thân yêu cầu chúng tôi đã chuyển tiếp — nhấp vào hàng 🔴 bất kỳ để mở rộng JSON.

Định tuyến mô hình

BazaarLink sử dụng định dạng provider/model-name để định tuyến yêu cầu đến nhà cung cấp upstream chính xác. Điều này cho bạn truy cập các mô hình chính qua một endpoint API duy nhất.

Định dạng ID mô hình

{provider}/{model-name}

# Examples
openai/gpt-5.4-mini
anthropic/claude-sonnet-4.6
google/gemini-3-flash-preview
deepseek/deepseek-v4.1-flash

Ưu tiên định tuyến

Khi bạn gửi yêu cầu, BazaarLink xác định nhà cung cấp upstream theo thứ tự sau:

  1. Khớp chính xác — tìm route mô hình khớp với ID mô hình đầy đủ
  2. Wildcard nhà cung cấp — fallback đến route provider/* (ví dụ openai/*)
  3. Wildcard toàn cục — fallback đến route * wildcard
  4. Khóa nhà cung cấp mặc định — chỉ với mô hình đã có trong danh mục, dùng khóa đang bật và được đánh dấu mặc định

Xem tất cả mô hình khả dụng trên trang Mô hình.

Bộ định tuyến tự động

Auto Router v3 chấm yêu cầu vào một trong 14 tier tác vụ rồi dùng primary và chuỗi fallback hiện được cấu hình cho tier đó. Bảng trả phí và miễn phí được quản lý riêng trong trang admin.

  • auto — dùng bảng định tuyến trả phí; mô hình thực tế hoàn thành yêu cầu được tính theo giá công khai.
  • auto:free — dùng bảng định tuyến miễn phí; trong hạn mức có phí 0 USD. Khi hết hạn mức, tài khoản có số dư có thể chuyển sang auto trả phí nếu chưa tắt fallback trả phí.

Cách sử dụng

Đặt model thành "auto" (trả phí) hoặc "auto:free" (miễn phí) để bật định tuyến tự động:

curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"auto","messages":[{"role":"user","content":"Review this TypeScript function"}]}'

Cách v3 chọn tier

Tier chung gồm simple, standard, complex, reasoning. Tier chuyên biệt gồm coding, vision, image, video, data, search, social, email, calendar, trading. Kết quả sát biên có độ tin cậy thấp được nâng lên một bậc.

  • Chấm tier: messages, tools, độ dài, từ khóa và tín hiệu cấu trúc chọn một trong 14 tier
  • Quy tắc cứng: hình ảnh, suy luận hình thức và tác vụ chuyên biệt có thể chọn tier trực tiếp
  • Tra route: đọc primary và tối đa 5 fallback hiện tại; tier bị tắt trả về 503
  • Thực thi: thử primary rồi các fallback theo thứ tự cấu hình
  • Theo dõi phản hồi: mô hình được chọn được trả về trong body phản hồi và header X-Auto-Resolved-Model

Bảng mô hình hiện tại

Các bảng dưới đây đọc cùng cấu hình trực tiếp mà inference và admin sử dụng. Primary, thứ tự fallback và trạng thái từng tier có thể đổi mà không cần triển khai lại.

auto

Tier
Primary
Fallbacks
State
simpleopenai/gpt-5.4-nano
google/gemini-3.1-flash-lite-previewanthropic/claude-haiku-4.5
enabled
standardgoogle/gemini-3-flash-preview
openai/gpt-5.4-minianthropic/claude-haiku-4.5
enabled
complexgoogle/gemini-3.1-pro-preview
anthropic/claude-sonnet-4.6openai/gpt-5.4-pro
enabled
reasoninganthropic/claude-opus-4.7
openai/gpt-5.4-progoogle/gemini-3.1-pro-preview
enabled
codingopenai/gpt-5.3-codex
anthropic/claude-sonnet-4.6openai/gpt-5.4-pro
enabled
visionopenai/gpt-5.4-image-2
—
enabled
imageopenai/gpt-5.4-image-2
—
enabled
videobytedance/seedance-2.0-fast
bytedance/seedance-2.0anthropic/claude-sonnet-4.6
enabled
dataopenai/gpt-5.4-pro
anthropic/claude-sonnet-4.6google/gemini-3.1-pro-preview
enabled
searchperplexity/sonar-pro
perplexity/sonar-reasoning-proopenai/gpt-5.4-pro
enabled
socialopenai/gpt-5.4-nano
google/gemini-3.1-flash-lite-previewanthropic/claude-haiku-4.5
enabled
emailopenai/gpt-5.4-nano
google/gemini-3.1-flash-lite-previewanthropic/claude-sonnet-4.6
enabled
calendaropenai/gpt-5.4-nano
google/gemini-3.1-flash-lite-preview
enabled
tradinganthropic/claude-opus-4.7
openai/gpt-5.4-progoogle/gemini-3.1-pro-preview
enabled

auto:free

Tier
Primary
Fallbacks
State
simpledeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
standarddeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
complexdeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
reasoningdeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
codingdeepseek/deepseek-v4-flash-0731free
reflection/beamnvidia/nemotron-3.5-lightning-free
enabled
visionopenai/gpt-5.4-image-2
—
disabled
imageopenai/gpt-5.4-image-2
—
disabled
videogoogle/gemini-2.5-flash-lite
—
disabled
datadeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
searchdeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
socialdeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
emaildeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
calendardeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
tradingdeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled

Một số mô hình cung cấp bậc miễn phí có giới hạn tốc độ. Quyền miễn phí do nền tảng cấp theo từng mô hình — gọi mô hình bằng ID thông thường; hậu tố :free chỉ là bí danh tùy chọn (thêm vào mô hình trả phí không làm nó miễn phí).

Sau khi hết hạn mức miễn phí
Sau khi dùng hết hạn mức miễn phí, yêu cầu vượt mức được tính theo giá trả phí của model nếu tài khoản còn số dư. Để nhận lỗi 429, hãy gửi `X-Free-Fallback: false` hoặc tắt chuyển sang mức trả phí trong cài đặt khóa. Nếu không còn số dư, yêu cầu vượt mức trả về 429. Khi một yêu cầu thực sự bị hạ cấp theo cách này, phản hồi sẽ mang theo header x-bl-free-fallback: daily hoặc x-bl-free-fallback: rpm cho biết giới hạn nào đã kích hoạt, giúp bạn phát hiện sự chuyển đổi ngay tại thời điểm gửi yêu cầu thay vì chỉ biết qua hóa đơn. Header này không xuất hiện ở các yêu cầu không bị hạ cấp.
X-Auto-Resolved-Model
Mô hình thực tế được chọn được trả về trong header X-Auto-Resolved-Model và trường model của phản hồi.

Biến thể mô hình

Các trường định tuyến do khách hàng chỉ định sẽ bị bỏ qua
provider (toàn bộ đối tượng), transforms, route, service_tier cấp cao nhất và preset bị xóa trước khi gửi đến upstream nên không thể chọn upstream hoặc bậc giá. Trên endpoint Chat Completions và Responses, mảng models được hỗ trợ làm danh sách dự phòng cục bộ: BazaarLink tự định tuyến từng model và áp dụng giá khách hàng của BazaarLink cho model đó; danh sách không được chuyển tiếp lên upstream. Các hậu tố :nitro, :floor và :exacto do khách hàng gửi sẽ bị bỏ qua. :eco vẫn là bậc tiết kiệm của BazaarLink và được ánh xạ nội bộ sang BazaarLink :floor. :free vẫn là biến thể model riêng trong danh mục.

ID mô hình độc lập

Các biến thể danh mục như :free, :extended và :thinking có thể xác định mục có khả năng hoặc giá danh mục khác nhau. Tuyến upstream và giá khách hàng do danh mục cùng quy tắc phía máy chủ của BazaarLink quyết định.

:free
:extended
:thinking
:nitro
:floor
:exacto
Chi phí bổ sung cho tìm kiếm web
Tìm kiếm web được yêu cầu qua plugins, :online hoặc web_search_options vẫn hoạt động như hiện tại và có thể phát sinh phụ phí upstream. Phí được tính vào khóa dùng cho yêu cầu: khóa nền tảng BazaarLink hoặc khóa BYOK của bạn.
:online

Mô hình miễn phí

Một số mô hình cung cấp bậc miễn phí có giới hạn tốc độ. Quyền miễn phí do nền tảng cấp theo từng mô hình — gọi mô hình bằng ID thông thường; hậu tố :free chỉ là bí danh tùy chọn (thêm vào mô hình trả phí không làm nó miễn phí).

  • Gọi ID mô hình thông thường (ví dụ deepseek/deepseek-v4-flash). Yêu cầu trong hạn mức miễn phí được phục vụ miễn phí tự động.
  • Mức dùng miễn phí bị giới hạn theo người dùng bằng số yêu cầu mỗi phút và trần hằng ngày. Giới hạn thay đổi theo hạng tài khoản (chưa nạp / đã nạp).
  • Khi vượt hạn mức miễn phí và còn tín dụng, yêu cầu tự động tiếp tục ở bậc trả phí theo giá niêm yết. Gửi X-Free-Fallback: false để tắt chuyển tiếp tự động và nhận 429 thay thế. Không có tín dụng, yêu cầu vượt hạn mức trả về 429.
  • GET /v1/models liệt kê mục :free cho mỗi mô hình có bậc miễn phí; auto:free luôn định tuyến đến một mô hình miễn phí.

Mô hình đang có hạn mức miễn phí

Gọi trực tiếp các model ID này để dùng hạn mức miễn phí. Danh sách thay đổi theo thời gian — hãy truy vấn API để lấy bản mới nhất.

qwen/qwen3.7-flash
reflection/beam-free
stealth/glyph-cluster
nvidia/nemotron-3.5-lightning-free
inclusionai/ling-3.1-flash-1019
deepseek/deepseek-v4-flash-0731free

Giới hạn hạn mức miễn phí

Mục
Giá trị
Yêu cầu mỗi phút (RPM)10 / min
Ngân sách yêu cầu mỗi ngày60 / day
Hệ số hạng tài khoản — chưa nạp× 1
Hệ số hạng tài khoản — đã nạp× 2

Ngân sách hằng ngày = ngân sách yêu cầu ở trên × hệ số hạng tài khoản, tính riêng cho từng mô hình miễn phí. auto:free còn áp thêm giới hạn song song theo IP. Từng mô hình có thể được đặt giới hạn chặt hơn hoặc rộng hơn; giá trị thực tế hiển thị ở khối "Hạn mức miễn phí" trên trang mô hình. Hạn mức miễn phí được tính theo "đơn vị", không đơn thuần là số lượt yêu cầu: số đơn vị mà một yêu cầu tiêu thụ tăng theo độ dài context của prompt. Vì vậy với cùng hạn mức mỗi ngày, yêu cầu có context dài sẽ dùng được ít lượt hơn đáng kể so với prompt ngắn.

Sau khi hết hạn mức miễn phí

Sau khi dùng hết hạn mức miễn phí, yêu cầu vượt mức được tính theo giá trả phí của model nếu tài khoản còn số dư. Để nhận lỗi 429, hãy gửi `X-Free-Fallback: false` hoặc tắt chuyển sang mức trả phí trong cài đặt khóa. Nếu không còn số dư, yêu cầu vượt mức trả về 429.

Khi một yêu cầu thực sự bị hạ cấp theo cách này, phản hồi sẽ mang theo header x-bl-free-fallback: daily hoặc x-bl-free-fallback: rpm cho biết giới hạn nào đã kích hoạt, giúp bạn phát hiện sự chuyển đổi ngay tại thời điểm gửi yêu cầu thay vì chỉ biết qua hóa đơn. Header này không xuất hiện ở các yêu cầu không bị hạ cấp.

# Return 429 instead of switching to paid routing
-H "X-Free-Fallback: false"

Quản lý tổ chức

Tổ chức BazaarLink sử dụng kiến trúc ba cấp: Tổ chức → Nhóm → Thành viên. Tín dụng lưu ở cấp tổ chức; mỗi nhóm và thành viên có thể có giới hạn chi tiêu hàng tháng.

Quản lý tổ chức
Để thêm nhóm, mời thành viên hoặc đổi cài đặt, mở Cài đặt và chọn tổ chức

Hệ thống ngân sách ba cấp

Mỗi yêu cầu API được kiểm tra ba lớp ngân sách. Vượt bất kỳ lớp nào trả về HTTP 429:

  1. Ngân sách hàng tháng thành viên (OrgMember.monthlyBudget)
  2. Ngân sách hàng tháng nhóm (Team.monthlyBudget)
  3. Số dư tín dụng tổ chức (Organization.credits)

Báo cáo sử dụng

Trang Báo cáo cung cấp phân tích chi tiêu hàng tháng theo bốn chiều:

  • Tổng quan: tổng chi tiêu, tỷ lệ lợi nhuận, biểu đồ xu hướng hàng ngày
  • Theo nhóm: chi tiêu theo nhóm, tỷ lệ %, phân tích mô hình
  • Theo mô hình: chi tiêu theo mô hình, giá trung bình
  • Theo thành viên: chi tiêu theo thành viên — chỉ org_admin

Tất cả chế độ xem hỗ trợ xuất CSV với tiền tố BOM cho Excel.

Tạo & Quản lý tổ chức

  1. Vào Cài đặt → Tổ chức → Tạo tổ chức mới
  2. Tạo nhóm trong cổng tổ chức
  3. Mời thành viên bằng email, gán vai trò và nhóm
  4. Phát hành khóa API cho thành viên
  5. Xem trang Báo cáo để xem chi tiêu hàng tháng
  6. Xem trang Báo cáo để biết chi tiêu hàng tháng được chia theo Nhóm, Người mẫu hoặc Thành viên

Vai trò thành viên

org_adminToàn quyền: thành viên, nhóm, thanh toán, cài đặt
billing_viewerChỉ đọc báo cáo tài chính
team_adminQuản lý thành viên và ngân sách trong nhóm riêng
thành viênSử dụng API, tuân theo giới hạn ngân sách

Tổ chức có thể quản lý những gì khác?

Ngoài các thành viên và nhóm, khu vực quản lý tổ chức còn cung cấp:

  • API keys and model restrictions
  • Content filtering before text reaches a model
  • Allowed Models by organization, team, member, or key
  • Monthly budgets and spend emergency brakes
  • Reports and billing
  • Change logs and security logs

Lọc nội dung

Organization-owned rules inspect text before it reaches a model. An org_admin can enable, edit, and test them in Settings.

  • block: reject with HTTP 403
  • redact: replace matches with [REDACTED]
  • flag: send unchanged and record an audit event
  • Built-in sensitive-data and prompt-injection templates plus custom keyword or regex rules
  • Up to 100 safety-checked rules with a test preview
Hiện bị giới hạn ở chế độ nhập văn bản
Images, audio, video, some structured or multimodal content, and model output are not inspected.

Quản lý API (v1)

Endpoint /v1/orgs/ chấp nhận cả Bearer management key và session cookie.

Xác thực
Tất cả endpoint /v1/orgs/ yêu cầu vai trò org_admin.

Tổ chức

GET/v1/orgs

Liệt kê tất cả tổ chức mà người gọi thuộc về, kèm theo role và joinedAt.

GET/v1/orgs/:orgId

Lấy chi tiết tổ chức bao gồm số lượng team và member.

curl https://api.bazaarlink.ai/v1/orgs \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY"

Nhóm

GET/v1/orgs/:orgId/teams

Liệt kê các team kèm số lượng member, sắp xếp theo tên.

POST/v1/orgs/:orgId/teams
namebắt buộc
string
Tên hiển thị của team (phải duy nhất trong tổ chức)
costCenterCode
string
Mã cost center kế toán
monthlyBudget
number | null
Hạn mức chi tiêu hàng tháng của team tính bằng USD
PATCH/v1/orgs/:orgId/teams/:teamId

Cập nhật một phần — chỉ bao gồm các field cần thay đổi.

DELETE/v1/orgs/:orgId/teams/:teamId
# Create a team
curl https://api.bazaarlink.ai/v1/orgs/{orgId}/teams \
  -X POST \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Engineering", "costCenterCode": "ENG-001", "monthlyBudget": 500}'

Thành viên

GET/v1/orgs/:orgId/members

Liệt kê tất cả member kèm thông tin user lồng nhau (id/name/email) và team.

POST/v1/orgs/:orgId/members
emailbắt buộc
string
Email của một user BazaarLink hiện có
role
string
org_admin | billing_viewer | team_admin | member (mặc định: member)
teamId
string
Gán vào một team (bắt buộc nếu role là team_admin)
monthlyBudget
number | null
Hạn mức chi tiêu hàng tháng cho mỗi member tính bằng USD

404 nếu email không có tài khoản. 409 nếu đã là thành viên.

PATCH/v1/orgs/:orgId/members/:memberId

Cập nhật một phần role, teamId, hoặc monthlyBudget.

DELETE/v1/orgs/:orgId/members/:memberId

Trả về 400 nếu là org_admin cuối cùng.

# Add a member
curl https://api.bazaarlink.ai/v1/orgs/{orgId}/members \
  -X POST \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "alice@example.com", "role": "member", "monthlyBudget": 50}'

# Remove a member
curl https://api.bazaarlink.ai/v1/orgs/{orgId}/members/{memberId} \
  -X DELETE \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY"

API Báo cáo

Truy vấn dữ liệu chi tiêu hàng tháng theo chương trình.

Tham số truy vấn: year (mặc định năm hiện tại), month (mặc định tháng hiện tại, 1–12).

Điểm cuối
Mô tả
GET /api/orgs/:orgId/reports/overviewTổng chi tiêu, tỷ suất margin, xu hướng theo ngày
GET /api/orgs/:orgId/reports/by-teamChi tiêu theo team, tỷ trọng %, phân tích theo model, mức sử dụng ngân sách
GET /api/orgs/:orgId/reports/by-modelChi tiêu theo model, giá trung bình ($/1M tokens)
GET /api/orgs/:orgId/reports/by-memberChi tiêu theo member — chỉ org_admin
GET /api/orgs/:orgId/reports/exportTải xuống CSV; thêm ?view=overview|by-team|by-model|by-member
# Monthly overview via management key
curl "https://bazaarlink.ai/api/orgs/{orgId}/reports/overview?year=2026&month=3" \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY"

# By-team breakdown
curl "https://bazaarlink.ai/api/orgs/{orgId}/reports/by-team?year=2026&month=3" \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY"

# Export CSV (downloads file)
curl "https://bazaarlink.ai/api/orgs/{orgId}/reports/export?year=2026&month=3&view=by-team" \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY" \
  -o report.csv

Tham chiếu phản hồi lỗi

401API key không hợp lệ hoặc đã thu hồi
403RBAC từ chối (role không đủ) hoặc model không trong whitelist Allowed Models
402Một trong ba tầng ngân sách bị vượt; response body chứa scope (member / team / org) và reset time
429Spend Circuit Breaker bị trip; header Retry-After hiển thị thời gian phục hồi (giây)
503Phanh khẩn cấp trên toàn nền tảng hoặc ngừng dịch vụ tạm thời Tiêu đề

Mô hình được phép (Whitelist)

Hạn chế những mô hình mà tổ chức, nhóm hoặc thành viên cá nhân của bạn có thể gọi. Hữu ích để chặn các mô hình đắt tiền hoặc chưa được kiểm duyệt, áp dụng tiêu chuẩn mô hình, hoặc giới hạn một nhóm chỉ dùng một nhà cung cấp duy nhất.

Cách hoạt động

  • Ba tầng độc lập — Tổ chức, Nhóm, Thành viên — mỗi tầng có danh sách riêng (String[] trong cơ sở dữ liệu).
  • Khi cả ba tầng đều rỗng, mọi mô hình đều được phép (hành vi mặc định).
  • Khi một hoặc nhiều tầng không rỗng, danh sách hiệu lực là giao của các tầng không rỗng — một mô hình phải được phép ở mọi tầng có hạn chế thì mới được thông qua.
  • Thay đổi có hiệu lực trong vài giây (cache bộ nhớ 60s + cache Redis 5 phút; cả hai đều bị xóa khi cập nhật).

Định dạng pattern

  • Khớp chính xác — ví dụ openai/gpt-4o (chỉ riêng mô hình này).
  • Wildcard nhà cung cấp — ví dụ openai/* (mọi mô hình dưới prefix openai/).
  • Chỉ chữ thường. Tối đa 200 mục mỗi danh sách, 100 ký tự mỗi mục.

Nơi quản lý

Org Portal → Allowed Models. org_admin có thể chỉnh sửa danh sách org / team / member; team_admin có thể chỉnh sửa nhóm của mình và các thành viên trong nhóm đó.

Phản hồi lỗi khi bị chặn

Cuộc gọi đến mô hình không được phép trả về HTTP 403 với body sau:

HTTP/1.1 403 Forbidden
Content-Type: application/json

{
  "error": {
    "message": "Model is not allowed for this account",
    "code": "model_not_allowed"
  }
}

API quản lý

Tất cả endpoint chấp nhận Web Session hoặc Bearer Management Key (sk-bl-...). PATCH thay thế toàn bộ danh sách; truyền [] để xóa.

# Org-level list
GET    /api/orgs/:orgId/allowed-models
PATCH  /api/orgs/:orgId/allowed-models

# Team-level list
GET    /api/orgs/:orgId/teams/:teamId/allowed-models
PATCH  /api/orgs/:orgId/teams/:teamId/allowed-models

# Member-level list
GET    /api/orgs/:orgId/members/:memberId/allowed-models
PATCH  /api/orgs/:orgId/members/:memberId/allowed-models

# Example: restrict an org to OpenAI + a specific Anthropic model
curl -X PATCH https://bazaarlink.ai/api/orgs/$ORG_ID/allowed-models \
  -H "Authorization: Bearer sk-bl-..." \
  -H "Content-Type: application/json" \
  -d '{"allowedModels": ["openai/*", "anthropic/claude-sonnet-4.6"]}'

Cầu dao chi tiêu (Spend Kill Switch)

Một mức trần chi tiêu theo cửa sổ kép, chặn các yêu cầu tiếp theo khi chi phí upstream tăng đột biến. Được thiết kế để khống chế các script chạy loạn, vòng lặp vô hạn, hoặc lạm dụng key bị đánh cắp trước khi gây tổn thất tiền thực.

Cách hoạt động

  • Hai cửa sổ cố định được theo dõi trong Redis cho mỗi scope: chi phí upstream 1 phút và 1 giờ (USD).
  • Nếu chi tiêu của một trong hai cửa sổ chạm ngưỡng, mọi yêu cầu tiếp theo trong scope đó sẽ bị từ chối cho đến khi cửa sổ đặt lại.
  • Mặc định: $5 / phút, $20 / giờ. Tắt theo mặc định — cần tự bật.
  • Bộ đếm sống trong Redis với TTL — phục hồi tự động, không cần reset thủ công cho các trip ở cấp org/team/member.

Scopes (member ghi đè team ghi đè org)

Mỗi tầng có thể đặt ngưỡng riêng. Thứ tự phân giải là member → team → org → mặc định nền tảng — giá trị non-null đầu tiên thắng cho mỗi field (cbEnabled, cbMinuteUsd, cbHourlyUsd).

  • Cấp Org — áp dụng cho tất cả khóa thuộc tổ chức. Đặt trong Org Portal → Circuit Breaker.
  • Cấp Team — áp dụng cho tất cả khóa được gắn thẻ vào nhóm đó. Ghi đè org cho các khóa này.
  • Cấp Member — chỉ áp dụng cho các khóa được gắn thẻ vào thành viên đó. Ghi đè team và org.

Hành vi khi trip

Khi bị trip, các yêu cầu thất bại nhanh (không thực hiện cuộc gọi upstream nào). Phản hồi là HTTP 429 với body sau:

HTTP/1.1 429 Too Many Requests
Content-Type: application/json

{
  "error": {
    "message": "Spend circuit breaker tripped at member scope (minute window: $5.2341 ≥ $5.00). Try again later or contact your organization owner."
  }
}
Toàn cục so với theo phạm vi
Một cầu dao toàn cầu riêng biệt ở cấp nền tảng (do operator điều khiển, không hiển thị trong org portal) trả về HTTP 503 với header Retry-After. Operator đặt nó để bảo vệ nền tảng khỏi lạm dụng đa tenant — nó không thể bị ghi đè từ cài đặt org của bạn.

Nhật ký audit

Mọi sự kiện trip và mọi thay đổi cấu hình đều được ghi lại:

  • Sự kiện trip — actions org.cb.tripped / team.cb.tripped / org_member.cb.tripped. Khử trùng lặp thành một entry mỗi scope+window mỗi giờ, để một trip kéo dài không làm tràn nhật ký.
  • Thay đổi cấu hình — actions org.cb.update / team.cb.update / org_member.cb.update. Ghi lại giá trị before/after kèm theo actor.

API quản lý

Org admin có thể đọc và cập nhật cài đặt qua API. Tất cả endpoint chấp nhận Web Session hoặc Bearer Management Key (sk-bl-...). Gửi bất kỳ tập con field nào trong body PATCH; null xóa một field và quay về tầng cha.

# Org-level config
GET    /api/orgs/:orgId/circuit-breaker
PATCH  /api/orgs/:orgId/circuit-breaker

# Team-level config
GET    /api/orgs/:orgId/teams/:teamId/circuit-breaker
PATCH  /api/orgs/:orgId/teams/:teamId/circuit-breaker

# Member-level config
GET    /api/orgs/:orgId/members/:memberId/circuit-breaker
PATCH  /api/orgs/:orgId/members/:memberId/circuit-breaker

# Example: tighten the org-level cap to $2/min, $10/hr
curl -X PATCH https://bazaarlink.ai/api/orgs/$ORG_ID/circuit-breaker \
  -H "Authorization: Bearer sk-bl-..." \
  -H "Content-Type: application/json" \
  -d '{"cbMinuteUsd": 2, "cbHourlyUsd": 10, "cbEnabled": true}'

# GET response (org scope)
{
  "settings":         { "cbEnabled": true, "cbMinuteUsd": 2,  "cbHourlyUsd": 10  },
  "resolvedSettings": { "cbEnabled": true, "cbMinuteUsd": 2,  "cbHourlyUsd": 10  },
  "liveSpend":        { "minuteSpend": 0.4123, "hourSpend": 3.8721 }
}

Xoay vòng khóa API

Thay khóa API định kỳ là một thực hành bảo mật. Hãy tạo khóa mới, cập nhật và kiểm tra tích hợp, rồi thu hồi khóa cũ. Quy trình này không đảm bảo không có downtime.

Ghi chú
Khóa API có thể được thu hồi bất cứ lúc nào. Thu hồi có hiệu lực ngay lập tức.

Các bước xoay vòng

  1. Tạo khóa API mới
  2. Cập nhật ứng dụng sử dụng khóa mới
  3. Xác minh khóa mới hoạt động
  4. Vô hiệu hóa khóa cũ
# Key CRUD via Bearer auth requires a MANAGEMENT key (keyType: "management").
# Standard keys get 403 on /v1/keys — create a management key first,
# or rotate keys from the dashboard UI instead.

# Step 1: Create new key (management key auth)
POST https://api.bazaarlink.ai/v1/keys
Authorization: Bearer $BL_MANAGEMENT_KEY
{"name": "Production v2"}
# → saves new key: sk-bl-NEW_KEY_VALUE

# Step 2: Update your application
# export BAZAARLINK_API_KEY=sk-bl-NEW_KEY_VALUE

# Step 3: Verify new key works
curl https://api.bazaarlink.ai/v1/models \
  -H "Authorization: Bearer sk-bl-NEW_KEY_VALUE"

# Step 4: Revoke old key (management key auth again)
DELETE https://api.bazaarlink.ai/v1/keys/:old_key_id
Authorization: Bearer $BL_MANAGEMENT_KEY

Xuất hoạt động

Tải lịch sử sử dụng API đầy đủ dạng CSV.

Xuất CSV

Đăng nhập và vào trang Nhật ký. Nhấp Xuất CSV.

Cột CSV

Column
Description
dateISO 8601 timestamp (UTC)
modelModel ID (e.g. openai/gpt-4o)
prompt_tokensInput token count
completion_tokensOutput token count
total_tokensTotal tokens (prompt + completion)
reasoning_tokensReasoning tokens (o-series / thinking models)
cached_tokensPrompt cache hit tokens
cost_ntdSố tiền tính bằng Đài tệ
duration_msEnd-to-end latency in milliseconds
finish_reasonstop / length / content_filter / error
statusMã trạng thái phản hồi BazaarLink
app_nameX-Title header value (app attribution)

API sử dụng JSON

Truy vấn thống kê tổng hợp theo chương trình:

# Query usage data (grouped / aggregated)
GET https://api.bazaarlink.ai/v1/usage
Authorization: Bearer sk-bl-YOUR_KEY

# With period filtering (day | week | month | year)
GET https://api.bazaarlink.ai/v1/usage?period=month

# Response
{
  "period": "month",
  "since": "2025-01-01T00:00:00.000Z",
  "credits": 10.5000,
  "totals": {
    "spend": 0.1812,
    "requests": 309,
    "tokens": 161200,
    "promptTokens": 95000,
    "completionTokens": 66200
  },
  "byModel": [{ "model": "openai/gpt-4o", "spend": 0.0028, "tokens": 1200, "requests": 5 }],
  "byKey":   [{ "keyName": "My Agent", "spend": 0.0028, "tokens": 1200, "requests": 5 }],
  "byApp":   [{ "appName": "MyApp", "spend": 0.0015, "tokens": 600, "requests": 3 }],
  "timeSeries": [{ "date": "2025-01-15", "model": "openai/gpt-4o", "cost": 0.0012, "tokens": 500, "requests": 2 }]
}

Kế toán sử dụng

Truy vấn thống kê sử dụng chi tiết qua API.

Ghi chú
Dữ liệu sử dụng được tính bằng USD.

Tham chiếu trường phản hồi

FieldTypeDescription
modelstringModel ID used (e.g., openai/gpt-4o)
providerstringGiá trị cố định của BazaarLink: bazaarlink
prompt_tokensnumberInput tokens consumed
completion_tokensnumberOutput tokens generated
total_tokensnumberTotal tokens (prompt + completion)
reasoning_tokensnumberReasoning tokens (for thinking models)
cached_tokensnumberPrompt tokens served from cache
costnumberSố USD tính cho khách hàng cho yêu cầu này
duration_msnumberEnd-to-end latency in milliseconds
throughputnumberGeneration speed in tokens/sec
finish_reasonstringstop | length | content_filter | error
statusnumberMã trạng thái phản hồi BazaarLink
app_namestring | nullApplication name (X-Title header)
key_namestringAPI key name used for the request
import httpx

# Aggregated stats (Bearer token — period: day | week | month | year)
response = httpx.get(
    "https://api.bazaarlink.ai/v1/usage",
    headers={"Authorization": "Bearer sk-bl-YOUR_KEY"},
    params={"period": "month"},
)

data = response.json()
totals = data["totals"]
print("This month: US$%.4f  (%d requests)" % (totals["spend"], totals["requests"]))

# Cost breakdown by model
for m in data["byModel"]:
    print("  %s: US$%.4f  (%d reqs, %d tokens)" % (m["model"], m["spend"], m["requests"], m["tokens"]))

Phản hồi

Giúp chúng tôi cải thiện BazaarLink bằng cách báo cáo vấn đề, lỗi hoặc đề xuất.

Cách báo cáo

Kênh
Phù hợp nhất cho
Thời gian phản hồi
Trang liên hệPhản hồi chung, yêu cầu tính năng1-2 ngày làm việc
EmailBáo cáo lỗi, vấn đề kỹ thuậtTrong vòng 24 giờ
Header phản hồi APILỗi và số liệu tự động báo cáoTự động

Cần bao gồm

  • ID yêu cầu (từ trường id phản hồi)
  • Mô hình sử dụng và tham số gửi
  • Hành vi mong đợi so với thực tế
  • Thời gian và tần suất vấn đề
  • Thông báo lỗi hoặc mã trạng thái HTTP

Truy cập trang Liên hệ để gửi phản hồi.

FAQ

BazaarLink khác gì so với gọi OpenAI trực tiếp?
BazaarLink cung cấp thanh toán USD với báo giá NTD, hóa đơn thống nhất, hỗ trợ tiếng Trung và một API cho các mô hình chính.
Tôi có cần thay đổi code hiện tại không?
Chỉ cần thay đổi base URL và khóa API. Tất cả cài đặt khác (ngoại trừ ID mô hình) giữ nguyên.
BazaarLink có lưu trữ tin nhắn không?
Với các yêu cầu thành công thông thường, chúng tôi không lưu trữ nội dung tin nhắn; chỉ giữ bản ghi mức sử dụng cần cho thanh toán và vận hành (như mô hình, số token, thời gian và chi phí). Yêu cầu thất bại, cơ chế an toàn nội dung, tác vụ video và khác, và tính năng bạn chủ động bật là các ngoại lệ được nêu trong Chính sách quyền riêng tư; chế độ khóa ZDR cung cấp zero data retention nghiêm ngặt hơn.
Làm thế nào để lấy hóa đơn thống nhất (統一發票)?
Hóa đơn thống nhất được phát hành tự động cuối tháng cho gói Business trở lên. Liên hệ hỗ trợ để phát hành ngay.
Hỗ trợ những phương thức thanh toán nào?
Chấp nhận tất cả thẻ tín dụng chính (Visa, Mastercard, American Express).
Những tính năng OpenAI SDK nào được hỗ trợ?
Chat completions, streaming, gọi công cụ, đầu ra có cấu trúc (response_format) và assistant prefill đều hoạt động.
Tôi có thể dùng BazaarLink với framework agent như LangChain hoặc CrewAI không?
Có! Bất kỳ framework nào hỗ trợ API OpenAI đều hoạt động với BazaarLink. Chỉ cần đặt base URL và sử dụng khóa API BazaarLink.
Support
Support
Hi! How can we help you?
Send a message and we'll get back to you soon.