0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude/GPT/GeminiのAPI費用を一元可視化するLLM Gatewayを作った

0
Last updated at Posted at 2026-04-27

はじめに

LLMのAPIを複数使っていると、こんな状況になりませんか?

  • Anthropicのダッシュボード、OpenAIのUsage画面、Google CloudのBillingを別々に開く
  • 今月どのモデルにいくら使ったのか、横断して集計できない
  • チームで複数プロジェクトが動いていると、費用の帰属がさらに複雑になる

ひとつのプロダクトで複数LLMプロバイダを使う構成が当たり前になった今、費用管理が完全に手作業に頼っているケースが多いと感じています。

この問題を解決するために、MAGI for DevsというLLM Gatewayサービスを作りました。Claude / GPT-4o / Gemini のAPIを統一されたエンドポイントでプロキシし、プロバイダ横断でコストを自動集計するツールです。

本記事では実装の要点と、コスト可視化の仕組みを技術的に解説します。


なぜLLM Gatewayが必要なのか

LLMのコスト管理には3つの課題があります。

1. プロバイダごとにダッシュボードが分散している

Anthropic、OpenAI、Google それぞれが独自の課金ダッシュボードを持っています。複数プロバイダをまたいで「今月のLLM総費用」を把握するには手動集計しかありません。

2. モデルごとの費用感が把握しづらい

claude-3-5-sonnet と claude-3-haiku では1トークンあたりのコストが大きく異なります。「同じClaudeでも、どのモデルへの支出が多いか」を可視化するのは意外に難しい。

3. プロジェクト・チーム別の費用帰属ができない

社内で複数のプロダクトチームがLLMを使うとき、どのプロジェクトにいくら費用がかかったかを追うのは手作業では限界があります。

LLM Gatewayを挟むことで、すべてのAPIリクエストが一箇所を通るようになります。プロキシとして動作しながら、同時にリクエスト数・トークン数・推定コストをSupabaseに記録していく設計です。


システム構成

アプリ → MAGI Gateway(FastAPI)→ 各LLMプロバイダAPI
                ↓
           Supabase(日次集計テーブル)
                ↓
           MAGI Console(Next.js 15 ダッシュボード)

スタック

コンポーネント 技術 ホスティング
Gateway FastAPI(Python 3.12) Railway
ダッシュボード Next.js 15 + TypeScript + Tailwind Vercel
データベース Supabase(PostgreSQL) Supabase Cloud
UI shadcn/ui

コスト集計の仕組み

データモデル

コストデータは日次で集計してSupabaseに保存します。テーブルの主なカラムは次のとおりです。

# 1レコードのイメージ
{
    "org_id": "org-your-org",
    "date": "2026-04-26",
    "provider": "anthropic",        # or "openai", "google"
    "model": "claude-3-5-sonnet-20241022",
    "total_requests": 120,
    "total_input_tokens": 45000,
    "total_output_tokens": 18000,
    "total_cost_usd": 0.87,
}

日次集計にした理由は3つです。

  1. クエリが速い:トランザクションログをそのまま保持するのではなく、日次で集約済みのデータを読むので、30日分のサマリーも一瞬で返せる
  2. ストレージコストが小さい:モデル数×日数のレコード数に収まる
  3. バックフィルが容易:過去データの修正・再集計がやりやすい

コスト計算

各プロバイダのトークン単価は定数テーブルで管理しています。リクエスト時に input_tokens × input_price + output_tokens × output_price をUSDで計算し、ダッシュボードでは日本円に換算して表示します(リアルタイムレートを使用)。


APIエンドポイント

日次コスト取得

GET /v1/costs/daily?org_id={org_id}
Authorization: Bearer magi_xxxxxxxxxx

指定した組織の日次コストデータを返します。

[
  {
    "org_id": "org-abc",
    "date": "2026-04-26",
    "provider": "anthropic",
    "model": "claude-3-5-sonnet-20241022",
    "total_requests": 120,
    "total_input_tokens": 45000,
    "total_output_tokens": 18000,
    "total_cost_usd": 0.87
  },
  {
    "org_id": "org-abc",
    "date": "2026-04-26",
    "provider": "openai",
    "model": "gpt-4o",
    "total_requests": 55,
    "total_input_tokens": 22000,
    "total_output_tokens": 8500,
    "total_cost_usd": 0.43
  }
]

