Nodes
Node là thiết bị đi kèm (macOS/iOS/Android/headless) kết nối với Gateway qua WebSocket (cùng port với operators) với role: "node" và cung cấp các lệnh (ví dụ canvas.*, camera.*, system.*) thông qua node.invoke. Chi tiết giao thức: Gateway protocol.
Legacy transport: Bridge protocol (TCP JSONL; đã deprecated/loại bỏ cho các node hiện tại).
macOS cũng có thể chạy ở node mode: ứng dụng menubar kết nối với WS server của Gateway và cung cấp các lệnh canvas/camera local như một node (để openclaw nodes … hoạt động với Mac này).
Lưu ý:
- Nodes là thiết bị ngoại vi, không phải gateways. Chúng không chạy gateway service.
- Tin nhắn từ Telegram/WhatsApp/v.v. đến gateway, không phải nodes.
Pairing + trạng thái
WS nodes dùng device pairing. Nodes trình diện device identity trong quá trình connect; Gateway tạo device pairing request với role: node. Phê duyệt qua devices CLI (hoặc UI).
Các lệnh CLI nhanh:
openclaw devices list
openclaw devices approve <requestId>
openclaw devices reject <requestId>
openclaw nodes status
openclaw nodes describe --node <idOrNameOrIp>
Lưu ý:
nodes statusđánh dấu node là paired khi device pairing role của nó bao gồmnode.node.pair.*(CLI:openclaw nodes pending/approve/reject) là một gateway-owned node pairing store riêng biệt; nó không kiểm soát WSconnecthandshake.
Remote node host (system.run)
Dùng node host khi Gateway của các bạn chạy trên một máy và các bạn muốn lệnh thực thi trên máy khác. Model vẫn giao tiếp với gateway; gateway chuyển tiếp các lệnh exec đến node host khi chọn host=node.
Cái gì chạy ở đâu
- Gateway host: nhận tin nhắn, chạy model, định tuyến tool calls.
- Node host: thực thi
system.run/system.whichtrên máy node. - Approvals: được thực thi trên node host qua
~/.openclaw/exec-approvals.json.
Khởi động node host (foreground)
Trên máy node:
openclaw node run --host <gateway-host> --port 18789 --display-name "Build Node"
Remote gateway qua SSH tunnel (loopback bind)
Nếu Gateway bind với loopback (gateway.bind=loopback, mặc định ở local mode), các remote node hosts không thể kết nối trực tiếp. Tạo SSH tunnel và trỏ node host đến local end của tunnel.
Ví dụ (node host -> gateway host):
# Terminal A (giữ chạy): forward local 18790 -> gateway 127.0.0.1:18789
ssh -N -L 18790:127.0.0.1:18789 user@gateway-host
# Terminal B: export gateway token và kết nối qua tunnel
export OPENCLAW_GATEWAY_TOKEN="<gateway-token>"
openclaw node run --host 127.0.0.1 --port 18790 --display-name "Build Node"
Lưu ý:
- Token là
gateway.auth.tokentừ gateway config (~/.openclaw/openclaw.jsontrên gateway host). openclaw node runđọcOPENCLAW_GATEWAY_TOKENđể xác thực.
Khởi động node host (service)
openclaw node install --host <gateway-host> --port 18789 --display-name "Build Node"
openclaw node restart
Pair + đặt tên
Trên gateway host:
openclaw nodes pending
openclaw nodes approve <requestId>
openclaw nodes list
Các tùy chọn đặt tên:
--display-nametrênopenclaw node run/openclaw node install(lưu trong~/.openclaw/node.jsontrên node).openclaw nodes rename --node <id|name|ip> --name "Build Node"(gateway override).
Allowlist các lệnh
Exec approvals là per node host. Thêm allowlist entries từ gateway:
openclaw approvals allowlist add --node <id|name|ip> "/usr/bin/uname"
openclaw approvals allowlist add --node <id|name|ip> "/usr/bin/sw_vers"
Approvals nằm trên node host tại ~/.openclaw/exec-approvals.json.
Trỏ exec đến node
Cấu hình mặc định (gateway config):
openclaw config set tools.exec.host node
openclaw config set tools.exec.security allowlist
openclaw config set tools.exec.node "<id-or-name>"
Hoặc per session:
/exec host=node security=allowlist node=<id-or-name>
Sau khi đặt, bất kỳ lệnh exec nào với host=node sẽ chạy trên node host (tuân theo node allowlist/approvals).
Liên quan:
Gọi lệnh
Low-level (raw RPC):
openclaw nodes invoke --node <idOrNameOrIp> --command canvas.eval --params '{"javaScript":"location.href"}'
Các helpers cấp cao hơn tồn tại cho các workflow “cung cấp MEDIA attachment cho agent” phổ biến.
Screenshots (canvas snapshots)
Nếu node đang hiển thị Canvas (WebView), canvas.snapshot trả về { format, base64 }.
CLI helper (ghi vào temp file và in MEDIA:<path>):
openclaw nodes canvas snapshot --node <idOrNameOrIp> --format png
openclaw nodes canvas snapshot --node <idOrNameOrIp> --format jpg --max-width 1200 --quality 0.9
Canvas controls
openclaw nodes canvas present --node <idOrNameOrIp> --target https://example.com
openclaw nodes canvas hide --node <idOrNameOrIp>
openclaw nodes canvas navigate https://example.com --node <idOrNameOrIp>
openclaw nodes canvas eval --node <idOrNameOrIp> --js "document.title"
Lưu ý:
canvas presentchấp nhận URLs hoặc local file paths (--target), cộng với--x/--y/--width/--heighttùy chọn để định vị.canvas evalchấp nhận inline JS (--js) hoặc positional arg.
A2UI (Canvas)
openclaw nodes canvas a2ui push --node <idOrNameOrIp> --text "Hello"
openclaw nodes canvas a2ui push --node <idOrNameOrIp> --jsonl ./payload.jsonl
openclaw nodes canvas a2ui reset --node <idOrNameOrIp>
Lưu ý:
- Chỉ hỗ trợ A2UI v0.8 JSONL (v0.9/createSurface bị từ chối).
Photos + videos (node camera)
Photos (jpg):
openclaw nodes camera list --node <idOrNameOrIp>
openclaw nodes camera snap --node <idOrNameOrIp> # mặc định: cả hai facings (2 dòng MEDIA)
openclaw nodes camera snap --node <idOrNameOrIp> --facing front
Video clips (mp4):
openclaw nodes camera clip --node <idOrNameOrIp> --duration 10s
openclaw nodes camera clip --node <idOrNameOrIp> --duration 3000 --no-audio
Lưu ý:
- Node phải được foregrounded cho
canvas.*vàcamera.*(các lệnh gọi background trả vềNODE_BACKGROUND_UNAVAILABLE). - Clip duration bị giới hạn (hiện tại
<= 60s) để tránh base64 payloads quá lớn. - Android sẽ nhắc cấp quyền
CAMERA/RECORD_AUDIOkhi có thể; quyền bị từ chối sẽ fail với*_PERMISSION_REQUIRED.
Screen recordings (nodes)
Nodes cung cấp screen.record (mp4). Ví dụ:
openclaw nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10
openclaw nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10 --no-audio
Lưu ý:
screen.recordyêu cầu node app được foregrounded.- Android sẽ hiển thị system screen-capture prompt trước khi ghi.
- Screen recordings bị giới hạn ở
<= 60s. --no-audiotắt microphone capture (hỗ trợ trên iOS/Android; macOS dùng system capture audio).- Dùng
--screen <index>để chọn màn hình khi có nhiều screens.
Location (nodes)
Nodes cung cấp location.get khi Location được bật trong settings.
CLI helper:
openclaw nodes location get --node <idOrNameOrIp>
openclaw nodes location get --node <idOrNameOrIp> --accuracy precise --max-age 15000 --location-timeout 10000
Lưu ý:
- Location tắt mặc định.
- “Always” yêu cầu system permission; background fetch là best-effort.
- Response bao gồm lat/lon, accuracy (meters), và timestamp.
SMS (Android nodes)
Android nodes có thể cung cấp sms.send khi người dùng cấp quyền SMS và thiết bị hỗ trợ telephony.
Low-level invoke:
openclaw nodes invoke --node <idOrNameOrIp> --command sms.send --params '{"to":"+15555550123","message":"Hello from OpenClaw"}'
Lưu ý:
- Permission prompt phải được chấp nhận trên thiết bị Android trước khi capability được quảng cáo.
- Thiết bị chỉ Wi-Fi không có telephony sẽ không quảng cáo
sms.send.
System commands (node host / mac node)
macOS node cung cấp system.run, system.notify, và system.execApprovals.get/set.
Headless node host cung cấp system.run, system.which, và system.execApprovals.get/set.
Ví dụ:
openclaw nodes run --node <idOrNameOrIp> -- echo "Hello from mac node"
openclaw nodes notify --node <idOrNameOrIp> --title "Ping" --body "Gateway ready"
Lưu ý:
system.runtrả về stdout/stderr/exit code trong payload.system.notifytuân theo notification permission state trên macOS app.system.runhỗ trợ--cwd,--env KEY=VAL,--command-timeout, và--needs-screen-recording.system.notifyhỗ trợ--priority <passive|active|timeSensitive>và--delivery <system|overlay|auto>.- macOS nodes bỏ qua
PATHoverrides; headless node hosts chỉ chấp nhậnPATHkhi nó prepend node host PATH. - Trên macOS node mode,
system.runđược kiểm soát bởi exec approvals trong macOS app (Settings → Exec approvals). Ask/allowlist/full hoạt động giống như headless node host; denied prompts trả vềSYSTEM_RUN_DENIED. - Trên headless node host,
system.runđược kiểm soát bởi exec approvals (~/.openclaw/exec-approvals.json).
Exec node binding
Khi có nhiều nodes, các bạn có thể bind exec với một node cụ thể.
Điều này đặt node mặc định cho exec host=node (và có thể override per agent).
Global default:
openclaw config set tools.exec.node "node-id-or-name"
Per-agent override:
openclaw config get agents.list
openclaw config set agents.list[0].tools.exec.node "node-id-or-name"
Unset để cho phép bất kỳ node nào:
openclaw config unset tools.exec.node
openclaw config unset agents.list[0].tools.exec.node
Permissions map
Nodes có thể bao gồm permissions map trong node.list / node.describe, được key bởi permission name (ví dụ screenRecording, accessibility) với giá trị boolean (true = granted).
Headless node host (cross-platform)
OpenClaw có thể chạy headless node host (không UI) kết nối với Gateway WebSocket và cung cấp system.run / system.which. Điều này hữu ích trên Linux/Windows hoặc để chạy minimal node cùng với server.
Khởi động:
openclaw node run --host <gateway-host> --port 18789
Lưu ý:
- Pairing vẫn được yêu cầu (Gateway sẽ hiển thị node approval prompt).
- Node host lưu node id, token, display name, và gateway connection info trong
~/.openclaw/node.json. - Exec approvals được thực thi locally qua
~/.openclaw/exec-approvals.json(xem Exec approvals). - Trên macOS, headless node host ưu tiên companion app exec host khi có thể kết nối và fallback sang local execution nếu app không khả dụng. Đặt
OPENCLAW_NODE_EXEC_HOST=appđể yêu cầu app, hoặcOPENCLAW_NODE_EXEC_FALLBACK=0để tắt fallback. - Thêm
--tls/--tls-fingerprintkhi Gateway WS dùng TLS.
Mac node mode
- macOS menubar app kết nối với Gateway WS server như một node (để
openclaw nodes …hoạt động với Mac này). - Ở remote mode, app mở SSH tunnel cho Gateway port và kết nối với
localhost.