Claude Code 自动压缩怎么设:/autocompact 窗口与优先级

用 1M 上下文的模型跑 Claude Code,默认要到大约 967K token 才自动压缩。在那之前,每条消息都背着越来越长的历史发出去,慢、费额度,前面定下的约束也容易被埋掉。/autocompact 管的就是这个时机:上下文涨到多少就压缩。下面按 Claude Code 官方文档(2026-10-29 北京时间查阅)讲清四种设法、谁覆盖谁、压缩后留下什么,以及怎么挑一个合适的数。
前置条件:版本够新,先看一眼当前窗口
/autocompact命令要 Claude Code v2.1.221 及以上;按模型分别保存窗口要 v2.1.288 及以上;环境变量写200k这种带后缀的值要 v2.1.304 及以上。- 不带参数直接敲
/autocompact,会弹出对话框显示当前窗口,先看清自己现在是多少再改。 - 窗口上限是模型自己的上下文窗口。你在 200K 模型上写
1M,实际也只到 200K。
四种设法,从临时到全局
| 怎么设 | 写法 | 作用范围 | 备注 |
|---|---|---|---|
| 斜杠命令 | /autocompact 500k | 当前模型,本次和以后的会话 | 存进用户设置的 modelSettings,/autocompact auto 恢复默认 |
| 设置文件 | "autoCompactWindow": 200000 | 所有模型 | 同一文件里,按模型存的值优先 |
| 启动参数 | claude --autocompact 300k | 只这一次启动 | 不改已保存的值,也不受托管设置压制 |
| 环境变量 | CLAUDE_CODE_AUTO_COMPACT_WINDOW=500000 | 脚本、云环境 | 优先级最高;此时 /autocompact 只报告、不保存 |
命令和参数接受三种写法:纯数字 200000、带后缀 500k / 1M、100 到 1000 之间的裸数字(按千算,200 就是 20 万)。范围是 100K 到 1M。
同一个 200,写在 /autocompact 后面是 20 万,写进环境变量是 200 个 token。
环境变量只认纯 token 数(新版本另认 k/M 后缀),CLAUDE_CODE_AUTO_COMPACT_WINDOW=200 会被当成 200,再被抬到 100K 下限,启动时给一条警告。脚本里写满 200000 最省事。
谁覆盖谁:排查「设了不生效」
- 环境变量:设了且值合法,压过命令、参数和设置。状态栏的
used_percentage按模型完整窗口算,这时它不再代表离压缩还有多远。 - 启动参数
--autocompact:压过保存的设置,只管这次启动。claude --autocompact auto可以临时回到默认窗口。 - 托管设置:组织下发了窗口,你敲
/autocompact会照样保存,但当前会话仍按托管值走,命令会提示这一点。 - 用户设置:按模型保存的值优先于同文件里顶层的
autoCompactWindow。v2.1.288 之前命令写的是顶层键,所有模型共用一个值。
想彻底不自动压缩,设置里写 "autoCompactEnabled": false,或单次会话设 DISABLE_AUTO_COMPACT=1,手动 /compact 仍可用;DISABLE_COMPACT=1 连手动也关掉。关掉自动压缩,闲置压缩(idle compaction)也一起关。
不设的话,默认几点压缩
| 场景 | 默认压缩点 |
|---|---|
| 原生 1M 窗口(Fable、Sonnet 5 及以后、Haiku 5.5、Opus 4.7 及以后) | 约 967K |
| Sonnet 4.6 / Opus 4.6 未开扩展上下文 | 200K 边界 |
设了 CLAUDE_CODE_DISABLE_1M_CONTEXT=1 | 原生 1M 的模型也在 200K 压缩 |
| 云端会话 | 接近模型上限时 |
| 网关别名等不认识的模型 ID | 按 Claude Code 为该 ID 假定的窗口 |
走 LLM 网关时,Claude Code 认不出 my-gateway-opus 这类别名,启动会警告并按 200K 假定窗口。官方给了四种修正:先 claude update 看新版本认不认;是已知模型换了名字的,用 modelOverrides 把 Anthropic 模型 ID 映射过去;真实窗口是 1M 的,在 ID 后面加 [1m];其他窗口设 CLAUDE_CODE_MAX_CONTEXT_TOKENS=400000 这样的值。
压缩后还剩什么:别把关键规则放在会被总结掉的地方
自动压缩和手动 /compact 一样,是把历史总结成摘要。官方列了每类内容的去向,挑最常踩的几条:
- 从磁盘重新注入:项目根目录的 CLAUDE.md 和无范围规则、自动记忆、plan 模式写下的计划、Skill 描述(v2.1.304 起)。
- 按需重载:带
paths:的规则、子目录里的 CLAUDE.md。它们是在读到触发文件时进历史的,压缩时会和别的内容一起被总结掉,必须常驻的规则就去掉paths:或挪到根目录 CLAUDE.md。 - Skill 正文:重新注入,但每个 Skill 最多 5,000 token、总共 25,000 token,超了先丢最早调用的;截断保留文件开头,所以重要指令写在
SKILL.md前面。 - 读过、改过的文件:压缩后重读最近修改的最多 5 个;超过 5,000 token 的只留路径引用。
- 后台命令和后台子 Agent:继续跑,Claude Code 会提醒还有哪些在跑,避免重复启动。
怎么写一份压缩后还能撑住的 CLAUDE.md,见站内 CLAUDE.md 怎么写。
窗口怎么挑:三个常见场景
- 1M 模型上的长会话:默认 967K 才压缩,意味着后半程每轮都带着几十万 token 的旧历史。可以先设
/autocompact 300k或500k,跑几天看两件事:压缩后要不要反复重新交代背景,单轮响应是不是变快。重新交代得多就往上调,反之往下。 - 读长日志的子 Agent:在子 Agent 文件的 frontmatter 里写
autoCompactWindow: 200000,只让它提前压缩,主会话不受影响(v2.1.296 起;设了环境变量则以环境变量为准)。子 Agent 文件写法见 Claude Code 子 Agent 怎么配。 - CI 和脚本:用
CLAUDE_CODE_AUTO_COMPACT_WINDOW写死,不依赖跑机器上的用户设置。另有CLAUDE_AUTOCOMPACT_PCT_OVERRIDE(1–100)按窗口的百分比提前触发,比如50,只能往早调、不能推迟,主会话和子 Agent 都生效。
窗口调小只决定「什么时候压」,压的时候保什么,还得靠手动补一刀:开始一个新的大任务前跑 /compact focus on the auth bug fix 这类带重点的压缩;换到无关任务直接 /clear;走错了路用 /rewind 回到出错前,别让错误尝试进摘要。
常见坑
- 环境变量写了 200:被当成 200 token,抬到 100K 下限。写
200000。 - 设了窗口,状态栏百分比不对:环境变量生效时,
used_percentage仍按模型完整窗口算,不代表离压缩的距离。 - 公司电脑改了没用:托管设置压着。命令会提示;临时绕开可用
--autocompact启动参数(它不受托管设置压制)。 - 压缩后规则「失忆」:多半是规则带了
paths:,或写在子目录 CLAUDE.md、或藏在很长的 Skill 后半段。
完成标准
- 敲
/autocompact不带参数,对话框显示的是你想要的窗口。 - 需要统一的场景(CI、团队)用了环境变量或设置文件,不靠各人手敲命令。
- 必须常驻的规则在根目录 CLAUDE.md 或 Skill 开头,不在会被总结掉的位置。
最后
今天就在常用项目里敲一次不带参数的 /autocompact,看清当前窗口,再按上面的场景定一个数,跑一周回来调。
- Claude Code Docs · Model configuration:Set the auto-compact window
- Claude Code Docs · Explore the context window(What survives compaction)
- Claude Code Docs · Settings reference:autoCompactWindow / autoCompactEnabled
- Claude Code Docs · Environment variables
- Claude Code Docs · Subagents(subagent autoCompactWindow)