SUB&SUB · 文档
语言
主题

API 参考

SUB&SUB 在 https://api.subnsub.com/v1 提供多供应商中转。OpenAI 客户端请求 /v1/chat/completions;Anthropic 客户端请求 /v1/messages。同一把 sk-cf-... Key 同时路由两者 —— 在请求体里选定模型,中转会自动选择上游。

服务可用范围

仅限现有账户 API 访问目前仅向在 2026 年 6 月 8 日(北京时间)之前创建的账户开放。新注册用户可以使用统一账户及 SUB&SUB Tools,但不能进入 API 控制台、创建 API Key、充值 API 余额或调用中转服务。重新开放 API 注册后,我们会更新本节。

快速上手

对于已开通 API 的现有账户,你需要准备三项内容:

  1. Base URL:https://api.subnsub.com/v1(OpenAI 客户端)或 https://api.subnsub.com(Anthropic 客户端 —— SDK 会自行追加 /v1/messages)
  2. API Key:从控制台签发的 sk-cf-...
  3. 模型16 个受支持模型之一,例如 gpt-5.4-miniclaude-sonnet-5

身份认证

每个请求都必须携带 Authorization: Bearer sk-cf-... 头。Key 从控制台签发,并以 SHA-256 哈希存储 —— 一旦离开创建界面,明文将永久消失,所以请立即保存。

提示 为每个集成(聊天机器人、IDE 插件、批处理任务)单独生成一把 Key。在控制台中撤销已泄露的 Key 会在数秒内生效。

端点

稳定的公共接口范围见下文及机器可读的 OpenAPI 3.1 文档。未在这里列出的字段可能会透传给上游,但不会自动成为 SUB&SUB 的兼容性承诺。

POST /v1/chat/completions

POST/v1/chat/completions

发送一个 chat completion 请求。请求结构与 OpenAI Chat Completions API 一致 —— OpenAI SDK 无需改动即可使用。

参数类型说明
modelstring已验证模型 ID 之一。
messagesarray对话历史。每一项为 {role, content},其中 rolesystem / user / assistant
streamboolean若为 true,响应以 SSE 分块形式发送。参见流式
stream_optionsobject可选。中转始终对上游强制 {include_usage: true},使最后一个分块携带 token 用量块 —— 覆盖它不会有任何效果。
max_tokensinteger限制补全长度。默认为该模型的最大值。
temperaturenumber0 – 2。越高 = 越随机。

POST /v1/responses

POST/v1/responses

OpenAI Responses API —— OpenAI 较新的请求格式(client.responses.create(...))。支持目录中的所有模型:gpt-* 原生支持,claude-* 则通过与 chat/completions 相同的兼容桥接层。计费方式相同:输入和输出 token 均按模型档位单价计费。

参数类型说明
modelstring任一目录模型 ID
inputstring | array提示词,可以是纯文本,也可以是 Responses API 定义的结构化条目列表。
max_output_tokensinteger限制响应总长度(推理与可见输出合计)。
reasoningobject{"effort": "..."},可用值与 reasoning_effort 相同,共五档。
streamboolean设为 true 时,返回标准 Responses SSE 事件流:response.createdresponse.output_text.delta、…、response.completed
backgroundboolean不支持。background: true 会返回 400 unsupported_background_mode;中转仅支持同步请求。
注意 :online 联网搜索后缀对本端点无效:后缀会被移除,但不会注入搜索上下文(查询词从 messages 提取,而 Responses 请求不含该字段)。如需联网搜索,请使用 /v1/chat/completions/v1/messages

可直接运行的 Responses 示例:

curl https://api.subnsub.com/v1/responses \
  -H "Authorization: Bearer sk-cf-xxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.4-mini",
    "input": "Explain exponential backoff in two sentences."
  }'

POST /v1/messages

POST/v1/messages

面向 claude-* 模型的 Anthropic 原生端点 —— Anthropic SDK(anthropic-sdk-python@anthropic-ai/sdkclaude-code)无需改动即可对该路径使用。将 Base URL 指向 https://api.subnsub.com,并通过 x-api-key 头进行认证(如果你的客户端更倾向于 Authorization-Bearer 形式,也同样可用)。

