選擇 AI API 閘道器已經不是兩年前的問題了。2024 年,多數開發者要嘛直接呼叫 OpenAI,要嘛在本機啟動 LiteLLM。現在已有託管選項,提供定價儀表板、按金鑰的額度上限,以及橫跨數十家供應商的模型目錄。這個類別擴張到一個程度:選錯就意味著日後得回頭拆改真正的整合工作。
本文比較在開發者討論中反覆出現的四個閘道器:CometAPI、Portkey、LiteLLM 與 Cloudflare AI Gateway。目的不是選出勝負——每個在不同情境下各有其用——而是把各自實際提供的功能攤開來,讓你能依需求對號入座。
關於模型名稱的說明: 本文所用的模型識別符(如
gpt-5.4、claude-opus-4-7)為 CometAPI 平台識別符,並非 OpenAI 或 Anthropic 的官方名稱;兩者各自的命名慣例不同。
這些工具實際在做什麼
在比較功能之前,先精確定義 AI API 閘道器的角色會有幫助。至少,它位於你的應用與一個或多個 AI 供應商之間,轉發請求並回傳回應。除此之外,各家閘道器差異甚大。
有些閘道器——例如 Cloudflare AI Gateway——主要是透明轉接層,加上日誌與快取,不涉及你的 API 金鑰或計費。另一些如 CometAPI 則是轉售模式:你付費給它們,它們再支付底層供應商,兩者之間的價差是其價值主張的一部分。LiteLLM 又不同——它是你自行運行的軟體,而非託管服務。
在評估具體功能前,搞清楚這些區別很重要。
功能比較
下表根據截至 2026 年 5 月的各產品官方文件或公開儀表板資訊彙整。以破折號(—)標記的功能在撰文時未能於官方來源確認。
| 功能 | CometAPI | Portkey | LiteLLM | Cloudflare AI Gateway |
|---|---|---|---|---|
| 部署方式 | 託管(SaaS) | 託管 + 可自我託管 | 自我託管(開源) | 託管(Cloudflare 邊緣) |
| 模型目錄 | 橫跨多家供應商的 500+ 個模型 | 透過統一 API 的 1,600+ 個 LLM | 取決於你的設定 | OpenAI、Anthropic、Workers AI |
| 計費模式 | 轉售(向 CometAPI 付費) | 轉接 + 平台費 | 僅基礎設施成本 | 轉接(提供免費層) |
| 相容 OpenAI 的 API | 是(api.cometapi.com/v1) | 是(api.portkey.ai/v1) | 是(本機或遠端) | 是(透過閘道 URL) |
| 按金鑰額度上限 | 是(儀表板) | 是 | 是(透過設定) | — |
| 基於群組的價格係數 | 是(預設 0.8x,內部 0.1x) | — | — | — |
| 請求日誌 | 是(4 種日誌類型) | 是 | 是 | 是 |
| 成功率監控 | 是(30 天運行狀態視圖) | 是 | 是 | 是 |
| 免費方案 | 是(新帳戶) | 是 | 開源(基礎設施成本) | 是 |
| 可自我託管 | 否(企業版:可申請專用伺服器) | 是 | 是(核心用例) | 否 |
來源:CometAPI 儀表板、Portkey 首頁、LiteLLM GitHub、Cloudflare AI Gateway 文件
連線到各個閘道器
這四個閘道器都提供與 OpenAI 相容的端點,意味著可使用相同的客戶端結構——你只需更改 base_url、憑證,Portkey 的情況下還要更改指定模型的方式。
Python
import osfrom openai import OpenAIdef require_env(name: str) -> str: """Raise a clear error if a required environment variable is missing.""" val = os.environ.get(name) if not val: raise ValueError(f"Missing required environment variable: {name}") return val# ── CometAPI ────────────────────────────────────────────────────────────────# Hosted reseller with 500+ models. Use CometAPI model identifiers (e.g. "gpt-5.4").cometapi_client = OpenAI( base_url="https://api.cometapi.com/v1", api_key=require_env("COMETAPI_KEY"),)# ── Portkey ─────────────────────────────────────────────────────────────────# Hosted gateway with observability and 1,600+ LLMs.# Route to a provider by prefixing the model name: "@openai/gpt-4o", "@anthropic/claude-3-5-sonnet", etc.# x-portkey-api-key is required; it authenticates requests to Portkey's gateway.portkey_client = OpenAI( base_url="https://api.portkey.ai/v1", api_key=require_env("PORTKEY_API_KEY"), default_headers={ "x-portkey-api-key": require_env("PORTKEY_API_KEY"), },)# ── LiteLLM ──────────────────────────────────────────────────────────────────# Self-hosted proxy. Provider credentials (OPENAI_API_KEY etc.) are set server-side.# By default the proxy does not validate the client API key — "anything" works.# If you have enabled virtual keys on your LiteLLM instance, pass a virtual key instead.litellm_client = OpenAI( base_url=os.environ.get("LITELLM_BASE_URL", "http://localhost:4000"), api_key=os.environ.get("LITELLM_API_KEY", "anything"),)# ── Cloudflare AI Gateway ───────────────────────────────────────────────────# URL-based pass-through. Keep your real provider API key — Cloudflare does not replace it.cf_account_id = require_env("CF_ACCOUNT_ID")cf_gateway_id = require_env("CF_GATEWAY_ID")cloudflare_client = OpenAI( base_url=( f"https://gateway.ai.cloudflare.com/v1" f"/{cf_account_id}/{cf_gateway_id}/openai" ), api_key=require_env("OPENAI_API_KEY"),)def ask(client: OpenAI, model: str, question: str) -> str: """ Minimal wrapper showing the common call pattern across all four gateways. Model format varies by gateway: CometAPI: "gpt-5.4", "claude-opus-4-7", etc. (CometAPI identifiers) Portkey: "@openai/gpt-4o", "@anthropic/claude-3-5-sonnet", etc. LiteLLM: whatever model names you configured in your proxy Cloudflare: standard OpenAI model names, e.g. "gpt-4o" This function does not handle finish_reason, tool_calls, or provider errors. For production error handling, see: How to Debug Failed AI API Generations. """ response = client.chat.completions.create( model=model, messages=[{"role": "user", "content": question}], ) return response.choices[0].message.content or ""
Node.js
import OpenAI from "openai";function requireEnv(name) { const val = process.env[name]; if (!val) throw new Error(`Missing required environment variable: ${name}`); return val;}// ── CometAPI ────────────────────────────────────────────────────────────────const cometClient = new OpenAI({ baseURL: "https://api.cometapi.com/v1", apiKey: requireEnv("COMETAPI_KEY"),});// ── Portkey ─────────────────────────────────────────────────────────────────// Route to a provider by prefixing the model: "@openai/gpt-4o", "@anthropic/claude-3-5-sonnet"const portkeyClient = new OpenAI({ baseURL: "https://api.portkey.ai/v1", apiKey: requireEnv("PORTKEY_API_KEY"), defaultHeaders: { "x-portkey-api-key": requireEnv("PORTKEY_API_KEY"), },});// ── LiteLLM ──────────────────────────────────────────────────────────────────// Self-hosted. Default mode accepts any API key value.// Set LITELLM_BASE_URL if your server runs on a different host or port.const litellmClient = new OpenAI({ baseURL: process.env.LITELLM_BASE_URL ?? "http://localhost:4000", apiKey: process.env.LITELLM_API_KEY ?? "anything",});// ── Cloudflare AI Gateway ───────────────────────────────────────────────────const cfClient = new OpenAI({ baseURL: `https://gateway.ai.cloudflare.com/v1/${requireEnv("CF_ACCOUNT_ID")}/${requireEnv("CF_GATEWAY_ID")}/openai`, apiKey: requireEnv("OPENAI_API_KEY"),});/** * Minimal wrapper showing the common call pattern. * Model format varies by gateway — see Python example above for details. * Does not handle finish_reason or error recovery; add those for production use. */async function ask(client, model, question) { const response = await client.chat.completions.create({ model, messages: [{ role: "user", content: question }], }); return response.choices[0].message.content ?? "";}
四者的連線模式相同。真正的差異體現在其他地方:你能觀察什麼、能控制什麼、以及當事情出錯時會發生什麼。
各工具的實際擅長點
CometAPI
CometAPI 的主要提供是託管的模型目錄,包含 500+ 個模型端點,除文字模型外也涵蓋影像與影片生成。其定價採用基於群組的係數機制——預設群組對 CometAPI 的基礎費率套用 0.8 倍;你也可以為內部使用(0.1 倍)與付費客戶設定不同的係數群組,讓你不用管理多個帳戶也能實作分級產品。
儀表板提供四種類型的日誌(一般 API 呼叫、影像生成、影片生成、Midjourney)、30 天運行狀態視圖,以及按金鑰的額度上限。額度上限讓你可以把 API 金鑰發給客戶或外包夥伴,同時設定硬性的支出上限,解決在共用帳戶情境下分發存取權的真實痛點。
CometAPI 未提供的項目:自我託管(企業客戶可申請專用伺服器,但這不屬於標準的自我託管選項)、閘道層級的速率限制、以及 SSO。
最適用:獨立開發者與小型團隊,想用一把 API 金鑰在多個模型間路由——包含影像與影片——並以單一帳單關係管理,同時需要按金鑰的預算控管。
Portkey
Portkey 是以可觀測性為核心的託管閘道。它透過統一 API 提供對 1,600+ 個 LLM 的存取,路由方式是為模型名稱加上供應商前綴(@openai/gpt-4o、@anthropic/claude-3-5-sonnet)。這表示你不必為每個供應商準備不同的客戶端設定——一個 Portkey 客戶端就能處理全部,你只需切換模型字串。
除了路由之外,Portkey 還提供請求追蹤、提示詞版本管理,以及可在儀表板而非程式碼中設定的回退路由。其可自我託管選項代表若有合規需求,你可以在自家基礎設施上運行 Portkey。
Portkey 開源閘道的 GitHub 倉庫維護活躍——請直接查看當前的星標數,勿依賴此處引用的任何數字,因其變動頻繁。
最適用:需要審計線索、多供應商路由且只用單一客戶端設定,或希望在開發者之間管控 API 金鑰曝露的團隊。
LiteLLM
LiteLLM 是一個 Python 套件與代理伺服器,而非託管服務;它由你自行運行。這個區別很關鍵:沒有第三方處理你的請求或保管你的 API 金鑰。供應商憑證(你的實際 OpenAI 金鑰、Anthropic 金鑰等)以伺服器端環境變數設定;客戶端只需指向本地代理。
預設情況下,LiteLLM 不會驗證客戶端傳來的 API 金鑰——任何值都可通過。若你啟用虛擬金鑰管理,客戶端需傳遞 LiteLLM 以其自身資料庫驗證的虛擬金鑰。無論哪種方式,代理會將 OpenAI 風格的請求轉換為上游供應商所需格式,因此當你新增供應商時,應用程式碼無需改動。
相對代價是營運開銷:你需要負責運行、擴展與更新伺服器。
最適用:具備 DevOps 能力的團隊、有合規限制而不得使用第三方 API 代理的組織,或希望在不將請求內容交給 SaaS 廠商的情況下實現跨供應商路由的人。
Cloudflare AI Gateway
Cloudflare AI Gateway 在結構上與其他三者不同。你不需要更換 API 金鑰,也不向 Cloudflare 支付模型使用費;你只需把供應商的 base URL 換成由 Cloudflare 管理的 URL,以在邊緣增加日誌、快取與速率限制。
由於 Cloudflare 位於你的應用與供應商之間,它可以對相同請求進行快取——當你的應用反覆發送相同提示時很實用。免費層足以覆蓋大多數獨立開發者用例。其限制在於範圍:Cloudflare 不會聚合多家供應商的模型,你仍需為每家供應商維持獨立帳戶與金鑰。
最適用:已在使用 Cloudflare 基礎設施的開發者,或希望在既有供應商帳戶之上加入快取與日誌,而不新增計費關係或變更 API 金鑰的人。
情境對應
| 情境 | 建議工具 | 理由 |
|---|---|---|
| 獨立應用,想用一把 API 金鑰嘗試 10+ 個模型 | CometAPI | 目錄廣、設定簡單、按金鑰額度上限 |
| 需要在同一整合中同時支援影像與影片生成 | CometAPI | 文字、影像、影片模型的統一端點 |
| 5 人團隊,需追蹤誰在用哪些模型 | Portkey | 請求追蹤、團隊管理 |
| 以單一客戶端設定路由到 1,600+ 個 LLM | Portkey | @provider/model 路由,無需逐一設定供應商 |
| 想在不改程式碼的情況下做跨供應商回退路由 | Portkey | 在儀表板中宣告式設定回退 |
| 企業需要資料在地/資料駐留要求 | LiteLLM(自我託管) | 無第三方處理流量 |
| 預算為零,且能接受自行管理 | LiteLLM | 開源,無平台成本 |
| 已直接使用 OpenAI,想加快取 | Cloudflare AI Gateway | 只需更換 URL,無新增計費關係 |
| 需要多團隊的 RBAC | Portkey 或 LiteLLM | 兩者皆有團隊/角色管理;CometAPI 與 Cloudflare 無 |
這四者不涵蓋的範圍
本比較聚焦於獨立開發者討論中最常出現的閘道器。市場上還有其他值得了解的選項:Helicone 聚焦可觀測性而不充當代理,OpenRouter 專長於路由到開源權重與研究型模型,AWS Bedrock 則是 Amazon 面向企業工作負載的託管 AI 服務。若你的需求不符合上述四者,這些是下一步可考慮的方向。
進行切換
如果你目前直接呼叫供應商,且考慮改用閘道,程式碼改動很小。對 CometAPI,你新增一個環境變數並改 base_url;對 Portkey,你新增一個標頭並改變指定模型的方式(使用 @openai/gpt-4o 而非 gpt-4o);對 Cloudflare,你只需更換 URL,無需動到供應商的 API 金鑰;對 LiteLLM,先啟動本地伺服器,再讓客戶端指向它。
更大的問題不在於怎麼換,而在於是否需要換。如果你只呼叫單一供應商、沒有成本可視性問題、也不需要跨模型路由,那麼引入閘道只會增加複雜度而無實益。反之,若你同時使用多家供應商、需將金鑰分發給外包人員,或經常遭遇意外帳單,則這點整合成本是值得的。
常見問題
我可以同時使用這些閘道嗎?
可以。有些團隊對敏感工作負載採用自我託管的 LiteLLM,其餘流量使用 CometAPI。若你想在上層加上 Cloudflare 的快取層,Cloudflare AI Gateway 也可以置於 CometAPI 請求之前——不過這會多一跳網路轉發。
這些閘道會儲存我的提示詞嗎?
視工具與你的設定而定。Portkey 與 CometAPI 預設會記錄請求,兩者皆提供保留設定。LiteLLM 只會在你的自家基礎設施上儲存你設定要儲存的內容。Cloudflare 的記錄行為可見其 AI Gateway 文件。將敏感內容透過任何託管服務傳送前,請先閱讀其隱私條款。
若閘道當機會怎樣?
對於託管式閘道(CometAPI、Portkey、Cloudflare),閘道停機代表你的應用無法透過該路徑觸達 AI 供應商。本地運行的 LiteLLM 與你的自家伺服器有相同的可用性特徵。將任何託管閘道用於生產環境前,請檢查其 SLA,以及當閘道本身不可用時是否提供直連供應商的回退機制。
在承諾使用前,有免費的方式評估嗎?
可以。CometAPI 與 Portkey 皆提供免費層。LiteLLM 為開源,成本僅在你運行它的基礎設施上。Cloudflare AI Gateway 在寬鬆的限制內免費。你可以用相同的測試提示詞試跑這四者,再做決定。
我該如何為各閘道選對模型名稱?
每個閘道都有自己的慣例。CometAPI 使用其自有識別符(gpt-5.4、claude-opus-4-7)。Portkey 採用 @provider/model-name 格式(@openai/gpt-4o、@anthropic/claude-3-5-sonnet)。LiteLLM 使用你在代理設定中定義的模型名稱。Cloudflare 會原樣傳遞標準的供應商模型名稱。撰寫程式前請查閱各閘道文件以取得最新模型清單。
切換閘道會影響我現有的速率限制嗎?
會。如果你從直接呼叫 OpenAI 轉為使用由閘道代管供應商關係的服務(如 CometAPI),實際速率限制將由該閘道與 OpenAI 的帳戶關係決定,而非你的個人帳戶。在遷移生產流量前,請先與閘道確認其速率限制行為。
