大家都在openclaw时,我发现了更宝藏的Hermes Agent

37 阅读9分钟

Hermes 是什么

Python(非TS生态,插件系统实现和openclaw不一致,改动较大) 写的 Terminal-first 自我进化 Agent,核心约 10 万行代码。最大特点是把终端当一等公民——所有事情都通过 bash -c 来干。同时内置了一套完整的"学习系统":记忆持久化、skill自动创建/修复、后台审查、跨会话搜索,甚至还能通过 自动生成jsonl数据,从而在线强化学习改进底层模型或者作为SFT数据。

SYSTEM PROMPT

1.  Agent 身份(SOUL.md 或默认描述)定义 Agent 的人格和行为准则

2.  工具行为指导根据当前可用工具动态注入使用规范

3.  外部记忆静态块由已启用的外部记忆 Provider(如 Honcho、Hindsight、Mem0 等)各自返回一段固定文本,告诉 Agent "你有哪些记忆能力可用,本质是 8 个可插拔的第三方记忆后端插件,给 Agent 提供超越 MEMORY.md上限的大容量、智能检索的长期记忆

4.  可选系统消息允许用户通过配置直接覆盖或追加自定义指令

5.  MEMORY.md 快照和USER.md 快照是会话开始时冻结的内置记忆文件内容,会话期间不再变化以保证 Prompt Cache 命中率

6.  技能索引列出当前可用技能的紧凑清单

7.  时间戳与会话 ID 注入当前时间和会话元数据

以上所有内容在会话开始时一次性组装并冻结,构成缓存稳定层。

 

此外还有一个临时层: 1. 每轮动态注入的 prefetch 记忆片段(外部 Provider 根据用户消息检索到的相关记忆),注入到 user message

2.  预算压力提醒(当迭代预算消耗 70%+ 时注入 [BUDGET: ...] 提醒 Agent 收敛;90%+ 时注入 [BUDGET WARNING: ...] 要求立即结束),注入到 user message

3.  prefill messages(预填充的 assistant 消息,引导模型的输出方向),追加到user message

以上临时层信息不进入 System Prompt 本体,从而最大化 Prompt Cache 的复用率。

执行任务

迭代预算:默认 90 次,快用完时会注入提醒让 Agent 收敛。子 Agent 独立预算(50 次),不吃父 Agent 的。

工具执行:单个工具主线程跑,多个工具并发。危险命令会触发侧 Agent 审批拦截。

失败处理:API 挂了自动切备用模型;工具报错丢给 LLM 自己决定怎么办;用户中断直接杀掉当前操作。

Terminal 机制

不是持久 shell,而是每次命令 spawn 新进程,通过 snapshot 文件保持环境一致性。支持 PTY 模式跑交互式工具(Codex、Claude Code 等)。

优点:

1.  命令隔离:每个命令在独立进程中执行,一个命令的崩溃不会影响后续命令

2.  超时控制:可以精确控制每个命令的超时,通过 os.killpg() 杀死整个进程组

3.  中断支持:用户中断时可以立即终止当前进程,不影响 Agent 主循环

4.  安全隔离:每个进程的环境变量经过过滤,Hermes 内部的 API Key 不会泄露到子进程

snapshot:

初始化时捕获:

# 在 login shell 中执行
export -p > /tmp/hermes-snap-{session_id}.sh    # 导出所有环境变量
declare -f | grep -vE '^_[^_]' >> snapshot       # 导出所有函数(过滤内部函数)
alias -p >> snapshot                              # 导出所有别名
echo 'shopt -s expand_aliases' >> snapshot        # 启用别名展开
echo 'set +e' >> snapshot                         # 不因错误退出
echo 'set +u' >> snapshot                         # 允许未定义变量

每次命令前恢复:

source /tmp/hermes-snap-{session_id}.sh 2>/dev/null || true
cd {cwd} || exit 126
eval '{command}'
__hermes_ec=$?
export -p > /tmp/hermes-snap-{session_id}.sh 2>/dev/null || true  # 更新快照
pwd -P > /tmp/hermes-cwd-{session_id}.txt 2>/dev/null || true     # 更新 CWD
exit $__hermes_ec

 

智能模型路由与侧模型

智能路由

简单消息自动走便宜模型,复杂消息走主模型。判断是及其简单的匹配——消息超 160 字符、超 28 个词、有代码块/URL/复杂关键词,任何一条不满足就走主模型。实际效果就是"你好"走便宜模型,"帮我 debug"走主模型。默认关闭。用处不大。

侧模型(Auxiliary Client)

主模型贵,但很多杂活不需要强模型。Hermes 内置了独立的辅助 LLM 路由器,把上下文压缩、会话搜索摘要、网页提取、视觉分析、智能审批这些侧任务分配给便宜模型。每个侧任务可以独立配置 Provider 和模型。Provider 链式降级——一个余额不足自动切下一个。

Hermes 的侧模型本质上是和 tool 绑定的——每个侧任务在代码里通过 task 参数(如 task="compression"、task="vision")声明自己的身份,路由器根据这个 task 名去查对应的 provider 和便宜模型配置。压缩、会话搜索、网页提取、审批、视觉分析、记忆 flush、标题生成这些 tool 都是写死走侧模型的,不存在运行时判断。