参数类型说明
modelstring一个 claude-* 模型 ID(参见可用模型)。在此传入 OpenAI 模型会返回 400 invalid_request_error
max_tokensintegerAnthropic 要求必填 —— 限制助手回复的长度。
messagesarray对话历史,Anthropic 结构:{role, content},其中 roleuser / assistant
streamboolean若为 true,返回标准的 Anthropic SSE 事件序列:message_startcontent_block_deltamessage_deltamessage_stop
thinkingobject原样转发给 Anthropic。支持时请使用 {"type":"adaptive"};Fable 5 即使省略此字段,也始终启用自适应思考。不存在合成的 -thinking 模型 ID。
cache_controlobject支持 prompt 缓存。缓存写入 token 按该档位输入单价的 1.25× 计费,缓存读取 token 按 0.10× 计费。
注意 Claude 请求由 Anthropic 官方账户直接提供服务。请使用下方列出的准确官方模型 ID。

可直接运行的 Anthropic Messages 示例:

curl https://api.subnsub.com/v1/messages \
  -H "x-api-key: sk-cf-xxxxxxxxxxxx" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-sonnet-5",
    "max_tokens": 256,
    "messages": [{"role": "user", "content": "Hello"}]
  }'

POST /v1/messages/count_tokens

POST/v1/messages/count_tokens

在发送 Anthropic 格式的提示词前计算 token 数。请使用与 /v1/messages 相同的 x-api-keyanthropic-version、model、system、messages 和 tools 字段。此接口不计费。:online 后缀会被移除,但不会获取或计入搜索结果。

curl https://api.subnsub.com/v1/messages/count_tokens \
  -H "x-api-key: sk-cf-xxxxxxxxxxxx" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-sonnet-5",
    "messages": [{"role": "user", "content": "Count this prompt."}]
  }'

GET /v1/models

GET/v1/models

列出你实际可用的模型。中转会对两类上游执行健康检查,并返回 16 个已验证的公开 ID;POST 端点执行的是同一份白名单,因此列表不会展示调用时必然返回 400 的模型。若上游目录不可用,本端点会返回 502 models_unreachable,而不是容易误解的空列表。

# sample response (truncated)
{
  "object": "list",
  "data": [
    { "id": "gpt-5.4-mini",      "type": "model", ... },
    { "id": "gpt-5.4",           "type": "model", ... },
    { "id": "claude-sonnet-5",     "type": "model", ... },
    { "id": "claude-fable-5",      "type": "model", ... },
    ...
  ]
}

兼容性约定

兼容 OpenAI 并不表示每个上游模型的所有字段都能在每条路由上得到保证。我们将支持范围分为三级:

状态详情
已记录且稳定通过上述四个接口生成文本;同步和流式响应;文档列明的 reasoning 控制项;Anthropic 提示缓存;Chat Completions 和 Messages 的 :online;身份验证、用量计量及文档列明的错误格式。
透传(取决于模型)工具/函数调用、strict tools、结构化输出/JSON Schema、采样控制、停止序列、包含图片或文档的多段内容,以及模型的上下文/输出限制。边缘层会在不做本地验证的情况下透传这些字段,但上游支持情况和准确响应格式可能因模型及协议而异。投入生产前请测试你的确切模型和 payload;我们不承诺跨供应商归一化。
暂不提供后台 Responses 任务;Responses 的 :online;OpenAI 的图片生成、Audio、Realtime、Batch、Files、Embeddings 和 Moderation API;合成的 Claude -thinking 别名;以及 OpenAI 的 minimal reasoning effort。
提示 请将 openapi.json 与本页共同视为支持范围约定。上游目前接受的字段以后仍可能被撤回,并不会因此成为 SUB&SUB 的永久保证。

可用模型

共有两类上游:7 个 OpenAI 模型路由到共享的 ChatGPT 级账户,9 个 Claude 模型由 Anthropic 官方账户提供服务。每 token 单价取决于档位(见定价),同一把 Key 两边通用。

OpenAI

模型 ID家族档位备注
gpt-5.4-mini GPT-5.4Mini 快 & 便宜。聊天 & 编码场景的推荐默认选项。
gpt-5.4 GPT-5.4Standard完整尺寸的 GPT-5.4 —— 更慢,但推理更强。
gpt-5.4-2026-03-05GPT-5.4Standardgpt-5.4 的日期标记快照。
gpt-5.5 GPT-5.5Premium 更新的旗舰。
gpt-5.6-luna GPT-5.6Luna 轻量级 GPT-5.6,定位介于 Mini 与 Standard 之间。
gpt-5.6-terra GPT-5.6Standard中型 GPT-5.6,费率与 gpt-5.4 相同。
gpt-5.6-sol GPT-5.6Premium 最高档 GPT-5.6,费率与 gpt-5.5 相同。

Anthropic

