Feisky 让 AI 成为你的第二大脑

AI Agent

Harness 不只是脚手架:从 Claude Code、Hermes 和 OpenClaw 看 Agent 架构的三条路

拆解 Claude Code、Hermes Agent 和 OpenClaw 三个项目的源码与架构,对比它们在 Harness、记忆系统、扩展性和应对模型进步上的三种不同哲学,看 AI Agent 架构设计的三条路线如何起点各异却殊途同归。

提到 Harness,大部分人第一反应是 Anthropic 说的那个概念:模型外面包的一层编排代码,负责调用模型、路由工具、管理上下文。我之前写过一篇《为什么单 Agent 搞不定复杂应用?Anthropic 的 Harness 设计给出了答案》,里面详细拆了 Anthropic 的 Generator-Evaluator 模式。Anthropic 的核心观点是 Harness 编码的是对模型能力边界的假设,模型变强了,Harness 就该做减法。

这个理解没错,但只是三种理解中的一种。

最近我把 Claude Code、Hermes Agent 和 OpenClaw 的源码和架构文档都翻了一遍,发现一个挺有意思的事:这三个项目嘴上都在说 Harness,但做出来的东西完全不一样。Claude Code 把 Harness 当脚手架,越轻越好,模型能搞定的事就别替它做。Hermes 把 harness 当学习系统,每次任务都在积累经验,越用越聪明。OpenClaw 把 Harness 当基础设施,Gateway、路由、设备节点、任务调度,跟模型强不强没什么关系。

对 Harness 的理解不同,造出来的产品就完全不同。下面我就带你一起拆开看看它们都是如何设计 Harness 的。

Harness 核心设计

从这三个项目的代码结构和设计文档上,很容易发现它们的架构设计具有明显的不同。

OpenClaw 的核心是 Gateway。官方架构文档第一句也写明了他是一个 long-lived Gateway 拥有所有 messaging surfaces。CLI、macOS app、Web UI、自动化任务,全部通过 WebSocket 连接 Gateway。

手机、Mac、远程设备也通过同一个协议接入,只不过声明自己是 node,暴露摄像头、屏幕、Canvas 等能力。Gateway 默认监听 127.0.0.1:18789,连 Canvas 和 A2UI 都由同一个 HTTP server 托管。

OpenClaw 架构全景

也就是说,OpenClaw 把多入口收束成了单控制平面。你从 Telegram 发消息,从 Web UI 操作,从手机节点触发,最终都进入同一套协议、同一套会话管理、同一套工具策略、同一套事件流。也就是说,OpenClaw 先做了神经系统,而不是大脑。

Hermes Agent 的核心是 AIAgent。它通过一个 1 万多行的代码,整合了 prompt 装配、provider 选择、工具执行、重试、fallback、上下文压缩、会话持久化等所有的核心功能。CLI、Gateway、ACP、Batch Runner、API Server 这些入口最终都收敛到一起,后来才逐渐补充了 Gateway 和 messaging 平台的适配。

Hermes Agent 架构全景

Hermes 的优先级是先把 Agent Loop 做到足够强,让它支持并发工具调用、子代理委派、多 provider fallback、上下文压缩保护,然后再考虑怎么把这个大脑连上外面的世界。

Claude Code 的核心既不是 Gateway 也不是 Agent Loop,而是权限系统和上下文管理。正如《Managed Agents 架构拆解:Anthropic 给 Agent 造了一套 K8s》里提到的,Anthropic 把 Agent 的组件拆成了 session、harness、sandbox 三个独立接口,每个可以独立替换。Claude Code 的源码也是这个思路的体现。

Claude Code 架构全景

翻它之前泄漏的源码,最庞大的模块是权限相关的代码,处理了六种权限模式、八个权限来源、分类器自动审批、hook 扩展等等。而主循环本身反而很薄,只是负责把每轮完整消息历史交给模型,工具执行完立刻流式返回,没有复杂的调度算法。

Claude Code 的设计哲学可以总结为信任模型+管好边界。模型自己决定调用什么工具、按什么顺序执行、什么时候停下来。Harness 不替模型做决策,只在两个地方卡住:你有没有权限做这件事,上下文是不是快溢出了。

三个项目对 Harness 的理解,在这一层就分道了。OpenClaw 把重心放在多入口收束和协议统一,Hermes 把重心放在 Agent Loop 的能力密度,Claude Code 把重心放在权限管控和上下文保护。

记忆系统设计

记忆是 Agent 从临时工变成长期搭档的关键一步。三个项目在这件事上的做法差异也很大。

Claude Code 的方案最简单,简单到有点反直觉。CLAUDE.md 文件前缀加载,每次会话开始时注入 system prompt。Auto Memory 让模型自己往 ~/.claude/ 目录下写 Markdown 文件,MEMORY.md 作为索引(最多 200 行、25KB)。没有向量检索,没有 embedding,没有外部数据库。记忆不是主动召回的,而是作为上下文的一部分被模型看到。

