docs/docs/th/web/webchat.md
2026-04-30 10:25:48 +00:00

10 KiB

read_when summary title x-i18n
การดีบักหรือกำหนดค่าการเข้าถึง WebChat
โฮสต์แบบสแตติกของเว็บแชตแบบลูปแบ็กและการใช้งาน WS ของ Gateway สำหรับ UI แชต เว็บแชท
generated_at model provider source_hash source_path workflow
2026-04-30T10:24:18Z gpt-5.5 openai d8a4fef0aab37ca82bff249c6b31eb65475f12c16dfb9b86ddd62c1a938a34f3 web/webchat.md 16

สถานะ: UI แชต SwiftUI ของ macOS/iOS สื่อสารกับ Gateway WebSocket โดยตรง

คืออะไร

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

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

  1. เริ่ม Gateway
  2. เปิด UI WebChat (แอป 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 ติดตามแขนงทรานสคริปต์ที่ใช้งานอยู่สำหรับไฟล์เซสชันแบบ 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: โฮสต์/พอร์ต 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 ที่รับรู้ตัวตน (ดู การยืนยันตัวตน Trusted Proxy)
  • gateway.remote.url, gateway.remote.token, gateway.remote.password: เป้าหมาย Gateway ระยะไกล
  • session.*: ค่าเริ่มต้นของที่เก็บเซสชันและคีย์หลัก

ที่เกี่ยวข้อง