サマリー取得(期間集計)

GET /v1/costs/summary?org_id={org_id}&period=30d
Authorization: Bearer magi_xxxxxxxxxx

period7d / 30d / 90d を選択できます。モデル別に集計してコスト降順で返すので、「一番費用がかかっているモデル」が一目でわかります。

[
  {
    "model": "gpt-4o",
    "provider": "openai",
    "total_requests": 230,
    "total_input_tokens": 95000,
    "total_cost_usd": 1.82
  },
  {
    "model": "claude-3-5-sonnet-20241022",
    "provider": "anthropic",
    "total_requests": 310,
    "total_input_tokens": 120000,
    "total_cost_usd": 1.45
  }
]

認証設計

2種類の認証をサポートしています。

MAGIキー認証(推奨)

Authorization: Bearer magi_xxxxxxxxxxxx

サービスアカウント向け。アプリのバックエンドからGatewayを叩く際に使います。APIキーはSupabaseの api_keys テーブルで管理し、org_id に紐づいています。

JWT認証

Authorization: Bearer <jwt-token>

フロントエンドからのリクエスト用。Supabase Authから発行されたJWTをそのまま使えます。組織をまたいだデータアクセスは403でブロックされます。

# 異なるorg_idへのアクセスは拒否
GET /v1/costs/daily?org_id=other-org  # → 403 Forbidden

セットアップ方法

3分でセットアップできます。

Step 1: アカウント作成

magi.dev でアカウントを作成し、組織を作ります。クレジットカード不要のFreeプランがあります。

Step 2: APIキーを取得

ダッシュボードからMAGIキー(magi_xxx)を発行します。

Step 3: エンドポイントを差し替える

# Before(Anthropic直叩き)
import anthropic
client = anthropic.Anthropic(api_key="sk-ant-xxx")

# After(MAGI Gateway経由)
import anthropic
client = anthropic.Anthropic(
    api_key="magi_xxxxxxxxxx",
    base_url="https://gateway.magi.dev/v1/anthropic"
)

ライブラリの base_url を変えるだけです。既存コードの変更は最小限で済みます。OpenAIもGeminiも同様です。


ダッシュボードの機能

Next.js 15 + shadcn/ui で作ったダッシュボードでは次のことができます。

  • プロバイダ横断コスト可視化: 棒グラフ・折れ線グラフで費用推移を確認
  • モデル別ランキング: 30日間のコスト降順でモデル一覧を表示
  • 日本円表示: USD → JPYリアルタイム換算
  • アラート設定: 月次予算上限を設定し、超過時にSlack/メール通知

ハマったポイント

日次集計のタイミング

リクエストの都度 total_cost_usd を更新するのではなく、バッチで日次集計する設計にしました。理由はSupabaseのコネクション数の制約です。高頻度のリアルタイム更新はコネクションプールを圧迫するため、キューに積んでバッチ処理する構成が安定していました。

トークン単価テーブルの更新

各LLMプロバイダはモデルの更新と同時に価格を変更することがあります。静的な定数テーブルではなく、Supabaseの設定テーブルから読み込む構成にしておくことで、コードのデプロイなしに単価を更新できるようにしています。


まとめ

LLM Gateway を自前で持つことで、複数プロバイダのコストを完全に把握できるようになりました。プロジェクトが複数あったり、チームでLLMを使い込んでいる場合に特に効果を発揮します。

MAGI for Devs は現在 Free プランを提供中です。3分でセットアップできるので、ぜひ試してみてください。


CASPER自己評価

評価 点数
読者共感・関連性 LLMコスト管理はエンジニアの実際の痛点。具体的な問題提起が機能している 23
ビジネス価値 MAGI for Devs の機能・価値を直接訴求。コードベースから正確な技術詳細を記載 23
CTA有効性 記事末尾のURL・Freeプラン・3分セットアップが明確なCTA 20
コンテンツ品質 APIエンドポイント・コード例・データモデルを正確に掲載。構成も整理されている 22
合計 88/100
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?