OH05: 上下文压缩 OpenHarness · 对标 S05
与 S05 同主题:对话历史无限增长会顶满上下文;需要在便宜清屏与LLM 摘要之间分层处理,并在每轮模型调用前自动触发。
上游:HKUDS/OpenHarness · 本仓库快照:reference/rererence_harness/OpenHarness/ · 路径亦见 专题映射表。
course-s05)。🎯 关键路径(读什么)
在 src/openharness/ 下优先打开:
services/compact/__init__.py:auto_compact_if_needed、COMPACTABLE_TOOLS、token 阈值常量。engine/query.py:每轮while开头调用压缩(与 OH01 衔接)。prompts/context.py:build_runtime_system_prompt— CLAUDE.md、memory、skills 段落。
🔍 源码导读
与 CC compaction 的注释链
模块文档写明思路来自 Claude Code 的 microCompact / autoCompact:先清旧 tool_result 文本,不够再调模型做结构化摘要。读 estimate_message_tokens 与 padding 系数可理解「何时触发」。
压缩与「模型可见上下文」
压缩改的是 messages 列表本身;build_runtime_system_prompt 则在系统侧叠加项目说明。二者都影响 token,但生命周期不同:前者每轮可变,后者多在会话初始化或 refresh 时更新。
⚖️ 与课内叙事对照
| 维度 | 课内 S05 | OpenHarness |
|---|---|---|
| 触发点 | 课内 compact 边界消息 | 每轮 run_query 前 auto_compact_if_needed |
| cheap vs LLM | micro vs full compact | COMPACTABLE_TOOLS 与摘要调用分支 |
| 保留尾部 | keepRecent 叙事 | DEFAULT_KEEP_RECENT 等与实现常量 |
🤔 思考题
- 连续三次压缩仍超限时引擎行为是什么?(搜
MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES) - 为何 tool 名不在
COMPACTABLE_TOOLS时可能仍被整段保留? build_runtime_system_prompt与压缩谁先谁后?若顺序反了会出现什么问题?
📎 延伸阅读
OH01–12 目录 · OH04 · OH06 · S05 · D05