AI API 게이트웨이를 고르는 일은 2년 전과 같은 문제가 아니다. 2024년에는 대부분의 개발자가 OpenAI를 직접 호출하거나 로컬에 LiteLLM을 띄웠다. 이제는 가격 대시보드, 키별 크레딧 한도, 수십 개 제공업체에 걸친 모델 카탈로그를 갖춘 호스팅형 옵션들이 있다. 카테고리가 충분히 확장되어, 잘못 고르면 나중에 실제 통합 작업을 되돌려야 할 수도 있다.
이 글은 개발자 논의에서 반복해서 거론되는 네 가지 게이트웨이인 CometAPI, Portkey, LiteLLM, Cloudflare AI Gateway를 비교한다. 승자를 가리는 것이 목적이 아니라 — 상황에 따라 각기 타당하므로 — 각 도구가 실제로 무엇을 하는지 정리해 여러분의 사용 사례에 맞출 수 있도록 돕는 것이 목적이다.
Note on model names: 이 글에서 사용된 모델 식별자(예:
gpt-5.4,claude-opus-4-7)는 CometAPI 플랫폼 식별자다. 이는 OpenAI나 Anthropic의 공식 명칭이 아니며, 양사의 명명 규칙은 서로 다르다.
이 도구들이 실제로 하는 것
기능 비교에 들어가기 전에, AI API 게이트웨이가 무엇을 하는지 정확히 짚고 넘어가는 것이 도움이 된다. 최소한으로는: 애플리케이션과 하나 이상의 AI 제공업체 사이에 위치해 요청을 전달하고 응답을 되돌려준다. 그 최소 범위를 넘어서면서 게이트웨이는 크게 갈라진다.
일부 게이트웨이 — 예를 들어 Cloudflare AI Gateway — 는 주로 패스스루 레이어로서 API 키나 가격 책정에는 손대지 않고 로깅과 캐싱을 추가한다. 다른 도구인 CometAPI는 리셀러로 동작한다: 여러분이 CometAPI에 비용을 지불하면, 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 키를 제공하면서도 지출 상한을 설정할 수 있어, 공유 계정을 분배할 때 발생하는 실제 문제를 해결한다.
제공하지 않는 것: 자가 호스팅(엔터프라이즈 고객은 전용 서버를 요청할 수 있지만, 일반적인 자가 호스팅 옵션은 아니다), 게이트웨이 수준의 레이트 리미팅, 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 키를 보유하는 제3자가 없다. 제공업체 자격 증명(실제 OpenAI 키, Anthropic 키 등)은 서버 측 환경 변수로 설정하며, 클라이언트는 로컬 프록시를 향한다.
기본적으로 LiteLLM은 클라이언트가 보내는 API 키를 검증하지 않는다 — 아무 값이나 동작한다. 가상 키 관리를 활성화하면, 클라이언트는 LiteLLM이 자체 DB로 검증하는 가상 키를 전달한다. 어느 쪽이든 프록시는 OpenAI 형식의 요청을 업스트림 제공업체가 기대하는 형식으로 변환하므로, 새로운 제공업체를 추가해도 애플리케이션 코드는 바뀌지 않는다.
대신 운영 오버헤드가 따른다: 서버 실행, 확장, 업데이트는 여러분의 책임이다.
적합한 경우: 데브옵스 역량이 있는 팀, 제3자 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(자가 호스팅) | 제3자 트래픽 처리 없음 |
| 예산 0, 자체 운영에 익숙함 | LiteLLM | 오픈 소스, 플랫폼 비용 없음 |
| 이미 OpenAI를 직접 사용 중, 캐싱을 원함 | Cloudflare AI Gateway | URL만 교체, 새로운 결제 관계 없음 |
| 여러 팀을 위한 RBAC 필요 | Portkey 또는 LiteLLM | 두 도구 모두 팀/역할 관리 제공; CometAPI와 Cloudflare는 제공하지 않음 |
이 네 가지가 다루지 않는 것
이 비교는 인디 개발자 논의에서 가장 자주 등장하는 게이트웨이에 초점을 맞췄다. 시장에는 알아둘 만한 다른 옵션이 있다: Helicone은 프록시로 동작하지 않고 관측 가능성에 집중하며, OpenRouter는 오픈 웨이트와 연구 모델 라우팅에 특화되어 있고, AWS Bedrock은 엔터프라이즈 워크로드를 겨냥한 Amazon의 관리형 AI 서비스다. 위 네 가지에 맞지 않는 요구 사항이라면 이들을 다음 후보로 살펴보라.
전환하기
현재 제공업체를 직접 호출하고 있다가 게이트웨이를 고려한다면, 코드 변경은 작다. CometAPI의 경우 환경 변수를 하나 추가하고 base_url만 바꾸면 된다. Portkey는 헤더를 하나 추가하고 모델 지정 방식을 바꾼다(gpt-4o 대신 @openai/gpt-4o). Cloudflare는 제공업체 API 키를 건드리지 않고 URL만 바꾼다. LiteLLM은 먼저 로컬 서버를 띄운 다음 클라이언트를 그쪽으로 향하게 하면 된다.
더 큰 질문은 전환 방법이 아니라, 전환할 필요가 있는지다. 단일 제공업체만 호출하고, 비용 가시성 문제가 없으며, 교차 모델 라우팅이 필요 없다면, 게이트웨이는 이점 없이 복잡성만 추가한다. 반대로 여러 제공업체를 사용하고, 외주 인력에게 키를 배포하거나, 예상치 못한 청구가 반복되는 상황이라면, 통합 오버헤드는 그만한 가치가 있다.
FAQ
Can I use these gateways together?
가능하다. 어떤 팀은 민감한 워크로드에는 자가 호스팅한 LiteLLM을, 그 외에는 CometAPI를 사용한다. CometAPI 요청 앞단에 Cloudflare AI Gateway를 두어 Cloudflare의 캐싱 레이어를 얹을 수도 있다 — 다만 네트워크 홉이 하나 늘어난다.
Do these gateways store my prompts?
도구와 구성에 따라 다르다. Portkey와 CometAPI는 기본적으로 요청을 로깅하며, 보존 기간 설정이 있다. LiteLLM은 여러분이 구성한 것만 — 그리고 여러분의 인프라에 — 저장한다. Cloudflare의 로깅 동작은 AI Gateway 문서에 설명되어 있다. 민감한 콘텐츠를 게이트웨이를 통해 전송하기 전에, 호스팅 서비스의 개인정보 처리 방침을 반드시 확인하라.
What happens if the gateway goes down?
호스팅 게이트웨이(CometAPI, Portkey, Cloudflare)의 경우, 게이트웨이가 다운되면 그 경로로는 애플리케이션이 AI 제공업체에 도달할 수 없다. 로컬에서 실행하는 LiteLLM은 여러분의 서버와 동일한 가용성 특성을 가진다. 프로덕션에서 어떤 호스팅 게이트웨이를 쓰기로 결정하기 전에 SLA와, 게이트웨이 자체가 사용 불가할 때 제공업체로 직접 폴백하는 기능이 있는지 확인하라.
Is there a free way to evaluate each before committing?
있다. CometAPI와 Portkey 모두 무료 티어가 있다. LiteLLM은 오픈 소스이며 운영하는 인프라 비용만 든다. Cloudflare AI Gateway는 넉넉한 한도 내에서 무료다. 결정을 내리기 전에 동일한 테스트 프롬프트로 네 가지 모두를 시험해 볼 수 있다.
How do I pick the right model names for each gateway?
게이트웨이마다 규칙이 다르다. CometAPI는 자체 식별자를 사용한다(gpt-5.4, claude-opus-4-7). Portkey는 @provider/model-name 형식을 사용한다(@openai/gpt-4o, @anthropic/claude-3-5-sonnet). LiteLLM은 프록시 구성에 정의한 모델 이름을 사용한다. Cloudflare는 표준 제공업체 모델 이름을 그대로 전달한다. 코드를 작성하기 전에 각 게이트웨이의 문서에서 최신 모델 목록을 확인하라.
Does switching gateways affect my existing rate limits?
그렇다. OpenAI를 직접 호출하는 방식에서 제공업체 관계를 게이트웨이가 관리하는 방식(예: CometAPI)으로 옮기면, 실제 레이트 리미트는 여러분의 개인 계정이 아니라 게이트웨이가 보유한 OpenAI 계정에 의해 결정된다. 프로덕션 트래픽을 마이그레이션하기 전에 게이트웨이와 레이트 리미트 동작을 확인하라.
