OpenClaw #AI#open-source#openclaw

OpenClaw 專題:架構分析 🦞

2026-02-24 · 3396 字 · 16 分鐘

基於 v2026.3.8 原始碼,拆解一個自託管 AI 助手的工程骨架

OpenClaw

上一篇聊了生態,這一篇拆架構。

OpenClaw 的程式碼量不小:43 萬行 TypeScript。但真正值得看的不是程式碼量,是它的架構選擇。一個要同時接二十多個聊天平台、管幾個 Agent、還能調工具的 AI 助手,它是怎麼把這些東西塞到一起還不散架的?

0. 先認幾個詞

如果你沒有系統架構背景,也沒關係。先記住 6 個詞,後面會順很多:

  • 架構:系統如何分層、每層分別負責什麼。
  • Channel / 頻道層:負責和外部聊天平台「說同一種協議」的適配層。
  • Gateway / 閘道:中央調度者,負責路由訊息、管理會話和 Agent。
  • Node / 執行節點:真正去拍照、跑命令、操作裝置的執行端。
  • workspace / 工作區:Agent 的設定、記憶、技能和會話檔案所在的本地目錄。
  • sandbox / 沙箱:把高風險操作隔離起來的受限執行環境。

1. 3 層架構:Channel → Gateway → Node

先看全景圖:

OpenClaw Architecture

你可以把 OpenClaw 想成一家公司的 3 個部門:

幹什麼打個比方
Channel(頻道層)對接 WhatsApp、Telegram、Discord、飛書等 20+ 聊天平台前台:負責接電話、收郵件、接待來訪
Gateway(閘道)中央調度,管理所有會話和 Agent大腦:誰的訊息該給誰處理、怎麼回覆,全在這裡決定
Node(執行節點)在裝置上幹活:拍照、錄螢幕、跑命令手和腳:大腦說「拍張照」,它去執行

整個系統的核心就是 Gateway:一個常駐運行的程序,預設只監聽本機(127.0.0.1:18789),不對外網開放。想遠端存取?走 Tailscale 隧道,不直接暴露埠號。這個設計叫「Loopback-First」,安全上很討巧:什麼埠號都不開,就沒有攻擊面。

為什麼只用一個程序不搞分散式?原因很實際:WhatsApp 協議要求同一時間只能有一個裝置在線,你搞兩個程序反而會打架。與其為了「架構正確」多搞一堆協調邏輯,不如老老實實一個程序管到底。對絕大多數個人使用者來說,夠用了。

2. 一條訊息的旅程

你在 Telegram 上跟你的 OpenClaw 說了一句「幫我查下明天台北天氣」,發生了什麼?

第 1 步:接入。 Telegram 適配器收到訊息,把 Telegram 格式的資料翻譯成 OpenClaw 內部統一格式。不管訊息從哪個平台來,翻譯完都長一個樣。

第 2 步:驗身份、找路由。 你是誰?允不允許跟 Agent 說話?如果是陌生人,先彈一個配對碼讓主人批准。通過後,路由引擎決定這條訊息交給哪個 Agent。

第 3 步:組裝上下文。 從磁碟讀出你之前的聊天記錄,載入 Agent 的性格設定(SOUL.md)、行為規則(AGENTS.md),再從記憶庫裡語義搜尋相關內容。組裝成一份完整的「大腦簡報」。

第 4 步:問大模型。 這份簡報發給 Anthropic、OpenAI、DeepSeek、MiniMax、GLM、Qwen、Gemini 等大模型提供商(你設定了哪個就用哪個),模型一個字一個字地串流吐出回覆。

第 5 步:執行工具。 如果模型說「我需要跑個命令查天氣」,執行時會攔截這個請求,根據安全策略決定在哪裡執行(管理員的命令直接跑,陌生人的命令丟到 Docker 沙箱裡跑),然後把結果餵回給模型繼續生成。

第 6 步:回覆。 最終答案按 Telegram 的格式要求(字數限制、Markdown 規則等)拆好,發回給你。聊天記錄寫入磁碟。

整個鏈路中,真正慢的是第 4 步:等大模型吐第一個字。其他步驟基本都是毫秒級。

3. 頻道適配層:一次開發,到處說話

OpenClaw 對接了二十多個聊天平台,但不是每個平台都從零寫一套。它抽象了一層「適配器」,每個平台的適配器只負責四件事:

  • 登入:WhatsApp 掃 QR Code、Telegram 填 Bot Token、iMessage 用 macOS 原生能力:各平台各的規矩
  • 翻譯進來的訊息:不管是文字、圖片、回覆還是表情,統統翻譯成內部統一格式
  • 管門禁:誰能私聊、群裡要不要 @才回覆、哪些群允許
  • 翻譯出去的回覆:把 Agent 的回覆適配成各平台能顯示的格式

