ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Hermes Agent 技术架构全解:把“自进化”拆成可复现的工程模块

Hermes Agent 技术架构全解:把“自进化”拆成可复现的工程模块 1. 为什么我要把 Hermes Agent 拆开看自进化不是魔法是四层工程模块Hermes Agent 最近在开源社区热度很高官方那句“从经验中学习自动创建技能在使用中迭代优化”听起来像 AGI 前奏。但如果你真去读它的源码会发现所谓“自进化”其实是一套可以逐层复现的工程结构前台执行循环、后台 Review、分层记忆、RL 训练飞轮。它不是一个黑盒而是一组职责清晰的模块拼装。我关注 Hermes Agent 技术架构的起点是想搞清楚一个具体问题一个 Agent 在完成复杂任务后怎么把“这次踩过的坑”变成“下次直接能用的技能”如果只是把对话历史塞进向量库那叫检索不叫进化。Hermes 的做法是把“经验沉淀”拆成触发条件、异步复盘、技能写入、按需召回四个动作每个动作都有对应的代码路径和配置项。这篇文章面向想复刻 Hermes Agent 工程实现的开发者。我会按层拆解记忆、规划、工具调用与反馈回路给出可复制的模块配置片段并逐项跑通最小闭环。你不需要先读完整个仓库只要跟着配置和验证动作走就能确认自进化机制在真实任务中的触发条件与边界。先明确一个定位差异Hermes 的核心是 Agent 本体的执行与学习引擎围绕run_conversation循环展开把工具调用、Skill 沉淀、长期记忆与安全边界纳入同一套可长期演进的系统。它首先是一个会复盘的执行体其次才是一个可接入多平台的接口。这个定位决定了它的代码组织方式——run_agent.py和model_tools.py位于仓库顶层而gateway/相对次要。所以复刻 Hermes Agent 的自进化能力重点不在网关层而在四个模块执行循环里的工具编排、对话结束后的后台 Review、分层记忆的读写策略、以及反馈回路里的奖励信号设计。下面我按这个顺序逐层展开每一层都给可复制的配置和验证动作。2. 前置准备用 TaoToken 统一接入 Hermes Agent 的模型调用层在拆解架构之前先把模型调用层跑通。Hermes Agent 支持 OpenAI、Anthropic、Codex 三种原生接口但如果你本地没有稳定的 API 通道后面的工具调用和后台 Review 都无从验证。我实测下来用 TaoToken 做统一接入比较省事它兼容 OpenAI 的chat_completions格式也能对接 Anthropic 的messages接口Base URL 和 Key 配一次就能覆盖 Hermes 的多个模型调用点。TaoToken 在这里的角色是模型调用层的前置网关。Hermes Agent 的run_conversation循环里每次工具调用决策、每次后台 Review 的子 Agent 推理都要走一次模型请求。把这些请求统一指向一个兼容端点可以避免在 Hermes 配置里维护多套 Provider 凭据。你需要准备三样东西Base URL、API Key、Model ID。Base URL 用https://taotoken.net/api注意这个地址不带任何查询参数。API Key 在控制台的 API Keys 页面生成建议单独建一个给 Hermes 用的 Key方便后续做 Credential Pool 轮转测试。Model ID 根据你实际要验证的能力选工具调用密集的场景建议选 function calling 支持稳定的模型。配置路径上Hermes Agent 的模型配置通常在~/.hermes/config.toml或环境变量里。我建议用环境变量注入避免把 Key 写进版本控制。下面这段是可直接复制的 shell 配置路径和变量名按 Hermes 的约定来export HERMES_PROVIDERopenai export OPENAI_BASE_URLhttps://taotoken.net/api export OPENAI_API_KEYsk-你的TaoTokenKey export HERMES_MODEL你的ModelID如果你要用 Anthropic 原生接口跑后台 Review 子 Agent再补一组export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYsk-你的TaoTokenKey export ANTHROPIC_MODEL你的ModelID配完之后先别急着跑完整 Agent用一条最小请求验证通道。这一步很关键因为 Hermes 的报错经常被包装成工具调用失败实际根因是模型端点 401 或超时。验证命令curl -s https://taotoken.net/api/chat/completions \ -H Authorization: Bearer $OPENAI_API_KEY \ -H Content-Type: application/json \ -d { model: $HERMES_MODEL, messages: [{role: user, content: 只回复 ok}], max_tokens: 8 }返回里choices[0].message.content是ok说明模型调用层通了。如果返回 401先检查 Key 是否带上了Bearer前缀如果返回local proxy failed说明 Base URL 写成了带路径的地址去掉多余后缀。这一步过了再进 Hermes 的配置。TaoToken 的接入文档里有各语言 SDK 的示例如果你要用 Python 直接调可以参考接入文档里的写法。模型对话页面可以先用网页版确认 Model ID 是否可用避免在 Hermes 里反复试错。长期跑编码类 Agent 任务的话Coding Plan 的额度模型比按次调用更适合后台 Review 这种高频小请求。3. 可复制配置把记忆、规划、工具调用、反馈回路写成模块片段这一节是复刻的核心。Hermes Agent 的自进化能力分布在四个模块里每个模块都有对应的配置文件和触发参数。我把它们拆成可复制的 JSON/TOML 片段你按路径放进去就能跑最小闭环。3.1 记忆模块冻结快照 SQLite FTS5 检索Hermes 的记忆分三层。第一层是~/.hermes/memories/MEMORY.md和USER.md会话启动时冻结注入容量分别约 2200 字符和 1375 字符。第二层是~/.hermes/state.db启用 WAL 模式的 SQLite用 FTS5 做全文检索。第三层是可选的外部用户建模服务。先建目录和文件mkdir -p ~/.hermes/memories touch ~/.hermes/memories/MEMORY.md touch ~/.hermes/memories/USER.mdMEMORY.md里写 Agent 的环境事实和踩坑经验USER.md里写用户画像。注意这两个文件在会话中途不会被重新读取即使 Agent 调用 memory 工具修改并落盘当前会话的系统提示前缀也不变。这是为了保住 Prefix CachingKV Cache 可以持续复用。SQLite 检索层的建表语句可以直接复制PRAGMA journal_modeWAL; CREATE TABLE IF NOT EXISTS messages ( id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL, role TEXT NOT NULL, content TEXT NOT NULL, created_at INTEGER NOT NULL ); CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5( content, contentmessages, content_rowidid ); CREATE TRIGGER IF NOT EXISTS messages_ai AFTER INSERT ON messages BEGIN INSERT INTO messages_fts(rowid, content) VALUES (new.id, new.content); END;这段配置对应 Hermes 的session_search工具。Agent 需要召回历史时输入关键词走 FTS5 查询配合低成本模型做摘要。记忆不是笔记本而是搜索引擎——不一次性塞入所有历史只在需要时召回相关片段。3.2 规划与工具调用run_conversation 循环参数Hermes 的规划能力不在单独的 planner 模块而是嵌在run_conversation循环里。关键参数是_skill_nudge_interval默认 10 轮工具迭代。这个值决定后台 Review 子 Agent 什么时候被 fork 出来。在~/.hermes/config.toml里加[agent] skill_nudge_interval 10 max_tool_iterations 30 background_review true [agent.review] model 你的ModelID readonly true max_review_tokens 2048skill_nudge_interval 10的含义是当主对话完成 10 轮工具迭代后系统在响应交付给用户之后静默 fork 一个只读子 Agent 回看执行轨迹。子 Agent 判断“是否经过试错、是否改变了执行路径”有价值就调用skill_manage写入 Markdown没价值就返回Nothing to save。工具编排在model_tools.py里配置片段[tools] enabled [shell, file_read, file_write, skill_manage, session_search] approval_mode smartapproval_mode三档manual所有危险操作人工确认smart辅助 LLM 评估风险off关闭。复刻阶段建议先用smart既能跑通流程又不至于每步都卡住。3.3 反馈回路确定性奖励信号Hermes 的 RL 训练飞轮在应用层不可见但反馈回路的设计可以借鉴。它的奖励函数是规则化的不依赖人工标注层级奖励评判标准格式正确0.2合法 JSONtool_call 标签正确Schema 匹配0.3参数类型符合定义执行成功0.5工具跑通无报错任务完成1.0最终结果正确测试通过幻觉惩罚-1.0调用了不存在的工具你在复刻时不需要真的跑 GRPO但可以把这套奖励规则做成日志埋点。每次工具调用后记录格式、Schema、执行结果三个信号累积到一定量就能看出 Agent 在哪些环节容易犯错。这比单纯看对话历史更有诊断价值。3.4 Skill 存储格式agentskills.io 标准生成的 Skill 用 YAML frontmatter Markdown确保跨 Agent 可移植。一个最小 Skill 文件长这样--- name: fix-python-import-error description: 当 Python 报 ModuleNotFoundError 且确认包已安装时检查 sys.path 和虚拟环境 version: 1 --- ## 触发条件 - 报错包含 ModuleNotFoundError - pip list 确认包存在 ## 步骤 1. 检查当前 Python 解释器路径 2. 对比 pip 所属环境 3. 必要时用 python -m pip 重装放到~/.hermes/skills/目录下build_skills_system_prompt()会扫描并构建仅含名称和描述的索引注入系统提示。用户输入/skill-name时完整内容作为用户消息注入保护 Prefix Caching。4. 验证请求跑通最小闭环确认自进化触发条件配置放好之后用一个真实任务验证四个模块是否串起来。我选的任务是“修复一个 Python 导入错误”因为它会触发多次工具调用容易达到skill_nudge_interval阈值。第一步启动 Hermes Agent输入任务hermes run --task 运行 python app.py如果报错就修复它第二步观察工具调用轮次。Agent 会依次执行shell跑脚本、file_read读报错、file_write改代码、再shell验证。如果超过 10 轮后台 Review 应该被触发。第三步检查 Skill 是否生成ls -la ~/.hermes/skills/ cat ~/.hermes/skills/*.md如果看到新的 Markdown 文件且 frontmatter 里有name和description说明后台 Review 判定这次执行有价值并写入了。如果目录为空检查background_review true是否生效以及子 Agent 的模型端点是否可达。第四步验证记忆检索。新开一个会话输入hermes run --task 搜索之前修复导入错误的记录Agent 应该调用session_search走 FTS5 查询messages_fts表。如果返回了上一轮的对话片段说明检索层通了。第五步验证 Skill 召回。输入hermes run --task /fix-python-import-error 再跑一次完整 Skill 内容应该作为用户消息注入Agent 按步骤执行。注意这一步不会修改系统提示前缀Prefix Caching 保持有效。成功结果的特征是Skill 文件生成、检索返回历史片段、Skill 按需召回执行。三个动作都跑通最小闭环就成立了。这时候你再去改skill_nudge_interval的值比如从 10 改成 5观察 Skill 生成频率的变化就能摸到自进化机制的触发边界。5. 常见报错排查401、local proxy failed、reading choices、OAuth复刻过程中最容易卡在模型调用层因为 Hermes 会把底层错误包装成工具调用失败。下面是我踩过的几个坑和对应排查路径。401 Unauthorized最常见。先确认OPENAI_API_KEY是否带上了Bearer前缀TaoToken 的 Key 在 Header 里需要完整格式。如果 Key 没问题检查 Base URL 是否写成了https://taotoken.net/api/chat/completions正确写法是https://taotoken.net/api路径由 SDK 自动拼接。另外确认 Key 没有过期或被禁用。local proxy failed这个报错通常出现在 Base URL 带了多余路径或端口。Hermes 的 Provider 配置里如果同时写了base_url和api_base可能产生冲突。清理环境变量只保留一组unset OPENAI_API_BASE export OPENAI_BASE_URLhttps://taotoken.net/apireading choices 报错返回体里没有choices字段说明请求没走到 chat completions 端点或者 Model ID 写错了。用第 2 节的 curl 命令单独验证确认返回结构。如果 curl 正常但 Hermes 报错检查 Hermes 的 Provider 类型是否设成了openai而不是anthropic。OAuth 相关报错如果你用的是 Codex 接口Hermes 会走codex_responses原生对接这时候需要 OAuth 凭据而不是 API Key。复刻阶段建议先用chat_completions跑通再切 Codex。切换时确认auth.json里的字段完整{ provider: openai, base_url: https://taotoken.net/api, api_key: sk-你的TaoTokenKey, model: 你的ModelID }Base URL、Key、Model ID 三件套在 Codex、Cline MCP、CC Switch 里都要写全缺一个就会在工具调用阶段报错。如果你用 Cline 的 MCP 模式接 HermesMCP 子进程的环境变量是隔离的需要在 MCP 配置里单独注入这三个值不能依赖父进程的环境变量。还有一个隐蔽的坑后台 Review 子 Agent 用的是只读模式但它仍然要调模型。如果主对话的模型端点通了子 Agent 的端点没通Skill 生成会静默失败日志里只有一行review skipped。排查时单独用子 Agent 的 Model ID 跑一次 curl确认可达。6. 接入与排障入口把验证过的配置固化下来跑通最小闭环之后下一步是把配置固化避免每次重启都重新注入环境变量。Hermes 支持 Profile 隔离每个 Profile 有独立的配置、记忆、会话和网关。你可以建一个专门用于复刻验证的 Profilehermes profile create hermes-lab hermes profile use hermes-lab然后在 Profile 的配置目录里写入固定的config.toml把第 3 节的片段合并进去。Credential Pool 可以配多个 TaoToken Key 做轮转401 失败自动切换这对长时间跑后台 Review 很有用。如果你在接入阶段遇到模型端点问题先去 API Keys 页面确认 Key 状态再对照接入文档检查 Base URL 和 Header 格式。验证 Model ID 是否可用用模型对话页面发一条测试消息最快。长期跑编码类 Agent 任务、需要高频调用后台 Review 的场景Coding Plan 的额度模型比按次计费更可控。Claude Code 用户如果想把 Hermes 的 Skill 系统接进现有工作流可以参考 ClaudeCodeAnthropic 的配置方式把 Base URL 和 Key 映射过去。控制台里可以查看调用量和错误分布排障时先看 401 和超时的比例再定位到具体模块。复刻 Hermes Agent 的自进化能力关键不是照搬全部代码而是理解四个模块的职责边界执行循环负责产生轨迹后台 Review 负责判断价值分层记忆负责存储和召回反馈回路负责提供信号。把这四层用最小配置串起来你就能在自己的环境里验证自进化机制的触发条件和边界。
返回列表