node คืออุปกรณ์คู่หู (macOS/iOS/Android/headless) ที่เชื่อมต่อกับ WebSocket ของ Gateway (พอร์ตเดียวกับ operators) ด้วยDocumentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
role: "node" และเปิดเผยพื้นผิวคำสั่ง (เช่น canvas.*, camera.*, device.*, notifications.*, system.*) ผ่าน node.invoke รายละเอียดโปรโตคอล: โปรโตคอล Gateway.
ทรานสปอร์ตเดิม: โปรโตคอล Bridge (TCP JSONL;
มีไว้เพื่อประวัติเท่านั้นสำหรับ nodes ปัจจุบัน).
macOS ยังสามารถทำงานใน โหมด node ได้ด้วย: แอปแถบเมนูเชื่อมต่อกับเซิร์ฟเวอร์ WS ของ Gateway และเปิดเผยคำสั่ง canvas/camera ภายในเครื่องของตัวเองเป็น node (ดังนั้น
openclaw nodes … จึงใช้งานกับ Mac เครื่องนี้ได้) ในโหมด remote gateway ระบบอัตโนมัติของเบราว์เซอร์จะถูกจัดการโดยโฮสต์ node ของ CLI (openclaw node run หรือบริการ node ที่ติดตั้งไว้) ไม่ใช่โดย node ของแอป native
หมายเหตุ:
- Nodes เป็น อุปกรณ์ต่อพ่วง ไม่ใช่ gateways และไม่ได้รันบริการ gateway
- ข้อความ Telegram/WhatsApp/อื่นๆ จะไปถึง gateway ไม่ใช่ nodes
- คู่มือแก้ปัญหา: /nodes/troubleshooting
การจับคู่ + สถานะ
WS nodes ใช้การจับคู่อุปกรณ์ Nodes จะแสดงข้อมูลประจำตัวของอุปกรณ์ระหว่างconnect; Gateway จะสร้างคำขอจับคู่อุปกรณ์สำหรับ role: node อนุมัติผ่าน CLI อุปกรณ์ (หรือ UI)
CLI แบบเร็ว:
requestId ใหม่ เรียกใช้
openclaw devices list อีกครั้งก่อนอนุมัติ
หมายเหตุ:
nodes statusทำเครื่องหมาย node เป็น จับคู่แล้ว เมื่อ role การจับคู่อุปกรณ์มีnode- ระเบียนการจับคู่อุปกรณ์คือสัญญา role ที่อนุมัติแล้วแบบคงทน การหมุนเวียน token จะอยู่ภายในสัญญานั้น; มันไม่สามารถยกระดับ node ที่จับคู่แล้วเป็น role อื่นที่การอนุมัติการจับคู่ไม่เคยให้ไว้
node.pair.*(CLI:openclaw nodes pending/approve/reject/remove/rename) เป็นที่เก็บการจับคู่ node แยกต่างหากที่ gateway เป็นเจ้าของ; มัน ไม่ได้ กั้น handshakeconnectของ WSopenclaw nodes remove --node <id|name|ip>ลบรายการเก่าออกจากที่เก็บการจับคู่ node แยกต่างหากที่ gateway เป็นเจ้าของนั้น- ขอบเขตการอนุมัติจะตามคำสั่งที่คำขอค้างอยู่ประกาศไว้:
- คำขอที่ไม่มีคำสั่ง:
operator.pairing - คำสั่ง node ที่ไม่ใช่ exec:
operator.pairing+operator.write system.run/system.run.prepare/system.which:operator.pairing+operator.admin
- คำขอที่ไม่มีคำสั่ง:
โฮสต์ node ระยะไกล (system.run)
ใช้ โฮสต์ node เมื่อ Gateway ของคุณรันบนเครื่องหนึ่ง และคุณต้องการให้คำสั่งทำงานบนอีกเครื่องหนึ่ง โมเดลยังคุยกับ gateway; gateway จะส่งต่อการเรียกexec ไปยัง โฮสต์ node เมื่อเลือก host=node
อะไรทำงานที่ไหน
- โฮสต์ Gateway: รับข้อความ รันโมเดล จัดเส้นทางการเรียกเครื่องมือ
- โฮสต์ Node: ดำเนินการ
system.run/system.whichบนเครื่อง node - การอนุมัติ: บังคับใช้บนโฮสต์ node ผ่าน
~/.openclaw/exec-approvals.json
- การรัน node ที่อิงการอนุมัติจะผูกกับบริบทคำขอแบบตรงกันทุกประการ
- สำหรับการเรียกใช้ไฟล์ shell/runtime โดยตรง OpenClaw ยังพยายามผูก operand ไฟล์ภายในเครื่องที่เป็นรูปธรรมหนึ่งรายการ และปฏิเสธการรันหากไฟล์นั้นเปลี่ยนก่อนการดำเนินการ
- หาก OpenClaw ไม่สามารถระบุไฟล์ภายในเครื่องที่เป็นรูปธรรมได้พอดีหนึ่งไฟล์สำหรับคำสั่ง interpreter/runtime การดำเนินการที่อิงการอนุมัติจะถูกปฏิเสธ แทนที่จะเสแสร้งว่าครอบคลุม runtime ทั้งหมด ให้ใช้ sandboxing, โฮสต์แยกต่างหาก หรือ allowlist/เวิร์กโฟลว์เต็มรูปแบบที่เชื่อถืออย่างชัดเจนสำหรับความหมายของ interpreter ที่กว้างขึ้น
เริ่มโฮสต์ node (foreground)
บนเครื่อง node:Remote gateway ผ่าน SSH tunnel (ผูกกับ loopback)
หาก Gateway ผูกกับ loopback (gateway.bind=loopback, ค่าเริ่มต้นในโหมด local) โฮสต์ node ระยะไกลจะเชื่อมต่อโดยตรงไม่ได้ สร้าง SSH tunnel และชี้โฮสต์ node ไปยังปลายทางภายในเครื่องของ tunnel
ตัวอย่าง (โฮสต์ node -> โฮสต์ gateway):
openclaw node runรองรับ token หรือ password auth- แนะนำให้ใช้ env vars:
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD - fallback ของ config คือ
gateway.auth.token/gateway.auth.password - ในโหมด local โฮสต์ node จะตั้งใจไม่สนใจ
gateway.remote.token/gateway.remote.password - ในโหมด remote
gateway.remote.token/gateway.remote.passwordจะมีสิทธิ์ใช้ตามกฎลำดับความสำคัญของ remote - หาก SecretRefs ของ
gateway.auth.*ฝั่ง local ที่ใช้งานอยู่ถูกกำหนดค่าไว้แต่ resolve ไม่ได้ auth ของโฮสต์ node จะ fail closed - การ resolve auth ของโฮสต์ node จะยอมรับเฉพาะ env vars
OPENCLAW_GATEWAY_*
เริ่มโฮสต์ node (บริการ)
จับคู่ + ตั้งชื่อ
บนโฮสต์ gateway:openclaw devices list อีกครั้ง
และอนุมัติ requestId ปัจจุบัน
ตัวเลือกการตั้งชื่อ:
--display-nameบนopenclaw node run/openclaw node install(คงอยู่ใน~/.openclaw/node.jsonบน node)openclaw nodes rename --node <id|name|ip> --name "Build Node"(การ override ของ gateway)
ใส่คำสั่งใน allowlist
การอนุมัติ Exec เป็นแบบ ต่อโฮสต์ node เพิ่มรายการ allowlist จาก gateway:~/.openclaw/exec-approvals.json
ชี้ exec ไปที่ node
กำหนดค่าเริ่มต้น (config ของ gateway):exec ใดๆ ที่มี host=node จะรันบนโฮสต์ node (ภายใต้ allowlist/การอนุมัติของ node)
host=auto จะไม่เลือก node เองโดยนัย แต่คำขอ host=node แบบชัดเจนต่อการเรียกจะได้รับอนุญาตจาก auto หากคุณต้องการให้ node exec เป็นค่าเริ่มต้นสำหรับ session ให้ตั้งค่า tools.exec.host=node หรือ /exec host=node ... อย่างชัดเจน
ที่เกี่ยวข้อง:
การเรียกใช้คำสั่ง
ระดับต่ำ (RPC ดิบ):นโยบายคำสั่ง
คำสั่ง node ต้องผ่านสองด่านก่อนจึงจะเรียกใช้ได้:- node ต้องประกาศคำสั่งในรายการ
connect.commandsของ WebSocket - นโยบายแพลตฟอร์มของ gateway ต้องอนุญาตคำสั่งที่ประกาศไว้
canvas.*, camera.list, location.get, และ screen.snapshot ตามค่าเริ่มต้น
nodes ที่เชื่อถือได้ซึ่งโฆษณา capability talk หรือประกาศคำสั่ง talk.*
ยังอนุญาตคำสั่ง push-to-talk ที่ประกาศไว้ (talk.ptt.start, talk.ptt.stop,
talk.ptt.cancel, talk.ptt.once) ตามค่าเริ่มต้น โดยไม่ขึ้นกับ label ของแพลตฟอร์ม
คำสั่งที่อันตรายหรือเกี่ยวข้องกับความเป็นส่วนตัวสูง เช่น camera.snap, camera.clip, และ
screen.record ยังคงต้อง opt-in อย่างชัดเจนด้วย
gateway.nodes.allowCommands gateway.nodes.denyCommands จะชนะเสมอเหนือ
ค่าเริ่มต้นและรายการ allowlist เพิ่มเติม
คำสั่ง node ที่ Plugin เป็นเจ้าของสามารถเพิ่มนโยบาย node-invoke ของ Gateway ได้ นโยบายดังกล่าวจะรันหลังการตรวจ allowlist และก่อนส่งต่อไปยัง node ดังนั้น
node.invoke, helper ของ CLI และเครื่องมือ agent เฉพาะจึงใช้ขอบเขตสิทธิ์ของ Plugin เดียวกัน คำสั่ง node ของ Plugin ที่อันตรายยังคงต้อง opt-in อย่างชัดเจนด้วย
gateway.nodes.allowCommands
หลังจาก node เปลี่ยนรายการคำสั่งที่ประกาศ ให้ปฏิเสธการจับคู่อุปกรณ์เก่า
และอนุมัติคำขอใหม่เพื่อให้ gateway เก็บ snapshot คำสั่งที่อัปเดตแล้ว
ภาพหน้าจอ (snapshot ของ canvas)
หาก node กำลังแสดง Canvas (WebView),canvas.snapshot จะคืนค่า { format, base64 }
CLI helper (เขียนไปยังไฟล์ temp และพิมพ์ MEDIA:<path>):
การควบคุม Canvas
canvas presentรับ URLs หรือเส้นทางไฟล์ภายในเครื่อง (--target) พร้อม--x/--y/--width/--heightแบบไม่บังคับสำหรับการจัดตำแหน่งcanvas evalรับ JS แบบ inline (--js) หรือ positional arg
A2UI (Canvas)
- รองรับเฉพาะ A2UI v0.8 JSONL (v0.9/createSurface จะถูกปฏิเสธ)
รูปภาพ + วิดีโอ (กล้อง node)
รูปภาพ (jpg):
mp4):
- node ต้องอยู่ใน foreground สำหรับ
canvas.*และcamera.*(การเรียกจาก background จะคืนค่าNODE_BACKGROUND_UNAVAILABLE) - ระยะเวลาคลิปถูกจำกัด (ปัจจุบัน
<= 60s) เพื่อหลีกเลี่ยง payload base64 ที่ใหญ่เกินไป - Android จะขอสิทธิ์
CAMERA/RECORD_AUDIOเมื่อทำได้; สิทธิ์ที่ถูกปฏิเสธจะล้มเหลวด้วย*_PERMISSION_REQUIRED
การบันทึกหน้าจอ (nodes)
nodes ที่รองรับจะเปิดเผยscreen.record (mp4) ตัวอย่าง:
- ความพร้อมใช้งานของ
screen.recordขึ้นอยู่กับแพลตฟอร์มของ node - การบันทึกหน้าจอถูกจำกัดไว้ที่
<= 60s --no-audioปิดการจับเสียงไมโครโฟนบนแพลตฟอร์มที่รองรับ- ใช้
--screen <index>เพื่อเลือกจอแสดงผลเมื่อมีหลายหน้าจอ
ตำแหน่งที่ตั้ง (nodes)
Nodes เปิดเผยlocation.get เมื่อเปิดใช้ Location ในการตั้งค่า
CLI helper:
- Location ปิดตามค่าเริ่มต้น
- “Always” ต้องใช้สิทธิ์ของระบบ; การดึงข้อมูลใน background เป็นแบบ best-effort
- คำตอบมี lat/lon, accuracy (เมตร), และ timestamp
SMS (nodes Android)
nodes Android สามารถเปิดเผยsms.send เมื่อผู้ใช้ให้สิทธิ์ SMS และอุปกรณ์รองรับโทรศัพท์
การ invoke ระดับต่ำ:
- ต้องยอมรับ prompt สิทธิ์บนอุปกรณ์ Android ก่อน capability จะถูกโฆษณา
- อุปกรณ์แบบ Wi-Fi เท่านั้นที่ไม่มีโทรศัพท์จะไม่โฆษณา
sms.send
คำสั่งอุปกรณ์ Android + ข้อมูลส่วนบุคคล
nodes Android สามารถโฆษณากลุ่มคำสั่งเพิ่มเติมเมื่อเปิดใช้ capabilities ที่สอดคล้องกัน กลุ่มที่มีให้:device.status,device.info,device.permissions,device.healthnotifications.list,notifications.actionsphotos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
- คำสั่ง Motion ถูกควบคุมด้วยความสามารถตามเซ็นเซอร์ที่มีอยู่
คำสั่งระบบ (โฮสต์ Node / Node ของ Mac)
Node ของ macOS เปิดเผยsystem.run, system.notify และ system.execApprovals.get/set
โฮสต์ Node แบบไม่มี UI เปิดเผย system.run, system.which และ system.execApprovals.get/set
ตัวอย่าง:
system.runส่งคืน stdout/stderr/exit code ในเพย์โหลด- ตอนนี้การเรียกใช้ Shell จะผ่านเครื่องมือ
execพร้อมhost=node;nodesยังคงเป็นพื้นผิว direct-RPC สำหรับคำสั่ง Node แบบชัดเจน nodes invokeไม่เปิดเผยsystem.runหรือsystem.run.prepare; ทั้งสองยังคงอยู่บนเส้นทาง exec เท่านั้น- เส้นทาง exec จะเตรียม
systemRunPlanแบบมาตรฐานก่อนการอนุมัติ เมื่อ ได้รับการอนุมัติแล้ว gateway จะส่งต่อแผนที่จัดเก็บไว้นั้น ไม่ใช่ฟิลด์ command/cwd/session ที่ผู้เรียกแก้ไขในภายหลัง system.notifyเคารพสถานะสิทธิ์การแจ้งเตือนในแอป macOS- เมทาดาทา
platform/deviceFamilyของ Node ที่ไม่รู้จักจะใช้ allowlist ค่าเริ่มต้นแบบระมัดระวัง ซึ่งไม่รวมsystem.runและsystem.whichหากคุณตั้งใจต้องใช้คำสั่งเหล่านั้นสำหรับแพลตฟอร์มที่ไม่รู้จัก ให้เพิ่มอย่างชัดเจนผ่านgateway.nodes.allowCommands system.runรองรับ--cwd,--env KEY=VAL,--command-timeoutและ--needs-screen-recording- สำหรับตัวห่อ Shell (
bash|sh|zsh ... -c/-lc) ค่า--envที่จำกัดตามคำขอจะถูกลดเหลือ allowlist แบบชัดเจน (TERM,LANG,LC_*,COLORTERM,NO_COLOR,FORCE_COLOR) - สำหรับการตัดสินใจ allow-always ในโหมด allowlist ตัวห่อการ dispatch ที่รู้จัก (
env,nice,nohup,stdbuf,timeout) จะบันทึกพาธของ executable ภายในแทนพาธของตัวห่อ หากการแกะตัวห่อไม่ปลอดภัย จะไม่มีการบันทึกรายการ allowlist โดยอัตโนมัติ - บนโฮสต์ Node ของ Windows ในโหมด allowlist การรันตัวห่อ Shell ผ่าน
cmd.exe /cต้องได้รับการอนุมัติ (รายการ allowlist เพียงอย่างเดียวจะไม่อนุญาตรูปแบบตัวห่อโดยอัตโนมัติ) system.notifyรองรับ--priority <passive|active|timeSensitive>และ--delivery <system|overlay|auto>- โฮสต์ Node จะเพิกเฉยต่อการ override
PATHและตัดคีย์เริ่มต้น/Shell ที่เป็นอันตรายออก (DYLD_*,LD_*,NODE_OPTIONS,PYTHON*,PERL*,RUBYOPT,SHELLOPTS,PS4) หากคุณต้องการรายการ PATH เพิ่มเติม ให้กำหนดค่าสภาพแวดล้อมของบริการโฮสต์ Node (หรือติดตั้งเครื่องมือในตำแหน่งมาตรฐาน) แทนการส่งPATHผ่าน--env - ในโหมด Node ของ macOS
system.runถูกควบคุมด้วยการอนุมัติ exec ในแอป macOS (Settings → Exec approvals) Ask/allowlist/full ทำงานเหมือนกับโฮสต์ Node แบบไม่มี UI; พรอมป์ที่ถูกปฏิเสธจะส่งคืนSYSTEM_RUN_DENIED - บนโฮสต์ Node แบบไม่มี UI
system.runถูกควบคุมด้วยการอนุมัติ exec (~/.openclaw/exec-approvals.json)
การผูก Node สำหรับ Exec
เมื่อมี Node หลายตัว คุณสามารถผูก exec กับ Node ที่ระบุได้ การตั้งค่านี้กำหนด Node เริ่มต้นสำหรับexec host=node (และสามารถ override แยกตาม agent ได้)
ค่าเริ่มต้นส่วนกลาง:
แผนที่สิทธิ์
Node อาจมีแผนที่permissions ใน node.list / node.describe โดยใช้ชื่อสิทธิ์เป็นคีย์ (เช่น screenRecording, accessibility) พร้อมค่าบูลีน (true = ได้รับอนุญาต)
โฮสต์ Node แบบไม่มี UI (ข้ามแพลตฟอร์ม)
OpenClaw สามารถรัน โฮสต์ Node แบบไม่มี UI (ไม่มี UI) ที่เชื่อมต่อกับ Gateway WebSocket และเปิดเผยsystem.run / system.which สิ่งนี้มีประโยชน์บน Linux/Windows
หรือสำหรับการรัน Node ขนาดเล็กคู่กับเซิร์ฟเวอร์
เริ่มต้น:
- ยังจำเป็นต้องจับคู่ (Gateway จะแสดงพรอมป์การจับคู่อุปกรณ์)
- โฮสต์ Node จะจัดเก็บ id ของ Node, token, ชื่อที่แสดง และข้อมูลการเชื่อมต่อ Gateway ใน
~/.openclaw/node.json - การอนุมัติ exec จะถูกบังคับใช้ภายในเครื่องผ่าน
~/.openclaw/exec-approvals.json(ดู การอนุมัติ Exec) - บน macOS โฮสต์ Node แบบไม่มี UI จะเรียกใช้
system.runภายในเครื่องเป็นค่าเริ่มต้น ตั้งค่าOPENCLAW_NODE_EXEC_HOST=appเพื่อกำหนดเส้นทางsystem.runผ่านโฮสต์ exec ของแอปคู่ companion; เพิ่มOPENCLAW_NODE_EXEC_FALLBACK=0เพื่อบังคับให้ใช้โฮสต์แอปและล้มเหลวแบบปิดหากไม่พร้อมใช้งาน - เพิ่ม
--tls/--tls-fingerprintเมื่อ Gateway WS ใช้ TLS
โหมด Node ของ Mac
- แอป menubar ของ macOS เชื่อมต่อกับเซิร์ฟเวอร์ Gateway WS ในฐานะ Node (ดังนั้น
openclaw nodes …จึงทำงานกับ Mac เครื่องนี้ได้) - ในโหมด remote แอปจะเปิดอุโมงค์ SSH สำหรับพอร์ต Gateway และเชื่อมต่อกับ
localhost