省 Token:用 SmartCompact 在「提交/测试绿」时压缩 Claude Code 会话

7 次阅读 0 点赞 0 评论 12 分钟原创技术教程

原生 compact 常拖到窗口快满、还卡在任务做到一半。开源插件 SmartCompact 在上下文过默认 20 万 token 后,只在提交、测试绿、任务收口等停顿处压缩,并靠进度笔记接上现场。据作者测试,长会话成本约降 7%~44%。本文按官方 README 写清 Claude Code / Pi / Codex 安装、参数与避坑,并和 Headroom「压内容」区分开「压时机」。

#SmartCompact #省Token #Claude Code #Codex #上下文压缩 #AI Agent #开源工具

省 Token:用 SmartCompact 在「提交/测试绿」时压缩 Claude Code 会话

长会话写代码时,真正烧钱的往往不是「模型想得久」,而是每一步都要把整段历史再读一遍。上下文越长,下一步越贵。

Claude Code、Codex、Pi 都有原生自动压缩,但它们大多等到窗口快满才动手——Claude Code 接近约 100 万 token,Codex 可配到约 80 万——而且不挑时机,常常卡在你改到一半、测试还红的时候。压完之后模型要重新摸清现场,既费钱又容易丢细节。

开源插件 SmartCompact(MIT)换了一个思路:上下文过线之后,只在「做完一件事」的停顿处压缩——比如刚提交、测试刚绿、任务刚收口。据作者测试报告,在 18~60 个连续开发任务上,成本约降 7%~44%,隐藏验收基本不掉;最长一组(60 任务)自称约 −44%。下面按官方 README 把安装、参数和避坑写清楚。

数字均为仓库 README / TEST-REPORT 自述,小样本、单一代码库,请标「据作者测试」,勿当普适财报。

它和「压输出 / 压检索」不是同一刀

如果你已经在用 RTK、squeeze、Headroom 一类工具,可以把省 token 拆成几层:

层 在干什么 典型工具
少搜 / 少读 别把无关文件整段塞进上下文 ColGrep 等
压工具输出 git / ls / cat 先压缩再给模型 RTK、squeeze
压往返 少空转、少重复确认 tokenSaver 等
压时机 别在任务做到一半才 compact SmartCompact

749《Headroom 实战》 讲的是「上下文怎么压得更短」;本文讲的是「什么时候压」。两件事叠在一起,长会话账单才会明显下来。

核心规则(三分钟看懂)

据官方中英文 README,SmartCompact 支持 Claude Code(CLI + 桌面)、Pi、Codex CLI:

  1. 允许压缩线(默认 20 万 token)
    没过这条线:插件不起作用,也没有额外开销。
    过了之后:只要「上次压缩以来做过完一件事」,就在本轮结束时压。

  2. 什么叫「做完一件事」
    识别 agent 跑过的命令:真实成功的 git commit、测试通过、任务完成等都算。
    一轮结束本身就是停顿点——不必非等到「下一轮再提交」才压,否则多半只是多花钱。

  3. 绝不在做到一半时压
    只在一轮结束时判断;测试失败、构建红、连续报错、后台任务还在跑时先等着。

  4. 宽限线(允许线 × 1.3,默认约 26 万)
    一直等不到合适时机、上下文过了宽限线,就在一轮结束时兜底压缩。

  5. 进度笔记接上
    改过的文件、最近提交与测试结果、模型用 checkpoint 记下的决定,压缩后补回给模型,减少「压完两眼一抹黑」。

  6. 预计腾不出足够空间就不压(默认最少腾出约 6 万 token),避免刚压完又立刻再压。

安装(按你用的 Agent 选)

Claude Code(需 2.1.295 及以上)

在 Claude Code 里执行:

text 复制代码
/plugin marketplace add coffeecoproject/SmartCompact
/plugin install smartcompact@smartcompact

装好后新开会话生效。插件会把原生自动压缩线调到宽限线附近;当前会话若要暂时退回原生行为,用:

text 复制代码
/smartcompact pause

恢复:

text 复制代码
/smartcompact resume

看三条线、识别到的阶段节点和成本估算:

text 复制代码
/smartcompact

或 /smartcompact report。

卸载:

text 复制代码
/plugin uninstall smartcompact@smartcompact

Pi

bash 复制代码
pi install npm:smartcompact

默认在一轮结束(agent_settled)时,挑「刚做完一件事」的时机压缩。若你把 reserveTokens 调大、让 Pi 原生压缩提前,插件会在那个点按工作状态决定是否推迟。

卸载:pi remove npm:smartcompact。

Codex CLI(需 0.162+,以及 Node.js 22.18+)

bash 复制代码
codex plugin marketplace add coffeecoproject/SmartCompact
codex plugin add smartcompact@smartcompact

下次启动 Codex 时,按提示信任插件的 4 个 hook。hook 会自己找 Node.js 22.18+(PATH / nvm / Homebrew,也可用环境变量 SMARTCOMPACT_NODE);找不到就什么都不做。

更新:

bash 复制代码
codex plugin marketplace upgrade smartcompact
codex plugin add smartcompact@smartcompact

若以前用过仓库里的 node scripts/codex.ts install,先在那份克隆里跑一次 node scripts/codex.ts uninstall,避免 hook 跑两遍。

