API 参考
unbleep 使用 OpenAI Chat Completions API。如果你调用过 OpenAI,那你已经会用这个 API 了——把客户端指向 https://unbleep.ai/v1,再换掉密钥即可。
快速上手
安装 OpenAI SDK,设置 base URL 和你的密钥,然后发起调用。
from openai import OpenAI
client = OpenAI(
base_url="https://unbleep.ai/v1",
api_key="ub_live_9f2c…",
)
resp = client.chat.completions.create(
model="unbleep",
messages=[{"role": "user", "content": "Say hello."}],
)
print(resp.choices[0].message.content)
身份验证
每个请求都需要在 Authorization 头中携带 Bearer token。密钥带有前缀,泄漏时密钥扫描器一眼就能识别:
ub_live_…——正式密钥,用于生产环境,从你的预付额度中扣费。ub_test_…——用于本地开发。计费方式与正式密钥完全相同,同样的单 token 费率,扣同一份预付额度;唯一的区别是单个密钥的速率限制更低(见速率限制)。测试密钥是一个独立、可撤销的凭证——不是免费层级。
Authorization: Bearer ub_live_9f2c…
密钥要留在服务端。绝不要把正式密钥打包进浏览器或移动端代码。
模型
把下列 ID 之一作为 model 传入。不带日期的别名始终指向最新构建;带日期的快照 ID 也会被接受,目前解析到同一个构建。无论你发送哪种形式,响应里报告的都是不带日期的 ID——请求 unbleep-250811 返回的是 "model": "unbleep"。
| 模型 | 别名指向 | 上下文 | 最适合 |
|---|---|---|---|
| unbleep | unbleep-250811 | 256K | 通用场景——默认选择 |
| unbleep-high | unbleep-high-250811 | 1M | 最大型任务——长文档 & 整个代码库 |
| unbleep-mini | unbleep-mini-250811 | 32K | 便宜、快速、高频调用 |
Chat completions
POST /v1/chat/completions——核心端点。请求体和响应体与 OpenAI 的 schema 一致。
curl https://unbleep.ai/v1/chat/completions \
-H "Authorization: Bearer ub_live_9f2c…" \
-H "Content-Type: application/json" \
-d '{
"model": "unbleep",
"messages": [
{"role": "system", "content": "You are terse."},
{"role": "user", "content": "Explain abliteration in one line."}
],
"temperature": 0.7,
"max_tokens": 256
}'
{
"id": "chatcmpl_a1b2c3",
"object": "chat.completion",
"model": "unbleep",
"choices": [{
"index": 0,
"message": { "role": "assistant", "content": "…" },
"finish_reason": "stop"
}],
"usage": { "prompt_tokens": 24, "completion_tokens": 18, "total_tokens": 42 }
}
流式输出
设置 "stream": true 即可接收 Server-Sent Events。每个事件都是一个带 delta 的 chat.completion.chunk;流以字面量 data: [DONE] 结束。
data: {"choices":[{"delta":{"content":"Ab"}}]}
data: {"choices":[{"delta":{"content":"literation"}}]}
data: {"choices":[{"delta":{},"finish_reason":"stop"}]}
data: [DONE]
推理
推理模型会先思考再作答。思考过程以 reasoning_content 的形式返回,与常规的 content 并列——普通调用时位于 message 上,流式输出时位于 delta 上。只有模型确实产生了思考过程时该字段才存在,所以请把它当作可选字段,答案本身仍从 content 读取。
{
"index": 0,
"message": {
"role": "assistant",
"reasoning_content": "The question asks for one line, so…",
"content": "…"
},
"finish_reason": "stop"
}
推理 token 是要计费的。思考过程属于生成的输出,按模型的正常输出费率收费,无论你的代码是否读取该字段。对一个简短问题的长篇推敲,会实实在在地记在你的账单上。
发送 "thinking": false 可关闭推理,让补全预算用在答案上而不是思考过程上:
{
"model": "unbleep",
"messages": […],
"thinking": false
}
策略旋钮
unbleep 的差异化所在。可选的 policy 参数设定对一个请求施加多少治理。默认为 off。
off——无过滤基线(默认)。不注入任何拒答。research——回答方式与off完全相同。该值会记录在用量行上,供你自己做报表;不施加任何额外筛查。strict——将消息文本与服务黑名单比对,命中时返回策略错误。黑名单由运营方维护,对所有选择启用的账户统一适用;没有可配置的账户级黑名单。
{
"model": "unbleep",
"messages": […],
"policy": "research"
}
错误
错误使用 OpenAI 的错误封装格式,因此现有的错误处理无需改动。
{
"error": {
"type": "invalid_request_error",
"code": "invalid_api_key",
"message": "Incorrect API key provided."
}
}
| 状态码 | 含义 |
|---|---|
| 401 | 密钥缺失或无效 |
| 402 | 额度用尽——充值后继续 |
| 422 | 被 policy: strict 拦截 |
| 429 | 触发速率限制——退避后重试 |
| 5xx | 上游错误——可安全地退避重试 |
速率限制
两个相互独立的限制同时生效,都以账户为单位:请求速率和并发上限。
请求速率
每个账户每分钟 60 个请求,按 60 秒滑动窗口计量。限制作用于账户而非密钥——多创建密钥买不来额外的吞吐量,你名下的每个密钥都共享这 60 个配额。测试密钥另有每分钟 15 个请求的单密钥上限;它同样计入账户窗口。
每个响应都携带标准的速率限制头,让你无需猜测就能控制节奏。它们报告的是最接近触顶的那个窗口:
x-ratelimit-limit-requests: 60
x-ratelimit-remaining-requests: 58
x-ratelimit-reset-requests: 43
x-ratelimit-reset-requests 是一个纯整数——距离窗口释放一个名额的整秒数,没有单位后缀。请把它当数字解析,而不是时长字符串。
并发
每个账户最多同时有 8 个请求在处理中。第 9 个并发请求会被立即拒绝,返回 429 和错误码 too_many_concurrent_requests;响应携带 retry-after: 1。被拒绝的请求不计费。流式调用会一直占用名额直到流结束,所以通常是长流让你触顶。
{
"error": {
"type": "rate_limit_error",
"code": "too_many_concurrent_requests",
"message": "Too many concurrent requests for this account (limit 8)."
}
}
这两个上限对标准账户是固定的——不会随预付余额增长。需要更多余量?Enterprise 可以提升。