LLM 게이트웨이
데이터 계층이 붙은 LLM 게이트웨이
베이스 URL 세 개, 키 하나, 잔액 하나. 쓰던 SDK 그대로 채팅·이미지·동영상·판정 모델을 호출하고, 검색·문서·슬라이드는 같은 잔액으로—공급자 공식 가격의 10분의 1부터.
10%
시작 요율, 공급자 공식 API 가격 대비
5,000+
같은 카탈로그의 API
게이트웨이는 보통 접점이 하나입니다. 여기에는 세 개가 있습니다.
계정과 키와 잔액은 공유하지만, 대답하는 질문이 다르고 베이스 URL도 다릅니다. 지금 무엇을 호출하는지 아는 것이 이 페이지의 전부입니다.
| 접점 | 베이스 URL | 용도 |
|---|---|---|
| 모델 API | openapi.felo.ai/api/v1 · openapi.felo.ai/api | 언어·이미지·동영상·판정 모델을 직접 호출 |
| 데이터 API | openapi.felo.ai/v1/beta | 지정한 외부 데이터·검색 공급자 호출 |
| Felo APIs | openapi.felo.ai/v2 | Felo 자체 검색·오피스·추출·지식 워크플로 |
키 하나로 셋 다 됩니다. 충전하면 미국 달러 서비스 잔액이 되고, 모델 호출과 데이터 API 호출과 Felo 워크플로가 모두 같은 잔액에서 빠집니다—공급자마다 계정을 따로 만들 필요가 없습니다.
문서 보기엔드포인트는 하나가 아니라 여섯 개입니다
/api/v1 아래는 모두 모델 호출이지만, 모델 종류가 어떤 엔드포인트가 응답할 수 있는지를 정합니다. 응답 형식도 각각 다릅니다.
| 엔드포인트 | 프로토콜 | 반환 |
|---|---|---|
POST /api/v1/chat/completions | OpenAI Chat Completions | 스트리밍 또는 단일 응답 |
POST /api/v1/responses | OpenAI Responses | 스트리밍 또는 단일 응답 |
POST /api/v1/messages | Anthropic Messages | 스트리밍 또는 단일 응답 |
POST /api/v1/images/generations | OpenAI 이미지 응답 | 폴링용 task_id |
POST /api/v1/videos/generations | OpenAI 동영상 응답 | 폴링용 task_id |
POST /api/v1/decisions | Felo 판정 프로토콜 | 구조화된 답변, 스트리밍 없음 |
세 개의 채팅 접점은 네이티브 구현이고 프로토콜 변환 계층이 아닙니다. 각자 자기 프로토콜로 이벤트를 흘리므로, 지금 쓰는 파서를 그대로 쓰면 됩니다.
엔드포인트는 모델 종류로 고르세요. 추측하지 마세요.
카탈로그의 모든 모델에는 model_kind가 붙어 있고, 그 종류가 어떤 엔드포인트로 호출할 수 있는지를 정합니다. 카탈로그 조회는 무료이며 로컬 카탈로그를 읽습니다.
# discover before you call — free, reads the catalog
GET /api/v1/models # every kind, with channels and rates
GET /api/v1/models/{model_id} # one model, in detail
GET /api/v1/videos/models # video_generation only
GET /api/v1/decisions/models # decisions only| model_kind | 엔드포인트 |
|---|---|
chat | Responses, Chat Completions, Messages 중 모델이 지원하는 것 |
image_generation | POST /api/v1/images/generations |
video_generation | POST /api/v1/videos/generations |
decisions | POST /api/v1/decisions |
?provider=를 붙이면 한 공급자만, ?exclude_video_and_decisions=true를 붙이면 채팅과 이미지만 봅니다. 등재가 호환 보장은 아닙니다. 동영상 모델은 채팅 요청에 응답하지 않고, 시도하면 model_kind_mismatch가 돌아옵니다.
기본 라우트, 또는 헤더 하나로 공급자 지정
한 모델을 여러 업스트림 채널이 제공할 수 있고, 채널마다 공급자와 공개 요율이 다릅니다. 헤더를 빼면 플랫폼이 하나를 고르고, X-Felo-Channel을 보내면 직접 고릅니다.
# first channel only — no automatic fallback
X-Felo-Channel: claude-cc
X-Felo-Channel: claude-cc,anthropic # ordered selection, not a retry list- 값은 공개 채널 코드의 순서 있는 목록이며 모델의
channels[].code에서 가져옵니다. 적은 순서대로 검증됩니다. - 첫 번째 채널의 공급자 그룹만 제출되고, 요금도 그 채널의 요율로 계산됩니다.
- 자동 폴백은 없습니다. 채널 목록은 선택이지 재시도 정책이 아닙니다—공급자가 죽으면 애플리케이션에서 다른 채널로 다시 보내세요.
X-Felo-Channel은 위 여섯 개 생성 엔드포인트 모두에서 동작합니다. 데이터 API와 Felo APIs에는 적용되지 않습니다. 그쪽은 요청에서 지정한 공급자로 그대로 갑니다.
호출 한 번에 실제로 드는 비용
모델 호출은 입력·출력·캐시 토큰 단위로 과금되고 채널의 할인 계수가 곱해집니다. 요율은 읽기 쉽도록 100만 토큰 기준으로 보여 주지만, 과금은 현재 가격 스냅샷의 토큰 단위 정밀도로 하므로 짧은 요청이 100만 토큰으로 올림되지 않습니다.
- 캐시 요율은 프로토콜 응답이 캐시 사용량을 보고할 때만 적용됩니다. 보고하지 않는 모델은 전부 입력 요율로 과금됩니다.
- 모델 서비스가 실제로 수행하고 보고한 웹 검색은 건당 $0.01입니다.
- 프롬프트 길이로 구간이 나뉘는 모델도 있습니다. Claude Haiku 5.5는 10만 토큰까지 입력 $0.10·출력 $0.50(100만 토큰당)이고, 그를 넘으면 요청 전체가 $0.50·$2.50이 됩니다.
- 첫 충전은 $1부터입니다. 구독도, 좌석 요금도, 최소 약정도 없습니다—쓰지 않는 키에는 비용이 들지 않습니다.
데이터 API 호출과 Felo 워크플로도 같은 잔액에서, 각자의 공개 기준(성공한 요청 단위, 반환 항목 단위, 실제 사용량)으로 과금됩니다.
요율과 잔액 보기닮았지만 전혀 다른 두 가지 한도
잔액이 없으면 402 INSUFFICIENT_CREDITS, 너무 빠르면 429 RATE_LIMITED입니다. 기다리면 두 번째는 풀리고, 첫 번째는 절대 풀리지 않습니다.
| 상태 | 코드 | 대응 |
|---|---|---|
| 401 | UNAUTHORIZED | 키를 고치거나 다시 발급 |
| 402 | INSUFFICIENT_CREDITS | 콘솔 결제에서 충전한 뒤 다시 보내기 |
| 404 | 엔드포인트에 따라 다름 | 모델·작업·라우트 ID 확인 |
| 429 | RATE_LIMITED | Retry-After만큼 기다린 뒤 재시도 |
| 5xx | CHAT_FAILED, SERVICE_UNAVAILABLE | 지수 백오프와 지터로 재시도 |
현재 강제 레이트 리밋을 문서화한 곳은 /v2/chat뿐입니다. 모델 호출도 업스트림에서 제한될 수 있고, 그때는 429로 나타납니다—숫자를 하드코딩하지 말고 X-RateLimit-*와 Retry-After를 읽으세요. 모든 응답에는 request_id가 붙고, 보낸 X-Request-Id는 그대로 돌아오므로 양쪽 로그를 맞출 수 있습니다.
이미지와 동영상은 백그라운드에서 끝납니다
두 생성 엔드포인트는 결과 대신 task_id를 돌려줍니다. 제출하고, 폴링하고, 받아오세요—작업이 만들어진 뒤의 실패는 대부분 HTTP 오류가 아니라 200에 종료 상태로 담겨 옵니다.
# submit, then poll the task
POST /api/v1/images/generations → task_id
GET /api/v1/images/generations/{id} → status, result
POST /api/v1/videos/generations → task_id
GET /api/v1/videos/generations/{id} → status, result결과보다 상태를 먼저 보세요. failed와 interrupted도 답이고, 이유는 error.message에 있습니다. 제출 시점에 402가 났다면 작업은 만들어지지 않았습니다. SuperAgent는 다릅니다—stream_key를 돌려주고 SSE로 이벤트를 밀어 주므로 폴링할 것이 없습니다.
베이스 URL만 바꾸고 클라이언트는 그대로
베이스 URL을 이쪽으로 돌리면 두 SDK 모두 수정 없이 동작합니다. npx feloapi-cli setup이 Claude Code와 Codex에 같은 설정을 써 줍니다.
# OpenAI SDK
base_url = "https://openapi.felo.ai/api/v1"
# Anthropic SDK — one level up; the SDK appends /v1/messages
base_url = "https://openapi.felo.ai/api"
# pin a provider (optional)
default_headers = {"X-Felo-Channel": "claude-cc"}모델 ID는 공급자마다 같지 않습니다. 베이스 URL을 바꾸기 전에 카탈로그에서 모델을 고르세요. 그러지 않으면 첫 호출이 404입니다.
게이트웨이가 보통 넘겨주는 나머지 절반
LLM 게이트웨이는 모델 호출을 중계합니다. 여기서는 같은 키로 5,000+ 규모의 API 카탈로그까지 닿습니다—에이전트 안의 검색, 그것이 만든 슬라이드, 다시 읽어 들인 문서가 모두 같은 잔액에서 빠지고, 벤더 세 곳을 더 붙일 필요가 없습니다.
- Search
- PPT Task
- SuperAgent
- Web Fetch
- X Search
- Mindmap
- Landing Page Task
- LiveDoc
- YouTube Subtitling
데이터 API는 /v1/beta 아래에서 Tavily, Exa, Apollo 등 카탈로그의 각 공급자에 각자의 공개 기준으로 과금됩니다.
게이트웨이가 하지 않는 일
- 채널 간 자동 폴백은 없습니다. 재시도는 애플리케이션의 몫이고, 이는 의도된 설계입니다.
- 카탈로그 등재는 호환 보장이 아닙니다. 모델 종류마다 호출 접점은 하나입니다.
- 모델 호출에 플랫폼 레이트 리밋은 공개되어 있지 않지만, 업스트림 공급자의 한도는 그대로 적용됩니다.
- 잔액은 선불이고 환불·출금이 되지 않습니다. 쓸 만큼만 충전하세요.
LLM 게이트웨이에 대해 자주 받는 여섯 가지 질문
LLM 게이트웨이란 무엇인가요?
여러 모델 공급자 앞에 엔드포인트 하나를 두어, 코드가 열몇 개의 벤더 SDK 대신 베이스 URL 하나, 키 하나, 잔액 하나만 보게 만드는 것입니다. AI 게이트웨이도 같은 역할이고, 이쪽은 에이전트에 필요한 데이터 API까지 같은 키로 제공합니다.
지금 쓰는 OpenAI·Anthropic SDK를 그대로 쓸 수 있나요?
됩니다. Chat Completions와 Responses는 OpenAI 형태이고 Messages는 네이티브입니다. 베이스 URL은 https://openapi.felo.ai/api/v1과 https://openapi.felo.ai/api—후자는 한 단계 위인데, 그 SDK가 /v1/messages를 스스로 붙이기 때문입니다.
어떤 모델을 호출해야 하는지 어떻게 아나요?
GET /api/v1/models가 모든 종류를 채널·요율과 함께 보여 줍니다. 동영상과 판정 모델은 전용 목록이 따로 있습니다. model_kind를 보고 맞는 엔드포인트를 호출하세요. 등재가 모든 엔드포인트가 그 모델을 받는다는 뜻은 아닙니다.
공급자가 죽으면 자동으로 전환되나요?
아니요, 의도한 것입니다. 채널 목록은 선택이지 재시도 정책이 아니며 첫 번째만 제출됩니다. 전환은 애플리케이션에 두세요. 오류도 예산도, 정말 원하는 폴백도 거기서만 보입니다.
비용은 얼마인가요?
모든 모델에 공급자 공식 가격의 10분의 1부터 시작하는 Felo 요율이 붙고, 고정한 채널의 요율로 과금됩니다. 선불, 호출 단위 과금, 첫 충전 $1부터, 구독 없음.
이미지·동영상·데이터 API도 호출할 수 있나요?
됩니다. 키 하나로 채팅·이미지·동영상·판정 모델, 그리고 /v1/beta 뒤의 5,000+ API 카탈로그까지 닿고 모두 같은 잔액에서 빠집니다.
호출 한 번으로 확인하세요
키를 만들고 충전한 뒤, 쓰던 SDK를 베이스 URL 하나로 돌리면 됩니다.