Skip to main content
提示缓存使模型提供方能够在多轮交互中复用未更改的提示前缀(系统/开发者指令、工具定义以及其他稳定上下文),而不是在每次请求时都重新处理它。这可以降低长时间会话中重复上下文带来的 token 成本和延迟。 OpenClaw 会在上游 API 暴露这些计数器的地方,将提供方使用情况统一规范为 cacheReadcacheWrite。如果实时会话快照缺少缓存计数器,使用摘要(/status 及类似接口)会回退到上一条转录使用记录;非零的实时值始终优先于回退值。 提供方参考:

主要控制项

cacheRetention

值:"none" | "short" | "long"。可配置为全局默认值、按模型配置以及按代理配置。 "standard" 不是别名;请使用 "short" 作为提供方的默认缓存窗口。无效值会被忽略并给出警告。
合并顺序(后者覆盖前者):
  1. agents.defaults.params - 所有模型的全局默认值
  2. agents.defaults.models["provider/model"].params - 按模型覆盖
  3. agents.entries.*.params - 按代理覆盖,按代理 id 匹配
来源:src/agents/embedded-agent-runner/extra-params.tsresolveExtraParams)。

contextPruning.mode: "cache-ttl"

在缓存 TTL 窗口过期后,修剪旧的工具结果上下文,这样在空闲后发起的请求就不会重新缓存过大的历史记录。
完整行为请参见 会话修剪

心跳保温

Heartbeat 可保持缓存窗口处于温热状态,并减少空闲间隔后重复的缓存写入。可全局配置(agents.defaults.heartbeat)或按代理配置(agents.entries.*.heartbeat)。

提供方行为

Anthropic(直接 API 和 Vertex AI)

  • cacheRetention 支持 anthropicanthropic-vertex 提供方,以及在 cacheRetention 明确设置时,支持 amazon-bedrock 上的 Claude 模型和自定义 anthropic-messages 兼容端点。
  • 当未设置时,OpenClaw 会为直接 Anthropic(仅 anthropicanthropic-vertex 提供方)默认填充 cacheRetention: "short";其他 Anthropic 系路由需要显式指定值。
  • 原生 Anthropic Messages 响应会暴露 cache_read_input_tokenscache_creation_input_tokens,分别映射为 cacheReadcacheWrite
  • 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 分钟缓存。
来源:packages/ai/src/transports/anthropic-payload-policy.tsresolveAnthropicEphemeralCacheControlisLongTtlEligibleEndpoint)。

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 的负载还可能暴露 input_tokens_details.cache_write_tokens,映射为 cacheWrite,并按模型的缓存写入费率计费;省略该字段的 Responses 负载会将 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 系统推理配置文件前缀 us.eu.global.anthropic.claude*)支持显式 cacheRetention 透传。
  • 非 Anthropic 的 Bedrock 模型(例如 amazon.nova-*)在运行时会解析为不保留缓存,无论配置了什么 cacheRetention 值。
  • 模糊的 Bedrock 应用推理配置文件 ARN(不包含 claude 的配置文件 ID)也会在未显式设置 cacheRetention 时解析为不保留缓存,因为仅凭 ARN 无法推断模型家族。

OpenRouter