卸载:codex plugin remove smartcompact@smartcompact。

Codex 注意: hook 不能推迟「一轮中间」的压缩。插件在一轮结束时判断,需要压时通过 Codex 共享后台服务在会话空闲时发起。codex exec 默认不走共享后台;Codex App(ChatGPT.app)目前也走不了——这两种情况下插件主要补进度笔记,压缩仍跟原生规则。想加兜底,可在 config.toml 顶部配置 Codex 自带的 model_post_turn_compact_threshold_percent(例如可用窗口约 87.2 万时设 31,约 26 万;详见官方测试报告)。

可调参数

参数 默认 含义
允许压缩线 200000 超过它、且做过完事后,在一轮结束时压
宽限倍数 1.3 超过「允许线 × 倍数」时不再死等「刚做完」
最少腾出空间 60000 预计腾不出这么多就不压

配置入口:

  • Claude Code:插件选项 allowLineTokens、graceFactor、minFreedTokens(留空用默认)
  • Pi:--smartcompact-allow-line、--smartcompact-grace、--smartcompact-min-freed
  • Codex:环境变量 SMARTCOMPACT_ALLOW_LINE、SMARTCOMPACT_GRACE、SMARTCOMPACT_MIN_FREED

日常长会话先用默认即可;若你的项目动不动就过 30 万上下文,再考虑略抬允许线,避免压得太勤、模型反复「重新熟悉代码」(这部分开销官方已计入成本对比)。

作者测试怎么读(别只盯 −44%)

据仓库结果表(同一代码库、连续开发任务,装与不装各跑多次;验收靠模型看不到的隐藏测试):

平台(模型) 原生压缩点 成本(据作者) 验收 记忆题
Codex(gpt-6-astra) 80 万 −19% 两组都 18/18 两组都 54/54
Pi(gpt-5.5) 约 25.6 万 −11%~−22% 两组都 18/18 原生 51/54,插件 53/54
Claude Code(Haiku 5.5,30 任务) 接近 100 万 −7%(波动大) 两组都 30/30 两组都 90/90
Claude Code(Haiku 5.5,60 任务) 接近 100 万 −44% 原生 59~60/60,插件 60/60 原生 180/180,插件 174/180

读法建议:

  • 会话越长、原生压得越晚,省得越多;短会话过不了 20 万,插件等于没开。
  • 隐藏验收在报告里整体稳住;最长一组记忆题少对了 6 道(180 题里),说明随口交代的细节仍可能丢——重要约束请写进文件或让模型 checkpoint。
  • 成本按各家价格折成「缓存读取 token 当量」,且已包含「压完后重新熟悉代码」的请求。

实战建议:接到工具站 / 计算器长会话里

我自己日常用 Claude Code / Codex 改工具站,常见套路是:规格 → 改代码 → 跑测 → 提交 → 下一刀。正好对应 SmartCompact 的「完成信号」。

可执行 checklist:

  1. 装插件,新开一条长会话(旧会话不会自动带上 Claude Code 插件)。
  2. 让 agent 养成「小步提交」:功能可跑就 git commit,而不是攒一大包再压——完成信号越清晰,压缩时机越好。
  3. 测试命令别乱接管道:接了 | tail 又没开 pipefail 时,退出码不可信,不算测试结果(官方 FAQ)。
  4. 关键决定写进 checkpoint / 仓库文档:进度笔记只记文件、提交、测试和模型主动记下的决定;用户随口说的「别动支付回调」一类,压完可能淡。
  5. Claude Code 子进程注意环境变量:插件通过 CLAUDE_CODE_AUTO_COMPACT_WINDOW 调原生压缩点,从该会话拉起的 claude -p / 脚本会继承;若子进程不该提前压,启动前去掉该变量。
  6. 用 /smartcompact report 对照账单:看识别到了哪些阶段节点、估算省了多少,再决定要不要改允许线。

避坑速查

现象 可能原因 处理
装了没感觉 会话未过 20 万;或仍在旧会话 新开会话;先确认上下文规模
测试绿了却不认 管道吞了退出码 避免无 pipefail 时用管道接 tail 当验收
压完模型「失忆」 随口细节未进笔记 重要约束写进仓库 / checkpoint
Codex 似乎只补笔记不压 codex exec / App 不走共享后台 按 README 配 model_post_turn_compact_threshold_percent
Claude 子进程压缩点怪 继承了 CLAUDE_CODE_AUTO_COMPACT_WINDOW 子进程启动前 unset
hook 跑两遍(Codex) 旧 scripts/codex.ts install 残留 先 uninstall 再走官方 plugin 安装

总结

SmartCompact 不教你「怎么把上下文挤得更短」,它教你别在手术做到一半时关灯。允许线以下零打扰,过线后等提交 / 测试绿 / 任务收口再压,宽限线兜底,再用进度笔记把现场接上。

若你已经在用 Headroom、RTK 压内容和输出,再叠这一层「压时机」,长会话的账单和体验通常会一起好转。安装以官方仓库为准:coffeecoproject/SmartCompact;效果数字请始终标注「据作者测试报告」。


项目地址:coffeecoproject/SmartCompact(MIT)

最后更新:2026-10-15T15:37:15

评论 (0)

发表评论

blog.comments.form.loading
0/500

暂无评论,快来发表第一条评论吧!