AIエージェント コストの盲点:有料フォールバックが既定経路になった日

AIエージェント コストの盲点を、実際の公開障害から読み解きます。画像ファイルの受け渡しが止まり、有料フォールバックが既定経路となり、共有残高は$8.30から$0へ。カバーや埋め込みが欠けてもジョブはdoneのままでした。サンドボックス境界、認証情報の所有、完了条件、従量課金の監視をどう設計し直すべきかを解説します。

公開日

AIエージェント コストの盲点:有料フォールバックが既定経路になった日

$8.30の残高は、サンドボックス内のライターが有料画像フォールバックを暗黙のうちに既定経路へ変えたことで、01:15 UTCに$0まで減りました。その後、2本の記事がカバーなしで公開され、5本は埋め込みなしで公開されたにもかかわらず、ジョブはdoneを返し続けました。これがAIエージェント コストに潜む予算漏れです。

AIエージェント コスト事故の記録

高くついた原因は、異常に大きなモデル呼び出しではありません。ファイルの受け渡しが遮断され、本来は常用する設計ではない従量課金フォールバックが処理を背負うことになった点です。

2026-09-18 → 09-19、2つの自律型パブリッシングエージェントは、いずれもサンドボックス内のライターが記事を作り、サイト側が公開するという大枠の流れで動いていました。一方のエージェントは新しいサーバーで再起動されたばかりでした。このエージェントは12時間で18本の記事を公開しましたが、18件すべてのペイロードに画像の説明はあっても、画像ファイルは1つも入っていませんでした。

サイトは、その説明を画像生成リクエストとして扱いました。有料の画像モデルによって18枚のカバーと約26点の図版が生成され、1記事当たりの費用は約$0.45でした。従量課金ゲートウェイの残高は2つの媒体で共有されており、01:15 UTCに$8.30から$0になりました。

シグナル記録された事実そこから分かること
ワークロード2つの自律型パブリッシングエージェント、12時間で18本の記事稼働中の公開処理をまたいで起きたインシデントです
成果物の受け渡し18件すべてのペイロードに説明があり、画像ファイルは0本来のファイル経路が機能していませんでした
有料フォールバック18枚のカバーと約26点の図版、1記事当たり約$0.45説明文が従量課金の画像処理に変わっていました
共有残高01:15 UTCに$8.30から$01つの残高が2つの媒体をつないでいました
出力の欠落2本の記事がカバーなしで公開、5本の記事が埋め込みなしで公開公開経路が不完全な結果を受け入れていました
ジャーナルの差一方は画像ツールへの言及が10回、もう一方は0回一方のライターは利用可能なレンダリング経路を使い、もう一方は使っていませんでした
決済レスポンス402有料経路が失敗しても、ジョブ状態は正常のままでした

画像数と1記事当たりの費用は概算として記録されているため、ここでも概算のまま扱う必要があります。この情報だけでは、共有残高の動きを厳密に復元できません。また、2種類の出力欠落件数は、それぞれ別に観測されたものです。重複を除いた影響記事数を合算できる根拠にはなりません。

説明だけを含む18件のペイロードから有料フォールバック、共有残高の枯渇、2種類の出力欠落へ至るタイムライン
フォールバックは共有残高を消費し、その後、異なる2種類の出力が欠落しました。

証拠が示す破断点はアップロード境界です

ペイロード、実行ジャーナル、残高の3つが、同じ問題箇所を指しています。ライターは画像を説明できても、その画像ファイルを引き渡せませんでした。

  • 18件すべてのペイロードにシーンの説明があり、画像ファイルは0でした。これはレンダリング品質の小さな問題ではありません。成果物が公開境界を一度も越えていなかったことを意味します。
  • 一方の実行ジャーナルには画像ツールへの言及が10回あり、もう一方は0回でした。どちらのエージェントにも、同じバージョンのCLI、同じツール、同じフラグが用意されていました。この差から、機能自体は存在していたものの、2つ目のライターから到達できる経路には組み込まれていなかったことが分かります。
  • サイトが説明文から有料画像を生成している間に、共有残高は01:15 UTCに$8.30から$0へ減りました。決済経路が止まると、2つの媒体の両方でカバーと埋め込みが欠落しました。

