omp packages

smartcompact0.1.8

Compact long agent sessions earlier, at a finished piece of work, to cut cost without losing results (Claude Code, pi, Codex)

ls02155419 Published 2 hours ago MIT ~319 downloads/mo

Untested on omp

This is a pi package. No one has reported whether it works on omp yet. If you try it, add your result below.

Did it work for you?

Result

One report per person. A new report replaces your old one.

Reports 0

No reports yet.

Readme

SmartCompact

English · 中文

npm GitHub stars License

90 秒看懂 SmartCompact(视频)

▶ 90 秒动画介绍(点击图片播放)

SmartCompact 让编程 agent 的长会话早点压缩,挑在做完一件事之后的停顿处。 在 18~60 个连续开发任务上,成本降低 7%~44%,隐藏验收测试没有损失,会话越长省得越多。最长的一组(60 个任务,原生组上下文到 82 万~96 万)里,很早之前随口提到的细节,180 道记忆题少答对 6 道(测试报告)。

agent 每发一次请求,都要把整段上下文重新读一遍,上下文越长,每一步越贵。原生的自动压缩要等到快满了才触发(Claude Code 接近 100 万,Codex 可以配到 80 万),而且不看时机,常常发生在一件事做到一半的时候。SmartCompact 支持 Claude Code(终端和桌面 App)、Pi 和 Codex 命令行:

  • 挑对时机压缩。 上下文超过允许压缩线(默认 20 万)以后,只要上次压缩以来做完过一件事(一次提交、测试通过、任务完成),之后又没开始改文件,就在这一轮结束时压缩。
  • 不在做到一半时压缩。 只在一轮结束时判断,从不在一轮中间主动压缩;测试失败、构建失败或连续报错时先等着。还要等你空闲 3 分钟没发消息才压,来回讨论时不会被打断。
  • 不设自己的上限。 一直没做完一件事,多半是在干一件大活,这时正需要大上下文。插件不去打断,压缩按平台原生规则来,和没装插件时一样。
  • 用进度笔记接上。 改过的文件、最近的提交和测试结果、记下的用户要求和决定,以及模型最后一条回复,压缩后补回给模型。
  • 不做白费的压缩。 预计腾不出足够空间时不压缩,避免刚压缩完又压缩。

实验结果

同一个代码库、连续 18~30 个开发任务(后面的任务会修改前面任务的结果),每个平台装与不装各跑 3 次。验收由脚本跑模型看不到的隐藏测试;每轮结束问几道记忆题,包括很早之前随口提到的细节。

平台(模型) 原生压缩点 成本 任务验收 记忆题
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

成本按各家价格比例折算成"缓存读取 token 当量"。原生压缩得越晚、会话涨得越快,省得越多;会话没超过 20 万时插件不起作用,也没有额外开销。压缩后模型要多花一些请求重新熟悉代码,这部分已计入上面的成本。样本小,只用了一个代码库和一种任务类型;方法、数据和局限见测试报告。

安装

Claude Code(2.1.295 及以上)

/plugin marketplace add coffeecoproject/SmartCompact
/plugin install smartcompact@smartcompact

装好后新开会话生效。/smartcompact pause 可以暂停当前会话的插件。

Pi

pi install npm:smartcompact

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

Codex 命令行(0.162 及以上,Node.js 22.18 及以上)

codex plugin marketplace add coffeecoproject/SmartCompact
codex plugin add smartcompact@smartcompact

下次启动 Codex 时按提示信任插件的 4 个 hook。hook 会自己找 22.18 及以上的 Node.js(PATH、nvm、Homebrew,也可以用 SMARTCOMPACT_NODE 指定),找不到就什么都不做。更新时运行 codex plugin marketplace upgrade smartcompact,再执行一次上面的 codex plugin add。以前用 node scripts/codex.ts install 装过的,先在那份仓库里运行一次 node scripts/codex.ts uninstall,避免 hook 运行两遍。

Codex 的 hook 不能推迟一轮中间的压缩,所以插件在一轮结束时判断,需要压缩就通过 Codex 的共享后台服务(交互界面默认会用它)在会话空闲时发起。codex exec 默认不走共享后台服务,Codex App(ChatGPT.app)目前走不了,这时插件只补回进度笔记,压缩仍按 Codex 原生规则。想让它们早点压缩,可以在 config.toml 顶部加上 Codex 自带的 model_post_turn_compact_threshold_percent:上下文超过可用窗口的这个百分比时,在一轮结束后压缩(窗口 87.2 万时设 31,约 26 万;详见测试报告)。

