LiteLLMの予算機能でLLMの利用料金に上限を設定する

LiteLLMの予算機能でLLMの利用料金に上限を設定する

Clock Icon2025.06.24

大阪オフィスの小倉です。

Amazon Bedrock等をLiteLLM経由で利用する際、LiteLLMの予算管理機能を使ってユーザの利用料金に上限を設ける方法を試しました。

💰 Budgets, Rate Limits | liteLLM

LiteLLM予算の階層構造

OSS版LiteLLMで管理可能な階層は以下になります。

階層 適用範囲 主な用途
Global システム全体 全体コスト上限
Team チーム単位 チームやプロジェクト全体の予算
Team Member チーム内の個人 チームやプロジェクト内の個人の予算
Internal User 個人(非Team)(※後述) 個人の非Team作業の予算(※後述)
Virtual Key 個別のAPIキー 特定用途の制限

LiteLLM Enterprise版は更にOrganizationで管理できそうですが、今回の検証からは対象外としています。

Teamは任意で作成できるグループです。グループ内でさらにメンバー単位予算を設定するものがTeam Member予算です。
Virtual Key発行時、Team IDを紐づけることが可能です。

vscode-drop-1750730380680-y68rgzn0s3.png
Virtual Key作成画面

Virtual KeyにTeam IDを紐づけるかどうかで、利用料の計上先が以下のように変わります。

階層(計上先) Team IDが無いVirtual Key Team IDがあるVirtual Key
Global
Team
Team Member
Internal User
Virtual Key

Team IDの有無に関わらずInternal Userの料金には計上されます。

計上された利用料に対する予算のチェックも、使用するKeyのTeam IDの有無によって変わります。

階層(チェック予算) Team IDが無いVirtual Key Team IDがあるVirtual Key
Global
Team
Team Member
Internal User
Virtual Key

Team IDがあるKeyを使用する場合は、Internal User予算のチェックは行わず、Team/Team Member予算をチェックするようになっています。

運用イメージ

1.Teamを使用しない運用

Teamを使用しない運用の場合、各ユーザの利用料上限はInternal User予算で設定すればOKです。
以下はユーザにつき$50まで利用を許可する構成です。
ユーザが自分でVirtual Keyを発行できるようにして、各Keyの予算はユーザ自身で設定するとよさそうです。

※以降、Teamに紐づかないVirtual KeyをPersonal Keyと表記します。

Global予算
└── Internal Users
    ├── User A (メンバーA) - Internal User予算 ($50)
    │   ├── Personal Key 1
    │   ├── Personal Key 2
    │   └── Personal Key 3
    └── User B (メンバーB) - Internal User予算 ($50)
        ├── Personal Key 1
        └── Personal Key 2

2.全てTeamを紐づける運用

Teamを利用すると、プロジェクト毎に予算管理が可能になります。
具体的なプロジェクトだけでなく、個人の検証予算についてもTeamで管理するとよさそうです。

以下の例でMemberAは、Team Xとして$100、Team Yとして$75なので、合計$175まで使用可能です。

Global予算
├── Team X (プロジェクトX) - Team予算 ($300)
│   ├── Member A - Team Member予算 ($100)
│   │   ├── Team X Key 1
│   │   └── Team X Key 2
│   ├── Member B - Team Member予算 ($100)
│   │   └── Team X Key 1
│   └── Member C - Team Member予算 ($100)
│       └── Team X Key 1
└── Team Y (プロジェクトY) - Team予算 ($150)
    ├── Member A - Team Member予算 ($75)
    │   └── Team Y Key 1
    └── Member B - Team Member予算 ($75)
        ├── Team Y Key 1
        └── Team Y Key 2

3.Team使用、未使用の混在

Teamに紐づくキーと紐づかないキーを混在して運用することも可能ですが、管理が難しくなるので個人的にはオススメしません。

Global予算
├── Team X (プロジェクトX) - Team予算 ($300)
│   └── Member A - Team Member予算 ($100)
│       └── Team X Key 1
├── Team Y (プロジェクトY) - Team予算 ($150)
│   └── Member A - Team Member予算 ($75)
│       └── Team Y Key 1
└── Internal Users
    └── Member A - Internal User予算 ($200)
        └── Personal Key 1

上記例のMemberAは、

  • Internal Userとして$200まで使用可能
  • Team Xとして$100まで使用可能
  • Team Yとして$75まで使用可能

となります。
先に各Teamの予算を使い切った場合、$200 - $100 - $75 = $25となり、Teamに紐づかないKeyを通して残りの$25を利用できます。

但し、先にPersonal Keyで$200を使ってしまうことも可能です。
Team X,YのKeyはInternal User予算をチェックしないため、この後も利用でき、合計で$375使えることになります。

やってみる

今回は 「Teamを使用しない運用」「全てTeamを紐づける運用」を試します。

以下のテストデータを使って確認します。括弧()内は料金上限です。

User A User B User C
Global ($0.1) ($0.1) ($0.1)
Team - Team X($0.04)
Team Y($0.05)
Team X($0.04)
Team Member - Team X Member($0.03)
Team Y Member($0.02)
Team X Member(No Limit)
Internal User User A($0.02) User B($0.02)
※personal keyに対する制限
User C($0.02)
※personal keyに対する制限
Virtual Key A-1 Key($0.01)
A-2 Key(No Limit)
【TeamX】 B-1 Key($0.01)
【TeamX】B-2 Key(No Limit)
【TeamY】B-3 Key(No Limit)
【TeamX】C-1 Key(No Limit)

