离开一小时回来不再重算:Claude Code 的空闲压缩(idle compaction)
一个常见场景:上午和 Claude Code 聊了很久,上下文已经涨到二三十万 token,然后去开会、吃饭。回来随手发一句「继续」,结果这一条消息又慢又贵——因为提示缓存已经过期,整段历史要按「新输入」重新处理一遍。
CLI 2.1.299 在终端里加入了空闲压缩(idle compaction),专门处理这种情况。
它做了什么
简单说:在缓存过期前,先替你压缩一次。
- 对话闲置约 54 分钟时(离一小时缓存到期还有几分钟),Claude Code 会自动对这段对话做一次压缩;
- 压缩之后,你下一条消息带上的是摘要,而不是完整历史,所以不用为一大段过期缓存重新付费、重新等待;
- 回到终端时,对话里会出现一行提示:
Compacted while idle, before the prompt cache expired,告诉你刚才发生了什么。
它和平时上下文快满时的自动压缩是同一套压缩机制,只是触发时机不同:一个看「满没满」,一个看「闲了多久」。
什么时候会触发
按官方文档,下面几个条件同时满足才会压缩:
| 条件 | 说明 |
|---|---|
| 交互式终端会话 | -p 无头模式、SDK 等不在此列 |
| 一小时提示缓存 | 对话走的是 1 小时 TTL 的提示缓存 |
| 能拉取功能开关 | Claude Code 能从 Anthropic 获取 feature flags |
| 上下文够大 | 默认达到 200,000 token |
| 闲置够久 | 距上一次请求约 54 分钟,且这时电脑没有休眠 |
最后一条容易忽略:笔记本合盖睡眠时,到点了也不会压缩;等你打开电脑时缓存可能已经过期,这次就省不下来了。
调整阈值:CLAUDE_CODE_IDLE_COMPACT_MIN_TOKENS
如果你觉得 200K 太高(比如经常在 120K 左右的对话里来回切换),可以用环境变量把门槛调低:
bash
export CLAUDE_CODE_IDLE_COMPACT_MIN_TOKENS=120000
claude规则:
- 填正整数,其他值会被忽略;
- 低于
100000的值会被抬到100000,这是最低门槛; - 不设置就是默认的
200000。
也可以写进 settings.json 的 env,对所有会话生效:
json
{
"env": {
"CLAUDE_CODE_IDLE_COMPACT_MIN_TOKENS": "120000"
}
}关闭空闲压缩
不想要的话,在 settings.json 里写:
json
{
"idleCompaction": false
}另外,如果你本来就设了 DISABLE_AUTO_COMPACT=1(或在设置里关了自动压缩),空闲压缩会一并关闭;手动 /compact 始终可用。
官方说明里提到,idleCompaction 键和阈值变量都要求 v2.1.290 或更高才会被识别。
什么时候建议关掉
空闲压缩在大多数情况下是省钱省时间的,但压缩终究会丢细节。下面几种情况可以考虑关掉,或者把阈值调高:
- 你正在调一个细节很多的问题,离开一会儿回来还需要 Claude 记得前面每一条报错原文;
- 你习惯回来后自己
/compact并写自定义指令,希望压缩摘要按你的重点来; - 你几乎不会离开超过一小时,或者回来后通常直接
/clear开新任务——这种情况下它基本不会触发,开着也无妨。
反过来,如果你经常在一个超长对话里断断续续干一整天,空闲压缩基本是「白送」的优化,保持默认就好。
和其他压缩设置的关系
- 主会话的自动压缩:看上下文窗口满没满;
- 子代理可以用
autoCompactWindow单独提前压缩,见 子代理也能提前自动压缩:autoCompactWindow; - 空闲压缩:看闲置时间,目的是赶在缓存过期前处理掉大上下文。
三者可以同时存在,互不替代。
小结
- 2.1.299 起,终端里 200K+ token 的对话闲置约 54 分钟,会在一小时提示缓存过期前自动压缩;
- 用
CLAUDE_CODE_IDLE_COMPACT_MIN_TOKENS调阈值(最低 100000),用"idleCompaction": false关闭; DISABLE_AUTO_COMPACT=1会连带关掉它;电脑休眠时不会触发。
升级后用 claude --version 确认 ≥ 2.1.299。