プロンプトキャッシュ
プロンプトキャッシュとは、モデルプロバイダーがターンごとに毎回再処理する代わりに、変化していないプロンプト接頭辞(通常は system/developer instructions やその他の安定したコンテキスト)を再利用できることを意味します。OpenClaw は、上流 API がそれらのカウンターを直接公開している場合、プロバイダーの使用量をcacheRead と cacheWrite に正規化します。
ステータス表示では、ライブセッションのスナップショットにキャッシュカウンターがない場合でも、最新のトランスクリプト usage ログからそれらを復元できるため、部分的なセッションメタデータ損失の後でも /status でキャッシュ行を表示し続けられます。既存の非ゼロのライブキャッシュ値は、引き続きトランスクリプトからのフォールバック値より優先されます。
これが重要な理由: トークンコストの低減、応答の高速化、長時間実行セッションでのより予測しやすいパフォーマンス。キャッシュがなければ、入力の大半が変わっていなくても、繰り返されるプロンプトは毎ターン完全なプロンプトコストを支払うことになります。
このページでは、プロンプトの再利用とトークンコストに影響する、キャッシュ関連のすべての設定項目を扱います。
プロバイダーの参考資料:
- Anthropic のプロンプトキャッシュ: https://platform.claude.com/docs/en/build-with-claude/prompt-caching
- OpenAI のプロンプトキャッシュ: https://developers.openai.com/api/docs/guides/prompt-caching
- OpenAI API のヘッダーとリクエスト ID: https://developers.openai.com/api/reference/overview
- Anthropic のリクエスト ID とエラー: https://platform.claude.com/docs/en/api/errors
主要な設定項目
cacheRetention(グローバル既定値、モデル別、およびエージェント別)
すべてのモデルに対するグローバル既定値としてキャッシュ保持を設定します:
agents.defaults.params(グローバル既定値 — すべてのモデルに適用)agents.defaults.models["provider/model"].params(モデル別の上書き)agents.list[].params(一致するエージェント id。キーごとに上書き)
contextPruning.mode: "cache-ttl"
キャッシュ TTL の期間後に古い tool-result コンテキストをプルーニングし、アイドル後のリクエストで肥大化した履歴が再キャッシュされないようにします。
ハートビートによるウォーム維持
heartbeat はキャッシュウィンドウをウォームな状態に保ち、アイドル時間の後に繰り返されるキャッシュ書き込みを減らせます。agents.list[].heartbeat でサポートされています。
プロバイダーの挙動
Anthropic(直接 API)
cacheRetentionがサポートされています。- Anthropic の API キー認証プロファイルでは、未設定時に Anthropic モデル参照へ
cacheRetention: "short"を OpenClaw が初期設定します。 - Anthropic ネイティブ Messages レスポンスは
cache_read_input_tokensとcache_creation_input_tokensの両方を公開するため、OpenClaw はcacheReadとcacheWriteの両方を表示できます。 - ネイティブ Anthropic リクエストでは、
cacheRetention: "short"は既定の 5 分間のエフェメラルキャッシュに対応し、cacheRetention: "long"は直接のapi.anthropic.comホストでのみ TTL 1 時間へ引き上げられます。
OpenAI(直接 API)
- プロンプトキャッシュは、対応する最近のモデルでは自動です。OpenClaw がブロック単位のキャッシュマーカーを挿入する必要はありません。
- OpenClaw は、ターン間でキャッシュルーティングを安定させるために
prompt_cache_keyを使用し、直接の OpenAI ホストでcacheRetention: "long"が選ばれた場合にのみprompt_cache_retention: "24h"を使用します。 - OpenAI のレスポンスは、
usage.prompt_tokens_details.cached_tokens(または Responses API イベント上のinput_tokens_details.cached_tokens)を通じてキャッシュ済みプロンプトトークンを公開します。OpenClaw はこれをcacheReadに対応付けます。 - OpenAI は別個の cache-write トークンカウンターを公開しないため、プロバイダーがキャッシュをウォームしている場合でも、OpenAI 経路では
cacheWriteは0のままです。 - OpenAI は
x-request-id、openai-processing-ms、x-ratelimit-*などの有用なトレースおよびレート制限ヘッダーを返しますが、キャッシュヒットの集計はヘッダーではなく usage ペイロードから取得するべきです。 - 実際には、OpenAI は Anthropic のような移動する完全履歴の再利用というより、初期接頭辞キャッシュのように振る舞うことがよくあります。安定した長い接頭辞のテキストターンでは、現在のライブプローブで
4864キャッシュ済みトークン付近のプラトーに達することがあり、tool-heavy または MCP 形式のトランスクリプトでは、完全に同じ繰り返しでも4608キャッシュ済みトークン付近で頭打ちになることがよくあります。
Anthropic Vertex
- Vertex AI 上の Anthropic モデル(
anthropic-vertex/*)は、直接の Anthropic と同じ方法でcacheRetentionをサポートします。 cacheRetention: "long"は、Vertex AI エンドポイント上で実際の 1 時間のプロンプトキャッシュ TTL に対応します。anthropic-vertexの既定のキャッシュ保持は、直接の Anthropic の既定値と一致します。- Vertex リクエストは、プロバイダーが実際に受け取る内容にキャッシュ再利用が一致するよう、境界を考慮したキャッシュ整形を通じてルーティングされます。
Amazon Bedrock
- Anthropic Claude モデル参照(
amazon-bedrock/*anthropic.claude*)は、明示的なcacheRetentionの透過をサポートします。 - Anthropic 以外の Bedrock モデルは、実行時に
cacheRetention: "none"へ強制されます。
OpenRouter Anthropic models
openrouter/anthropic/* モデル参照では、OpenClaw は Anthropic の
cache_control を system/developer prompt blocks に注入し、プロンプトキャッシュの
再利用を改善します。ただし、これはリクエストが引き続き検証済みの OpenRouter ルート
(既定エンドポイント上の openrouter、または openrouter.ai に解決される任意の provider/base URL)
を対象としている場合に限られます。
モデルの向き先を任意の OpenAI 互換プロキシ URL に変更した場合、OpenClaw は
それらの OpenRouter 固有の Anthropic キャッシュマーカーの注入を停止します。
その他のプロバイダー
プロバイダーがこのキャッシュモードをサポートしていない場合、cacheRetention は効果を持ちません。
Google Gemini 直接 API
- 直接の Gemini トランスポート(
api: "google-generative-ai")は、上流のcachedContentTokenCountを通じてキャッシュヒットを報告します。OpenClaw はこれをcacheReadに対応付けます。 - 直接の Gemini モデルに
cacheRetentionが設定されると、OpenClaw は Google AI Studio 実行向けに system prompts のcachedContentsリソースを自動的に作成、再利用、更新します。これは、キャッシュ済みコンテンツハンドルを事前に手動作成する必要がなくなったことを意味します。 - 既存の Gemini キャッシュ済みコンテンツハンドルは、設定済みモデル上で
params.cachedContent(または旧式のparams.cached_content)として引き続き渡せます。 - これは Anthropic/OpenAI のプロンプト接頭辞キャッシュとは別物です。Gemini では、OpenClaw はリクエストにキャッシュマーカーを注入するのではなく、プロバイダーネイティブの
cachedContentsリソースを管理します。
Gemini CLI JSON usage
- Gemini CLI の JSON 出力でも、
stats.cachedを通じてキャッシュヒットが表れることがあります。OpenClaw はこれをcacheReadに対応付けます。 - CLI が直接の
stats.input値を省略した場合、OpenClaw はstats.input_tokens - stats.cachedから入力トークン数を導出します。 - これは usage の正規化にすぎません。OpenClaw が Gemini CLI に対して Anthropic/OpenAI 形式のプロンプトキャッシュマーカーを作成していることを意味するわけではありません。
システムプロンプトのキャッシュ境界
OpenClaw は、システムプロンプトを内部の cache-prefix boundary で区切られた 安定した 接頭辞 と 変動する接尾辞 に分割します。境界より上のコンテンツ (tool definitions、skills metadata、workspace files、その他の比較的静的なコンテキスト)は、 ターン間でバイト列が同一のまま保たれるよう順序付けされます。 境界より下のコンテンツ(たとえばHEARTBEAT.md、実行時タイムスタンプ、その他のターンごとのメタデータ)は、
キャッシュ済み接頭辞を無効化せずに変化できます。
主な設計上の選択:
- 安定した workspace project-context files は
HEARTBEAT.mdより前に順序付けされるため、 heartbeat の変動が安定した接頭辞を壊しません。 - この境界は Anthropic 系、OpenAI 系、Google、および CLI トランスポート整形全体に適用されるため、 すべての対応プロバイダーが同じ接頭辞安定性の恩恵を受けます。
- Codex Responses と Anthropic Vertex のリクエストは、 キャッシュ再利用がプロバイダーが実際に受け取る内容と一致するよう、 境界を考慮したキャッシュ整形を通じてルーティングされます。
- システムプロンプトのフィンガープリントは正規化され (空白、改行コード、フックによって追加されたコンテキスト、実行時 capability の順序)、 意味的に変化していないプロンプトがターン間で同じ KV/キャッシュを共有できるようにします。
cacheWrite の急増が見られる場合、
その変更がキャッシュ境界の上にあるか下にあるかを確認してください。
変動するコンテンツを境界の下へ移動する(または安定化する)ことで、
問題が解決することがよくあります。
OpenClaw のキャッシュ安定性ガード
OpenClaw はまた、リクエストがプロバイダーに到達する前に、いくつかのキャッシュに敏感なペイロード形状を決定的に保ちます:- バンドルされた MCP ツールカタログは、tool
registration の前に決定的にソートされるため、
listTools()の順序変化で tools ブロックが揺らいで プロンプトキャッシュ接頭辞が壊れることを防ぎます。 - 永続化された画像ブロックを持つ旧式セッションでは、最新の 3 件の 完了ターン をそのまま維持します。より古く、すでに処理済みの画像ブロックは マーカーに置き換えられる場合があり、画像が多いフォローアップで大きく古い ペイロードが繰り返し再送されるのを防ぎます。
チューニングパターン
混在トラフィック(推奨される既定値)
メインエージェントでは長寿命のベースラインを維持し、突発的な notifier エージェントではキャッシュを無効にします:コスト優先のベースライン
- ベースラインの
cacheRetention: "short"を設定します。 contextPruning.mode: "cache-ttl"を有効にします。- ウォームキャッシュの恩恵があるエージェントに対してのみ、heartbeat を TTL 未満に保ちます。
キャッシュ診断
OpenClaw は、埋め込みエージェント実行向けに専用の cache-trace 診断を公開しています。 通常のユーザー向け診断では、ライブセッションエントリーにこれらのカウンターがない場合、/status やその他の usage サマリーは、最新のトランスクリプト usage エントリーを
cacheRead / cacheWrite のフォールバックソースとして使用できます。
ライブ回帰テスト
OpenClaw は、繰り返し接頭辞、ツールターン、画像ターン、MCP 形式のツールトランスクリプト、および Anthropic の no-cache コントロールに対して、1 つの統合ライブキャッシュ回帰ゲートを維持しています。src/agents/live-cache-regression.live.test.tssrc/agents/live-cache-regression-baseline.ts
Anthropic のライブ期待値
cacheWriteによる明示的なウォームアップ書き込みを期待します。- Anthropic のキャッシュ制御は会話を通じてキャッシュブレークポイントを前進させるため、繰り返しターンでは会話履歴のほぼ全体が再利用されることを期待します。
- 現在のライブアサーションでも、安定パス、ツールパス、画像パスに対して高いヒット率しきい値を使用しています。
OpenAI のライブ期待値
cacheReadのみを期待します。cacheWriteは0のままです。- 繰り返しターンのキャッシュ再利用は、Anthropic のような移動する完全履歴の再利用ではなく、プロバイダー固有のプラトーとして扱います。
- 現在のライブアサーションでは、
gpt-5.4-miniで観測されたライブ挙動に基づく保守的な下限チェックを使用しています:- 安定した接頭辞:
cacheRead >= 4608、ヒット率>= 0.90 - ツールトランスクリプト:
cacheRead >= 4096、ヒット率>= 0.85 - 画像トランスクリプト:
cacheRead >= 3840、ヒット率>= 0.82 - MCP 形式トランスクリプト:
cacheRead >= 4096、ヒット率>= 0.85
- 安定した接頭辞:
- 安定した接頭辞:
cacheRead=4864、ヒット率0.966 - ツールトランスクリプト:
cacheRead=4608、ヒット率0.896 - 画像トランスクリプト:
cacheRead=4864、ヒット率0.954 - MCP 形式トランスクリプト:
cacheRead=4608、ヒット率0.891
88s でした。
アサーションが異なる理由:
- Anthropic は明示的なキャッシュブレークポイントと、移動する会話履歴の再利用を公開しています。
- OpenAI のプロンプトキャッシュも依然として正確な接頭辞に敏感ですが、ライブ Responses トラフィックで実際に再利用可能な接頭辞は、完全なプロンプトより早く頭打ちになることがあります。
- そのため、Anthropic と OpenAI を単一のプロバイダー横断パーセンテージしきい値で比較すると、誤った回帰判定が生じます。
diagnostics.cacheTrace 設定
filePath:$OPENCLAW_STATE_DIR/logs/cache-trace.jsonlincludeMessages:trueincludePrompt:trueincludeSystem:true
環境変数トグル(単発のデバッグ)
OPENCLAW_CACHE_TRACE=1はキャッシュトレースを有効にします。OPENCLAW_CACHE_TRACE_FILE=/path/to/cache-trace.jsonlは出力パスを上書きします。OPENCLAW_CACHE_TRACE_MESSAGES=0|1は完全なメッセージペイロードの取得を切り替えます。OPENCLAW_CACHE_TRACE_PROMPT=0|1はプロンプトテキストの取得を切り替えます。OPENCLAW_CACHE_TRACE_SYSTEM=0|1はシステムプロンプトの取得を切り替えます。
確認すべき点
- キャッシュトレースイベントは JSONL で、
session:loaded、prompt:before、stream:context、session:afterなどの段階的スナップショットを含みます。 - ターンごとのキャッシュトークン影響は、通常の usage 表示で
cacheReadとcacheWriteを通じて確認できます(たとえば/usage fullやセッション usage サマリー)。 - Anthropic では、キャッシュが有効なとき
cacheReadとcacheWriteの両方を期待します。 - OpenAI では、キャッシュヒット時に
cacheReadを期待し、cacheWriteは0のままであることを期待します。OpenAI は別個の cache-write トークンフィールドを公開しません。 - リクエストトレースが必要な場合は、リクエスト ID とレート制限ヘッダーをキャッシュメトリクスとは別に記録してください。OpenClaw の現在の cache-trace 出力は、生のプロバイダーレスポンスヘッダーではなく、プロンプト/セッション形状と正規化されたトークン usage に焦点を当てています。
クイックトラブルシューティング
- ほとんどのターンで
cacheWriteが高い: 変動するシステムプロンプト入力を確認し、モデル/プロバイダーがキャッシュ設定をサポートしていることを検証してください。 - Anthropic で
cacheWriteが高い: 多くの場合、キャッシュブレークポイントが毎回変化するコンテンツに当たっていることを意味します。 - OpenAI で
cacheReadが低い: 安定した接頭辞が先頭にあること、繰り返される接頭辞が少なくとも 1024 トークンであること、同じprompt_cache_keyがキャッシュ共有すべきターン間で再利用されていることを検証してください。 cacheRetentionに効果がない: モデルキーがagents.defaults.models["provider/model"]に一致していることを確認してください。- キャッシュ設定付きの Bedrock Nova/Mistral リクエスト: 実行時に
noneへ強制されるのが想定動作です。