提到 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.md 和 USER.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 系統。
現在看每個項目都是不同的路,再過半年或者一年很可能就是同一個產品的三個發展階段了。所以,在選擇使用哪些 Agent 時,與其問哪個更好,不如問自己更缺什麼:缺入口和連接,看 OpenClaw;缺經驗沉澱,看 Hermes;什麼都不缺只想讓模型充分發揮,Claude Code 就夠了。
好了,今天就聊到這兒。如果你也在關注 AI Agent 的架構設計,歡迎關注 Feisky 公眾號,我會定期分享實踐中的發現和踩坑經驗。