Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

缓存机制深度对比:OpenCode vs Claude Code vs Pi Agent

Prompt Caching 已从可选优化变为必须工程化的核心能力。三大 AI 编码工具在缓存与上下文压缩上形成了三种截然不同的工程范式——理解它们的差异,直接影响长会话的 Token 成本和响应质量。 适合读者: 架构师 · 效率开发者 · 工程经理

文章概述

在 AI 编码工作流中,大部分 Token 被花在了重复内容上。每次 Agent 请求都携带系统指令、项目上下文、工具定义和对话历史前缀——这些内容在同一会话甚至跨项目中几乎不变。缓存和上下文压缩(Compaction)就是为了解决这个问题而设计的,但两者的工作方式和使用成本截然不同。

本文从“缓存 ≠ 压缩“这个核心洞察出发,分别分析三大工具的缓存和压缩实现——OpenCode 的三级缓存架构、Claude Code 的 5 级渐进压缩 Pipeline、Pi Agent 的极简可扩展 Compaction。然后提供每个工具中如何激活缓存的配置指南,以及围绕缓存能力的最佳开源项目和插件。最后,通过成本对比和趋势分析,帮助读者在不同场景下做出合理选择。

⏱ 时间有限?先读这些: 缓存 vs 压缩 → 各工具开启方式对比表 → 选型矩阵

缓存 ≠ 压缩:理解两套机制

这是理解整篇文章的第一原则。缓存和压缩做的是两件不同的事:

维度缓存(Prompt Caching)压缩(Compaction)
本质消除重复传输精简必要内容
副作用零副作用——缓存命中和未命中的输出一致有损——压缩后的信息是摘要,不是原始内容
成本影响命中时读价格 0.1x(Anthropic 90% 折扣)每次压缩消耗一次 LLM 调用
对质量的影响不影响输出质量摘要可能丢失细节
适用场景重复的系统指令、工具定义、固定前缀对话历史太长、工具输出过多
失败模式Cache Miss——退化为正常请求价格压缩过度——Agent 丢失关键上下文

核心关系:压缩是缓存前缀的天敌。压缩会修改消息结构,导致 cache key 变化,使之前缓存的全部失效(Cache Miss)。Cache-Aligned Compaction 的设计目标就是“如何压缩但不破坏缓存“——这个话题在后面各工具中会多次出现。


OpenCode:三级缓存 + 阶梯式治理

缓存架构

