Files
metona-ollama-desktop/docs/HERMES-AGENT-DEEP-STUDY.md
T

10 KiB
Raw Blame History

Hermes Agent 深度研究 — Metona 可借鉴方案

基于 2026-04-18 对 NousResearch/hermes-agent 源码和文档的深度研究。 定位:与 OPENCLAW-HERMES-ANALYSIS.md 互补,侧重实现细节和可落地方案


一、Hermes 核心架构一览

语言:Python(~40K 行代码)
核心文件:
  run_agent.py       — AIAgent 类(~10,700 行),Agent Loop 引擎
  cli.py             — TUI 终端界面(~10,000 行)
  model_tools.py     — 工具发现、Schema 收集、调度
  tools/registry.py  — 中央工具注册表(47 个工具,19 个 toolset
  hermes_state.py    — SQLite 状态数据库(FTS5
  prompt_builder.py  — System Prompt 组装
  context_compressor.py — 上下文压缩

关键设计原则

原则 实践
Prompt 稳定性 System prompt 在对话中不变化,保护 LLM prefix cache
可观测执行 每个工具调用通过 callback 通知用户
可中断 API 调用和工具执行可被用户输入中断
平台无关核心 一个 AIAgent 类服务 CLI/Gateway/ACP/Batch/API
松耦合 MCP/插件/记忆提供者使用 registry 模式 + check_fn
Profile 隔离 每个 profile 独立 HERMES_HOME、配置、记忆、会话

二、Agent Loop 对比

Hermes 的 Agent Loop

用户输入 → build_system_prompt() → resolve provider → API 调用
  → 有 tool_calls?→ 并行执行(ThreadPoolExecutor)→ 循环
  → 无 tool_calls?→ 持久化 → 返回

关键差异:

维度 Hermes Metona
API 模式 3 种(chat_completions / codex_responses / anthropic_messages 1 种(Ollama chat
工具执行 单工具主线程,多工具 ThreadPoolExecutor 并行 同一批次 Promise.all 并行
中断机制 后景线程 + interrupt event AbortController
迭代预算 90 轮(可配置) 15 轮(硬编码)
上下文压缩 context_compressor.py 摘要中间轮次 context-manager.ts 滑动窗口
Prompt 缓存 Anthropic prompt caching 支持
消息交替 严格 user→assistant 交替 Ollama 自动处理
回调系统 8 种 callbackprogress/thinking/reasoning/clarify/step/stream/status 5 种 callback

Metona 可借鉴

  1. 迭代预算可配置化:从硬编码 15 轮改为 state.get('maxTurns', 15)
  2. 工具执行分单/并行逻辑优化:单工具直接执行,多工具并行(Hermes 的 ThreadPoolExecutor 思路)
  3. 上下文压缩:当 context 超过 50% 时自动摘要中间轮次,而非简单滑动窗口

三、工具系统对比

Hermes 的 Tool Registry

# tools/registry.py — 中央注册表
class ToolRegistry:
    def register(self, name, toolset, schema, handler, check_fn, ...):
        # 每个 tool 文件在 import 时自动注册
        # 防止 shadowingMCP 不能覆盖内置工具)
    
    def discover_builtin_tools(self):
        # AST 扫描 tools/*.py,找到 registry.register() 调用的文件自动 import

关键差异:

维度 Hermes Metona
注册方式 每个文件 import 时自动 register() 集中式 getToolDefinitions()
工具数量 47 个 + 19 个 toolset 34 个内置
Toolset 工具分组,可按组启用/禁用 无分组,全部启用
Shadowing 防护 MCP 不能覆盖内置工具 无此机制
工具发现 AST 扫描自动发现 手动导入
结果截断 max_result_size_chars 每工具可配 web_fetch 统一 15000 字符
安全审批 tools/approval.py 危险命令检测 + 用户确认 tool-security.ts 路径/命令检查

Metona 可借鉴

  1. Toolset 分组:将 34 个工具分为文件系统/系统网络/记忆会话/浏览器/MCP 等组,用户可按组启用/禁用
  2. 结果截断按工具配置:不同工具设置不同的 max_result_size_chars
  3. Shadowing 防护:MCP 工具注册时检查是否与内置工具重名

四、记忆系统对比

Hermes 的记忆

维度 Hermes Metona
存储方式 2 个 Markdown 文件(MEMORY.md + USER.md SQLitememories 表 + FTS5
容量限制 MEMORY.md 2200 字符,USER.md 1375 字符 无限制
注入方式 会话开始时冻结快照注入 system prompt 每次用户消息时检索注入
管理方式 Agent 通过 memory tool 自主管理 Agent 通过 memory_search/memory_add 工具
操作 add / replace / remove(子串匹配) search / add
会话搜索 session_searchFTS5 + Gemini 摘要) session_read(原始内容)
外部提供者 8 个插件(Honcho / Mem0 / OpenViking 等)
安全扫描 注入检测 + 凭证外泄检测

Metona 可借鉴

  1. 记忆容量限制:给 memories 表加容量限制(如 2200 字符),超限时 Agent 自动合并旧条目
  2. 冻结快照模式:会话开始时一次性注入记忆,不随对话变化(保护 LLM cache)
  3. replace/remove 操作:记忆工具支持修改和删除,不只能添加
  4. 安全扫描:记忆条目写入前检查 prompt injection / 凭证外泄模式
  5. 记忆区分层MEMORY.md(环境/工作流)vs USER.md(用户画像)清晰分离

五、Skill 系统对比

Hermes 的 Skill

维度 Hermes Metona
格式 SKILL.mdMarkdown 文件,YAML frontmatter SQLite skills 表
加载方式 渐进式披露(Level 0→1→2 匹配后全文注入
触发条件 /<skill-name> 斜杠命令 + 自然对话 自动匹配关键词
创建时机 5+ 工具调用的复杂任务完成后 2+ 工具调用后
更新方式 create / patch / edit / delete 仅 create
条件激活 fallback_for_toolsets / requires_toolsets
Skill Hub 在线注册表浏览/安装
agentskills.io 兼容 开放标准

Metona 可借鉴

  1. 渐进式加载:先返回技能名称+描述(~3K tokens),Agent 需要时再加载全文
  2. patch 更新Agent 可以用 old_string/new_string 局部修改技能,而非全文替换
  3. 条件激活:某些技能只在特定工具不可用时才显示(fallback 机制)
  4. SKILL.md 格式标准化:采用 YAML frontmatter + 结构化正文(When to Use / Procedure / Pitfalls / Verification

六、Prompt 组装对比

Hermes 的 Prompt Builder

prompt_builder.py 组装顺序:
1. PersonalitySOUL.md
2. MemoryMEMORY.md + USER.md 冻结快照)
3. Skills(渐进式索引)
4. Context FilesAGENTS.md, .hermes.md
5. Tool-use guidance
6. Model-specific instructions
7. Ephemeral layersbudget warnings, context pressure

关键差异:

维度 Hermes Metona
组装来源 6 层 + 2 个临时层 4 层(记忆+工作空间+Agent提示+人格)
缓存保护 Prompt 稳定性原则,不随对话变化 每次消息重新组装
预算警告 迭代接近上限时注入警告层
上下文压力 context 超 50% 时注入压缩提示

Metona 可借鉴

  1. 临时层机制:在 system prompt 末尾追加临时提示(预算警告、上下文压力),不影响基础 prompt 稳定性
  2. 模型特定指令:根据模型能力(tools/thinking/vision)动态调整 prompt 内容

七、上下文管理对比

Hermes 的 Context Compression

# context_compressor.py
# 当对话超过 context window 的 50% 时:
# 1. 保留首尾各 2-3 条消息
# 2. 中间消息用 LLM 摘要为 1-2 条 system 消息
# 3. 摘要后的消息标记为 compressed
# 4. 新消息基于压缩后的历史继续
维度 Hermes Metona
压缩触发 context > 50% 无自动压缩
压缩方式 LLM 摘要中间轮次 滑动窗口截断
Session 谱系 压缩后创建子 session,保留 parent_id 无谱系跟踪
Token 估算 model_metadata.py 按模型配置 粗略估算(中 1.5字/token,英 4字符/token

Metona 可借鉴

  1. LLM 摘要压缩context 超过阈值时,用 LLM 摘要中间轮次而非简单截断
  2. Session 谱系:压缩后创建新 session 并保留 parent_id,支持回溯
  3. Token 估算精确化:按模型配置 token 估算参数

八、可落地的改进清单

按优先级排序,基于 Metona 现状和投入产出比:

P0 — 立即实施

改进 来源 复杂度 改动文件
迭代预算可配置 Hermes Agent Loop agent-engine.ts
记忆 replace/remove 操作 Hermes Memory memory-manager.ts + tool-registry.ts
记忆安全扫描 Hermes Memory memory-manager.ts
工具结果截断按工具配置 Hermes Tool Registry tool-registry.ts

P1 — 近期实施

改进 来源 复杂度 改动文件
Skill 渐进式加载 Hermes Skills skill-manager.ts + agent-engine.ts
Skill patch 更新 Hermes Skills skill-manager.ts + tool-registry.ts
Toolset 分组管理 Hermes Toolset tool-registry.ts + settings-modal.ts
LLM 摘要压缩 Hermes Context context-manager.ts + agent-engine.ts

P2 — 中期规划

改进 来源 复杂度
Skill 条件激活 Hermes Skills
Session 谱系跟踪 Hermes Session
预算警告临时层 Hermes Prompt
Shadowing 防护 Hermes Registry

九、Hermes vs Metona 定位总结

Hermes = 云端 Python AgentCLI + Gateway + 多平台)
  ✅ 技能生态成熟(agentskills.io 开放标准)
  ✅ 记忆系统精巧(容量限制 + 冻结快照)
  ✅ 工具注册表自动发现
  ❌ 非桌面原生体验
  ❌ 需要 Python 环境

Metona = 本地 Electron 桌面 Agent
  ✅ 零配置启动,全离线
  ✅ 系统托盘 + 原生文件对话框
  ✅ 工作空间面板(终端 + 文件浏览器)
  ✅ 暖色调 UI
  ❌ 技能系统较原始
  ❌ 记忆无容量管理
  ❌ 上下文管理粗糙

互补方向:
  Metona 吸收 Hermes 的学习进化能力
  Hermes 不具备 Metona 的桌面原生体验

最后更新:2026-04-18