內建的有六個大平台(WhatsApp、Telegram、Discord、Slack、Signal、iMessage),其他三十多個(飛書、LINE、Matrix、Mattermost 等)透過外掛接入。

這層抽象最大的好處是:Agent 完全不需要知道訊息來自哪個平台。你在 WhatsApp 上聊的 Agent 和在 Telegram 上聊的是同一個,邏輯完全複用。頻道只是「傳話筒」,換一個傳話筒不影響說話的人。

4. Agent 執行時與工作區

Agent 執行時的核心來自 Pi-mono(一個開源程式設計 Agent),嵌入在 Gateway 裡面跑。

「一切皆文字」的工作區

這是 OpenClaw 最有意思的設計之一:每個 Agent 的所有組態,都是你能直接打開編輯的文字檔:

workspace/
├── AGENTS.md # 定義 Agent 是誰、怎麼做事(相當於履歷+工作手冊)
├── SOUL.md # 靈魂設定:性格、價值觀(寫好就不該改)
├── USER.md # 記錄使用者資訊:你叫什麼、喜好是什麼
├── MEMORY.md # 長期記憶:Agent 主動記下的重要事情
├── HEARTBEAT.md # 定時任務:比如每天早上報天氣
├── memory/ # 日記本
│ └── YYYY-MM-DD.md # 每天一頁,只追加不修改
├── skills/ # 技能包
└── sessions.json # 會話記錄

沒有資料庫,沒有專用管理介面,純文字檔。想改 Agent 性格?打開 SOUL.md 改兩行就行。想看它記住了什麼?打開 MEMORY.md 直接看。這種「你能看到它的全部大腦」的透明感,是很多封閉 AI 產品做不到的。

每一輪對話怎麼跑

  1. 分清身份:你是管理員直聊、朋友私聊、還是群裡有人 @了它?不同來源,安全等級不同
  2. 組裝記憶:讀聊天記錄、載入性格和規則、搜尋相關的長期記憶,拼成一份完整上下文
  3. 問大模型:發給設定的模型,支援 fallback:主力模型掛了自動切備用
  4. 幹活+記住:執行工具呼叫,更新聊天記錄

上下文的組裝不是把所有東西一股腦塞進去。不相關的技能不載入、不需要的工具不注入:省 token 就是省錢。

5. 4 層記憶:讓 AI 真的「記住你」

普通聊天機器人關掉視窗就失憶了。OpenClaw 不會。它有 4 層記憶,從最深層的「我是誰」到最淺層的「剛才聊了啥」:

是什麼打個比方
SOUL人格設定,永遠不變你的性格:出生就定了
TOOLS當前裝了哪些技能你今天帶了哪些工具出門
USER關於你的長期記憶你的老朋友記得你愛吃什麼
Session當前這次對話此刻正在聊的話題

幾個巧妙的機制:

每日日記。 每天的對話會自動寫進 memory/2026-03-12.md(只追加,不覆蓋)。下次開聊時,Agent 會自動翻看今天和昨天的日記,保持連續感:「你昨天說要買的那本書,買了嗎?」

自動搶救記憶。 聊得太長,上下文快塞滿了怎麼辦?OpenClaw 會偷偷在背景跑一個隱形輪次,把重要資訊存進 MEMORY.md,然後壓縮掉舊內容。你察覺不到這個過程,但關鍵資訊不會丟。這個機制叫 Pre-Compaction。

語義搜尋。 你說「之前聊過的那個部署問題」,它能從記憶裡搜出來:不是靠關鍵字精確比對,而是靠語義理解。底層是向量搜尋(SQLite-vec)+ 傳統關鍵字搜尋(BM25)雙管齊下。

跨平台認人。 你在 Telegram 上跟它聊了半小時,切到 WhatsApp 繼續聊,它認得你。同一個人在不同平台的 ID 會被連結到同一個身份,共享同一份記憶。但群聊的記憶是隔離的:你在群裡說的話,不會洩露到私聊裡。

6. 工具系統:只給 4 把刀

這是 OpenClaw 最「叛逆」的設計。

別的 AI Agent 框架恨不得內建一百個工具。OpenClaw 只給了 4 個:

工具一句話
Read讀檔案
Write寫檔案
Edit改檔案
Bash跑命令

