focxle — what your AI agents cost について
focxleは、Pythonエージェント向けのプロセス内コスト計測ライブラリです。複数ベンダーの実測費用をエージェント別に集計し、上限設定で止まった可能性のある呼び出しも示します。ローカルの日次履歴を調べるMCPサーバーも付属します。
主な機能
- 01エージェント別に複数ベンダーの費用を集計
- 02ベンダーの使用量データで料金を算出
- 03上限適用時の結果を表示
- 04OpenAI、Anthropic、LangChainに対応
- 05呼び出しごとの記録をローカル保存
活用シーン
- 01費用の大きいエージェントやベンダーを特定
- 02支出上限で止まる可能性のある呼び出しを確認
- 03エージェントの週間支出を質問
- 04各呼び出しをJSONLファイルに保存
MCP 対応
付属のMCPサーバーは~/.focxle/history.jsonの日次集計を読み、支出に関する質問に回答します。このファイルだけを読み取り、ネットワーク接続やエディター自身のモデル利用の計測は行いません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
focxle
すべてのベンダーをまたいで、各 AI エージェントにかかる費用を把握できます。1 行のコマンドで、アカウント不要、1 秒もかかりません。
今あるものでは、個々のエージェントにかかった費用を把握できません。OpenAI のダッシュボードでは Anthropic は見えません。Serper、Firecrawl、そしてエージェントが午前 3 時にループで呼び出すその他 12 個の API も同様です。どれもキーごと、月ごとの費用を報告しますが、これは二重の意味で適切な単位ではありません。実行するのはキーではなく、エージェントです。そして月末には、もうお金がなくなっています。
focxle はプロセス内で動作するため、すべての呼び出しを把握し、呼び出し元のエージェントに割り当て、推測ではなくベンダーが提供するトークン数に基づいて料金を計算します。アカウントを接続すれば、エージェントがオンチェーンで決済する支払いも同じ合計に含まれます。
費用がすぐに膨らむ理由。 動作が止まらなくなったエージェントの費用を計算してみましょう。最先端モデルへの呼び出しが毎秒 2 回、入力 10k トークン、出力 1k トークンで、入力が 100 万トークンあたり $5、出力が 100 万トークンあたり $25 なら、1 回あたり 7.5 セント、1 時間あたり $540です。夜通し 12 時間なら**$6,480**。週末の 2 日間なら**$25,900**です。誰もこの費用を予算に組み込みません。そもそも、こんな事態は誰も想定していないからです。終了条件の不備、リトライラッパーの重ねすぎ、出力を自分自身のプロンプトに返すツールなどが原因です。最初に気づくのは請求書が届いたときです。
これこそが、これを作った理由のすべてです。無料で、いつまでも、そうした状況を見守り、上限を設けていれば支払い前に何を防げたかを正確に確認できます。
このライブラリはフェイルオープンです。 エージェント内で動作するため、本来は計測だけをするはずのライブラリが、リクエストを失敗させることが最大の問題になります。内部で何らかのエラーが発生しても、呼び出しは実行され、エラーはカウントされて最後に表示されます。計測されない呼び出しより失敗する呼び出しのほうが本当に問題になる場合は、focxle.init(fail_open=False) でこの動作を逆にできます。
デフォルトでは何もブロックしません。 初期状態では計測のみを行います。呼び出しを拒否するには有料プランのアカウントが必要です。その場合でも、指示はローカル設定ではなく署名済みドキュメントから取得するため、あなたや私たちがコードに書いた内容によって、ひそかにブロックを有効にすることはできません。料金を計算できないベンダーへの呼び出しは、常に許可されます。
pip install focxle
import focxle
focxle.init()
セットアップはこれだけです。アカウントも API キーも設定ファイルも不要で、ネットワーク呼び出しもありません。料金はパッケージに同梱されているため、初回の実行から飛行機の中でも使えます。テレメトリーは有効にしない限りオフで、確認は一度だけです。
得られるもの
focxle spend $47.21
--------------------------------------------------------
support-triage $31.04 (1,284 calls)
anthropic $28.10
google.serper.dev $2.94
research $16.17 (203 calls)
openai $14.02
api.firecrawl.dev $2.15
3 calls would have been stopped under $1.50/call and $50/day
$12.30 prevented, worst single call $4.10
3x single call $4.10 over the $1.50 per-call limit
$5,904 a month at the rate this run was going
$412.60 prevented across 17 runs in 9 days
observe mode: nothing was actually blocked
prices dated 2026-08-05
turn these into real caps: https://focxle.com/upgrade
2 つ目のブロックが、この仕組みの要です。上限があればどうなっていたかを、実際にブロックする処理と同じコードで評価し、表示します。これにより、上限を設けるために支払う前に、必要かどうかを判断できます。
ここに表示される数値はすべて、販売目的の数字ではなく計測値です。 合計、最も高額な呼び出し、累計は、実際に発生した呼び出しをベンダー提供の使用量データに基づいて料金計算したものです。月額は唯一の予測値で、この実行で計測した速度をそのまま先に延ばしたものであることが、行内に明記されます。また、実行時間と処理量が十分で信頼できる場合を除き、月額は一切表示されません。
上限を設けると呼び出しの大部分が止まる場合は、数値を提示する代わりにその旨を示します。エージェントの作業の 4 分の 1 をブロックする上限は、節約ではなくエージェントの停止です。その差を節約額と呼べば、いざというときに数値の価値がなくなります。こうした実行では、販売の提案も一切表示されません。
これに匹敵するものがほかにない理由
AI のコストツールには 3 つのタイプがあり、どれも何かを教えてくれる前に、まず何かを求めます。
ベンダーのダッシュボードはキーごと、月ごとに分かれており、ベンダーごとに用意されていますが、互いの情報を見ることはできません。ベンダーが 4 社なら、タブが 4 つ必要で、合計額はわかりません。
プロキシやゲートウェイはすべてを把握できます。すべての呼び出しが、別の誰かのサーバーを経由するようになるからです。稼働中の経路に新たな依存先が加わり、プロンプトを預ける新たな企業ができ、午前 3 時に停止するかもしれないものがまたひとつ増えます。
可観測性プラットフォームでは、最初の数値が表示される前に、トレースのパイプライン、アカウント、そしてシート料金またはトレースごとの料金が必要です。優れたものもいくつかあります。どれも導入にはひと仕事必要で、昼食時に予想外の請求書が届いたからといって、午後 4 時にすぐ使えるものではありません。
focxle は pip install focxle と 1 行で使えます。依存関係はゼロなので、環境に何も追加されず、固定したバージョンとの競合も起きません。無料の利用経路ではネットワーク呼び出しがゼロです。テストスイートでは socket.socket を削除しても、スイート全体が実行できることを証明しています。アカウントもキーも設定ファイルも不要で、料金テーブルはパッケージ内に含まれているため、初回から飛行機内でも動作します。設計上、フェイルオープンです。ここにバグがあっても、通過した呼び出しの計測に失敗するのが最悪のケースです。
そして、ほかのツールには答えられない問いに答えます。このエージェントが、関わったすべてのものを通じて、いくらかかったのか。
エージェントへの費用の割り当て
エージェントごとの費用は、ほかの誰も示せない数値です。それを得るには、呼び出しにラベルを付ける必要があります。
with focxle.agent("support-triage"):
result = my_agent.run(ticket)
スレッドや非同期タスクをまたいで機能します。または、環境変数 FOCXLE_AGENT を設定してください。同じイメージを通常は複数の異なるエージェントとしてデプロイするので、この方法がたいてい適しています。
正確なトークン数
HTTP レイヤーは、すでにモデルへの呼び出しを確認しています。クライアントをラップすると、「リクエストが発生した」という情報から、ベンダー独自のトークン数を取得できるようになります。
from openai import OpenAI
client = focxle.watch(OpenAI())
ストリーミングにも対応しています。同じクライアントを 2 回ラップしても、二重計上せず、何も起こりません。
フレームワークがクライアントを構築する LangChain の場合は、次のようにします。
chain.invoke(x, config={"callbacks": [focxle.langchain_handler()]})
エディターで質問する
focxle には MCP サーバーが付属しているため、Claude Code、Cursor、Windsurf、Zed など、MCP に対応するものから、実際の費用について質問できます。
今週、エージェントにかかった費用は? 費用が最も高いエージェントは? 1 回あたり 2 ドルの上限を設けたら、何を防げた?
クライアントの MCP 設定に、次の内容を追加してください。
{
"mcpServers": {
"focxle": { "command": "python", "args": ["-m", "focxle", "mcp"] }
}
}
計測対象のプロセスが終了したときに書き込まれる、~/.focxle/history.json 内の日次集計データをもとに回答します。このファイルだけを読み取ります。ネットワーク接続もアカウントも必要なく、計測を自ら開始することもありません。そのため、エディター自身のモデル呼び出しが、あなたの呼び出しとして数えられることはありません。FOCXLE_NO_HISTORY=1 を設定すると集計が無効になり、質問できる情報もなくなります。
数値を自分で読み取る
focxle.spend() # total USD observed
focxle.spend("support-triage") # for one agent
focxle.counterfactual() # what a cap would have stopped
focxle.report() # print now instead of at exit
focxle.init(file="~/spend.jsonl") # one JSON object per call
対応していないこと
単独では何もブロックしません。 アカウントがない場合もポリシー評価は実行され、判定結果が記録されるだけです。そのため、上限を設定する前に、設定した場合にどうなっていたかを確認できます。自分のコードに Policy(mode="enforce") と記述しても拒否され、監視モードに変更されます。stderr に注記が出力されます。強制適用はアカウントに付与されるものであり、プロセスが自ら設定するフラグではありません。
強制適用が付与されている場合、上限の判定は、呼び出しの予想コストではなく、実際に発生した費用に基づいて行われます。出力の長さは応答が生成されるまでわからないため、推測に基づく判定では通常の処理を拒否する一方、想定外のコスト増を見逃します。例外は呼び出しごとの上限で、事前に決める必要があります。この上限では、指定した max_tokens の費用が計算されるため、通常の呼び出しの費用ではなく、宣言した応答のうち最大のものの費用を上回る値を設定してください。
すべての費用を計算するわけではありません。 価格表にないベンダーは費用ゼロとして記録され、レポートにはホストと正確なモデル ID の両方が記載されます。そのため、「無料」を意味するゼロと、「認識できなかった」を意味するゼロが混同されることはありません。呼び出しはそのまま許可されます。費用がわからないという理由で呼び出しをブロックするのは、受動的であることを期待されているプロセス内で、このライブラリが不完全な情報に基づいて判断を下すことになります。架空の金額を使うのは、知識があるかのように見えるため、さらに問題です。
ルーターは、ルーターが指定するプロバイダーとして価格が計算されます。そのため、OpenRouter 経由の anthropic/claude-haiku-4.5 の呼び出しには、そのモデルの費用が適用されます。バージョン表記のドットとハイフンは同じ表記として扱われます。どちらが表示されるかは、文字列を生成した SDK によって異なるためです。
プロセスごとに動作します。 50 個のワーカーにまたがって実行されるエージェントからは、それぞれ部分的な状況しか把握できません。それらを統合するには送信先が必要で、そのためにアカウントがあります。例外として、上限によって防げた費用の累計は ~/.focxle/lifetime.json に保存されるため、2 回目の実行時にゼロから始まることはありません。保存されるのは 2 つの数値と日付だけで、マシンの外に送信されることはありません。また、FOCXLE_NO_LIFETIME=1 を設定すると、ファイルへの書き込みを完全に停止できます。
~/.focxle 以下のすべてのファイルとディレクトリは、ユーザー専用として作成されます。ディレクトリの権限は 0700、ファイルの権限は 0600 で、~/.ssh や ~/.aws/credentials と同じです。アカウント ID は認証情報です。これを読める人は、そのアカウントの支出を読み取り、アカウントに対するチェックアウトを開始できます。また、エージェントのワークロードは共有 CI ランナーで常に実行されています。以前のバージョンによって誰でも読み取り可能な状態で残されたファイルは、次回の書き込み時に権限がより厳しく設定されます。
依存関係はありません。 環境に何かが追加されることも、使用中のバージョンと競合することもありません。計測対象の SDK とフレームワークは実行時に検出され、インストール時にインポートされることはありません。
どこに何が送信されるか
有効にしない限り、何も送信されません。observe パスではネットワーク呼び出しは一切発生せず、テストスイートでは socket.socket を削除しても実行できることを確認しています。
お願いするのは、たった一つだけです。最初の内訳表示の後に一度だけ表示され、それ以降は表示されません。コマンドを入力するまでは無効です。
python -m focxle share preview # the exact JSON, before you decide
python -m focxle share on
python -m focxle share off
有効にすると、匿名化されたベンダー別の合計情報が送信されます。使用したベンダー、呼び出し回数、費用、そして料金を算出できなかったホストです。最後の情報をお尋ねするのは、次にどの料金を算出すべきかを把握するためです。
エージェント名、モデル名、プロンプト、応答、URL、またはお使いのマシンから派生した情報は一切送信されません。インストール ID はローカルで生成されるランダムな UUID であり、ホスト名のハッシュではありません。同じ入力を持つ人なら誰でも逆算できるため、派生情報は使用しません。プライベートなホスト(.internal、.corp、ドメイン名のないホスト名、IP アドレス)はすべてのフィールドから除外され、withheld に計上されるため、合計値がひそかに不完全になるのではなく、明示的に不完全なものになります。
プロンプトが表示されることはありません。これはプロセス終了時に実行されますが、そのときターミナルが接続されていないこともよくあります。そこで標準入力を待つと、本番環境のエージェントがハングするためです。
ローカルのファイル出力先を有効にすると、ホストとパスの最初の 2 セグメントが記録されます。クエリ文字列は記録されないため、検索語句やドキュメント ID は含まれません。そのファイルがマシンの外に送信されることはありません。
互換性
Python 3.9 以降に対応しています。openai、anthropic、httpx、requests および LangChain が存在する場合に計測し、存在しない場合は何もしません。
ソース、課題、コントリビューション
ソースは github.com/focxle/focxle-python で公開されているため、エージェント内で実行する前に読むことができます。これは非公開のビルドリポジトリから生成されたもので、ソースのみです。テストスイートはそのリポジトリにあり、こちらにはミラーされていません。公開しても安全かどうかを判断するチェックを、これらのファイルが一度も受けていないためです。
リポジトリは自動生成されるため、プルリクエストをマージすることはできず、受け付けてもいません。これはビルド方法による制約であり、パッチに対する評価ではありません。実際に歓迎しており、対応する内容は次のとおりです。
- バグや機能のリクエスト — 課題を登録するか、[email protected] にメールしてください。
- 料金を誤って算出している、またはまったく算出していないベンダーやモデル。 レポートにその名前が記載されます。この一覧は、皆さんからお送りいただける情報の中で最も役立つものです。
- セキュリティに関する報告 — 該当リポジトリの GitHub の非公開脆弱性報告機能を使用するか、上記のメールアドレスにご連絡ください。公開する前に、妥当な対応期間を設けてください。
ライセンス
MIT。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。