このインシデントがパブリッシング以外にも重要なのは、そのためです。エージェントのコストは、モデル選定、トークン使用量、リトライ回数の問題として語られがちです。しかし今回の費用は、その1層手前、つまりファイルを作るプロセスと、アップロードに必要な認証情報とを隔てるセキュリティ境界から生じていました。

安全なサンドボックスが有料経路を唯一の選択肢にした仕組み

サイトのキーをサンドボックス内のライターに渡さない判断は、セキュリティ上正しいものです。設計上の誤りは、そのキーが必須のアップロード処理を、ライターのワークフロー内に残したことです。

サンドボックスは、エージェントがアクセス・変更できる範囲を制限します。今回、ライターのシェルはサイトのキーを受け取れませんでした。画像のアップロードにはそのキーが必要だったため、レンダリング済みファイルを保存先へ直接渡す経路には、サンドボックス内から到達できませんでした。

それでもペイロードは、カバー用のシーンと本文内画像用のシーン説明を受け付けていました。フォールバックとは、優先経路が完了できないときに使う代替経路です。説明だけが入り、ファイルのないペイロードが届いたため、サイトは従量課金ゲートウェイ経由で画像を生成しました。代替経路が、いつの間にか唯一の経路になっていたのです。

もう一方のエージェントには、別の到達可能な経路がありました。そのライターはサブスクリプションに含まれる画像ツールでファイルをレンダリングし、自らアップロードしていました。「サブスクリプションに含まれる」とは、サブスクリプション自体が無料だったという意味ではありません。その実行では、欠けた画像を1枚ずつ、今回問題になった別建ての従量課金フォールバックへ送らなかったという意味です。

教訓は、サンドボックスを弱くすることではありません。認証情報を使う処理を、境界の信頼できる側へ移すことです。AIエージェント向けコードサンドボックスの選択は重要ですが、どの製品を選んでも、到達できない認証必須の処理をライターに割り当てたワークフローまでは修復できません。

doneが誤った状態だった理由

決済エラーは、ジョブの結果を変えるべきでした。しかし実際には、402がソフトフェイルとして処理されました。つまり、システムはエラーを記録または許容し、ジョブを停止せずに処理を続けました。

この判断によって、タスクの完了と出力の完了が切り離されました。記事本文は公開できたため、必須のカバーや埋め込みが存在しなくても、ジョブはdoneと報告しました。

埋め込みとは、このシステムが内部リンクや検索のために関連コンテンツを照合できるよう、コンテンツを変換して保存した表現です。カバーの欠落はページを見れば分かります。一方、埋め込みの欠落は見えにくく、記事自体は存在していても、発見したり関連付けたりする仕組みからは抜け落ちたままになります。そのため、5本の記事が埋め込みなしで公開されても、最終ステータスには不具合が表れませんでした。

正しい完了条件は単純です。ワークフローが必須と定めた出力がそろうまで、ジョブを完了扱いにしてはいけません。カバーが必須なら、カバーの存在を確認します。埋め込みが必須なら、埋め込みを確認します。データベースに本文の行があるだけでは、公開ジョブが完了した証拠にはなりません。

開発者・運用者・購入担当者への示唆

同じインシデントでも、立場によって見直すべき判断は3つに分かれます。

開発者:サンドボックスだけでなく、受け渡しを設計する

開発者は認証情報の境界を図にし、それを越える各工程に担当を割り当てる必要があります。「ライターにキーを渡さない」はセキュリティルールです。その隣に「ライターがそのキーでアップロードする」という要件を残すことはできません。

どのエージェントシステムも、生成された意図と外部への副作用の境界に突き当たります。説明を書くのは意図です。画像を保存する、従量課金プロバイダーに料金を支払う、記事を公開するといった処理は副作用です。それぞれに、信頼できる明確な実行主体、観測可能な結果、親ジョブまで伝わる失敗状態が必要です。

運用者:複数プロダクトが共有する依存先を監視する

