目录
-
- [1. 引言 - 为什么需要跨设备能力?](#1. 引言 - 为什么需要跨设备能力?)
-
- [1.1 云端 Agent 的局限](#1.1 云端 Agent 的局限)
- [1.2 Nodes 的解决思路](#1.2 Nodes 的解决思路)
- [1.3 Nodes 能力概览](#1.3 Nodes 能力概览)
- [2. Nodes 概念模型](#2. Nodes 概念模型)
-
- [2.1 核心概念](#2.1 核心概念)
- [2.2 通信模型](#2.2 通信模型)
- [3. 设备配对流程](#3. 设备配对流程)
-
- [3.1 配对方式](#3.1 配对方式)
- [3.2 QR 码配对实战](#3.2 QR 码配对实战)
- [3.3 配对状态流转](#3.3 配对状态流转)
- [3.4 配对安全机制](#3.4 配对安全机制)
- [4. 节点管理操作](#4. 节点管理操作)
-
- [4.1 查看节点列表](#4.1 查看节点列表)
- [4.2 节点状态监控](#4.2 节点状态监控)
- [4.3 解除配对](#4.3 解除配对)
- [5. 跨设备操作实战](#5. 跨设备操作实战)
-
- [5.1 在节点上执行命令](#5.1 在节点上执行命令)
- [5.2 通过节点控制浏览器](#5.2 通过节点控制浏览器)
- [5.3 跨设备文件操作](#5.3 跨设备文件操作)
- [6. 实战案例](#6. 实战案例)
-
- [6.1 案例1:手机节点配对与操作](#6.1 案例1:手机节点配对与操作)
- [6.2 案例2:远程控制 Mac 桌面](#6.2 案例2:远程控制 Mac 桌面)
- [6.3 案例3:多节点协同工作流](#6.3 案例3:多节点协同工作流)
- [7. 安全与最佳实践](#7. 安全与最佳实践)
-
- [7.1 安全注意事项](#7.1 安全注意事项)
- [7.2 最佳实践](#7.2 最佳实践)
- [7.3 节点配置示例](#7.3 节点配置示例)
- [8. 总结](#8. 总结)
-
- [8.1 Nodes 核心价值](#8.1 Nodes 核心价值)
- [8.2 思考题](#8.2 思考题)
- [8.3 参考链接](#8.3 参考链接)
📱 摘要:OpenClaw Nodes 是实现 AI Agent 跨设备协作的核心机制。通过节点配对,Agent 可以将命令执行、浏览器控制、文件操作等能力扩展到用户的手机、平板、Mac 等设备上,打破云端与本地的边界。本文深入剖析 Nodes 的概念模型、配对流程(QR 码/设置码)、设备管理机制、跨设备通信原理,并结合实战案例展示如何构建手机节点控制、跨设备文件同步、远程桌面操作等应用场景。掌握 Nodes,是从"云端 Agent"到"全设备 Agent"的关键跨越。
1. 引言 - 为什么需要跨设备能力?
1.1 云端 Agent 的局限
传统 AI Agent 运行在云端,存在天然局限:
| 局限 | 说明 | 影响 |
|---|---|---|
| 无法访问本地文件 | 云端无法读取用户电脑/手机上的文件 | 无法处理本地文档、照片 |
| 无法控制本地应用 | 无法操作桌面软件、手机App | 无法自动化日常操作 |
| 无法使用本地算力 | 无法利用设备的GPU/CPU | 无法运行本地模型 |
| 无法感知本地环境 | 无法获取位置、传感器数据 | 无法提供情境化服务 |
1.2 Nodes 的解决思路
#mermaid-svg-0w5oQbeDjgvlt4lh{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0w5oQbeDjgvlt4lh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0w5oQbeDjgvlt4lh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0w5oQbeDjgvlt4lh .error-icon{fill:#552222;}#mermaid-svg-0w5oQbeDjgvlt4lh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0w5oQbeDjgvlt4lh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0w5oQbeDjgvlt4lh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0w5oQbeDjgvlt4lh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0w5oQbeDjgvlt4lh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0w5oQbeDjgvlt4lh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0w5oQbeDjgvlt4lh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0w5oQbeDjgvlt4lh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0w5oQbeDjgvlt4lh .marker.cross{stroke:#333333;}#mermaid-svg-0w5oQbeDjgvlt4lh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0w5oQbeDjgvlt4lh p{margin:0;}#mermaid-svg-0w5oQbeDjgvlt4lh .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0w5oQbeDjgvlt4lh .cluster-label text{fill:#333;}#mermaid-svg-0w5oQbeDjgvlt4lh .cluster-label span{color:#333;}#mermaid-svg-0w5oQbeDjgvlt4lh .cluster-label span p{background-color:transparent;}#mermaid-svg-0w5oQbeDjgvlt4lh .label text,#mermaid-svg-0w5oQbeDjgvlt4lh span{fill:#333;color:#333;}#mermaid-svg-0w5oQbeDjgvlt4lh .node rect,#mermaid-svg-0w5oQbeDjgvlt4lh .node circle,#mermaid-svg-0w5oQbeDjgvlt4lh .node ellipse,#mermaid-svg-0w5oQbeDjgvlt4lh .node polygon,#mermaid-svg-0w5oQbeDjgvlt4lh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0w5oQbeDjgvlt4lh .rough-node .label text,#mermaid-svg-0w5oQbeDjgvlt4lh .node .label text,#mermaid-svg-0w5oQbeDjgvlt4lh .image-shape .label,#mermaid-svg-0w5oQbeDjgvlt4lh .icon-shape .label{text-anchor:middle;}#mermaid-svg-0w5oQbeDjgvlt4lh .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-0w5oQbeDjgvlt4lh .rough-node .label,#mermaid-svg-0w5oQbeDjgvlt4lh .node .label,#mermaid-svg-0w5oQbeDjgvlt4lh .image-shape .label,#mermaid-svg-0w5oQbeDjgvlt4lh .icon-shape .label{text-align:center;}#mermaid-svg-0w5oQbeDjgvlt4lh .node.clickable{cursor:pointer;}#mermaid-svg-0w5oQbeDjgvlt4lh .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-0w5oQbeDjgvlt4lh .arrowheadPath{fill:#333333;}#mermaid-svg-0w5oQbeDjgvlt4lh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0w5oQbeDjgvlt4lh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0w5oQbeDjgvlt4lh .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0w5oQbeDjgvlt4lh .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0w5oQbeDjgvlt4lh .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0w5oQbeDjgvlt4lh .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-0w5oQbeDjgvlt4lh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0w5oQbeDjgvlt4lh .cluster text{fill:#333;}#mermaid-svg-0w5oQbeDjgvlt4lh .cluster span{color:#333;}#mermaid-svg-0w5oQbeDjgvlt4lh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0w5oQbeDjgvlt4lh .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0w5oQbeDjgvlt4lh rect.text{fill:none;stroke-width:0;}#mermaid-svg-0w5oQbeDjgvlt4lh .icon-shape,#mermaid-svg-0w5oQbeDjgvlt4lh .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0w5oQbeDjgvlt4lh .icon-shape p,#mermaid-svg-0w5oQbeDjgvlt4lh .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-0w5oQbeDjgvlt4lh .icon-shape .label rect,#mermaid-svg-0w5oQbeDjgvlt4lh .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0w5oQbeDjgvlt4lh .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0w5oQbeDjgvlt4lh .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0w5oQbeDjgvlt4lh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户设备
云端 OpenClaw
WebSocket
Gateway
Session
Agent
Node Client
本地执行器
文件系统
浏览器
系统命令
Nodes 的核心思想:在用户设备上运行一个轻量级客户端(Node),通过 WebSocket 与云端 Gateway 保持长连接,Agent 的指令通过这条通道下发到设备执行。
1.3 Nodes 能力概览
| 能力 | 说明 | 典型场景 |
|---|---|---|
| 远程命令执行 | 在设备上运行 shell 命令 | 系统管理、脚本执行 |
| 浏览器控制 | 控制设备上的浏览器 | 操作已登录的网站 |
| 文件操作 | 读写设备上的文件 | 文档处理、数据同步 |
| 状态监控 | 获取设备运行状态 | 健康检查、性能监控 |
| 屏幕截图 | 捕获设备屏幕 | 远程协助、错误排查 |
2. Nodes 概念模型
2.1 核心概念
#mermaid-svg-bjH4UCG5WU2UnVk9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bjH4UCG5WU2UnVk9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bjH4UCG5WU2UnVk9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bjH4UCG5WU2UnVk9 .error-icon{fill:#552222;}#mermaid-svg-bjH4UCG5WU2UnVk9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bjH4UCG5WU2UnVk9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bjH4UCG5WU2UnVk9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bjH4UCG5WU2UnVk9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bjH4UCG5WU2UnVk9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bjH4UCG5WU2UnVk9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bjH4UCG5WU2UnVk9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bjH4UCG5WU2UnVk9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bjH4UCG5WU2UnVk9 .marker.cross{stroke:#333333;}#mermaid-svg-bjH4UCG5WU2UnVk9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bjH4UCG5WU2UnVk9 p{margin:0;}#mermaid-svg-bjH4UCG5WU2UnVk9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-bjH4UCG5WU2UnVk9 .cluster-label text{fill:#333;}#mermaid-svg-bjH4UCG5WU2UnVk9 .cluster-label span{color:#333;}#mermaid-svg-bjH4UCG5WU2UnVk9 .cluster-label span p{background-color:transparent;}#mermaid-svg-bjH4UCG5WU2UnVk9 .label text,#mermaid-svg-bjH4UCG5WU2UnVk9 span{fill:#333;color:#333;}#mermaid-svg-bjH4UCG5WU2UnVk9 .node rect,#mermaid-svg-bjH4UCG5WU2UnVk9 .node circle,#mermaid-svg-bjH4UCG5WU2UnVk9 .node ellipse,#mermaid-svg-bjH4UCG5WU2UnVk9 .node polygon,#mermaid-svg-bjH4UCG5WU2UnVk9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bjH4UCG5WU2UnVk9 .rough-node .label text,#mermaid-svg-bjH4UCG5WU2UnVk9 .node .label text,#mermaid-svg-bjH4UCG5WU2UnVk9 .image-shape .label,#mermaid-svg-bjH4UCG5WU2UnVk9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-bjH4UCG5WU2UnVk9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-bjH4UCG5WU2UnVk9 .rough-node .label,#mermaid-svg-bjH4UCG5WU2UnVk9 .node .label,#mermaid-svg-bjH4UCG5WU2UnVk9 .image-shape .label,#mermaid-svg-bjH4UCG5WU2UnVk9 .icon-shape .label{text-align:center;}#mermaid-svg-bjH4UCG5WU2UnVk9 .node.clickable{cursor:pointer;}#mermaid-svg-bjH4UCG5WU2UnVk9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-bjH4UCG5WU2UnVk9 .arrowheadPath{fill:#333333;}#mermaid-svg-bjH4UCG5WU2UnVk9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bjH4UCG5WU2UnVk9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bjH4UCG5WU2UnVk9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bjH4UCG5WU2UnVk9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-bjH4UCG5WU2UnVk9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bjH4UCG5WU2UnVk9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-bjH4UCG5WU2UnVk9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bjH4UCG5WU2UnVk9 .cluster text{fill:#333;}#mermaid-svg-bjH4UCG5WU2UnVk9 .cluster span{color:#333;}#mermaid-svg-bjH4UCG5WU2UnVk9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bjH4UCG5WU2UnVk9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-bjH4UCG5WU2UnVk9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-bjH4UCG5WU2UnVk9 .icon-shape,#mermaid-svg-bjH4UCG5WU2UnVk9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bjH4UCG5WU2UnVk9 .icon-shape p,#mermaid-svg-bjH4UCG5WU2UnVk9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-bjH4UCG5WU2UnVk9 .icon-shape .label rect,#mermaid-svg-bjH4UCG5WU2UnVk9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bjH4UCG5WU2UnVk9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-bjH4UCG5WU2UnVk9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-bjH4UCG5WU2UnVk9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Node 架构
Node ID
节点名称
设备类型
连接状态
Android
iOS
macOS
Linux
🟢 已连接
🟡 重连中
🔴 离线
Node ID :每个节点的唯一标识符,在配对时生成。格式通常为 node_xxx 或自定义名称。
设备类型:支持 Android、iOS、macOS、Linux 等平台。不同平台的能力范围有所不同:
| 平台 | 命令执行 | 浏览器控制 | 文件操作 | 屏幕截图 |
|---|---|---|---|---|
| Android | ✅ | ✅ | ✅(受限) | ✅ |
| iOS | ⚠️(受限) | ✅ | ⚠️(沙盒) | ✅ |
| macOS | ✅ | ✅ | ✅ | ✅ |
| Linux | ✅ | ✅ | ✅ | ✅ |
2.2 通信模型
设备 Node Gateway 云端 Agent 设备 Node Gateway 云端 Agent #mermaid-svg-rMncLqhVX1FGigED{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rMncLqhVX1FGigED .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rMncLqhVX1FGigED .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rMncLqhVX1FGigED .error-icon{fill:#552222;}#mermaid-svg-rMncLqhVX1FGigED .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rMncLqhVX1FGigED .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rMncLqhVX1FGigED .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rMncLqhVX1FGigED .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rMncLqhVX1FGigED .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rMncLqhVX1FGigED .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rMncLqhVX1FGigED .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rMncLqhVX1FGigED .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rMncLqhVX1FGigED .marker.cross{stroke:#333333;}#mermaid-svg-rMncLqhVX1FGigED svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rMncLqhVX1FGigED p{margin:0;}#mermaid-svg-rMncLqhVX1FGigED .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-rMncLqhVX1FGigED text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-rMncLqhVX1FGigED .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-rMncLqhVX1FGigED .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-rMncLqhVX1FGigED .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-rMncLqhVX1FGigED .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-rMncLqhVX1FGigED #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-rMncLqhVX1FGigED .sequenceNumber{fill:white;}#mermaid-svg-rMncLqhVX1FGigED #sequencenumber{fill:#333;}#mermaid-svg-rMncLqhVX1FGigED #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-rMncLqhVX1FGigED .messageText{fill:#333;stroke:none;}#mermaid-svg-rMncLqhVX1FGigED .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-rMncLqhVX1FGigED .labelText,#mermaid-svg-rMncLqhVX1FGigED .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-rMncLqhVX1FGigED .loopText,#mermaid-svg-rMncLqhVX1FGigED .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-rMncLqhVX1FGigED .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-rMncLqhVX1FGigED .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-rMncLqhVX1FGigED .noteText,#mermaid-svg-rMncLqhVX1FGigED .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-rMncLqhVX1FGigED .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-rMncLqhVX1FGigED .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-rMncLqhVX1FGigED .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-rMncLqhVX1FGigED .actorPopupMenu{position:absolute;}#mermaid-svg-rMncLqhVX1FGigED .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-rMncLqhVX1FGigED .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-rMncLqhVX1FGigED .actor-man circle,#mermaid-svg-rMncLqhVX1FGigED line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-rMncLqhVX1FGigED :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 全程加密通信,双向认证 exec(cmd, host="node", node="my-mac") WebSocket 下发指令 本地执行命令 返回执行结果 结果回传
Agent 通过 Gateway 将指令路由到指定 Node,Node 在本地执行后将结果回传。整个过程对 Agent 透明,只需指定 host="node" 和 node="节点ID" 即可。
3. 设备配对流程
3.1 配对方式
OpenClaw 支持两种配对方式:
| 方式 | 适用场景 | 操作步骤 |
|---|---|---|
| QR 码扫描 | 手机端配对 | 1. Gateway 生成 QR 码 2. 手机 App 扫码 3. 确认配对 |
| 设置码输入 | 桌面端配对 | 1. Gateway 显示设置码 2. 桌面客户端输入 3. 确认配对 |
3.2 QR 码配对实战
python
# 在 OpenClaw 中生成节点配对 QR 码
# 方式1:通过 CLI 命令
# openclaw node pair --platform android
# 方式2:通过 Gateway API
# GET /api/nodes/pair-qr
# 配对流程:
# 1. Gateway 生成包含连接信息的 QR 码
# 2. 用户在手机 App 中扫描 QR 码
# 3. App 与 Gateway 建立 WebSocket 连接
# 4. Gateway 验证配对请求
# 5. 配对成功,节点上线
3.3 配对状态流转
#mermaid-svg-jyT597lsHDrO8Zgv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jyT597lsHDrO8Zgv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jyT597lsHDrO8Zgv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jyT597lsHDrO8Zgv .error-icon{fill:#552222;}#mermaid-svg-jyT597lsHDrO8Zgv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jyT597lsHDrO8Zgv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jyT597lsHDrO8Zgv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jyT597lsHDrO8Zgv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jyT597lsHDrO8Zgv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jyT597lsHDrO8Zgv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jyT597lsHDrO8Zgv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jyT597lsHDrO8Zgv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jyT597lsHDrO8Zgv .marker.cross{stroke:#333333;}#mermaid-svg-jyT597lsHDrO8Zgv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jyT597lsHDrO8Zgv p{margin:0;}#mermaid-svg-jyT597lsHDrO8Zgv defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-jyT597lsHDrO8Zgv g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-jyT597lsHDrO8Zgv g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-jyT597lsHDrO8Zgv g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-jyT597lsHDrO8Zgv g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-jyT597lsHDrO8Zgv g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-jyT597lsHDrO8Zgv .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-jyT597lsHDrO8Zgv .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-jyT597lsHDrO8Zgv .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-jyT597lsHDrO8Zgv .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-jyT597lsHDrO8Zgv .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-jyT597lsHDrO8Zgv .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-jyT597lsHDrO8Zgv .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-jyT597lsHDrO8Zgv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jyT597lsHDrO8Zgv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jyT597lsHDrO8Zgv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jyT597lsHDrO8Zgv .edgeLabel .label text{fill:#333;}#mermaid-svg-jyT597lsHDrO8Zgv .label div .edgeLabel{color:#333;}#mermaid-svg-jyT597lsHDrO8Zgv .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-jyT597lsHDrO8Zgv .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-jyT597lsHDrO8Zgv .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-jyT597lsHDrO8Zgv .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-jyT597lsHDrO8Zgv .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-jyT597lsHDrO8Zgv .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jyT597lsHDrO8Zgv .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jyT597lsHDrO8Zgv #statediagram-barbEnd{fill:#333333;}#mermaid-svg-jyT597lsHDrO8Zgv .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jyT597lsHDrO8Zgv .cluster-label,#mermaid-svg-jyT597lsHDrO8Zgv .nodeLabel{color:#131300;}#mermaid-svg-jyT597lsHDrO8Zgv .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-jyT597lsHDrO8Zgv .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-jyT597lsHDrO8Zgv .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-jyT597lsHDrO8Zgv .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-jyT597lsHDrO8Zgv .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-jyT597lsHDrO8Zgv .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-jyT597lsHDrO8Zgv .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-jyT597lsHDrO8Zgv .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-jyT597lsHDrO8Zgv .note-edge{stroke-dasharray:5;}#mermaid-svg-jyT597lsHDrO8Zgv .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-jyT597lsHDrO8Zgv .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-jyT597lsHDrO8Zgv .statediagram-note text{fill:black;}#mermaid-svg-jyT597lsHDrO8Zgv .statediagram-note .nodeLabel{color:black;}#mermaid-svg-jyT597lsHDrO8Zgv .statediagram .edgeLabel{color:red;}#mermaid-svg-jyT597lsHDrO8Zgv #dependencyStart,#mermaid-svg-jyT597lsHDrO8Zgv #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-jyT597lsHDrO8Zgv .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jyT597lsHDrO8Zgv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 扫码/输入设置码
验证通过
验证失败
WebSocket 建立
网络中断
恢复连接
超时断开
解除配对
主动断开
未配对
配对中
已配对
已连接
重连中
配对成功后,节点信息会保存在 Gateway 配置中,下次启动自动重连。
3.4 配对安全机制
| 安全措施 | 说明 |
|---|---|
| 双向认证 | Node 和 Gateway 互相验证身份 |
| 加密通信 | WebSocket 使用 TLS 加密 |
| Token 机制 | 配对时生成唯一 Token,后续通信携带 |
| 权限白名单 | 可限制 Node 可执行的命令范围 |
| 审批机制 | 敏感操作需用户确认 |
4. 节点管理操作
4.1 查看节点列表
python
# 通过 CLI 查看所有已配对节点
# openclaw node list
# 输出示例:
# NODE ID NAME PLATFORM STATUS LAST SEEN
# node_abc123 my-mac macOS connected 2s ago
# node_def456 my-iphone iOS connected 5s ago
# node_ghi789 my-android Android offline 2h ago
4.2 节点状态监控
python
# 检查特定节点状态
# openclaw node status --node my-mac
# 输出示例:
# Node: my-mac (node_abc123)
# Platform: macOS 14.3
# Status: connected
# Uptime: 2h 35m
# CPU: 45% | Memory: 62% | Disk: 78%
# Active sessions: 2
4.3 解除配对
python
# 解除节点配对
# openclaw node unpair --node my-android
# 确认后,该节点的所有配置和Token将被清除
# 节点需要重新扫码配对才能再次连接
5. 跨设备操作实战
5.1 在节点上执行命令
python
# 在远程 macOS 节点上执行 shell 命令
result = exec(
command="ls -la ~/Documents/",
host="node",
node="my-mac"
)
# 在远程节点上运行 Python 脚本
result = exec(
command="python3 analyze_data.py",
host="node",
node="my-mac",
workdir="/Users/me/projects/data"
)
# 在 Android 节点上执行 adb 命令
result = exec(
command="adb shell dumpsys battery",
host="node",
node="my-android"
)
参数说明:
host="node":指定在节点上执行,而非云端沙箱node="my-mac":目标节点的 ID 或名称workdir:远程工作目录command:要执行的命令,在节点的本地 shell 中运行
5.2 通过节点控制浏览器
python
# 在用户 Mac 上的浏览器中操作(利用已登录状态)
browser(
action="navigate",
url="https://internal.company.com/dashboard",
profile="user", # 使用用户已登录的浏览器
node="my-mac" # 路由到指定节点
)
# 获取页面快照
snapshot = browser(
action="snapshot",
node="my-mac",
targetId="t1" # 指定标签页
)
# 在节点浏览器中执行操作
browser(
action="act",
kind="click",
ref="button_submit",
node="my-mac"
)
为什么通过节点控制浏览器? 🔥
| 场景 | 云端浏览器 | 节点浏览器 |
|---|---|---|
| 已登录网站 | ❌ 需要重新登录 | ✅ 直接使用已有 session |
| 内网访问 | ❌ 无法访问 | ✅ 在内网环境中 |
| Cookie 依赖 | ❌ 需要手动设置 | ✅ 自动携带 |
| 本地服务 | ❌ 无法访问 localhost | ✅ 直接访问 |
5.3 跨设备文件操作
python
# 读取远程节点上的文件
content = exec(
command="cat ~/Documents/report.txt",
host="node",
node="my-mac"
)
# 将处理结果写回节点
exec(
command="echo 'processed' > ~/Documents/result.txt",
host="node",
node="my-mac"
)
# 在节点间同步文件(通过云端中转)
# 1. 从节点A读取
data = exec(command="cat /data/export.json", host="node", node="node-a")
# 2. 写入节点B
exec(command=f"echo '{data}' > /data/import.json", host="node", node="node-b")
6. 实战案例
6.1 案例1:手机节点配对与操作
场景:用户希望 Agent 能读取手机上的照片信息,并在需要时发送通知。
python
# Step 1: 配对 Android 手机
# openclaw node pair --platform android
# → 显示 QR 码,手机 App 扫码
# Step 2: 查看手机电池状态
battery = exec(
command="adb shell dumpsys battery",
host="node",
node="my-android"
)
# Step 3: 获取照片列表
photos = exec(
command="adb shell ls /sdcard/DCIM/Camera/",
host="node",
node="my-android"
)
# Step 4: 拉取照片到云端处理
exec(
command="adb pull /sdcard/DCIM/Camera/IMG_20240101.jpg /tmp/photo.jpg",
host="node",
node="my-android"
)
6.2 案例2:远程控制 Mac 桌面
场景:Agent 帮助用户在 Mac 上打开应用、处理文档。
python
# 打开 macOS 应用
exec(
command="open -a 'Microsoft Word'",
host="node",
node="my-mac"
)
# 获取屏幕截图查看当前状态
screenshot = browser(
action="screenshot",
node="my-mac"
)
# 执行 AppleScript 自动化
exec(
command="""osascript -e '
tell application "Finder"
set theFiles to every file of folder "Documents"
return name of theFiles
end tell'""",
host="node",
node="my-mac"
)
6.3 案例3:多节点协同工作流
场景:在 Mac 上处理数据,在手机上查看结果。
#mermaid-svg-8I3j32hVxfaWmTHY{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8I3j32hVxfaWmTHY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8I3j32hVxfaWmTHY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8I3j32hVxfaWmTHY .error-icon{fill:#552222;}#mermaid-svg-8I3j32hVxfaWmTHY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8I3j32hVxfaWmTHY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8I3j32hVxfaWmTHY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8I3j32hVxfaWmTHY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8I3j32hVxfaWmTHY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8I3j32hVxfaWmTHY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8I3j32hVxfaWmTHY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8I3j32hVxfaWmTHY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8I3j32hVxfaWmTHY .marker.cross{stroke:#333333;}#mermaid-svg-8I3j32hVxfaWmTHY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8I3j32hVxfaWmTHY p{margin:0;}#mermaid-svg-8I3j32hVxfaWmTHY .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8I3j32hVxfaWmTHY .cluster-label text{fill:#333;}#mermaid-svg-8I3j32hVxfaWmTHY .cluster-label span{color:#333;}#mermaid-svg-8I3j32hVxfaWmTHY .cluster-label span p{background-color:transparent;}#mermaid-svg-8I3j32hVxfaWmTHY .label text,#mermaid-svg-8I3j32hVxfaWmTHY span{fill:#333;color:#333;}#mermaid-svg-8I3j32hVxfaWmTHY .node rect,#mermaid-svg-8I3j32hVxfaWmTHY .node circle,#mermaid-svg-8I3j32hVxfaWmTHY .node ellipse,#mermaid-svg-8I3j32hVxfaWmTHY .node polygon,#mermaid-svg-8I3j32hVxfaWmTHY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8I3j32hVxfaWmTHY .rough-node .label text,#mermaid-svg-8I3j32hVxfaWmTHY .node .label text,#mermaid-svg-8I3j32hVxfaWmTHY .image-shape .label,#mermaid-svg-8I3j32hVxfaWmTHY .icon-shape .label{text-anchor:middle;}#mermaid-svg-8I3j32hVxfaWmTHY .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8I3j32hVxfaWmTHY .rough-node .label,#mermaid-svg-8I3j32hVxfaWmTHY .node .label,#mermaid-svg-8I3j32hVxfaWmTHY .image-shape .label,#mermaid-svg-8I3j32hVxfaWmTHY .icon-shape .label{text-align:center;}#mermaid-svg-8I3j32hVxfaWmTHY .node.clickable{cursor:pointer;}#mermaid-svg-8I3j32hVxfaWmTHY .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8I3j32hVxfaWmTHY .arrowheadPath{fill:#333333;}#mermaid-svg-8I3j32hVxfaWmTHY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8I3j32hVxfaWmTHY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8I3j32hVxfaWmTHY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8I3j32hVxfaWmTHY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8I3j32hVxfaWmTHY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8I3j32hVxfaWmTHY .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8I3j32hVxfaWmTHY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8I3j32hVxfaWmTHY .cluster text{fill:#333;}#mermaid-svg-8I3j32hVxfaWmTHY .cluster span{color:#333;}#mermaid-svg-8I3j32hVxfaWmTHY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8I3j32hVxfaWmTHY .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8I3j32hVxfaWmTHY rect.text{fill:none;stroke-width:0;}#mermaid-svg-8I3j32hVxfaWmTHY .icon-shape,#mermaid-svg-8I3j32hVxfaWmTHY .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8I3j32hVxfaWmTHY .icon-shape p,#mermaid-svg-8I3j32hVxfaWmTHY .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8I3j32hVxfaWmTHY .icon-shape .label rect,#mermaid-svg-8I3j32hVxfaWmTHY .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8I3j32hVxfaWmTHY .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8I3j32hVxfaWmTHY .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8I3j32hVxfaWmTHY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 节点
工作流
exec
notify
Agent 接收任务
在 Mac 节点处理数据
生成报告
推送通知到手机
用户手机确认
my-mac: 数据处理
my-iphone: 通知接收
python
# 多节点协同工作流
# 1. 在 Mac 上处理数据
result = exec(
command="python3 process_data.py --input sales.csv --output report.pdf",
host="node",
node="my-mac",
workdir="/Users/me/projects"
)
# 2. 生成摘要
summary = exec(
command="python3 summarize.py --input report.pdf",
host="node",
node="my-mac"
)
# 3. 通过手机节点发送通知
exec(
command="am broadcast -a com.openclaw.NOTIFY --es message '报告已生成'",
host="node",
node="my-android"
)
7. 安全与最佳实践
7.1 安全注意事项
| ⚠️ 风险 | 防护措施 |
|---|---|
| 未授权访问 | 启用配对审批,拒绝未知设备 |
| 命令注入 | 使用命令白名单,禁止危险命令 |
| 数据泄露 | 敏感数据加密传输,不记录明文 |
| 设备失控 | 设置操作频率限制,超时自动断开 |
7.2 最佳实践
- 最小权限原则 🔒:只授予 Node 必要的权限,避免全量访问
- 命令白名单 ✅:配置
security: allowlist,只允许预定义的命令 - 定期审计 📋:定期检查节点活动日志,发现异常及时处理
- 网络隔离 🌐:生产环境使用 VPN 或专用网络,避免公网暴露
- 优雅降级 ⚡:节点离线时提供替代方案,不要让工作流中断
7.3 节点配置示例
yaml
# openclaw 配置中的节点安全设置
nodes:
security:
# 命令执行安全模式
execSecurity: allowlist
# 允许的命令列表
allowedCommands:
- ls
- cat
- python3
- git
- npm
# 禁止的命令模式
deniedPatterns:
- "rm -rf /"
- "sudo *"
- "curl * | bash"
# 操作审批
requireApproval:
- "sudo *"
- "install-*"
8. 总结
8.1 Nodes 核心价值
OpenClaw Nodes 打破了 AI Agent 的云端边界,让 Agent 的能力延伸到用户的每一台设备:
- 📱 全设备覆盖:Android、iOS、macOS、Linux,一个 Agent 管控所有设备
- 🔐 安全可控:双向认证、加密通信、权限白名单,安全不妥协
- ⚡ 实时响应:WebSocket 长连接,指令毫秒级下发
- 🔄 自动重连:网络中断自动恢复,无需人工干预
8.2 思考题
- 如何在保证安全的前提下,让 Agent 自主决定在哪个节点上执行任务?
- 当多个节点同时在线时,如何设计智能路由策略选择最优节点?
- 节点离线时,如何设计优雅降级方案确保核心功能不受影响?
8.3 参考链接
- 📖 OpenClaw 官方文档:https://docs.openclaw.ai
- 💻 GitHub 源码:https://github.com/openclaw/openclaw