首页/OpenHarness 源码课/OH05: 上下文压缩

OH05: 上下文压缩 OpenHarness · 对标 S05

S05 同主题:对话历史无限增长会顶满上下文;需要在便宜清屏LLM 摘要之间分层处理,并在每轮模型调用前自动触发。

上游:HKUDS/OpenHarness · 本仓库快照:reference/rererence_harness/OpenHarness/ · 路径亦见 专题映射表

与 S05 站内导图对齐course-s05)。

🎯 关键路径(读什么)

src/openharness/ 下优先打开:

  • services/compact/__init__.pyauto_compact_if_neededCOMPACTABLE_TOOLS、token 阈值常量。
  • engine/query.py:每轮 while 开头调用压缩(与 OH01 衔接)。
  • prompts/context.pybuild_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 时更新。

⚖️ 与课内叙事对照

维度课内 S05OpenHarness
触发点课内 compact 边界消息每轮 run_queryauto_compact_if_needed
cheap vs LLMmicro vs full compactCOMPACTABLE_TOOLS 与摘要调用分支
保留尾部keepRecent 叙事DEFAULT_KEEP_RECENT 等与实现常量

🤔 思考题

  1. 连续三次压缩仍超限时引擎行为是什么?(搜 MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES
  2. 为何 tool 名不在 COMPACTABLE_TOOLS 时可能仍被整段保留?
  3. build_runtime_system_prompt 与压缩谁先谁后?若顺序反了会出现什么问题?

📎 延伸阅读

OH01–12 目录 · OH04 · OH06 · S05 · D05