Fundamentals
สถาปัตยกรรม Gateway
ภาพรวม
- Gateway แบบอายุยาวหนึ่งตัวเป็นเจ้าของพื้นผิวการรับส่งข้อความทั้งหมด (WhatsApp ผ่าน Baileys, Telegram ผ่าน grammY, Slack, Discord, Signal, iMessage, WebChat)
- ไคลเอนต์ control-plane (แอป macOS, CLI, UI เว็บ, ระบบอัตโนมัติ) เชื่อมต่อกับ
Gateway ผ่าน WebSocket บน bind host ที่กำหนดค่าไว้ (ค่าเริ่มต้น
127.0.0.1:18789) - Node (macOS/iOS/Android/headless) เชื่อมต่อผ่าน WebSocket เช่นกัน แต่
ประกาศ
role: nodeพร้อม caps/commands ที่ระบุชัดเจน - หนึ่ง Gateway ต่อหนึ่งโฮสต์; เป็นที่เดียวที่เปิดเซสชัน WhatsApp
- โฮสต์ canvas ให้บริการโดยเซิร์ฟเวอร์ HTTP ของ Gateway ภายใต้:
/__openclaw__/canvas/(HTML/CSS/JS ที่เอเจนต์แก้ไขได้)/__openclaw__/a2ui/(โฮสต์ A2UI) ใช้พอร์ตเดียวกับ Gateway (ค่าเริ่มต้น18789)
คอมโพเนนต์และโฟลว์
Gateway (เดมอน)
- ดูแลการเชื่อมต่อของผู้ให้บริการ
- เปิดเผย WS API แบบมีชนิด (คำขอ, คำตอบ, เหตุการณ์ server-push)
- ตรวจสอบเฟรมขาเข้ากับ JSON Schema
- ปล่อยเหตุการณ์ เช่น
agent,chat,presence,health,heartbeat,cron
ไคลเอนต์ (แอป Mac / CLI / ผู้ดูแลเว็บ)
- หนึ่งการเชื่อมต่อ WS ต่อหนึ่งไคลเอนต์
- ส่งคำขอ (
health,status,send,agent,system-presence) - สมัครรับเหตุการณ์ (
tick,agent,presence,shutdown)
Node (macOS / iOS / Android / headless)
- เชื่อมต่อกับ เซิร์ฟเวอร์ WS เดียวกัน ด้วย
role: node - ระบุตัวตนอุปกรณ์ใน
connect; การจับคู่เป็นแบบ อิงอุปกรณ์ (rolenode) และ การอนุมัติอยู่ในที่เก็บการจับคู่อุปกรณ์ - เปิดเผยคำสั่ง เช่น
canvas.*,camera.*,screen.record,location.get
รายละเอียดโปรโตคอล:
WebChat
- UI แบบสแตติกที่ใช้ Gateway WS API สำหรับประวัติแชตและการส่งข้อความ
- ในการตั้งค่าระยะไกล จะเชื่อมต่อผ่านทันเนล SSH/Tailscale เดียวกับไคลเอนต์อื่น
วงจรชีวิตการเชื่อมต่อ (ไคลเอนต์เดียว)
sequenceDiagram
participant Client
participant Gateway
Client->>Gateway: req:connect
Gateway-->>Client: res (ok)
Note right of Gateway: or res error + close
Note left of Client: payload=hello-ok
snapshot: presence + health
Gateway-->>Client: event:presence
Gateway-->>Client: event:tick
Client->>Gateway: req:agent
Gateway-->>Client: res:agent
ack {runId, status:"accepted"}
Gateway-->>Client: event:agent
(streaming)
Gateway-->>Client: res:agent
final {runId, status, summary}
โปรโตคอลบนสาย (สรุป)
- การขนส่ง: WebSocket, เฟรมข้อความพร้อมเพย์โหลด JSON
- เฟรมแรก ต้อง เป็น
connect - หลัง handshake:
- คำขอ:
{type:"req", id, method, params}→{type:"res", id, ok, payload|error} - เหตุการณ์:
{type:"event", event, payload, seq?, stateVersion?}
- คำขอ:
hello-ok.features.methods/eventsเป็นเมทาดาทาสำหรับการค้นพบ ไม่ใช่ ดัมป์ที่สร้างขึ้นของ route ตัวช่วยทุกตัวที่เรียกได้- การยืนยันตัวตนด้วย shared-secret ใช้
connect.params.auth.tokenหรือconnect.params.auth.passwordขึ้นอยู่กับโหมดการยืนยันตัวตนของ Gateway ที่กำหนดค่าไว้ - โหมดที่มีตัวตน เช่น Tailscale Serve
(
gateway.auth.allowTailscale: true) หรือ non-loopbackgateway.auth.mode: "trusted-proxy"ทำให้การยืนยันตัวตนสำเร็จจากส่วนหัวคำขอ แทนconnect.params.auth.* - private-ingress
gateway.auth.mode: "none"ปิดใช้งานการยืนยันตัวตนด้วย shared-secret ทั้งหมด; อย่าเปิดโหมดนี้กับ ingress สาธารณะ/ไม่น่าเชื่อถือ - ต้องใช้คีย์ idempotency สำหรับเมธอดที่มีผลข้างเคียง (
send,agent) เพื่อ ลองซ้ำได้อย่างปลอดภัย; เซิร์ฟเวอร์เก็บแคช dedupe อายุสั้น - Node ต้องใส่
role: "node"พร้อม caps/commands/permissions ในconnect
การจับคู่ + ความเชื่อถือภายในเครื่อง
- ไคลเอนต์ WS ทั้งหมด (ผู้ปฏิบัติการ + Node) ใส่ ตัวตนอุปกรณ์ ใน
connect - ID อุปกรณ์ใหม่ต้องได้รับการอนุมัติการจับคู่; Gateway ออก โทเคนอุปกรณ์ สำหรับการเชื่อมต่อครั้งถัดไป
- การเชื่อมต่อ local loopback โดยตรงสามารถอนุมัติอัตโนมัติได้เพื่อให้ UX บนโฮสต์เดียวกัน ลื่นไหล
- OpenClaw ยังมีเส้นทาง self-connect แบบแคบที่จำกัดเฉพาะ backend/container-local สำหรับ โฟลว์ตัวช่วย shared-secret ที่เชื่อถือได้
- การเชื่อมต่อ tailnet และ LAN รวมถึง bind ของ tailnet บนโฮสต์เดียวกัน ยังคงต้องมี การอนุมัติการจับคู่อย่างชัดเจน
- การเชื่อมต่อทั้งหมดต้องลงนาม nonce
connect.challenge - เพย์โหลดลายเซ็น
v3ยังผูกplatform+deviceFamily; Gateway pin เมทาดาทาที่จับคู่ไว้เมื่อเชื่อมต่อใหม่ และต้องใช้การจับคู่ซ่อมแซมเมื่อเมทาดาทาเปลี่ยน - การเชื่อมต่อ ที่ไม่ใช่ภายในเครื่อง ยังคงต้องมีการอนุมัติอย่างชัดเจน
- การยืนยันตัวตน Gateway (
gateway.auth.*) ยังคงใช้กับการเชื่อมต่อ ทั้งหมด ไม่ว่าจะ ภายในเครื่องหรือระยะไกล
รายละเอียด: โปรโตคอล Gateway, การจับคู่, ความปลอดภัย.
การกำหนดชนิดโปรโตคอลและ codegen
- สคีมา TypeBox กำหนดโปรโตคอล
- JSON Schema ถูกสร้างจากสคีมาเหล่านั้น
- โมเดล Swift ถูกสร้างจาก JSON Schema
การเข้าถึงระยะไกล
-
แนะนำ: Tailscale หรือ VPN
-
ทางเลือก: ทันเนล SSH
ssh -N -L 18789:127.0.0.1:18789 user@host -
handshake เดียวกัน + โทเคนยืนยันตัวตนเดียวกันใช้ผ่านทันเนล
-
TLS + การ pin แบบเลือกเปิดได้ สามารถเปิดใช้งานสำหรับ WS ในการตั้งค่าระยะไกล
ภาพรวมการปฏิบัติการ
- เริ่ม:
openclaw gateway(foreground, บันทึก log ไปยัง stdout) - สุขภาพ:
healthผ่าน WS (รวมอยู่ในhello-okด้วย) - การกำกับดูแล: launchd/systemd สำหรับการรีสตาร์ทอัตโนมัติ
ค่าคงที่
- Gateway เพียงหนึ่งตัวควบคุมเซสชัน Baileys หนึ่งเซสชันต่อโฮสต์
- handshake เป็นข้อบังคับ; เฟรมแรกที่ไม่ใช่ JSON หรือไม่ใช่ connect จะถูกปิดอย่างเด็ดขาด
- เหตุการณ์จะไม่ถูก replay; ไคลเอนต์ต้องรีเฟรชเมื่อมีช่องว่าง
ที่เกี่ยวข้อง
- Agent Loop — วงจรการดำเนินการของเอเจนต์โดยละเอียด
- โปรโตคอล Gateway — สัญญาโปรโตคอล WebSocket
- คิว — คิวคำสั่งและการทำงานพร้อมกัน
- ความปลอดภัย — โมเดลความเชื่อถือและการเสริมความแข็งแกร่ง