就這?就這。

創辦人的邏輯是:有了命令列(Bash),你能幹任何事。想查天氣?curl 一下。想寄信?調個 CLI 工具。想操作資料庫?psql 命令搞定。不需要為每個場景預製一個專用工具。

這就是 Unix 哲學:小工具、可組合、文字流。代價是什麼?你需要一個夠聰明的模型,能自己想出該調什麼命令。所以 OpenClaw 推薦用 Claude Opus 這個級別的模型。弱模型可能搞不定。

在這 4 個核心工具之上,還有 55 個內建 Skills(技能)和 ClawHub 技能市場。Skills 是可以安裝和移除的:相當於給你的 Agent 裝 App。

有意思的是,它故意不支援 MCP。 MCP 是 Anthropic 搞的工具協議標準,現在滿世界的 AI 框架都在接。OpenClaw 偏不。Peter 原話是:「MCP 是垃圾,不能 scale。你知道什麼能 scale?CLI。Unix。」替代方案是用內建的 mcporter 做橋接。

更有意思的是自我擴展。 OpenClaw Agent 遇到不會幹的事,會自己寫一個 skill 來完成,寫完自動裝上。發現 skill 有 bug?自己改自己重新載入。這意味著你的 Agent 會在使用過程中越來越強:它在「養自己」。

7. 多 Agent 路由:一個大腦,多個人格

一個 Gateway 可以同時跑好幾個 Agent,各管各的。路由規則長這樣:

{
"bindings": [
{ "agentId": "home", "match": { "channel": "whatsapp", "accountId": "personal" } },
{ "agentId": "work", "match": { "channel": "slack" } },
{ "agentId": "bot", "match": { "channel": "discord", "guildId": "123456" } }
]
}

翻譯一下:WhatsApp 私人號來的訊息給「家庭助手」處理,Slack 的給「工作助手」,Discord 某個伺服器的給「社群機器人」。三個 Agent 完全隔離:各自有自己的性格、記憶、技能和安全策略。

8. 安全:3 道門

你的 Agent 跑在你自己的伺服器上,能執行命令、讀寫檔案:安全當然是大事。OpenClaw 的安全模型分 3 道門:

第一道門:你是誰?(私聊配對) 陌生人給你 Agent 發訊息,Agent 不會直接回。它會發一個 6 位配對碼,你在已認證的頻道裡確認了,對方才能用。這是預設行為:關掉就意味著任何知道你號碼的人都能白嫖你的 API 額度。

第二道門:VIP 通道(白名單)。 信任的人可以直接加到白名單裡(allowFrom),跳過配對直接聊。

第三道門:群裡別亂回(群組規則)。 群聊裡 Agent 預設只在被 @ 時才回覆,不會對著群裡每條訊息都冒泡:既省 token,又不擾民。

再往下還有縱深防禦:工具權限五層過濾、Docker 沙箱隔離(陌生人的命令在沙箱裡跑)、安全稽核命令(openclaw security audit)。這些層是獨立的:配對碼洩露了?沙箱還在。沙箱被繞過了?工具策略還限制著能調什麼。

9. 幾個判斷

單程序不是偷懶,是務實。 對個人使用者來說,一個程序管到底比搞分散式靠譜得多。這個架構的天花板在哪?大概是同時在線的訊息量超過單機處理能力的時候:對絕大多數人來說,這一天不會來。

頻道抽象層是最值錢的一層。 二十多個平台的差異全封裝在適配器裡,Agent 完全不操心訊息從哪來。想加一個新平台?寫個適配器就行,Agent 邏輯一行不改。這個解耦做得非常乾淨。

安全設計是認真的,但落地仍有差距。 架構上從身份、沙箱到工具策略做了縱深防禦。但 Kaspersky 稽核發現了 512 個漏洞(8 個嚴重級別),說明藍圖畫得好和實際安全之間,隔著持續的工程投入。

4 個核心工具的極簡路線是一場賭注。 賭的是模型能力會持續上升,強到不需要預製工具就能「萬物皆可 Bash」。如果大模型的天花板卡住了,這條路會很難走。但如果模型能力繼續提升,這可能是最優雅的方案。

最終的檢驗標準不是架構有多漂亮,而是跑得穩不穩。 這篇分析基於原始碼靜態閱讀。實際效果:高併發下的 Gateway 穩定性、沙箱真的能不能防住攻擊、跨頻道認人的邊界情況:需要更多真實使用資料來驗證。

架構只是骨架,生產環境才是考場。

全文完 · 謝謝閱讀

評論