API 參考
SUB&SUB 在 https://api.subnsub.com/v1 提供多供應商中轉。OpenAI 用戶端打 /v1/chat/completions;Anthropic 用戶端打 /v1/messages。同一把 sk-cf-... Key 兩邊通用 —— 在請求主體中挑選模型,中轉就會挑選對應的上游。
服務可用範圍
快速上手
對於已開通 API 的現有帳戶,你需要準備三項內容:
- Base URL:
https://api.subnsub.com/v1(OpenAI 用戶端)或https://api.subnsub.com(Anthropic 用戶端 —— SDK 會自行附加/v1/messages) - API Key:從 主控台 發行的
sk-cf-... - 模型:16 個支援的模型之一,例如
gpt-5.4-mini或claude-sonnet-5
驗證
每個請求都必須帶上 Authorization: Bearer sk-cf-... 標頭。Key 從主控台發行,並以 SHA-256 雜湊儲存 —— 一旦離開建立畫面,明文就永遠消失,所以請立即儲存。
端點
穩定的公共介面範圍見下文及機器可讀的 OpenAPI 3.1 文件。未在這裡列出的欄位可能會透傳給上游,但不會自動成為 SUB&SUB 的相容性承諾。
POST /v1/chat/completions
送出一個 chat completion 請求。請求格式與 OpenAI Chat Completions API 相同 —— OpenAI SDK 無需修改即可運作。
| 參數 | 型別 | 說明 |
|---|---|---|
| model | string | 已驗證模型 ID 之一。 |
| messages | array | 對話歷史。每一項:{role, content},其中 role ∈ system / user / assistant。 |
| stream | boolean | 若為 true,回應會以 SSE 區塊送出。見 串流。 |
| stream_options | object | 選用。中轉一律對上游強制 {include_usage: true},讓最後一個區塊帶上 token 用量區塊 —— 覆寫它不會有任何效果。 |
| max_tokens | integer | 限制 completion 長度。預設為模型的最大值。 |
| temperature | number | 0 – 2。越高 = 越隨機。 |
POST /v1/responses
OpenAI Responses API —— OpenAI 較新的請求格式(client.responses.create(...))。支援目錄中的所有模型:gpt-* 原生支援,claude-* 則透過與 chat/completions 相同的相容橋接層。計費方式相同:輸入與輸出 token 均按模型級距單價計費。
| 參數 | 型別 | 說明 |
|---|---|---|
| model | string | 任一目錄模型 ID。 |
| input | string | array | 提示詞,可以是純文字,也可以是 Responses API 定義的結構化項目清單。 |
| max_output_tokens | integer | 限制回應總長度(推理與可見輸出合計)。 |
| reasoning | object | {"effort": "..."},可用值與 reasoning_effort 相同,共五級。 |
| stream | boolean | 設為 true 時,傳回標準 Responses SSE 事件串流:response.created、response.output_text.delta、…、response.completed。 |
| background | boolean | 不支援。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
供 claude-* 模型使用的 Anthropic 原生端點 —— Anthropic SDK(anthropic-sdk-python、@anthropic-ai/sdk、claude-code)無需修改即可對此路徑運作。將你的 base URL 指向 https://api.subnsub.com,並透過 x-api-key 標頭驗證(若你的用戶端偏好,Authorization-Bearer 形式也可以)。
| 參數 | 型別 | 說明 |
|---|---|---|
| model | string | 一個 claude-* 模型 ID(見 可用模型)。在此傳入 OpenAI 模型會回傳 400 invalid_request_error。 |
| max_tokens | integer | Anthropic 要求必填 —— 限制 assistant 回覆長度。 |
| messages | array | 對話歷史,Anthropic 格式:{role, content},其中 role ∈ user / assistant。 |
| stream | boolean | 若為 true,回傳標準的 Anthropic SSE 事件序列:message_start、content_block_delta、message_delta、message_stop。 |
| thinking | object | 原樣轉送給 Anthropic。支援時請使用 {"type":"adaptive"};Fable 5 即使省略此欄位,也會始終啟用自適應思考。不存在合成的 -thinking 模型 ID。 |
| cache_control | object | 支援 prompt caching。快取寫入 token 以 1.25× 計費,快取讀取 token 以該級距輸入價的 0.10× 計費。 |
可直接執行的 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
在傳送 Anthropic 格式的提示詞前計算 token 數。請使用與 /v1/messages 相同的 x-api-key、anthropic-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
列出你實際可用的模型。中轉會對兩類上游執行健康檢查,並傳回 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。 |
可用模型
共有兩類上游:7 個 OpenAI 模型路由到共享的 ChatGPT 級帳戶,9 個 Claude 模型由 Anthropic 官方帳戶提供服務。每 token 單價取決於級距(見定價),同一把 Key 兩邊通用。
OpenAI
| 模型 ID | 家族 | 級距 | 備註 |
|---|---|---|---|
| gpt-5.4-mini | GPT-5.4 | Mini | 快速又便宜。聊天與寫程式的推薦預設。 |
| gpt-5.4 | GPT-5.4 | Standard | 完整尺寸的 GPT-5.4 —— 較慢,但推理更強。 |
| gpt-5.4-2026-03-05 | GPT-5.4 | Standard | gpt-5.4 的日期標記快照。 |
| gpt-5.5 | GPT-5.5 | Premium | 更新的旗艦。 |
| gpt-5.6-luna | GPT-5.6 | Luna | 輕量級 GPT-5.6,定位介於 Mini 與 Standard 之間。 |
| gpt-5.6-terra | GPT-5.6 | Standard | 中型 GPT-5.6,費率與 gpt-5.4 相同。 |
| gpt-5.6-sol | GPT-5.6 | Premium | 最高級 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 的標價計費 —— 不加價(見 定價)。 |
| 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 快照。 |
200、stop_reason: "refusal" 與空內容陣列。用戶端應依據 stop_reason 分支處理,不能只看 HTTP 狀態,並可改用 claude-opus-4-8 重試。透過 OpenAI 協定端點呼叫時,相同結果會表示為 finish_reason: "content_filter"(chat/completions),或 status: "incomplete" 且 incomplete_details.reason: "content_filter"(responses)。提示詞階段的拒答不會扣除餘額;已經輸出部分內容後在串流過程中拒答,則照常計費。
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 原生的 thinking 與 output_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": [ ... ]
}
'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_error、invalid_request_error、permission_error、api_error)。Anthropic SDK 已能解析這個結構;原生的 OpenAI SDK 錯誤處理器則不行,所以請用 Anthropic SDK 呼叫 /v1/messages(或直接做原始 HTTP)。
狀態碼在兩種協定間都是標準的 HTTP 代碼:
| 狀態 | OpenAI code / Anthropic error.type | 意義 |
|---|---|---|
| 401 | invalid_api_key / authentication_error | 缺少或未知的 sk-cf-... Key。 |
| 402 | insufficient_balance / permission_error | 帳戶餘額為負。請在 主控台帳單分頁 儲值。 |
| 403 | key_revoked / permission_error | 該 Key 已被撤銷。 |
| 403 | account_closed / permission_error | 此帳戶未開通 API 權限:2026 年 6 月 8 日服務截止日期之後註冊的帳戶不包含 API 服務。 |
| 400 | model_not_available / invalid_request_error | 你送出的 model 不在已驗證目錄中,或對該端點而言錯誤(例如在 /v1/messages 上用了 OpenAI 模型)—— 請查看 可用模型。 |
| 400 | unsupported_background_mode / — | 在 /v1/responses 中使用 background: true;中轉僅支援同步請求。僅適用於 OpenAI 回應格式。 |
| 429 | rate_limit_exceeded / rate_limit_error | 共享上游容量暫時受到限流。如有 retry-after,請遵循該值,然後使用帶隨機抖動的指數退避重試。 |
| 503 | — | 目前沒有任何上游帳號能服務該請求 —— 通常是短暫的池範圍速率限制時段,稍候重試即可。 |
| 503 | search_unavailable / api_error | 你用了 :online,但此中轉未設定網路搜尋。見 網路搜尋。 |
| 502 | upstream_unreachable / api_error | 中轉無法連到後端。請在短暫退避後重試。 |
| 500 | server_error / api_error | 中轉服務在聯絡上游之前或之後失敗。僅在操作可以安全重複時重試;否則請先查看用量記錄。 |
重試與可靠性
請限制重試次數。中轉服務使用共享上游容量,生成請求不具備冪等性。
- 可以重試:
429、502、503,以及明確屬於暫時性故障的500。請遵循retry-after;若無該值,則使用帶隨機抖動的指數退避(例如 1 秒、2 秒、4 秒;最多三次)。 - 不要原樣重試:
400、401、402或403。請先修正 payload、Key、餘額或存取狀態。 - 重複風險:每次成功生成都是一筆獨立計費請求。SUB&SUB 目前不會根據 idempotency key 對生成 POST 去重,因此請在應用中保留操作 ID,並避免在收到完整回應後重試。
- 串流回應:中斷的 SSE 串流無法續傳。重新連線會開始一次新的生成,並可能產生第二次費用。
定價與帳單
按量付費,以微美元(micro)按 token 計費(1 micro = $0.000001 = 一分錢的 1/10,000),以準確追蹤不到一分錢的請求。費率以每 1M tokens 計、依級距區分 —— 見 模型表 了解各模型對應到哪個級距。
| 級距 | 模型 | 輸入 / 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 |
| Standard | gpt-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 Intro | claude-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 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。每筆請求的帳單紀錄都會單列快取 token,主控台可查看明細。
餘額會在每個請求回傳時即時扣除 —— 對串流請求而言,結算會在 [DONE] 區塊落地後執行。在 /console#billing 查看你的即時餘額與每個請求的結算。
速率限制
目前沒有每把 Key 的速率限制。共享的上游容量與供應方伺服器端的節流仍會適用;若你碰上這些,中轉會回傳 429 並附帶 retry-after 標頭。每把 Key 的 RPM / TPM 限制已在規劃中。
狀態與支援
- 已登入且開通 API 的帳戶可在控制台 → 服務狀態查看供應商即時運作狀況,並在「系統通知」中查看營運公告。
- 如需帳戶、計費、隱私或安全方面的協助,請傳送電子郵件至 [email protected]。
- 回報 API 故障時,請提供 UTC 時間、介面、模型、HTTP 狀態碼及可見的 API Key 前綴。除非支援人員明確要求經過遮蔽的重現內容,否則切勿傳送完整 API Key 或提示詞內容。
- 本服務按盡力原則提供且不設 SLA。可用性與退款規則請參閱僅提供英文版的服務條款,資料處理方式請參閱隱私權政策。
文件最後審核日期:2026 年 7 月 14 日。