不只是另一个 Agent:Hermes 的设计赌注
本章核心源码:
README.md、pyproject.toml、run_agent.py(416+ AIAgent 类定义)
定位:全书导论。本章不讨论代码细节,而是建立分析框架——Hermes 的四个设计赌注。这些赌注贯穿后续 22 章的每一个工程决策。 前置依赖:无。适用场景:初次接触 Hermes,需要理解它与其他 agent 工具的本质差异。
一个奇怪的开源项目
2025 年底,Nous Research 开源了一个 AI agent 项目。它不是用 TypeScript 写的 Web 应用,不是可以拖拽连线的 workflow 编辑器,也不是用 Jupyter Notebook 展示的 demo。它是一个 Python CLI 程序,运行在终端里,通过 pip install 安装,用 SQLite 存数据,用 Markdown 文件存技能。
这个项目叫 Hermes Agent。
乍看之下它像是一个逆潮流的产品:当整个行业在做 Web UI、做 SaaS 平台、做多人协作时,Hermes 选择了终端、单用户、本地存储。但仔细读完它的代码库,9431 行的核心编排器、数十个工具实现、16 个 Gateway 平台类型、8 个可插拔的记忆后端,会让你发现这些"逆潮流"的选择不是偶然的。它们是四个深思熟虑的设计赌注。
本章定义这四个赌注,分析它们与同类工具的差异,并提供一张全书的阅读路线图。
四个设计赌注
所谓"设计赌注",是指那些在项目早期做出的、难以逆转的、影响全局的架构选择。它们不是功能需求——功能可以迭代,架构选择一旦确定,后续所有代码都在它的约束下生长。
Hermes 的四个赌注分别是:
赌注一:Learning Loop — Agent 能从经验中学习
大多数 agent 框架的知识是静态的:开发者写 prompt、注册工具、配置 RAG pipeline,agent 在这个固定的知识框架内运行。用户遇到的问题和 agent 找到的解法不会被保留——下次遇到同样的问题,agent 从头开始。
Hermes 赌的是:agent 应该能从工作经验中提炼过程性知识(技能),在后续工作中检索和使用这些知识,并在使用过程中持续改进它们。
这个赌注的工程含义:
- 技能系统(第 8 章):agent 将解决复杂问题的过程写成 Markdown 文件(技能),存储在当前
HERMES_HOME/skills/目录下(默认 profile 下表现为~/.hermes/skills/)。技能不是文档——它们有 YAML frontmatter 描述平台兼容性、工具依赖和标签,支持条件加载和按需检索 - Memory Nudge(第 4 章):编排器内置计数器(
_skill_nudge_interval = 10),每 10 次工具调用检查一次是否应该创建技能。这不是可选的"记忆功能",而是编排循环的核心组成部分 - Background Review(第 4 章):
_spawn_background_review()在后台线程中启动一个独立的 AIAgent 实例,审查对话历史,决定是否创建或改进技能。这个审查不阻塞当前响应 - 使用时改进:system prompt 中的
SKILLS_GUIDANCE指示模型"发现技能过时或不准确时立即 patch",形成正反馈循环
Learning Loop 不是一个附加功能,而是 Hermes 的核心假设:一个 agent 如果不能从经验中学习,就只是一个更好的 chatbot。
赌注二:CLI-First — 终端是第一等公民
"CLI-First"不是说"只有 CLI"——Hermes 的 Gateway 当前支持 16 个平台类型(其中 15 个是消息/交互平台,另有 1 个 local 调试入口)。CLI-First 的含义是:终端交互体验被当作核心产品来设计,不是 Web UI 的降级替代。
这个选择的证据:
- cli.py 有 8736 行(第 13 章):这不是一个调用
input()的薄壳。它是一个完整的 TUI(Terminal User Interface),基于 prompt_toolkit 构建,支持多行编辑、流式输出、slash command 自动补全、会话历史导航、中断和重定向 - 回调体系(第 4 章):
AIAgent的 11 个回调接口的设计优先服务于 CLI 场景——stream_delta_callback为流式渲染设计,clarify_callback为交互式确认设计,tool_gen_callback为实时显示工具参数设计 - 配置系统(第 17 章):
hermes model、hermes tools、hermes config set都是交互式 CLI 命令,不需要手动编辑 YAML 文件 - 终端后端(第 16 章):六种执行环境(Local、Docker、SSH、Daytona、Singularity、Modal)都通过终端接口暴露,不依赖 Web dashboard
CLI-First 的架构后果是深远的:因为终端是主入口,Hermes 的状态管理基于文件系统和 SQLite(而非云数据库),进程模型基于单进程多线程(而非微服务),部署模型基于 pip install(而非 Docker compose + 数据库 + 缓存)。
赌注三:Personal Long-Term — 个人的、长期的
Hermes 不是一个共享的 AI 助手平台。它是一个属于你个人的 agent,理解你的工作习惯、记住你的偏好、随时间推移建立对你的认知模型。
工程实现:
- 跨会话记忆(第 10、11 章):
SessionDB持久化所有会话历史到 SQLite,MEMORY.md和USER.md存储长期记忆和用户档案。FTS5 全文检索让 agent 可以搜索过去的对话 - 用户建模(第 11 章):Honcho provider 实现 dialectic 用户建模——不只是记住你说过什么,而是推断你的工作模式、偏好和习惯
- 记忆 Nudge(第 4 章):
_memory_nudge_interval = 10,每 10 个 user turn 检查一次是否应该更新记忆。这让记忆积累是自动的,不需要用户主动说"记住这个" - 单用户数据模型(第 10 章):当前
HERMES_HOME/下的所有数据(state.db、skills/、config.yaml)都属于一个用户;默认 profile 下这个目录表现为~/.hermes/。Gateway 场景下通过user_id隔离不同的消息平台用户,但底层仍然是单实例
"Personal"意味着 Hermes 不追求多租户、不追求团队协作、不追求 SaaS。这个限制是有意的——多租户架构会让记忆系统、技能系统和配置系统的复杂度倍增,而这些系统恰好是 Hermes 的核心差异。
赌注四:Run Anywhere — 从 $5 VPS 到 GPU 集群
Hermes 的部署目标不是"运行在开发者的笔记本上",而是"运行在任何你有 SSH 的地方"。这意味着:
- 零外部依赖(第 10 章):数据存储用 SQLite(不需要 PostgreSQL),搜索用 FTS5(不需要 Elasticsearch),调度用 croniter(不需要 Redis)。
pip install后即可运行 - 资源敏感(第 19 章):同步编排器 + 按需 async 桥接的并发模型控制内存占用。IterationBudget 防止 agent 无限循环消耗资源。上下文压缩在 token 使用接近阈值时自动触发
- 多平台投射(第 14 章):同一个 agent 进程可以同时连接 Telegram、Discord、Slack,通过 Gateway 接收消息。你可以在 $5 VPS 上运行
hermes gateway start,然后通过手机上的 Telegram 与 agent 对话 - 六种终端后端(第 16 章):Local、Docker、SSH、Daytona、Singularity、Modal。Daytona 和 Modal 提供 serverless 持久化——环境在空闲时休眠,按需唤醒
- Fallback Provider(第 4 章):主模型不可用时自动切换到备选模型链,不需要人工干预
Run Anywhere 的极端测试是:在一台只有 512MB RAM 的 $5 VPS 上,通过 Telegram 与 Hermes 对话,agent 执行命令、创建技能、压缩上下文、自动管理会话——全部正常工作。
赌注之间的张力与协同
四个赌注不是独立的,它们之间存在张力和协同:
| Learning Loop | CLI-First | Personal | Run Anywhere | |
|---|---|---|---|---|
| Learning Loop | — | 技能文件用 Markdown 存在本地文件系统,CLI 的文件操作优势 | 技能是个人的,不共享 | 技能文件跟随部署,不依赖云服务 |
| CLI-First | CLI 是技能创建和查看的最佳界面 | — | 终端天然是单用户的 | CLI 程序天然可以在任何有终端的地方运行 |
| Personal | 个人使用才能积累有意义的技能和记忆 | — | — | 个人部署不需要多租户基础设施 |
| Run Anywhere | — | — | — | — |
最大的张力在 CLI-First 和 Run Anywhere 之间:如果 agent 运行在远程 VPS 上,用户怎么通过 CLI 交互?Hermes 的回答是 Gateway——它不放弃 CLI 的交互品质,而是通过 BasePlatformAdapter 将相同的编排逻辑投射到消息平台。用户可以在本地用 CLI,也可以在远程用 Telegram,两种方式共享同一个 AIAgent 内核。
与同类工具的设计差异
理解 Hermes 的设计赌注,最好的方式是和同类工具做架构层面的对比。以下不是功能对比表(那种表格到处都是),而是分析每个工具做了什么设计选择,为什么。
Claude Code:厂商绑定的极致优化
Claude Code 是 Anthropic 官方的编码 agent。它的设计选择:
- 单模型绑定:只支持 Claude 系列模型。这让它可以针对 Claude 的特性做深度优化——prompt caching 策略、thinking budget 控制、extended thinking 集成——但代价是完全锁定在一个 provider
- 无持久学习:Claude Code 有 CLAUDE.md 项目上下文文件,但没有 agent 自主创建和改进的技能系统。它的知识在会话结束后不会增长
- 编码专用:工具集聚焦于代码编辑(search、edit、bash),不提供通用的浏览器、文件管理、消息平台集成
- 短会话模型:每次运行是一个独立任务,不追求跨会话记忆和用户建模
Hermes 与 Claude Code 的核心差异不在功能多少,而在时间维度:Claude Code 优化的是单次编码任务的效率,Hermes 优化的是长期协作关系的价值积累。前者像一个顶级外包,后者像一个长期助理。
Cursor:IDE 内的 AI 增强
Cursor 选择了一条完全不同的路:嵌入 IDE。
- 编辑器绑定:Cursor 是 VS Code fork,AI 能力深度集成到编辑器的 UI 和操作模型中。这给了它无与伦比的代码上下文理解(AST、文件树、符号引用),但也意味着它只能在 Cursor 编辑器内运行
- Tab 补全优先:Cursor 的核心体验是 inline completion 和 Chat + Apply,不是自主执行。用户始终在循环中,agent 的自主性有限
- 无多平台:Cursor 不能运行在 Telegram 上,不能作为 systemd 服务持续运行,不能在 VPS 上无人值守
- 共享知识库:Cursor 的 Rules 和 .cursorrules 是项目级配置,不是 agent 从经验中自主积累的
Hermes 与 Cursor 的核心差异在自主性光谱上的位置:Cursor 是"人在循环中的 AI 增强编辑器",Hermes 是"可以自主执行的 AI agent"。两者服务于不同的使用场景。
Aider:纯粹的编码 agent
Aider 是开源社区中最成功的编码 agent 之一。它和 Hermes 的相似之处最多——都是 CLI 程序,都是 Python,都支持多模型。
- 编码专精:Aider 的工具集完全面向代码——diff 编辑、git 集成、代码搜索。它不做浏览器、不做消息平台、不做定时任务
- 无学习闭环:Aider 有
.aider.conf.yml和 conventions file,但没有 agent 自主创建的技能系统。它的"记忆"限于 git history 和 repository map - 单会话模型:Aider 的会话不持久化,没有跨会话搜索和记忆
- 轻量架构:Aider 的代码库比 Hermes 小一个数量级,因为它不需要处理多平台、记忆管理、技能系统等横切关注点
Hermes 与 Aider 的差异在范围:Aider 做好了"CLI 编码 agent"这一件事,Hermes 试图做"通用个人 agent"。Aider 的简洁是优势——更少的代码意味着更少的 bug。Hermes 的广度是赌注——它赌通用 agent 的长期价值高于专用工具。
Open Interpreter:概念先驱
Open Interpreter 是最早的"让 LLM 执行代码"开源项目之一。它证明了一个概念:agent 可以在本地终端执行任意代码。
- 代码执行优先:Open Interpreter 的核心是一个 REPL——让模型写 Python/Shell/JS 并执行。工具系统相对简单
- 轻量级状态:没有 SQLite 持久化,没有跨会话记忆,没有用户建模
- 单平台:只有 CLI 和 Python SDK 两种入口
- 迭代速度放缓:作为概念先驱,Open Interpreter 在后续迭代中将重心转向了 01 Light 硬件和 OS 模式
Hermes 从 Open Interpreter 的方向继续前进——保留了"agent 执行代码"的核心能力,但在此基础上构建了完整的记忆系统、技能系统、多平台投射和生产级稳定性。
对比总结
| 维度 | Hermes | Claude Code | Cursor | Aider |
|---|---|---|---|---|
| 学习闭环 | 技能系统 + background review | 无 | 无 | 无 |
| 记忆持久化 | SQLite + Memory Provider | 会话级 | 工作区级 | 无 |
| 多平台入口 | CLI + 16 消息平台 | CLI | IDE | CLI |
| 模型支持 | 任意 OpenAI/Anthropic 兼容 | 仅 Claude | 多模型(封闭) | 多模型 |
| 自主性 | 高(自主创建技能、后台审查) | 中 | 低(人在循环中) | 中 |
| 部署范围 | $5 VPS ~ GPU 集群 | 本地 | 本地 | 本地 |
这个对比不是说 Hermes 在每个维度都更好——Claude Code 在单次编码任务上可能比 Hermes 更高效,Cursor 在编辑器内的体验更流畅,Aider 的简洁让它更容易维护。差异在于:这些工具优化的是单次交互的效率,Hermes 优化的是长期关系的价值积累。
"Self-Improving"的工程含义
Hermes 自称"self-improving AI agent"。这不是营销用语——它有具体的工程含义。
"Self-improving"在 Hermes 中由三个机制组成:
机制一:技能系统
技能是 agent 从工作经验中提炼的过程性知识。工程实现:
用户提出复杂任务
→ agent 用 5+ 个工具调用完成任务
→ system prompt 中的 SKILLS_GUIDANCE 提示"完成复杂任务后保存为技能"
→ agent 调用 skill_manage(action="create") 创建技能
→ 技能存储为当前 HERMES_HOME/skills/category/skill-name.md(默认 profile 下表现为 ~/.hermes/skills/category/skill-name.md)
→ 下次遇到类似任务时,agent 从索引中找到并检索这个技能
→ 如果发现技能过时,agent 调用 skill_manage(action="patch") 改进
关键点:技能的创建和改进由 agent 自主完成,不需要用户参与。用户感知到的是"agent 第二次做这件事比第一次快"。
机制二:Memory Nudge
编排器内置的定期检查机制:
每 10 个 user turn → 检查是否应该更新 MEMORY.md / USER.md
每 10 个 tool iteration → 检查是否应该创建技能
Nudge 不强制行动——它触发一个后台审查(_spawn_background_review),由一个独立的 AIAgent 实例分析对话历史并决定是否值得保存。这个设计避免了两个极端:不 nudge 则 agent 永远不会主动学习,过度 nudge 则每次对话都浪费 token 在无意义的审查上。
机制三:Background Review
后台审查是 Learning Loop 的最后一环:
# run_agent.py:1718 (简化)
def _spawn_background_review(self, messages_snapshot, ...):
def _run_review():
review_agent = AIAgent(model=self.model, max_iterations=8, quiet_mode=True)
review_agent._memory_store = self._memory_store # 共享记忆
review_agent.run_conversation(prompt, messages_snapshot)
threading.Thread(target=_run_review, daemon=True).start()
三个关键设计选择:
- 独立 agent:review agent 有自己的 IterationBudget(max_iterations=8),不会无限消耗资源
- 共享记忆:review agent 直接写入主 agent 的
_memory_store,不需要 IPC - 后台线程:daemon 线程,不阻塞当前响应,进程退出时自动终止
这三个机制共同构成了一个完整的学习闭环:工作 → nudge 检查 → 后台审查 → 创建/改进技能和记忆 → 下次工作时使用。
阅读路线图
全书 23 章 + 4 个附录,覆盖 Hermes 的完整架构。以下按四种读者画像提供推荐路径:
路径 A:全栈理解
适合:想完整理解 Hermes 系统设计的开发者
前言 → Ch02 仓库地图
→ Ch03 请求旅程 → Ch04 AIAgent 内核 → Ch05 提示词系统
→ Ch06 工具系统 → Ch07 工具剖面 → Ch08 技能系统 → Ch09 子代理
→ Ch10 SessionDB → Ch11 Memory Provider → Ch12 上下文压缩
→ Ch13 CLI/TUI → Ch14 Gateway → Ch15 定时调度 → Ch16 执行环境
→ Ch17 配置系统 → Ch18 模型抽象 → Ch19 并发模型
→ Ch20 进程生命周期 → Ch21 运行时容错 → Ch22 测试体系
→ Ch23 设计哲学
建议节奏:Part 2(Ch03-05)是核心,理解后再读其他章节会顺畅得多。
路径 B:想构建类似系统
适合:想构建自己的 AI agent 的开发者,关心"怎么设计"而非"怎么用"
Ch01 设计赌注(本章)
→ Ch04 AIAgent 内核(编排循环设计)
→ Ch06 工具系统(自注册 + 按需暴露)
→ Ch08 技能系统(learning loop 实现)
→ Ch11 Memory Provider(可插拔记忆后端)
→ Ch14 Gateway(多平台投射)
→ Ch19 并发模型(async/sync 桥接)
→ Ch23 设计哲学
这条路径聚焦设计决策和 trade-off,跳过了具体的工具实现细节。
路径 C:稳定性工程
适合:关心"怎么让 agent 7x24 不崩溃"的 SRE、运维或后端开发者
Ch20 进程生命周期(信号处理、优雅关停)
→ Ch21 运行时容错(SafeWriter、重试、断线重连)
→ Ch10 SessionDB(SQLite WAL、jitter retry)
→ Ch19 并发模型(线程隔离、IterationBudget)
→ Ch14 Gateway(多平台连接管理)
→ Ch12 上下文压缩(长对话 token 控制)
→ Ch22 测试体系(400+ 个测试如何保障稳定)
这四章构成 Hermes 的"四层稳定性防御":进程级 → 运行时级 → 数据级 → 架构级。
路径 D:记忆与学习
适合:关心"agent 如何越用越懂你"的 AI 研究者或产品经理
Ch08 技能系统(过程性知识的创建和检索)
→ Ch10 SessionDB(会话持久化和跨会话搜索)
→ Ch11 Memory Provider(8 种记忆后端对比)
→ Ch12 上下文压缩(长对话中如何保留重要信息)
→ Ch05 提示词系统(记忆如何注入 system prompt)
→ Ch04 AIAgent 内核(nudge 和 background review)
→ Ch15 定时调度(自动化记忆整理)
这条路径追踪的是 Hermes 的"Personal Long-Term"赌注如何在工程上实现。
一个赌注的代价
每个赌注都有代价。本书不回避它们:
- Learning Loop 的代价:技能系统增加了 system prompt 的 token 开销(索引部分)和后台 API 调用成本(background review)。低质量的技能可能误导 agent
- CLI-First 的代价:
cli.py的 8736 行代码维护成本高。终端的渲染限制(无法显示图片、表格有宽度限制)需要额外处理 - Personal 的代价:单用户假设让 Hermes 不适合作为团队共享的 AI 平台。数据隔离依赖文件系统权限
- Run Anywhere 的代价:SQLite 的并发写入限制需要 application-level 的 jitter retry。六种终端后端各有不同的配置和调试复杂度
这些代价在后续章节的"设计启示"部分会详细讨论。好的工程分析不回避 trade-off。
开始旅程
从下一章开始,我们将进入 Hermes 的代码。第 2 章提供一张仓库地图——五层架构的全景视图——让你知道后续每一章分析的代码在系统中的位置。
如果你已经读过第 2 章及后续内容(这是本书最后写完的一章),欢迎回到这里重新审视四个赌注。在读完全书后回看这些设计选择,你会有不同的理解。
设计赌注回扣:本章定义了全部四个设计赌注:Learning Loop(技能系统 + nudge + background review)、CLI-First(终端作为第一等公民)、Personal Long-Term(跨会话记忆 + 用户建模)、Run Anywhere(零外部依赖 + 多平台投射)。后续每一章都将回扣到至少一个赌注。
版本演化说明
本章分析基于 Hermes Agent v0.8.0(2026 年 4 月)。 四个设计赌注自项目创建以来保持稳定。具体的工程实现(如技能系统的条件加载、Gateway 的平台数量)随版本迭代持续扩展,但核心的架构假设未变。