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 字符)
- 该层记忆在会话开始时加载进system prompt保持不变,文件内容在会话过程中不断写入更改(多进程同时操作时加锁)
2. 记忆后端插件召回动态记忆,类似我们已有的guide、skill系统,注入到user message中,同时用 标签包裹 + System note注释防止 AI 把记忆当成用户指令
3. 后台审查,侧模型在任务结束时总结对话保存记忆
4. 会话 Flush,当会话即将结束(压缩上下文、用户退出、Gateway 超时),系统会给 AI 发送一段系统消息,提示最后一次机会保存记忆。
● SKILL:在工具description和system prompt中提议AI 在以下场景会主动创建 skill
-
完成了一个复杂任务(5 次以上工具调用)
-
过程中踩了坑并找到了正确路径
-
用户纠正了 AI 的做法,AI 学到了正确方式
-
发现了一个非平凡的工作流
-
用户直接要求"记住这个流程" 在执行任务时会把下面这样的结构拼接到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
| 维度 | Hermes | OpenClaw |
|---|---|---|
| 定位 | 自我进化的"超级终端" | 可编程的"Agent 操作系统" |
| 扩展 | 工具注册 + SKILL.md + 有限 Hook | plugin + skill + mcp等+ 生命周期 Hook |
| 状态 | 跨会话记忆强,自进化机制 | 单次执行中 Hook 注入更灵活 |
Hermes 赢在:自我进化(记忆→技能→RL)、成本控制(智能路由+侧模型)、上下文压缩
OpenClaw 赢在:插件系统完整、Hook 丰富、Agent Event 实时推送