API 参考
BazaarLink API 概览
BazaarLink 在不同模型和供应商之间提供统一且兼容 OpenAI 的请求与响应格式。你只需集成一次,即可切换模型,无需重写应用程序。
OpenAPI 规范
完整的 BazaarLink API 使用 OpenAPI 规范记录,并提供 YAML 与 JSON 格式:
你可以将这些规范导入 Swagger UI、Postman 或其他兼容 OpenAPI 的代码生成器,用于探索 API 或生成客户端库。
请求
对话完成请求格式
对话完成的请求正文会发送至以下端点:
/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 相容。
/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 流与混合 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
/api/v1/images/generations 默认返回 OpenAI 兼容的同步 JSON(2026-07-25 起)——client.images.generate() 不需任何包装即可使用。传 stream: true 可改用 SSE 事件流,适合生成时间较长的模型获取进度。
A. /v1/chat/completions(原生,推荐)
/api/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 兼容)
/api/v1/images/editsOpenAI SDK 的 client.images.edit() 可直接使用(multipart 上传、同步 JSON 响应,返回 data: [{ url }])。限制同图生图:最多 8 张、单张 10MB;mask 与 response_format=b64_json 暂不支持。
curl https://bazaarlink.ai/api/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 兼容)
/api/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://bazaarlink.ai/api/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 把视频独立到 /api/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)
/api/v1/videos2. 轮询状态
/api/v1/videos/{id}curl -H "Authorization: Bearer $BL_API_KEY" \
https://bazaarlink.ai/api/v1/videos/vjob_xxx3. 获取视频内容 (MP4)
/api/v1/videos/{id}/contentcurl -H "Authorization: Bearer $BL_API_KEY" \
-o output.mp4 \
https://bazaarlink.ai/api/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 |
| alibaba/wan2.6-i2v | text+image->video | i2v |
| alibaba/wan2.6-i2v-flash | text+image->video | i2v |
| alibaba/wan2.6-r2v | text+image+video->video | r2v |
| alibaba/wan2.1-t2v-turbo | text->video | t2v |
| alibaba/wan2.2-i2v-plus | text+image->video | i2v |
| alibaba/wan2.6-r2v-flash | text+image+video->video | r2v |
| alibaba/happyhorse-1.1 | text+image->video | t2v, 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-t2v | text->video | t2v |
| alibaba/wan2.7-r2v | text+image+video->video | r2v |
| alibaba/happyhorse-1.0 | text+image->video | t2v, i2v |
| alibaba/wan2.2-i2v-flash | text+image->video | i2v |
| alibaba/wan2.7-videoedit | text+image+video->video | videoedit |
| alibaba/wan2.1-t2v-plus | text->video | t2v |
影片输入
传送视频档案给支援视频输入的模型,用来分析内容、生成说明或回答场景与事件相关问题。可用直接 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 框架。
/api/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。
/api/v1/messages请求内文
范例请求
回应
错误:400(验证失败)、402(额度不足)、429(rate limit)、502(上游错误或缺少密钥)、503(服务器重启中)。
模型
列出所有可用模型及其定价和能力资讯。 此端点不需要身份验证。
/api/v1/models# Text models (default)
curl https://bazaarlink.ai/api/v1/models
# Complete catalog
curl "https://bazaarlink.ai/api/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 这个字段。
可用模型 (254)
以下是目前 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 应用的基础。
常见应用场景
/api/v1/embeddings参数
基本请求
批量处理
发送字符串数组,可在单次请求中嵌入多段文本 —— 比逐条调用更便宜也更快。
多模态输入(图片+文本)
支持图片输入的模型(output_modalities 含 "embeddings"、inputModalities 含 "image")接受 {content:[{type:"text",...}, {type:"image_url",...}]} 形式的输入项,可以单独嵌入图片,或图片与文本一起嵌入。
供应商路由
与 chat completions 一样,可以控制由哪个上游服务嵌入请求 —— 完整字段说明见 Provider Selection。
查找嵌入模型
没有专门的嵌入模型列表端点 —— 调用 GET /api/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 使用量。
/api/v1/credits范例请求
curl https://bazaarlink.ai/api/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)。
/api/v1/generation?id=<generation-id>范例请求
curl "https://bazaarlink.ai/api/v1/generation?id=gen_abc123" \
-H "Authorization: Bearer sk-bl-YOUR_KEY"回应
错误:400(缺少 id)、401(auth)、404(找不到该 generation)。
API 密钥信息
查询当前 API key 的 rate limit 层级与累计使用量(响应格式与业界惯用的密钥查询 API 兼容)。
/api/v1/key回应
错误:401(auth)、404(找不到用户,极少发生)。
Agent 自助注册
供 AI agent(机器人、自主系统)自行注册,返回含试用额度的 API key 与用于升级的 claim token。
/api/v1/agents/register请求内文
范例请求
curl -X POST https://bazaarlink.ai/api/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 则表示图片太大。请根据下表查找原因和对应的处理方向。
速率限制、预算与紧急刹车
这些控制可能拒绝原本有效的请求。它们与供应商故障不同,需要不同的恢复操作。
兼容性提醒:速率限制与紧急刹车目前返回数字型 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 路径 /api/v1 —— 没有按日期锁定的版本、也不需要管理版本 header。API 是持续演进,不是靠编号发布版本。
非破坏性变更
以下这些会在不事先预告的情况下上线:
- 新增端点
- 目录新增模型
- 新增可选请求参数
- 新增响应字段
- 新增带可选属性的 schema
- 新增响应状态/错误代码
破坏性变更
这些情况很少见,包括:
- 删除或改名端点、参数、或响应字段
- 改变字段类型
- 把可选参数改成必填
就算真的发生,破坏性变更也只会影响特定端点,不会波及整个 /api/v1 —— 没有单一版本升级能一次弄坏所有对接。我们目前还没有发布正式、带 Breaking 标签的 changelog(见下方「掌握最新动态」)—— 若是对您的对接来说很关键的部分,建议先联系 Support 确认,不要依赖没有文档记录的行为。
下线政策
唯一该预期的常态性「破坏性」事件:个别模型会随上游供应商淘汰而下线。可通过 GET /api/v1/models 查询模型当前的状态。
GET https://bazaarlink.ai/api/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 /api/v1/models 追踪模型状态,或若您有关键对接需要提前获知变更,可联系 Support。