Biaoli · 开发者文档
API 参考
完全兼容 OpenAI 协议,只需替换 base_url 即可使用熟悉的 SDK 调用全球顶尖模型。
- 全栈
- 模型矩阵
- 40ms
- 国内直连延迟
- 99.9%
- 可用性 SLA
- 50%+
- 相同模型省钱
快速开始
Biaoli 的接口路径、参数结构与 OpenAI 一致。如果你已有基于 OpenAI SDK 的代码,迁移只需修改一行配置。
基础信息
- Base URL:
https://ai.biaoli.cn/v1- 认证方式:
- Bearer Token
- 请求格式:
- application/json
- 协议兼容:
- OpenAI Chat Completions v1
三步接入
- 在控制台注册并获取 API Key
- 安装官方 OpenAI SDK(或任意兼容客户端)
- 修改
base_url为https://ai.biaoli.cn/v1
第一个请求
curl
curl https://ai.biaoli.cn/v1/responses \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MODEL_ID",
"input": "Hello"
}'身份认证
所有 API 请求需在请求头中携带 API Key,使用标准的 Bearer Token 方式:
HTTP Header
Authorization: Bearer YOUR_API_KEY安全提醒
- 请将 API Key 视同密码,切勿在浏览器、移动端或公开仓库中暴露
- 生产环境应在服务端中转 API 调用,前端不直接访问
- 建议为不同业务创建独立 Key,便于权限和额度管理
创建响应
与 OpenAI /v1/responses 接口完全兼容,支持纯文本输入、消息数组、多模态、函数调用、内置工具(web_search / file_search / code_interpreter)和流式响应。
POST
https://ai.biaoli.cn/v1/responses请求参数
代码示例
curl https://ai.biaoli.cn/v1/responses \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MODEL_ID",
"instructions": "You are a concise assistant.",
"input": "Explain what an LLM is in 50 words.",
"temperature": 0.7,
"max_output_tokens": 1024
}'响应示例
JSON
{
"id": "resp_abc123",
"object": "response",
"created_at": 1747641234,
"status": "completed",
"model": "MODEL_ID",
"output": [
{
"id": "msg_abc",
"type": "message",
"role": "assistant",
"status": "completed",
"content": [
{
"type": "output_text",
"text": "An LLM is a large neural network trained on massive text data...",
"annotations": []
}
]
}
],
"output_text": "An LLM is a large neural network trained on massive text data...",
"usage": {
"input_tokens": 42,
"output_tokens": 38,
"total_tokens": 80
}
}流式响应
在请求体中加入 "stream": true,接口将以 SSE(Server-Sent Events)按 OpenAI 类型化事件依次返回,包括 response.created、response.output_text.delta、response.completed 等。
代码示例
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://ai.biaoli.cn/v1",
)
stream = client.responses.create(
model="MODEL_ID",
input="Tell a short joke",
stream=True,
)
for event in stream:
if event.type == "response.output_text.delta":
print(event.delta, end="", flush=True)
elif event.type == "response.completed":
print() # newline at end事件流片段
SSE
event: response.created
data: {"type":"response.created","sequence_number":0,"response":{"id":"resp_...","object":"response","status":"in_progress","model":"MODEL_ID"}}
event: response.in_progress
data: {"type":"response.in_progress","sequence_number":1,"response":{"id":"resp_...","status":"in_progress"}}
event: response.output_item.added
data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"id":"msg_...","type":"message","role":"assistant","status":"in_progress","content":[]}}
event: response.content_part.added
data: {"type":"response.content_part.added","sequence_number":3,"item_id":"msg_...","output_index":0,"content_index":0,"part":{"type":"output_text","text":"","annotations":[]}}
event: response.output_text.delta
data: {"type":"response.output_text.delta","sequence_number":4,"item_id":"msg_...","output_index":0,"content_index":0,"delta":"Why"}
event: response.output_text.delta
data: {"type":"response.output_text.delta","sequence_number":5,"item_id":"msg_...","output_index":0,"content_index":0,"delta":" do"}
... (more output_text.delta events)
event: response.output_text.done
data: {"type":"response.output_text.done","sequence_number":N,"item_id":"msg_...","output_index":0,"content_index":0,"text":"Why do programmers..."}
event: response.content_part.done
data: {"type":"response.content_part.done","sequence_number":N+1,"item_id":"msg_...","output_index":0,"content_index":0,"part":{"type":"output_text","text":"Why do programmers...","annotations":[]}}
event: response.output_item.done
data: {"type":"response.output_item.done","sequence_number":N+2,"output_index":0,"item":{"id":"msg_...","type":"message","role":"assistant","status":"completed","content":[{"type":"output_text","text":"Why do programmers..."}]}}
event: response.completed
data: {"type":"response.completed","sequence_number":N+3,"response":{"id":"resp_...","status":"completed","output":[...],"output_text":"Why do programmers...","usage":{"input_tokens":12,"output_tokens":18,"total_tokens":30}}}
data: [DONE]支持的模型
Biaoli 覆盖各厂商的对话、推理、多模态、视频与语音模型。因上游型号更新频繁,可调用的型号 ID 与实时价格请通过 GET https://ai.biaoli.cn/v1/models 接口获取,或在控制台查看完整列表。
OpenAI
- 对话补全
- 深度推理
- 多模态
- 视频生成
- 语音转写
Anthropic
- 对话补全
- 长上下文
- 代码与 Agent
- 对话补全
- 多模态
- 高性价比
DeepSeek & 其他
- 对话补全
- 深度推理
- 高性价比
查询全部模型
curl
curl https://ai.biaoli.cn/v1/models \
-H "Authorization: Bearer YOUR_API_KEY"用量查询
查询当前 API Key 对应账户的额度、用量与有效期。
GET
https://ai.biaoli.cn/v1/key请求示例
curl
curl https://ai.biaoli.cn/v1/key \
-H "Authorization: Bearer YOUR_API_KEY"响应示例
JSON
{
"id": "key_8a3f...",
"label": "production",
"limit": 500000,
"usage": 12850,
"remaining": 487150,
"currency": "CNY",
"expires_at": "2026-12-31T23:59:59Z",
"is_active": true,
"created_at": "2026-01-01T00:00:00Z"
}错误码与速率限制
接口失败时返回与 OpenAI 一致的错误结构,便于现有客户端代码直接复用错误处理逻辑。
错误响应格式
JSON
{
"error": {
"message": "Invalid API key provided.",
"type": "invalid_request_error",
"code": "invalid_api_key",
"param": null
}
}HTTP 状态码
| 状态码 | 含义 | 处理建议 |
|---|---|---|
| 400 | 请求参数错误 | 检查 JSON 结构、必填字段与字段类型 |
| 401 | 认证失败 | 确认 API Key 正确,未被撤销或过期 |
| 403 | 禁止访问 | 账户额度不足或权限受限,请前往控制台查看 |
| 404 | 资源不存在 | 检查模型 ID 或接口路径是否拼写正确 |
| 413 | 请求体过大 | 减少 messages 长度或拆分多次请求 |
| 429 | 请求频率超限 | 按 Retry-After 退避后重试 |
| 500 | 服务端错误 | 稍后重试,持续异常请联系支持 |
| 503 | 上游模型暂不可用 | 切换备用模型或稍后重试 |
速率限制
平台按 API Key 维度限速,触发限流时响应头返回额外字段,便于客户端做退避:
| 响应头 | 说明 |
|---|---|
| X-RateLimit-Limit-Requests | 当前 Key 每分钟允许请求数 |
| X-RateLimit-Remaining-Requests | 本分钟内剩余可用请求数 |
| X-RateLimit-Reset-Requests | 请求数额度重置剩余秒数 |
| Retry-After | 触发限流时建议等待秒数 |
使用建议
- 对 5xx 错误启用指数退避重试,建议初始间隔 1s,最多重试 3 次
- 遇到 429 时优先读取
Retry-After响应头作为等待时长 - 合理设置请求超时(建议非流式 60s、流式 300s)
- 生产环境通过日志追踪
id字段以便排查问题