<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Hermes Agent | Feisky</title><link>https://feisky.xyz/tags/hermes-agent/</link><description>极客时间专栏作者，专注于 Kubernetes、AI Infra、AI Agent 领域的深度技术分享，让 AI 成为你的第二大脑</description><generator>Hugo 0.165.0</generator><language>zh-CN</language><managingEditor>Pengfei Ni</managingEditor><webMaster>Pengfei Ni</webMaster><lastBuildDate>Fri, 14 Aug 2026 12:39:05 +0000</lastBuildDate><atom:link href="https://feisky.xyz/tags/hermes-agent/index.xml" rel="self" type="application/rss+xml"/><item><title>Harness 不只是脚手架：从 Claude Code、Hermes 和 OpenClaw 看 Agent 架构的三条路</title><link>https://feisky.xyz/posts/2026-04-21-%E4%B8%89%E7%A7%8Dagent%E5%93%B2%E5%AD%A6/</link><pubDate>Tue, 21 Apr 2026 10:00:00 +0800</pubDate><dc:creator>Pengfei Ni</dc:creator><category>AI Agent</category><category>架构设计</category><category>OpenClaw</category><category>Hermes Agent</category><category>Claude Code</category><category>Anthropic</category><guid>https://feisky.xyz/posts/2026-04-21-%E4%B8%89%E7%A7%8Dagent%E5%93%B2%E5%AD%A6/</guid><description>&lt;p&gt;提到 Harness，大部分人第一反应是 Anthropic 说的那个概念：模型外面包的一层编排代码，负责调用模型、路由工具、管理上下文。我之前写过一篇《为什么单 Agent 搞不定复杂应用？Anthropic 的 Harness 设计给出了答案》，里面详细拆了 Anthropic 的 Generator-Evaluator 模式。Anthropic 的核心观点是 Harness 编码的是对模型能力边界的假设，模型变强了，Harness 就该做减法。&lt;/p&gt;</description><content:encoded>&lt;![CDATA[<p>提到 Harness，大部分人第一反应是 Anthropic 说的那个概念：模型外面包的一层编排代码，负责调用模型、路由工具、管理上下文。我之前写过一篇《为什么单 Agent 搞不定复杂应用？Anthropic 的 Harness 设计给出了答案》，里面详细拆了 Anthropic 的 Generator-Evaluator 模式。Anthropic 的核心观点是 Harness 编码的是对模型能力边界的假设，模型变强了，Harness 就该做减法。</p><p>这个理解没错，但只是三种理解中的一种。</p><p>最近我把 Claude Code、Hermes Agent 和 OpenClaw 的源码和架构文档都翻了一遍，发现一个挺有意思的事：这三个项目嘴上都在说 Harness，但做出来的东西完全不一样。Claude Code 把 Harness 当脚手架，越轻越好，模型能搞定的事就别替它做。Hermes 把 harness 当学习系统，每次任务都在积累经验，越用越聪明。OpenClaw 把 Harness 当基础设施，Gateway、路由、设备节点、任务调度，跟模型强不强没什么关系。</p><p>对 Harness 的理解不同，造出来的产品就完全不同。下面我就带你一起拆开看看它们都是如何设计 Harness 的。</p><h2 id="harness-核心设计">Harness 核心设计</h2><p>从这三个项目的代码结构和设计文档上，很容易发现它们的架构设计具有明显的不同。</p><p>OpenClaw 的核心是 Gateway。官方架构文档第一句也写明了他是一个 long-lived Gateway 拥有所有 messaging surfaces。CLI、macOS app、Web UI、自动化任务，全部通过 WebSocket 连接 Gateway。</p><p>手机、Mac、远程设备也通过同一个协议接入，只不过声明自己是 node，暴露摄像头、屏幕、Canvas 等能力。Gateway 默认监听<code>127.0.0.1:18789</code>，连 Canvas 和 A2UI 都由同一个 HTTP server 托管。</p><p><img src="/images/2026-04-21-Agent-openclaw-arch.png" alt="OpenClaw 架构全景" loading="lazy" decoding="async"/></p><p>也就是说，OpenClaw 把多入口收束成了单控制平面。你从 Telegram 发消息，从 Web UI 操作，从手机节点触发，最终都进入同一套协议、同一套会话管理、同一套工具策略、同一套事件流。也就是说，OpenClaw 先做了神经系统，而不是大脑。</p><p>Hermes Agent 的核心是<code>AIAgent</code>。它通过一个 1 万多行的代码，整合了 prompt 装配、provider 选择、工具执行、重试、fallback、上下文压缩、会话持久化等所有的核心功能。CLI、Gateway、ACP、Batch Runner、API Server 这些入口最终都收敛到一起，后来才逐渐补充了 Gateway 和 messaging 平台的适配。</p><p><img src="/images/2026-04-21-Agent-hermes-arch.png" alt="Hermes Agent 架构全景" loading="lazy" decoding="async"/></p><p>Hermes 的优先级是先把 Agent Loop 做到足够强，让它支持并发工具调用、子代理委派、多 provider fallback、上下文压缩保护，然后再考虑怎么把这个大脑连上外面的世界。</p><p>Claude Code 的核心既不是 Gateway 也不是 Agent Loop，而是权限系统和上下文管理。正如《Managed Agents 架构拆解：Anthropic 给 Agent 造了一套 K8s》里提到的，Anthropic 把 Agent 的组件拆成了 session、harness、sandbox 三个独立接口，每个可以独立替换。Claude Code 的源码也是这个思路的体现。</p><p><img src="/images/2026-04-21-Agent-claude-code-arch.png" alt="Claude Code 架构全景" loading="lazy" decoding="async"/></p><p>翻它之前泄漏的源码，最庞大的模块是权限相关的代码，处理了六种权限模式、八个权限来源、分类器自动审批、hook 扩展等等。而主循环本身反而很薄，只是负责把每轮完整消息历史交给模型，工具执行完立刻流式返回，没有复杂的调度算法。</p><p>Claude Code 的设计哲学可以总结为信任模型+管好边界。模型自己决定调用什么工具、按什么顺序执行、什么时候停下来。Harness 不替模型做决策，只在两个地方卡住：你有没有权限做这件事，上下文是不是快溢出了。</p><p>三个项目对 Harness 的理解，在这一层就分道了。OpenClaw 把重心放在多入口收束和协议统一，Hermes 把重心放在 Agent Loop 的能力密度，Claude Code 把重心放在权限管控和上下文保护。</p><h2 id="记忆系统设计">记忆系统设计</h2><p>记忆是 Agent 从临时工变成长期搭档的关键一步。三个项目在这件事上的做法差异也很大。</p><p>Claude Code 的方案最简单，简单到有点反直觉。CLAUDE.md 文件前缀加载，每次会话开始时注入 system prompt。Auto Memory 让模型自己往<code>~/.claude/</code> 目录下写 Markdown 文件，MEMORY.md 作为索引（最多 200 行、25KB）。没有向量检索，没有 embedding，没有外部数据库。记忆不是主动召回的，而是作为上下文的一部分被模型看到。</p><p>上下文压缩也是反应式的：上下文窗口用到快满了才触发压缩。压缩方式是 fork 一个新的 Claude 实例来做摘要，压缩算法会保护工具调用和结果的完整性，不会把一个 tool call 和它的 result 切开。如果压缩连续失败三次，circuit breaker 会停掉，避免死循环。</p><p><img src="/images/2026-04-21-Agent-claude-code-memory.png" alt="Claude Code 怎么处理记忆" loading="lazy" decoding="async"/></p><p>这个方案的好处是简单、可预测、不依赖外部服务。代价是记忆容量有限，跨会话的信息密度完全取决于 CLAUDE.md 写得好不好。</p><p>Hermes Agent 把记忆做成了分层系统。第一层是<code>MEMORY.md</code> 和<code>USER.md</code>，类似 Claude Code 的方案，保存在<code>~/.hermes/memories/</code>，会话开始时注入 prompt。第二层是 SQLite + FTS5 全文搜索，所有历史会话都能被检索和摘要。第三层是 8 个外部 memory provider 插件，包括 Honcho、Mem0、Hindsight 等。</p><p>Honcho 的设计值得单独说一下。它不只做向量检索，而是把用户和 AI 都建模为 peer，做跨会话的辩证推理，维护用户表征和 session summary。启用后，Hermes 每轮前会预取相关记忆，每轮后同步对话，会话结束时抽取长期记忆。</p><p>Hermes 的记忆哲学是：模型的短期记忆不够用，需要系统帮它在多个时间尺度上积累和召回信息。这和 Claude Code 模型自己能搞定的思路差别挺大的。</p><p><img src="/images/2026-04-21-Agent-hermes-memory.png" alt="Hermes Agent 怎么处理记忆" loading="lazy" decoding="async"/></p><p>OpenClaw 则走了另一条路：把 Context Engine 做成可替换的运行时插件，控制如何构建模型上下文，决定包含哪些消息、如何摘要旧历史、如何跨 subagent 管理上下文。内置的是<code>legacy</code> engine，但插件可以注册完全不同的 engine。</p><p>每次模型运行时，engine 有四个生命周期点：ingest(消息进来时)、assemble(构建上下文时)、compact(压缩时)、after turn(一轮结束后)。插件 engine 甚至可以返回<code>systemPromptAddition</code>，动态注入召回指导或检索提示。</p><p>OpenClaw 的会话管理也很讲究：DM 默认共享 session，群聊按 group 隔离，rooms 按 room 隔离，cron 每次新 session。多 Agent 场景下，每个 Agent 有独立的 workspace、auth profile、session store。</p><p>OpenClaw 的记忆哲学不是记更多，而是让记忆管理本身成为一个可插拔的系统服务。长期 Agent 的记忆需求会不断变化，与其内置一套固定方案，不如把接口留好，让生态去填充。</p><p><img src="/images/2026-04-21-Agent-openclaw-memory.png" alt="OpenClaw 怎么处理记忆" loading="lazy" decoding="async"/></p><p>三种方案，背后是三种对 Agent 该记什么的不同理解。Claude Code 觉得模型够聪明，给它看到就行。Hermes 觉得光看到不够，得帮它在多个时间尺度上积累。OpenClaw 觉得记忆本身的需求会变，不如把接口留好。</p><h2 id="扩展性设计">扩展性设计</h2><p>接下来再来看看扩展性的设计，这是让 Agent 能搜索、浏览网页、生成图片、读写文件等各种外置能力的关键。</p><p>OpenClaw 把能力扩展拆成了三层：内置 Tools 是 Agent 可以随时调用的预装能力，Skills 是教 Agent 什么时候用、怎么用外部工具的扩展能力，而 Plugins 则是打包了工具、技能、消息通道、模型等各种扩展的能力包。</p><p>这个三层模型把三个容易混淆的东西拆开了：工具是默认能做什么，技能是什么时候/怎么样去调用外部工具，插件是怎么打包、发现、分发这些能力。ClawHub 上架了 58000 多个社区 Skill，一条命令安装，这对于带火 OpenClaw 功不可没。</p><p><img src="/images/2026-04-21-Agent-openclaw-capability.png" alt="OpenClaw 怎么扩展能力" loading="lazy" decoding="async"/></p><p>Hermes Agent 的工具系统用了 registry 自注册模式。<code>tools/registry.py</code> 是中心注册表，每个工具文件在模块级调用<code>registry.register()</code> 声明 schema、handler、toolset 归属和可用性检查。<code>model_tools.py</code> 是 registry 之上的薄编排层，负责导出工具定义、处理函数调用、维护工具到 toolset 的映射。</p><p>有个很细的设计：<code>model_tools.py</code> 会根据当前真正可用的工具重建<code>execute_code</code> 的 schema。比如 web API key 没配置，模型就不会在 sandbox 里看到<code>web_search</code> 这个工具。这能减少模型“以为自己能做但其实做不了”的幻觉式调用。</p><p><img src="/images/2026-04-21-Agent-hermes-capability.png" alt="Hermes Agent 怎么扩展能力" loading="lazy" decoding="async"/></p><p>Hermes 的技能系统用了 progressive disclosure：Level 0 只加载 name 和 description，Level 1 加载完整技能内容，Level 2 加载技能引用的附件。模型先扫描技能列表，匹配到了再深入加载。更关键的是，Agent 可以通过<code>skill_manage</code> 自己创建、更新、删除技能。解决了一个非平凡任务后，它可以把方法保存为技能文件，下次遇到类似问题直接复用。</p><p>这就是 Hermes 说的“程序性记忆”。普通 Agent 完成任务后只留下结果，Hermes 完成任务后还试图留下方法。当你积累 20 个以上自创技能后，同领域任务完成速度能提升 40% 。</p><p>Claude Code 的扩展体系跟前两者的思路都不一样，它不是围绕工具注册或技能发现来组织的，而是围绕权限边界层层展开的。</p><p>最底层是 28 个内置工具，覆盖文件读写、搜索、Shell 执行、Web 访问、子代理调度等基础能力。这些工具分两类：Read、Glob、Grep 这类只读工具不需要权限，Bash、Edit、Write 这类有副作用的工具每次执行都要过权限检查。权限不在工具注册时声明，而是在执行时由 harness 拦截，模型不需要考虑“我能不能做这件事”，该拦的时候自然会拦。</p><p>往上一层是 MCP 协议。Claude Code 通过 MCP 接入外部工具服务器，支持 stdio、HTTP、SSE 三种传输方式。MCP 工具默认是延迟加载的：会话开始时只把工具名称放进上下文，模型需要用的时候通过<code>ToolSearch</code> 工具按需拉取完整 schema。这个设计跟 Hermes 的 progressive disclosure 异曲同工，只是实现路径不同，一个在技能层做分级加载，一个在工具层做延迟发现。</p><p>再往上是 Hooks、Skills 和 Plugins 三层扩展。Hooks 提供了 25 个生命周期事件，可以挂 shell 命令、HTTP 请求、甚至 LLM 评估。Skills 遵循开放的 Agent Skills 标准，用 Markdown + YAML frontmatter 定义可复用的工作流，，持参数替换和条件触发。Plugins 则是把 Skills、Hooks、MCP 配置、子代理定义打包成一个可分发的单元。</p><p>子代理是 Claude Code 处理复杂任务的核心机制。每个子代理运行在独立的上下文窗口里，有自己的系统提示和会话历史。内置了 Explore（快速搜索，用 Haiku 模型）、Plan（规划研究）、general-purpose（全功能）等预设类型，也支持通过<code>.claude/agents/</code> 目录自定义。自定义子代理可以精细控制工具白名单、权限规则、模型选择，甚至预加载特定 Skills。</p><p><img src="/images/2026-04-21-Agent-claude-code-capability.png" alt="Claude Code 怎么扩展能力" loading="lazy" decoding="async"/></p><p>能力管理的复杂性往哪放？OpenClaw 交给社区生态，Hermes 交给 Agent 自身的积累，Claude Code 交给分层的权限边界。</p><h2 id="怎么面对模型进步">怎么面对模型进步</h2><p>这个维度最值得琢磨。</p><p>Anthropic 有一个很有意思的观察：harness 编码的是对模型能力边界的假设，但模型在进步，假设会过期。Sonnet 4.5 的时候模型有上下文焦虑，随着上下文窗口接近极限会提前收工，harness 里加了重置机制来应对。结果换到 Opus 4.5，这个行为自己消失了，重置机制变成了死代码。</p><p>Claude Code 对这一点的应对是大量的功能开关，从它泄露的源码能看到大量 HISTORY_SNIP、REACTIVE_COMPACT、TRANSCRIPT_CLASSIFIER 等等这样的开关。比如，到了 Opus 4.6，之前在 harness 里加的 Sprint 机制（把长任务拆成小块、每块结束后评估）就被整个拿掉了，因为模型已经可以连续写代码不跑偏。Evaluator 也从每个 Sprint 后评分改成了全部开发完再做一轮 QA。</p><p>Anthropic 认为 harness 应该为减法而设计。每个组件都应该能被安全移除，而不是越堆越厚。权限分类器也是同一思路，模型能力到了之后，很多需要人类确认的操作可以自动放行（所以后来新增了 Auto 权限模式）。</p><p><img src="/images/2026-04-21-Agent-claude-code-model-progress.png" alt="Claude Code 怎么面对模型进步" loading="lazy" decoding="async"/></p><p>Hermes Agent 的思路不太一样。它认为有些东西不会因为模型变强而过期：五层记忆系统、技能文件沉淀、跨会话搜索、用户建模。模型再强，也需要知道“上次这个用户让我做过什么”和“这类任务我之前是怎么解决的”。</p><p>Hermes 甚至有一个单独的<code>hermes-agent-self-evolution</code> 仓库，用 DSPy 和 GEPA 来做自动化的技能优化。具体做法是：跑一组评估任务，比较优化前后的技能文件在完成效率和准确率上的差异，自动选择更好的版本。目前实现了 Phase 1 的技能文件优化，Phase 2 计划覆盖工具描述和系统提示词。说实话，这个想法挺有意思的，相当于给 Agent 加了一个慢速但持续的自然选择过程。虽然模型会趋同，但谁能把每次任务变成下一次的能力，谁就有了复利。</p><p><img src="/images/2026-04-21-Agent-hermes-model-progress.png" alt="Hermes Agent 怎么面对模型进步" loading="lazy" decoding="async"/></p><p>OpenClaw 的基础设施层几乎不受模型进步的影响。Gateway 不会因为 Claude 变强就不需要了。多入口路由不会过期，设备节点不会过期，会话隔离不会过期，权限分层不会过期。</p><p>模型会越来越强，但连接现实世界的管道不会自动出现。你还是需要一个东西来管理“谁能在什么时候通过什么入口让 Agent 做什么事”，模型再强也替代不了这一层。</p><p><img src="/images/2026-04-21-Agent-openclaw-model-progress.png" alt="OpenClaw 怎么面对模型进步" loading="lazy" decoding="async"/></p><p>三种方向，对应三种对“模型进步会淘汰什么”的判断。OpenClaw 认为基础设施不会过期，所以建管道。Hermes 认为经验积累不会过期，所以做加法。Claude Code 认为大部分脚手架会过期，所以做减法。</p><h2 id="写在最后">写在最后</h2><p>有意思的是，三条路正在往一个方向收敛。Claude Code 加了 auto memory 和 channels，Hermes 加了 Gateway 和多平台适配，OpenClaw 在做 Context Engine 可插拔化。起点不同，但目的地越来越像：一个有记忆、有技能、有入口、有权限、有持久状态的个人 AI 系统。</p><hr><p>欢迎长按下面的二维码关注<strong>Feisky</strong> 公众号，了解更多云原生和 AI 知识。</p><p><img src="/images/mp.png" alt="Feisky 公众号二维码" loading="lazy" decoding="async"/></p>
]]></content:encoded><dc:extent>11 min read</dc:extent></item></channel></rss>