cacheRead 與 cacheWrite。當即時工作階段快照缺少快取計數器時,用量摘要(/status 及類似項目)會回退使用最後一筆 transcript 用量項目;非零的即時值一律優先於回退值。
供應商參考資料:
主要旋鈕
cacheRetention
值:"none" | "short" | "long"。可設定為全域預設值、每個模型,以及每個 agent。
agents.defaults.params- 所有模型的全域預設值agents.defaults.models["provider/model"].params- 每個模型的覆寫agents.list[].params- 每個 agent 的覆寫,依 agent id 比對
src/agents/embedded-agent-runner/extra-params.ts(resolveExtraParams)。
contextPruning.mode: "cache-ttl"
在快取 TTL 視窗經過後修剪舊的工具結果脈絡,讓閒置後的請求不會重新快取過大的歷史內容。
心跳偵測保溫
心跳偵測可以維持快取視窗溫熱,並減少閒置間隔後重複的快取寫入。可全域設定(agents.defaults.heartbeat)或按 agent 設定(agents.list[].heartbeat)。
供應商行為
Anthropic(直接 API 與 Vertex AI)
cacheRetention支援anthropic與anthropic-vertex供應商,也支援amazon-bedrock上的 Claude 模型,以及在明確設定cacheRetention時支援自訂anthropic-messages相容端點。- 未設定時,OpenClaw 會為直接 Anthropic(僅
anthropic與anthropic-vertex供應商;其他 Anthropic 系列路由需要明確值)種下cacheRetention: "short"。 - 原生 Anthropic Messages 回應會暴露
cache_read_input_tokens與cache_creation_input_tokens,並映射到cacheRead與cacheWrite。 cacheRetention: "short"映射到預設的 5 分鐘暫時快取。明確設定時,cacheRetention: "long"會請求 1 小時 TTL(cache_control: { type: "ephemeral", ttl: "1h" })。隱含/環境驅動的長保留(OPENCLAW_CACHE_RETENTION=long且沒有明確cacheRetention)只會在api.anthropic.com或 Vertex AI(aiplatform.googleapis.com/*-aiplatform.googleapis.com)主機上升級到 1 小時 TTL;其他主機維持 5 分鐘快取。
src/agents/anthropic-payload-policy.ts(resolveAnthropicEphemeralCacheControl、isLongTtlEligibleEndpoint)。
OpenAI(直接 API)
- 在支援的近期模型上,提示快取是自動的;OpenClaw 不會注入區塊層級快取標記。
- OpenClaw 會傳送
prompt_cache_key,讓多輪對話中的快取路由保持穩定。直接api.openai.com主機會自動取得此欄位。OpenAI 相容代理(oMLX、llama.cpp、自訂端點)需要在模型設定中加入compat.supportsPromptCacheKey: true才能選用;代理永遠不會自動偵測。 - 只有在選取
cacheRetention: "long",且解析後端點同時支援快取鍵與長保留(compat.supportsLongCacheRetention,預設為 true;Together AI 與 Cloudflare 相容設定檔會停用)時,才會加入prompt_cache_retention: "24h"。cacheRetention: "none"會抑制兩個欄位。 - 快取命中會透過
usage.prompt_tokens_details.cached_tokens(Chat Completions)或input_tokens_details.cached_tokens(Responses API)呈現,並映射到cacheRead。 - Responses API payload 也可以暴露
input_tokens_details.cache_write_tokens,映射到cacheWrite,並依模型的快取寫入費率計價;省略該欄位的 Responses payload 會讓cacheWrite保持為0。OpenAI 的 Chat Completions API 未記載也不發出cache_write_tokens計數器,但 OpenClaw 仍會在那裡讀取prompt_tokens_details.cache_write_tokens,供回報獨立寫入計數的 OpenRouter 相容與 DeepSeek 風格代理使用。 - 實務上,OpenAI 更像初始前綴快取,而不是 Anthropic 的移動式完整歷史重用;請見下方 OpenAI 即時預期。
Amazon Bedrock
- Anthropic Claude 模型參照(
amazon-bedrock/*anthropic.claude*,加上 AWS system inference profile 前綴us./eu./global.anthropic.claude*)支援明確的cacheRetention透傳。 - 非 Anthropic Bedrock 模型(例如
amazon.nova-*)在執行階段會解析為無快取保留,不論設定了任何cacheRetention值。 - 不透明的 Bedrock application inference profile ARN(不包含
claude的 profile ID)也會解析為無快取保留,除非明確設定cacheRetention,因為無法僅從 ARN 推斷模型系列。
OpenRouter
對於openrouter/anthropic/* 模型參照,OpenClaw 會在 system/developer 提示區塊上注入 Anthropic cache_control 標記,但只有在請求仍指向已驗證的 OpenRouter 路由時才會如此(預設端點上的 openrouter,或任何解析到 openrouter.ai 的供應商/base URL)。將模型改指向任意 OpenAI 相容代理 URL 會停止此注入。
contextPruning.mode: "cache-ttl" 允許用於 openrouter/anthropic/*、openrouter/deepseek/*、openrouter/moonshot/*、openrouter/moonshotai/* 與 openrouter/zai/* 模型參照,因為這些路由可處理供應商端提示快取,不需要 OpenClaw 注入的標記。
來源:extensions/openrouter/index.ts(OPENROUTER_CACHE_TTL_MODEL_PREFIXES)。
OpenRouter 上的 DeepSeek 快取建構是盡力而為,可能需要數秒;立即跟進的請求仍可能顯示 cached_tokens: 0。請在短暫延遲後,用重複的相同前綴請求驗證,並使用 usage.prompt_tokens_details.cached_tokens 作為快取命中訊號。
Google Gemini(直接 API)
- 直接 Gemini transport(
api: "google-generative-ai")會透過上游cachedContentTokenCount回報快取命中,並映射到cacheRead。 - 符合資格的模型系列:
gemini-2.5*與gemini-3*(排除該前綴比對以外的 Live/preview 變體,例如gemini-live-2.5-flash-preview)。 - 在符合資格的模型上設定
cacheRetention時,OpenClaw 會自動為 system prompt 建立、重用並重新整理cachedContents資源,不需要手動 cached-content handle。TTL 對cacheRetention: "short"為300s,對"long"為3600s。 - 你仍可透過
params.cachedContent(或舊版params.cached_content)傳入既有 Gemini cached-content handle;明確 handle 會完全略過自動快取管理路徑。 - 這與 Anthropic/OpenAI 的提示前綴快取不同:OpenClaw 會為 Gemini 管理供應商原生的
cachedContents資源,而不是注入行內快取標記。
src/agents/embedded-agent-runner/google-prompt-cache.ts。
命令列介面 harness 供應商(Claude Code、Gemini 命令列介面)
發出 JSONL 用量事件的命令列介面後端(jsonlDialect: "claude-stream-json" 或 "gemini-stream-json")會經過共用用量剖析器,該剖析器可辨識多種欄位名稱變體,包括映射到 cacheRead 的普通 cached 計數器。當命令列介面的 JSON payload 省略直接 input-token 欄位時,OpenClaw 會將其推導為 input_tokens - cached。這只是用量正規化,不會為這些命令列介面驅動模型建立 Anthropic/OpenAI 風格的提示快取標記。
來源:src/agents/cli-output.ts(toCliUsage)。
其他供應商
如果供應商不支援上述任何快取模式,cacheRetention 不會產生效果。
System-prompt 快取邊界
OpenClaw 會在內部快取前綴邊界,將 system prompt 分割為穩定前綴與易變後綴。邊界以上的內容(工具定義、Skills 中繼資料、工作區檔案)會排序以在多輪對話中保持位元組完全相同。邊界以下的內容(例如HEARTBEAT.md、執行階段時間戳記、其他每輪中繼資料)可以變更,而不會讓已快取前綴失效。
關鍵設計選擇:
- 穩定的工作區專案脈絡檔案會排在
HEARTBEAT.md之前,因此心跳偵測變動不會破壞穩定前綴。 - 此邊界會套用到 Anthropic 系列、OpenAI 系列、Google 與命令列介面 transport shaping,因此所有受支援供應商都能受益於相同的前綴穩定性。
- Codex Responses 與 Anthropic Vertex 請求會透過邊界感知的快取 shaping 路由,使快取重用與供應商實際收到的內容保持一致。
- System-prompt fingerprint 會經過正規化(空白、行尾、hook 新增脈絡、執行階段能力排序),讓語意未變的提示在多輪對話中共用快取。
cacheWrite 激增,請檢查變更落在快取邊界以上或以下。將易變內容移到邊界以下(或使其穩定)通常可以解決問題。
OpenClaw 快取穩定性防護
- 綁定的 MCP 工具目錄會在工具註冊前以確定性方式排序(依 server name,再依 tool name),因此
listTools()順序變更不會擾動 tools block 並破壞提示快取前綴。 - 具有持久化 image blocks 的舊版工作階段會保留最近 3 個已完成回合完整不變(計算所有已完成回合,而不只是含 image 的回合)。較舊且已處理的 image blocks 會替換為文字標記,因此大量 image 的後續請求不會持續重新傳送龐大的陳舊 payload。
調校模式
混合流量(建議預設)
在你的主要 agent 上保留長生命週期基準線,並在突發型 notifier agents 上停用快取:成本優先基準線
- 設定基準線
cacheRetention: "short"。 - 啟用
contextPruning.mode: "cache-ttl"。 - 只對受益於溫熱快取的 agents,將心跳偵測維持在你的 TTL 以下。
即時迴歸測試
OpenClaw 會執行一個合併的即時快取迴歸 gate,涵蓋重複前綴、工具回合、image 回合、MCP 風格工具 transcript,以及 Anthropic 無快取 control。src/agents/live-cache-regression.live.test.tssrc/agents/live-cache-regression-runner.tssrc/agents/live-cache-regression-baseline.ts
Anthropic 即時預期
- 預期會透過
cacheWrite進行明確的暖機寫入。 - 預期在重複回合中幾乎完整重用歷史,因為 Anthropic 的快取控制會在對話中推進快取中斷點。
- stable、tool、image 與 MCP-style 路徑的基準下限是嚴格的回歸閘門。
OpenAI 即時預期
- 只預期
cacheRead;在 Chat Completions 上cacheWrite會維持0。 - 將重複回合的快取重用視為供應商特定的平台期,而不是 Anthropic 風格的移動式完整歷史重用。
- 下限僅供觀察(一旦未命中會記錄為警告,而不是測試失敗),源自
gpt-5.4-mini上觀察到的即時行為:
| 情境 | cacheRead 下限 | 命中率下限 |
|---|---|---|
| 穩定前綴 | 4,608 | 0.90 |
| 工具逐字稿 | 4,096 | 0.85 |
| 圖片逐字稿 | 3,840 | 0.82 |
| MCP-style 逐字稿 | 4,096 | 0.85 |
live-cache-regression-baseline.ts)落在:穩定前綴 cacheRead=4864、命中率 0.966;工具逐字稿 cacheRead=4608、命中率 0.896;圖片逐字稿 cacheRead=4864、命中率 0.954;MCP-style 逐字稿 cacheRead=4608、命中率 0.891。
斷言不同的原因:Anthropic 會公開明確的快取中斷點與移動式對話歷史重用,而 OpenAI 在即時流量中的有效可重用前綴,可能會比完整提示更早進入平台期。用單一跨供應商百分比門檻比較兩個供應商會造成誤判回歸。
diagnostics.cacheTrace 設定
| 鍵 | 預設值 |
|---|---|
filePath | $OPENCLAW_STATE_DIR/logs/cache-trace.jsonl |
includeMessages | true |
includePrompt | true |
includeSystem | true |
環境變數切換(一次性偵錯)
| 變數 | 效果 |
|---|---|
OPENCLAW_CACHE_TRACE=1 | 啟用快取追蹤 |
OPENCLAW_CACHE_TRACE_FILE=path | 覆寫輸出路徑 |
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這類階段性快照。 - 每回合快取 token 影響可在一般使用介面中看到:
cacheRead和cacheWrite會出現在/usage tokens、/status、工作階段使用量摘要,以及自訂messages.usageTemplate版面配置中。 - 對 Anthropic 而言,快取啟用時預期會同時看到
cacheRead和cacheWrite。 - 對 OpenAI 而言,快取命中時預期會看到
cacheRead;只有在包含cacheWrite的 Responses API 酬載上才會填入它(請參閱上方的 OpenAI)。 - OpenAI 也會傳回追蹤與速率限制標頭,例如
x-request-id、openai-processing-ms和x-ratelimit-*;可使用這些標頭進行請求追蹤,但快取命中計算仍應來自使用量酬載,而不是標頭。
快速疑難排解
- 多數回合都有高
cacheWrite:檢查是否有易變的系統提示輸入;確認模型/供應商支援你的快取設定。 - Anthropic 上有高
cacheWrite:通常表示快取中斷點落在每次請求都會變動的內容上。 - OpenAI
cacheRead偏低:確認穩定前綴位於最前面、重複前綴至少有 1024 個 token,且應共享快取的回合重用了相同的prompt_cache_key。 cacheRetention沒有效果:確認模型鍵符合agents.defaults.models["provider/model"]。- 帶有快取設定的 Bedrock Nova 請求:這是預期行為,這些請求會在執行階段解析為無快取保留。