OpenClaw 24 小時隨 call 隨到架構解析 AI Generated
這個 agent 是如何做到 24 小時隨 call 隨到?
OpenClaw 是一個開源的個人 AI 助理,能夠運行在你自己的裝置上,並透過 WhatsApp、Telegram、Slack、Discord、Signal、iMessage、Teams 等 12+ 通訊平台即時回應。它的核心理念是「本地、快速、永遠在線」。
以下是其「永遠在線」架構的完整技術解析。
OpenClaw 專案簡介
| 項目 | 說明 |
|---|---|
| 定位 | 運行在自有裝置上的個人 AI 助理 |
| 授權 | MIT 開源 |
| 核心語言 | TypeScript |
| Runtime | Node.js >= 22 |
| AI 模型 | Anthropic Claude(推薦)、OpenAI |
| 支援平台 | macOS、iOS、Android、Linux |
| 通訊通道 | WhatsApp、Telegram、Slack、Discord、Signal、iMessage、Teams、Matrix 等 |
目錄結構:
openclaw/├── src/ # 核心原始碼│ ├── daemon/ # 背景服務管理│ ├── gateway/ # API 閘道與請求路由│ ├── sessions/ # Session 管理與持久化│ ├── channels/ # 多通道支援基礎設施│ ├── routing/ # 訊息路由邏輯│ ├── memory/ # 狀態與上下文儲存│ ├── cron/ # 排程任務執行│ └── ... # 各通訊平台適配器├── apps/ # 應用實作(macOS/iOS/Android)├── packages/ # 共享套件├── skills/ # 技能定義└── docs/ # 文件如何做到 24 小時隨 call 隨到
OpenClaw 的「永遠在線」並不是靠一個 AI 模型持續運行,而是透過一套精心設計的事件驅動架構。核心概念可以拆成以下幾層來理解。
Gateway Daemon 常駐背景服務
這是整個系統的心臟。執行安裝指令時:
openclaw onboard --install-daemon--install-daemon 會將 Gateway 註冊為系統級背景服務:
| 作業系統 | 服務類型 | 說明 |
|---|---|---|
| macOS | LaunchAgent | 開機自動啟動,關掉 Terminal 不影響 |
| Linux | systemd | 系統服務,支援自動重啟 |
Gateway 綁定 WebSocket/HTTP port(預設 18789),持續監聽所有事件。即使使用者關閉終端機甚至重新開機,服務都會自動恢復。
事件驅動的 Hub-and-Spoke 模型
Gateway 作為中央控制面(Control Plane),採用 Hub-and-Spoke 架構。所有輸入統一視為「事件」:
┌── WhatsApp ├── Telegram ├── Slack Events ─────────► Gateway ─────────► Agent Runtime ───► LLM ├── Discord │ ├── iMessage ▼ ├── Webhooks 執行工具、回覆 └── Heartbeat關鍵設計:AI 模型不是一直在跑,而是有事件進來才被喚醒執行一個 turn。這意味著在沒有訊息的時候,系統幾乎不消耗 LLM 資源,只有輕量的 Gateway daemon 在監聽。
Heartbeat 機制 主動巡檢
這是讓 agent 看起來「有自主意識」的關鍵機制:
- 預設每 30 分鐘(使用 Anthropic OAuth 時為每小時),Gateway 觸發一次 heartbeat 事件
- Agent 被喚醒後,讀取 workspace 中的
HEARTBEAT.md檢查清單 - 自行判斷「現在有沒有什麼該做的事?」
- 有事就主動透過通訊通道通知使用者,沒事就回覆
HEARTBEAT_OK然後休眠
這讓 agent 不僅能被動回應,還能主動追蹤待辦事項、跟進進度、發送提醒。
Lane-Aware FIFO Queue 並行處理
為了避免同一個 session 被同時處理兩次(兩個想法打架),Gateway 使用了 lane-aware FIFO 佇列:
| 佇列模式 | 行為說明 |
|---|---|
| Collect | 合併多條訊息成一次 follow-up turn,避免逐條處理 |
| Followup | 等待當前 run 完成後再處理下一條 |
| Steer | 在工具執行邊界注入新輸入,允許即時導向 |
並行策略:同一 session 內循序處理,不同 session 之間可平行執行。
Session 持久化
所有對話狀態以 JSONL 格式存在磁碟上:
~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl不依賴記憶體,daemon 重啟後不會遺失上下文。Session 設計強調隔離性:
- Primary session:每個 agent 一個主要 DM session
- Channel sessions:群組/頻道各自獨立的上下文
- Secure DM mode:多使用者部署時可啟用每位發送者隔離
Agent Turn 執行流程
每當一個事件(使用者訊息、heartbeat、webhook 等)進入 Gateway,agent 會執行一個 turn,流程如下:
flowchart TD A[事件進入 Gateway] --> B[路由到對應 Session] B --> C[載入 Session 歷史 + Workspace 上下文] C --> D[呼叫 LLM] D --> E{需要工具執行?} E -->|是| F[執行工具: 瀏覽器/檔案系統/Shell/Plugin] F --> D E -->|否| G[持久化狀態到磁碟] G --> H[回覆使用者或保持靜默]這是一個確定性的迴圈模式,每個 turn 結束後 agent 就回到休眠狀態,等待下一個事件觸發。
WebSocket 通訊協定
Gateway 實作了統一的 WebSocket 協定,所有客戶端(CLI、Web UI、行動 App)透過相同協定連接:
| Frame 類型 | 格式 | 用途 |
|---|---|---|
| Request | {type: "req", id, method, params} | 客戶端發起請求 |
| Response | {type: "res", id, ok, payload} | 伺服器回應結果 |
| Event | {type: "event", event, payload} | 即時事件推送 |
這種設計讓任何平台的客戶端都能以統一的方式與 Gateway 溝通,新增通道只需實作對應的 adapter。
總結
| 機制 | 作用 |
|---|---|
| Daemon 服務 | 開機自啟、背景常駐、不怕 Terminal 關閉或重新開機 |
| 事件驅動 | 不持續佔用 LLM 資源,有事才喚醒 agent |
| Heartbeat | 定期自我巡檢,主動追蹤待辦事項並通知使用者 |
| 多通道監聽 | 任何平台的訊息都能即時路由到 agent 處理 |
| 磁碟持久化 | Session 狀態不怕重啟遺失,JSONL 格式儲存 |
| FIFO Queue | 避免並行衝突,確保訊息有序處理 |
本質上,OpenClaw 是一個輕量級的訊息路由器 + 按需喚醒的 AI worker,而不是一個「一直在思考」的 AI。這種設計讓它在普通筆電或便宜的 VPS 上就能實現 24 小時服務,同時保持極低的閒置資源消耗。