Control UI (เบราว์เซอร์)¶
Control UI เป็นแอปหน้าเดียวขนาดเล็ก Vite + Lit ที่ให้บริการโดยGateway:
- ค่าเริ่มต้น:
http://<host>:18789/ - คำนำหน้าเสริม: ตั้งค่า
gateway.controlUi.basePath(เช่น/openclaw)
สื่อสาร โดยตรงกับ Gateway WebSocket บนพอร์ตเดียวกัน
เปิดอย่างรวดเร็ว (ภายในเครื่อง)¶
หากGatewayทำงานอยู่บนคอมพิวเตอร์เครื่องเดียวกัน ให้เปิด:
หากหน้าไม่โหลด ให้เริ่มGatewayก่อน: openclaw gateway.
การยืนยันตัวตนจะถูกส่งระหว่างการทำ WebSocket handshake ผ่าน:
connect.params.auth.tokenconnect.params.auth.passwordแผงการตั้งค่าแดชบอร์ดช่วยให้คุณบันทึกโทเคนได้; รหัสผ่านจะไม่ถูกเก็บถาวร วิซาร์ดเริ่มต้นจะสร้างโทเคนของGatewayเป็นค่าเริ่มต้น ดังนั้นให้วางที่นี่เมื่อเชื่อมต่อครั้งแรก ตัวช่วยเริ่มต้นจะสร้างโทเค็นของเกตเวย์ให้โดยค่าเริ่มต้น ดังนั้นให้วางที่นี่เมื่อเชื่อมต่อครั้งแรก
การจับคู่อุปกรณ์ (การเชื่อมต่อครั้งแรก)¶
เมื่อคุณเชื่อมต่อ Control UI จากเบราว์เซอร์หรืออุปกรณ์ใหม่ Gateway
ต้องการ การอนุมัติการจับคู่แบบครั้งเดียว — แม้ว่าคุณจะอยู่ในTailnetเดียวกัน
กับ gateway.auth.allowTailscale: true ก็ตาม นี่เป็นมาตรการด้านความปลอดภัยเพื่อป้องกัน
การเข้าถึงโดยไม่ได้รับอนุญาต นี่เป็นมาตรการด้านความปลอดภัยเพื่อป้องกันการเข้าถึงโดยไม่ได้รับอนุญาต
สิ่งที่คุณจะเห็น: "disconnected (1008): pairing required"
วิธีอนุมัติอุปกรณ์:
# List pending requests
openclaw devices list
# Approve by request ID
openclaw devices approve <requestId>
เมื่ออนุมัติแล้ว อุปกรณ์จะถูกจดจำและไม่ต้องอนุมัติซ้ำ เว้นแต่คุณจะเพิกถอนด้วย openclaw devices revoke --device <id> --role <role>. ดู
Devices CLI สำหรับการหมุนเวียนโทเคนและการเพิกถอน
หมายเหตุ:
- การเชื่อมต่อภายในเครื่อง (
127.0.0.1) จะถูกอนุมัติโดยอัตโนมัติ - การเชื่อมต่อระยะไกล (LAN, Tailnet ฯลฯ) ต้องการการอนุมัติอย่างชัดเจน ต้องได้รับการอนุมัติอย่างชัดเจน
- โปรไฟล์เบราว์เซอร์แต่ละรายการจะสร้างรหัสอุปกรณ์เฉพาะ ดังนั้นการสลับเบราว์เซอร์หรือ การล้างข้อมูลเบราว์เซอร์จะต้องจับคู่ใหม่
ทำอะไรได้บ้าง (ตอนนี้)¶
- แชทกับโมเดลผ่าน Gateway WS (
chat.history,chat.send,chat.abort,chat.inject) - สตรีมการเรียกเครื่องมือ + การ์ดเอาต์พุตเครื่องมือแบบสดในแชท (อีเวนต์เอเจนต์)
- ช่องทาง: WhatsApp/Telegram/Discord/Slack + ช่องทางปลั๊กอิน (Mattermost เป็นต้น) ช่องทาง: สถานะ WhatsApp/Telegram/Discord/Slack + ช่องทางปลั๊กอิน (Mattermost ฯลฯ) + การเข้าสู่ระบบด้วยQR + คอนฟิกต่อช่องทาง (
channels.status,web.login.*,config.patch) - Instances: รายการการแสดงตน + รีเฟรช (
system-presence) - เซสชัน: รายการ + การตั้งค่า override การคิด/โหมด verbose ต่อเซสชัน (
sessions.list,sessions.patch) - งานCron: แสดงรายการ/เพิ่ม/รัน/เปิดใช้งาน/ปิดใช้งาน + ประวัติการรัน (
cron.*) - Skills: สถานะ เปิดใช้งาน/ปิดใช้งาน ติดตั้ง อัปเดตคีย์API (
skills.*) - โหนด: แสดงรายการ + ความสามารถ (
node.list) - การอนุมัติการรันคำสั่ง: แก้ไขรายการอนุญาตของGatewayหรือโหนด + นโยบายถามสำหรับ
exec host=gateway/node(exec.approvals.*) - คอนฟิก: ดู/แก้ไข
~/.openclaw/openclaw.json(config.get,config.set) - คอนฟิก: ใช้ค่า + รีสตาร์ตพร้อมการตรวจสอบ (
config.apply) และปลุกเซสชันที่ใช้งานล่าสุด - การเขียนคอนฟิกรวมถึงตัวป้องกัน base-hash เพื่อป้องกันการเขียนทับการแก้ไขพร้อมกัน
- สคีมาคอนฟิก + การเรนเดอร์ฟอร์ม (
config.schemaรวมถึงสคีมาของปลั๊กอิน + ช่องทาง); ตัวแก้ไข JSON แบบดิบยังคงใช้งานได้ - ดีบัก: สแนปช็อตสถานะ/สุขภาพ/โมเดล + บันทึกอีเวนต์ + การเรียก RPC ด้วยตนเอง (
status,health,models.list) - ล็อก: tail แบบสดของไฟล์ล็อกGateway พร้อมตัวกรอง/ส่งออก (
logs.tail) - อัปเดต: รันการอัปเดตแพ็กเกจ/กิต + รีสตาร์ต (
update.run) พร้อมรายงานการรีสตาร์ต
หมายเหตุแผงงานCron:
- สำหรับงานแบบแยกเดี่ยว การส่งมอบจะตั้งค่าเริ่มต้นเป็นการประกาศสรุป สำหรับงานแบบแยกเดี่ยว การส่งมอบค่าเริ่มต้นคือประกาศสรุป คุณสามารถสลับเป็นไม่มีได้หากต้องการรันภายในเท่านั้น
- ฟิลด์ช่องทาง/เป้าหมายจะแสดงเมื่อเลือกประกาศ
พฤติกรรมการแชท¶
chat.sendเป็นแบบ ไม่บล็อก: จะตอบรับทันทีด้วย{ runId, status: "started" }และสตรีมคำตอบผ่านอีเวนต์chat- การส่งซ้ำด้วย
idempotencyKeyเดิม จะคืนค่า{ status: "in_flight" }ระหว่างกำลังรัน และ{ status: "ok" }หลังเสร็จสิ้น chat.injectจะเพิ่มโน้ตผู้ช่วยลงในทรานสคริปต์ของเซสชันและกระจายอีเวนต์chatสำหรับอัปเดตเฉพาะUI (ไม่รันเอเจนต์ ไม่ส่งไปยังช่องทาง)- หยุด:
- คลิก Stop (เรียก
chat.abort) - พิมพ์
/stop(หรือstop|esc|abort|wait|exit|interrupt) เพื่อยกเลิกนอกแบนด์ chat.abortรองรับ{ sessionKey }(ไม่มีrunId) เพื่อยกเลิกรันที่กำลังทำงานทั้งหมดของเซสชันนั้น
การเข้าถึงผ่านTailnet (แนะนำ)¶
Tailscale Serve แบบผสานรวม (แนะนำ)¶
ให้Gatewayอยู่บน loopback และให้ Tailscale Serve ทำหน้าที่พร็อกซีด้วยHTTPS:
openclaw gateway --tailscale serve
เปิด:
https://<magicdns>/(หรือgateway.controlUi.basePathที่คุณตั้งค่าไว้)
ตามค่าเริ่มต้น คำขอ Serve สามารถยืนยันตัวตนผ่านเฮดเดอร์เอกลักษณ์ของTailscale
(tailscale-user-login) เมื่อ gateway.auth.allowTailscale เป็น true. OpenClaw
จะตรวจสอบเอกลักษณ์โดยการ resolve ที่อยู่ x-forwarded-for ด้วย
tailscale whois และจับคู่กับเฮดเดอร์ และจะยอมรับเฉพาะเมื่อคำขอเข้าถึง loopback พร้อมเฮดเดอร์ x-forwarded-* ของTailscale เท่านั้น ตั้งค่า
gateway.auth.allowTailscale: false (หรือบังคับ gateway.auth.mode: "password")
หากคุณต้องการบังคับใช้โทเคน/รหัสผ่านแม้สำหรับทราฟฟิก Serve ตั้งค่า
gateway.auth.allowTailscale: false (หรือบังคับ gateway.auth.mode: "password")
หากต้องการบังคับใช้โทเค็น/รหัสผ่านแม้กับทราฟฟิก Serve
ผูกกับtailnet + โทเคน¶
openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)"
จากนั้นเปิด:
http://<tailscale-ip>:18789/(หรือgateway.controlUi.basePathที่คุณตั้งค่าไว้)
วางโทเคนลงในการตั้งค่าUI (ส่งเป็น connect.params.auth.token).
HTTP ที่ไม่ปลอดภัย¶
หากคุณเปิดแดชบอร์ดผ่าน HTTP ปกติ (http://<lan-ip> หรือ http://<tailscale-ip>),
เบราว์เซอร์จะทำงานใน บริบทที่ไม่ปลอดภัย และบล็อก WebCrypto ตามค่าเริ่มต้น
OpenClaw จะ บล็อก การเชื่อมต่อ Control UI ที่ไม่มีเอกลักษณ์อุปกรณ์ โดยค่าเริ่มต้น OpenClaw จะ บล็อก การเชื่อมต่อ Control UI ที่ไม่มีตัวตนอุปกรณ์
วิธีแก้ไขที่แนะนำ: ใช้ HTTPS (Tailscale Serve) หรือเปิดUIในเครื่อง:
https://<magicdns>/(Serve)http://127.0.0.1:18789/(บนโฮสต์Gateway)
ตัวอย่างการลดระดับ (ใช้โทเคนอย่างเดียวผ่านHTTP):
{
gateway: {
controlUi: { allowInsecureAuth: true },
bind: "tailnet",
auth: { mode: "token", token: "replace-me" },
},
}
การตั้งค่านี้จะปิดการระบุอุปกรณ์ + การจับคู่สำหรับ Control UI (แม้บนHTTPS) ใช้เฉพาะเมื่อคุณเชื่อถือเครือข่าย ใช้เฉพาะเมื่อคุณเชื่อถือเครือข่าย
ดู Tailscale สำหรับคำแนะนำการตั้งค่าHTTPS
การสร้างUI¶
Gateway ให้บริการไฟล์สแตติกจาก dist/control-ui. สร้างด้วย:
pnpm ui:build # auto-installs UI deps on first run
ฐานแบบสัมบูรณ์เสริม (เมื่อคุณต้องการURLของแอสเซ็ตแบบคงที่):
OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
สำหรับการพัฒนาในเครื่อง (เซิร์ฟเวอร์พัฒนาแยก):
pnpm ui:dev # auto-installs UI deps on first run
จากนั้นชี้UIไปยังURL Gateway WS ของคุณ (เช่น ws://127.0.0.1:18789).
การดีบัก/ทดสอบ: เซิร์ฟเวอร์พัฒนา + Gateway ระยะไกล¶
Control UI เป็นไฟล์สแตติก; เป้าหมาย WebSocket สามารถกำหนดค่าได้และอาจแตกต่างจาก HTTP origin สิ่งนี้มีประโยชน์เมื่อคุณต้องการใช้ Vite dev server ในเครื่อง แต่ให้Gatewayรันอยู่ที่อื่น มีประโยชน์เมื่อคุณต้องการ Vite dev server อยู่ในเครื่อง แต่ให้ Gateway รันที่อื่น
- เริ่มเซิร์ฟเวอร์พัฒนาUI:
pnpm ui:dev - เปิดURLลักษณะนี้:
http://localhost:5173/?gatewayUrl=ws://<gateway-host>:18789
การยืนยันตัวตนแบบครั้งเดียวเสริม (หากจำเป็น):
http://localhost:5173/?gatewayUrl=wss://<gateway-host>:18789&token=<gateway-token>
หมายเหตุ:
gatewayUrlจะถูกเก็บใน localStorage หลังโหลดและลบออกจากURLtokenถูกเก็บใน localStorage;passwordถูกเก็บไว้ในหน่วยความจำเท่านั้น- เมื่อกำหนด
gatewayUrlแล้ว UI จะไม่ถอยกลับไปใช้คอนฟิกหรือข้อมูลรับรองจากสภาพแวดล้อม ให้ระบุtoken(หรือpassword) อย่างชัดเจน การขาดข้อมูลรับรองที่ระบุชัดเจนถือเป็นข้อผิดพลาด ระบุtoken(หรือpassword) อย่างชัดเจน การไม่มีข้อมูลรับรองที่ระบุชัดเจนถือเป็นข้อผิดพลาด - ใช้
wss://เมื่อGatewayอยู่หลังTLS (Tailscale Serve, พร็อกซีHTTPS ฯลฯ) gatewayUrlจะยอมรับเฉพาะในหน้าต่างระดับบนสุด (ไม่ฝัง) เพื่อป้องกัน clickjacking- สำหรับการพัฒนาข้ามออริจิน (เช่น
pnpm ui:devไปยังGatewayระยะไกล) ให้เพิ่มออริจินของUIไปยังgateway.controlUi.allowedOrigins
ตัวอย่าง:
{
gateway: {
controlUi: {
allowedOrigins: ["http://localhost:5173"],
},
},
}
รายละเอียดการตั้งค่าการเข้าถึงระยะไกล: Remote access.