利用額に上限のない AI 機能とは、青天井で請求されうる機能のことです。 暴走したエージェントのループ 1 回、チャット欄に小説を貼り付けるユーザー 1 人、モデルを 4,000 トークンも喋らせるプロンプト 1 つ — これらのどれもが、 あなたの請求額を静かに膨らませます。対策は、安上がりで地味な 2 つの コントロールです。max_tokens で すべての呼び出しを縛り、usage オブジェクトから ユーザーごとの利用額を追跡して、そのユーザーが見合う以上の コストになる前に打ち切れるようにする。これだけです。
どれも難しくありません。難しいのは、上限の基準にする数値を信頼できるか どうかです。予算は、それを支えるトークン数の正しさ以上には機能しません — もしゲートウェイが usage を水増ししたり、失敗した呼び出しまで 請求したりすれば、丹念に計算した「1 ユーザーあたり 1 日 $1」の上限は実際には $1.40 であり、しかもあなたはそれに気づきもしません。だからこの記事は 2 つの ことを行います。仕組みを示すことと、なぜ正直な請求こそがその仕組みを そもそも機能させるのかを説明することです。
ステップ 1 — max_tokens ですべての呼び出しを縛る
ほとんどの請求で高くつくのは出力側です。Claude Sonnet 4.6 では、出力は 100 万トークンあたり $12.75 — 入力レート $2.55 の 5 倍です。 3 文で返ってくると思っていた回答が代わりに 12 段落で返ってきたら、それは 品質の問題ではなく、コストの問題です。max_tokens は、最悪の ケースを事前に把握可能にする厳格な上限です。
# max_tokens ですべての呼び出しのコストに上限をかける。
# これは *出力* — ほとんどの請求で高くつく側 — を厳格な上限で
# 縛る。モデルは延々と続けず、上限に達した時点で停止する。
from openai import OpenAI
client = OpenAI(
api_key="sk-brievio-...",
base_url="https://api.brievio.com/v1",
)
# Claude Sonnet 4.6: 100 万トークンあたり入力 $2.55 / 出力 $12.75。
# 上限がなければ、おしゃべりな回答は出力 4,000 トークン超に達することもある。
# max_tokens=500 にすれば、この呼び出しの出力コストはこう縛られる:
# 500 × $12.75 / 100 万 = $0.0064 — モデルがどれだけ「話したがって」も。
resp = client.chat.completions.create(
model="claude-sonnet-4-6",
max_tokens=500, # ネイティブに尊重される — 真の厳格な停止
messages=[
{"role": "system", "content": "Answer in at most 3 sentences."},
{"role": "user", "content": user_question},
],
)
# なぜ停止したのかを必ず確認する。"length" は上限に達したことを意味し、
# 回答が途中で切れている可能性がある — これは全体ではなく *この* タスク種別
# について上限を引き上げるべきサインだ。
if resp.choices[0].finish_reason == "length":
print("Truncated at the cap — consider a higher max_tokens here.")
print(resp.choices[0].message.content)
print(resp.usage) # 正直な入力・出力トークン数 — 次のセクションを参照Brievio は本物のモデルに対して max_tokens をネイティブに尊重 します — ヒントではなく、真の停止です。一度きりの全体設定ではなく、タスク 種別ごとに設定してください。分類器ならおそらく 5 トークン、チャットの返信なら 500、長い要約なら 2,000 です。肝心なのは、各呼び出し箇所ごとに数値を選び、 finish_reason を監視すること。これが "length" で返ってきたら、実際の回答を途中で切って しまったということなので、その 経路の上限を引き上げるべきです — どこもかしこも一律に引き上げて保護を失ってはいけません。
ステップ 2 — usage オブジェクトを自分で価格計算する
Brievio のすべてのレスポンスには、その呼び出しの実際の入力・出力トークン数を 持つ usage オブジェクトが付随し、各リクエストは実際のトークンと コストとともに記録されます。つまり、何にいくらかかったかを知るために月末の 請求書を待つ必要はありません — レスポンスが返ってきた瞬間に、各呼び出しを 価格計算できます。
usage.prompt_tokens— 実際に送信された入力トークン。usage.completion_tokens— 実際に生成された出力トークン (max_tokensが縛るのはこれ)。usage.total_tokens— その合計。手早い整合性チェック用。
各カウントを公開済みのモデル別レートに掛ければ、その呼び出しの正確な コストが、あなた自身のコードの中で、リアルタイムに手に入ります。モデル別 レートは 料金ページで公式の基準と並べて公開されている ので、コード内の定数は検証可能です — 鵜呑みにするしかない数値ではありません。
ステップ 3 — ユーザーごとの利用額を追跡し、予算で打ち切る
リクエストごとの上限は、1 回の悪い呼び出しからあなたを守ります。ユーザー ごとの予算は、1 人の悪い 当事者 からあなたを守ります — 1 日に 何千回も呼び出すアカウント、それが熱意であれ、自動化であれ、悪用であれです。 パターンは、呼び出し前に確認し、呼び出し後に加算する、ユーザーごとの 1 つの 永続的な数値です。
# usage オブジェクトからユーザーごとの利用額を集計し、予算で打ち切る。
# usage はその呼び出しの *実際の* 入力・出力トークン数を返す。これを公開済みの
# モデル別レートに照らしてローカルで価格計算し、ユーザーをキーとした累計に
# 加算していく。
from decimal import Decimal
# 公開済みの Brievio レート、100 万トークンあたり USD(公式定価より約 15% 安い)。
RATES = {
"claude-sonnet-4-6": {"in": Decimal("2.55"), "out": Decimal("12.75")},
"claude-haiku-4-5": {"in": Decimal("0.85"), "out": Decimal("4.25")},
}
def cost_usd(model: str, usage) -> Decimal:
r = RATES[model]
million = Decimal("1000000")
return (usage.prompt_tokens * r["in"] / million +
usage.completion_tokens * r["out"] / million)
# 保存先はお好みで — Redis のカウンター、SQL のカラム、何でもよい。要は
# ユーザーごとに 1 つの永続的な数値を持つこと。失敗した 4xx/5xx の呼び出しは
# Brievio では無料なので、実際に結果が返った呼び出しにだけコストが乗る。
DAILY_BUDGET = Decimal("1.00") # 1 ユーザーあたり 1 日 $1
def chat_for_user(user_id: str, question: str, model="claude-sonnet-4-6"):
spent = get_spent_today(user_id) # Decimal、デフォルトは 0
if spent >= DAILY_BUDGET:
raise BudgetExceeded(f"{user_id} hit ${DAILY_BUDGET}/day")
resp = client.chat.completions.create(
model=model,
max_tokens=500,
messages=[{"role": "user", "content": question}],
)
add_spent_today(user_id, cost_usd(model, resp.usage)) # 実コストを集計
return resp.choices[0].message.contentしきい値は自社のユニットエコノミクスから決めます。有料の 1 席が月 $20 で、 AI を売上のたとえば 20% 未満に抑えたいなら、それは「1 ユーザーあたり 1 日 約 $0.13」の予算です。80% でソフトに警告し(バナーやメール)、100% で ハードに打ち切る(上記の BudgetExceeded の経路)。無料プランの ユーザーには、上限を低く設定し、モデルを段階的に下げます — 重要度の低い トラフィックを Sonnet から 入力 $0.85 / 出力 $4.25 の Haiku 4.5 へ移すと、同じ正直な 計測を保ったまま、トークンあたりのコストを約 3 分の 2 削減できます。
なぜ正直な請求が計算を信頼できるものにするのか
ここがほとんどのコスト管理ガイドが飛ばす部分です。上記の 2 つの コントロール — 呼び出しごとの上限と、ユーザーごとの予算 — はどちらも トークン数に対する算術です。もしそのカウントが水増しされていれば、下流の あらゆる数値が同じ倍率で、静かに狂います。あなたの上限が額面どおりの意味を 持つかどうかは、2 つの請求の挙動が決めます。
- 失敗した呼び出しは無料。 Brievio では、4xx や 5xx の レスポンスには一切コストがかかりません — 請求されるのは試行ではなく結果に 対してです。これは特に予算にとって重要です。不安定な下流に対するリトライの 嵐が、ユーザーの 1 日の枠を消耗させるべきではありません。コストを集計するのは 結果が返った呼び出しだけなので、利用額の曲線は、吸収したエラーではなく、 提供した価値を反映します。
- カウントは水増しされない。
usageオブジェクトは、本物のモデルが実際に処理したトークンを反映します — 水増し されたプロンプトも、メーターに足された幽霊の出力もありません。正直なやり方は、 それを鵜呑みにしないことです。サイズが分かっている固定のプロンプトを送り、prompt_tokensを読み返し、それがトークナイザーの言う値と一致 するかを確認してください。まさにこれを行う 20 行のトークン水増し自己テスト を書きました — どのゲートウェイに対しても、当社を含め、その数値を信頼する 前に実行してください。
つながりは直接的です。水増しされたカウントから計算した予算は、ユーザーを 早すぎるタイミングで打ち切り、あなたのコストを過大に見せます。失敗した 呼び出しを含む予算は、あなたのインフラの不調な日をユーザーに罰させます。 $1/日 の上限を本当に 1 ドルの意味にするのは、正直な計測です。Brievio は チャットを 公式定価より約 15% 安く、従量課金で、残高は 決して失効しない形で価格設定しています — だから、あなたが設定した上限が、 あなたの得る上限であり、使われなかった予算はあなたのものであり続けます。
すべてをまとめる
本番に耐えうる利用額の姿勢は、4 つの小さな習慣であり、どれも半日もあれば 身につきます。
- すべての呼び出し箇所が
max_tokensを設定する、そのタスクに見合ったサイズで。どこにも青天井の出力を作らない。 - すべてのレスポンスを
usageから価格計算する、公開済みのレートで、ユーザーごとの累計に加算する。 - すべてのユーザーに予算を持たせる、自社のユニット エコノミクスから引いたソフトな警告とハードな打ち切りとともに。
- 安いトラフィックは段階的に下げる、より小さなモデル (Haiku、mini クラス)へ。それを必要としない作業にフラッグシップの レートを払わない。
この 4 つを実行すれば、最悪のケースの請求額は、あなたが発見する数値ではなく、 あなたが選んだ数値になります。より深いレバー — プロンプトキャッシュ、 バッチ処理、モデル選択、プロンプトの削減 — については コスト最適化プレイブックを、そして usage スキーマの全容と Brievio がサポートする OpenAI 互換パラメータについては ドキュメントを参照してください。コスト管理は、 請求書に怯えてから後付けする機能ではありません — それは 2 行とカウンター 1 つ であり、信頼できるメーターの上でこそ最もよく機能します。