API 参考文档
一个网关、两种模式。请求体兼容 OpenAI 格式,后端接百度千帆。
https://api.tokencoup.com 是规划中的生产端点,尚未上线。参考服务器本地运行于 http://127.0.0.1:8081(默认 mock 模式),国际版转售 key 池尚未接入 —— 在接入真实国际版千帆 key 之前,模式 B 返回 resale_pool_empty。以下文档描述的是已经实现并测试通过的契约。 v0.3 新增 GET /v1/usage、GET /v1/models 与缓冲式 SSE 流式输出,三者均已被参考服务器的测试覆盖。概览
tokencoup 网关是架在百度千帆前面的一层轻量、兼容 OpenAI 格式的代理。它增加网关级鉴权、限流、用量计量与计费,不改写请求体。
版本与模式写在 URL 路径里,而不是请求头里。这样数据驻留边界是显式的,也能杜绝「用国内版 key 服务海外请求」这条被永久禁止的路径(C2/S3 拦截)。
| 版本 | 路径前缀 | 模式 | 上游基址 | 数据驻留 |
|---|---|---|---|---|
国际版(intl) | /intl/a/…、/intl/b/… | A + B | https://api.baiduqianfan.ai/v1/ | 海外(S1 目标);实际数据驻留待百度书面确认 |
国内版(cn) | /cn/a/… | 仅 A | https://qianfan.baidubce.com/v2/ | 中国大陆 |
{edition}/{mode}/ 之后的部分会原样拼到该版本的上游基址。上游基址已于 2026-11-12 按千帆官方文档核对:国际版 https://api.baiduqianfan.ai/v1/、国内版 https://qianfan.baidubce.com/v2/。国际版「海外数据驻留」仍需百度书面确认,依赖该结论前请先看跨境传输说明页。快速开始
- 创建网关 API Key(
rf_…),其套餐决定 RPM 与 token 配额。 - 选择模式 A(自带千帆 key)—— 两个版本都支持。
- 向
/cn/a/…POST 一个 OpenAI 风格的 chat 请求体。
BASE=https://api.tokencoup.com
curl -s "$BASE/cn/a/v1/chat/completions" \
-H "X-Gateway-Key: rf_YOUR_GATEWAY_KEY" \
-H "Authorization: Bearer YOUR_QIANFAN_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "ernie-4.0-8k",
"messages": [{"role": "user", "content": "用一句话打个招呼。"}]
}'{
"id": "chatcmpl-…",
"object": "chat.completion",
"model": "ernie-4.0-8k",
"choices": [{
"index": 0,
"message": {"role": "assistant", "content": "你好!"},
"finish_reason": "stop"
}],
"usage": {"prompt_tokens": 12, "completion_tokens": 5, "total_tokens": 17}
}鉴权
存在两个不同的 key,混淆它们是接入时最高频的错误。
| 请求头 | 适用范围 | 取值 | 处理方式 |
|---|---|---|---|
X-Gateway-Key | 所有请求 | rf_… 网关 API Key | 库内只存 SHA-256 哈希;关联套餐与订阅 |
Authorization: Bearer … | 仅模式 A | 你自己的千帆 key | 不落库,转发给上游 |
X-Provider-Key | 仅模式 A | Authorization 的替代写法 | 不落库,转发给上游 |
Content-Type | 所有请求 | application/json | JSON 请求体必填 |
X-Gateway-Key 缺失、无效或已吊销会在触达上游之前返回 401 gateway_auth_failed。明文 key 仅在创建时展示一次。/intl/…(或国际版 key 打 /cn/…)返回 403 key_edition_mismatch;未在版本注册表中显式登记的 key 一律 fail-closed,返回 403 key_edition_unknown。刻意不按前缀判断:国内版与国际版千帆 key 同为 bce-v3/ALTAK- 前缀,前缀无法证明版本。端点
POST 用于推理:路径前两段选择版本与模式,其余部分原样转发给千帆上游。GET 提供两个只读端点:/v1/usage(本地台账)与 /v1/models(上游透传)。GET 同样需要鉴权并受限流约束,但不消耗 token、不计费。
| 方法 | 路径 | 模式 | 含义 |
|---|---|---|---|
| POST | /cn/a/<千帆路径> | A | 自带 key 转发 —— 所有版本 |
| POST | /intl/b/<千帆路径> | B | 按量转售 —— 仅国际版 |
| GET | /cn/{a|b}/v1/usage | A/B | 本地实测用量 —— 不请求上游、不计费 |
| GET | /cn/{a|b}/v1/models | A/B | 已核实公开快照(17 个模型,14 个带价) |
{
"model": "ernie-4.0-8k",
"messages": [
{"role": "system", "content": "你是一个有帮助的助手。"},
{"role": "user", "content": "用两句话总结:……"}
],
"temperature": 0.7,
"stream": false
}model。前缀之后的部分即千帆自身的 API 路径(例如 v1/chat/completions)。用量查询(GET,本地真值)
GET /cn/{a|b}/v1/usage 返回网关自身 subscriptions 与 usage_ledger 表中的实测数值。它不请求上游、不计量、不计费。配额与 RPM 取自 gateway/plans.py —— 与价格页构建时注入的是同一份真源。
curl -s http://127.0.0.1:8081/cn/a/v1/usage \
-H 'X-Gateway-Key: rf_...'| 字段 | 含义 |
|---|---|
token_quota / rpm_limit | 来自 gateway/plans.py 的套餐值 |
token_used_billable | 本账期已消耗的 Mode B 计费 token |
token_remaining | 配额 − token_used_billable |
ledger_calls | 台账记录的全部调用(Mode A 与 Mode B) |
ledger_tokens | 全部调用累计的估算 token |
billed_amount_usd | 台账 billed_amount 合计 |
overage_usd_per_1k_tokens | 由 plans.TOKEN_PRICE_USD 推导 |
len(body)/4),尚未解析上游返回的 usage 字段。token_used_billable 与 ledger_tokens 口径不同:只有计费的 Mode B 调用才累加前者。两者都不是最终账单 —— 见「计费与配额」。模型列表(GET,透传)
GET /cn/{a|b}/v1/models 在与推理相同的版本/key 校验(C2 S3)下透传给千帆上游。2026-11-12 已实跑核实:公开端点 https://api.baiduqianfan.ai/v1/models 无需鉴权即返回 HTTP 200,含 17 个模型、其中 14 个带公开单价。tokencoup 不改写这份清单 —— 首页模型价格表是 site/fetch_models.py 生成的带时间戳快照。mock 模式不发起网络请求,返回空列表。
curl -s http://127.0.0.1:8081/cn/a/v1/models \
-H 'X-Gateway-Key: rf_...' -H 'Authorization: Bearer <你的千帆key>'datacenters 的模型全部标注 country_code: CN。这是来自上游的一手反证,不能据此宣称国际版流量不进入中国大陆。目录价格不是结算承诺价 —— 上线前须在千帆控制台并以书面形式确认模型 ID、单价与实际数据驻留。采用嵌套定价结构(schema_version 2.x)的模型会在快照中列出,但首页不展示其价格。流式输出(SSE)
在请求体中设 stream: true。响应为 Content-Type: text/event-stream,采用 OpenAI 风格的 data: 分块,以 data: [DONE] 结束。v0.3 采用缓冲透传:先读完上游 SSE 再一次性写出,尚未实现逐块 flush,客户端不应假定逐 token 延迟。
curl -N http://127.0.0.1:8081/cn/a/v1/chat/completions \
-H 'X-Gateway-Key: rf_...' -H 'Authorization: Bearer <你的千帆key>' \
-H 'Content-Type: application/json' \
-d '{"model":"ernie-4.0-8k","messages":[{"role":"user","content":"hi"}],"stream":true}'data: {"id":"mock-chunk-1","object":"chat.completion.chunk","mock":true,"choices":[...]}
data: [DONE][DONE],无需上游 key 即可联调 SDK。两种模式:BYOK 与按量转售
| 模式 A —— 自带 key | 模式 B —— 按量转售 | |
|---|---|---|
| 千帆 key | 你自己提供 | tokencoup 国际版 key 池 |
| 计费 | 订阅制,token 不加价 | 按 token 计费,仅成功(200)响应 |
| 配额预检 | 无 | 有 —— 402 quota_exceeded |
| key 版本校验 | 有(C2/S3 拦截) | 不适用;key 池已锁定版本 |
| 可用版本 | intl + cn | 仅 intl |
| 数据驻留 | 跟随版本 | 海外 —— 目标,未核实(等百度书面确认) |
cn 版关闭模式 B,请求返回 403 mode_B_not_allowed_on_cn。仅国际版承载转售。错误码
错误是带 error 机器码的 JSON 对象,部分带 detail。千帆上游的错误按原始状态码与响应体原样透传。
| HTTP | error | 触发条件 | 处理 |
|---|---|---|---|
| 400 | edition_unknown | 路径缺少合法的 {intl|cn}/{a|b} 前缀 | 改用文档中的路径 |
| 401 | gateway_auth_failed | X-Gateway-Key 缺失 / 无效 / 已吊销 | 重新生成网关 key |
| 402 | quota_exceeded | 模式 B token 配额耗尽 | 升级套餐或等待重置 |
| 403 | mode_B_not_allowed_on_cn | 国内版请求了模式 B | 改用 /cn/a/… 或切到 intl |
| 403 | missing_provider_key | 模式 A 未带千帆 key | 补 Authorization 或 X-Provider-Key |
| 403 | key_edition_unknown | 千帆 key 未在版本注册表中登记(不按前缀推断) | 登记该 key 并显式标注 domestic / international |
| 403 | key_edition_mismatch | 千帆 key 版本与服务版本不符(C2/S3) | 让 key 与版本匹配 |
| 429 | rate_limited | 超出套餐 RPM | 退避重试或升级 |
| 503 | resale_pool_empty | 国际版转售 key 池未配置 | 服务方补入国际版千帆 key |
{
"error": "quota_exceeded",
"detail": "subscription token quota exhausted; upgrade plan or wait for reset"
}限流
限流按网关 key 维度,采用 60 秒滑动窗口(配置 REDIS_URL 走 Redis,否则内存回退)。检查发生在上游调用之前,因此 429 不消耗 token。
| 套餐 | RPM | 窗口 |
|---|---|---|
free | 60 | 60 秒 |
pro | 600 | 60 秒 |
scale | 6,000 | 60 秒 |
建议:对 429 与 5xx 采用带抖动的指数退避;401、402、403 请先修正请求,不要盲目重试。
数据驻留(国内版)
国内版仅提供模式 A。上游为千帆国内版端点,log_prompt=true 以满足境内合规要求;请求不经过 Cloudflare 边缘,保持 S2 闭合路径。
机器可读规范
三类路径的 OpenAPI 3.1 描述发布在 openapi.json,可直接导入 Postman、Insomnia 或用 SDK 生成器生成客户端。
base_url 指向 https://api.tokencoup.com/cn/a/v1,并把 X-Gateway-Key 设为默认请求头即可。网关不改写请求体,标准 chat-completion 方法可直接复用。常见问题
需要自己有千帆账号吗?
模式 A:需要。模式 B:不需要,tokencoup 提供国际版 key 池。
prompt 会被存储吗?
国际版不会(log_prompt=false、collect_logs=false)。国内版按境内合规要求开启 prompt 日志。
国内版千帆 key 能打国际版端点吗?
不能。这正是被永久禁止的 C2/S3 路径,网关返回 403 key_edition_mismatch。
什么时候扣费?
仅模式 B、仅成功(200)响应。失败请求会写一条零金额台账,但不扣配额。
支持流式输出吗?
v0.2 不支持 —— 参考服务器读取并转发单个 JSON 响应。请设 stream: false。