对于 openrouter/anthropic/* 模型引用,OpenClaw 会在 system/developer 提示块上注入 Anthropic 的 cache_control 标记,但前提是请求仍然指向一个已验证的 OpenRouter 路由(默认端点上的 openrouter,或任何解析到 openrouter.ai 的 provider/base URL)。如果把模型改指向任意 OpenAI 兼容代理 URL,则会停止注入。 contextPruning.mode: "cache-ttl" 允许用于 openrouter/anthropic/*openrouter/deepseek/*openrouter/moonshot/*openrouter/moonshotai/*openrouter/zai/* 模型引用,因为这些路由会在提供方侧处理提示缓存,而不需要 OpenClaw 注入标记。 来源:extensions/openrouter/index.tsOPENROUTER_CACHE_TTL_MODEL_PREFIXES)。 OpenRouter 上的 DeepSeek 缓存构建尽力而为,可能需要几秒钟;立即紧接着的后续请求仍可能显示 cached_tokens: 0。请在短暂延迟后使用相同前缀再次请求,并以 usage.prompt_tokens_details.cached_tokens 作为缓存命中信号进行验证。

Google Gemini(直接 API)

  • 直接 Gemini 传输(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 句柄。TTL 在 cacheRetention: "short" 时为 300s,在 "long" 时为 3600s
  • 你仍然可以通过 params.cachedContent(或旧版 params.cached_content)传入一个已存在的 Gemini cached-content 句柄;显式句柄会完全跳过自动缓存管理路径。
  • 这与 Anthropic/OpenAI 的提示前缀缓存不同:OpenClaw 为 Gemini 管理的是提供方原生的 cachedContents 资源,而不是注入内联缓存标记。
来源:src/agents/embedded-agent-runner/google-prompt-cache.ts

CLI-harness 提供方(Claude Code、Gemini CLI)

输出 JSONL usage 事件的 CLI 后端(jsonlDialect: "claude-stream-json""gemini-stream-json")会经过一个共享的 usage 解析器,该解析器识别多种字段名变体,包括一个普通的 cached 计数器并将其映射为 cacheRead。当 CLI 的 JSON 负载省略直接的输入 token 字段时,OpenClaw 会将其推导为 input_tokens - cached。这仅仅是 usage 规范化——不会为这些由 CLI 驱动的模型创建 Anthropic/OpenAI 风格的提示缓存标记。 来源:src/agents/cli-output.tstoCliUsage)。

其他提供方

如果某个提供方不支持上述任何一种缓存模式,cacheRetention 将不起作用。

系统提示缓存边界

OpenClaw 将系统提示拆分为一个稳定前缀和一个易变后缀,并在内部缓存前缀边界处进行划分。边界之上的内容(工具定义、技能元数据、工作区文件)会被安排为在各轮之间保持字节级完全一致。边界之下的内容(例如运行时时间戳和其他每轮元数据)可以变化,而不会使已缓存的前缀失效。 关键设计选择:
  • 稳定的工作区项目上下文文件会被排在易变的每轮元数据之前,因此常规变动不会破坏稳定前缀。
  • 该边界适用于 Anthropic 系列、OpenAI 系列、Google 和 CLI 的传输形态,因此所有受支持的提供方都能受益于同样的前缀稳定性。
  • Codex Responses 和 Anthropic Vertex 请求会通过感知边界的缓存形状进行路由,以便缓存复用与提供方实际接收到的内容保持一致。
  • 系统提示指纹会被规范化(空白字符、换行符、hook 添加的上下文、运行时能力顺序),因此语义上未变化的提示在各轮之间可以共享缓存。
如果在配置或工作区变更后看到意外的 cacheWrite 激增,请检查该变更是落在缓存边界之上还是之下。将易变内容移到边界下方(或使其稳定)通常可以解决该问题。

OpenClaw 缓存稳定性防护

  • 打包的 MCP 工具目录在工具注册之前会按确定性顺序排序(先按服务器名称,再按工具名称),因此 listTools() 顺序变化不会导致 tools 区块频繁变动并破坏提示缓存前缀。
  • 具有持久化图片块的旧会话会保留最近 3 个已完成轮次的完整内容(统计所有已完成轮次,而不只是包含图片的轮次)。较早且已处理过的图片块会被文本标记替换,这样包含大量图片的后续跟进就不会持续重新发送过期的大型负载。

调优模式

混合流量(推荐默认)

在主代理上保留长生命周期基线,在突发通知代理上禁用缓存:

以成本优先的基线

  • 将基线 cacheRetention 设为 short
  • 启用 contextPruning.mode: "cache-ttl"
  • 仅对能从预热缓存中受益的代理,将 heartbeat 保持在你的 TTL 以下。

实时回归测试

OpenClaw 运行一个组合式实时缓存回归门,覆盖重复前缀、工具轮次、图像轮次、MCP 风格工具转写,以及一个 Anthropic 无缓存对照。
  • src/agents/live-cache-regression.live.test.ts
  • src/agents/test-helpers/live-cache-regression-runner.ts
  • src/agents/live-cache-regression-baseline.ts
使用以下命令运行:
基线文件保存最近一次观测到的实时数值,以及测试所检查的、各提供方特定的回归下限。每次运行都会使用新的按运行分配的 session ID 和 prompt 命名空间,因此之前的缓存状态不会污染当前样本。Anthropic 和 OpenAI 的约束方式不同:Anthropic 的下限未达标会被视为硬回归(测试失败),而 OpenAI 的下限未达标则只会被监控(记录为警告,不会使运行失败)。它们不共享单一的跨提供方阈值。

Anthropic 实时预期

  • 预期通过 cacheWrite 明确写入预热。
  • 在重复轮次中预期几乎完整的历史复用,因为 Anthropic 的缓存控制会随着对话推进缓存断点。
  • 稳定、工具、图像和 MCP 风格通道的基线下限属于硬回归门槛。

OpenAI 实时预期

  • 预期仅有 cacheRead;在 Chat Completions 上 cacheWrite 保持为 0
  • 将重复轮次的缓存复用视为提供方特定的平台期,而不是 Anthropic 风格的完整历史复用。
  • 下限仅作监控(未达标会记录为警告,不会导致测试失败),这些数值依据 gpt-5.4-mini 的实时观测行为得出:
最近观测到的基线数值(来自 live-cache-regression-baseline.ts)为:稳定前缀 cacheRead=4864,命中率 0.966;工具转写 cacheRead=4608,命中率 0.896;图像转写 cacheRead=4864,命中率 0.954;MCP 风格转写 cacheRead=4608,命中率 0.891 为什么断言不同:Anthropic 暴露了明确的缓存断点以及会随着对话推进的历史复用,而 OpenAI 在实时流量中的有效可复用前缀可能会早于完整提示词进入平台期。将两家提供方都对齐到同一个跨提供方百分比阈值会产生误报回归。

diagnostics.cacheTrace 配置

enabled 默认为 false。否则,缓存跟踪会写入 $OPENCLAW_STATE_DIR/logs/cache-trace.jsonl,并默认包含消息、提示词文本和系统提示词。输出路径和负载包含内容的覆盖设置仅可通过环境变量控制,用于一次性调试。

环境变量开关(一次性调试)

需要检查什么

  • 缓存跟踪事件采用 JSONL 格式,包含分阶段快照,例如 session:loadedprompt:beforestream:contextsession:after
  • 每轮的缓存 token 影响会在常规使用界面中显示:cacheReadcacheWrite 会出现在 /usage tokens/status、会话使用摘要以及自定义的 messages.usageTemplate 布局中。
  • 对于 Anthropic,在缓存启用时,预期会同时出现 cacheReadcacheWrite
  • 对于 OpenAI,在缓存命中时预期会出现 cacheReadcacheWrite 仅会在包含它的 Responses API 负载中填充(见上方的 OpenAI)。
  • OpenAI 还会返回诸如 x-request-idopenai-processing-msx-ratelimit-* 之类的跟踪与速率限制标头;可使用它们进行请求跟踪,但缓存命中统计仍应来自 usage 负载,而不是来自标头。

快速故障排查

  • 大多数轮次中 cacheWrite 很高:检查是否存在易变的 system prompt 输入;确认模型/提供商支持你的缓存设置。
  • Anthropic 中 cacheWrite 很高:通常表示缓存断点落在每次请求都会变化的内容上。
  • OpenAI cacheRead 很低:确认稳定前缀位于最前面,重复前缀至少有 1024 个 token,并且在应共享缓存的轮次中复用了相同的 prompt_cache_key
  • cacheRetention 没有效果:确认模型键与 agents.defaults.models["provider/model"] 匹配。
  • 带有缓存设置的 Bedrock Nova 请求:这是预期行为——它们在运行时会解析为无缓存保留。
相关文档:

相关