文档 · 快速接入
OpenAI 兼容 · 一行换 base_url · 模型列表 API 直出
Python
from openai import OpenAI
client = OpenAI(
base_url="https://api.tokenpower.ai/v1",
api_key="tp-sk-...")
resp = client.chat.completions.create(
model="qwen-flash", # 或指定:qwen-plus / DeepSeek-V3.1-Fast / claude-opus-4-8 …
messages=[{"role": "user", "content": "你好"}])
# 有哪些模型?一行拿到,无需翻页面
for m in client.models.list():
print(m.id)curl
curl https://api.tokenpower.ai/v1/chat/completions \
-H "Authorization: Bearer tp-sk-..." \
-H "Content-Type: application/json" \
-d '{"model":"qwen-flash","messages":[{"role":"user","content":"你好"}]}'端点
| 端点 | 计价 | 状态 |
|---|---|---|
| GET /v1/models | — | 可用 |
| POST /v1/chat/completions | 按 token | 可用 |
| POST /v1/responses | 按 token | 可用 |
| POST /v1/embeddings | 按 token | 可用 |
| POST /v1/rerank | 按 token | 可用 |
| POST /v1/images/generations | 按张 | 需开通 |
| POST /v1/audio/speech | 按字符 | 需开通 |
| POST /v1/audio/transcriptions | 按秒 | 需开通 |
前五个按 token 计价,逐笔进你的流水,直接可用;chat 与 responses 支持 stream: true。
后三个上游按次/按量收费,我们的价格表目前只有 token 维度—— 与其按 0 元放行、让你看到一本不扣费的假账,不如先关着:调用返回 501 并说明原因。 需要用请联系 [email protected] 开通;开通后调用照常记流水,费用列标「未计价」, 用量(张数 / 字符数 / 文件大小)如实写在流水的 meta.units 里。
/v1/audio/transcriptions 是 multipart 上传,网关原样透传不拆包, 所以模型名请另附在查询串上:?model=whisper-1(不附则流水记 unspecified)。
后三个上游按次/按量收费,我们的价格表目前只有 token 维度—— 与其按 0 元放行、让你看到一本不扣费的假账,不如先关着:调用返回 501 并说明原因。 需要用请联系 [email protected] 开通;开通后调用照常记流水,费用列标「未计价」, 用量(张数 / 字符数 / 文件大小)如实写在流水的 meta.units 里。
/v1/audio/transcriptions 是 multipart 上传,网关原样透传不拆包, 所以模型名请另附在查询串上:?model=whisper-1(不附则流水记 unspecified)。
机器客户 · agent 自助开户
POST https://tokenpower.ai/api/agent/signup
{"email":"[email protected]","orgName":"my-agent"}
# → org + API key(仅返回一次)· 零余额起步,未充值调用返回 402
# 充值须由人类以注册邮箱登录完成说明
· 模型名照 /v1/models 返回的用即可,切换模型只改这一个字段
· 流式:stream: true,SSE 透传
· 每一笔调用都会出现在你的流水里——tokens、费用、延迟
· 余额不足返回 402;充值后即恢复
· 流式:stream: true,SSE 透传
· 每一笔调用都会出现在你的流水里——tokens、费用、延迟
· 余额不足返回 402;充值后即恢复
限流
默认 60 RPM / 密钥 · 可在 密钥页 按密钥单独调整 · 需要超出常规的额度联系 [email protected]
密钥管控
每把密钥都能单独设四项,都在 密钥页 上改,改完即时生效 (只有组织管理员能建密钥和改这些设置):
· 到期时间 —— 到期后调用返回 401, 错误里带到期日期与换钥地址。留空 = 永不过期
· 来源 IP 白名单 —— 一行一个,IPv4 或 CIDR(如 203.0.113.7 / 10.0.0.0/8)。 名单外的来源返回 403,错误里会回显你这次请求的来源 IP,照着贴进白名单即可。留空 = 不限来源
· 每分钟上限 —— 该密钥自己的 RPM;超出返回 429 + retry-after,文案里的数字就是这把密钥的真实上限。留空 = 用默认值
· 可调模型名单 —— 一行一个模型名。名单外的模型返回 403, 错误里回显这把密钥允许哪几个。留空 = 不限。 与设置页的组织级模型白名单分工:那条管「整个组织不许用什么」, 这一项管「这把密钥只该干什么」——同一个组织里,客服系统那把密钥拿去跑别的模型,组织名单是拦不住的
· 到期时间 —— 到期后调用返回 401, 错误里带到期日期与换钥地址。留空 = 永不过期
· 来源 IP 白名单 —— 一行一个,IPv4 或 CIDR(如 203.0.113.7 / 10.0.0.0/8)。 名单外的来源返回 403,错误里会回显你这次请求的来源 IP,照着贴进白名单即可。留空 = 不限来源
· 每分钟上限 —— 该密钥自己的 RPM;超出返回 429 + retry-after,文案里的数字就是这把密钥的真实上限。留空 = 用默认值
· 可调模型名单 —— 一行一个模型名。名单外的模型返回 403, 错误里回显这把密钥允许哪几个。留空 = 不限。 与设置页的组织级模型白名单分工:那条管「整个组织不许用什么」, 这一项管「这把密钥只该干什么」——同一个组织里,客服系统那把密钥拿去跑别的模型,组织名单是拦不住的
被这四项拦下的调用照样进流水(状态 blocked, 原因写在 policy_hit:key_expired / ip_not_allowed / model_not_allowed)—— 在审计页按密钥一筛就知道是被哪道门挡的,不用来问我们。
把调用归到业务流
流水里的工作流有两个来源,请求头优先:
· 请求头 x-tokenpower-workflow: 工单分诊 —— 值填工作流名称或 id 都行,按调用带,粒度最细
· 密钥绑定 —— 在 密钥页 把一把密钥绑到一条工作流, 之后这把密钥的每笔流水自动带上,客户端零改动
两者都没有时如实留空,我们不猜;头里写了个认不出来的名字, 流水的 meta.workflowHeaderUnknown 会原样记下你写的值, 按工作流筛出空结果时照着它就知道是名字拼错了。
流水里的发起人取自密钥的归属人;机器自助开户、旧站迁移过来的密钥没有具体的人, 审计页显示为机器密钥——不编一个人上去。
· 请求头 x-tokenpower-workflow: 工单分诊 —— 值填工作流名称或 id 都行,按调用带,粒度最细
· 密钥绑定 —— 在 密钥页 把一把密钥绑到一条工作流, 之后这把密钥的每笔流水自动带上,客户端零改动
两者都没有时如实留空,我们不猜;头里写了个认不出来的名字, 流水的 meta.workflowHeaderUnknown 会原样记下你写的值, 按工作流筛出空结果时照着它就知道是名字拼错了。
流水里的发起人取自密钥的归属人;机器自助开户、旧站迁移过来的密钥没有具体的人, 审计页显示为机器密钥——不编一个人上去。
策略(企业版)
四类,全在 设置页自己建、自己改、自己启停,网关最多 30 秒后生效:
· 模型白名单 —— 名单外的模型返回 403
· 敏感词拦截 —— 正文含任一词即拦(大小写不敏感),403
· 数据出域限制 —— 正文出现邮箱 / 手机号 / API key / 身份证 / 银行卡 (可勾选类别)即拦,403;识别规则与账本脱敏同一套
· 调用限流 —— 整个组织每分钟上限(与密钥自己的 RPM 两道都判), 返回 429 + retry-after
· 模型白名单 —— 名单外的模型返回 403
· 敏感词拦截 —— 正文含任一词即拦(大小写不敏感),403
· 数据出域限制 —— 正文出现邮箱 / 手机号 / API key / 身份证 / 银行卡 (可勾选类别)即拦,403;识别规则与账本脱敏同一套
· 调用限流 —— 整个组织每分钟上限(与密钥自己的 RPM 两道都判), 返回 429 + retry-after
命中策略的调用照样进流水(状态 blocked,policy_hit 记的是策略名)——被拒的调用也是调用, 审计页「只看策略命中」一筛就是全部证据。
兑换码
收到我们发的充值码,在 充值页 输入即时到账, 并在你的充值记录里留一条(通道显示为兑换码)。 码的面额币种必须与你的记账币种一致——我们不做汇率换算, 币种对不上会直接拒绝并说明该换哪种码。
模型映射
代码里写死的模型名可以由我们映射到别的模型,你这边一行都不用改(找 support 提)。 映射生效时,流水会同时记下你请求的原名(meta.aliasFrom) 与实际落到的模型——账上永远对得出这一笔到底是哪个名字发起的。