vscode-drop-1750730405122-qhlz69s1xfs.png
Internal User
vscode-drop-1750730408894-rp7mhfl236k.png
Team
vscode-drop-1750730412765-hyfy3cy819m.png
Virtual Key

Teamを使用しない運用の場合

User AのVirtual Keyを使って、LiteLLMのTest Key画面からキーを使った呼び出しをテストします。
vscode-drop-1750730558773-1idccpo044i.png
A-1のキーを使ってLLMを利用すると、Virtual Key、Internal Userに料金が計上されていきます。

vscode-drop-1750730571601-ven9bd3wex.png
vscode-drop-1750730583153-74e6whhgwsb.png

実行を続けると、$0.01のVirtual Key予算に抵触したためエラーとなります。

vscode-drop-1750730602431-76tu7npsnw.png

キー予算の設定が無いA-2のVirtual Keyに変更すると引き続き実行できますが、次にInternal User予算に抵触してエラーとなります。

vscode-drop-1750730608092-0n0b0g86r3b.png

この場合、同じユーザで別のVirtual Keyを発行しても、ユーザ単位の予算上限に抵触しているので実行はできません。

Teamを使用した運用の場合

User BのB-1キーを使ってLLMを利用すると、最初にVirtual Key予算に抵触します。

vscode-drop-1750730628401-pc4ddaal8z.png

B-2キーを使うと、Team Xメンバー予算上限の$0.03までは利用できます。

vscode-drop-1750730634836-bfcdz7pmmkr.png

今回は応答されるトークン量のせいか、$0.03を超えた後でブロックされました

vscode-drop-1750730641102-n6n3gos41u.png

User CもC-1キーを通してTeam Xとして利用できる筈ですが、User BがTeam X全体予算$0.04を超えて利用しているので、C-1キーでは実行できませんでした。

vscode-drop-1750730668406-bknkfw0s0o.png

User BはTeam Xのメンバーとしては上限に達しましたが、Team YのキーであるB-3キーを使うと、Team Yメンバーの上限までは利用できます。

vscode-drop-1750730685808-ux3gxiej6o8.png

使用料が加算されていることがわかります。

vscode-drop-1750730693025-3besg6pm4l.png
Internal User

注意事項

料金情報と料金チェック

LiteLLMでの利用料金計算は、独自に保有するmodel_prices_and_context_window.jsonを元に計算しているようです。

今回試したケースのように、LLMから一度に返されるトークンの量が多い場合には、設定した予算を若干超えてしまうことがありました。
予算は厳密な管理を求めるのではなく、目安として設定するのがよさそうです。

Personal Keyを発行させたくない場合

LiteLLMでVirtual KeyをUIから発行する場合、Team IDの指定は任意入力です。このため、全てのKeyにTeamを紐づける運用を行いたい場合でも、
Key発行時に誤ってTeam IDを未入力で発行してしまうことはありえます。

vscode-drop-1750730380680-y68rgzn0s3.png

config.yamldefault_team_disabled : trueを設定すると、Key発行時にTeam IDの指定を必須にできる記述がありますが、
現状Issueが起票されており、必須入力の動きにはなりませんでした。

ワークアラウンドとして、全てTeam IDを紐づける運用の場合でも、Internal User予算に$0をしておくことで緩和可能です。
Team ID無しキーの発行は行えますが、利用されることを防ぐことができます。

補足

検証データを作成したAPIリクエスト例です。

Global予算の設定

config.yamlでmax_budget,budget_durationを指定します。

general_settings:
  database_url: (省略)
  master_key: (省略)
litellm_settings:
  max_budget: 0.1
  budget_duration: 30d
  default_team_params:
    models: []
model_list:
  (省略)
Internal Userの作成

max_budget, budget_duraitonを指定します。

curl --location 'http://localhost:4000/user/new' \
--header 'Authorization: Bearer <master key>' \
--header 'Content-Type: application/json' \
--data-raw '{
    "user_id": "user_a",
    "user_email": "<email address>",
    "max_budget": 0.02,
    "budget_duration": "30d"
  }'
Teamの作成

max_budget, budget_duraitonを指定します。

curl --location 'http://localhost:4000/team/new' \
--header 'Authorization: Bearer <master key>' \
--header 'Content-Type: application/json' \
--data '{
    "team_alias": "team_x",
    "max_budget": 0.04,
    "budget_duration": "30d"
  }'
UserをTeamに参加させ、Team Member予算を設定

Team Member予算はmax_budget_in_teamで指定します。

curl --location 'http://localhost:4000/team/member_add' \
--header 'Authorization: Bearer <master key>' \
--header 'Content-Type: application/json' \
--data-raw '{
    "team_id": "<team id>",
    "member": {
      "role": "user",
      "user_email": "<email address>"
    },
    "max_budget_in_team": 0.03
  }'
Virtual Keyの作成

キー単位予算はmax_budget, budget_duraitonを指定します。
Teamに紐づける場合は、team_idも指定します。

curl --location 'http://localhost:4000/key/generate' \
--header 'Authorization: Bearer <master key>' \
--header 'Content-Type: application/json' \
--data '{
    "key_alias": "b_1_key",
    "user_id": "user_b",
    "team_id": "<team id>",
    "max_budget": 0.01,
    "budget_duration": "30d"
  }'

まとめ

LiteLLMの予算管理機能を試してみました。
料金チェックはどうしても厳密ではないので、目安として扱うのがよさそうです。

社内での管理用として利用する際は、ユーザには自身でVirtual Keyを発行できるようにしつつ、
予算管理はTeam、Team Member予算機能を使って目安となる上限金額を設定しておくと、安心して利用できそうですね。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.