共有の従量課金残高は、ベンダー設定の小さな項目ではなく、共有インフラとして扱うべきです。今回、2つの媒体のカバー、図版、埋め込みが同じ残高に依存していました。そのため、一方のライターのフォールバック動作が、もう一方の媒体の信頼性まで変えてしまいました。

AIエージェントAPIの予算管理を使えば支出は制限できますが、上限を設けるだけでは成果物の経路は正しくなりません。共有ヒューズに名前を付け、その健全性をアラート対象にし、残高の枯渇を依存するすべてのワークフローから見えるようにします。元の記録にはアラートのしきい値も修正後の測定値もないため、ここで推測してはいけません。

購入担当者:正常系が崩れた後を確認する

購入担当者が確認すべきなのは、フォールバックが従量課金か、どのプロダクトがその予算を共有するか、そしてフォールバックが支払えないときにジョブが何を報告するかです。デモが一度成功しただけでは、どの問いにも答えられません。

実用的な契約には、必須出力、認証情報を持つ主体、有料フォールバック、出力欠落時に返すステータスを明記します。費用の発生や不完全な公開につながるリトライには、AIエージェントのリトライに対する人間の承認も制御手段になります。これは成果物の契約を補完するものであり、置き換えるものではありません。

今すぐ動くか、待つか、現状のままにするか

サンドボックス内のライターが説明を送れても、その説明が代替するファイルをステージングできない場合、複数のプロダクトが有料の依存先を共有している場合、またはフォールバックに失敗してもdoneで終わる場合は、今すぐ対応が必要です。設計変更を待てるのは、保存済みファイルが境界を越えたことを現在のログで証明でき、必須出力の欠落がすでに成功を阻止している場合に限られます。必須の公開出力が、直接にもフォールバック生成経由でもその残高に依存していないワークフローだけが、今回の共有残高障害の影響を受けません。

過大評価されているもの:フォールバックを増やしても耐障害性は高まりません

ジョブを先へ進めるだけで、フォールバックが耐障害性になるわけではありません。そのコスト、依存先、出力品質、失敗状態を把握できて初めて、耐障害性として機能します。

今回のフォールバックは、残高がある間は役に立ちました。同時に、本来のアップロード経路へ到達できない事実を覆い隠しました。この組み合わせは危険です。表面的には利用可能に見えるため、壊れた境界を明らかにするはずのシグナルが遅れてしまいます。

別のプロバイダーを追加しても、根本問題は解決しません。doneと必須成果物が切り離されたまま、別の請求と別のソフトエラーが増える可能性があります。目指すべきは、代替経路をできるだけ多く集めることではありません。エージェントが実際に到達できる本来の経路と、有料であることが見え、失敗時には明確にエラーを返すフォールバックです。

フォールバックコストを見える状態に保つ設計ルール

修正は担当の明確化から始め、次にコストと完了条件を明示します。

認証情報は信頼できるプロセスに置く

サンドボックス内のライターは、記事、ペイロード、そして自らレンダリングできる画像ファイルを生成します。認証が必要なアップロードは、サンドボックス外の信頼できるプロセスが実行します。キーの形をした穴を開けるのではなく、セキュリティ境界を維持する設計です。

ファイルと説明文を別の入力クラスにする

ファイルは、すぐ使える成果物です。説明文は、成果物を作るためのレシピです。両者を同じものとして扱うと、コストも失敗時の挙動も見えなくなります。

公開契約では、ステージング済みファイルを優先すべきです。説明文は、来歴と修復用データとして残します。システムが説明文を使ってフォールバック生成を実行するなら、その分岐を有料経路として明示し、結果にもそう記録する必要があります。

doneを必須出力に結び付ける

親ジョブは、約束した成果物がそろうまで待たなければなりません。カバーや埋め込みの条件を満たしていないのに、決済のソフトエラーからdoneへ進んではいけません。必須出力の確認は、後から被害を報告するだけのレポートではなく、最終的な成功状態へ移る前に行います。

依存先の健全性をタスクログから分離する

