tokencoup
版本: International · 国内版 语言: ZH · EN
获取 API Key
网关 v0.3 · 参考实现

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 + Bhttps://api.baiduqianfan.ai/v1/海外(S1 目标);实际数据驻留待百度书面确认
国内版(cn)/cn/a/…仅 Ahttps://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 请求体。
cURL —— 模式 A
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": "用一句话打个招呼。"}]
  }'
200 OK —— 上游原样透传
{
  "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 id、token 数)不会出现在响应体里;国际版下也不包含任何 prompt 内容。

鉴权

存在两个不同的 key,混淆它们是接入时最高频的错误。

请求头适用范围取值处理方式
X-Gateway-Key所有请求rf_… 网关 API Key库内只存 SHA-256 哈希;关联套餐与订阅
Authorization: Bearer …仅模式 A你自己的千帆 key不落库,转发给上游
X-Provider-Key仅模式 AAuthorization 的替代写法不落库,转发给上游
Content-Type所有请求application/jsonJSON 请求体必填
参考服务器只处理 POST。X-Gateway-Key 缺失、无效或已吊销会在触达上游之前返回 401 gateway_auth_failed。明文 key 仅在创建时展示一次。
key 版本强校验(C2/S3):国内版千帆 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/usageA/B本地实测用量 —— 不请求上游、不计费
GET/cn/{a|b}/v1/modelsA/B已核实公开快照(17 个模型,14 个带价)
请求体
{
  "model": "ernie-4.0-8k",
  "messages": [
    {"role": "system", "content": "你是一个有帮助的助手。"},
    {"role": "user", "content": "用两句话总结:……"}
  ],
  "temperature": 0.7,
  "stream": false
}
上面的 model ID 是示意(ERNIE 系列)。可用模型以千帆控制台为准 —— tokencoup 不改写 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 推导
token 数仍是估算(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>'
合规提示:14 个声明了 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}'
响应形状(mock)
data: {"id":"mock-chunk-1","object":"chat.completion.chunk","mock":true,"choices":[...]}

data: [DONE]
流式响应体不写审计日志(GDPR:不持久化 prompt / 响应内容)。mock 模式输出三个合成分块加 [DONE],无需上游 key 即可联调 SDK。

两种模式:BYOK 与按量转售

模式 A —— 自带 key模式 B —— 按量转售
千帆 key你自己提供tokencoup 国际版 key 池
计费订阅制,token 不加价按 token 计费,仅成功(200)响应
配额预检无有 —— 402 quota_exceeded
key 版本校验有(C2/S3 拦截)不适用;key 池已锁定版本
可用版本intl + cn仅 intl
数据驻留跟随版本海外 —— 目标,未核实(等百度书面确认)
C1:国内版千帆条款禁止转售 / 二次分发,因此 cn 版关闭模式 B,请求返回 403 mode_B_not_allowed_on_cn。仅国际版承载转售。

错误码

错误是带 error 机器码的 JSON 对象,部分带 detail。千帆上游的错误按原始状态码与响应体原样透传。

HTTPerror触发条件处理
400edition_unknown路径缺少合法的 {intl|cn}/{a|b} 前缀改用文档中的路径
401gateway_auth_failedX-Gateway-Key 缺失 / 无效 / 已吊销重新生成网关 key
402quota_exceeded模式 B token 配额耗尽升级套餐或等待重置
403mode_B_not_allowed_on_cn国内版请求了模式 B改用 /cn/a/… 或切到 intl
403missing_provider_key模式 A 未带千帆 key补 Authorization 或 X-Provider-Key
403key_edition_unknown千帆 key 未在版本注册表中登记(不按前缀推断)登记该 key 并显式标注 domestic / international
403key_edition_mismatch千帆 key 版本与服务版本不符(C2/S3)让 key 与版本匹配
429rate_limited超出套餐 RPM退避重试或升级
503resale_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窗口
free6060 秒
pro60060 秒
scale6,00060 秒

建议:对 429 与 5xx 采用带抖动的指数退避;401、402、403 请先修正请求,不要盲目重试。

数据驻留(国内版)

国内版仅提供模式 A。上游为千帆国内版端点,log_prompt=true 以满足境内合规要求;请求不经过 Cloudflare 边缘,保持 S2 闭合路径。

依据国内版千帆条款,本版不提供转售(模式 B)。如需免 key 的按量接入,请使用国际版。

机器可读规范

三类路径的 OpenAPI 3.1 描述发布在 openapi.json,可直接导入 Postman、Insomnia 或用 SDK 生成器生成客户端。

把任意兼容 OpenAI 的 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。