Hermes Agent 源码解析 · 第 8 讲
Hermes Agent 源码解析 第 8 讲:上下文压缩与对话管理——ContextEngine ABC、智能压缩管线、Coding Context 与 Curator 编排器 基于 Hermes Agent v0.16.0 源码 · 2026-06-21 一、上下文压缩:长对话的"记忆折叠术" 前七讲我们完成了全局架构地图、对话循环、工具系统、插件系统、Provider 抽象层、记忆与技能系统、Gateway 平台适配器的深度解析。这一讲聚焦 Hermes 最长寿的子系统—— 上下文压缩引擎 (Context Compression),它让 Agent 在数千轮对话后仍能流畅运行,不爆 token 上限、不丢失关键信息。 一个 128K 上下文的模型在长对话中很快会被填满——特别是代码工作流(read_file 输出几千字符、terminal 返回几百行)。Hermes 的解决方案不是简单截断,而是 智能压缩管线 :先做廉价预处理(工具输出修剪、去重),再保护头部和尾部,最后用辅助模型对中间对话做结构化摘要。 📦 源码仓库 https://github.com/NousResearch/hermes-agent 本地源码: ~/.hermes/hermes-agent/ 本讲核心文件: agent/context_engine.py (226 行)— ContextEngine ABC agent/context_compressor.py (2426 行)— 压缩管线实现 agent/conversation_compression.py (802 行)— 会话级压缩编排 agent/coding_context.py (738 行)— 编码上下文感知 agent/context_references.py (551 行)— @file/@url 引用解析 agent/curator.py (1835 行)— 技能维护编排器 agent/curator_backup.py (695 行)— Curator 回滚保护 二、ContextEngine ABC:可插拔的上下文引擎契约 ContextEngine 是一个精妙的抽象基类——它定义了 上下文管理的完整生命周期 ,同时允许第三方引擎(如 LCM)通过插件系统替换内置压缩器。设计哲学是"核心窄腰、边缘扩展"的延续。 1. ABC 接口设计 📄 agent/context_engine.py (第 32-188 行) class ContextEngine(ABC): """Base class all context engines must implement.""" # ── 必须维护的状态 ── last_prompt_tokens: int = 0 last_completion_tokens: int = 0 last_total_tokens: int = 0 threshold_tokens: int = 0 context_length: int = 0 compression_count: int = 0 # ── 压缩参数 ── threshold_percent: float = 0.75 protect_first_n: int = 3 protect_last_n: int = 6 # ── 核心抽象方法 ── @abstractmethod def update_from_response(self, usage: Dict) -> None: """每次 API 响应后更新 token 追踪。""" @abstractmethod def should_compress(self, prompt_tokens: int = None) -> bool: """判断本轮是否需要压缩。""" @abstractmethod def compress(self, messages: List[Dict], current_tokens: int = None, focus_topic: str = None) -> List[Dict]: """执行压缩,返回新的消息列表。""" # ── 可选钩子 ── def on_session_start(sel…