一方のエージェントは画像ツールを使い、もう一方は使わなかったことを示すジャーナルの差は有用でした。このシグナルは残すべきです。それに加えて、共有の従量課金依存先の健全性を、そこに頼るすべての媒体から見えるようにします。ジョブログが答えるのは、1つのワーカーが何を試みたかです。依存先のテレメトリーが答えるのは、共有経路が今も誰かにサービスを提供できるかです。

次のコードは、説明のための構造例であり、本番ソースではありません。表しているのは担当とステータスの流れだけです。元資料には、実装の詳細も修正後に測定した結果もありません。

TypeScript
// Illustrative only. This is not production source.
const handoff = {
  payload: writerOutput.payload,
  pictureFiles: writerOutput.pictureFiles,
  pictureDescriptions: writerOutput.pictureDescriptions,
};

const stagedFiles = await trustedProcess.stage(
  handoff.pictureFiles,
  "presigned PUT",
);

const fallbackRender = stagedFiles.complete
  ? null
  : await paidFallback(handoff.pictureDescriptions);

if (fallbackRender?.status === 402) {
  failJob("Paid fallback unavailable");
}

const publishableArtifacts = mergeArtifacts(
  stagedFiles,
  fallbackRender,
);

const rewrittenPayload = rewritePictureReferences(
  handoff.payload,
  publishableArtifacts,
);

rewrittenPayload.pictureDescriptions = handoff.pictureDescriptions;

assertRequiredArtifacts(rewrittenPayload);
markDone();

重要なのは処理の順序です。ライターはサイトの認証情報を受け取らずにファイルを出力し、信頼できるプロセスがそれをステージングし、ペイロードは保存済みの成果物を参照します。そして、検証済みの完了だけがdoneになれます。

コスト漏れを止める受け渡し設計

長期的に効く修正は、ライターがレンダリングし、信頼できる担当がステージングするという2段階の受け渡しです。

ライターは、すでに作成を許可されている出力の中で、ペイロードの隣に画像ファイルを配置します。サンドボックス外の信頼できるプロセスがそのファイルを受け取り、受け渡し用に認可されたアップロードであるpresigned PUTを使って送信します。提供された記録には有効期限も権限も定義されていないため、それらは事実として断定せず、実装時の選択肢として残します。

ステージング後、信頼できるプロセスはペイロードを書き換え、画像の参照先を保存済みファイルに向けます。サイトが受け取るのは、生成指示ではなく成果物です。ライターにサイトのキーを渡す必要はなくなり、渡したふりを前提に公開経路を動かすこともなくなります。

サンドボックス内のライターが画像ファイルを信頼できるプロセスへ渡し、presigned uploadとペイロードの書き換えを行う構成
ライターがファイルを作り、認証情報を持つプロセスがステージングしてペイロードを書き換えます。

説明文はペイロードに残します。これは修復記録であり、ライターが画像をレンダリングできない場合の有料フォールバックでもあります。したがって、フォールバックに費用がかかる可能性自体は残ります。この修正は、フォールバックを消したり、測定済みの削減額を主張したりするものではありません。ファイルのステージングを到達可能な本来の経路へ戻し、有料生成を再び条件付きの処理にします。

月曜日にまずやること

認証情報を必要とする必須工程を、すべて追跡してください。ライターがその認証情報を持てないなら、処理を信頼できるプロセスへ移し、両者の間で成果物をどう受け渡すかを定義します。次に、最終ジョブ状態を、必須のカバー、埋め込み、保存済みファイルの参照がそろっていることに連動させます。説明文はファイルと一緒に残しつつ、それが起動する経路を「有料フォールバック」と明記します。

よくある質問

AIエージェントにはどの程度のコストがかかりますか?

このインシデントから、AIエージェント全般に当てはまる価格を導くことはできません。分かるのは、有料フォールバックには独立して見える予算が必要であり、ジョブの成功状態はメインタスクが返ったかどうかだけでなく、必須出力がそろったかどうかに連動させる必要があるということです。

次回の本番環境トラブル分析はニュースレターでお届けします。

公開日
カテゴリー
Build
AIアプリ開発ツール7選:Base44の代替を料金・移行性で比較【2026年】

AIアプリ開発ツール7選:Base44の代替を料金・移行性で比較【2026年】

