2026年2月6日、X.com(旧Twitter)がX API の新しい従量課金モデル(Pay-Per-Use)を発表しました。これまでの月額200ドル・5,000ドルの固定プランから、API呼び出しごとに課金されるクレジット制に移行します。
この変更により、AIエージェント にX.com APIを操作させる際の設計要件が大きく変わりました。「何度実行しても安全」だった無料APIと違い、「1回の誤実行が課金につながる」有料APIでは、CLIツールに新しい防御機構が必要です。
本記事では、私が開発したxcom-rs というRust製X.com API CLIツールを題材に、従量課金時代のCLI設計で実装すべき3つの防御策(コストガードレール、冪等性、リスクメタデータ)を解説します。
X.com API従量課金の背景
2026年2月6日、X.comは新しいPay-Per-Use課金モデル を発表しました。主な変更点は以下の通りです:
- クレジット制: 事前にクレジットを購入し、API呼び出しごとに消費
- エンドポイント別単価: 取得系・投稿系で単価が異なる
- 重複取得の軽減策: 同日中の同一データ取得は原則無課金(ただし例外あり)
- 予算制限: 自動購入設定と支出上限設定が可能
この変更により、開発者は「APIを何回叩いたか」「いくら使ったか」を常に意識する必要が出てきました。特に、エージェントにCLIを任せる場合、以下のリスクが顕在化します:
- 無限ループで課金: エージェントがエラーをリトライし続けて課金
- 重複投稿で課金: 同じツイートを複数回投稿して無駄な課金
- 予算超過: 気づかないうちに予算上限を突破
xcom-rsは、これらのリスクに対応するため、3つの防御策を実装しています。
防御策1: billing モジュール - コスト見積もりとガードレール
xcom-rsのbillingモジュールは、API呼び出し前にコストを見積もり、予算超過を防ぐ機能を提供します。
コスト見積もり
billing estimateコマンドで、実行前にコストを確認できます。
|
|
出力例(JSON):
|
|
この出力から、エージェントは「実行すると1クレジット消費」「残り予算は99クレジット」を判断できます。
予算ガードレール
--budget-limitオプションで、コマンド実行前に予算チェックを強制できます。
|
|
予算超過時の出力例:
|
|
エージェントはerror.codeがBUDGET_EXCEEDEDであることを確認し、リトライせずに停止できます。
コストレポート
billing reportコマンドで、過去の使用履歴を確認できます。
|
|
出力例:
|
|
この情報をもとに、エージェントは「どのコマンドが高コストか」を判断し、最適化できます。
防御策2: idempotency ledger - ツイート重複防止
従量課金APIでは、「同じツイートを2回投稿する」ことが直接的な課金の無駄につながります。xcom-rsはidempotency ledger(冪等性台帳)で、重複投稿を防ぎます。
冪等キーの仕組み
tweets createコマンドに--dedupe-keyオプションを付けると、同じキーでの再実行時にAPI呼び出しをスキップします。
|
|
初回実行時の出力:
|
|
同じキーで再実行した場合:
|
|
再実行時の出力:
|
|
meta.dedupeStatusがreplayedになっており、エージェントは「キャッシュから返された」と判断できます。
パラメータ変更の検出
同じ--dedupe-keyで異なる内容を投稿しようとすると、エラーになります(安全側に倒す)。
|
|
エラー出力:
|
|
これにより、「キーの使い回しミス」を検出できます。
実装の詳細
冪等性台帳は、ローカルストレージ(~/.xcom-rs/idempotency.db)に以下の情報を保存します:
team_id/user_id/method/dedupe_key: 一意キーrequest_hash: リクエストパラメータのハッシュresponse: API応答のキャッシュcreated_at: 初回実行時刻
古いエントリは自動的にクリーンアップされます(デフォルト: 30日)。
防御策3: risk メタデータ - コマンドの危険度表示
xcom-rsは、すべてのコマンドにrisk(危険度)とhasCost(課金有無)のメタデータを付与しています。
commands エンドポイント
commandsコマンドで、利用可能なコマンド一覧とメタデータを取得できます。
|
|
出力例(抜粋):
|
|
risk レベルの定義
| risk | 意味 | 例 |
|---|---|---|
safe |
読み取り専用、課金なし | commands, schema, help |
low |
読み取り系、課金あり | tweets list, users info |
medium |
書き込み系、取り消し可能 | tweets create(削除可能) |
high |
書き込み系、取り消し不可 | tweets delete(復元不可) |
エージェント側の判断ロジック
エージェントは、riskとhasCostを組み合わせて判断できます。
|
|
このように、エージェントは「実行前に危険度を判断」できます。
slack-rs との比較: 無料API vs 有料API
私は以前、slack-rs というSlack API CLIツールも開発しました(詳細は「Agentic CLI Designを実装する: slack-rsで学ぶ7原則の具体化 」参照)。
slack-rsとxcom-rsは、どちらも「Agentic CLI Design: CLIをAIエージェント向けプロトコルとして設計する7つの原則 」に基づいて設計されていますが、API特性により以下の違いがあります:
| 項目 | slack-rs(無料API) | xcom-rs(有料API) |
|---|---|---|
| 課金 | なし | 従量課金 |
| billing モジュール | なし | あり(コスト見積もり・予算制限) |
| 冪等性 | --idempotency-key |
--dedupe-key + ledger |
| risk メタデータ | なし | あり(safe/low/medium/high) |
| hasCost フラグ | なし | あり |
| 主な懸念 | 重複投稿の防止 | 課金の無駄・予算超過 |
slack-rsでは「重複投稿を避ける」ことが主目的でしたが、xcom-rsでは「課金の無駄を避ける」ことが最優先です。このため、billingモジュールとriskメタデータが追加されています。
実装のポイント
xcom-rsの実装で重視したポイントを3つ紹介します。
1. 統一エンベロープ
すべてのコマンドが、以下の統一エンベロープ(共通ラッパー)でJSON出力を返します。
|
|
エラー時:
|
|
この構造により、エージェントは「成功/失敗」「リトライ可否」を確実に判断できます。
2. 自己記述的なAPI
xcom-rsは、以下の3つのイントロスペクションコマンドを提供します:
commands: 利用可能なコマンド一覧(risk/hasCost付き)schema --command <name>: 入出力のJSON Schemahelp <command>: 終了コード・エラー語彙の詳細
これにより、エージェントは「ドキュメントを読まずにCLIを理解」できます。
3. 非対話モード
--non-interactiveフラグで、確認プロンプトを完全に無効化できます。
|
|
CI/CD環境やエージェント実行時に、対話プロンプトで詰まることがありません。
まとめ
X.com APIの従量課金化により、CLIツールに求められる要件が変わりました。xcom-rsが実装した3つの防御策は以下の通りです:
- billing モジュール: コスト見積もり・予算ガードレール・使用履歴レポート
- idempotency ledger: 冪等キーによる重複投稿防止
- risk メタデータ: コマンドごとの危険度・課金有無の明示
これらの機構により、エージェントは「課金の無駄を避けながら、安全にX.com APIを操作」できます。
今後、他の有料API(Google Maps API、OpenAI APIなど)向けのCLIツールでも、同様の設計パターンが有効です。特に、billing estimateと--budget-limitの組み合わせは、予算超過を防ぐ強力な手段になります。
xcom-rsはGitHub で公開しています。Rust 1.70以上があれば、以下のコマンドでビルドできます:
|
|
詳細な使用例は、リポジトリのEXAMPLES.md を参照してください。