上下文压缩也是反应式的:上下文窗口用到快满了才触发压缩。压缩方式是 fork 一个新的 Claude 实例来做摘要,压缩算法会保护工具调用和结果的完整性,不会把一个 tool call 和它的 result 切开。如果压缩连续失败三次,circuit breaker 会停掉,避免死循环。

Claude Code 怎么处理记忆

这个方案的好处是简单、可预测、不依赖外部服务。代价是记忆容量有限,跨会话的信息密度完全取决于 CLAUDE.md 写得好不好。

Hermes Agent 把记忆做成了分层系统。第一层是 MEMORY.mdUSER.md,类似 Claude Code 的方案,保存在 ~/.hermes/memories/,会话开始时注入 prompt。第二层是 SQLite + FTS5 全文搜索,所有历史会话都能被检索和摘要。第三层是 8 个外部 memory provider 插件,包括 Honcho、Mem0、Hindsight 等。

Honcho 的设计值得单独说一下。它不只做向量检索,而是把用户和 AI 都建模为 peer,做跨会话的辩证推理,维护用户表征和 session summary。启用后,Hermes 每轮前会预取相关记忆,每轮后同步对话,会话结束时抽取长期记忆。

Hermes 的记忆哲学是:模型的短期记忆不够用,需要系统帮它在多个时间尺度上积累和召回信息。这和 Claude Code 模型自己能搞定的思路差别挺大的。

Hermes Agent 怎么处理记忆

OpenClaw 则走了另一条路:把 Context Engine 做成可替换的运行时插件,控制如何构建模型上下文,决定包含哪些消息、如何摘要旧历史、如何跨 subagent 管理上下文。内置的是 legacy engine,但插件可以注册完全不同的 engine。

每次模型运行时,engine 有四个生命周期点:ingest(消息进来时)、assemble(构建上下文时)、compact(压缩时)、after turn(一轮结束后)。插件 engine 甚至可以返回 systemPromptAddition,动态注入召回指导或检索提示。

OpenClaw 的会话管理也很讲究:DM 默认共享 session,群聊按 group 隔离,rooms 按 room 隔离,cron 每次新 session。多 Agent 场景下,每个 Agent 有独立的 workspace、auth profile、session store。

OpenClaw 的记忆哲学不是记更多,而是让记忆管理本身成为一个可插拔的系统服务。长期 Agent 的记忆需求会不断变化,与其内置一套固定方案,不如把接口留好,让生态去填充。

OpenClaw 怎么处理记忆

三种方案,背后是三种对 Agent 该记什么的不同理解。Claude Code 觉得模型够聪明,给它看到就行。Hermes 觉得光看到不够,得帮它在多个时间尺度上积累。OpenClaw 觉得记忆本身的需求会变,不如把接口留好。

扩展性设计

接下来再来看看扩展性的设计,这是让 Agent 能搜索、浏览网页、生成图片、读写文件等各种外置能力的关键。

OpenClaw 把能力扩展拆成了三层:内置 Tools 是 Agent 可以随时调用的预装能力,Skills 是教 Agent 什么时候用、怎么用外部工具的扩展能力,而 Plugins 则是打包了工具、技能、消息通道、模型等各种扩展的能力包。

这个三层模型把三个容易混淆的东西拆开了:工具是默认能做什么,技能是什么时候/怎么样去调用外部工具,插件是怎么打包、发现、分发这些能力。ClawHub 上架了 58000 多个社区 Skill,一条命令安装,这对于带火 OpenClaw 功不可没。

OpenClaw 怎么扩展能力

Hermes Agent 的工具系统用了 registry 自注册模式。tools/registry.py 是中心注册表,每个工具文件在模块级调用 registry.register() 声明 schema、handler、toolset 归属和可用性检查。model_tools.py 是 registry 之上的薄编排层,负责导出工具定义、处理函数调用、维护工具到 toolset 的映射。

有个很细的设计:model_tools.py 会根据当前真正可用的工具重建 execute_code 的 schema。比如 web API key 没配置,模型就不会在 sandbox 里看到 web_search 这个工具。这能减少模型“以为自己能做但其实做不了”的幻觉式调用。

Hermes Agent 怎么扩展能力

Hermes 的技能系统用了 progressive disclosure:Level 0 只加载 name 和 description,Level 1 加载完整技能内容,Level 2 加载技能引用的附件。模型先扫描技能列表,匹配到了再深入加载。更关键的是,Agent 可以通过 skill_manage 自己创建、更新、删除技能。解决了一个非平凡任务后,它可以把方法保存为技能文件,下次遇到类似问题直接复用。

这就是 Hermes 说的“程序性记忆”。普通 Agent 完成任务后只留下结果,Hermes 完成任务后还试图留下方法。当你积累 20 个以上自创技能后,同领域任务完成速度能提升 40% 。

Claude Code 的扩展体系跟前两者的思路都不一样,它不是围绕工具注册或技能发现来组织的,而是围绕权限边界层层展开的。

