Web interfaces

WebChat

สถานะ: UI แชต SwiftUI บน macOS/iOS คุยกับ Gateway WebSocket โดยตรง.

คืออะไร

  • UI แชตแบบเนทีฟสำหรับ Gateway (ไม่มีเบราว์เซอร์ฝังในตัวและไม่มีเซิร์ฟเวอร์สแตติกภายในเครื่อง)
  • ใช้เซสชันและกฎการกำหนดเส้นทางเดียวกับช่องทางอื่น
  • การกำหนดเส้นทางแบบกำหนดแน่นอน: การตอบกลับจะกลับไปที่ WebChat เสมอ

เริ่มต้นอย่างรวดเร็ว

  1. เริ่ม Gateway
  2. เปิด WebChat UI (แอป macOS/iOS) หรือแท็บแชตของ Control UI
  3. ตรวจสอบว่าได้กำหนดค่าเส้นทางการยืนยันตัวตนของ Gateway ที่ถูกต้องแล้ว (ค่าเริ่มต้นคือ shared-secret แม้บน loopback)

วิธีทำงาน (พฤติกรรม)

  • UI เชื่อมต่อกับ Gateway WebSocket และใช้ chat.history, chat.send และ chat.inject
  • chat.history ถูกจำกัดขอบเขตเพื่อความเสถียร: Gateway อาจตัดฟิลด์ข้อความยาว ละเว้นเมตาดาต้าหนัก และแทนที่รายการที่ใหญ่เกินด้วย [chat.history omitted: message too large]
  • เมื่อข้อความผู้ช่วยที่มองเห็นได้ถูกตัดใน chat.history Control 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: โฮสต์/พอร์ต WebSocket
  • gateway.auth.mode, gateway.auth.token, gateway.auth.password: การยืนยันตัวตน WebSocket แบบ shared-secret
  • gateway.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?
On this page

On this page