---
read_when:
    - การดีบักหรือการกำหนดค่าการเข้าถึง WebChat
summary: โฮสต์สแตติกของ Loopback WebChat และการใช้งาน Gateway WS สำหรับอินเทอร์เฟซแชต
title: เว็บแชต
x-i18n:
    generated_at: "2026-05-03T10:18:39Z"
    model: gpt-5.5
    provider: openai
    source_hash: 48024e58259901c6feb67168c5c1ce32f46b8ad9b6f4511e56d2000478a3ed60
    source_path: web/webchat.md
    workflow: 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
- รายการ Compaction จะแสดงเป็นตัวคั่นประวัติที่ถูกย่ออย่างชัดเจน ตัวคั่นจะอธิบายว่าเทิร์นก่อนหน้าถูกเก็บรักษาไว้ในเช็กพอยต์ และลิงก์ไปยังตัวควบคุมเช็กพอยต์ของเซสชัน ซึ่งผู้ปฏิบัติงานสามารถสร้างแขนงหรือกู้คืนมุมมองก่อน Compaction ได้เมื่อสิทธิ์อนุญาต
- Control UI จดจำ `sessionId` ของ Gateway เบื้องหลังที่ส่งกลับโดย `chat.history` และรวมไว้ในการเรียก `chat.send` ครั้งถัดไป ดังนั้นการเชื่อมต่อใหม่และการรีเฟรชหน้าจะดำเนินบทสนทนาที่จัดเก็บไว้เดิมต่อไป เว้นแต่ผู้ใช้จะเริ่มหรือรีเซ็ตเซสชัน
- Control UI รวมการส่งที่กำลังดำเนินอยู่ซ้ำกันสำหรับเซสชัน ข้อความ และไฟล์แนบเดียวกันก่อนสร้าง run id ใหม่ของ `chat.send`; Gateway ยังยังคงลบคำขอซ้ำที่ใช้คีย์ idempotency เดียวกัน
- `chat.history` ยังถูกทำให้เป็นมาตรฐานสำหรับการแสดงผลด้วย: บริบท OpenClaw ที่ใช้เฉพาะรันไทม์,
  ตัวครอบซองขาเข้า, แท็กคำสั่งการส่งมอบแบบอินไลน์
  เช่น `[[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` จะถูกละเว้น
- เพย์โหลดการตอบกลับที่ติดธงเหตุผล (`isReasoning: true`) จะถูกแยกออกจากเนื้อหาผู้ช่วยของ WebChat ข้อความเล่นซ้ำของทรานสคริปต์ และบล็อกเนื้อหาเสียง ดังนั้นเพย์โหลดที่เป็นเพียงการคิดจะไม่ปรากฏเป็นข้อความผู้ช่วยที่มองเห็นได้หรือเสียงที่เล่นได้
- `chat.inject` เพิ่มบันทึกของผู้ช่วยลงในทรานสคริปต์โดยตรงและกระจายไปยัง UI (ไม่มีการรันเอเจนต์)
- การรันที่ถูกยกเลิกสามารถคงเอาต์พุตผู้ช่วยบางส่วนให้มองเห็นได้ใน UI
- Gateway จะเก็บข้อความผู้ช่วยบางส่วนที่ถูกยกเลิกไว้ในประวัติทรานสคริปต์เมื่อมีเอาต์พุตที่ถูกบัฟเฟอร์อยู่ และทำเครื่องหมายรายการเหล่านั้นด้วยเมทาดาทาการยกเลิก
- ประวัติจะถูกดึงจาก Gateway เสมอ (ไม่มีการเฝ้าดูไฟล์ในเครื่อง)
- หากไม่สามารถเข้าถึง Gateway ได้ WebChat จะเป็นแบบอ่านอย่างเดียว

## แผงเครื่องมือเอเจนต์ของ Control UI

- แผงเครื่องมือ `/agents` ของ Control UI มีสองมุมมองแยกกัน:
  - **พร้อมใช้งานตอนนี้** ใช้ `tools.effective(sessionKey=...)` และแสดงสิ่งที่เซสชันปัจจุบัน
    สามารถใช้ได้จริงขณะรันไทม์ รวมถึงเครื่องมือหลัก เครื่องมือของ Plugin และเครื่องมือที่ช่องทางเป็นเจ้าของ
  - **การกำหนดค่าเครื่องมือ** ใช้ `tools.catalog` และยังคงมุ่งเน้นที่โปรไฟล์ การแทนที่ และ
    ความหมายของแค็ตตาล็อก
- ความพร้อมใช้งานขณะรันไทม์มีขอบเขตตามเซสชัน การสลับเซสชันบนเอเจนต์เดียวกันสามารถเปลี่ยนรายการ
  **พร้อมใช้งานตอนนี้** ได้
- ตัวแก้ไขการกำหนดค่าไม่ได้บอกเป็นนัยถึงความพร้อมใช้งานขณะรันไทม์; การเข้าถึงที่มีผลจริงยังคงเป็นไปตามลำดับความสำคัญของนโยบาย
  (`allow`/`deny`, การแทนที่ต่อเอเจนต์และต่อผู้ให้บริการ/ช่องทาง)

## การใช้งานระยะไกล

- โหมดระยะไกลสร้างทันเนล Gateway WebSocket ผ่าน SSH/Tailscale
- คุณไม่จำเป็นต้องรันเซิร์ฟเวอร์ WebChat แยกต่างหาก

## อ้างอิงการกำหนดค่า (WebChat)

การกำหนดค่าทั้งหมด: [การกำหนดค่า](/th/gateway/configuration)

ตัวเลือก WebChat:

- `gateway.webchat.chatHistoryMaxChars`: จำนวนอักขระสูงสุดสำหรับช่องข้อความในการตอบกลับ `chat.history` เมื่อรายการทรานสคริปต์เกินขีดจำกัดนี้ Gateway จะตัดช่องข้อความยาว ๆ ออก และอาจแทนที่ข้อความที่ใหญ่เกินด้วยตัวยึดตำแหน่ง ไคลเอนต์ยังสามารถส่ง `maxChars` ต่อคำขอเพื่อแทนที่ค่าเริ่มต้นนี้สำหรับการเรียก `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 สำหรับไคลเอนต์เบราว์เซอร์ที่อยู่หลังแหล่งพร็อกซี **ที่ไม่ใช่ loopback** ซึ่งรับรู้ตัวตน (ดู [การตรวจสอบสิทธิ์ Trusted Proxy](/th/gateway/trusted-proxy-auth))
- `gateway.remote.url`, `gateway.remote.token`, `gateway.remote.password`: เป้าหมาย Gateway ระยะไกล
- `session.*`: ที่จัดเก็บเซสชันและค่าเริ่มต้นของคีย์หลัก

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

- [Control UI](/th/web/control-ui)
- [แดชบอร์ด](/th/web/dashboard)