模型 ID家族档位备注
claude-fable-5 Fable 5 Fable Anthropic 已广泛发布的最强模型,始终启用自适应思考。
claude-haiku-4-5-20251001 Haiku 4.5 Mini 最小的 Claude —— 与 gpt-5.4-mini 每 token 同价。
claude-sonnet-4-5-20250929 Sonnet 4.5 Standard中档 Claude —— 与 gpt-5.4 每 token 同价。
claude-sonnet-4-6 Sonnet 4.6 Standard更新的 Sonnet 调优 —— Standard 档位,与 sonnet-4.5 同价。
claude-sonnet-5 Sonnet 5 Sonnet 5 Intro最新 Sonnet;优惠价有效至 2026 年 8 月 31 日。
claude-opus-4-5-20251101 Opus 4.5 Ultra 前沿 Claude。按 Anthropic 的 list 价计费 —— 不加价(参见定价)。
claude-opus-4-6 Opus 4.6 Ultra 更新的 Opus 调优。
claude-opus-4-7 Opus 4.7 Ultra 上一代 Opus 快照。
claude-opus-4-8 Opus 4.8 Ultra 最新 Opus 快照。
注意 Claude 目录使用 Anthropic 官方模型 ID,并支持提示词缓存:缓存写入按档位输入价的 1.25 倍计费,缓存读取按 0.10 倍计费(见定价)。
Fable 拒答 Fable 5 的安全分类器可能返回 HTTP 200stop_reason: "refusal" 和空内容数组。客户端应依据 stop_reason 分支处理,不能只看 HTTP 状态,并可改用 claude-opus-4-8 重试。经 OpenAI 协议端点调用时,同一结果会表示为 finish_reason: "content_filter"(chat/completions),或 status: "incomplete"incomplete_details.reason: "content_filter"(responses)。提示词阶段的拒答不会扣除余额;已经输出部分内容后在流式过程中拒答,则照常计费。
不可用 以下模型不可用:已停用的 OpenAI ID(gpt-5.2*gpt-5.3-codex*)、不带后缀的 gpt-5.6 别名(请改用上方具名版本)、OpenAI Pro/图像/音频/实时版本、点号格式 ID(如 claude-sonnet-4.5),以及合成的 -thinking 模型 ID。请使用上方准确 ID;Claude 的思考功能请使用 Anthropic 原生 thinking 字段。

推理力度

上方所有 OpenAI 模型都属于推理模型:后端可以在输出可见内容前使用更多或更少的“思考”token。在 OpenAI /v1/chat/completions 请求体中设置 reasoning_effort(或在 /v1/responses 中设置 reasoning: {"effort": ...})即可控制预算。Claude 请使用 Anthropic 原生的 thinkingoutput_config.effort 字段,详见 /v1/messages。OpenAI 模型均接受以下五档:

取值行为
none 不思考 —— 直接给答案。最便宜、最快。
low 一次简短的推理过程。
medium 不传该字段时的默认值。均衡。
high 更深入的推理。推荐用于有一定难度的编码 / 多步骤问题。
xhigh 最大力度。最慢且最贵;仅在确实需要的高难度分析场景下使用。
# Two equivalent forms — pick whichever your SDK supports
{
  "model": "gpt-5.4-mini",
  "reasoning_effort": "high",
  "messages": [ ... ]
}

{
  "model": "gpt-5.5",
  "reasoning": { "effort": "xhigh" },
  "messages": [ ... ]
}
费用 思考 token 在计费上算作输出 token —— 力度越高 = 输出 token 越多 = 同一提示词下账单越大。每 token 单价不变。
注意 OpenAI 协议还定义了 'minimal',但本中转上的模型会拒绝它:“'minimal' is not supported with this model”。请坚持使用上面的五个取值。

流式

设置 "stream": true 以接收 Server-Sent Events。最后一个分块携带 usage 块(我们对上游强制 stream_options.include_usage,因此总会输出 token 计数),随后一个字面量 data: [DONE] 关闭该流。

# Streaming format (line by line)
data: {"id":"resp_...","choices":[{"delta":{"content":"Hi"}}]}

data: {"id":"resp_...","choices":[{"delta":{"content":"!"}}]}

data: {"id":"resp_...","choices":[],"usage":{"prompt_tokens":18,"completion_tokens":11,"total_tokens":29}}

data: [DONE]

可直接运行的 Python 流式示例:

from openai import OpenAI

client = OpenAI(
    api_key="sk-cf-xxxxxxxxxxxx",
    base_url="https://api.subnsub.com/v1",
)

stream = client.chat.completions.create(
    model="gpt-5.4-mini",
    messages=[{"role": "user", "content": "Hello"}],
    stream=True,
)
for chunk in stream:
    text = chunk.choices[0].delta.content if chunk.choices else None
    if text:
        print(text, end="", flush=True)

