# OpenClaw 架构蓝图 > 完整的系统架构可视化 --- ## 1. 整体系统架构 ```mermaid graph TB subgraph "客户端层 Clients" APP1[macOS App] APP2[iOS App] APP3[Android App] UI[Web UI] CLI[CLI Tool] NODES[Nodes
macOS/iOS/Android] end subgraph "网关层 Gateway (18789)" WS[WebSocket Server] HTTP[HTTP Server] PROTO[Protocol Validator
AJV] CHANNELS[Channel Manager] EVENTS[Event Dispatcher] METHODS[Method Handlers] CRON[Cron Service] CANVAS["Canvas Host
a2ui (18793)"] end subgraph "通道层 Channels" WA[WhatsApp Web
Baileys] TG[Telegram
grammY] DC[Discord] SL[Slack] SG[Signal] IM[iMessage] LN[LINE] GO[Google Chat] MS[MS Teams] EXT[Extensions
Matrix/Zalo/etc] end subgraph "Agent 层" ROUTER[Message Router
Bindings] SESSION[Session Manager] AGENT[Agent Runtime] TOOLS[Tool Execution] MEMORY[Memory Store] PROVIDERS[Model Providers
OpenAI/Anthropic/etc] end subgraph "基础设施层Infrastructure" MEDIA[Media Pipeline
Store/Fetch/Process] CONFIG[Config System
JSON5/Zod] PAIRING[Device Pairing] AUTH[Authentication] LOGS[Logging System] DIAG[Diagnostic Events] end subgraph "扩展层Plugins" PLUGINSDK[Plugin SDK] CHANNEL_PLG[Channel Plugins] MEMORY_PLG[Memory Plugins] PROVIDER_PLG[Provider Plugins] HOOKS[Lifecycle Hooks] end %% 连接关系 APP1 -->|WebSocket| WS APP2 -->|WebSocket| WS APP3 -->|WebSocket| WS UI -->|WebSocket| WS CLI -->|WebSocket| WS NODES -->|WebSocket| WS WS --> PROTO PROTO --> METHODS PROTO --> EVENTS HTTP --> METHODS METHODS --> CHANNELS METHODS --> ROUTER METHODS --> CONFIG METHODS --> MEDIA CHANNELS --> WA CHANNELS --> TG CHANNELS --> DC CHANNELS --> SL CHANNELS --> SG CHANNELS --> IM CHANNELS --> LN CHANNELS --> GO CHANNELS --> MS CHANNELS --> EXT CHANNELS -.->|事件| EVENTS EVENTS -.->|广播| WS CRON -.->|触发| EVENTS WA -->|入站| CHANNELS TG -->|入站| CHANNELS DC -->|入站| CHANNELS SL -->|入站| CHANNELS SG -->|入站| CHANNELS IM -->|入站| CHANNELS LN -->|入站| CHANNELS GO -->|入站| CHANNELS MS -->|入站| CHANNELS EXT -->|入站| CHANNELS CHANNELS -->|路由| ROUTER ROUTER --> AGENT AGENT --> TOOLS AGENT --> MEMORY AGENT --> PROVIDERS AGENT -->|出站| CHANNELS AGENT -.->|事件| EVENTS SESSION -->|持久化| ROUTER METHODS --> MEDIA CONFIG -->|加载| CHANNELS CONFIG -->|加载| ROUTER WS --> AUTH PAIRING --> AUTH LOGS -->| everywhere | * DIAG -->| everywhere | * PLUGINSDK --> CHANNEL_PLG PLUGINSDK --> MEMORY_PLG PLUGINSDK --> PROVIDER_PLG CHANNEL_PLG --> CHANNELS MEMORY_PLG --> MEMORY PROVIDER_PLG --> PROVIDERS HOOKS --> AGENT HOOKS --> CHANNELS HOOKS --> EVENTS style Gateway fill:#e1f5fe style Clients fill:#f3e5f5 style Channels fill:#fff3e0 style Agent fill:#e8f5e9 style Infrastructure fill:#fce4ec style Plugins fill:#fff9c4 ``` --- ## 2. Gateway 详细架构 ```mermaid graph TB subgraph "Gateway Server:端口 18789" ENTER[客户端连接] --> WS_CONN subgraph "WebSocket 层" WS_CONN[WebSocket Server] WS_HANDLER[WS Handler] FRAME_PARSER[Frame Parser] FRAME_VALIDATOR[Frame Validator
JSON Schema] end subgraph "连接管理 Connect Management" HELLO[req:connect] AUTH_CHECK[Auth Check
Token Check] PAIRING_CHECK[Pairing Check
Device Approval] CLIENT_REGISTRY[Client Registry] end subgraph "方法层 Method Layer" METHOD_DISPATCH[Method Dispatcher] CORE_HANDLERS[Core Handlers
health/status/send/agent] GATEWAY_METHODS[Gateway Methods
channels.* / media.*] PLUGIN_METHODS[Plugin Methods] end subgraph "状态层 State Layer" RUNTIME_STATE[Runtime State
健康查看 / 缓冲] CHANNEL_STATE[Channel State
运行时实例] NODE_REGISTRY[Node Registry] end subgraph "事件层 Event Layer" EVENT_EMITTER[Event Emitter] AGENT_EVENTS[agent Events] CHAT_EVENTS[chat Events] PRESENCE_EVENTS[presence Events] HEARTBEAT[heartbeat Events] DIAGNOSTICS[diagnostic Events] end subgraph "资源层 Resource Layer" CONFIG_RELOAD[Config Reloader] CHANNEL_MANAGER[Channel Manager] CANVAS_HOST[Canvas Host
a2ui:18793] MEDIA_SERVER[Media Server] CRON_SCHEDULER[Cron Scheduler] end end %% 连接关系 WS_CONN --> WS_HANDLER WS_HANDLER --> FRAME_PARSER FRAME_PARSER --> FRAME_VALIDATOR FRAME_VALIDATOR --> HELLO FRAME_VALIDATOR --> METHOD_DISPATCH HELLO --> AUTH_CHECK AUTH_CHECK --> PAIRING_CHECK PAIRING_CHECK --> CLIENT_REGISTRY CLIENT_REGISTRY --> RUNTIME_STATE METHOD_DISPATCH --> CORE_HANDLERS METHOD_DISPATCH --> GATEWAY_METHODS METHOD_DISPATCH --> PLUGIN_METHODS CORE_HANDLERS -->|使用| RUNTIME_STATE CORE_HANDLERS -->|使用| CHANNEL_STATE CORE_HANDLERS -->|使用| CHANNEL_MANAGER GATEWAY_METHODS --> CHANNEL_MANAGER GATEWAY_METHODS --> MEDIA_SERVER GATEWAY_METHODS --> NODE_REGISTRY CHANNEL_MANAGER --> CHANNEL_STATE CHANNEL_MANAGER -->|启动/停止| WA_SVC CHANNEL_MANAGER -->|启动/停止| TG_SVC CHANNEL_MANAGER -->|启动/停止| DC_SVC RLGA_EVENTS -.->|广播| WS_HANDLER HEARTBEAT -.->|广播| WS_HANDLER DIAGNOSTICS -.->|广播| WS_HANDLER CONFIG_RELOAD -.->|通知| CORE_HANDLERS CONFIG_RELOAD -.->|通知| CHANNEL_MANAGER CRON_SCHEDULER -.->|触发| EVENT_EMITTER CRON_SCHEDULER -.->|触发| CANVAS_HOST subgraph "外部服务 External Services" WA_SVC[WhatsApp Service] TG_SVC[Telegram Service] DC_SVC[Discord Service] end style GatewayServer fill:#e1f5fe style WebSocket层 fill:#e3f2fd style MethodLayer fill:#bbdefb style StateLayer fill:#90caf9 style EventLayer fill:#64b5f6 style ResourceLayer fill:#42a5f5 style ExternalServices fill:#ffecb3 ``` --- ## 3. 消息流转图 Message Flow ```mermaid sequenceDiagram participant USER as 用户 participant CH as 通道通道
WhatsApp/Telegram/etc participant GATEWAY as Gateway participant ROUTER as Message Router participant AGENT as Agent Runtime participant PROVIDER as AI Provider participant TOOLS as Tools %% 入站消息流 USER->>CH: 发送消息 CH->>GATEWAY: 接入事件 GATEWAY->>ROUTER: 解析路由
(channel/account/peer) ROUTER-->>GATEWAY: 返回匹配结果
(agentId, sessionKey) GATEWAY->>AGENT: 调用 agent.execute AGENT->>AGENT: 加载会话历史 AGENT->>AGENT: 构建系统提示 AGENT->>PROVIDER: 发起 LLM 调用 alt 需要工具调用 PROVIDER-->>AGENT: 返回 tool_calls AGENT->>TOOLS: 执行工具 TOOLS-->>AGENT: 返回工具结果 AGENT->>PROVIDER: 继续调用 (with tool results) end PROVIDER-->>AGENT: 返回完整响应 AGENT->>AGENT: 更新会话历史 AGENT-->>GATEWAY: 返回响应 (events: agent) GATEWAY->>CH: 发送消息 (channel.message.send) CH->>USER: 接收回复 %% 出站消息流 (CLI/Web/App 触发) rect rgb(255, 255, 200) Note over GATEWAY,USER: 出站消息流 (从客户端触发) USER->>GATEWAY: 调用 gateway.send GATEWAY->>ROUTER: 解析路由 ROUTER-->>GATEWAY: 返回匹配结果 GATEWAY->>CH: 发送消息 CH->>USER: 接收消息 end ``` --- ## 4. 插件系统架构 Plugin System ```mermaid graph TB subgraph "插件 API Plugin SDK" API[OpenClawPluginApi] end subgraph "插件运行时 Plugin Runtime" RUNTIME[Plugin Runtime] CONFIG_API[Config API
loadConfig/writeConfigFile] SYSTEM_API[System API
enqueueSystemEvent] MEDIA_API[Media API
loadWebMedia/detectMime] TTS_API[TTS API
textToSpeechTelephony] TOOLS_API[Tools API
createMemoryGetTool] CHANNEL_API[Channel API
routing/network/session] LOGGING_API[Logging API
getChildLogger] end subgraph "注册接口 Registrations" REG_TOOL[registerTool] REG_HOOK[registerHook] REG_HTTP[registerHttpRoute/registerHttpHandler] REG_CHANNEL[registerChannel] REG_GW_METHOD[registerGatewayMethod] REG_CLI[registerCli] REG_SERVICE[registerService] REG_PROVIDER[registerProvider] REG_CMD[registerCommand] end subgraph "钩子系统 Hook System" H_BEFORE_AGENT[before_agent_start] H_AFTER_AGENT[after_agent_start] H_BEFORE_SEND[before_message_send] H_AFTER_SEND[after_message_send] H_RECEIVED[message_received] H_TOOL[tool_called] H_CONFIG[config_changed] end subgraph "插件类型 Plugin Types" P_CHANNEL[Channel Plugin
must implement ChannelPlugin] P_MEMORY[Memory Plugin
LanceDB/etc] P_PROVIDER[Provider Plugin
Custom AI API] end subgraph "插件生命周期 Plugin Lifecycle" LOAD[loadPlugin] VALIDATE[validateConfig] REGISTER[register] ACTIVATE[activate] DISPOSE[dispose] end %% 连接关系 API --> RUNTIME RUNTIME --> CONFIG_API RUNTIME --> SYSTEM_API RUNTIME --> MEDIA_API RUNTIME --> TTS_API RUNTIME --> TOOLS_API RUNTIME --> CHANNEL_API RUNTIME --> LOGGING_API API --> REG_TOOL API --> REG_HOOK API --> REG_HTTP API --> REG_CHANNEL API --> REG_GW_METHOD API --> REG_CLI API --> REG_SERVICE API --> REG_PROVIDER API --> REG_CMD REG_HOOK --> H_BEFORE_AGENT REG_HOOK --> H_AFTER_AGENT REG_HOOK --> H_BEFORE_SEND REG_HOOK --> H_AFTER_SEND REG_HOOK --> H_RECEIVED REG_HOOK --> H_TOOL REG_HOOK --> H_CONFIG REG_CHANNEL --> P_CHANNEL LOAD --> VALIDATE VALIDATE --> REGISTER REGISTER --> ACTIVATE ACTIVATE --> DISPOSE P_CHANNEL -.->|loose coupling| H_RECEIVED P_CHANNEL -.->|loose coupling| H_BEFORE_SEND style PluginSDK fill:#fff9c4 style PluginRuntime fill:#fff59d style Registrations fill:#ffee58 style HookSystem fill:#fdd835 style PluginTypes fill:#fbc02d style PluginLifecycle fill:#f9a825 ``` --- ## 5. 路与绑定系统 Routing & Bindings ```mermaid graph TD subgraph "路由输入 Route Input" CFG[User Config
bindings 数组] IN_CHANNEL[channel
消息来源] IN_ACCOUNT[accountId
账户 ID] IN_PEER[peer
用户/组 ID] IN_GUILD[guildId
Discord 服务器] IN_TEAM[teamId
Slack/Teams] end subgraph "路由匹配优先级 Matching Priority" P1[1. peer
具体用户/组] P2[2. peer.parent
线程继承] P3[3. guildId
Discord 服务器] P4[4. teamId
Slack/Teams] P5[5. account
非通配符账户] P6[6. account
通配符账户] P7[7. default
默认绑定] end subgraph "路由输出 Route Output" AGENT_ID[agentId
目标 Agent] SESSION_KEY[sessionKey
会话唯一标识] MAIN_KEY[mainSessionKey
主会话] MATCHED_BY[matchedBy
匹配方式] end subgraph "会话管理 Session Management" SESSION_STORE[Session Store
~/.openclaw/sessions/] SESSION_FILE[.jsonl 文件
role/content/timestamp] HISTORY[上下文历史
消息 turnover] end %% 连接关系 CFG -->|解析| P1 IN_CHANNEL -->|输入| P1 IN_ACCOUNT -->|输入| P1 IN_PEER -->|输入| P1 IN_GUILD -->|输入| P1 IN_TEAM -->|输入| P1 P1 -->|无匹配| P2 P2 -->|无匹配| P3 P3 -->|无匹配| P4 P4 -->|无匹配| P5 P5 -->|无匹配| P6 P6 -->|无匹配| P7 P1 -->|匹配| AGENT_ID P2 -->|匹配| AGENT_ID P3 -->|匹配| AGENT_ID P4 -->|匹配| AGENT_ID P5 -->|匹配| AGENT_ID P6 -->|匹配| AGENT_ID P7 -->|匹配| AGENT_ID AGENT_ID -->|构建| SESSION_KEY AGENT_ID -->|构建| MAIN_KEY P1 -->|设置| MATCHED_BY P2 -->|设置| MATCHED_BY P3 -->|设置| MATCHED_BY P4 -->|设置| MATCHED_BY P5 -->|设置| MATCHED_BY P6 -->|设置| MATCHED_BY P7 -->|设置| MATCHED_BY SESSION_KEY -->|读写| SESSION_STORE MAIN_KEY -->|读写| SESSION_STORE SESSION_STORE -->|包含| SESSION_FILE SESSION_FILE -->|构建| HISTORY style RouteInput fill:#e8f5e9 style MatchingPriority fill:#c8e6c9 style RouteOutput fill:#a5d6a7 style SessionManagement fill:#81c784 ``` --- ## 6. 媒体管道架构 Media Pipeline ```mermaid graph LR subgraph "入站 Inbound" A[收到媒体] --> B[parse
提取媒体] B --> C[mime.ts
检测 MIME] C -->|magic number
+ content type| MIME_TYPE{MIME 类型?} MIME_TYPE -->|image| D[store.ts
保存到磁盘] MIME_TYPE -->|audio| D MIME_TYPE -->|video| D MIME_TYPE -->|unknown| DROP[丢弃/警告] end subgraph "存储 Storage" D --> STORAGE[~/.openclaw/media/inbound/] STORAGE --> FILES["{original}---{uuid}.ext"] end subgraph "处理 Processing (可选)" FILES --> E[image_ops.ts
image/image-ops.ts] E -->|resizeToJpeg| RESIZED[调整大小的 JPEG] end subgraph "出站 Outbound" OUT_REQ[出站请求] --> OUT_MIME[mime.ts
检测 MIME] OUT_MIME -->|需要处理?| OUT_PROC[image_ops/audio.ts] OUT_MIME -->|不需要处理| OUT_STORE[store.ts
保存到磁盘] OUT_PROC --> OUT_STORE OUT_STORE --> OUT_STORAGE[~/.openclaw/media/outbound/] end subgraph "服务服务 & Fetch" STORAGE --> HOST[host.ts
HTTP 服务] OUT_STORAGE --> HOST HOST -->|GET /media/*| CLIENT[客户端] FETCH[fetch.ts
远程获取] --> STORAGE end style Inbound fill:#e3f2fd style Storage fill:#bbdefb style Processing fill:#90caf9 style Outbound fill:#64b5f6 style ServeFetch fill:#42a5f5 ``` --- ## 7. Gateway 通信协议 Gateway Protocol ```mermaid stateDiagram-v2 direction LR %% 定义带有复杂描述的状态名(规避连线上的解析Bug) state "Authenticated (已认证)" as Authenticated state "Connected (已就绪)" as Connected state "Requesting (请求中)" as Requesting state "Streaming (流式传输中)" as Streaming state "Waiting (异步等待中)" as Waiting state "Error (发生错误)" as Error state "Closed (连接关闭)" as Closed [*] --> Disconnected note right of Disconnected 未连接状态 end note Disconnected --> Connecting: 客户端发起WS连接 %% 连线描述尽量保持简洁,避开特殊字符 Connecting --> Authenticated: req_connect_auth_ok Connecting --> Closed: 认证失败 Connecting --> Closed: 非首帧为connect Authenticated --> Connected: res_hello_ok Connected --> Requesting: req_method Connected --> Streaming: event_stream Requesting --> Connected: res_ok_sync Requesting --> Waiting: method_processing Waiting --> Connected: res_ok Waiting --> Error: res_error Streaming --> Connected: stream_end Streaming --> Streaming: stream_continue Connected --> Closed: 客户端断开 Error --> Connected: error_recovery Authenticated --> Closed: connection_close Closed --> [*] note right of Streaming agent 事件流示例: { "type": "event", "event": "agent", "payload": { "agentId": "xxx", "runId": "yyy", "status": "running" } } end note note right of Requesting request 示例: { "type": "req", "id": 1, "method": "send", "params": { "channel": "whatsapp", "target": "...", "text": "..." } } end note ``` --- ## 8. 认证与配对流程 Authentication & Pairing ```mermaid sequenceDiagram participant DEV as 设备(Device)
CLI/App/Node participant WS as Gateway
WebSocket Server participant AUTH as Auth Module participant PAIRING as Pairing Store participant USER as 操作员 %% 首次连接 - 本地 rect rgb(200, 255, 200) Note over DEV,USER: 场景:首次本地连接 (自动批准) DEV->>WS: WS connect WS->>AUTH: 生成 deviceIdentity AUTH-->>WS: deviceIdentity (含 deviceID) WS-->>DEV: res:connect + deviceIdentity DEV->>WS: req:connect (带 deviceID) WS->>AUTH: 验证 deviceID 是否本地 AUTH->>PAIRING: 检查 pairing 状态 PAIRING-->>AUTH: 新设备 (需要批准) AUTH->>AUTH: 本地地址 -> 自动批准 AUTH->>PAIRING: 生成 deviceToken AUTH-->>WS: 设备已批准 WS-->>DEV: res:hello-ok (带 deviceToken) end %% 首次连接 - 远程 rect rgb(255, 200, 200) Note over DEV,USER: 场景:首次远程连接 (需要批准) DEV->>WS: WS connect (via Tailscale/VPN) WS->>AUTH: 生成 deviceIdentity (带 challenge) AUTH-->>WS: deviceIdentity + challenge WS-->>DEV: res:connect + deviceIdentity + challenge DEV->>DEV: 签名 challenge DEV->>WS: req:connect (带 deviceID + signature) WS->>AUTH: 验证签名 AUTH->>PAIRING: 检查 pairing 状态 PAIRING-->>AUTH: 新设备,非本地 AUTH-->>USER: 通知等待批准 USER-->>AUTH: 批准设备 AUTH->>PAIRING: 生成并保存 deviceToken AUTH-->>WS: 设备已批准 WS-->>DEV: res:hello-ok (带 deviceToken) end %% 后续连接 rect rgb(200, 200, 255) Note over DEV,USER: 场景:后续连接 DEV->>WS: WS connect DEV->>WS: req:connect (带 deviceID + deviceToken) WS->>PAIRING: 验证 deviceToken PAIRING-->>WS: Token 有效 WS-->>DEV: res:hello-ok end ``` --- ## 9. 完整组件关系图 Component Relationships ```mermaid graph TB %% CLI 层 CLI[openclaw CLI
openclaw.mjs] PROG[src/index.ts
buildProgram] CMDS[src/commands/] CLI --> PROG PROG --> CMD_DEPS[createDefaultDeps] %% Gateway 层 GW_SERVER[src/gateway/server.impl.ts
startGatewayServer] GW_PROT[src/gateway/protocol/] GW_METHODS[src/gateway/server-methods/] GW_CHAN[src/gateway/server-channels.ts] GW_SERVER --> GW_PROT GW_SERVER --> GW_METHODS GW_SERVER --> GW_CHAN %% 通道层 CHAN_SYS[src/channels/] PLUG_TYPES[src/channels/plugins/types.plugin.ts] PLUG_ADAPTER[src/channels/plugins/types.adapters.ts] WHAST[whatsapp.ts] TELEG[telegram.ts] DISC[discord.ts] SLACK[slack.ts] SIGNL[signal.ts] IMMSG[imessage.ts] CHAN_SYS --> PLUG_TYPES CHAN_SYS --> PLUG_ADAPTER CHAN_SYS --> WA CHAN_SYS --> TG CHAN_SYS --> DC CHAN_SYS --> SL CHAN_SYS --> SI CHAN_SYS --> IM GW_CHAN --> CHAN_SYS %% Agent 层 AGENT_RT[src/agents/runtime.ts] AGENT_TOOLS[src/agents/tools/] ROUTER[src/routing/resolve-route.ts] ROUTER --> AGENT_RT AGENT_RT --> AGENT_TOOLS GW_METHODS --> ROUTER %% 配置层 CONFIG[src/config/] ZOD_TYPES[src/config/zod-schema.*.ts] CONFIG --> ZOD_TYPES GW_SERVER --> CONFIG ROUTER --> CONFIG %% 媒体层 MEDIA[src/media/] MIME[mime.ts] STORE[store.ts] FETCH[fetch.ts] MEDIA --> MIME MEDIA --> STORE MEDIA --> FETCH GW_METHODS --> MEDIA %% 插件层 PLUG_SYS[src/plugins/] PLUG_SDK[src/plugin-sdk/] PLUG_SYS --> PLUG_SDK GW_SERVER --> PLUG_SYS %% 钩子 HOOKS[src/hooks/types.ts] HOOKS --> AGENT_RT PLUG_SDK --> HOOKS %% 基础设施 INFRA[src/infra/] PORTS[ports.ts] LOGG[logging/] INFRA --> PORTS INFRA --> LOGG GW_SERVER --> INFRA style CLI fill:#e1f5fe style GatewayServer fill:#bbdefb style ChannelLayer fill:#90caf9 style AgentLayer fill:#64b5f6 style ConfigLayer fill:#42a5f5 style MediaLayer fill:#1e88e5 style PluginLayer fill:#0d47a1 ``` --- ## 附录:组件职责 | 组件 | 职责 | | ------------------ | ---------------------------------------------- | | **CLI** | 命令行界面,启动 gateway、发送消息、配置管理等 | | **Gateway** | WebSocket 服务器,协议验证,事件广播,通道管理 | | **Channels** | 消息平台适配器,入站/出站消息,状态管理 | | **Routing** | 消息路由解析,绑定匹配,会话键构建 | | **Agent Runtime** | AI Agent 执行,工具调用,会话管理 | | **Media Pipeline** | 媒体上传、存储、处理、服务 | | **Config System** | 配置加载、验证、迁移、监听 | | **Plugin SDK** | 插件开发接口,运行时 API | | **Hooks** | 生命周期钩子,插件扩展点 | | **Infrastructure** | 端口管理、日志、诊断事件、SSRF 防护 | --- **文档结束**