@tonysimons_: https://x.com/tonysimons_/status/2073880068657471523

X AI KOLs Timeline 工具

摘要

详细的技术解析,说明Hermes Agent的结构化处理循环与基础聊天机器人的不同之处,包括提示组装、提供者解析、工具分发和结果评估。

https://t.co/iQKmiNmDSs
查看原文
查看缓存全文

缓存时间: 2026/07/06 14:13

Hermes Agent 大师班第1部分:Hermes Agent 实际上是如何处理工作的

你使用过的每个AI聊天机器人都有相同的架构:输入一条消息,模型生成一个响应。

一步完成。

Hermes的不同之处在于,从截图中并不明显。

当你向它发送消息时,它会经历一个结构化的过程——提示组装、提供者解析、API调用、工具调度、结果评估和上下文持久化——然后才做出响应。

有些消息会触发十次工具调用,每一次调用都会反馈给模型进行另一轮推理。然后会话被保存,记忆被刷新,整个系统准备好稍后恢复。

这就是一个代理循环

理解它的工作原理是理解为什么这个工具会以基本聊天机器人无法实现的方式产生复合效应的关键。

以下是每次你发送消息时,在底层发生的情况。

代理循环,而非聊天循环

聊天机器人有一个简单的架构:

用户消息 -> 模型预测 -> 响应

每次输入都是针对静态训练数据的一次全新推理。

模型不执行任何操作。它不检查任何内容。它基于训练期间学到的知识进行猜测。

Hermes有一个循环。

AIAgent 类位于 run_agent.py 中,负责处理单个回合的整个生命周期:

  • 提示组装
  • 提供者选择
  • API调用
  • 工具调度
  • 压缩
  • 回退
  • 持久化

它支持三种API执行模式(OpenAI聊天补全、OpenAI Codex/Responses、原生Anthropic Messages),并将它们全部统一为相同的内部消息格式。

以下是每次发送消息时,按顺序发生的事情:

1. 提示组装。 系统从十多个层面构建你的上下文。SOUL.md 用于身份。技能用于程序性知识。记忆和用户快照。来自项目目录的上下文文件。你聊天的平台提示。所有这些都被组装成三个有序层级:稳定层(身份、工具、技能)、上下文层(项目文件)和易变层(记忆、用户快照、时间戳)。

2. 提供者解析。 将你的提供者和模型选择映射到正确的API端点、API密钥和模式。处理18多个提供者、OAuth流程和凭据池。

3. 飞行前压缩。 如果对话超过模型上下文窗口的50%,Hermes会在API调用之前进行压缩。中间回合被总结,最后20条消息被完整保留,并生成一个新的会话谱系ID。

4. API调用。 组装后的上下文被发送给模型。HTTP请求在后台线程中运行,并有一个中断事件监控它。你可以通过信号、/stop命令或发送新消息来中途取消。如果模型因429或5xx错误失败,Hermes会检查其回退提供者列表并尝试下一个。

5. 响应解析。 如果模型返回文本,那就是答案,并被持久化到会话存储中。如果模型返回工具调用,循环继续。

工具进场的地方

以下是它与聊天机器人根本不同的部分。

当语言模型确定它需要做某事——运行命令、搜索网页、写入文件、读取文档——它返回一个 tool_call 而不是文本。

Hermes捕获到它,并通过 tools/registry.py 中的中央注册表进行调度。

该注册表中大约有28个工具集中注册了70多个工具

每个工具文件在导入时通过 registry.register() 注册其名称、模式、处理函数、可用性检查和元数据。

tool_call 到达时:

  • 代理级工具(记忆、待办事项、会话搜索、委托)由代理循环本身截获,因为它们需要直接访问代理状态。
  • 其他所有工具都通过 registry.dispatch() 处理,该函数查找处理程序,通过工具的 check_fn 检查可用性,执行它,并将结果作为JSON字符串返回。
  • 错误在两个层面被包装:registry.dispatch() 捕获处理程序异常,handle_function_call() 捕获调度异常。模型始终接收到格式良好的结果,而不是未处理的错误。

来自单个模型响应的多个工具调用通过线程池执行器并发运行。但标记为交互式的工具(如 clarify)例外,它们强制顺序执行。

一旦所有工具结果返回,它们作为工具角色消息附加到对话历史中,循环带着新的上下文回到步骤3(API调用)。

这一直持续到模型返回文本响应或达到迭代预算。

提示架构就是产品

Hermes随着时间推移变得更好的原因不是魔法。它是结构性的。

