LLM ゲートウェイ
データ層を備えた LLM ゲートウェイ
3 つのベース URL、1 つのキー、1 つの残高。使い慣れた SDK のままチャット・画像・動画・判定モデルを呼び出し、検索・ドキュメント・スライドも同じ残高から——プロバイダー公式価格の 1 割から。
10%
開始価格(プロバイダー公式 API 価格に対して)
5,000+
同じカタログにある API
ゲートウェイはたいてい 1 つの接続面です。ここには 3 つあります。
アカウント・キー・残高は共通ですが、答える問いが違い、ベース 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 自社の検索・オフィス・抽出・ナレッジ系ワークフロー |
1 つのキーで 3 つすべてをカバーします。チャージすると米ドルのサービス残高になり、モデル呼び出しもデータ API 呼び出しも Felo のワークフローも同じ残高から引かれます——プロバイダーごとにアカウントを分ける必要はありません。
ドキュメントを読むエンドポイントは 1 つではなく 6 つ
/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 判定プロトコル | 構造化された回答(ストリーミングなし) |
3 つのチャット接続面はネイティブ実装で、プロトコル変換層ではありません。それぞれのプロトコルでイベントを流すので、いまのパース処理はそのまま使えます。
エンドポイントはモデルの種類で選ぶ。推測しない
カタログの各モデルには 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= を付けると 1 社だけ、?exclude_video_and_decisions=true を付けるとチャットと画像だけになります。掲載は互換の保証ではありません。動画モデルはチャット要求に応答せず、その場合は model_kind_mismatch が返ります。
既定のルート、またはヘッダー 1 つでプロバイダーを指定
1 つのモデルは複数の上流チャネルから提供されることがあり、チャネルごとにプロバイダーと公表レートが異なります。ヘッダーを付けなければプラットフォームが 1 つ選び、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 は上記 6 つの生成エンドポイントすべてで有効です。データ API と Felo APIs には適用されません。そちらはリクエストで指定したプロバイダーにそのまま届きます。
1 回の呼び出しにかかる金額
モデル呼び出しは入力・出力・キャッシュのトークン単位で課金され、チャネルの割引係数が掛かります。レートは読みやすさのために 100 万トークンあたりで表示しますが、課金は現在の価格スナップショットのトークン単位の精度で行われるため、短いリクエストが 100 万トークンに切り上げられることはありません。
- キャッシュ料金は、プロトコルのレスポンスがキャッシュ利用を報告したときだけ適用されます。報告のないモデルはすべて入力レートで課金されます。
- モデルサービスが実際に実行し報告したウェブ検索は 1 回 $0.01 です。
- プロンプト長で段階が変わるモデルもあります。Claude Haiku 5.5 は 10 万トークンまでが入力 $0.10/出力 $0.50(100 万トークンあたり)、それを超えるとリクエスト全体が $0.50/$2.50 になります。
- 初回チャージは $1 から。サブスクも席料も最低利用額もありません——使わないキーにお金はかかりません。
データ API 呼び出しと Felo のワークフローも同じ残高から、それぞれの公表基準(成功したリクエスト単位、返却件数単位、実利用量)で課金されます。
レートと残高を見る似ているようでまったく違う 2 つの制限
残高不足は 402 INSUFFICIENT_CREDITS。呼びすぎは 429 RATE_LIMITED。待てば 2 つ目は解消し、1 つ目は絶対に解消しません。
| ステータス | コード | 対処 |
|---|---|---|
| 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 はそのまま返るので、両側のログが突き合わせられます。
画像と動画はバックグラウンドで仕上がる
2 つの生成エンドポイントは結果ではなく 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 カタログにも届きます——エージェント内の検索、生成したスライド、読み戻したドキュメントがすべて同じ残高から引かれ、別のベンダーを 3 社追加する必要はありません。
- Search
- PPT Task
- SuperAgent
- Web Fetch
- X Search
- Mindmap
- Landing Page Task
- LiveDoc
- YouTube Subtitling
データ API は /v1/beta の下で、Tavily、Exa、Apollo などカタログの各社にそれぞれの公表基準で課金されます。
ゲートウェイがやらないこと
- チャネル間の自動フェイルオーバーはありません。再試行はアプリ側の役割で、これは意図的です。
- カタログへの掲載は互換の保証ではありません。モデルの種類ごとに呼び出し面は 1 つです。
- モデル呼び出しにプラットフォームのレート制限は公表していませんが、上流プロバイダーの制限はそのまま適用されます。
- 残高は前払いで、返金も出金もできません。使う予定の分だけチャージしてください。
LLM ゲートウェイについてよくある 6 つの質問
LLM ゲートウェイとは何ですか?
多くのモデルプロバイダーの手前に 1 つのエンドポイントを置き、コードが十数社の SDK ではなく 1 つのベース URL、1 つのキー、1 つの残高だけを見るようにするものです。AI ゲートウェイも同じ役割で、こちらはエージェントが必要とするデータ API も同じキーで提供します。
いまの OpenAI / Anthropic SDK はそのまま使えますか?
使えます。Chat Completions と Responses は OpenAI の形、Messages はネイティブです。ベース URL は https://openapi.felo.ai/api/v1 と https://openapi.felo.ai/api——後者は 1 階層上です。その SDK が自分で /v1/messages を付けるためです。
どのモデルを呼べばいいか、どう分かりますか?
GET /api/v1/models が全種類をチャネルとレート付きで返します。動画と判定モデルには専用のリストがあります。model_kind を見て対応するエンドポイントを呼んでください。掲載はすべてのエンドポイントがそのモデルを受け入れる保証ではありません。
プロバイダーが落ちたら自動で切り替わりますか?
いいえ、意図的にそうしています。チャネルリストは選択であって再試行ポリシーではなく、送信されるのは最初の 1 つだけです。切り替えはアプリ側に置いてください。エラーも予算も、本当に欲しいフォールバックもそこでしか見えません。
料金はいくらですか?
各モデルにはプロバイダー公式価格の 1 割から始まる Felo レートがあり、固定したチャネルのレートで課金されます。前払い・呼び出し単位の課金で、初回チャージは $1 から、サブスクはありません。
画像・動画・データ API も呼べますか?
はい。1 つのキーでチャット・画像・動画・判定モデル、そして /v1/beta の背後にある 5,000+ の API カタログまで届き、すべて同じ残高から引かれます。
まず 1 回呼んでみる
キーを作成し、チャージして、いつもの SDK を 1 つのベース URL に向けてください。