如何调整 OpenClaude 长会话的消息数压缩阈值并控制 1000 条硬上限?
【免费下载链接】openclauderuns anywhere. uses anything项目地址: https://gitcode.com/GitHub_Trending/op/openclaude
OpenClaude 在长会话里会自动压缩(compact)对话历史:除了按 token 用量触发压缩外,还内置了一个 1000 条活跃消息的安全硬上限,用来兜住那种“消息很多但 token 成本很低”的长会话。如果你经常恢复(resume)积累了数百条小型工具结果消息的会话,默认的消息数阈值200可能触发得过于频繁或不够及时,同时你也想确认 1000 条硬上限是否仍然生效、如何调整甚至临时关掉它做诊断。
这篇文章覆盖三件事:用/config调整消息数压缩阈值、用环境变量控制 1000 条硬上限,以及如何验证当前生效的配置。
先了解两层机制:消息数阈值与 1000 条硬上限
OpenClaude 的自动压缩有两层保护(见 docs/advanced-setup.md 的 "Message-Count Compaction Threshold" 章节):
- 消息数压缩阈值:默认
200条活跃消息。这是“主动保护”,可以在应用内调整。 - 安全硬上限:固定默认
1000条活跃消息。它是一个安全网(safety net),即使设置了DISABLE_COMPACT、DISABLE_AUTO_COMPACT或关闭了 auto-compact 设置,硬上限到达时仍会触发压缩。
默认阈值200对应实现见 src/query.ts 的注释("enforce the new effective 200-message default");硬上限的默认值定义在 src/utils/maxActiveMessages.ts:
export const DEFAULT_MAX_ACTIVE_MESSAGES_HARD_CAP = 1000调整消息数压缩阈值(/config)
在 OpenClaude 交互式会话内输入:
/config在设置列表中找到Message-count compaction项,可选值为off、100、200、500、1000(定义见 src/utils/config.ts)。选择off表示禁用这个设置项的主动保护(proactive guard)。
注意两点边界:
- 把阈值设为
off不会关闭 1000 条硬上限——内置硬上限仍然存在; - 如果你另外配置了
OPENCLAUDE_MAX_ACTIVE_MESSAGES环境变量覆盖,它在该设置未配置时仍然生效。
该设置保存进全局配置(~/.openclaude配置目录下的 settings 文件,/config会直接写入,例如~/.openclaude/settings.json)。
控制 1000 条硬上限(环境变量)
硬上限通过环境变量OPENCLAUDE_MAX_ACTIVE_MESSAGES_HARD_CAP覆盖,在启动 OpenClaude 前导出:
export OPENCLAUDE_MAX_ACTIVE_MESSAGES_HARD_CAP=1500 # 示例:把安全网上调 openclaude取值规则来自 src/utils/maxActiveMessages.ts:
- 不设置时,使用默认值
1000; - 设为
0表示禁用安全网。文档明确建议只在诊断时这样做("set it to0only for diagnostics"); - 设置为非法值(如
not-a-number)或0以外的无效数值时,回落到默认1000——这一点在 scripts/system-check.ts 的报告文案中有体现("malformed overrides fall back to 1000")。
消息数阈值与硬上限如何共同生效
实际生效的活跃消息上限是“消息数阈值”与“硬上限”中较小的那个,见 src/utils/maxActiveMessages.ts 的resolveMaxActiveMessagesLimit:两个值都大于 0 时取Math.min(阈值, 硬上限)。因此:
- 把
/config阈值调到1000、硬上限保持默认1000时,活跃消息上限就是1000; - 把阈值调到
500时,即使硬上限放宽到1500,主动保护仍在500条触发。
旧版变量 OPENCLAUDE_MAX_ACTIVE_MESSAGES 的优先级
如果你还在用旧的OPENCLAUDE_MAX_ACTIVE_MESSAGES环境变量,规则是:
- 该变量仅在
/config设置未设置或为off时生效; /config中的显式数值设置优先于这个旧变量;OPENCLAUDE_MAX_ACTIVE_MESSAGES_HARD_CAP仍可覆盖安全网,0仅用于诊断。
验证当前生效的阈值与硬上限
如果你是从源码构建运行 OpenClaude(Bun 环境),可以直接跑系统检查命令查看生效配置:
bun run doctor:runtime它会输出 auto-compact 守卫的当前状态。文档示例(docs/advanced-setup.md "Runtime Hardening" 一节给出命令;输出文案来自 scripts/system-check.test.ts 中的示例结果,仅作示例,具体数值以你的实际配置为准):
Enabled; message-count threshold 200; hard cap 1000. Active at 1000 messages (default; malformed overrides fall back to 1000).如果显式设置了OPENCLAUDE_MAX_ACTIVE_MESSAGES=500,报告会相应变为message-count threshold 500;如果设置了OPENCLAUDE_MAX_ACTIVE_MESSAGES_HARD_CAP=0,报告会显示Disabled by OPENCLAUDE_MAX_ACTIVE_MESSAGES_HARD_CAP=0; long sessions can grow without the active-message safety cap.
对于 npm 全局安装的 CLI,验证路径是:进入会话后再次打开/config,确认Message-count compaction一栏显示你刚选择的值;环境变量覆盖在启动前已导出,属于进程级生效,无需额外检查命令。
修改压缩逻辑后的回归检查
如果你是开发/维护者,改动触及 auto-compact、provider 请求转换、transcript 保留或进程内 teammates 时,文档给出了聚焦的长会话守卫测试命令:
bun test --feature=UNATTENDED_RETRY src/query/autoCompactCooldown.test.ts src/utils/maxActiveMessages.test.ts src/services/api/openaiShim.test.ts这些测试覆盖“反复超过上限的回合、auto-compact 冷却阻塞、teammate 活跃消息压缩、非法硬上限覆盖、以及裁剪历史中的 tool-call/tool-result 配对”。文档明确说明:这些测试不能替代数小时的手动 soak 测试,但它们固定了此前导致长会话一直增长直到 Node/V8 OOM 的有界历史与转换不变量。
限制与边界
OPENCLAUDE_MAX_ACTIVE_MESSAGES_HARD_CAP=0会取消活跃消息安全网,长会话可以在没有这个上限的情况下持续增长——只在你明确知道自己在做什么(诊断)时这样做;- 阈值选项目前只有
off、100、200、500、1000五个离散值,不支持任意数字;任意数值只能通过OPENCLAUDE_MAX_ACTIVE_MESSAGES旧变量(正整数,非法值按未配置处理)提供; - 硬上限是安全网:它可以在
DISABLE_COMPACT、DISABLE_AUTO_COMPACT或 auto-compact 设置被关闭时仍然触发压缩,这不是 bug,是设计行为。
【免费下载链接】openclauderuns anywhere. uses anything项目地址: https://gitcode.com/GitHub_Trending/op/openclaude
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考