Skip to content

离开一小时回来不再重算: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 开新任务——这种情况下它基本不会触发,开着也无妨。

反过来,如果你经常在一个超长对话里断断续续干一整天,空闲压缩基本是「白送」的优化,保持默认就好。

和其他压缩设置的关系 ​

三者可以同时存在,互不替代。

小结 ​

  • 2.1.299 起,终端里 200K+ token 的对话闲置约 54 分钟,会在一小时提示缓存过期前自动压缩;
  • 用 CLAUDE_CODE_IDLE_COMPACT_MIN_TOKENS 调阈值(最低 100000),用 "idleCompaction": false 关闭;
  • DISABLE_AUTO_COMPACT=1 会连带关掉它;电脑休眠时不会触发。

升级后用 claude --version 确认 ≥ 2.1.299。

Claude-cn.org,专注于 Claude Code 中文教程