10 KiB
10 KiB
| read_when | summary | title | x-i18n | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
โฮสต์แบบสแตติกของเว็บแชตแบบลูปแบ็กและการใช้งาน WS ของ Gateway สำหรับ UI แชต | เว็บแชท |
|
สถานะ: UI แชต SwiftUI ของ macOS/iOS สื่อสารกับ Gateway WebSocket โดยตรง
คืออะไร
- UI แชตแบบเนทีฟสำหรับ Gateway (ไม่มีเบราว์เซอร์แบบฝังและไม่มีเซิร์ฟเวอร์สแตติกในเครื่อง)
- ใช้เซสชันและกฎการกำหนดเส้นทางเดียวกับช่องทางอื่น
- การกำหนดเส้นทางแบบกำหนดแน่นอน: การตอบกลับจะกลับไปที่ WebChat เสมอ
เริ่มต้นอย่างรวดเร็ว
- เริ่ม Gateway
- เปิด UI WebChat (แอป 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.historyติดตามแขนงทรานสคริปต์ที่ใช้งานอยู่สำหรับไฟล์เซสชันแบบ append-only สมัยใหม่ ดังนั้นแขนงการเขียนใหม่ที่ถูกละทิ้งและสำเนาพรอมป์ที่ถูกแทนที่จะไม่ถูกเรนเดอร์ใน WebChat- Control UI รวมการส่งที่กำลังดำเนินอยู่ซ้ำสำหรับเซสชัน ข้อความ และไฟล์แนบเดียวกัน ก่อนสร้าง id การรัน
chat.sendใหม่; Gateway ยังคงขจัดคำขอซ้ำที่นำคีย์ idempotency เดิมมาใช้ซ้ำ chat.historyยังถูกปรับให้เป็นมาตรฐานสำหรับการแสดงผลด้วย: บริบท OpenClaw ที่ใช้เฉพาะรันไทม์, ตัวห่อ envelope ขาเข้า, แท็กคำสั่งการส่งแบบอินไลน์ เช่น[[reply_to_*]]และ[[audio_as_voice]], เพย์โหลด XML ของการเรียกเครื่องมือแบบข้อความธรรมดา (รวมถึง<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>และบล็อกการเรียกเครื่องมือที่ถูกตัดทอน) และ โทเค็นควบคุมโมเดลแบบ ASCII/เต็มความกว้างที่หลุดออกมา จะถูกลบออกจากข้อความที่มองเห็นได้ และรายการผู้ช่วยที่ข้อความที่มองเห็นได้ทั้งหมดเป็นเพียงโทเค็นเงียบที่ตรงเป๊ะNO_REPLY/no_replyจะถูกละเว้น- เพย์โหลดตอบกลับที่มีแฟล็ก reasoning (
isReasoning: true) จะถูกแยกออกจากเนื้อหาผู้ช่วยของ WebChat, ข้อความเล่นซ้ำทรานสคริปต์ และบล็อกเนื้อหาเสียง ดังนั้นเพย์โหลดที่เป็นเฉพาะการคิดจะไม่ปรากฏเป็นข้อความผู้ช่วยที่มองเห็นได้หรือเสียงที่เล่นได้ chat.injectต่อท้ายบันทึกของผู้ช่วยเข้ากับทรานสคริปต์โดยตรงและกระจายไปยัง UI (ไม่มีการรันเอเจนต์)- การรันที่ถูกยกเลิกสามารถคงเอาต์พุตบางส่วนของผู้ช่วยให้มองเห็นได้ใน UI
- Gateway บันทึกข้อความผู้ช่วยบางส่วนที่ถูกยกเลิกลงในประวัติทรานสคริปต์เมื่อมีเอาต์พุตที่บัฟเฟอร์ไว้ และทำเครื่องหมายรายการเหล่านั้นด้วยเมตาดาตาการยกเลิก
- ประวัติจะถูกดึงจาก Gateway เสมอ (ไม่มีการเฝ้าดูไฟล์ในเครื่อง)
- หากเชื่อมต่อ Gateway ไม่ได้ WebChat จะเป็นแบบอ่านอย่างเดียว
แผงเครื่องมือของเอเจนต์ใน Control UI
- แผงเครื่องมือ
/agentsของ Control UI มีมุมมองแยกกันสองแบบ:- พร้อมใช้งานตอนนี้ ใช้
tools.effective(sessionKey=...)และแสดงสิ่งที่เซสชันปัจจุบัน ใช้ได้จริงขณะรันไทม์ รวมถึงเครื่องมือของแกนหลัก, Plugin และช่องทาง - การกำหนดค่าเครื่องมือ ใช้
tools.catalogและยังคงเน้นที่โปรไฟล์ การ override และ ความหมายของแค็ตตาล็อก
- พร้อมใช้งานตอนนี้ ใช้
- ความพร้อมใช้งานขณะรันไทม์ถูกกำหนดตามขอบเขตเซสชัน การสลับเซสชันบนเอเจนต์เดียวกันอาจเปลี่ยนรายการ พร้อมใช้งานตอนนี้
- ตัวแก้ไขการกำหนดค่าไม่ได้หมายถึงความพร้อมใช้งานขณะรันไทม์; การเข้าถึงที่มีผลจริงยังคงเป็นไปตามลำดับความสำคัญของนโยบาย
(
allow/deny, การ override ต่อเอเจนต์และผู้ให้บริการ/ช่องทาง)
การใช้งานระยะไกล
- โหมดระยะไกลทำอุโมงค์ Gateway WebSocket ผ่าน SSH/Tailscale
- คุณไม่จำเป็นต้องรันเซิร์ฟเวอร์ WebChat แยกต่างหาก
อ้างอิงการกำหนดค่า (WebChat)
การกำหนดค่าเต็ม: การกำหนดค่า
ตัวเลือก WebChat:
gateway.webchat.chatHistoryMaxChars: จำนวนอักขระสูงสุดสำหรับฟิลด์ข้อความในคำตอบchat.historyเมื่อรายการทรานสคริปต์เกินขีดจำกัดนี้ Gateway จะตัดทอนฟิลด์ข้อความยาวและอาจแทนที่ข้อความที่ใหญ่เกินไปด้วย placeholder ไคลเอนต์ยังสามารถส่งmaxCharsต่อคำขอเพื่อ override ค่าเริ่มต้นนี้สำหรับการเรียกchat.historyครั้งเดียวได้
ตัวเลือกส่วนกลางที่เกี่ยวข้อง:
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 ที่รับรู้ตัวตน (ดู การยืนยันตัวตน Trusted Proxy)gateway.remote.url,gateway.remote.token,gateway.remote.password: เป้าหมาย Gateway ระยะไกลsession.*: ค่าเริ่มต้นของที่เก็บเซสชันและคีย์หลัก