在该端点支持的任意模型 ID 后追加 :online,中转就会在转发给模型之前先执行一次联网搜索,并将结果前置到对话中,使答案立足于新鲜数据。该后缀在 /v1/chat/completions/v1/messages 上均有效(后者仍需 claude-* 作为基础模型);不需要任何搜索专用的请求字段。

# Same call as before — just :online on the model
curl https://api.subnsub.com/v1/chat/completions \
  -H "Authorization: Bearer sk-cf-xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.4-mini:online",
    "messages": [
      {"role": "user", "content": "What did Anthropic ship this week?"}
    ]
  }'

工作原理:中转剥离 :online,取最近一条用户消息作为查询(上限 400 字符),调用 Tavily 获取最多 3 条结果(在可用时附带提取的页面文本),外加一段可选的 Tavily 生成摘要,然后将它们以清晰分隔的 <search_results> 块前置到同一轮用户回合,再把请求发往上游。该搜索调用有 8 秒超时。结果被刻意注入到 user 角色 —— 绝不进入系统提示词 —— 因此不可信的片段无法被提升为系统优先级的指令。

<search_results> 块看起来如下。它前面会有一行指令,告诉模型将该块视为不可信的外部数据,并就编号条目进行行内引用:

<search_results query="What did Anthropic ship this week?" retrieved="2026-05-21">
Summary: <short LLM-generated synthesis of the result set>

[1] Anthropic launches Opus 4.8
URL: https://www.anthropic.com/news/opus-4-8
<extracted page text, or short snippet if extraction failed — up to ~2000 chars>

[2] ...
</search_results>
行为详情
费用目前不收附加费 —— 你只需支付模型的正常每 token 单价;搜索调用由中转承担。被注入的 <search_results> 块确实会计入输入 token,所以相比不带 :online 的同一问题,提示词 token 账单会更高。
失败模式软失败。如果 Tavily 超时或出错,请求会在没有搜索上下文的情况下继续发往模型(你仍会得到答案,只是缺乏立足依据)。唯一的硬失败是当中转完全未配置搜索时返回 503 search_unavailable
count_tokens/v1/messages/count_tokens 会剥离该后缀,但绝不会调用 Tavily —— 计数反映的是你的原始提示词,而非增强后的版本。
多轮只有最后一轮用户回合会被查询 & 增强;更早的回合不受影响。要再次搜索,请在模型仍带 :online 的情况下发送一条新的用户消息。

何时使用 :online

中转每个请求只做一次 Tavily 调用并注入结果 —— 它不是一个具备自主性的搜索循环。模型不会像 Perplexity Sonar 或 ChatGPT 浏览工具那样,根据所见内容自行决定重新搜索。请围绕这一局限来规划:

适合不适合
时效性事实(新闻、价格、版本号、发布日期)公网上没有的私有或粘贴代码 —— 只会增加提示词噪声,而无法提供立足依据
定位某份官方文档或公告数学、推理、翻译、创意写作 —— 没有可立足的依据
任何你本来会用 Google 去核实的内容训练数据中已有的稳定知识(“什么是二叉树”)

把最后一条用户消息写成一个可独立成立的搜索查询。搜索是针对你最近一轮用户回合的字面文本进行的(上限 400 字符),所以像“那最新版本呢?”这样的对话式追问会变成毫无上下文的无用查询。在多轮对话中,当你加上 :online 时请重述主题 —— 例如“Anthropic Python SDK 的最新版本”,而非“最新那个”

对于需要多步骤综合的问题(对比分析、深度研究),请将其拆分为多轮,并在每一轮都加上 :online。模型会读取每一轮的新鲜结果;你手动引导下一个查询。注意,被注入的 <search_results> 块只发往上游 —— 它不会回传给你的客户端,也不会保留到下一个请求,所以如果后续某一轮依赖更早来源中的细节,请让模型在其可见回复中将它们总结出来。不支持一次性研究模式。

提示 搭配高推理力度(reasoning_effort: "high"),让模型真正权衡返回的来源,而不是只依赖第一条结果。被注入的指令会要求模型以 [1][2] 的形式行内引用编号来源,所以输出通常会带有此类引用 —— 不过模型并不严格受该格式约束。

错误

错误外层结构取决于你调用的是哪个端点 —— 中转会以匹配调用方 SDK 的协议返回错误,而上游错误会被原样透传。

OpenAI 路径(/v1/chat/completions/v1/responses/v1/models)—— OpenAI 外层结构:

{ "error": { "message": "...", "type": "...", "code": "..." } }

Anthropic 路径(/v1/messages/v1/messages/count_tokens)—— Anthropic 外层结构:

