API 參考
BazaarLink API 總覽
BazaarLink 在不同模型與供應商之間提供統一且相容 OpenAI 的請求與回應格式。你只需整合一次,就能切換模型,不必重寫應用程式。
OpenAPI 規格
完整的 BazaarLink API 使用 OpenAPI 規格記錄,並提供 YAML 與 JSON 格式:
你可以將這些規格匯入 Swagger UI、Postman 或其他相容 OpenAPI 的程式碼產生器,用來探索 API 或產生用戶端函式庫。
請求
對話完成請求格式
對話完成的請求本文會傳送至以下端點:
/v1/chat/completions如需完整的支援欄位清單,請參閱 參數。
結構化輸出
強制模型返回符合 Schema 的有效 JSON。這對於建立需要程式化解析模型輸出的可靠應用程式至關重要。
json_object— 基本 JSON 模式;模型會回傳有效的 JSON。json_schema— 嚴格 Schema 模式;模型輸出必須符合提供的 JSON Schema。
外掛
BazaarLink 會將 plugins 陣列轉送至選定的上游路由。外掛可用性取決於模型與供應商;使用 :online 模型變體時也會啟用 web 外掛。
選填標頭
透過請求標頭識別您的應用程式,讓系統追蹤使用量、顯示在儀表板上,並在未來提供更細緻的分析。
助手預填
在訊息陣列最後加入一則未完成的 assistant 訊息,向相容的模型路由要求接續生成。
回應
BazaarLink 將不同模型與供應商的完成回應正規化為統一、相容 OpenAI 的格式。
完成回應格式
choices 永遠是陣列。串流回應使用 delta,非串流回應使用 message;可取得時亦會回傳用量與成本明細。
結束原因
finish_reason 使用 stop、length、tool_calls、content_filter、error 等正規化值;native_finish_reason 保留供應商的原始值。
查詢成本與統計資料
依 generation ID 查詢單次完成請求的詳細統計資料(ID 來自 chat/completions 回應的 id,或串流的 x-bz-gen-id header)。
對話完成
主要端點。與 OpenAI Chat Completions API 相容。
/v1/chat/completions請求內文
請求結構 (TypeScript)
範例請求
回應
回應結構 (TypeScript)
BazaarLink 只正規化兩個欄位 —— model,以及移除 provider 欄位 —— 其餘上游回應原樣轉發。像 native_finish_reason、system_fingerprint、reasoning 這類欄位只有在該上游供應商有填值時才會出現,不要預設每個模型都一定有。usage.cost 是例外 —— 永遠是 BazaarLink 自己結算/計費的金額,不是上游轉發過來的數值。
圖片生成
BazaarLink 提供兩條圖片生成路徑:(A) /v1/chat/completions 並帶 modalities: ["image"] — 原生路徑,支援 SSE stream 與混合 text+image 輸出,推薦新整合使用。(B) /v1/images/generations — OpenAI DALL·E 相容請求格式,回應為 SSE event stream(避免慢速模型撞 100s 上游超時)。兩條路徑的 SSE 事件協定一致,端點選擇純粹是請求形狀偏好。圖片編輯(修改既有圖片)走 POST /v1/images/edits — 與 OpenAI images.edit 相容,用 multipart/form-data 上傳來源圖。可編輯的模型 modality 是 text+image->image(例如 qwen/qwen-image-edit);純生成模型是 text->image —— 各模型的 modality 可在 GET /v1/models 查。
Response format
/v1/images/generations 預設回傳 OpenAI 相容的同步 JSON(2026-07-25 起)——client.images.generate() 不需任何包裝即可使用。傳 stream: true 可改用 SSE 事件串流,適合生成時間較長的模型取得進度。
A. /v1/chat/completions (原生,推薦)
/v1/chat/completionsThe canonical streaming path. Recommended for any new integration.
圖生圖(image-to-image):在 content 陣列帶 image_url 部件即可,支援 data URI 或 https 圖片網址(不接受 http://),最多 8 張、單張 data URI 約 10MB 內;帶圖的那則訊息必須同時含 text 部件(編輯指令)。部分模型另支援 image_config(例如 {"strength": 0.7},0–1,值越低越貼近原圖),原樣透傳給上游。
圖片編輯(OpenAI 相容)
/v1/images/editsOpenAI SDK 的 client.images.edit() 可直接使用(multipart 上傳、同步 JSON 回應,回傳 data: [{ url }])。限制同圖生圖:最多 8 張、單張 10MB;mask 與 response_format=b64_json 暫不支援。
curl https://api.bazaarlink.ai/v1/images/edits \
-H "Authorization: Bearer $BL_API_KEY" \
-F model="openai/gpt-5.4-image-2" \
-F image=@cat.png \
-F prompt="change the background to a night city"B. /v1/images/generations (DALL·E 相容)
/v1/images/generationsOpenAI DALL-E request shape. Sync JSON ({ created, data: [{ url }] }) is the default and works with client.images.generate() out of the box; pass stream: true to get the SSE event stream documented below instead.
# Streaming variant — progressive delivery for long generations
curl -N https://api.bazaarlink.ai/v1/images/generations \
-H "Authorization: Bearer $BL_API_KEY" \
-H "Accept: text/event-stream" \
-H "Content-Type: application/json" \
-d '{"model":"openai/gpt-5.4-image-2","prompt":"a red cat on a sofa","stream":true}'SSE event protocol
Both endpoints emit the same event types:
支援的圖片模型
| Model ID | Modality | i2i (edits) |
|---|
影片生成
非同步三步驟流程(submit → poll → content)。影片生成需要 30 秒到 5 分鐘,無法套用 chat-completions 的同步請求/回應語意 — 因此 BazaarLink 把影片獨立到 /v1/videos 路徑,採用 job-id 模式:submit 拿到 vjob_* ID → poll 狀態 → 完成後 fetch bytes。將 video model 透過 /chat/completions 或 /images/generations 呼叫會回 400(code: wrong_endpoint_for_video)。費用於 completed 時依實際 usage.cost 結算。
影片任務類型
同一個端點涵蓋多種任務,實際執行哪一種由你傳入的欄位決定 —— 同一個模型可以做圖生影、首尾幀、影片接續。並非每個模型都支援每種任務,不支援時回傳 400。
1. 提交任務(立即回 vjob_xxx)
/v1/videos2. 輪詢狀態
/v1/videos/{id}curl -H "Authorization: Bearer $BL_API_KEY" \
https://api.bazaarlink.ai/v1/videos/vjob_xxx3. 取得影片內容 (MP4)
/v1/videos/{id}/contentcurl -H "Authorization: Bearer $BL_API_KEY" \
-o output.mp4 \
https://api.bazaarlink.ai/v1/videos/vjob_xxx/content使用須知
- 各模型支援的畫質不同 —— 送不支援的值會回 400 並列出可用畫質。
- 輸入的圖片/影片必須是公開可存取的 URL。防盜鏈的網站(例如部分 wiki)會失敗。
- 輸入素材會經過上游內容審核,偶爾可能被誤擋。
- 影片接續時,要求的 duration 必須大於來源影片長度。
- 輸出寬高比會跟隨輸入圖 —— 方形圖會產生方形影片。
- 影片編輯的計費為:輸入影片秒數 + 生成輸出秒數。
- 影片編輯/接續的 input_video 必須是公開網址。你在這裡生成的影片是憑 API 金鑰才能存取的,上游抓不到,所以來源影片請放到公開可讀的網址。
- Webhook 沒有簽章——採取行動前請用 GET /videos/{id} 回查狀態與金額,且其中的 unsigned_urls 是絕對網址(跟輪詢回應的相對路徑不同)。
支援的影片模型
| Model ID | Modality | Tasks |
|---|---|---|
| bytedance/seedance-2.0 | text+image+audio+video->video | t2v, i2v |
| bytedance/seedance-2.0-fast | text+image+audio+video->video | t2v, i2v |
| google/veo-3.1 | text+image->video | t2v, i2v |
| openai/sora-2-pro | text+image->video | t2v, i2v |
| bytedance/seedance-1-5-pro | text+image->video | t2v, i2v |
| bytedance/seedance-2.5 | text+image+audio+video->video | — |
| alibaba/happyhorse-1.0 | text->video | t2v |
| alibaba/wan2.6-r2v | text+image+video->video | r2v |
| alibaba/wan2.6-r2v-flash | text+image+video->video | r2v |
| alibaba/happyhorse-1.1 | text+image->video | t2v, i2v |
| alibaba/wan2.6-i2v-flash | text+image->video | i2v |
| alibaba/wan2.5-i2v-preview | text+image->video | i2v |
| alibaba/wan2.7-i2v | text+image+video->video | i2v, kf2v, continuation |
| alibaba/wan2.6-t2v | text->video | t2v |
| alibaba/wan2.5-t2v-preview | text->video | t2v |
| alibaba/wan2.2-t2v-plus | text->video | t2v |
| alibaba/wan2.7-r2v | text+image+video->video | r2v |
| alibaba/wan2.6-i2v | text+image->video | i2v |
| alibaba/wan2.7-videoedit | text+image+video->video | videoedit |
| alibaba/wan2.2-i2v-flash | text+image->video | i2v |
| alibaba/wan2.1-t2v-plus | text->video | t2v |
| alibaba/wan2.1-t2v-turbo | text->video | t2v |
| alibaba/wan2.7-t2v | text->video | t2v |
| alibaba/wan2.2-i2v-plus | text+image->video | i2v |
影片輸入
傳送影片檔案給支援影片輸入的模型,用來分析內容、生成說明或回答場景與事件相關問題。可用直接 URL 或 base64 資料 URI — URL 適合公開可存取的影片;base64 用於本機檔案或私有影片。
支援的格式
MP4(H.264)MPEGMOVWebMPDF 輸入
直接在訊息中傳送 PDF 文件,給原生支援 PDF 輸入的模型(例如 Claude、Gemini)分析、摘要或回答問題。BazaarLink 會把檔案直接轉送給模型 — 算一般 input tokens,不額外收費、不額外處理。
支援的格式
- PDF 文件(含文字、圖片、表格、掃描件)
- Base64 資料 URL(`data:application/pdf;base64,...`)
- 多頁文件
- 僅限無密碼保護的 PDF
Responses API
相容 OpenAI Responses API 格式的端點,支援無狀態多輪對話、工具呼叫與多模態輸入。適用於使用 OpenAI Python SDK ≥ 1.x 的 client.responses.create() 的 Agent 框架。
/v1/responses請求內文
請求結構 (TypeScript)
範例請求
回應格式
從 Chat Completions 遷移
將 messages 改為 input(字串或陣列),以 instructions 取代 system 角色訊息,並從 output[0].content[0].text 讀取回應內容(原為 choices[0].message.content)。
限制事項
- previous_response_id 或 store: true 會被拒絕並回傳 400(錯誤碼 invalid_prompt)——不是被接受後忽略。請一律使用無狀態模式,在 input 陣列中帶入完整對話歷史。
- 不支援 OpenAI 專屬的內建託管工具(web_search_preview、file_search、computer_use_preview)。網頁搜尋可透過 plugins: [{id:"web"}] 啟用,僅部分模型路由支援。
- background: true 會被接受但忽略,請求一律同步執行到完成為止。
Messages(Anthropic 相容)
與 Anthropic Claude SDK 相容的 Messages API。使用方式和 Anthropic 官方 API 完全相同,只需更換 base URL 和 auth header。
/v1/messages請求內文
範例請求
回應
錯誤:400(驗證失敗)、402(額度不足)、429(rate limit)、502(上游錯誤或缺少金鑰)、503(伺服器重啟中)。
模型
列出所有可用模型及其定價和能力資訊。 此端點不需要身份驗證。
/v1/models# Text models (default)
curl https://api.bazaarlink.ai/v1/models
# Complete catalog
curl "https://api.bazaarlink.ai/v1/models?output_modalities=all"回應
依輸入長度分階定價
部分模型在 prompt 超過 token 門檻後會切換到不同的整張價目表,並非只有超過門檻的部分套用新價 — 而是整張價目表切換。門檻為嚴格不等式:輸入 token 數剛好等於 N 時仍套用 N 以下的那一階,僅當輸入 token 數大於 N 時才套用較高階。
pricing_tiers 是 pricing 的同層欄位,僅當模型有超出基礎價的覆寫階層時才會出現。項目依 above_prompt_tokens 遞增排序;prompt/completion 為每 token 的美元價(與 pricing.prompt/pricing.completion 同單位)。pricing.prompt 與 pricing.completion 永遠是基礎(最低)那一階。
大多數模型沒有分階定價 — 對這些模型,回應中會完全沒有 pricing_tiers 這個欄位。
可用模型 (238)
以下是目前 BazaarLink 上可用的模型,從資料庫動態載入:
在 模型頁面瀏覽所有模型。
串流
設定 stream: true 以接收 Server-Sent Events (SSE) 串流。每個事件包含一個回應片段。
SSE 格式
data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":"Hello"},"index":0}]}
data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":" world"},"index":0}]}
data: {"id":"chatcmpl-abc","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{"prompt_tokens":10,"completion_tokens":4,"total_tokens":14}}
data: [DONE]Keep-alive 與收尾行為
串流中可能出現 SSE 註解列(以冒號開頭)或心跳事件作為 keep-alive — 解析時請略過非 data: 列,不要直接對整列做 JSON.parse。最後一個 data chunk 會帶 usage(token 用量與成本),之後才是 data: [DONE]。成功的回應會含 X-Request-Id header,回報問題時請附上。
: keepalive <- SSE comment line — ignore, do NOT JSON.parse
data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":"Hi"},"index":0}]}
data: {"id":"chatcmpl-abc","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{...}}
data: [DONE]串流取消
串流請求可透過關閉客戶端連線來取消 — 例如呼叫 AbortController.abort() 或關閉 stream 物件。BazaarLink 收到取消訊號後會立刻停止轉發後續內容,並中止對上游供應商的請求。
串流中途出錯
data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":"The capital of "},"index":0}]}
data: {"error":{"message":"Upstream connection lost.","type":"upstream_error","code":502}}
data: [DONE]嵌入向量
嵌入向量(Embeddings)是能捕捉語意的數值表示法——把文字轉換成向量(一串數字),可用於各種機器學習任務。BazaarLink 提供與 OpenAI Embeddings API 相容的統一端點,讓您透過同一組介面呼叫多家供應商的嵌入模型。
什麼是嵌入向量?
嵌入向量把文字轉換成高維度向量,語意相近的文字在向量空間裡的距離也會更接近——例如「貓」與「小貓」的嵌入會很相似,但「貓」與「飛機」會相距很遠。這種向量表示法讓機器能夠理解文字之間的關聯,是許多 AI 應用的基礎。
常見應用場景
/v1/embeddings參數
基本請求
批次處理
傳送字串陣列,可在單一請求中嵌入多筆文字 —— 比逐筆呼叫更便宜也更快。
多模態輸入(圖片+文字)
支援圖片輸入的模型(output_modalities 含 "embeddings"、inputModalities 含 "image")接受 {content:[{type:"text",...}, {type:"image_url",...}]} 形式的輸入項目,讓您可以單獨嵌入圖片,或圖片與文字一起嵌入。
供應商路由
跟 chat completions 一樣,可以控制由哪個上游服務嵌入請求 —— 完整欄位說明請見 Provider Selection。
尋找嵌入模型
沒有專屬的嵌入模型清單端點 —— 呼叫 GET /v1/models,在前端篩選 output_modalities 包含 "embeddings" 的項目,或直接到 Models 頁面瀏覽。
限制
- 不支援串流 —— 與 chat completions 不同,嵌入向量一律以完整回應形式回傳。
- 每個模型都有輸入長度上限;超過上限的文字會在上游被截斷或拒絕。
- 相同輸入的嵌入結果是確定性的(deterministic)—— 不涉及 temperature 或隨機性。
最佳實務
- 依速度/品質/成本的取捨選擇模型 —— 較小的模型(如 qwen/qwen3-embedding-4b)較便宜也較快;較大的模型(如 openai/text-embedding-3-large)通常嵌入精準度較高。
- 把多筆文字合併成一次請求,而不是逐筆呼叫 —— 減少往返次數與額外開銷。
- 快取結果 —— 相同輸入的嵌入結果永遠不變,應該儲存起來而非重新產生。
- 比對時用餘弦相似度(cosine similarity),不要用歐氏距離 —— 具尺度不變性,對高維向量效果更好。
- 留意每個模型的上下文長度 —— 長文件在嵌入前可能需要先分段(chunking)。
專用參數
取樣參數影響 token 產生過程。BazaarLink 會將支援的參數傳遞給上游 provider;不支援的參數會被静默忽略。
取樣參數
BazaarLink 專屬參數
信用額度
查詢當前信用額度餘額與累積 API 使用量。
/v1/credits範例請求
curl https://api.bazaarlink.ai/v1/credits \
-H "Authorization: Bearer sk-bl-YOUR_KEY"回應
{
"data": {
"total_credits": 100.00,
"total_usage": 12.34
}
}錯誤:401(金鑰無效或遺失)、403(帳號已停權)。
生成詳細資料
依 generation ID 查詢單次完成請求的詳細統計資料(ID 來自 chat/completions 回應的 id,或串流的 x-bz-gen-id header)。
/v1/generation?id=<generation-id>範例請求
curl "https://api.bazaarlink.ai/v1/generation?id=gen_abc123" \
-H "Authorization: Bearer sk-bl-YOUR_KEY"回應
錯誤:400(缺少 id)、401(auth)、404(找不到該 generation)。
API 金鑰資訊
查詢當前 API key 的 rate limit 層級與累計使用量(回應格式與業界慣用的金鑰查詢 API 相容)。
/v1/key回應
錯誤:401(auth)、404(找不到使用者,極少發生)。
Agent 自助註冊
供 AI agent(機器人、自主系統)自行註冊,回傳含試用額度的 API key 與用於升級的 claim token。
/v1/agents/register請求內文
範例請求
curl -X POST https://api.bazaarlink.ai/v1/agents/register \
-H "content-type: application/json" \
-d '{
"name": "My Agent",
"description": "Autonomous research bot"
}'回應
錯誤:400(body 無效或缺少 name)、429(rate limit,1/IP/24h)、500(內部錯誤)。
錯誤代碼
錯誤回應格式
模型推論端點會回傳 OpenAI 相容的錯誤 envelope。部分特殊端點可能省略 type,或依錯誤路徑使用不同值;程式判斷請使用 HTTP 狀態與 error.code,不要解析 message 文字。
{
"error": {
"message": "Insufficient credits. Please top up to continue.",
"type": "invalid_request_error",
"code": "insufficient_credits"
}
}HTTP 狀態與 error.code
串流開始前,HTTP 狀態代表錯誤大類;error.code 則可能是相同的數字,或代表特定處置方式的穩定字串。若有字串代碼應優先判斷,否則使用 HTTP 狀態;error.message 僅供人閱讀。
機器可讀的帳務代碼
同樣是 402,也可能代表不同的帳務控制。請依下列穩定代碼顯示正確的處理方式。
詳細錯誤代碼
API 請求失敗時,error.code 會告訴你更具體的原因。即使兩個錯誤都是 HTTP 400,處理方式也可能不同:例如 unknown_model 表示模型名稱有誤,image_too_large 則表示圖片太大。請依下表找到原因與對應的處理方向。
內容審查
所有請求在送往模型端之前,都會先經過自動化內容審查。不符合使用規範的請求會被拒絕,不會送達模型,並回傳 403 錯誤。
會被攔截的內容類別
審查依據我們的使用規範(Acceptable Use Policy)進行,主要攔截以下類別的內容:
- 性剝削內容
- 暴力威脅
- 違法行為的操作指導
- 生物危害相關內容
403 回應格式
請求被審查攔截時,會收到以下格式的錯誤回應:
{
"error": {
"message": "Your prompt was blocked by content moderation.",
"type": "invalid_request_error",
"code": "content_filter"
}
}被攔截的請求不會計費——你不會為被拒絕的請求付費。
誤判申訴
如果你認為某次請求被誤判攔截,請聯繫支援團隊並附上請求時間與(如方便的話)request id,我們會協助複查。
隱私說明
每一筆請求都會經過自動化內容審查。
判定為違規的請求,我們會保留其內容作為合規舉證之用。
其他請求不會保留完整提示詞內容。
速率限制、預算與緊急煞車
這些控制可能拒絕原本有效的請求。它們與供應商錯誤不同,也需要不同的復原方式。
相容性提醒:速率限制與緊急煞車目前回傳數字型 error.code。請勿假設尚未實作的字串代碼;請依 HTTP 狀態、Retry-After 與文件所述訊息判斷。
影片與媒體資源狀態
影片驗證通常回傳數字 code 400;工作不存在為 404、模型退役為 410、影片內容尚未完成為 409、影片 byte range 無效為 416。重試前請先輪詢至完成,或修正 Range 標頭。
重試策略
只有在不修改請求也可能恢復的錯誤才應重試。若有 Retry-After,請依指定秒數等待;否則使用帶 jitter 的指數退避。限制重試次數,也不要同時疊加 SDK 自動重試與手動重試。
錯誤處理
串流錯誤格式
在任何 token 串流之前發生的錯誤,會以標準 HTTP 錯誤回應(JSON body)回傳。
串流一旦開始,HTTP 回應已經是 200。用戶端必須解析每個 SSE data frame;只要出現頂層 error,或 choices[0].finish_reason === "error",就應視為失敗且回應不完整。
串流中途失敗時,BazaarLink 會送出最後一個 SSE 事件,內容為頂層 error 物件,接著是 data: [DONE]。部分上游原樣轉發的 chunk 則可能把錯誤放在 choice 上(choices[0].finish_reason === "error")— 兩種都要處理。
版本管理
BazaarLink 只提供單一穩定的 API 路徑 /v1 —— 沒有依日期釘選的版本、也不需要管理版本 header。API 是持續演進,不是靠編號釋出版本。
非破壞性變更
以下這些會在不事先預告的情況下上線:
- 新增端點
- 目錄新增模型
- 新增選填請求參數
- 新增回應欄位
- 新增帶選填屬性的 schema
- 新增回應狀態/錯誤代碼
破壞性變更
這些情況很少見,包含:
- 刪除或改名端點、參數、或回應欄位
- 改變欄位型別
- 把選填參數改成必填
就算真的發生,破壞性變更也只會影響特定端點,不會波及整個 /v1 —— 沒有單一版本升級能一次弄壞所有串接。我們目前還沒有發布正式、帶 Breaking 標籤的 changelog(見下方「掌握最新動態」)—— 若是對您串接來說很關鍵的部分,建議先聯繫 Support 確認,不要依賴沒有文件記載的行為。
下架政策
唯一該預期的常態性「破壞性」事件:個別模型會隨上游供應商淘汰而下架。可透過 GET /v1/models 查詢模型目前的狀態。
GET https://api.bazaarlink.ai/v1/models
Authorization: Bearer sk-bl-YOUR_API_KEY
# A model within 30 days of its deprecation date shows in the catalog
# with an "EOL" badge on the Models page. After the effective date it's
# dropped from the catalog and calls return:
# 410 { "error": { "type": "model_not_available", "code": "model_retired" } }掌握最新動態
我們目前還沒有發布專屬的 API changelog 或 RSS feed。現階段請直接查看這個頁面、透過 GET /v1/models 追蹤模型狀態,或若您有關鍵串接需要提前得知變更,可聯繫 Support。