OpenCode 拥有三大工具中最完整的多级缓存体系。自 2026 年 5 月起,cache: "auto" 已成为 默认 行为(PR #26798),无需显式配置即可自动启用缓存。缓存直接在 opencode.json 中配置:

{
  "cache": {
    "session": {
      "enabled": true,
      "maxSize": 100000,
      "maxAge": "session"
    },
    "project": {
      "enabled": true,
      "maxSize": 500000,
      "maxAge": "24h",
      "patterns": ["**/*.md", "**/AGENTS.md", "**/package.json"]
    },
    "global": {
      "enabled": true,
      "maxSize": 2000000,
      "maxAge": "7d",
      "patterns": ["~/.opencode/global/**"]
    }
  }
}
层级范围命中率生命周期管理方式
L1 Session单次对话内~95%会话全程自动
L2 项目同一项目跨 Session~80%24h(可配)自动
L3 全局跨项目全局共享~60%7d(可配)手动标记

缓存断点(Breakpoints):用户通过注释语法手动标记可复用上下文片段:

#cache-breakpoint: project-rules
AGENTS.md 中定义的所有约束规则
#cache-breakpoint: end

断点生命周期:创建 → 引用 → 更新 → 失效。具体参见 → 提示词缓存机制

Compaction 机制

OpenCode 采用两层压缩:

  • 工具输出修剪(Prune):给旧消息打时间戳使其“不可见“(非物理删除,仍存数据库)。阈值:总工具输出 > 40K token。
  • LLM 摘要压缩:隐藏的专用 Compaction Agent 生成 5 段式摘要,压缩后自动重放最后用户消息——用户完全无感知。

溢出保护通过 compaction.reserved 控制预留缓冲区。具体触发阈值、微压缩策略和保真度实测数据,参见 → 上下文压缩与Token 预算

如何激活缓存

机制激活方式备注
三级缓存opencode.json 配置 cache自 2026-05 起 cache: "auto" 为默认;L1 无需配置
Compactioncompaction.auto: true(默认开启)可配置 reserved 缓冲区大小
系统提示拆分setCacheKey: true + splitSystemPrompt Provider 选项S1(稳定块)/ S2(动态块)分离,跨仓库缓存命中率从 0% → 97.6%(PR #14743)
Cache Stabilization环境变量 OPENCODE_EXPERIMENTAL_CACHE_STABILIZATION=1冻结日期 + 稳定指令,减少缓存抖动
1h TTL环境变量 OPENCODE_EXPERIMENTAL_CACHE_1H_TTL=15min → 1h 缓存 TTL,适合间歇工作模式
Prefix Preservation环境变量 OPENCODE_EXPERIMENTAL_COMPACTION_PRESERVE_PREFIX=true实验性,复用 Agent 前缀缓存,实测 99% cache hit
Cache-Aligned Compaction环境变量 OPENCODE_EXPERIMENTAL_CACHE_ALIGNED=true实验性,节省 ~90% Compaction 成本
自定义 Compaction Prompt环境变量 OPENCODE_EXPERIMENTAL_COMPACTION_PROMPT自定义摘要格式指令
Double-Buffercompaction.checkpointThresholdcompaction.swapThreshold~50% 时后台 Checkpoint,~75% 时 Swap
缓存断点Markdown 中 #cache-breakpoint 注释手动标记可复用片段
Cache Policy ObjectcachePolicy 配置项(2026-05)细粒度控制断点放置位置(tools/system/messages 边界)

相关开源项目与插件

项目/插件说明链接
DCP 插件OpenCode 插件,AI 驱动的深度上下文剪枝,与 Compaction 互补Dynamic Context Pruning Plugin
opencode主仓库文档含缓存配置指南和性能指标GitHub: anomalyco/opencode
TokenPilot(学术)Cache-Efficient Context Management for LLM Agents,arXiv 2606.17016arXiv:2606.17016
opencode-cache-hit社区 TUI 侧边栏插件,实时监控缓存命中率和 Token 趋势opencode-cache-hit
opencode-context-cache社区插件,基于 SHA256 的稳定缓存键 + 粘性 Sessionopencode-context-cache
prompt-cache-skills跨 13 种编码工具的 Prompt Caching 审计 Skill 套件prompt-cache-skills

Claude Code:5 级渐进压缩 + Prompt Caching 原生集成

缓存架构

Claude Code 的缓存哲学是“最便宜的先做,最贵的最后做“。与 OpenCode 不同,它没有独立的多级缓存架构——缓存完全依赖 Anthropic API 的 Prompt Caching,并在 Compaction 策略中深度集成 cache-aware 设计。

官方在 2026 年 4 月的博文 Prompt caching is everything 中详细阐述了这一设计理念,并介绍了 cache-safe forking 等技术细节。

Anthropic Prompt Caching 机制

参数
缓存读价格0.1x 基础输入价(90% 折扣)
缓存写价格(5min TTL)1.25x 基础输入价
缓存写价格(1h TTL)2x 基础输入价
缓存最小大小1,024 tokens(Sonnet/Haiku),2,048 tokens(Opus)
缓存 TTL5 分钟(每次命中刷新),可扩展至 1h
最大缓存断点数4 个/请求

Claude Code 通过 SYSTEM_PROMPT_DYNAMIC_BOUNDARY 将一个 __boundary__ 哨兵字符串插入系统提示,将指令分为:

  • 静态半(哨兵前):核心指令、工具描述、安全规则 → scope: 'global' 全局缓存
  • 动态半(哨兵后):MCP 指令、输出偏好、语言设置 → 不全局缓存

5 级渐进式压缩 Pipeline

层级触发条件操作Cache 影响
T1 Microcompact每 API 调用前保留最近 5 个工具结果,替换其余为标记清理Cache 友好:排队 cache_edits,服务端精确删除
T2 API-Native服务端自动移除旧 thinking/tool_use/tool_result 块零客户端开销
T3 Full Compaction~83.5%(167K/200K)9 段式结构化摘要 + cache-safe forking复用父会话 cache key
T4 Context Collapse~90% 利用率摘要存 collapse store,可逆保留原始消息
T5 Sub-agent极少见重型探索路由到子 Agent主会话稳定

cache-safe forking(T3 的关键创新):不修改父会话消息,而是 fork 出一个新分支复用自己的系统提示、工具定义和消息前缀——服务端看到相同的 cache key → hits。

如何激活缓存

机制激活方式备注
自动 Compaction默认开启,无需配置接近 200K 窗口上限自动触发
Manual Compaction/compact 命令可附带自定义压缩指令
Compaction APIcompact_20260112 API beta header最小 50K,默认 150K;程序化压缩控制
自定义摘要指令/compact 后加自然语言描述例如 /compact 重点保留架构决策和 API 设计
/cd 命令(2026-06)/cd <directory> 切换目录不重建 Prompt Cache,保持缓存前缀连续性
推理 Token 预算--effort 参数:low/medium/high/xhigh/max/ultracodeclaude --effort high
会话安全网maxTurns(最大交互轮次)通过 claude.json 配置
美元上限maxBudgetUsd通过 claude.json 配置
超时控制API_TIMEOUT_MS 等环境变量自定义 API 超时
CLAUDE.md 持久规则项目根目录创建 CLAUDE.md每轮请求重新注入,不因压缩丢失
会话持久化sessionId 参数跨多次 query() 保留上下文
Agent checkpointing(Beta)Claude Code v2.1.128+会话状态序列化与恢复
自定义网关缓存修复Claude Code v2.1.181+修复了自定义网关上 Prompt Caching 的兼容性问题

相关开源项目与插件

项目/插件说明链接
claude-code官方 CLI(闭源),缓存机制通过 Anthropic API 原生实现GitHub: anthropics/claude-code
anthropic-caching-examplesAnthropic 官方的 Prompt Caching 示例代码GitHub: anthropics/anthropic-cookbook
TokenPilot缓存优先的 Agent 上下文管理器(学术研究)arXiv 2606.17016
Don’t Break the Cache(论文)长周期 Agent 任务中 Prompt Caching 的实证评估arXiv 2601.06007
@anthropic-ai/sdkAnthropic SDK,cache_control 参数支持自定义缓存断点Claude SDK for TypeScript
claude-code-extensions社区扩展集合,包括 PreCompact Hook 示例GitHub: nodnarbnitram/claude-code-extensions

Pi Agent:极简 Compaction + Extension 自定义

缓存架构

Pi Agent 的设计哲学是“极简核心,强力扩展“——它没有内置的多级缓存,也不依赖 Provider 级 Prompt Caching。缓存管理完全通过 Compaction 实现,而 Compaction 行为可通过 Extension API 完全自定义。

Compaction 核心流程

Find Cut Point → Extract Messages → Generate Summary → Append Entry → Reload

整个过程由 pi-agent-core/harness/compaction/compaction.ts 中的 summarizeWithBudget() 驱动:

  1. Find Cut Point:从最新消息向前遍历,累积 token 估算直到 keepRecentTokens(默认 20K)
  2. Extract Messages:收集上一次保留边界到切点之间的消息
  3. Generate Summary:调用 LLM 生成结构化摘要,传递上一次摘要作为迭代上下文
  4. Append Entry:保存 CompactionEntry(含摘要和 firstKeptEntryId
  5. Reload:Session 重载,使用摘要 + firstKeptEntryId 之后的消息

Provider 模型缓存成本定义

Pi Agent 的 Provider 模型定义中可指定缓存成本字段:

// Provider 定义中的缓存字段
{
  "model": "claude-sonnet-4",
  "pricing": {
    "input": 3.0,
    "output": 15.0,
    "cacheRead": 0.3,   // 缓存读价格(0.1x)
    "cacheWrite": 3.75  // 缓存写价格(1.25x)
  }
}

这样即使 Pi Agent 不管理缓存,也能在 Token 成本统计中准确反映实际花费。

如何激活缓存

机制激活方式备注
自动 Compactionsettings.jsonenabled: true默认开启
手动 Compaction/compact [prompt]可附带自定义压缩指令
预留 TokenreserveTokens: 16384为 LLM 响应预留
保留最近上下文keepRecentTokens: 20000不被摘要的最近 token 数
Extension 自定义压缩监听 session_before_compact 事件可替换默认压缩行为
切换摘要模型Extension 中设置压缩专用模型例如用 Gemini Flash 做摘要
Context FilesAGENTS.md / SYSTEM.md / APPEND_SYSTEM.md多级加载,不因压缩丢失
Session TreeFork / Clone / Tree 导航分支上下文隔离

完整配置示例~/.pi/agent/settings.json):

{
  "compaction": {
    "enabled": true,
    "reserveTokens": 16384,
    "keepRecentTokens": 20000
  },
  "provider": {
    "primary": { "model": "claude-sonnet-4" },
    "compaction": { "model": "gemini-2.0-flash" }
  }
}

上述配置中的 compaction.model 并非 Pi Agent 内置选项,但可通过 Extension 自定义压缩 实现——见下方示例。

自定义压缩 Extension 示例

// custom-compaction.ts — 替换默认压缩,使用更便宜的模型
import { Extension, AgentSession } from '@earendil-works/pi-coding-agent'

export default {
  name: 'custom-compaction',
  onSessionBeforeCompact: async ({ reason, session }) => {
    // reason: "manual" | "threshold" | "overflow"
    console.log(`Compaction triggered: ${reason}`)
    
    // 替换压缩器为 Gemini Flash,降低摘要成本
    session.compressor = new CustomCompressor({
      model: 'gemini-2.0-flash',
      temperature: 0.3,
      maxTokens: 2048
    })
  }
}

相关开源项目与插件

2026 年上半年 Pi Agent 的 Compaction 扩展生态经历了爆发式增长,以下是主要的社区扩展:

项目/插件说明链接
piPi Agent 本体(MIT 开源),核心在 packages/coding-agent/harness/compaction/GitHub: earendil-works/pi
pi-extension-examples官方 Extension 示例,含自定义 Compaction 实现pi Agent 仓库 examples/extensions/
custom-provider-template自定义 Provider 模板,包含 cacheRead/cacheWrite 成本字段pi Agent 仓库的custom-provider.md
pi-better-compact基于动态规划的缓存感知 Compaction,带经济学决策模型GitHub: takltc/pi-better-compact
pi-smart-compact验证导向的智能压缩扩展(周下载 341+)GitHub: pipinit/pi-smart-compact
pi-vcc零 LLM 调用的算法化压缩(VCC 技术),压缩率 35-99%GitHub: anotherautomaton/pi-vcc
pi-live-compaction流式 Compaction 扩展,支持 Liquid 模板GitHub: hyakuren/pi-live-compaction
pi-slipstream-compact带验证步骤的 Compaction 扩展,压缩后自动审查GitHub: OrestesK/pi-slipstream-compact
pi-lcm分层 DAG 压缩,SQLite 持久化压缩历史GitHub: killian311/pi-lcm
pi-opencode-go-cache将 OpenCode CLI 等效缓存引入 Pi Agent 的 Go ProviderGitHub: dpwdec/pi-opencode-go-cache
gondolinPi 的沙箱隔离方案(可选),不影响缓存但保护上下文GitHub: earendil-works/gondolin

成本对比与选型建议

Provider Prompt Caching 定价对比(2026)

截至 2026 年中,主流 LLM Provider 的 Prompt Caching 定价已趋于标准化,但策略差异显著:

Provider缓存读折扣缓存写成本最小缓存大小TTL管理方式
Anthropic0.1x(90% 折扣)1.25x(5min)/ 2x(1h)1,024 tokens5min / 1h手动 cache_control 断点
OpenAI0.5x(50% 折扣)免费1,024 tokens5min(自动刷新)自动,无需手动断点
Google Gemini0.75x(25% 折扣)存储费按量计4,096 tokens可变(按上下文)显式缓存对象管理
DeepSeek~0.75x(25% 折扣)同基础价64 tokens 粒度磁盘持久化自动,极细粒度
Qwen不支持不支持N/AN/A

Anthropic 的高读写价差(0.1x vs 1.25x)意味着 缓存命中率是成本控制的最大杠杆。对比之下,OpenAI 的自动缓存策略虽然免去手动断点,但 5min TTL 短、无法手动管理,在大规模场景下方案不够灵活。

典型场景 Token 成本对比

场景OpenCodeClaude CodePi Agent
短 Session(5 轮)三级缓存节省 60-70% 重复内容0.1x 缓存读 + Microcompact上下文小,基本无需 Compaction
长 Session(50 轮)Compaction + Cache-Aligned(实验性)节省 ~90%5 级渐进 + 缓存读 0.1x,综合最优依赖 Extension 自定义压缩
跨项目共享L3 全局缓存(7d TTL)无跨项目缓存无跨项目缓存
本地模型不依赖 Provider 缓存,Compaction 成本仅 LLM 摘要仅支持 Anthropic不依赖 Provider 缓存

选型决策矩阵

场景推荐工具理由
长 Session 成本敏感Claude CodePrompt Caching 原生,5 级渐进保证缓存命中率,性价比最优
多模型灵活切换OpenCode75+ Provider,Cache-Aligned Compaction 跨模型工作
嵌入式 / 极致定制Pi AgentExtension 完全自定义压缩行为
本地模型 / 预算有限OpenCode 或 Pi不依赖 Provider 级缓存
开源 / 研究需求Pi Agent 或 OpenCode均 Apache 2.0/MIT 开源,源码可读

跨工具通用最佳实践

  1. 先命缓存,再压缩——缓存消除重复传输(零副作用),压缩精简必要内容(有损)。优化顺序:先确保缓存命中率达标(>80%),再考虑压缩策略。

  2. 在自然断点手动 /compact——比自动压缩更可控。任务完成一个阶段后手动压缩,避免 Agent 在任务中间被截断。

  3. 监控缓存命中率——低于 60% 说明配置有问题。对于 Anthropic 用户,检查是否有太多动态内容破坏缓存前缀。

  4. 保持配置文件简洁——CLAUDE.md 或 AGENTS.md 越稳定,缓存命中率越高。频繁变动的配置文件是缓存的最大杀手。

  5. 理解 TTL 的成本含义——Anthropic 5min TTL 意味着连续工作比间歇工作更便宜。长时间中断后第一次请求缓存未命中需交全价。


趋势:Cache-Aligned Compaction 成为共识

2026 年的重要趋势是,三大工具在缓存意识上趋于一致:

  • OpenCode(2026-04)实验性推出 Cache-Aligned Compaction(PR #25100),通过保持消息序列化与普通请求一致、仅在末尾追加摘要指令来复用缓存前缀
  • OpenCode(2026-05)进一步将 cache: "auto" 设为默认(PR #26798),并推出系统提示拆分(PR #14743),跨仓库缓存命中率从 0% 提升至 97.6%
  • Claude Code 从设计之初就采用 cache-safe forking,Full Compaction 时复用父会话缓存 key;2026 年 4 月正式发布 Prompt caching is everything 设计文档
  • Pi Agent 的 Extension 架构允许社区自行实现 cache-aware 压缩策略,2026 年上半年已涌现 7+ 个专业 Compaction 扩展

底层原因:随着 Anthropic/OpenAI/Google 等 Provider 的 Prompt Caching 定价逐步标准化(读 0.1x vs 写 1.25x),缓存命中率直接决定了 AI 编码工具的实际运营成本。不 cache-aware 的 Compaction 会破坏缓存前缀,导致每次压缩后都需重新缓存——成本从 0.1x 涨回 1x,差距可达 10 倍。

可以预见,Cache-Aligned 设计将在 2026 年底前从“实验性特性“升级为所有 AI 编码工具的标准特性。未来读者在评估编码工具时,缓存命中率和 Cache-Aligned 设计将与模型能力、工具生态并列为核心决策维度。

常见反模式

只看缓存策略忽略自身场景

现象:阅读本文后直接选择“缓存策略最强的工具“做技术选型,不考虑自己的项目规模、团队习惯和工具生态。

原因:把“缓存能力“当成了选型的唯一维度。

对策:缓存策略只是 AI 编码工具评估的维度之一。工具选型应综合考虑模型能力、工具生态、团队已有的工具链、迁移成本和缓存策略。缓存再强的工具如果模型质量不满足需求,也是本末倒置。

认为缓存策略是静态的

现象:选定工具后,使用默认缓存配置不再调整,认为“默认的就是最优的“。

原因:忽略了项目规模增长和任务类型变化对缓存策略的影响。

对策:缓存策略需要随着项目演进动态调整。项目从 10K 行增长到 100K 行后,缓存模式可能需要从 OpenCode 的 Lazy Write 切换到 Full Compaction。每季度审查一次缓存配置。

忽视 Cache-Aligned 的成本含义

现象:知道 Cache-Aligned 设计是好的,但不理解它为什么直接决定了运营成本。

原因:把“缓存命中率“当作纯技术指标,没有将其与 API 调用成本关联。

对策:理解 Prompt Caching 的定价模型——命中缓存的读取成本(0.1x)远低于未命中的写入成本(1.25x)。Cache-Aligned 设计的核心价值是让每次压缩不破坏缓存,相当于保持运营成本在低位。评估工具时,可以问“它的 Compaction 是 cache-aware 的吗“。

常见错误与陷阱

跨工具缓存策略对比忽略版本差异

场景:用 OpenCode 2025 年的缓存策略(未优化)和 Claude Code 2026 年的缓存策略(已优化)做对比,得出错误的结论。

后果:选了错误的工具,或者因为过时的信息否定了某个正在改进的工具。

预防:对比时标注工具的版本号和发布时间。缓存策略的迭代速度很快——6 个月前的数据可能已经完全失效。

缓存命中率数据未归一化

场景:对比两个工具的缓存命中率时,没有控制变量——测试的任务类型、项目规模、模型不同。

后果:得到“工具 A 命中率 80%,工具 B 命中率 60%,所以工具 A 更好“的错误结论。

预防:对比缓存命中率时需要控制变量——相同的测试任务、相同的项目、相同的模型。数据归一化后才具有可比性。

忽视 Multi-layer Caching 的整体收益

场景:只关注 Prompt Caching(L3 层)的命中率,忽略了 L1/L2 层的缓存贡献。

后果:认为某一层命中率低就等于整体缓存策略差。

预防:评估缓存策略时应看整体成本和延迟,而非某一层的命中率。OpenCode 的 Multi-layer Caching 中,L1 适合短 Session、L2 适合项目级知识、L3 适合长 Session。三层协同才能最大化缓存收益。

适用场景与限制

缓存策略对比的最佳场景

  • 在 OpenCode、Claude Code、Pi Agent 之间做技术选型
  • 理解不同工具在缓存和压缩方面的架构差异
  • 优化当前工具的缓存配置以降低运营成本

缓存策略对比的局限

  • 工具版本迭代快:本文的对比基于特定版本的实现,半年后可能不再准确
  • 测试环境差异:缓存命中率受项目结构、代码变更频率、任务类型的影响很大
  • 定价模型持续变化:各 Provider 的 Prompt Caching 定价策略仍在快速迭代

什么时候不需要关注缓存策略

短期项目、Token 消耗在预算控制范围内的团队、或使用提供商自带优化(如 Anthropic 的 Prompt Caching 自动生效)的场景下,了解缓存原理就够了,不需要做深度优化。

关联章节