tokencoup
版本: International · 国内版 语言: EN · ZH
获取 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)—— 两个版本都支持。
  • 向 /intl/a/… POST 一个 OpenAI 风格的 chat 请求体。
cURL —— 模式 A
BASE=https://api.tokencoup.com

curl -s "$BASE/intl/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/intl/a/<千帆路径>A自带 key 转发 —— 所有版本
POST/intl/b/<千帆路径>B按量转售 —— 仅国际版
GET/intl/{a|b}/v1/usageA/B本地实测用量 —— 不请求上游、不计费
GET/intl/{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 /intl/{a|b}/v1/usage 返回网关自身 subscriptions 与 usage_ledger 表中的实测数值。它不请求上游、不计量、不计费。配额与 RPM 取自 gateway/plans.py —— 与价格页构建时注入的是同一份真源。

请求
curl -s http://127.0.0.1:8081/intl/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 /intl/{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/intl/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/intl/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。仅国际版承载转售。

模式 B 快速开始(仅国际版)

模式 B 不需要千帆 key。你按 token 付费使用 tokencoup 的国际版千帆 key 池,网关在校验网关 key 之后自行注入池内 key 到上游。

cURL —— 模式 B
curl -s "https://api.tokencoup.com/intl/b/v1/chat/completions" \
  -H "X-Gateway-Key: rf_YOUR_GATEWAY_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "ernie-4.0-8k", "messages": [{"role": "user", "content": "你好"}]}'
Node / fetch
const res = await fetch('https://api.tokencoup.com/intl/b/v1/chat/completions', {
  method: 'POST',
  headers: {
    'X-Gateway-Key': process.env.TOKENCOUP_GATEWAY_KEY,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: 'ernie-4.0-8k',
    messages: [{ role: 'user', content: '你好' }],
  }),
});
console.log(res.status, await res.json());
国际版 key 池填充之前,模式 B 返回 503 resale_pool_empty。本地开关 TOKENCOUP_SIM_INTL=1 仅供开发模拟,生产环境绝不可设置。

计费与配额

仅模式 B计费。用量在成功(200)响应后计入台账并扣减订阅的 token 配额。原型按 len(body)/4 估算 token;生产须改为读取上游返回的 usage 字段。

套餐价格Token 配额RPM(60 秒窗口)
free$0100,00060
pro$29 / 月5,000,000600
scale$299 / 月80,000,0006,000

超额单价 每 1,000 token $0.002(占位值)。配额耗尽返回 402 quota_exceeded。USD→CNY 汇率(7.2)与税率均为占位;上线前 EU 客户须处理 VAT。

单一真源:定价页已不再硬编码任何数值。构建时直接读取 gateway/plans.py,把价格、Token 配额与 RPM 注入页面;若套餐集合发生漂移,构建闸门会直接失败。因此定价页与上表始终等于网关实际强制执行的值。

错误码

错误是带 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 请先修正请求,不要盲目重试。

数据驻留与隐私(国际版)

国际版实现的是 C2 / S1 设计目标:请求转发至千帆国际版上游并带 X-Data-Region: overseas 标记,log_prompt=false —— 不持久化 prompt。审计记录只含版本、模式、key id 与 token 数。X-Data-Region 只是内部路由标记,不决定上游在哪里处理数据,也不是驻留证据。 海外驻留目前是目标,待百度书面确认。

Cloudflare AI Gateway 仅前置在国际版路径:300 秒边缘缓存、600 次/60 秒限流、3 次重试、collect_logs=false(不存请求/响应体)、网关鉴权已开启。国内版保持直连。

GDPR 对中国大陆无充分性认定,EU→CN 传输需 SCC + TIA。S1 的设计意图是绕开该路径,但尚未核实:百度未书面确认千帆国际版端点的驻留区域,第三方尽调称部分个人信息存于中国、无公开 DPA。在驻留区域与 DPA/SCC 确认之前,不要通过线上服务发送欧盟个人数据。无论驻留结论如何,国内版 key 在国际版一律被拒(C2/S3)。

机器可读规范

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

把任意兼容 OpenAI 的 SDK 的 base_url 指向 https://api.tokencoup.com/intl/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。