Base44の代替となるAIアプリ開発ツール7製品を比較。Lovable、Bolt.new、Replit、v0、Emergent、Blink、Whackaの料金、無料枠、コードのエクスポート、データベース、認証、ホスティング、モバイル公開を整理し、移行前に確かめる条件と、Base44を使い続ける判断基準を解説します。2026年10月14日Build
vLLMとSGLangを比較:エージェント・RAG向け推論エンジンの選び方

vLLMとSGLangを比較:エージェント・RAG向け推論エンジンの選び方

vLLMとSGLangは、エージェントやRAGの推論基盤としてどう選ぶべきでしょうか。プレフィックスキャッシュ、JSON出力、LoRA、対応ハードウェア、GPUクラウドへの導入方法を比較。GPU費用の計算例と移行時の確認事項から、自社のワークロードに合うエンジンを判断するためのポイントを解説します。2026年10月14日Build
LangChain RAGとLlamaIndexを比較:検索・エージェント・料金の選び方

LangChain RAGとLlamaIndexを比較:検索・エージェント・料金の選び方

LangChain RAGとLlamaIndexの違いを、文書検索、エージェント制御、料金から比較します。同じRAG処理のPythonコードと月間コストの試算を通じて、用途に合う選び方を解説。LangGraphとの役割分担、併用時の設計、移行で守るべきデータと状態、有料サービスの課金単位まで確認できます。2026年10月13日Build
MCPとは?Model Context Protocolの仕組みとAPIとの違い

MCPとは?Model Context Protocolの仕組みとAPIとの違い

MCPとは、AIアプリをツールやデータにつなぐ標準規格です。ホスト・クライアント・サーバーの役割から、APIやRAGとの違い、Claude・ChatGPT・Cursorなどの対応状況まで解説。ローカルとリモートの違い、費用の考え方、権限と安全性の確認点を押さえ、導入すべき場面と試験導入の手順がわかります。2026年10月13日Build
AIエージェントGooseの使い方・料金と導入の判断基準

AIエージェントGooseの使い方・料金と導入の判断基準

AIエージェントGooseの使い方を、デスクトップ・CLIの導入からモデル選択、MCP拡張機能、レシピまで解説します。ソフトウェア無料でも必要になる運用コスト、ローカル推論と権限設定の注意点、Claude Code・Codexとの違いを整理。スプレッドシートをレポートにする活用例を通じて、導入の判断基準を示します。2026年10月13日Build
マルチエージェントの設計と運用:4つの連携パターン、承認、コスト管理

マルチエージェントの設計と運用:4つの連携パターン、承認、コスト管理

マルチエージェントの設計で先に決めるべきなのは、次の工程の責任者です。リードとワーカー、ハンドオフ、チェックポイント付きグラフ、永続的なワークフローの使い分けを解説。人の承認を実行に結び付ける方法から、再試行、ログ、案件全体の予算上限まで、業務に組み込むための設計と運用の要点を整理します。2026年10月13日Build
Promptfooレビュー:LLM評価・レッドチーミングの使い方と料金

Promptfooレビュー:LLM評価・レッドチーミングの使い方と料金

Promptfooの使い方を、サポートボットの回答を検証する実例から解説します。LLM評価とレッドチーミングの違い、無料のCommunityと有料プランの料金体系、データ送信やプローブ上限の制約を整理。OpenAIによる買収の事実、CIへの組み込み方、Braintrust・LangSmithとの使い分けも紹介します。2026年10月13日Build
Claude Code Skills入門:コマンド一覧とチームで使える5つのテンプレート

Claude Code Skills入門:コマンド一覧とチームで使える5つのテンプレート

Claude Code Skillsとスラッシュコマンドの使い方を解説。標準コマンド一覧に加え、スキル・プラグイン・MCPの違い、引数の渡し方を整理します。PRレビュー、バグ修正、移行計画、リリースノート、週次報告に使える5つのテンプレートで、チームの作業手順を共有し、確認漏れや手直しを減らしましょう。2026年10月13日Build
ニュースレター

毎週日曜、一通の手紙。動くシステムの話。感想戦ではなく。

週刊。スパムなし。いつでも解除できます。