别再把 AI Agent 当“会聊天的脚本”:Hermes Agent 源码级拆解(架构、框架、实战、趋势,一文吃透)

你以为 Agent 是"模型 + 几个工具函数 + while 循环"?

Hermes Agent 的源码会礼貌地提醒你:这只是开场白,后面还有缓存一致性、工具编排、网关生态、插件机制、调度系统、多代理协作、TUI 传输协议、测试工程化......

本文基于项目代码阅读与关键实现点核对,做一次"既硬核又好读"的技术全景解析。


一、先给结论:Hermes Agent 到底解决了什么问题?

如果你做过 AI 应用,应该很熟悉这三个痛点:

  1. 能力碎片化:聊天在一个地方,自动化在另一个地方,消息平台再来一套,最后系统像贴满便利贴的冰箱门。

  2. 会话不连续:每次重启都像失忆;要么上下文爆炸贵到心疼,要么历史信息压缩后"灵魂出窍"。

  3. 可扩展性虚高:口头上"插件化",实际每加一个能力都得改核心代码,越改越脆。

Hermes Agent 的核心价值,不是"它支持多少模型",而是它把 AI Agent 这件事做成了一个可长期运行、可持续进化、可跨平台协作 的工程系统。

从代码层看,它把"对话智能体"拆成了 8 个可以独立演进的子系统:

  • 代理主循环(run_agent.py

  • 工具发现与分发(model_tools.py + tools/registry.py

  • 工具集策略层(toolsets.py

  • 命令中枢(hermes_cli/commands.py + cli.py

  • 消息网关(gateway/

  • 插件与记忆后端(plugins/ + agent/memory_manager.py

  • 调度与协作(cron/ + kanban

  • 终端 UI 双端架构(ui-tui/ + tui_gateway/

一句话总结:
Hermes Agent 不是"单体聊天机器人",而是"可部署的 Agent 运行时平台"。


二、项目全景:它的技术框架不是"多",而是"有秩序"

很多项目喜欢堆关键词:CLI、Gateway、Plugin、Memory、Scheduler......看起来热闹,实际耦合复杂。Hermes 的有趣之处在于,它把这些组件做成了分层协同,而不是"混搭大杂烩"。

2.1 运行主轴:AIAgent 驱动一切

核心类 AIAgentrun_agent.py。它的 run_conversation() 不是简单"请求模型 -> 返回文本",而是一个完整的策略循环:

  • 构建消息上下文

  • 调用模型

  • 识别工具调用

  • 执行工具

  • 写回工具结果

  • 根据预算和迭代规则继续或收敛

这里最有工程味道的一点,是它把预算迭代 做成了显式边界。

主循环条件包含 max_iterationsiteration_budget.remaining 以及一次"grace call"兜底。这意味着它在架构层承认并处理了现实问题:模型不是每轮都能一次答对,工具链也不是每步都稳定。

2.2 工具系统:注册与暴露是两道门

tools/registry.py 负责"工具注册",toolsets.py 负责"工具授权可见"。

这在源码层是非常关键的架构选择:

  • discover_builtin_tools() 会扫描 tools/*.py,发现顶层 registry.register(...) 的模块并导入,完成"能力声明"。

  • 但模型真正能看到的 schema,要经过 get_tool_definitions() 按 toolset 组合后再输出。

这就像公司门禁:你有员工工牌(已注册)不代表你能进所有机房(已授权)。

2.3 命令系统:单一注册中心,避免多端分裂

hermes_cli/commands.pyCOMMAND_REGISTRY 是命令"唯一事实来源"。

CLI、网关帮助、自动补全、平台映射都从这个注册表派生,而不是各写一份配置。

这个设计有两个好处:

  1. 减少维护漂移:新增命令只改一处,系统自动同步到多个消费端。

  2. 保证行为一致resolve_command() 同时支持名称和别名,不会出现"CLI 能用、网关失效"的经典事故。

2.4 网关层:同一代理,多平台接入

gateway/run.pyGatewayRunner 聚合平台适配器(Telegram、Slack、Discord、Signal、Email 等)。

这意味着 Hermes 的运行方式不是"为每个平台重写一个 bot",而是"平台只负责接入,代理逻辑统一复用"。

从工程视角看,这是"控制面统一,接入面分离"。

2.5 插件层:让扩展先于改核心

hermes_cli/plugins.py 提供通用插件发现与生命周期钩子,plugins/memory/ 则是记忆后端的专用插件体系。

官方思路很明确:能插件化就不要硬编码进核心。

这对长期维护非常关键。你现在可能觉得"改核心快",半年后会发现"每次升级都要拆雷"。

2.6 TUI 双进程:UI 与 Agent 解耦

ui-tui(Node/Ink)与 tui_gateway(Python)通过 JSON-RPC over stdio 通信。

这是一个非常现代的终端应用设计:UI 可以高频迭代,Agent 引擎保持稳定,两边边界清晰、故障隔离更好。


三、核心架构深潜:主循环为什么"看起来慢",其实是"故意稳"

很多人看 Agent 循环会问:为什么这么多判断?能不能"更快更短"?

答案是:能,但你会在生产环境里付出代价。

3.1 预算控制:不是为了省 token,而是为了防失控

run_conversation() 的迭代预算,不只是成本控制,更是防止以下问题:

  • 工具反复失败导致死循环

  • 模型在复杂任务上过度试探

  • 单次会话长时间占用资源,影响并发

这类"软死锁"在 Demo 阶段不明显,一上生产就会频繁出现。Hermes 把它做成框架级规则,属于典型"早投资、少还债"。

3.2 中断能力:AI 系统必须支持"人类随时插话"

主循环中存在中断检查与活动触达更新。

它保证一个现实需求:当用户说"停一下,别删库了",系统要真的能停,而不是"等我跑完这个 60 秒命令先"。

这看似普通,实际上是很多 AI 工具最容易翻车的交互缺陷。

3.3 /steer 机制:把"微调方向"做成一等能力

Hermes 有个很实用的设计:/steer

它不是粗暴打断当前执行,而是在下次 API 调用前将引导消息注入到合适位置(优先工具消息后),尽可能不破坏对话角色序列。

这背后体现的是一个成熟观念:
用户对 Agent 的控制,不应只有"开始/停止",还要有"中途导向"。

3.4 API 消息副本策略:缓存一致性的关键一招

api_messages 与持久 messages 分离,是 Hermes 非常值得学习的细节。

  • 发送给模型前,可以临时注入记忆提示、插件上下文、缓存控制字段。

  • 但这些注入不必污染会话存储,避免后续缓存前缀失效或语义偏移。

如果你做过高并发 LLM 系统,就会知道这有多重要:

"看起来一样的 prompt",只要前缀稍有波动,缓存命中率就会掉到怀疑人生。

3.5 确定性 call_id:细节里的工程尊严

工具调用 ID 若随机生成,会让请求前缀每轮变化,影响缓存稳定。

Hermes 在代码中明确采用确定性方案,这是那种"没有它系统也能跑,但有了它系统更像产品"的细节。


四、工具框架拆解:从"工具多"到"工具可治理"

AI Agent 的工具能力常见三种灾难:

  1. 工具名越来越乱,模型经常调用错。

  2. 环境不满足时还暴露 schema,导致调用必失败。

  3. 说明文案交叉引用不存在工具,引发幻觉调用。

Hermes 的治理方式,可以浓缩成四个词:发现、裁剪、门控、分发

4.1 发现:自注册 + 自动导入

工具文件在顶层调用 registry.register(),再由 discover_builtin_tools() 扫描导入。

这减少了"新增工具忘记接线"的概率,开发体验更顺滑。

4.2 裁剪:toolset 作为策略层

toolsets.py 中,工具按场景打包(如 webterminalskillskanban 等),支持 includes 组合。

启用/禁用发生在策略层,不需要删工具代码。

这让运营策略和实现逻辑解耦:

同一套引擎,企业 A 只开只读工具,企业 B 开自动化工具,代码都不用改。

4.3 门控:check_fn 拦住"明知不可用"的能力

例如某些工具依赖外部环境、token 或特定运行上下文(如 Kanban worker 环境变量)。

check_fn 能在 schema 暴露前提前过滤,避免模型"看见但用不了"。

4.4 分发:统一入口处理错误与扩展钩子

handle_function_call() 做了很多"你平时不想写,但线上必须有"的事:

  • 参数预处理

  • 插件前置拦截(可 block)

  • 调用耗时统计

  • 错误统一包装

这意味着业务工具实现可以专注本身,不必每个工具都复制异常处理模板。


五、命令系统:为什么说它是"交互层的中台"?

命令系统看起来像"UI 功能",其实它是协同运行时策略的重要一环。

5.1 单一注册中心,解决的是组织复杂度

COMMAND_REGISTRY 并不炫技,但它解决了一个团队协作的大问题:
新功能接入路径统一,评审和测试边界明确。

当命令分散在多个文件时,代码会慢慢出现:

  • 文档与实现不一致

  • 别名冲突

  • 平台分支行为分裂

Hermes 的做法是"入口统一 + 派生结构自动生成"。

5.2 活跃会话旁路:避免"命令被吞"这类隐蔽 Bug

系统里明确维护了 active session bypass 逻辑,防止运行中命令被错误排队或丢弃。

这一块看似边角,实则关系到用户信任:你发了 /stop,系统如果不马上停,体验会直接塌。

5.3 命令不仅是控制台语法,更是产品能力映射

从命令列表可以看出 Hermes 的能力边界已经超出聊天:

  • /cron:定时作业

  • /kanban:多代理协作板

  • /curator:技能生命周期维护

  • /reload-mcp:外部能力热更新

这说明它在产品定位上已经不是"问答助手",而是"AI 自动化操作系统"。


六、网关架构:多平台消息入口如何不把系统拖垮?

"一个机器人对接十个平台"听起来很爽,但工程上最容易变成事故现场。

Hermes 网关的可取之处,是它坚持了适配器分层与统一调度。

6.1 适配器职责单一

gateway/platforms/base.py + 各平台实现文件,强调的是:

  • 平台协议差异在适配器里吸收

  • 业务流程和 agent 调度不散落到平台代码里

这就是经典"变化隔离"。

6.2 GatewayRunner 统一编排

GatewayRunner 管理消息处理流程与会话状态,典型链路包括:

  • 接收平台消息

  • 命令识别

  • 活跃会话处理

  • 调用 agent

  • 回传结果

你可以把它理解为"Agent API 网关 + 会话路由器"。

6.3 插件前置拦截让治理更灵活

pre_gateway_dispatch 钩子允许在消息进入核心流程前做 rewrite/skip。

这非常适合企业场景中的审计、策略过滤、灰度控制。


七、插件与记忆:Hermes 的"长期主义"体现在哪?

短期看,插件像"可选功能";长期看,它决定了你的系统能不能健康迭代。

7.1 通用插件:功能扩展不污染主干

hermes_cli/plugins.py 支持多来源插件发现(仓库内、用户目录、项目目录、pip entry points)。

并提供生命周期钩子(如 tool 调用前后、LLM 调用前后、会话生命周期等)。

它的意义在于:
复杂需求可以外挂,不必每次都去改 run_agent.pycli.py

7.2 记忆插件:把"长期上下文"做成可替换后端

plugins/memory/ 是专门的内存后端扩展面,MemoryManager 负责统一编排。

源码中对外部 provider 数量、流式记忆片段清洗等都有明确约束。

这说明 Hermes 对"记忆"不是停留在概念层,而是认真处理了三个现实问题:

  1. 多后端冲突

  2. 输出污染(记忆片段泄漏)

  3. 运行时性能

7.3 为什么说这比"把历史全塞 prompt"更高级?

因为它承认并解决了两个事实:

  • 上下文窗口是有限且昂贵的

  • 长期记忆需要检索策略,而不是机械拼接

所以 Hermes 的思路不是"多喂点历史",而是"在正确时机喂正确信息"。


八、调度系统:Cron 与 Kanban 不是附属功能,而是第二增长曲线

很多 Agent 项目只做到"有人提问我回答"。

Hermes 明显在走更高一层:无人值守自动化 + 多代理协同生产

8.1 Cron:把一次性能力变成持续价值

cron/scheduler.py 体现的关键设计:

  • tick.lock 防止并发 tick

  • 作业工具集可精细裁剪

  • skip_memory=True 避免 cron 任务污染用户主会话心智模型

  • 基于"无活动超时"而不是一刀切 wall-clock

这说明它针对生产环境中的"挂死任务、假成功、隐性资源占用"做了直接治理。

8.2 Kanban:多代理协作不是"并发调用 API"那么简单

Kanban 模块的价值在于任务边界与隔离

  • worker 启动时注入任务/板级环境变量

  • 工具层检查 task ownership,避免越权修改其他任务

  • dispatcher 循环推进任务状态

这比"开几个线程跑子任务"成熟得多。

因为协作系统的核心不是并发,而是状态一致性和责任清晰


九、TUI 架构:终端也可以有"前后端分离"

9.1 JSON-RPC over stdio 的现实意义

ui-tuitui_gateway 采用换行分隔 JSON-RPC 通信。

这带来的好处:

  • 协议可测试、可演进

  • UI 与引擎独立崩溃域

  • 不同客户端(stdio / WebSocket)可复用同一 dispatch 语义

一句人话:
你的终端 UI 不再是"黑盒脚本",而是有契约的客户端。

9.2 为什么不是"全 Python 一把梭"?

可以,但会牺牲交互层迭代速度与生态。

Node/Ink 在终端交互体验上更灵活,Python 侧保留 agent 核心逻辑,两边各做擅长的事,这就是工程上的"专业分工"。


十、配置与测试体系:决定项目能不能"久跑不崩"

10.1 配置加载是三套路径,不是一把钥匙

Hermes 同时存在 CLI、框架级与网关场景的配置读取路径。

这提醒我们:新增配置项时,不只改默认值,还要确认它在不同运行面都可见。

10.2 Profile 机制:多实例隔离不是"多份配置文件"那么浅

通过尽早设置 HERMES_HOME,让配置、记忆、会话、日志等都按 profile 隔离。

这是面向团队/多租户/多业务环境非常实用的能力。

10.3 测试脚本的"强约束"值得抄作业

scripts/run_tests.sh 强制:

  • 统一 worker 数

  • 统一时区与 locale

  • 清理 credential 类环境变量

  • 统一入口执行 pytest

这类约束会减少"本地过、CI 挂"的无效沟通,属于工程效率放大器。


十一、怎么用起来?从 0 到 1 的实战路径(Windows 用户友好版)

说明:Hermes 官方建议在 Linux/macOS/WSL2 环境运行。

你是 Windows 用户的话,最佳实践是 WSL2 里部署,IDE 可以继续用 Windows 侧。

11.1 基础启动链路

  1. 进入项目并安装依赖(或按官方安装脚本)

  2. 配置模型提供商

  3. 启动 CLI(hermes

  4. 根据业务启用工具集(hermes tools

  5. 需要多平台消息接入时启动 gateway

11.2 日常高频命令思路

  • hermes model:模型切换与验证

  • hermes tools:按场景启停工具集

  • hermes gateway:消息入口编排

  • /compress:长会话上下文治理

  • /cron:将一次性流程转定时任务

  • /kanban:复杂协作任务拆解与跟踪

11.3 什么时候该用插件而不是改核心?

满足任一条件就建议插件化:

  • 需求只服务于你的组织,不具备普适性

  • 迭代频率高,随业务变化快

  • 需要快速试错,不能频繁动核心链路

一句调侃:

改核心像"动承重墙",插件像"换家具"------前者要审批,后者要审美。


十二、三类典型应用场景:把源码能力变成业务价值

场景 A:企业内部智能运维与日报自动化

目标:每天 9 点自动生成系统健康日报并推送到 Slack/Telegram。

可落地链路:

  1. 通过 cron 创建每日任务

  2. 任务中调用终端/检索工具采集指标

  3. 汇总后由消息网关推送指定频道

  4. 出现异常时可触发审批或人工接管

为什么靠谱:

Cron 的活动超时与失败守卫避免"卡死还显示成功"的伪稳定。

场景 B:个人开发者"全天候编程搭子"

目标:在 CLI/TUI 中连续开发,跨会话保留习惯与上下文。

可落地链路:

  1. 开启技能与记忆能力

  2. 在复杂任务后沉淀技能模板

  3. /compress 管理长上下文成本

  4. 必要时用 delegate_task 并行处理子任务

为什么好用:

主会话与临时注入上下文分离,既能"记住你",又不至于"记忆污染"。

场景 C:多团队项目交付(Kanban + 子代理)

目标:把一个大任务拆成多个可并行子任务,自动汇总状态。

可落地链路:

  1. 在 Kanban 中建立主任务与子任务关系

  2. dispatcher 自动 claim 与派发

  3. worker 基于任务所有权执行并回写状态

  4. orchestrator 汇总结果并生成交付报告

为什么可控:

worker 受任务与板级环境约束,不会乱改隔壁任务。


十三、从架构视角看 Hermes 的"高级感"到底在哪?

这里给出 10 条我认为最值得借鉴的设计判断:

  1. 把缓存一致性当一等公民,而不是性能优化的附属品。

  2. 把工具注册和工具暴露分离,减少"声明即授权"的风险。

  3. 命令系统中心化,避免多端行为漂移。

  4. 网关层只做适配与编排,不吞业务逻辑。

  5. 插件优先于核心硬编码,给演进留出空间。

  6. 记忆采用检索与注入策略,而不是上下文无限堆叠。

  7. 调度系统显式处理失败与锁,避免"快乐路径幻觉"。

  8. 多代理协作强调所有权与隔离,而不只是并发数量。

  9. UI 与引擎协议化通信,提高可维护性和可替换性。

  10. 测试运行环境工程化约束,把一致性写进脚本而不是写进口号。


十四、常见误区与避坑指南(非常实用)

误区 1:新增工具后,模型却调用不到

原因通常是:你只做了 registry.register(),没把工具放进对应 toolset。

解决:检查 toolsets.py 以及启用/禁用配置。

误区 2:网关里插件逻辑不生效

原因可能是发现时机问题。

解决:确认插件发现路径与加载时序,必要时显式 discover。

误区 3:长会话越来越贵,回答质量还下降

原因往往是上下文治理策略缺失。

解决:使用压缩、记忆检索注入、明确任务边界,不要无限堆历史。

误区 4:多代理"看起来很忙",结果不可控

原因是只有并发,没有状态规范。

解决:用 Kanban 的任务模型、所有权约束、生命周期信号。

误区 5:测试总是本地过 CI 挂

原因是环境不一致。

解决:统一用 scripts/run_tests.sh,不要各自"自由发挥"。


十五、未来趋势:Hermes 这类架构会往哪走?

结合当前源码形态与行业方向,我判断未来会沿着五条线增强:

15.1 工具调用将进入"策略编排时代"

不是"模型想调谁就调谁",而是根据任务类型、成本预算、风险等级动态编排。

Hermes 已有 toolset 与 check_fn 基础,下一步会是更细粒度策略引擎。

15.2 记忆系统会从"可用"走向"可解释"

未来不仅要能注入记忆,还要回答"为什么注入这条、没注入那条"。

这对企业审计与高风险场景非常重要。

15.3 多代理协作会标准化接口

Kanban 已展示任务模型雏形。后续趋势是跨系统协作协议化,让不同 agent runtime 能互通任务状态与责任链。

15.4 Gateway 会成为 AI 的"统一入口层"

平台越来越多,业务不会愿意多套逻辑重复开发。

统一网关 + 平台适配器的模式会成为标配。

15.5 终端 UI 会继续向"可编程客户端"演进

TUI 与 WebSocket 共用 JSON-RPC dispatch 的思路,天然支持多终端共享同一核心能力。

将来你会看到更多"一个 Agent 内核,多形态前端"。


十六、给开发者的落地建议(拿来就能用)

如果你准备二次开发 Hermes 或借鉴其架构,建议按这个顺序推进:

  1. 先确定运行边界:单机、团队内网、云端多租户?

  2. 再定义工具策略:默认开哪些 toolset,哪些必须审批?

  3. 然后做插件扩展:优先插件化,不急着改核心。

  4. 最后做自动化调度:从一个 cron 任务开始,逐步扩展。

工程上最怕的不是"慢",而是"快但返工"。

Hermes 的设计给我们的最大启发是:
先把演进路径设计出来,再让功能增长。


十七、写给普通读者:看不懂代码也能理解这件事

你可以把 Hermes 想成一家"超级自动化公司":

  • run_agent.py 是总经理,负责决策循环;

  • 工具系统是各部门员工;

  • toolset 是权限系统;

  • gateway 是客服与渠道团队;

  • plugin 是外部顾问;

  • cron 是日程秘书;

  • kanban 是项目管理办公室;

  • TUI 是前台大屏。

真正厉害的公司,不是员工会聊天,而是流程能跑、知识能留、系统能扩、风险可控。

Hermes 正在做的,就是把这些"公司治理能力"移植到 AI Agent 里。


十八、结语:当我们谈 Agent 架构时,我们到底在谈什么?

不是在谈"模型参数有多大",也不是在谈"能连多少 API"。

我们真正该谈的是:

  • 它能否稳定运行?

  • 能否长期进化?

  • 能否被团队协作?

  • 能否在成本与风险之间找到平衡?

Hermes Agent 的源码给出了一个很务实的答案:
把 Agent 当系统工程做,而不是当提示词魔法做。

这也是它最值得技术人深入研究的地方。


附录 A:适合 CSDN 发布的摘要文案(可选)

这不是一篇"AI Agent 入门科普",而是一篇"源码级工程拆解"。

run_agent.py 主循环到工具注册分发,从网关适配到插件机制,从 cron 调度到 kanban 多代理协作,再到 TUI JSON-RPC 双端通信,完整呈现 Hermes Agent 如何从"会聊天"走向"可长期运行的 AI 自动化平台"。

适合:架构师、AI 工程师、平台工程团队、想搭建企业级 Agent 基础设施的技术负责人。


附录 B:建议配图清单(发布时可补)

  1. 架构总览图:AIAgent / Tool Registry / Gateway / Plugins / Scheduler / TUI

  2. 工具调用时序图:模型响应 -> tool_calls -> dispatch -> tool result -> next turn

  3. 多平台接入图:Telegram/Slack/Discord -> GatewayRunner -> AIAgent

  4. 多代理协作图:Kanban dispatcher -> worker agents -> task state transitions

  5. 配置隔离图:profiles 与 HERMES_HOME 的关系


如果你愿意,我可以下一步直接给你生成:

  • 一版"更偏面试与简历输出"的 3000 字精华版;

  • 一版"偏 CTO 决策"的架构评估版(含成本、风险、ROI);

  • 一版"偏实操教程"的从安装到跑通的图文版(按 Windows + WSL2 路线)。

更多AIGC文章

RAG技术全解:从原理到实战的简明指南

更多VibeCoding文章

相关推荐
暖核2 分钟前
Linux实战入门:从零编写第一个Bash Shell脚本
linux·运维·bash
爱敲键盘的猴子6 分钟前
深入理解 Java HashMap
java·hashmap
霸道流氓气质7 分钟前
Java开发者AI编程常用MCP、Skills、Rules全景汇总
java·开发语言·ai编程
随风而飘18616 分钟前
罗德与施瓦茨(R&S)SMB100B中端高性能模拟射频/微波信号发生器
网络·功能测试·科技·测试工具
天涯醉青楼19 分钟前
Spring Boot 接口返回 Bean 时字段名“变形”的深度剖析与解决方案
java
March.s32 分钟前
深入理解 Linux 系统启动原理
linux·运维·服务器
步行cgn36 分钟前
MyBatis 高级映射与延迟加载完全指南
java·tomcat·mybatis
thefool11226636 分钟前
从中序与后序遍历序列构造二叉树
java
吴声子夜歌1 小时前
Java面试题——JVM(二)
java·开发语言·jvm
CRMEB1 小时前
商城大促活动策划全流程:从定目标到复盘四阶段
java·开发语言·人工智能·ai·开源·php