参数

参数 默认 含义
允许压缩线 200000 超过它、做完过一件事后,在一轮结束时压缩
最少腾出空间 60000 预计腾出的空间少于它时不压缩
空闲等待 180 决定压缩后,等你空闲这么多秒才压;期间发了消息或命令就取消
  • Claude Code:插件配置项 allowLineTokens、minFreedTokens、compactIdleSeconds,留空用默认值。
  • Pi:命令行开关 --smartcompact-allow-line、--smartcompact-min-freed、--smartcompact-idle-seconds。
  • Codex:环境变量 SMARTCOMPACT_ALLOW_LINE、SMARTCOMPACT_MIN_FREED、SMARTCOMPACT_IDLE_SECONDS。

查看效果

  • Claude Code 和 Pi:/smartcompact(或 /smartcompact report)查看允许压缩线、原生压缩点、识别到的阶段节点和成本估算;/smartcompact pause / resume 暂停或恢复当前会话。模型还可以调用 checkpoint 工具记下用户的要求和决定,压缩后和进度笔记一起补回。
  • Codex:node ~/.codex/plugins/cache/smartcompact/smartcompact/<版本>/adapters/codex/report.ts <会话 ID>(Node.js 22.18 及以上),记录在 ~/.codex/smartcompact/。

常见问题

怎么判断"做完一件事"? 靠识别 agent 执行的命令。看的是上次压缩以来有没有做完过一件事,不要求正好在这一轮:一轮结束本身就是停顿点,非要等下一次提交,多半只是多花钱。但做完之后又开始改文件,就算在做下一件事,要等它做完。提交只要真的执行了 git commit 且工具调用没报错就算;测试命令接了管道(| tail)又没开 pipefail 时退出码不可信,不算测试结果。

压缩后模型会不会忘事? 随口提到的细节有时会丢。进度笔记只记文件、提交、测试和模型主动记下的要求和决定;用户要求单独一栏,不会因为后来记的内容多了被挤掉,超过 30 条才丢最旧的。用户在对话里随口交代的细节,靠压缩时要求摘要原样保留用户说过的具体信息。Pi 上这样做明显减少了丢失,但不能保证不丢。

会改 Claude Code 自己的设置吗? 不会,原生自动压缩点保持原样(接近 100 万)。0.1.2 及以前的版本会在会话里设置 CLAUDE_CODE_AUTO_COMPACT_WINDOW,把原生压缩点挪到约 26 万(子进程也会继承),并且到了那里不等做完一件事也压缩。0.1.3 去掉了这两点:大活不会再在固定大小处被打断。升级前就开着的会话还留着旧设置,新开一个会话就没有了。

上下文窗口小的模型有用吗? 只有原生压缩点比 20 万高出一截时才有用。窗口只有 20 万时,原生先压(Claude Code 约 16.7 万),插件根本不会出手。Codex 默认窗口 27.2 万,原生约 24.5 万压,插件只有 20 万~24.5 万这一小段可用,省得不多,除非把 model_auto_compact_token_limit 调高。允许压缩线可以调低(allowLineTokens、--smartcompact-allow-line、SMARTCOMPACT_ALLOW_LINE),但调低后的效果没有评测过。

怎么卸载?

  • Claude Code:/plugin uninstall smartcompact@smartcompact。
  • Pi:pi remove npm:smartcompact。
  • Codex:codex plugin remove smartcompact@smartcompact。

开发

sh scripts/check.sh

运行结构校验、core 依赖边界检查和全部测试。目录:

  • plugin/:Claude Code 插件;plugin/src/core/ 是和平台无关的决策、信号、进度笔记和成本估算,其他适配都复用它。
  • adapters/pi/、adapters/codex/:Pi 和 Codex 的适配。
  • eval/:对照评测脚本(Claude、Pi、Codex 各一个),任务格式见 eval/day.py;评测用的题目和隐藏测试来自内部项目,没有放进仓库。
  • DESIGN.md:设计说明;docs/TEST-REPORT.md:测试报告;docs/EVALUATION.md:对照评测的英文说明。

许可证

MIT,见 LICENSE。