最底层是 28 个内置工具,覆盖文件读写、搜索、Shell 执行、Web 访问、子代理调度等基础能力。这些工具分两类:Read、Glob、Grep 这类只读工具不需要权限,Bash、Edit、Write 这类有副作用的工具每次执行都要过权限检查。权限不在工具注册时声明,而是在执行时由 harness 拦截,模型不需要考虑“我能不能做这件事”,该拦的时候自然会拦。

往上一层是 MCP 协议。Claude Code 通过 MCP 接入外部工具服务器,支持 stdio、HTTP、SSE 三种传输方式。MCP 工具默认是延迟加载的:会话开始时只把工具名称放进上下文,模型需要用的时候通过 ToolSearch 工具按需拉取完整 schema。这个设计跟 Hermes 的 progressive disclosure 异曲同工,只是实现路径不同,一个在技能层做分级加载,一个在工具层做延迟发现。

再往上是 Hooks、Skills 和 Plugins 三层扩展。Hooks 提供了 25 个生命周期事件,可以挂 shell 命令、HTTP 请求、甚至 LLM 评估。Skills 遵循开放的 Agent Skills 标准,用 Markdown + YAML frontmatter 定义可复用的工作流,,持参数替换和条件触发。Plugins 则是把 Skills、Hooks、MCP 配置、子代理定义打包成一个可分发的单元。

子代理是 Claude Code 处理复杂任务的核心机制。每个子代理运行在独立的上下文窗口里,有自己的系统提示和会话历史。内置了 Explore(快速搜索,用 Haiku 模型)、Plan(规划研究)、general-purpose(全功能)等预设类型,也支持通过 .claude/agents/ 目录自定义。自定义子代理可以精细控制工具白名单、权限规则、模型选择,甚至预加载特定 Skills。

Claude Code 怎么扩展能力

能力管理的复杂性往哪放?OpenClaw 交给社区生态,Hermes 交给 Agent 自身的积累,Claude Code 交给分层的权限边界。

怎么面对模型进步

这个维度最值得琢磨。

Anthropic 有一个很有意思的观察:harness 编码的是对模型能力边界的假设,但模型在进步,假设会过期。Sonnet 4.5 的时候模型有上下文焦虑,随着上下文窗口接近极限会提前收工,harness 里加了重置机制来应对。结果换到 Opus 4.5,这个行为自己消失了,重置机制变成了死代码。

Claude Code 对这一点的应对是大量的功能开关,从它泄露的源码能看到大量 HISTORY_SNIP、REACTIVE_COMPACT、TRANSCRIPT_CLASSIFIER 等等这样的开关。比如,到了 Opus 4.6,之前在 harness 里加的 Sprint 机制(把长任务拆成小块、每块结束后评估)就被整个拿掉了,因为模型已经可以连续写代码不跑偏。Evaluator 也从每个 Sprint 后评分改成了全部开发完再做一轮 QA。

Anthropic 认为 harness 应该为减法而设计。每个组件都应该能被安全移除,而不是越堆越厚。权限分类器也是同一思路,模型能力到了之后,很多需要人类确认的操作可以自动放行(所以后来新增了 Auto 权限模式)。

Claude Code 怎么面对模型进步

Hermes Agent 的思路不太一样。它认为有些东西不会因为模型变强而过期:五层记忆系统、技能文件沉淀、跨会话搜索、用户建模。模型再强,也需要知道“上次这个用户让我做过什么”和“这类任务我之前是怎么解决的”。

Hermes 甚至有一个单独的 hermes-agent-self-evolution 仓库,用 DSPy 和 GEPA 来做自动化的技能优化。具体做法是:跑一组评估任务,比较优化前后的技能文件在完成效率和准确率上的差异,自动选择更好的版本。目前实现了 Phase 1 的技能文件优化,Phase 2 计划覆盖工具描述和系统提示词。说实话,这个想法挺有意思的,相当于给 Agent 加了一个慢速但持续的自然选择过程。虽然模型会趋同,但谁能把每次任务变成下一次的能力,谁就有了复利。

Hermes Agent 怎么面对模型进步

OpenClaw 的基础设施层几乎不受模型进步的影响。Gateway 不会因为 Claude 变强就不需要了。多入口路由不会过期,设备节点不会过期,会话隔离不会过期,权限分层不会过期。

模型会越来越强,但连接现实世界的管道不会自动出现。你还是需要一个东西来管理“谁能在什么时候通过什么入口让 Agent 做什么事”,模型再强也替代不了这一层。

OpenClaw 怎么面对模型进步

三种方向,对应三种对“模型进步会淘汰什么”的判断。OpenClaw 认为基础设施不会过期,所以建管道。Hermes 认为经验积累不会过期,所以做加法。Claude Code 认为大部分脚手架会过期,所以做减法。

写在最后

有意思的是,三条路正在往一个方向收敛。Claude Code 加了 auto memory 和 channels,Hermes 加了 Gateway 和多平台适配,OpenClaw 在做 Context Engine 可插拔化。起点不同,但目的地越来越像:一个有记忆、有技能、有入口、有权限、有持久状态的个人 AI 系统。


欢迎长按下面的二维码关注 Feisky 公众号,了解更多云原生和 AI 知识。

Feisky 公众号二维码

相关文章

目录

本页目录