Web interfaces
WebChat
สถานะ: UI แชต SwiftUI บน macOS/iOS คุยกับ Gateway WebSocket โดยตรง.
คืออะไร
- UI แชตแบบเนทีฟสำหรับ Gateway (ไม่มีเบราว์เซอร์ฝังในตัวและไม่มีเซิร์ฟเวอร์สแตติกภายในเครื่อง)
- ใช้เซสชันและกฎการกำหนดเส้นทางเดียวกับช่องทางอื่น
- การกำหนดเส้นทางแบบกำหนดแน่นอน: การตอบกลับจะกลับไปที่ WebChat เสมอ
เริ่มต้นอย่างรวดเร็ว
- เริ่ม Gateway
- เปิด WebChat UI (แอป macOS/iOS) หรือแท็บแชตของ Control UI
- ตรวจสอบว่าได้กำหนดค่าเส้นทางการยืนยันตัวตนของ Gateway ที่ถูกต้องแล้ว (ค่าเริ่มต้นคือ shared-secret แม้บน loopback)
วิธีทำงาน (พฤติกรรม)
- UI เชื่อมต่อกับ Gateway WebSocket และใช้
chat.history,chat.sendและchat.inject chat.historyถูกจำกัดขอบเขตเพื่อความเสถียร: Gateway อาจตัดฟิลด์ข้อความยาว ละเว้นเมตาดาต้าหนัก และแทนที่รายการที่ใหญ่เกินด้วย[chat.history omitted: message too large]- เมื่อข้อความผู้ช่วยที่มองเห็นได้ถูกตัดใน
chat.historyControl UI สามารถเปิดตัวอ่านด้านข้างและดึงรายการเต็มที่ผ่านการปรับให้เป็นรูปแบบการแสดงผลตามต้องการผ่านchat.message.getโดยไม่เพิ่มเพย์โหลดประวัติเริ่มต้น chat.historyตามสาขาทรานสคริปต์ที่ใช้งานอยู่สำหรับไฟล์เซสชันแบบ append-only รุ่นใหม่ ดังนั้นสาขา rewrite ที่ถูกละทิ้งและสำเนาพรอมป์ที่ถูกแทนที่แล้วจะไม่ถูกแสดงใน WebChat- รายการ Compaction จะแสดงเป็นตัวแบ่งประวัติที่ถูกย่ออย่างชัดเจน ตัวแบ่งอธิบายว่าทรานสคริปต์ที่ถูกย่อถูกเก็บไว้เป็นจุดตรวจ และลิงก์ไปยังตัวควบคุมจุดตรวจของ Sessions ซึ่งผู้ปฏิบัติงานสามารถแยกสาขาหรือกู้คืนจากมุมมองที่ถูกย่อนั้นได้เมื่อสิทธิ์อนุญาต
- Control UI จดจำ Gateway
sessionIdเบื้องหลังที่ส่งกลับโดยchat.historyและรวมไว้ในการเรียกchat.sendต่อเนื่อง ดังนั้นการเชื่อมต่อใหม่และการรีเฟรชหน้าจะสนทนาที่จัดเก็บเดิมต่อไป เว้นแต่ผู้ใช้จะเริ่มหรือรีเซ็ตเซสชัน - Control UI รวมการส่งที่ซ้ำกันและยังดำเนินอยู่สำหรับเซสชัน ข้อความ และไฟล์แนบเดียวกันก่อนสร้าง run id ของ
chat.sendใหม่; Gateway ยังยังคงลบคำขอซ้ำที่ใช้คีย์ idempotency เดียวกัน - ไฟล์เริ่มต้นของเวิร์กสเปซและคำสั่ง
BOOTSTRAP.mdที่รอดำเนินการจะถูกส่งผ่าน Project Context ในพรอมป์ระบบของเอเจนต์ ไม่ได้คัดลอกเข้าไปในข้อความผู้ใช้ของ WebChat การตัด bootstrap จะเพิ่มเพียงประกาศกู้คืนในพรอมป์ระบบแบบกระชับเท่านั้น; จำนวนละเอียดและปุ่มปรับแต่ง config จะอยู่บนพื้นผิววินิจฉัย chat.historyยังถูกปรับให้เป็นรูปแบบการแสดงผลด้วย: บริบท OpenClaw เฉพาะรันไทม์, ตัวห่อ envelope ขาเข้า, แท็กคำสั่งการส่งแบบ inline เช่น[[reply_to_*]]และ[[audio_as_voice]], เพย์โหลด XML ของ tool-call แบบข้อความล้วน (รวมถึง<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>และบล็อก tool-call ที่ถูกตัด), และ โทเค็นควบคุมโมเดล ASCII/full-width ที่รั่วออกมาจะถูกลบออกจากข้อความที่มองเห็นได้, และรายการผู้ช่วยที่ข้อความที่มองเห็นได้ทั้งหมดเป็นเพียงโทเค็นเงียบที่ตรงเป๊ะNO_REPLY/no_replyจะถูกละเว้น- เพย์โหลดตอบกลับที่ถูกตั้งค่าสถานะ reasoning (
isReasoning: true) จะถูกแยกออกจากเนื้อหาผู้ช่วยของ WebChat, ข้อความ replay ของทรานสคริปต์ และบล็อกเนื้อหาเสียง ดังนั้นเพย์โหลดสำหรับการคิดเท่านั้นจะไม่ปรากฏเป็นข้อความผู้ช่วยที่มองเห็นได้หรือเสียงที่เล่นได้ chat.injectเพิ่มบันทึกผู้ช่วยต่อท้ายทรานสคริปต์โดยตรงและกระจายไปยัง UI (ไม่มีการรันเอเจนต์)- การรันที่ถูกยกเลิกสามารถคงเอาต์พุตผู้ช่วยบางส่วนให้มองเห็นได้ใน UI
- Gateway คงข้อความผู้ช่วยบางส่วนจากการรันที่ถูกยกเลิกลงในประวัติทรานสคริปต์เมื่อมีเอาต์พุตที่บัฟเฟอร์ไว้ และทำเครื่องหมายรายการเหล่านั้นด้วยเมตาดาต้าการยกเลิก
- ประวัติจะถูกดึงจาก Gateway เสมอ (ไม่มีการเฝ้าดูไฟล์ภายในเครื่อง)
- หากติดต่อ Gateway ไม่ได้ WebChat จะเป็นแบบอ่านอย่างเดียว
ทรานสคริปต์และโมเดลการส่ง
WebChat มีเส้นทางข้อมูลแยกกันสองเส้นทาง:
- ไฟล์ JSONL ของเซสชันคือทรานสคริปต์โมเดล/รันไทม์ถาวร สำหรับการรันเอเจนต์ปกติ รันไทม์ OpenClaw ที่ฝังอยู่จะคงข้อความ
user,assistantและtoolResultที่โมเดลมองเห็นได้ผ่านตัวจัดการเซสชัน WebChat ไม่เขียนข้อความการส่ง สถานะ หรือข้อความช่วยเหลือใดๆ แบบกำหนดเองลงในทรานสคริปต์นั้น - เหตุการณ์ Gateway
ReplyPayloadคือภาพฉายการส่งแบบสด เหตุการณ์เหล่านี้สามารถถูกปรับให้เป็นรูปแบบสำหรับการแสดงผลใน WebChat/ช่องทาง, block streaming, แท็กคำสั่ง, การฝังสื่อ, แฟล็ก TTS/เสียง และพฤติกรรม fallback ของ UI เหตุการณ์เหล่านี้ไม่ใช่ล็อกเซสชันเชิงบัญญัติด้วยตัวเอง - ฮาร์เนสที่ต้องการการตอบกลับที่มองเห็นได้ผ่าน
tools.messageยังคงใช้ WebChat เป็น sink การตอบกลับภายในของรันปัจจุบันmessage.sendแบบไม่มี target จากรัน WebChat ที่ใช้งานอยู่นั้นจะถูกฉายเข้าไปในแชตเดียวกันและสะท้อนไปยังทรานสคริปต์เซสชัน; WebChat ไม่กลายเป็นช่องทางขาออกที่นำกลับมาใช้ซ้ำได้และไม่สืบทอดlastChannel - WebChat ฉีดรายการทรานสคริปต์ผู้ช่วยเฉพาะเมื่อ Gateway เป็นเจ้าของข้อความที่แสดงนอกเทิร์นเอเจนต์ที่ฝังอยู่แบบปกติ:
chat.inject, การตอบกลับคำสั่งที่ไม่ใช่เอเจนต์, เอาต์พุตบางส่วนที่ถูกยกเลิก และส่วนเสริมทรานสคริปต์สื่อที่ WebChat จัดการ chat.historyอ่านทรานสคริปต์เซสชันที่จัดเก็บและใช้ภาพฉายการแสดงผลของ WebChat หากข้อความผู้ช่วยแบบสดปรากฏระหว่างการรันแต่หายไปหลังโหลดประวัติใหม่ ให้ตรวจสอบก่อนว่า JSONL ดิบมีข้อความผู้ช่วยหรือไม่ จากนั้นตรวจสอบว่า projection ของchat.historyลบข้อความนั้นหรือไม่ แล้วจึงตรวจสอบว่า optimistic-tail merge ของ Control UI แทนที่สถานะการส่งในเครื่องด้วยสแนปช็อตที่คงไว้หรือไม่chat.message.getใช้กฎสาขาทรานสคริปต์และภาพฉายการแสดงผลเดียวกับchat.historyรวมถึงการกำหนดขอบเขตเอเจนต์ที่ใช้งานอยู่ แต่เจาะจงรายการทรานสคริปต์หนึ่งรายการด้วยmessageIdและส่งเหตุผลที่ตรงไปตรงมาเมื่อไม่สามารถส่งคืนเนื้อหาเต็มได้อีกต่อไป
คำตอบสุดท้ายของการรันเอเจนต์ปกติควรถาวร เพราะรันไทม์ที่ฝังอยู่เขียน message_end ของผู้ช่วย fallback ใดๆ ที่สะท้อนเพย์โหลดสุดท้ายที่ถูกส่งลงในทรานสคริปต์ต้องหลีกเลี่ยงการทำซ้ำเทิร์นผู้ช่วยที่รันไทม์ที่ฝังอยู่เขียนไว้แล้วก่อน
แผงเครื่องมือเอเจนต์ของ Control UI
- แผง Tools ของ Control UI
/agentsมีมุมมองแยกกันสองมุมมอง:- พร้อมใช้งานตอนนี้ ใช้
tools.effective(sessionKey=...)และแสดงภาพฉายแบบอ่านอย่างเดียวที่เซิร์ฟเวอร์สร้างขึ้น ของ inventory เซสชันปัจจุบัน รวมถึงเครื่องมือ core, Plugin, ที่ช่องทางเป็นเจ้าของ, และเครื่องมือเซิร์ฟเวอร์ MCP ที่ค้นพบแล้ว - การกำหนดค่าเครื่องมือ ใช้
tools.catalogและยังคงเน้นที่โปรไฟล์ การ override และ semantics ของแคตตาล็อก
- พร้อมใช้งานตอนนี้ ใช้
- ความพร้อมใช้งานของรันไทม์ถูกกำหนดขอบเขตตามเซสชัน การสลับเซสชันบนเอเจนต์เดียวกันสามารถเปลี่ยนรายการ พร้อมใช้งานตอนนี้ ได้ หากเซิร์ฟเวอร์ MCP ที่กำหนดค่าไว้ยังไม่ได้เชื่อมต่อหรือถูกเปลี่ยน ตั้งแต่การค้นพบครั้งล่าสุด แผงจะแสดงประกาศแทนการเริ่ม MCP transports จากเส้นทางอ่านแบบเงียบๆ
- ตัวแก้ไข config ไม่ได้หมายความว่ารันไทม์พร้อมใช้งาน; การเข้าถึงที่มีผลจริงยังคงตามลำดับความสำคัญของนโยบาย
(
allow/deny, การ override ต่อเอเจนต์และผู้ให้บริการ/ช่องทาง)
การใช้งานระยะไกล
- โหมดระยะไกล tunnel Gateway WebSocket ผ่าน SSH/Tailscale
- คุณไม่จำเป็นต้องรันเซิร์ฟเวอร์ WebChat แยกต่างหาก
ข้อมูลอ้างอิงการกำหนดค่า (WebChat)
การกำหนดค่าเต็ม: การกำหนดค่า
WebChat ไม่มีส่วน config ที่คงไว้ Gateway ใช้ขีดจำกัดการแสดงผล chat.history ในตัว; ไคลเอนต์ API สามารถส่ง maxChars ต่อคำขอเพื่อ override สำหรับการเรียก chat.history ครั้งเดียวได้ config แบบเดิม channels.webchat และ gateway.webchat ถูกยกเลิกแล้ว; รัน openclaw doctor --fix เพื่อลบออก
ตัวเลือกส่วนกลางที่เกี่ยวข้อง:
gateway.port,gateway.bind: โฮสต์/พอร์ต WebSocketgateway.auth.mode,gateway.auth.token,gateway.auth.password: การยืนยันตัวตน WebSocket แบบ shared-secretgateway.auth.allowTailscale: แท็บแชต Control UI ในเบราว์เซอร์สามารถใช้ส่วนหัวระบุตัวตนของ Tailscale Serve ได้เมื่อเปิดใช้งานgateway.auth.mode: "trusted-proxy": การยืนยันตัวตนผ่าน reverse-proxy สำหรับไคลเอนต์เบราว์เซอร์ที่อยู่หลังแหล่งที่มาพร็อกซี non-loopback ที่รับรู้ตัวตน (ดู การยืนยันตัวตนด้วยพร็อกซีที่เชื่อถือได้)gateway.remote.url,gateway.remote.token,gateway.remote.password: เป้าหมาย Gateway ระยะไกลsession.*: พื้นที่จัดเก็บเซสชันและค่าเริ่มต้นของคีย์หลัก
ที่เกี่ยวข้อง
Was this useful?