系统提示被构建为三个有序层级:

  • 稳定层。 SOUL.md(你的代理身份)、工具指导、技能、环境提示和平台提示。这一层在对话中不会改变。
  • 上下文层。 你项目中的 .hermes.mdAGENTS.mdCLAUDE.md,加上任何调用者提供的系统消息。一次只加载一种项目上下文类型,根据工作目录的优先级发现。
  • 易变层。 记忆快照、用户快照、外部记忆提供者块以及当前时间戳/会话/模型行。这些会在会话之间更新,但在单个对话期间保持不变。

记忆在会话中期写入磁盘,但不会改变缓存的系统提示,直到重建路径运行:新会话、压缩或显式失效。这使得提示前缀对提供者侧缓存保持稳定。

这种分离是有意的。

  • 这意味着你的提示的第一部分(身份、工具、技能)受益于API级别的提示缓存。
  • 意味着记忆变化不会在对话中途破坏缓存。
  • 也意味着技能、上下文文件和平台提示各自拥有一个定义好的槽位和优先级。

重要的设计选择

文档中提到了五个设计原则。它们值得了解,因为它们解释了为什么Hermes会如此表现:

提示稳定性。 系统提示在对话中不会改变。没有缓存破坏的突变,除非你通过 /model 显式切换模型。

可观察的执行。 每次工具调用都是可见的——CLI中的旋转动画、Telegram中的进度消息、Discord中的回调更新。你可以看到代理在执行操作时的状态。

可中断。 API调用和工具执行可以在中途取消。不是那种“强制退出进程”的方式。而是“发送一条新消息,旧请求被干净地放弃”的方式。

平台无关的核心。 一个 AIAgent 类服务于CLI、消息网关、ACP编辑器集成、批处理和API服务器。平台差异存在于入口点,而非代理本身。

松散耦合。 MCP服务器、插件、记忆提供者和RL环境都使用注册表模式和 check_fn 门控。可选子系统不会产生硬依赖。如果插件加载失败,代理的其余部分仍然工作。

这对你如何使用它的意义

GIF

理解代理循环会改变你对Hermes的思考方式。

你知道技能被加载到稳定提示层,因此它们始终可用,但不会在对话中改变。

如果你希望代理采用新的专业知识,请在会话之间添加或切换技能,而不是在会话期间。

你知道上下文文件是从工作目录按优先级加载的。

项目根目录下的 .hermes.md 会覆盖同一目录下的 AGENTS.md。只有在没有 .hermes.mdAGENTS.md 时才会加载 CLAUDE.md。相应地组织你的项目上下文。

你知道工具调用默认是并发的。

如果你要求Hermes做四件独立的事情,它将同时执行它们,而不是一次一个。设计提示时要利用这一点。

并且你知道迭代预算的存在。

默认是90个回合。每次工具调用算作一个回合。一个需要15次工具调用的复杂任务会消耗你90个回合中的15个。子代理有自己独立的预算,上限为50。

如果你在运行长工作流,请为工具调用预算,而不仅仅是对话回合。

代理循环是使其他一切成为可能的架构。

技能之所以能复合,是因为它们作为稳定上下文被加载,模型永远不会忘记它们存在。记忆之所以复合,是因为它在会话中期写入磁盘,但在会话边界处快照。工具系统之所以增长,是因为新工具在导入时自动注册,无需手动连线。

聊天机器人预测下一个词。 Hermes运行一个过程。

这就是复合效应的区别所在。

只有当你能够访问你的工具并持久化你的会话时,这个循环才能工作。

这篇文章是我(拖延已久的)Hermes Agent大师班的第一部分。写作前提是你已经安装了Hermes Agent。

如果你还没有安装Hermes,请从这里开始。

新用户可能也愿意在等待大师班第二部分的期间阅读这篇文章。

‘你在Hermes Agent的前两周指南’。👇

Tony Simons@tonysimons_·6月14日文章 你已经安装了Hermes Agent。现在怎么办? 你在Hermes的前两周指南 我已经每天使用Hermes Agent三个月了。不是作为演示。不是作为“让我测试一下以便写评测”。而是作为研究我的文章、…52411933K

如果你觉得这有用,请考虑给它一个书签和分享。

下一篇见!🤘

相似文章

@PrajwalTomar_: https://x.com/PrajwalTomar_/status/2064324584254710262

X AI KOLs Following

Nous Research 的 Hermes Agent 是一款开源自主 AI 代理,它在服务器上持续运行,跨会话记住每一次对话,并自主创建技能文件,使其与 Claude Code 和 Cursor 等基于会话的编码工具截然不同,属于一个根本不同的代理类别。