上下文与状态

● 上下文压缩:token 超 50% 时触发 4 阶段压缩(预修剪 → 确定边界 → 便宜模型总结中间 → 迭代更新) 上下文压缩的完整流程:先零成本地把旧 tool 输出中超过 200 字符的大块内容用字符串替换成占位符清掉垃圾,然后划定首尾保护区——头部固定保护系统提示和首轮对话(前 3 条),尾部按 token 预算动态保护最近约 20K tokens 的上下文,中间被夹住的对话序列化后喂给便宜侧模型生成 8 章节结构化摘要,后续再次触发压缩时不会从头总结,而是把上一次的摘要和新对话一起发给 LLM 做迭代增量更新——要求保留旧信息、新增进展、把"进行中"移到"已完成"、只删明确过时的内容,像滚雪球一样累积所有关键信息,最后把头部消息 + 摘要消息 + 尾部消息组装回去,并修复压缩导致的 tool_call 和 tool_result 配对断裂(删孤立结果、补 stub 结果),确保 API 不会因为 ID 不匹配而报错。

每次压缩完之后都会创建新的session继续进行后续流程,并用parent_id指向原未压缩对话

1.  Goal — 用户想要完成什么目标

2.  Constraints & Preferences — 用户偏好、编码风格、约束条件、重要决策

3.  Progress(含 Done In Progress Blocked 三个子节)— 已完成的工作、进行中的工作、遇到的阻塞

4.  Key Decisions — 重要的技术决策及其原因

5.  Relevant Files — 读取、修改或创建过的文件及简要说明

6.  Next Steps — 接下来需要做什么

7.  Critical Context — 具体的值、错误信息、配置细节等不显式保留就会丢失的数据

8.  Tools & Patterns — 用了哪些工具、怎么用的、有什么工具相关的发现和有效模式

 

● 记忆:

~/.hermes/memories/
├── MEMORY.md(最多 2,200 字符)
└── USER.md(最多 1,375 字符)

  1. 该层记忆在会话开始时加载进system prompt保持不变,文件内容在会话过程中不断写入更改(多进程同时操作时加锁)

2.  记忆后端插件召回动态记忆,类似我们已有的guide、skill系统,注入到user message中,同时用 标签包裹 + System note注释防止 AI 把记忆当成用户指令

3.  后台审查,侧模型在任务结束时总结对话保存记忆

4.  会话 Flush,当会话即将结束(压缩上下文、用户退出、Gateway 超时),系统会给 AI 发送一段系统消息,提示最后一次机会保存记忆。

● SKILL:在工具description和system prompt中提议AI 在以下场景会主动创建 skill

  1. 完成了一个复杂任务(5 次以上工具调用)

  2. 过程中踩了坑并找到了正确路径

  3. 用户纠正了 AI 的做法,AI 学到了正确方式

  4. 发现了一个非平凡的工作流

  5. 用户直接要求"记住这个流程" 在执行任务时会把下面这样的结构拼接到system prompt中,由ai自己决定召回对应的skill

<available_skills>
  shopping:
    - jd-shopping-ordering: 京东购物小下单流程。通过 JD Mini Program 购买商品...
    - kfc-meituan-ordering: 美团点餐流程...
  coding:
    - python-debug: Debug Python scripts
</available_skills>

● 后台审查:在主 Agent 完成用户响应之后,在后台daemon中 fork 一个完整的 AIAgent 实例,让它回顾刚才的对话。分为记忆审查(每10个用户轮次审查一次)和技能审查(每10次工具调用审查一次)

 记忆审查关注的内容

1.  用户的身份、角色、背景

2.  用户的偏好和习惯

3.  用户的个人细节(如项目名称、团队信息)

4.  用户对 Agent 行为的期望

5.  用户的操作方式偏好

通过 memory 工具写入 MEMORY.md(Agent 笔记)或 USER.md(用户画像)

技能审查关注的内容

1.  非平凡的解决方案:需要反复试错才完成的任务

2.  经验性发现:在执行过程中改变了方向的工作流

3.  用户期望差异:用户期望的方法或结果与初始方案不同的情况

通过 skill_manage 工具创建或更新 SKILL.md 文件

● 支持跨会话搜索:每条对话消息自动存入 SQLite 并通过 FTS5 建立全文索引,搜索时用 BM25 关键词匹配捞出相关历史会话(不重复索引父子对话),再用便宜的辅助 AI 并行读原文生成聚焦摘要(若匹配到多个相关对话则同时启动多个辅助AI并行总结),最终只把精炼的摘要交给主 AI,实现低成本、快速、不撑爆上下文的跨会话记忆召回。

Hermes 对比 OpenClaw

维度HermesOpenClaw
定位自我进化的"超级终端"可编程的"Agent 操作系统"
扩展工具注册 + SKILL.md + 有限 Hookplugin + skill + mcp等+ 生命周期 Hook
状态跨会话记忆强,自进化机制单次执行中 Hook 注入更灵活

Hermes 赢在:自我进化(记忆→技能→RL)、成本控制(智能路由+侧模型)、上下文压缩

OpenClaw 赢在:插件系统完整、Hook 丰富、Agent Event 实时推送