SUB&SUB · 文件

API 參考

SUB&SUB 在 https://api.subnsub.com/v1 提供多供應商中轉。OpenAI 用戶端打 /v1/chat/completions;Anthropic 用戶端打 /v1/messages。同一把 sk-cf-... Key 兩邊通用 —— 在請求主體中挑選模型,中轉就會挑選對應的上游。

快速上手

你需要三樣東西:

  1. Base URLhttps://api.subnsub.com/v1(OpenAI 用戶端)或 https://api.subnsub.com(Anthropic 用戶端 —— SDK 會自行附加 /v1/messages
  2. API Key:從 主控台 發行的 sk-cf-...
  3. 模型21 個已驗證模型 之一 —— 例如 gpt-5.4-miniclaude-haiku-4.5

驗證

每個請求都必須帶上 Authorization: Bearer sk-cf-... 標頭。Key 從主控台發行,並以 SHA-256 雜湊儲存 —— 一旦離開建立畫面,明文就永遠消失,所以請立即儲存。

提示 請為每個整合(聊天機器人、IDE 外掛、批次工作)各自產生一把 Key。在主控台撤銷外洩的 Key 會在數秒內生效。

端點

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限制 completion 長度。預設為模型的最大值。
temperaturenumber0 – 2。越高 = 越隨機。

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 要求必填 —— 限制 assistant 回覆長度。
messagesarray對話歷史,Anthropic 格式:{role, content},其中 roleuser / assistant
streamboolean若為 true,回傳標準的 Anthropic SSE 事件序列:message_startcontent_block_deltamessage_deltamessage_stop
thinkingobject原樣轉發。搭配 -thinking 模型變體以啟用延伸思考。
cache_controlobject支援 prompt caching。快取寫入 token 以 1.25× 計費,快取讀取 token 以該級距輸入價的 0.10× 計費。
注意 每個 Claude 請求都會對上游帶上約 4100 個 token 的 Kiro 系統提示 —— 這些會以該模型級距費率作為一般輸入 token 計費。原本便宜的短提示仍會產生這個下限費用。

GET /v1/models

GET/v1/models

列出你實際可以呼叫的模型。中轉會合併 sub2api 的 OpenAI 與 Anthropic 目錄,並篩選至我們已對目前帳號池做過端對端測試的 21 個 —— 在路由時 503 的幽靈 ID、或首個 token 就上游 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-4.5", "type": "model", ... },
    { "id": "claude-haiku-4.5",  "type": "model", ... },
    ...
  ]
}

可用模型

兩個上游家族。7 個 OpenAI 模型路由到共享的 ChatGPT 級帳號;14 個 Claude 模型透過 Kiro 反向代理路由到 AWS CodeWhisperer。每 token 費率取決於級距(見 定價)—— 同一把 Key 兩邊通用。

OpenAI

模型 ID家族級距備註
gpt-5.4-mini GPT-5.4Mini 快速又便宜。聊天與寫程式的推薦預設。
gpt-5.3-codex Codex Mini 為寫程式調校的 5.3。與 mini 同價。
gpt-5.2 GPT-5.2Standard穩定版 5.2。
gpt-5.2-chat-latestGPT-5.2Standard自動追蹤最新的 5.2 chat 調校(目前對應到上游的 gpt-5.2)。
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 更新的旗艦。

Anthropic

模型 ID家族級距備註
claude-haiku-4.5 Haiku 4.5 Mini 最小的 Claude —— 與 gpt-5.4-mini 同樣的每 token 費率。
claude-haiku-4.5-thinking Haiku 4.5 Mini haiku-4.5 的延伸思考變體。搭配 thinking 請求欄位。
claude-sonnet-4.5 Sonnet 4.5 Standard中階 Claude —— 與 gpt-5.4 同樣的每 token 費率。
claude-sonnet-4.5-thinking Sonnet 4.5 Standardsonnet-4.5 的延伸思考變體。
claude-sonnet-4.6 Sonnet 4.6 Standard更新的 Sonnet 調校 —— Standard 級距,與 sonnet-4.5 同費率。
claude-sonnet-4.6-thinking Sonnet 4.6 Standardsonnet-4.6 的延伸思考變體。
claude-opus-4.5 Opus 4.5 Ultra 前沿 Claude。以 Anthropic 的標價計費 —— 不加價(見 定價)。
claude-opus-4.5-thinking Opus 4.5 Ultra opus-4.5 的延伸思考變體(自適應思考)。
claude-opus-4.6 Opus 4.6 Ultra 更新的 Opus 調校。
claude-opus-4.6-thinking Opus 4.6 Ultra opus-4.6 的延伸思考變體。
claude-opus-4.7 Opus 4.7 Ultra 前一個 Opus 快照。
claude-opus-4.7-thinking Opus 4.7 Ultra opus-4.7 的延伸思考變體。
claude-opus-4.8 Opus 4.8 Ultra 最新的 Opus 快照。
claude-opus-4.8-thinking Opus 4.8 Ultra opus-4.8 的延伸思考變體。
注意 每個 Claude 請求都會帶上約 4100 個 token 的 Kiro 系統提示作為輸入 —— 已計入你的 token 帳單。支援 Anthropic prompt caching:快取寫入以該級距輸入價的 1.25× 計費,讀取以 0.10× 計費(見 定價)。
不可用 Pro 變體(gpt-5.2-progpt-5.2-pro-2025-12-11)、gpt-4ogpt-4o-minigpt-5gpt-5-mini、image / audio / realtime 變體、claude-haiku-4-6,以及帶日期的上游 ID(例如 claude-sonnet-4-5-20250929)。呼叫它們會回傳 400 model_not_available。Pro 模型不在菜單上,因為池中底層的社群級帳號會在寥寥幾次請求內耗盡它們微小的配額。