{ "type": "error", "error": { "type": "...", "message": "..." } }

Anthropic 外层结构采用不同的形状 —— 没有 code 字段,且判别字段 type: "error" 位于顶层(内层的 error.type 给出类别,例如 authentication_errorinvalid_request_errorpermission_errorapi_error)。Anthropic SDK 已能解析这一形状;原生 OpenAI SDK 的错误处理器则不能,所以请用 Anthropic SDK(或直接发原始 HTTP)调用 /v1/messages

两种协议下的状态码都是标准的 HTTP 状态码:

状态OpenAI code / Anthropic error.type含义
401invalid_api_key / authentication_error缺失或未知的 sk-cf-... Key。
402insufficient_balance / permission_error账户余额为负。请在控制台账单标签页充值。
403key_revoked / permission_error该 Key 已被撤销。
403account_closed / permission_error该账户未开通 API 权限:2026 年 6 月 8 日服务截止日期之后注册的账户不包含 API 服务。
400model_not_available / invalid_request_error你发送的 model 不在已验证目录中,或对该端点不正确(例如在 /v1/messages 上使用 OpenAI 模型)—— 请查看可用模型
400unsupported_background_mode / —/v1/responses 中使用 background: true;中转仅支持同步请求。仅适用于 OpenAI 响应格式。
429rate_limit_exceeded / rate_limit_error共享上游容量暂时受到限流。如有 retry-after,请遵循该值,然后使用带随机抖动的指数退避重试。
503当前没有上游账号能服务该请求 —— 通常是短暂的池级别速率限制窗口,稍作退避后重试即可。
503search_unavailable / api_error你使用了 :online,但本中转未配置联网搜索。参见联网搜索
502upstream_unreachable / api_error中转无法到达后端。请稍作退避后重试。
500server_error / api_error中转服务在联系上游之前或之后失败。仅在操作可以安全重复时重试;否则请先查看用量记录。

重试与可靠性

请限制重试次数。中转服务使用共享上游容量,生成请求不具备幂等性。

定价与账单

按量付费,以微美元为单位按 token 计费(1 微 = $0.000001 = 一美分的 1/10,000),因此不足一美分的请求也能被精确追踪。单价按档位以每 1M token 计 —— 各模型映射到哪个档位,见模型表

档位模型输入 / 1M输出 / 1M
Mini gpt-5.4-mini, claude-haiku-4-5-20251001 $0.20$1.60
Luna gpt-5.6-luna $0.30$2.40
Standardgpt-5.4, gpt-5.4-2026-03-05, gpt-5.6-terra, claude-sonnet-4-5-20250929, claude-sonnet-4-6$0.75$6.00
Premium gpt-5.5, gpt-5.6-sol $1.10$8.80
Sonnet 5 Introclaude-sonnet-5 $2.00$10.00
Ultra claude-opus-4-5-20251101, claude-opus-4-6, claude-opus-4-7, claude-opus-4-8$5.00$25.00
Fable claude-fable-5 $10.00$50.00

Fable 和 Ultra 档费率与 Anthropic 公布的标价一致。Sonnet 5 在 2026 年 8 月 31 日前采用 Anthropic 的 $2/$10 优惠价;该日期之后公布的标准价为 $3/$15。其余档位由共享订阅资源支持,因此低于上游标价。

推理 token(即在 OpenAI 中设置 reasoning_effort,或在 Claude 中使用 Anthropic 原生 thinking 字段)按模型档位单价计为输出 token。高推理强度没有额外附加费,但深度推理请求可能轻易产生无推理请求 10–50 倍的输出 token,因此费用也会相应增加。

Anthropic prompt 缓存作为单独的明细项计费:缓存写入按该档位输入单价的 1.25×,缓存读取0.10×。因此一次 haiku-4.5 缓存命中的费用为 0.20 × 0.10 = $0.02 per 1M tokens,一次 sonnet-4.5 缓存命中的费用为 0.75 × 0.10 = $0.075 per 1M tokens。每笔请求的账单记录都会单列缓存 token,控制台可查看明细。

余额随每个请求返回而实时扣减 —— 对于流式请求,结算在 [DONE] 分块落地之后运行。可在 /console#billing 查看实时余额与每请求结算。

充值 控制台支持 Stripe Checkout —— 银行卡、Link、Alipay、WeChat Pay。Credit 永不过期。

速率限制

目前没有针对单 Key 的速率限制。共享的上游容量与提供方服务端限流仍然适用;如果你触及这些限制,中转会返回 429 并带 retry-after 头。针对单 Key 的 RPM / TPM 限制已在计划中。

状态与支持

文档最后审核日期:2026 年 7 月 14 日。