推理強度

上面每個 OpenAI 模型都是推理模型 —— 後端在輸出可見內容之前,可以花費較多或較少的「思考」token。在 OpenAI /v1/chat/completions 請求主體上設定 reasoning_effort 以控制預算。對 Claude 而言,請使用 Anthropic 原生的 thinking 請求欄位(或挑選一個 -thinking 模型變體)—— 見 /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]

在端點所支援的任何模型 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 呼叫 /v1/messages(或直接做原始 HTTP)。

狀態碼在兩種協定間都是標準的 HTTP 代碼:

狀態OpenAI code / Anthropic error.type意義
401invalid_api_key / authentication_error缺少或未知的 sk-cf-... Key。
402insufficient_balance / permission_error帳戶餘額為負。請在 主控台帳單分頁 儲值。
403key_revoked / permission_error該 Key 已被撤銷。
400model_not_available / invalid_request_error你送出的 model 不在已驗證目錄中,或對該端點而言錯誤(例如在 /v1/messages 上用了 OpenAI 模型)—— 請查看 可用模型
503目前沒有任何上游帳號能服務該請求 —— 通常是池範圍的速率限制時段,而非設定問題。
503search_unavailable / api_error你用了 :online,但此中轉未設定網路搜尋。見 網路搜尋
502upstream_unreachable / api_error中轉無法連到後端。請在短暫退避後重試。

定價與帳單

按量付費,以微美元(micro)按 token 計費(1 micro = $0.000001 = 一分錢的 1/10,000),以準確追蹤不到一分錢的請求。費率以每 1M tokens 計、依級距區分 —— 見 模型表 了解各模型對應到哪個級距。

級距模型輸入 / 1M輸出 / 1M
Mini gpt-5.4-mini, gpt-5.3-codex, claude-haiku-4.5, claude-haiku-4.5-thinking $0.20$1.60
Standardgpt-5.2, gpt-5.2-chat-latest, gpt-5.4, gpt-5.4-2026-03-05, claude-sonnet-4.5, claude-sonnet-4.5-thinking, claude-sonnet-4.6, claude-sonnet-4.6-thinking$0.75$6.00
Premium gpt-5.5 $1.10$8.80
Ultra claude-opus-4.5, claude-opus-4.5-thinking, claude-opus-4.6, claude-opus-4.6-thinking, claude-opus-4.7, claude-opus-4.7-thinking, claude-opus-4.8, claude-opus-4.8-thinking$5.00$25.00

Ultra 級距的費率與 Anthropic 公布的 Opus 標價一致 —— 直接直通,不加價。其他級距得益於背後的池化訂閱,跑在低於其上游費率的水準。

推理 token(當你在 OpenAI 上設定 reasoning_effort,或使用 Claude 的 -thinking 變體時)以該模型級距費率算作輸出 token —— 高強度沒有單獨的附加費,但一個深度思考的請求很容易產出比零強度多 10–50× 的輸出 token,所以美元帳單會隨之放大。

Anthropic prompt caching 以獨立明細計費:快取寫入為該級距輸入價的 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。快取欄位會記錄在每一筆結算列上,方便主控台呈現明細。

餘額會在每個請求回傳時即時扣除 —— 對串流請求而言,結算會在 [DONE] 區塊落地後執行。在 /console#billing 查看你的即時餘額與每個請求的結算。

儲值 主控台支援 Stripe Checkout —— 信用卡、Link、Alipay、WeChat Pay(視 Stripe 帳戶上啟用了哪些而定)。Credit 永不過期。

速率限制

目前沒有每把 Key 的速率限制。上游帳號池的並行數與 OpenAI 伺服器端的節流仍會適用;若你碰上這些,中轉會回傳 429 並附帶 retry-after 標頭。每把 Key 的 RPM / TPM 限制會在 MVP 之後上線。