diff --git a/docs/th/channels/bluebubbles.md b/docs/th/channels/bluebubbles.md
index 62346ee6e..2714d5591 100644
--- a/docs/th/channels/bluebubbles.md
+++ b/docs/th/channels/bluebubbles.md
@@ -4,45 +4,45 @@ read_when:
- การแก้ไขปัญหาการจับคู่ Webhook
- การกำหนดค่า iMessage บน macOS
sidebarTitle: BlueBubbles
-summary: iMessage ผ่านเซิร์ฟเวอร์ macOS ของ BlueBubbles (การส่ง/รับผ่าน REST, สถานะกำลังพิมพ์, ปฏิกิริยา, การจับคู่, การดำเนินการขั้นสูง).
+summary: iMessage ผ่านเซิร์ฟเวอร์ macOS ของ BlueBubbles (การส่ง/รับผ่าน REST, การพิมพ์, การตอบสนอง, การจับคู่, การดำเนินการขั้นสูง).
title: BlueBubbles
x-i18n:
- generated_at: "2026-05-01T10:13:49Z"
+ generated_at: "2026-05-04T02:21:41Z"
model: gpt-5.5
provider: openai
- source_hash: 499cc2a46db6e0eddfb897e96ec4b3e4a39ba9f2f6da8e7485c1c46562de4145
+ source_hash: 78a054da0c7c32b161997acd05914896259dd1a050e736a4c9e438a452ab6a51
source_path: channels/bluebubbles.md
workflow: 16
---
-สถานะ: Plugin ที่บันเดิลมาซึ่งพูดคุยกับเซิร์ฟเวอร์ BlueBubbles บน macOS ผ่าน HTTP **แนะนำสำหรับการผสานรวม iMessage** เนื่องจาก API ที่สมบูรณ์กว่าและตั้งค่าได้ง่ายกว่าเมื่อเทียบกับช่องทาง imsg แบบเดิม
+สถานะ: Plugin ที่บันเดิลมาซึ่งสื่อสารกับเซิร์ฟเวอร์ BlueBubbles macOS ผ่าน HTTP **แนะนำสำหรับการผสานรวม iMessage** เนื่องจากมี API ที่สมบูรณ์กว่าและตั้งค่าง่ายกว่าเมื่อเทียบกับช่องทาง imsg แบบเดิม
-OpenClaw รุ่นปัจจุบันบันเดิล BlueBubbles มาให้แล้ว ดังนั้นบิลด์แพ็กเกจปกติจึงไม่ต้องมีขั้นตอน `openclaw plugins install` แยกต่างหาก
+OpenClaw รุ่นปัจจุบันบันเดิล BlueBubbles มาให้แล้ว ดังนั้นบิลด์แบบแพ็กเกจปกติจึงไม่ต้องมีขั้นตอน `openclaw plugins install` แยกต่างหาก
## ภาพรวม
-- ทำงานบน macOS ผ่านแอปช่วยเหลือ BlueBubbles ([bluebubbles.app](https://bluebubbles.app))
-- แนะนำ/ทดสอบแล้ว: macOS Sequoia (15) macOS Tahoe (26) ใช้งานได้; ตอนนี้การแก้ไขยังเสียอยู่บน Tahoe และการอัปเดตไอคอนกลุ่มอาจรายงานว่าสำเร็จแต่ไม่ซิงก์
-- OpenClaw พูดคุยกับมันผ่าน REST API (`GET /api/v1/ping`, `POST /message/text`, `POST /chat/:id/*`)
-- ข้อความขาเข้ามาทาง Webhook; การตอบกลับขาออก ตัวบ่งชี้การพิมพ์ ใบตอบรับการอ่าน และ tapback เป็นการเรียก REST
+- ทำงานบน macOS ผ่านแอปตัวช่วย BlueBubbles ([bluebubbles.app](https://bluebubbles.app))
+- แนะนำ/ทดสอบแล้ว: macOS Sequoia (15) macOS Tahoe (26) ใช้งานได้; ขณะนี้การแก้ไขยังใช้ไม่ได้บน Tahoe และการอัปเดตไอคอนกลุ่มอาจรายงานว่าสำเร็จแต่ไม่ซิงก์
+- OpenClaw สื่อสารกับมันผ่าน REST API (`GET /api/v1/ping`, `POST /message/text`, `POST /chat/:id/*`)
+- ข้อความขาเข้ามาผ่าน Webhook; การตอบกลับขาออก, ตัวบ่งชี้การพิมพ์, ใบรับทราบการอ่าน และ tapback เป็นการเรียก REST
- ไฟล์แนบและสติกเกอร์จะถูกนำเข้าเป็นสื่อขาเข้า (และแสดงให้เอเจนต์เห็นเมื่อทำได้)
-- การตอบกลับ Auto-TTS ที่สังเคราะห์เสียง MP3 หรือ CAF จะถูกส่งเป็นบับเบิลวอยซ์เมโมของ iMessage แทนไฟล์แนบธรรมดา
-- การจับคู่/รายการอนุญาตทำงานเหมือนช่องทางอื่น (`/channels/pairing` ฯลฯ) ด้วย `channels.bluebubbles.allowFrom` + รหัสจับคู่
-- ปฏิกิริยาจะถูกแสดงเป็นอีเวนต์ระบบเหมือน Slack/Telegram เพื่อให้เอเจนต์สามารถ "กล่าวถึง" ก่อนตอบกลับได้
-- ฟีเจอร์ขั้นสูง: แก้ไข ยกเลิกการส่ง เธรดตอบกลับ เอฟเฟกต์ข้อความ การจัดการกลุ่ม
+- การตอบกลับ Auto-TTS ที่สังเคราะห์เสียง MP3 หรือ CAF จะถูกส่งเป็นบับเบิลบันทึกเสียงของ iMessage แทนไฟล์แนบธรรมดา
+- การจับคู่/allowlist ทำงานเหมือนช่องทางอื่น (`/channels/pairing` เป็นต้น) ด้วย `channels.bluebubbles.allowFrom` + โค้ดจับคู่
+- รีแอ็กชันจะแสดงเป็นเหตุการณ์ระบบเช่นเดียวกับ Slack/Telegram เพื่อให้เอเจนต์สามารถ "กล่าวถึง" ก่อนตอบกลับได้
+- คุณสมบัติขั้นสูง: แก้ไข, ยกเลิกการส่ง, เธรดการตอบกลับ, เอฟเฟกต์ข้อความ, การจัดการกลุ่ม
## เริ่มต้นอย่างรวดเร็ว
-
+
ติดตั้งเซิร์ฟเวอร์ BlueBubbles บน Mac ของคุณ (ทำตามคำแนะนำที่ [bluebubbles.app/install](https://bluebubbles.app/install))
-
- ในการกำหนดค่า BlueBubbles ให้เปิดใช้งานเว็บ API และตั้งรหัสผ่าน
+
+ ในการกำหนดค่า BlueBubbles ให้เปิดใช้ web API และตั้งรหัสผ่าน
-
+
เรียกใช้ `openclaw onboard` แล้วเลือก BlueBubbles หรือกำหนดค่าด้วยตนเอง:
```json5
@@ -59,10 +59,10 @@ OpenClaw รุ่นปัจจุบันบันเดิล BlueBubbles
```
-
- ชี้ Webhook ของ BlueBubbles ไปที่ Gateway ของคุณ (ตัวอย่าง: `https://your-gateway-host:3000/bluebubbles-webhook?password=`)
+
+ ชี้ Webhook ของ BlueBubbles ไปยัง Gateway ของคุณ (ตัวอย่าง: `https://your-gateway-host:3000/bluebubbles-webhook?password=`)
-
+
เริ่ม Gateway; ระบบจะลงทะเบียนตัวจัดการ Webhook และเริ่มการจับคู่
@@ -71,17 +71,17 @@ OpenClaw รุ่นปัจจุบันบันเดิล BlueBubbles
**ความปลอดภัย**
- ตั้งรหัสผ่าน Webhook เสมอ
-- ต้องยืนยันตัวตน Webhook เสมอ OpenClaw จะปฏิเสธคำขอ Webhook ของ BlueBubbles เว้นแต่คำขอนั้นจะมีรหัสผ่าน/guid ที่ตรงกับ `channels.bluebubbles.password` (เช่น `?password=` หรือ `x-password`) ไม่ว่าโทโพโลยี loopback/proxy จะเป็นอย่างไร
-- การยืนยันตัวตนด้วยรหัสผ่านจะถูกตรวจสอบก่อนอ่าน/แยกวิเคราะห์เนื้อหา Webhook แบบเต็ม
+- ต้องมีการยืนยันตัวตนของ Webhook เสมอ OpenClaw จะปฏิเสธคำขอ Webhook ของ BlueBubbles เว้นแต่คำขอนั้นจะมีรหัสผ่าน/guid ที่ตรงกับ `channels.bluebubbles.password` (เช่น `?password=` หรือ `x-password`) โดยไม่ขึ้นกับโทโพโลยี loopback/proxy
+- ระบบจะตรวจสอบการยืนยันตัวตนด้วยรหัสผ่านก่อนอ่าน/แยกวิเคราะห์เนื้อหา Webhook แบบเต็ม
-## การทำให้ Messages.app ทำงานต่อเนื่อง (การตั้งค่า VM / headless)
+## การทำให้ Messages.app ทำงานอยู่เสมอ (VM / การตั้งค่าแบบไม่มีหน้าจอ)
-การตั้งค่า macOS VM / แบบเปิดตลอดบางแบบอาจทำให้ Messages.app เข้าสู่สถานะ "idle" (อีเวนต์ขาเข้าหยุดจนกว่าจะเปิดแอป/นำแอปขึ้นหน้า) วิธีเลี่ยงอย่างง่ายคือ **กระตุ้น Messages ทุก 5 นาที** ด้วย AppleScript + LaunchAgent
+การตั้งค่า macOS VM / แบบเปิดตลอดเวลาบางแบบอาจทำให้ Messages.app เข้าสู่สถานะ "idle" (เหตุการณ์ขาเข้าหยุดจนกว่าแอปจะถูกเปิด/นำมาไว้ด้านหน้า) วิธีแก้แบบง่ายคือ **กระตุ้น Messages ทุก 5 นาที** โดยใช้ AppleScript + LaunchAgent
-
+
บันทึกสิ่งนี้เป็น `~/Scripts/poke-messages.scpt`:
```applescript
@@ -100,7 +100,7 @@ OpenClaw รุ่นปัจจุบันบันเดิล BlueBubbles
```
-
+
บันทึกสิ่งนี้เป็น `~/Library/LaunchAgents/com.user.poke-messages.plist`:
```xml
@@ -132,10 +132,10 @@ OpenClaw รุ่นปัจจุบันบันเดิล BlueBubbles
```
- สิ่งนี้ทำงาน **ทุก 300 วินาที** และ **เมื่อเข้าสู่ระบบ** การรันครั้งแรกอาจเรียกพรอมต์ **Automation** ของ macOS (`osascript` → Messages) ให้อนุมัติในเซสชันผู้ใช้เดียวกับที่รัน LaunchAgent
+ สิ่งนี้จะทำงาน **ทุก 300 วินาที** และ **เมื่อเข้าสู่ระบบ** การเรียกใช้ครั้งแรกอาจทำให้ macOS แสดงพร้อมท์ **Automation** (`osascript` → Messages) อนุมัติพร้อมท์เหล่านั้นในเซสชันผู้ใช้เดียวกับที่เรียกใช้ LaunchAgent
-
+
```bash
launchctl unload ~/Library/LaunchAgents/com.user.poke-messages.plist 2>/dev/null || true
launchctl load ~/Library/LaunchAgents/com.user.poke-messages.plist
@@ -151,25 +151,25 @@ BlueBubbles พร้อมใช้งานในการเริ่มใ
openclaw onboard
```
-วิซาร์ดจะถามหา:
+ตัวช่วยตั้งค่าจะถามค่าเหล่านี้:
-
+
ที่อยู่เซิร์ฟเวอร์ BlueBubbles (เช่น `http://192.168.1.100:1234`)
-
+
รหัสผ่าน API จากการตั้งค่า BlueBubbles Server
-
- เส้นทางเอนด์พอยต์ Webhook
+
+ พาธปลายทาง Webhook
-
+
`pairing`, `allowlist`, `open`, หรือ `disabled`
-
- หมายเลขโทรศัพท์ อีเมล หรือเป้าหมายแชท
+
+ หมายเลขโทรศัพท์, อีเมล หรือเป้าหมายแชท
-คุณยังเพิ่ม BlueBubbles ผ่าน CLI ได้ด้วย:
+คุณยังสามารถเพิ่ม BlueBubbles ผ่าน CLI ได้ด้วย:
```
openclaw channels add bluebubbles --http-url http://192.168.1.100:1234 --password
@@ -178,30 +178,30 @@ openclaw channels add bluebubbles --http-url http://192.168.1.100:1234 --passwor
## การควบคุมการเข้าถึง (DM + กลุ่ม)
-
+
- ค่าเริ่มต้น: `channels.bluebubbles.dmPolicy = "pairing"`
- - ผู้ส่งที่ไม่รู้จักจะได้รับรหัสจับคู่; ข้อความจะถูกละเว้นจนกว่าจะได้รับการอนุมัติ (รหัสหมดอายุหลัง 1 ชั่วโมง)
+ - ผู้ส่งที่ไม่รู้จักจะได้รับโค้ดจับคู่; ข้อความจะถูกละเว้นจนกว่าจะได้รับอนุมัติ (โค้ดหมดอายุหลัง 1 ชั่วโมง)
- อนุมัติผ่าน:
- `openclaw pairing list bluebubbles`
- `openclaw pairing approve bluebubbles `
- - การจับคู่เป็นการแลกเปลี่ยนโทเคนเริ่มต้น รายละเอียด: [การจับคู่](/th/channels/pairing)
+ - การจับคู่เป็นการแลกเปลี่ยนโทเค็นค่าเริ่มต้น รายละเอียด: [การจับคู่](/th/channels/pairing)
-
+
- `channels.bluebubbles.groupPolicy = open | allowlist | disabled` (ค่าเริ่มต้น: `allowlist`)
- - `channels.bluebubbles.groupAllowFrom` ควบคุมว่าใครสามารถทริกเกอร์ในกลุ่มได้เมื่อกำหนด `allowlist`
+ - `channels.bluebubbles.groupAllowFrom` ควบคุมว่าใครสามารถทริกเกอร์ในกลุ่มเมื่อกำหนด `allowlist`
### การเติมชื่อผู้ติดต่อ (macOS, ไม่บังคับ)
-Webhook กลุ่มของ BlueBubbles มักมีเพียงที่อยู่ผู้เข้าร่วมแบบดิบ หากคุณต้องการให้บริบท `GroupMembers` แสดงชื่อผู้ติดต่อในเครื่องแทน คุณสามารถเลือกใช้การเติมข้อมูล Contacts ในเครื่องบน macOS ได้:
+Webhook กลุ่มของ BlueBubbles มักมีเฉพาะที่อยู่ผู้เข้าร่วมแบบดิบ หากคุณต้องการให้บริบท `GroupMembers` แสดงชื่อผู้ติดต่อในเครื่องแทน คุณสามารถเลือกใช้การเติมข้อมูลจาก Contacts ในเครื่องบน macOS ได้:
-- `channels.bluebubbles.enrichGroupParticipantsFromContacts = true` เปิดใช้งานการค้นหา ค่าเริ่มต้น: `false`
-- การค้นหาจะทำงานเฉพาะหลังจากการเข้าถึงกลุ่ม การอนุญาตคำสั่ง และการกั้นด้วยการกล่าวถึงอนุญาตให้ข้อความผ่านแล้ว
-- จะเติมข้อมูลเฉพาะผู้เข้าร่วมที่เป็นหมายเลขโทรศัพท์และยังไม่มีชื่อเท่านั้น
-- หมายเลขโทรศัพท์ดิบยังคงเป็นค่าถอยกลับเมื่อไม่พบรายการที่ตรงกันในเครื่อง
+- `channels.bluebubbles.enrichGroupParticipantsFromContacts = true` เปิดใช้การค้นหา ค่าเริ่มต้น: `false`
+- การค้นหาจะทำงานหลังจากการเข้าถึงกลุ่ม, การอนุญาตคำสั่ง และด่านการกล่าวถึงได้อนุญาตให้ข้อความผ่านแล้วเท่านั้น
+- ระบบจะเติมข้อมูลเฉพาะผู้เข้าร่วมที่เป็นหมายเลขโทรศัพท์และยังไม่มีชื่อเท่านั้น
+- หมายเลขโทรศัพท์ดิบจะยังคงเป็นค่าทดแทนเมื่อไม่พบรายการที่ตรงกันในเครื่อง
```json5
{
@@ -213,13 +213,13 @@ Webhook กลุ่มของ BlueBubbles มักมีเพียงท
}
```
-### การกั้นด้วยการกล่าวถึง (กลุ่ม)
+### ด่านการกล่าวถึง (กลุ่ม)
-BlueBubbles รองรับการกั้นด้วยการกล่าวถึงสำหรับแชทกลุ่ม โดยตรงกับพฤติกรรมของ iMessage/WhatsApp:
+BlueBubbles รองรับด่านการกล่าวถึงสำหรับแชทกลุ่ม โดยสอดคล้องกับพฤติกรรมของ iMessage/WhatsApp:
- ใช้ `agents.list[].groupChat.mentionPatterns` (หรือ `messages.groupChat.mentionPatterns`) เพื่อตรวจจับการกล่าวถึง
-- เมื่อเปิดใช้ `requireMention` สำหรับกลุ่ม เอเจนต์จะตอบกลับเฉพาะเมื่อถูกกล่าวถึง
-- คำสั่งควบคุมจากผู้ส่งที่ได้รับอนุญาตจะข้ามการกั้นด้วยการกล่าวถึง
+- เมื่อเปิดใช้ `requireMention` สำหรับกลุ่ม เอเจนต์จะตอบเฉพาะเมื่อถูกกล่าวถึง
+- คำสั่งควบคุมจากผู้ส่งที่ได้รับอนุญาตจะข้ามด่านการกล่าวถึง
การกำหนดค่าต่อกลุ่ม:
@@ -238,15 +238,15 @@ BlueBubbles รองรับการกั้นด้วยการกล
}
```
-### การกั้นคำสั่ง
+### ด่านคำสั่ง
- คำสั่งควบคุม (เช่น `/config`, `/model`) ต้องมีการอนุญาต
- ใช้ `allowFrom` และ `groupAllowFrom` เพื่อกำหนดการอนุญาตคำสั่ง
-- ผู้ส่งที่ได้รับอนุญาตสามารถรันคำสั่งควบคุมได้ แม้ไม่ได้กล่าวถึงในกลุ่ม
+- ผู้ส่งที่ได้รับอนุญาตสามารถเรียกใช้คำสั่งควบคุมได้แม้ไม่ได้กล่าวถึงในกลุ่ม
-### พรอมต์ระบบต่อกลุ่ม
+### พรอมป์ระบบต่อกลุ่ม
-แต่ละรายการภายใต้ `channels.bluebubbles.groups.*` รับสตริง `systemPrompt` ที่ไม่บังคับ ค่าจะถูกฉีดเข้าไปในพรอมต์ระบบของเอเจนต์ในทุกเทิร์นที่จัดการข้อความในกลุ่มนั้น ดังนั้นคุณจึงตั้งบุคลิกหรือกฎพฤติกรรมต่อกลุ่มได้โดยไม่ต้องแก้ไขพรอมต์ของเอเจนต์:
+แต่ละรายการภายใต้ `channels.bluebubbles.groups.*` รับสตริง `systemPrompt` ที่ไม่บังคับได้ ค่านี้จะถูกฉีดเข้าไปในพรอมป์ระบบของเอเจนต์ทุกเทิร์นที่จัดการข้อความในกลุ่มนั้น เพื่อให้คุณตั้งบุคลิกหรือกฎพฤติกรรมต่อกลุ่มได้โดยไม่ต้องแก้ไขพรอมป์ของเอเจนต์:
```json5
{
@@ -262,11 +262,11 @@ BlueBubbles รองรับการกั้นด้วยการกล
}
```
-คีย์ตรงกับสิ่งที่ BlueBubbles รายงานเป็น `chatGuid` / `chatIdentifier` / `chatId` แบบตัวเลขสำหรับกลุ่ม และรายการไวลด์การ์ด `"*"` จะให้ค่าเริ่มต้นสำหรับทุกกลุ่มที่ไม่มีการจับคู่แบบตรงตัว (รูปแบบเดียวกับที่ใช้โดย `requireMention` และนโยบายเครื่องมือต่อกลุ่ม) การจับคู่แบบตรงตัวจะชนะไวลด์การ์ดเสมอ DM จะละเว้นฟิลด์นี้; ให้ใช้การปรับแต่งพรอมต์ระดับเอเจนต์หรือระดับบัญชีแทน
+คีย์ตรงกับค่าที่ BlueBubbles รายงานเป็น `chatGuid` / `chatIdentifier` / `chatId` แบบตัวเลขสำหรับกลุ่ม และรายการไวลด์การ์ด `"*"` จะให้ค่าเริ่มต้นสำหรับทุกกลุ่มที่ไม่มีรายการตรงกันแบบแน่นอน (เป็นรูปแบบเดียวกับที่ใช้โดย `requireMention` และนโยบายเครื่องมือต่อกลุ่ม) รายการตรงกันแบบแน่นอนจะชนะไวลด์การ์ดเสมอ DM จะละเว้นฟิลด์นี้; ใช้การปรับแต่งพรอมป์ระดับเอเจนต์หรือระดับบัญชีแทน
-#### ตัวอย่างที่ทำงานได้: การตอบกลับแบบเธรดและปฏิกิริยา tapback (Private API)
+#### ตัวอย่างที่ใช้งานจริง: การตอบกลับแบบเธรดและรีแอ็กชัน tapback (Private API)
-เมื่อเปิดใช้ BlueBubbles Private API ข้อความขาเข้าจะมาพร้อม ID ข้อความแบบสั้น (เช่น `[[reply_to:5]]`) และเอเจนต์สามารถเรียก `action=reply` เพื่อเข้าร่วมเธรดในข้อความที่เจาะจง หรือ `action=react` เพื่อส่ง tapback ได้ `systemPrompt` ต่อกลุ่มเป็นวิธีที่เชื่อถือได้ในการทำให้เอเจนต์เลือกเครื่องมือที่ถูกต้อง:
+เมื่อเปิดใช้ BlueBubbles Private API ข้อความขาเข้าจะมาพร้อม ID ข้อความแบบสั้น (เช่น `[[reply_to:5]]`) และเอเจนต์สามารถเรียก `action=reply` เพื่อเธรดเข้าไปยังข้อความเฉพาะ หรือ `action=react` เพื่อวาง tapback ได้ `systemPrompt` ต่อกลุ่มเป็นวิธีที่เชื่อถือได้ในการทำให้เอเจนต์เลือกเครื่องมือที่ถูกต้อง:
```json5
{
@@ -274,15 +274,7 @@ BlueBubbles รองรับการกั้นด้วยการกล
bluebubbles: {
groups: {
"iMessage;+;chat-family": {
- systemPrompt: [
- "When replying in this group, always call action=reply with the",
- "[[reply_to:N]] messageId from context so your response threads",
- "under the triggering message. Never send a new unlinked message.",
- "",
- "For short acknowledgements ('ok', 'got it', 'on it'), use",
- "action=react with an appropriate tapback emoji (❤️, 👍, 😂, ‼️, ❓)",
- "instead of sending a text reply.",
- ].join(" "),
+ systemPrompt: "When replying in this group, always call action=reply with the [[reply_to:N]] messageId from context so your response threads under the triggering message. Never send a new unlinked message. For short acknowledgements ('ok', 'got it', 'on it'), use action=react with an appropriate tapback emoji (❤️, 👍, 😂, ‼️, ❓) instead of sending a text reply.",
},
},
},
@@ -290,24 +282,24 @@ BlueBubbles รองรับการกั้นด้วยการกล
}
```
-ทั้งปฏิกิริยา tapback และการตอบกลับแบบเธรดต้องใช้ BlueBubbles Private API; ดู [การดำเนินการขั้นสูง](#advanced-actions) และ [ID ข้อความ](#message-ids-short-vs-full) สำหรับกลไกพื้นฐาน
+ทั้งรีแอ็กชัน tapback และการตอบกลับแบบเธรดต้องใช้ BlueBubbles Private API; ดู [การดำเนินการขั้นสูง](#advanced-actions) และ [ID ข้อความ](#message-ids-short-vs-full) สำหรับกลไกพื้นฐาน
## การผูกการสนทนา ACP
-แชท BlueBubbles สามารถเปลี่ยนเป็นเวิร์กสเปซ ACP ที่คงอยู่ได้โดยไม่ต้องเปลี่ยนเลเยอร์การขนส่ง
+แชท BlueBubbles สามารถเปลี่ยนเป็นเวิร์กสเปซ ACP ที่คงทนได้โดยไม่ต้องเปลี่ยนเลเยอร์การขนส่ง
-โฟลว์ผู้ควบคุมแบบรวดเร็ว:
+โฟลว์ผู้ปฏิบัติงานแบบเร็ว:
-- รัน `/acp spawn codex --bind here` ภายใน DM หรือแชทกลุ่มที่ได้รับอนุญาต
+- เรียกใช้ `/acp spawn codex --bind here` ภายใน DM หรือแชทกลุ่มที่อนุญาต
- ข้อความในอนาคตในการสนทนา BlueBubbles เดียวกันนั้นจะถูกส่งไปยังเซสชัน ACP ที่สร้างขึ้น
-- `/new` และ `/reset` รีเซ็ตเซสชัน ACP ที่ผูกไว้เดิมในที่เดิม
+- `/new` และ `/reset` รีเซ็ตเซสชัน ACP ที่ผูกเดียวกันในตำแหน่งเดิม
- `/acp close` ปิดเซสชัน ACP และลบการผูก
-ยังรองรับการผูกถาวรที่กำหนดค่าไว้ผ่านรายการ `bindings[]` ระดับบนสุดด้วย `type: "acp"` และ `match.channel: "bluebubbles"`
+การผูกแบบถาวรที่กำหนดค่าไว้ยังรองรับผ่านรายการ `bindings[]` ระดับบนสุดที่มี `type: "acp"` และ `match.channel: "bluebubbles"`
-`match.peer.id` สามารถใช้รูปแบบเป้าหมาย BlueBubbles ที่รองรับได้ทุกรูปแบบ:
+`match.peer.id` สามารถใช้รูปแบบเป้าหมาย BlueBubbles ที่รองรับใดก็ได้:
-- แฮนเดิล DM ที่ปรับมาตรฐานแล้ว เช่น `+15555550123` หรือ `user@example.com`
+- แฮนเดิล DM ที่ทำให้เป็นมาตรฐานแล้ว เช่น `+15555550123` หรือ `user@example.com`
- `chat_id:`
- `chat_guid:`
- `chat_identifier:`
@@ -344,13 +336,13 @@ BlueBubbles รองรับการกั้นด้วยการกล
}
```
-ดู [เอเจนต์ ACP](/th/tools/acp-agents) สำหรับพฤติกรรมการผูก ACP ร่วมกัน
+ดู [เอเจนต์ ACP](/th/tools/acp-agents) สำหรับพฤติกรรมการผูก ACP ที่ใช้ร่วมกัน
-## การพิมพ์ + ใบตอบรับการอ่าน
+## การพิมพ์ + ใบรับทราบการอ่าน
-- **ตัวบ่งชี้การพิมพ์**: ส่งโดยอัตโนมัติก่อนและระหว่างการสร้างคำตอบ.
-- **ใบตอบรับการอ่าน**: ควบคุมโดย `channels.bluebubbles.sendReadReceipts` (ค่าเริ่มต้น: `true`).
-- **ตัวบ่งชี้การพิมพ์**: OpenClaw ส่งเหตุการณ์เริ่มพิมพ์; BlueBubbles ล้างสถานะการพิมพ์โดยอัตโนมัติเมื่อส่งหรือหมดเวลา (การหยุดด้วยตนเองผ่าน DELETE ไม่น่าเชื่อถือ).
+- **ตัวบ่งชี้การพิมพ์**: ส่งโดยอัตโนมัติก่อนและระหว่างการสร้างคำตอบ
+- **ใบรับทราบการอ่าน**: ควบคุมโดย `channels.bluebubbles.sendReadReceipts` (ค่าเริ่มต้น: `true`)
+- **ตัวบ่งชี้การพิมพ์**: OpenClaw ส่งเหตุการณ์เริ่มพิมพ์; BlueBubbles จะล้างการพิมพ์โดยอัตโนมัติเมื่อส่งหรือหมดเวลา (การหยุดด้วยตนเองผ่าน DELETE ไม่น่าเชื่อถือ)
```json5
{
@@ -364,7 +356,7 @@ BlueBubbles รองรับการกั้นด้วยการกล
## การดำเนินการขั้นสูง
-BlueBubbles รองรับการดำเนินการข้อความขั้นสูงเมื่อเปิดใช้ในการกำหนดค่า:
+BlueBubbles รองรับการดำเนินการข้อความขั้นสูงเมื่อเปิดใช้ใน config:
```json5
{
@@ -389,68 +381,68 @@ BlueBubbles รองรับการดำเนินการข้อค
```
-
- - **react**: เพิ่ม/ลบรีแอ็กชัน tapback (`messageId`, `emoji`, `remove`). ชุด tapback ดั้งเดิมของ iMessage คือ `love`, `like`, `dislike`, `laugh`, `emphasize` และ `question`. เมื่อเอเจนต์เลือกอีโมจินอกชุดนั้น (เช่น `👀`) เครื่องมือรีแอ็กชันจะถอยกลับไปใช้ `love` เพื่อให้ tapback ยังคงแสดงผล แทนที่จะทำให้คำขอทั้งหมดล้มเหลว. รีแอ็กชัน ack ที่กำหนดค่าไว้ยังคงตรวจสอบอย่างเข้มงวดและแจ้งข้อผิดพลาดเมื่อพบค่าที่ไม่รู้จัก.
- - **edit**: แก้ไขข้อความที่ส่งแล้ว (`messageId`, `text`).
- - **unsend**: ยกเลิกการส่งข้อความ (`messageId`).
- - **reply**: ตอบกลับข้อความเฉพาะ (`messageId`, `text`, `to`).
- - **sendWithEffect**: ส่งพร้อมเอฟเฟกต์ iMessage (`text`, `to`, `effectId`).
- - **renameGroup**: เปลี่ยนชื่อแชตกลุ่ม (`chatGuid`, `displayName`).
- - **setGroupIcon**: ตั้งค่าไอคอน/รูปภาพของแชตกลุ่ม (`chatGuid`, `media`) — ไม่นิ่งบน macOS 26 Tahoe (API อาจส่งกลับว่าสำเร็จ แต่ไอคอนไม่ซิงก์).
- - **addParticipant**: เพิ่มบางคนเข้ากลุ่ม (`chatGuid`, `address`).
- - **removeParticipant**: ลบบางคนออกจากกลุ่ม (`chatGuid`, `address`).
- - **leaveGroup**: ออกจากแชตกลุ่ม (`chatGuid`).
- - **upload-file**: ส่งสื่อ/ไฟล์ (`to`, `buffer`, `filename`, `asVoice`).
- - บันทึกเสียง: ตั้งค่า `asVoice: true` พร้อมเสียง **MP3** หรือ **CAF** เพื่อส่งเป็นข้อความเสียง iMessage. BlueBubbles แปลง MP3 → CAF เมื่อส่งบันทึกเสียง.
- - ชื่อแฝงเดิม: `sendAttachment` ยังใช้งานได้ แต่ `upload-file` คือชื่อการดำเนินการมาตรฐาน.
+
+ - **react**: เพิ่ม/ลบปฏิกิริยา tapback (`messageId`, `emoji`, `remove`) ชุด tapback ดั้งเดิมของ iMessage คือ `love`, `like`, `dislike`, `laugh`, `emphasize` และ `question` เมื่อเอเจนต์เลือกอีโมจินอกชุดนั้น (เช่น `👀`) เครื่องมือปฏิกิริยาจะ fallback เป็น `love` เพื่อให้ tapback ยังแสดงผลแทนที่จะทำให้คำขอทั้งหมดล้มเหลว ปฏิกิริยา ack ที่กำหนดค่าไว้ยังตรวจสอบอย่างเข้มงวดและจะแจ้งข้อผิดพลาดเมื่อเจอค่าที่ไม่รู้จัก
+ - **edit**: แก้ไขข้อความที่ส่งแล้ว (`messageId`, `text`)
+ - **unsend**: ยกเลิกการส่งข้อความ (`messageId`)
+ - **reply**: ตอบกลับข้อความที่ระบุ (`messageId`, `text`, `to`)
+ - **sendWithEffect**: ส่งพร้อมเอฟเฟกต์ iMessage (`text`, `to`, `effectId`)
+ - **renameGroup**: เปลี่ยนชื่อแชตกลุ่ม (`chatGuid`, `displayName`)
+ - **setGroupIcon**: ตั้งค่าไอคอน/รูปภาพของแชตกลุ่ม (`chatGuid`, `media`) — ไม่เสถียรบน macOS 26 Tahoe (API อาจส่งคืนว่าสำเร็จ แต่ไอคอนไม่ซิงก์)
+ - **addParticipant**: เพิ่มบุคคลลงในกลุ่ม (`chatGuid`, `address`)
+ - **removeParticipant**: ลบบุคคลออกจากกลุ่ม (`chatGuid`, `address`)
+ - **leaveGroup**: ออกจากแชตกลุ่ม (`chatGuid`)
+ - **upload-file**: ส่งสื่อ/ไฟล์ (`to`, `buffer`, `filename`, `asVoice`)
+ - วอยซ์เมโม: ตั้งค่า `asVoice: true` พร้อมเสียง **MP3** หรือ **CAF** เพื่อส่งเป็นข้อความเสียง iMessage BlueBubbles แปลง MP3 → CAF เมื่อส่งวอยซ์เมโม
+ - นามแฝงเดิม: `sendAttachment` ยังใช้งานได้ แต่ `upload-file` คือชื่อการดำเนินการมาตรฐาน
### ID ข้อความ (แบบสั้นเทียบกับแบบเต็ม)
-OpenClaw อาจแสดง ID ข้อความแบบ _สั้น_ (เช่น `1`, `2`) เพื่อลดจำนวนโทเค็น.
+OpenClaw อาจแสดง ID ข้อความแบบ _สั้น_ (เช่น `1`, `2`) เพื่อประหยัดโทเคน
-- `MessageSid` / `ReplyToId` อาจเป็น ID แบบสั้น.
-- `MessageSidFull` / `ReplyToIdFull` มี ID แบบเต็มของผู้ให้บริการ.
-- ID แบบสั้นอยู่ในหน่วยความจำ; อาจหมดอายุเมื่อรีสตาร์ตหรือเมื่อแคชถูกขับออก.
-- การดำเนินการรับ `messageId` แบบสั้นหรือแบบเต็ม แต่ ID แบบสั้นจะเกิดข้อผิดพลาดถ้าไม่พร้อมใช้งานแล้ว.
+- `MessageSid` / `ReplyToId` อาจเป็น ID แบบสั้นได้
+- `MessageSidFull` / `ReplyToIdFull` มี ID แบบเต็มของผู้ให้บริการ
+- ID แบบสั้นอยู่ในหน่วยความจำ และอาจหมดอายุเมื่อรีสตาร์ทหรือเมื่อ cache ถูกขับออก
+- การดำเนินการยอมรับ `messageId` แบบสั้นหรือแบบเต็ม แต่ ID แบบสั้นจะแจ้งข้อผิดพลาดหากไม่มีให้ใช้แล้ว
-ใช้ ID แบบเต็มสำหรับระบบอัตโนมัติและพื้นที่จัดเก็บที่ต้องคงทน:
+ใช้ ID แบบเต็มสำหรับระบบอัตโนมัติและการจัดเก็บที่ต้องคงทน:
- เทมเพลต: `{{MessageSidFull}}`, `{{ReplyToIdFull}}`
-- บริบท: `MessageSidFull` / `ReplyToIdFull` ในเพย์โหลดขาเข้า
+- บริบท: `MessageSidFull` / `ReplyToIdFull` ใน payload ขาเข้า
-ดู [การกำหนดค่า](/th/gateway/configuration) สำหรับตัวแปรเทมเพลต.
+ดู [การกำหนดค่า](/th/gateway/configuration) สำหรับตัวแปรเทมเพลต
-## การรวม DM แบบ split-send (คำสั่ง + URL ในการเขียนครั้งเดียว)
+## รวม DM แบบส่งแยก (คำสั่ง + URL ในการเขียนข้อความครั้งเดียว)
-เมื่อผู้ใช้พิมพ์คำสั่งและ URL พร้อมกันใน iMessage — เช่น `Dump https://example.com/article` — Apple จะแยกการส่งเป็น **การส่ง Webhook สองรายการแยกกัน**:
+เมื่อผู้ใช้พิมพ์คำสั่งและ URL พร้อมกันใน iMessage — เช่น `Dump https://example.com/article` — Apple จะแยกการส่งเป็น **Webhook สองรายการแยกกัน**:
-1. ข้อความตัวอักษร (`"Dump"`).
-2. บอลลูนพรีวิว URL (`"https://..."`) พร้อมรูปภาพ OG-preview เป็นไฟล์แนบ.
+1. ข้อความตัวอักษร (`"Dump"`)
+2. บอลลูนตัวอย่าง URL (`"https://..."`) พร้อมรูปภาพตัวอย่าง OG เป็นไฟล์แนบ
-Webhook ทั้งสองรายการมาถึง OpenClaw ห่างกันประมาณ 0.8-2.0 วินาทีในชุดติดตั้งส่วนใหญ่. หากไม่มีการรวม เอเจนต์จะได้รับเฉพาะคำสั่งในเทิร์นที่ 1, ตอบกลับ (มักจะเป็น "ส่ง URL มาให้ฉัน"), และเห็น URL เฉพาะในเทิร์นที่ 2 — ซึ่ง ณ ตอนนั้นบริบทของคำสั่งหายไปแล้ว.
+Webhook ทั้งสองมาถึง OpenClaw ห่างกันประมาณ 0.8-2.0 วินาทีในชุดติดตั้งส่วนใหญ่ หากไม่มีการรวม เอเจนต์จะได้รับคำสั่งอย่างเดียวในเทิร์น 1 ตอบกลับ (มักเป็น "ส่ง URL มาให้ฉัน") และเห็น URL เฉพาะในเทิร์น 2 — ซึ่งตอนนั้นบริบทของคำสั่งหายไปแล้ว
-`channels.bluebubbles.coalesceSameSenderDms` เลือกให้ DM รวม Webhook จากผู้ส่งเดียวกันที่ต่อเนื่องกันเข้าเป็นเทิร์นเอเจนต์เดียว. แชตกลุ่มยังคงใช้คีย์ต่อข้อความเพื่อรักษาโครงสร้างเทิร์นของผู้ใช้หลายคน.
+`channels.bluebubbles.coalesceSameSenderDms` เลือกให้ DM รวม Webhook ต่อเนื่องจากผู้ส่งคนเดียวกันเป็นเทิร์นเอเจนต์เดียว แชตกลุ่มยังคง key ตามแต่ละข้อความเพื่อรักษาโครงสร้างเทิร์นแบบหลายผู้ใช้
-
+
เปิดใช้เมื่อ:
- - คุณส่ง Skills ที่คาดหวัง `command + payload` ในข้อความเดียว (dump, paste, save, queue ฯลฯ).
- - ผู้ใช้ของคุณวาง URL, รูปภาพ, หรือเนื้อหายาวพร้อมกับคำสั่ง.
- - คุณยอมรับความหน่วงของเทิร์น DM ที่เพิ่มขึ้นได้ (ดูด้านล่าง).
+ - คุณส่ง Skills ที่คาดหวัง `command + payload` ในข้อความเดียว (dump, paste, save, queue ฯลฯ)
+ - ผู้ใช้ของคุณวาง URL, รูปภาพ หรือเนื้อหายาวร่วมกับคำสั่ง
+ - คุณยอมรับ latency ของเทิร์น DM ที่เพิ่มขึ้นได้ (ดูด้านล่าง)
- ปิดไว้เมื่อ:
+ ปล่อยให้ปิดใช้เมื่อ:
- - คุณต้องการความหน่วงของคำสั่งต่ำสุดสำหรับตัวกระตุ้น DM แบบคำเดียว.
- - โฟลว์ทั้งหมดของคุณเป็นคำสั่งแบบครั้งเดียวจบที่ไม่มีเพย์โหลดตามมา.
+ - คุณต้องการ latency ต่ำสุดสำหรับทริกเกอร์ DM แบบคำเดียว
+ - flow ทั้งหมดของคุณเป็นคำสั่งครั้งเดียวที่ไม่มี payload ตามมา
-
+
```json5
{
channels: {
@@ -461,7 +453,7 @@ Webhook ทั้งสองรายการมาถึง OpenClaw ห่
}
```
- เมื่อเปิดแฟล็กและไม่มี `messages.inbound.byChannel.bluebubbles` ที่ระบุชัดเจน หน้าต่าง debounce จะขยายเป็น **2500 ms** (ค่าเริ่มต้นสำหรับกรณีที่ไม่รวมคือ 500 ms). จำเป็นต้องใช้หน้าต่างที่กว้างขึ้น — จังหวะ split-send ของ Apple ที่ 0.8-2.0 วินาทีไม่พอดีกับค่าเริ่มต้นที่แคบกว่า.
+ เมื่อเปิดแฟล็กและไม่มี `messages.inbound.byChannel.bluebubbles` ที่ระบุชัดเจน หน้าต่าง debounce จะขยายเป็น **2500 ms** (ค่าเริ่มต้นสำหรับแบบไม่รวมคือ 500 ms) จำเป็นต้องใช้หน้าต่างที่กว้างขึ้น — จังหวะการส่งแยกของ Apple ที่ 0.8-2.0 วินาทีไม่พอดีกับค่าเริ่มต้นที่แคบกว่า
หากต้องการปรับหน้าต่างเอง:
@@ -480,62 +472,62 @@ Webhook ทั้งสองรายการมาถึง OpenClaw ห่
```
-
- - **ความหน่วงที่เพิ่มขึ้นสำหรับคำสั่งควบคุม DM.** เมื่อเปิดแฟล็ก ข้อความคำสั่งควบคุม DM (เช่น `Dump`, `Save` ฯลฯ) จะรอได้ถึงหน้าต่าง debounce ก่อน dispatch เผื่อว่า Webhook เพย์โหลดกำลังจะมา. คำสั่งในแชตกลุ่มยังคง dispatch ทันที.
- - **เอาต์พุตที่รวมแล้วมีขอบเขตจำกัด** — ข้อความที่รวมแล้วจำกัดที่ 4000 อักขระพร้อมเครื่องหมาย `…[truncated]` ชัดเจน; ไฟล์แนบจำกัดที่ 20; รายการต้นทางจำกัดที่ 10 (เก็บรายการแรกพร้อมรายการล่าสุดเมื่อเกินกว่านั้น). `messageId` ของทุกต้นทางยังคงเข้าสู่ inbound-dedupe ดังนั้นการ replay ภายหลังของ MessagePoller สำหรับเหตุการณ์รายตัวใดๆ จะถูกจดจำว่าเป็นรายการซ้ำ.
- - **เลือกใช้เป็นรายช่องทาง.** ช่องทางอื่น (Telegram, WhatsApp, Slack, …) ไม่ได้รับผลกระทบ.
+
+ - **latency ที่เพิ่มขึ้นสำหรับคำสั่งควบคุม DM** เมื่อเปิดแฟล็ก ข้อความคำสั่งควบคุม DM (เช่น `Dump`, `Save` ฯลฯ) จะรอได้สูงสุดเท่าหน้าต่าง debounce ก่อน dispatch เผื่อมี Webhook payload กำลังมา คำสั่งในแชตกลุ่มยัง dispatch ทันที
+ - **เอาต์พุตที่รวมแล้วมีขอบเขตจำกัด** — ข้อความที่รวมกันจำกัดที่ 4000 อักขระพร้อมตัวทำเครื่องหมาย `…[truncated]` ที่ชัดเจน ไฟล์แนบจำกัดที่ 20 รายการ รายการ source จำกัดที่ 10 รายการ (เก็บรายการแรกพร้อมรายการล่าสุดเมื่อเกินกว่านั้น) `messageId` ของทุก source ยังไปถึง inbound-dedupe เพื่อให้การ replay ภายหลังของ MessagePoller สำหรับเหตุการณ์เดี่ยวใดๆ ถูกจดจำว่าเป็นข้อมูลซ้ำ
+ - **เลือกเปิดใช้ราย channel** channel อื่นๆ (Telegram, WhatsApp, Slack, …) ไม่ได้รับผลกระทบ
### สถานการณ์และสิ่งที่เอเจนต์เห็น
-| ผู้ใช้เขียน | Apple ส่งมอบ | ปิดแฟล็ก (ค่าเริ่มต้น) | เปิดแฟล็ก + หน้าต่าง 2500 ms |
+| ผู้ใช้เขียน | Apple ส่งมอบ | ปิดแฟล็ก (ค่าเริ่มต้น) | เปิดแฟล็ก + หน้าต่าง 2500 ms |
| ------------------------------------------------------------------ | ------------------------- | --------------------------------------- | ----------------------------------------------------------------------- |
-| `Dump https://example.com` (ส่งครั้งเดียว) | 2 Webhook ห่างกัน ~1 วินาที | สองเทิร์นเอเจนต์: มีแค่ "Dump", แล้วตามด้วย URL | หนึ่งเทิร์น: ข้อความที่รวม `Dump https://example.com` |
-| `Save this 📎image.jpg caption` (ไฟล์แนบ + ข้อความ) | 2 Webhook | สองเทิร์น | หนึ่งเทิร์น: ข้อความ + รูปภาพ |
-| `/status` (คำสั่งเดี่ยว) | 1 Webhook | dispatch ทันที | **รอได้ถึงหน้าต่าง แล้วจึง dispatch** |
-| วาง URL อย่างเดียว | 1 Webhook | dispatch ทันที | dispatch ทันที (มีรายการเดียวใน bucket) |
-| ส่งข้อความ + URL เป็นข้อความแยกกันโดยตั้งใจ ห่างกันหลายนาที | 2 Webhook นอกหน้าต่าง | สองเทิร์น | สองเทิร์น (หน้าต่างหมดอายุระหว่างสองรายการ) |
-| ส่ง DM ขนาดเล็กถี่มาก (>10 รายการภายในหน้าต่าง) | N Webhook | N เทิร์น | หนึ่งเทิร์น, เอาต์พุตมีขอบเขต (รายการแรก + ล่าสุด, ใช้เพดานข้อความ/ไฟล์แนบ) |
+| `Dump https://example.com` (ส่งครั้งเดียว) | 2 Webhook ห่างกันประมาณ 1 วินาที | สองเทิร์นเอเจนต์: "Dump" อย่างเดียว จากนั้น URL | หนึ่งเทิร์น: ข้อความที่รวมแล้ว `Dump https://example.com` |
+| `Save this 📎image.jpg caption` (ไฟล์แนบ + ข้อความ) | 2 Webhook | สองเทิร์น | หนึ่งเทิร์น: ข้อความ + รูปภาพ |
+| `/status` (คำสั่งเดี่ยว) | 1 Webhook | dispatch ทันที | **รอได้สูงสุดเท่าหน้าต่าง แล้วจึง dispatch** |
+| วาง URL เพียงอย่างเดียว | 1 Webhook | dispatch ทันที | dispatch ทันที (มีเพียงรายการเดียวใน bucket) |
+| ข้อความ + URL ที่ส่งเป็นข้อความแยกสองรายการโดยตั้งใจ ห่างกันหลายนาที | 2 Webhook นอกหน้าต่าง | สองเทิร์น | สองเทิร์น (หน้าต่างหมดอายุระหว่างกัน) |
+| ส่ง DM เล็กๆ ถี่มาก (>10 รายการในหน้าต่าง) | N Webhook | N เทิร์น | หนึ่งเทิร์น เอาต์พุตมีขอบเขตจำกัด (รายการแรก + ล่าสุด ใช้ขีดจำกัดข้อความ/ไฟล์แนบ) |
-### การแก้ปัญหาการรวม split-send
+### การแก้ปัญหาการรวมการส่งแยก
-หากเปิดแฟล็กแล้ว split-send ยังมาถึงเป็นสองเทิร์น ให้ตรวจสอบแต่ละชั้น:
+หากเปิดแฟล็กแล้ว แต่การส่งแยกยังมาถึงเป็นสองเทิร์น ให้ตรวจสอบแต่ละชั้น:
-
+
```
grep coalesceSameSenderDms ~/.openclaw/openclaw.json
```
- จากนั้น `openclaw gateway restart` — แฟล็กจะถูกอ่านตอนสร้าง debouncer-registry.
+ จากนั้น `openclaw gateway restart` — แฟล็กนี้ถูกอ่านตอนสร้าง debouncer-registry
-
- ดูบันทึกเซิร์ฟเวอร์ BlueBubbles ที่ `~/Library/Logs/bluebubbles-server/main.log`:
+
+ ดู log ของเซิร์ฟเวอร์ BlueBubbles ใต้ `~/Library/Logs/bluebubbles-server/main.log`:
```
grep -E "Dispatching event to webhook" main.log | tail -20
```
- วัดช่องว่างระหว่างการ dispatch ข้อความแบบ `"Dump"` กับการ dispatch `"https://..."; Attachments:` ที่ตามมา. เพิ่ม `messages.inbound.byChannel.bluebubbles` ให้ครอบคลุมช่องว่างนั้นอย่างสบาย.
+ วัดช่องว่างระหว่างการ dispatch ข้อความแบบ `"Dump"` กับการ dispatch `"https://..."; Attachments:` ที่ตามมา เพิ่ม `messages.inbound.byChannel.bluebubbles` ให้ครอบคลุมช่องว่างนั้นอย่างสบาย
-
- ไทม์สแตมป์เหตุการณ์ของเซสชัน (`~/.openclaw/agents//sessions/*.jsonl`) สะท้อนเวลาที่ Gateway ส่งข้อความให้เอเจนต์, **ไม่ใช่** เวลาที่ Webhook มาถึง. ข้อความที่สองในคิวซึ่งติดแท็ก `[Queued messages while agent was busy]` หมายความว่าเทิร์นแรกยังทำงานอยู่เมื่อ Webhook ที่สองมาถึง — bucket สำหรับรวมถูก flush ไปแล้ว. ปรับหน้าต่างโดยอ้างอิงบันทึกเซิร์ฟเวอร์ BB ไม่ใช่บันทึกเซสชัน.
+
+ timestamp ของเหตุการณ์ session (`~/.openclaw/agents//sessions/*.jsonl`) สะท้อนเวลาที่ Gateway ส่งข้อความให้เอเจนต์ **ไม่ใช่** เวลาที่ Webhook มาถึง ข้อความที่สองในคิวที่ติดแท็ก `[Queued messages while agent was busy]` หมายความว่าเทิร์นแรกยังทำงานอยู่เมื่อ Webhook ที่สองมาถึง — bucket รวมได้ flush ไปแล้ว ปรับหน้าต่างเทียบกับ log ของเซิร์ฟเวอร์ BB ไม่ใช่ log ของ session
-
- บนเครื่องขนาดเล็กกว่า (8 GB), เทิร์นเอเจนต์อาจใช้เวลานานพอที่ bucket สำหรับรวมจะ flush ก่อนการตอบกลับเสร็จ และ URL จะเข้ามาเป็นเทิร์นที่สองในคิว. ตรวจสอบ `memory_pressure` และ `ps -o rss -p $(pgrep openclaw-gateway)`; หาก Gateway ใช้ RSS เกิน ~500 MB และ compressor ทำงานอยู่ ให้ปิดกระบวนการหนักอื่นๆ หรือย้ายไปโฮสต์ที่ใหญ่ขึ้น.
+
+ บนเครื่องขนาดเล็ก (8 GB) เทิร์นเอเจนต์อาจใช้เวลานานพอที่ bucket รวมจะ flush ก่อนการตอบกลับเสร็จ และ URL จะตกเป็นเทิร์นที่สองในคิว ตรวจสอบ `memory_pressure` และ `ps -o rss -p $(pgrep openclaw-gateway)`; หาก Gateway เกินประมาณ 500 MB RSS และ compressor ทำงานอยู่ ให้ปิด process หนักอื่นๆ หรือย้ายไป host ที่ใหญ่กว่า
-
- หากผู้ใช้แตะ `Dump` เป็น **การตอบกลับ** บอลลูน URL ที่มีอยู่ (iMessage แสดงป้าย "1 Reply" บนบอลลูน Dump), URL จะอยู่ใน `replyToBody` ไม่ใช่ใน Webhook ที่สอง. การรวมใช้ไม่ได้ — นั่นเป็นเรื่องของ skill/prompt ไม่ใช่เรื่องของ debouncer.
+
+ หากผู้ใช้แตะ `Dump` เป็น **การตอบกลับ** บอลลูน URL ที่มีอยู่แล้ว (iMessage แสดง badge "1 Reply" บน bubble Dump) URL จะอยู่ใน `replyToBody` ไม่ใช่ใน Webhook ที่สอง การรวมใช้ไม่ได้ — นั่นเป็นเรื่องของ skill/prompt ไม่ใช่เรื่องของ debouncer
## การสตรีมแบบบล็อก
-ควบคุมว่าคำตอบจะถูกส่งเป็นข้อความเดียวหรือสตรีมเป็นบล็อก:
+ควบคุมว่าจะส่งคำตอบเป็นข้อความเดียวหรือสตรีมเป็นบล็อก:
```json5
{
@@ -549,98 +541,98 @@ Webhook ทั้งสองรายการมาถึง OpenClaw ห่
## สื่อ + ขีดจำกัด
-- ไฟล์แนบขาเข้าจะถูกดาวน์โหลดและจัดเก็บในแคชสื่อ.
-- เพดานสื่อผ่าน `channels.bluebubbles.mediaMaxMb` สำหรับสื่อขาเข้าและขาออก (ค่าเริ่มต้น: 8 MB).
-- ข้อความขาออกจะถูกแบ่งเป็นชิ้นตาม `channels.bluebubbles.textChunkLimit` (ค่าเริ่มต้น: 4000 อักขระ).
+- ไฟล์แนบขาเข้าจะถูกดาวน์โหลดและจัดเก็บใน cache สื่อ
+- ขีดจำกัดสื่อผ่าน `channels.bluebubbles.mediaMaxMb` สำหรับสื่อขาเข้าและขาออก (ค่าเริ่มต้น: 8 MB)
+- ข้อความขาออกจะถูกแบ่ง chunk ตาม `channels.bluebubbles.textChunkLimit` (ค่าเริ่มต้น: 4000 อักขระ)
-## ข้อมูลอ้างอิงการกำหนดค่า
+## อ้างอิงการกำหนดค่า
-การกำหนดค่าเต็ม: [การกำหนดค่า](/th/gateway/configuration)
+การกำหนดค่าทั้งหมด: [การกำหนดค่า](/th/gateway/configuration)
-
- - `channels.bluebubbles.enabled`: เปิด/ปิดใช้งานช่องทาง.
- - `channels.bluebubbles.serverUrl`: URL ฐานของ BlueBubbles REST API.
- - `channels.bluebubbles.password`: รหัสผ่าน API.
- - `channels.bluebubbles.webhookPath`: เส้นทางปลายทาง Webhook (ค่าเริ่มต้น: `/bluebubbles-webhook`).
+
+ - `channels.bluebubbles.enabled`: เปิด/ปิด channel
+ - `channels.bluebubbles.serverUrl`: URL ฐานของ BlueBubbles REST API
+ - `channels.bluebubbles.password`: รหัสผ่าน API
+ - `channels.bluebubbles.webhookPath`: path endpoint ของ Webhook (ค่าเริ่มต้น: `/bluebubbles-webhook`)
-
- - `channels.bluebubbles.dmPolicy`: `pairing | allowlist | open | disabled` (ค่าเริ่มต้น: `pairing`).
- - `channels.bluebubbles.allowFrom`: allowlist ของ DM (handles, อีเมล, หมายเลข E.164, `chat_id:*`, `chat_guid:*`).
- - `channels.bluebubbles.groupPolicy`: `open | allowlist | disabled` (ค่าเริ่มต้น: `allowlist`).
- - `channels.bluebubbles.groupAllowFrom`: allowlist ของผู้ส่งกลุ่ม.
- - `channels.bluebubbles.enrichGroupParticipantsFromContacts`: บน macOS, เลือกเพิ่มข้อมูลผู้เข้าร่วมกลุ่มที่ไม่มีชื่อจาก Contacts ในเครื่องหลังผ่านการคัดกรอง. ค่าเริ่มต้น: `false`.
- - `channels.bluebubbles.groups`: การกำหนดค่าแบบรายกลุ่ม (`requireMention` ฯลฯ).
+
+ - `channels.bluebubbles.dmPolicy`: `pairing | allowlist | open | disabled` (ค่าเริ่มต้น: `pairing`)
+ - `channels.bluebubbles.allowFrom`: allowlist ของ DM (handles, emails, หมายเลข E.164, `chat_id:*`, `chat_guid:*`)
+ - `channels.bluebubbles.groupPolicy`: `open | allowlist | disabled` (ค่าเริ่มต้น: `allowlist`)
+ - `channels.bluebubbles.groupAllowFrom`: allowlist ของผู้ส่งในกลุ่ม
+ - `channels.bluebubbles.enrichGroupParticipantsFromContacts`: บน macOS เลือกเติมข้อมูลผู้เข้าร่วมกลุ่มที่ไม่มีชื่อจาก Contacts ในเครื่องหลังผ่าน gating แล้ว ค่าเริ่มต้น: `false`
+ - `channels.bluebubbles.groups`: config รายกลุ่ม (`requireMention` ฯลฯ)
-
- - `channels.bluebubbles.sendReadReceipts`: ส่งใบตอบรับการอ่าน (ค่าเริ่มต้น: `true`)
- - `channels.bluebubbles.blockStreaming`: เปิดใช้การสตรีมแบบบล็อก (ค่าเริ่มต้น: `false`; จำเป็นสำหรับการตอบกลับแบบสตรีม)
- - `channels.bluebubbles.textChunkLimit`: ขนาดชิ้นข้อมูลขาออกเป็นจำนวนอักขระ (ค่าเริ่มต้น: 4000)
- - `channels.bluebubbles.sendTimeoutMs`: ระยะหมดเวลาต่อคำขอเป็นมิลลิวินาทีสำหรับการส่งข้อความขาออกผ่าน `/api/v1/message/text` (ค่าเริ่มต้น: 30000) เพิ่มค่านี้ในการตั้งค่า macOS 26 ที่การส่ง iMessage ผ่าน Private API อาจค้างอยู่ในเฟรมเวิร์ก iMessage ได้นานกว่า 60 วินาที เช่น `45000` หรือ `60000` ขณะนี้โพรบ การค้นหาแชต รีแอ็กชัน การแก้ไข และการตรวจสุขภาพยังคงใช้ค่าเริ่มต้นที่สั้นกว่า 10 วินาที มีแผนจะขยายความครอบคลุมไปยังรีแอ็กชันและการแก้ไขในงานติดตามผล การตั้งค่าทับเฉพาะบัญชี: `channels.bluebubbles.accounts..sendTimeoutMs`
- - `channels.bluebubbles.chunkMode`: `length` (ค่าเริ่มต้น) แยกเฉพาะเมื่อเกิน `textChunkLimit`; `newline` แยกตามบรรทัดว่าง (ขอบเขตย่อหน้า) ก่อนแบ่งชิ้นตามความยาว
+
+ - `channels.bluebubbles.sendReadReceipts`: ส่งใบตอบรับว่าอ่านแล้ว (ค่าเริ่มต้น: `true`).
+ - `channels.bluebubbles.blockStreaming`: เปิดใช้ block streaming (ค่าเริ่มต้น: `false`; จำเป็นสำหรับการตอบกลับแบบสตรีม).
+ - `channels.bluebubbles.textChunkLimit`: ขนาดส่วนข้อความขาออกเป็นจำนวนอักขระ (ค่าเริ่มต้น: 4000).
+ - `channels.bluebubbles.sendTimeoutMs`: เวลาหมดเวลาต่อคำขอเป็นมิลลิวินาทีสำหรับการส่งข้อความขาออกผ่าน `/api/v1/message/text` (ค่าเริ่มต้น: 30000). เพิ่มค่านี้ในการตั้งค่า macOS 26 ที่การส่ง Private API iMessage อาจค้างอยู่ภายในเฟรมเวิร์ก iMessage นานกว่า 60 วินาที; ตัวอย่างเช่น `45000` หรือ `60000`. โพรบ การค้นหาแชท รีแอ็กชัน การแก้ไข และการตรวจสุขภาพยังคงใช้ค่าเริ่มต้นที่สั้นกว่า 10 วินาทีในปัจจุบัน; มีแผนจะขยายความครอบคลุมไปยังรีแอ็กชันและการแก้ไขเป็นงานติดตามผล. การแทนที่ต่อบัญชี: `channels.bluebubbles.accounts..sendTimeoutMs`.
+ - `channels.bluebubbles.chunkMode`: `length` (ค่าเริ่มต้น) จะแยกเฉพาะเมื่อเกิน `textChunkLimit`; `newline` จะแยกตามบรรทัดว่าง (ขอบเขตย่อหน้า) ก่อนการแบ่งส่วนตามความยาว.
- - `channels.bluebubbles.mediaMaxMb`: ขีดจำกัดสื่อขาเข้า/ขาออกเป็น MB (ค่าเริ่มต้น: 8)
- - `channels.bluebubbles.mediaLocalRoots`: รายการอนุญาตแบบชัดเจนของไดเรกทอรีภายในเครื่องแบบสัมบูรณ์ที่อนุญาตสำหรับเส้นทางสื่อภายในเครื่องขาออก การส่งเส้นทางภายในเครื่องจะถูกปฏิเสธโดยค่าเริ่มต้น เว้นแต่จะกำหนดค่านี้ไว้ การตั้งค่าทับเฉพาะบัญชี: `channels.bluebubbles.accounts..mediaLocalRoots`
- - `channels.bluebubbles.coalesceSameSenderDms`: รวม Webhook ของ DM จากผู้ส่งเดียวกันที่ต่อเนื่องกันให้เป็นเทิร์นเดียวของเอเจนต์ เพื่อให้การส่งแยกข้อความ+URL ของ Apple มาถึงเป็นข้อความเดียว (ค่าเริ่มต้น: `false`) ดู [การรวม DM ที่ถูกส่งแยก](#coalescing-split-send-dms-command--url-in-one-composition) สำหรับสถานการณ์ การปรับหน้าต่างเวลา และข้อแลกเปลี่ยน เมื่อเปิดใช้โดยไม่มี `messages.inbound.byChannel.bluebubbles` ที่ระบุชัดเจน จะขยายหน้าต่างดีบาวซ์ขาเข้าเริ่มต้นจาก 500 ms เป็น 2500 ms
- - `channels.bluebubbles.historyLimit`: จำนวนข้อความกลุ่มสูงสุดสำหรับบริบท (0 ปิดใช้)
- - `channels.bluebubbles.dmHistoryLimit`: ขีดจำกัดประวัติ DM
- - `channels.bluebubbles.replyContextApiFallback`: เมื่อการตอบกลับขาเข้ามาถึงโดยไม่มี `replyToBody`/`replyToSender` และแคชบริบทการตอบกลับในหน่วยความจำไม่พบ ให้ดึงข้อความต้นฉบับจาก BlueBubbles HTTP API เป็นทางสำรองแบบพยายามให้ดีที่สุด (ค่าเริ่มต้น: `false`) มีประโยชน์สำหรับการปรับใช้หลายอินสแตนซ์ที่ใช้บัญชี BlueBubbles เดียวกัน หลังรีสตาร์ทโปรเซส หรือหลังแคช TTL/LRU ที่มีอายุยาวถูกขับออก การดึงนี้มีการป้องกัน SSRF ด้วยนโยบายเดียวกับคำขอไคลเอนต์ BlueBubbles อื่นทั้งหมด ไม่โยนข้อผิดพลาด และเติมแคชเพื่อให้การตอบกลับครั้งถัดไปเฉลี่ยต้นทุนได้ การตั้งค่าทับเฉพาะบัญชี: `channels.bluebubbles.accounts..replyContextApiFallback` การตั้งค่าระดับช่องทางจะเผยแพร่ไปยังบัญชีที่ไม่ได้ระบุแฟล็กนี้
+ - `channels.bluebubbles.mediaMaxMb`: ขีดจำกัดสื่อขาเข้า/ขาออกเป็น MB (ค่าเริ่มต้น: 8).
+ - `channels.bluebubbles.mediaLocalRoots`: allowlist แบบระบุชัดเจนของไดเรกทอรีภายในเครื่องแบบ absolute ที่อนุญาตสำหรับพาธสื่อขาออกภายในเครื่อง. การส่งพาธภายในเครื่องจะถูกปฏิเสธโดยค่าเริ่มต้น เว้นแต่จะกำหนดค่านี้ไว้. การแทนที่ต่อบัญชี: `channels.bluebubbles.accounts..mediaLocalRoots`.
+ - `channels.bluebubbles.coalesceSameSenderDms`: รวม Webhook DM ต่อเนื่องจากผู้ส่งเดียวกันให้เป็นหนึ่งรอบของเอเจนต์ เพื่อให้การส่งแบบแยกข้อความ+URL ของ Apple มาถึงเป็นข้อความเดียว (ค่าเริ่มต้น: `false`). ดู [การรวม DM ที่ส่งแบบแยก](#coalescing-split-send-dms-command--url-in-one-composition) สำหรับสถานการณ์ การปรับหน้าต่างเวลา และข้อแลกเปลี่ยน. ขยายหน้าต่าง debounce ขาเข้าเริ่มต้นจาก 500 ms เป็น 2500 ms เมื่อเปิดใช้โดยไม่มี `messages.inbound.byChannel.bluebubbles` ที่ระบุชัดเจน.
+ - `channels.bluebubbles.historyLimit`: จำนวนข้อความกลุ่มสูงสุดสำหรับบริบท (0 คือปิดใช้).
+ - `channels.bluebubbles.dmHistoryLimit`: ขีดจำกัดประวัติ DM.
+ - `channels.bluebubbles.replyContextApiFallback`: เมื่อคำตอบขาเข้ามาถึงโดยไม่มี `replyToBody`/`replyToSender` และแคชบริบทคำตอบในหน่วยความจำไม่พบข้อมูล ให้ดึงข้อความต้นฉบับจาก BlueBubbles HTTP API เป็นทางเลือกสำรองแบบพยายามเต็มที่ (ค่าเริ่มต้น: `false`). มีประโยชน์สำหรับการปรับใช้หลายอินสแตนซ์ที่แชร์บัญชี BlueBubbles เดียวกัน หลังรีสตาร์ตโปรเซส หรือหลังการขับข้อมูลออกจากแคช TTL/LRU ที่มีอายุยาว. การดึงข้อมูลถูกป้องกัน SSRF ด้วยนโยบายเดียวกับทุกคำขอไคลเอนต์ BlueBubbles อื่นๆ ไม่ throw และเติมแคชเพื่อให้คำตอบถัดไปใช้ต้นทุนเฉลี่ยลดลง. การแทนที่ต่อบัญชี: `channels.bluebubbles.accounts..replyContextApiFallback`. การตั้งค่าระดับช่องทางจะเผยแพร่ไปยังบัญชีที่ไม่ได้ระบุแฟล็กนี้.
- - `channels.bluebubbles.actions`: เปิด/ปิดการดำเนินการเฉพาะรายการ
- - `channels.bluebubbles.accounts`: การกำหนดค่าหลายบัญชี
+ - `channels.bluebubbles.actions`: เปิด/ปิดการดำเนินการเฉพาะ.
+ - `channels.bluebubbles.accounts`: การกำหนดค่าหลายบัญชี.
ตัวเลือกส่วนกลางที่เกี่ยวข้อง:
-- `agents.list[].groupChat.mentionPatterns` (หรือ `messages.groupChat.mentionPatterns`)
-- `messages.responsePrefix`
+- `agents.list[].groupChat.mentionPatterns` (หรือ `messages.groupChat.mentionPatterns`).
+- `messages.responsePrefix`.
-## การระบุที่อยู่ / เป้าหมายการส่ง
+## การระบุที่อยู่ / เป้าหมายการส่งมอบ
-แนะนำให้ใช้ `chat_guid` เพื่อการกำหนดเส้นทางที่เสถียร:
+ควรใช้ `chat_guid` สำหรับการกำหนดเส้นทางที่เสถียร:
- `chat_guid:iMessage;-;+15555550123` (แนะนำสำหรับกลุ่ม)
- `chat_id:123`
- `chat_identifier:...`
- แฮนเดิลโดยตรง: `+15555550123`, `user@example.com`
- - หากแฮนเดิลโดยตรงไม่มีแชต DM อยู่แล้ว OpenClaw จะสร้างให้ผ่าน `POST /api/v1/chat/new` ซึ่งต้องเปิดใช้ BlueBubbles Private API
+ - หากแฮนเดิลโดยตรงไม่มีแชท DM อยู่แล้ว OpenClaw จะสร้างผ่าน `POST /api/v1/chat/new`. สิ่งนี้จำเป็นต้องเปิดใช้ BlueBubbles Private API.
### การกำหนดเส้นทาง iMessage เทียบกับ SMS
-เมื่อแฮนเดิลเดียวกันมีทั้งแชต iMessage และ SMS บน Mac (เช่น หมายเลขโทรศัพท์ที่ลงทะเบียน iMessage แล้ว แต่เคยได้รับข้อความสำรองแบบฟองเขียวด้วย) OpenClaw จะเลือกแชต iMessage และจะไม่ลดระดับเป็น SMS อย่างเงียบ ๆ หากต้องการบังคับใช้แชต SMS ให้ใช้คำนำหน้าเป้าหมาย `sms:` อย่างชัดเจน (เช่น `sms:+15555550123`) แฮนเดิลที่ไม่มีแชต iMessage ที่ตรงกันจะยังส่งผ่านแชตใดก็ตามที่ BlueBubbles รายงาน
+เมื่อแฮนเดิลเดียวกันมีทั้งแชท iMessage และ SMS บน Mac (เช่น หมายเลขโทรศัพท์ที่ลงทะเบียนกับ iMessage แต่เคยได้รับ fallback แบบฟองสีเขียวด้วย) OpenClaw จะเลือกแชท iMessage และจะไม่ลดระดับเป็น SMS โดยเงียบๆ. หากต้องการบังคับใช้แชท SMS ให้ใช้คำนำหน้าเป้าหมาย `sms:` แบบระบุชัดเจน (เช่น `sms:+15555550123`). แฮนเดิลที่ไม่มีแชท iMessage ตรงกันจะยังส่งผ่านแชทใดก็ตามที่ BlueBubbles รายงาน.
## ความปลอดภัย
-- คำขอ Webhook ได้รับการยืนยันตัวตนโดยเปรียบเทียบพารามิเตอร์คำค้นหรือส่วนหัว `guid`/`password` กับ `channels.bluebubbles.password`
-- เก็บรหัสผ่าน API และปลายทาง Webhook เป็นความลับ (ปฏิบัติต่อสิ่งเหล่านี้เหมือนข้อมูลรับรอง)
-- ไม่มีการข้ามการยืนยันตัวตน Webhook ของ BlueBubbles สำหรับ localhost หากคุณพร็อกซีทราฟฟิก Webhook ให้คงรหัสผ่าน BlueBubbles ไว้ในคำขอตลอดทาง `gateway.trustedProxies` ไม่ได้แทนที่ `channels.bluebubbles.password` ที่นี่ ดู [ความปลอดภัยของ Gateway](/th/gateway/security#reverse-proxy-configuration)
-- เปิดใช้ HTTPS + กฎไฟร์วอลล์บนเซิร์ฟเวอร์ BlueBubbles หากเปิดให้เข้าถึงจากภายนอก LAN ของคุณ
+- คำขอ Webhook จะได้รับการยืนยันตัวตนโดยเปรียบเทียบพารามิเตอร์คิวรีหรือเฮดเดอร์ `guid`/`password` กับ `channels.bluebubbles.password`.
+- เก็บรหัสผ่าน API และปลายทาง Webhook เป็นความลับ (ปฏิบัติกับสิ่งเหล่านี้เหมือนข้อมูลรับรอง).
+- ไม่มีการข้ามการยืนยันตัวตน Webhook ของ BlueBubbles สำหรับ localhost. หากคุณพร็อกซีทราฟฟิก Webhook ให้คงรหัสผ่าน BlueBubbles ไว้ในคำขอตลอดเส้นทาง. `gateway.trustedProxies` ไม่ได้แทนที่ `channels.bluebubbles.password` ที่นี่. ดู [ความปลอดภัยของ Gateway](/th/gateway/security#reverse-proxy-configuration).
+- เปิดใช้ HTTPS + กฎไฟร์วอลล์บนเซิร์ฟเวอร์ BlueBubbles หากเปิดเผยออกนอก LAN ของคุณ.
## การแก้ไขปัญหา
-- หากเหตุการณ์กำลังพิมพ์/อ่านหยุดทำงาน ให้ตรวจสอบบันทึก Webhook ของ BlueBubbles และยืนยันว่าเส้นทาง Gateway ตรงกับ `channels.bluebubbles.webhookPath`
-- โค้ดการจับคู่หมดอายุหลังหนึ่งชั่วโมง; ใช้ `openclaw pairing list bluebubbles` และ `openclaw pairing approve bluebubbles `
-- รีแอ็กชันต้องใช้ BlueBubbles private API (`POST /api/v1/message/react`); ตรวจสอบให้แน่ใจว่าเวอร์ชันเซิร์ฟเวอร์เปิดเผย API นี้
-- การแก้ไข/ยกเลิกการส่งต้องใช้ macOS 13+ และเวอร์ชันเซิร์ฟเวอร์ BlueBubbles ที่เข้ากันได้ บน macOS 26 (Tahoe) ขณะนี้การแก้ไขใช้งานไม่ได้เนื่องจากการเปลี่ยนแปลงของ private API
-- การอัปเดตไอคอนกลุ่มอาจไม่เสถียรบน macOS 26 (Tahoe): API อาจคืนค่าสำเร็จแต่ไอคอนใหม่ไม่ซิงก์
-- OpenClaw ซ่อนการดำเนินการที่ทราบว่าเสียโดยอัตโนมัติตามเวอร์ชัน macOS ของเซิร์ฟเวอร์ BlueBubbles หากการแก้ไขยังปรากฏบน macOS 26 (Tahoe) ให้ปิดใช้ด้วยตนเองโดยใช้ `channels.bluebubbles.actions.edit=false`
-- เปิดใช้ `coalesceSameSenderDms` แล้วแต่การส่งแยก (เช่น `Dump` + URL) ยังมาถึงเป็นสองเทิร์น: ดูรายการตรวจสอบ [การแก้ไขปัญหาการรวมการส่งแยก](#split-send-coalescing-troubleshooting) — สาเหตุทั่วไปคือหน้าต่างดีบาวซ์แคบเกินไป การอ่านเวลาประทับในบันทึกเซสชันผิดว่าเป็นเวลาที่ Webhook มาถึง หรือการส่งแบบอ้างอิงคำตอบ (ซึ่งใช้ `replyToBody` ไม่ใช่ Webhook ที่สอง)
-- สำหรับข้อมูลสถานะ/สุขภาพ: `openclaw status --all` หรือ `openclaw status --deep`
+- หากอีเวนต์การพิมพ์/อ่านหยุดทำงาน ให้ตรวจสอบล็อก Webhook ของ BlueBubbles และยืนยันว่าพาธ Gateway ตรงกับ `channels.bluebubbles.webhookPath`.
+- รหัสจับคู่หมดอายุหลังจากหนึ่งชั่วโมง; ใช้ `openclaw pairing list bluebubbles` และ `openclaw pairing approve bluebubbles `.
+- รีแอ็กชันต้องใช้ BlueBubbles private API (`POST /api/v1/message/react`); ตรวจสอบให้แน่ใจว่าเวอร์ชันเซิร์ฟเวอร์เปิดเผย API นี้.
+- การแก้ไข/ยกเลิกการส่งต้องใช้ macOS 13+ และเวอร์ชันเซิร์ฟเวอร์ BlueBubbles ที่เข้ากันได้. บน macOS 26 (Tahoe) การแก้ไขยังใช้ไม่ได้ในปัจจุบันเนื่องจากการเปลี่ยนแปลง private API.
+- การอัปเดตไอคอนกลุ่มอาจไม่เสถียรบน macOS 26 (Tahoe): API อาจคืนค่าสำเร็จแต่ไอคอนใหม่ไม่ซิงค์.
+- OpenClaw ซ่อนการดำเนินการที่ทราบว่าใช้งานไม่ได้โดยอัตโนมัติตามเวอร์ชัน macOS ของเซิร์ฟเวอร์ BlueBubbles. หากการแก้ไขยังปรากฏบน macOS 26 (Tahoe) ให้ปิดใช้ด้วยตนเองด้วย `channels.bluebubbles.actions.edit=false`.
+- เปิดใช้ `coalesceSameSenderDms` แล้วแต่การส่งแบบแยก (เช่น `Dump` + URL) ยังมาถึงเป็นสองรอบ: ดูเช็กลิสต์ [การแก้ไขปัญหาการรวมการส่งแบบแยก](#split-send-coalescing-troubleshooting) — สาเหตุทั่วไปคือหน้าต่าง debounce แคบเกินไป, อ่าน timestamp ของ session-log ผิดว่าเป็นเวลาที่ Webhook มาถึง, หรือการส่ง reply-quote (ซึ่งใช้ `replyToBody` ไม่ใช่ Webhook ที่สอง).
+- สำหรับข้อมูลสถานะ/สุขภาพ: `openclaw status --all` หรือ `openclaw status --deep`.
-สำหรับข้อมูลอ้างอิงเวิร์กโฟลว์ช่องทางทั่วไป ดูคู่มือ [Channels](/th/channels) และ [Plugins](/th/tools/plugin)
+สำหรับข้อมูลอ้างอิงเวิร์กโฟลว์ช่องทางทั่วไป ดูคู่มือ [Channels](/th/channels) และ [Plugins](/th/tools/plugin).
## ที่เกี่ยวข้อง
- [การกำหนดเส้นทางช่องทาง](/th/channels/channel-routing) — การกำหนดเส้นทางเซสชันสำหรับข้อความ
-- [ภาพรวม Channels](/th/channels) — ช่องทางที่รองรับทั้งหมด
-- [Groups](/th/channels/groups) — พฤติกรรมแชตกลุ่มและการควบคุมการกล่าวถึง
+- [ภาพรวมช่องทาง](/th/channels) — ช่องทางที่รองรับทั้งหมด
+- [กลุ่ม](/th/channels/groups) — พฤติกรรมแชทกลุ่มและการควบคุมด้วยการกล่าวถึง
- [การจับคู่](/th/channels/pairing) — การยืนยันตัวตน DM และโฟลว์การจับคู่
- [ความปลอดภัย](/th/gateway/security) — โมเดลการเข้าถึงและการเสริมความแข็งแกร่ง
diff --git a/docs/th/channels/broadcast-groups.md b/docs/th/channels/broadcast-groups.md
index 2db071c1c..1aae420b4 100644
--- a/docs/th/channels/broadcast-groups.md
+++ b/docs/th/channels/broadcast-groups.md
@@ -1,37 +1,37 @@
---
read_when:
- - การกำหนดค่ากลุ่มการกระจายข้อความ
+ - การกำหนดค่ากลุ่มกระจายข้อความ
- การดีบักการตอบกลับแบบหลายเอเจนต์ใน WhatsApp
sidebarTitle: Broadcast groups
status: experimental
-summary: กระจายข้อความ WhatsApp ไปยังเอเจนต์หลายตัว
-title: กลุ่มบรอดแคสต์
+summary: ส่งข้อความ WhatsApp แบบกระจายไปยังเอเจนต์หลายตัว
+title: กลุ่มกระจายข้อความ
x-i18n:
- generated_at: "2026-04-30T09:35:39Z"
+ generated_at: "2026-05-04T02:21:38Z"
model: gpt-5.5
provider: openai
- source_hash: b0de4ccc85bf79e2ceb1dddd60db067309b15b7f876c92e7d591ff0b4b4315ec
+ source_hash: eab43d3c3ffddb360340469433d74a380fbab98e662b2463a54f62eafc375b55
source_path: channels/broadcast-groups.md
workflow: 16
---
-**สถานะ:** ทดลองใช้ เพิ่มใน 2026.1.9
+**สถานะ:** ทดลอง เพิ่มใน 2026.1.9
## ภาพรวม
-Broadcast Groups ช่วยให้หลายเอเจนต์ประมวลผลและตอบกลับข้อความเดียวกันพร้อมกันได้ ซึ่งช่วยให้คุณสร้างทีมเอเจนต์เฉพาะทางที่ทำงานร่วมกันในกลุ่ม WhatsApp หรือ DM เดียวได้ โดยทั้งหมดใช้หมายเลขโทรศัพท์เดียว
+กลุ่มบรอดคาสต์ช่วยให้เอเจนต์หลายตัวประมวลผลและตอบกลับข้อความเดียวกันได้พร้อมกัน วิธีนี้ช่วยให้คุณสร้างทีมเอเจนต์เฉพาะทางที่ทำงานร่วมกันในกลุ่ม WhatsApp หรือ DM เดียว โดยทั้งหมดใช้หมายเลขโทรศัพท์เดียว
ขอบเขตปัจจุบัน: **เฉพาะ WhatsApp เท่านั้น** (ช่องทางเว็บ)
-Broadcast groups จะถูกประเมินหลังจาก allowlist ของช่องทางและกฎการเปิดใช้งานกลุ่ม ในกลุ่ม WhatsApp หมายความว่าการ broadcast จะเกิดขึ้นเมื่อ OpenClaw โดยปกติจะตอบกลับ (เช่น เมื่อถูกกล่าวถึง ขึ้นอยู่กับการตั้งค่ากลุ่มของคุณ)
+กลุ่มบรอดคาสต์จะถูกประเมินหลังจากรายการอนุญาตของช่องทางและกฎการเปิดใช้งานกลุ่ม ในกลุ่ม WhatsApp หมายความว่าการบรอดคาสต์จะเกิดขึ้นเมื่อ OpenClaw ปกติควรตอบกลับ (เช่น เมื่อถูกกล่าวถึง ขึ้นอยู่กับการตั้งค่ากลุ่มของคุณ)
## กรณีการใช้งาน
- ปรับใช้หลายเอเจนต์ที่มีความรับผิดชอบแบบเจาะจงและโฟกัสชัดเจน:
+ ปรับใช้เอเจนต์หลายตัวที่มีความรับผิดชอบแบบแยกย่อยและชัดเจน:
```
Group: "Development Team"
@@ -42,7 +42,7 @@ Broadcast groups จะถูกประเมินหลังจาก allow
- TestGenerator (suggests test cases)
```
- แต่ละเอเจนต์จะประมวลผลข้อความเดียวกันและให้มุมมองเฉพาะทางของตนเอง
+ เอเจนต์แต่ละตัวจะประมวลผลข้อความเดียวกันและให้มุมมองเฉพาะทางของตน
@@ -62,7 +62,7 @@ Broadcast groups จะถูกประเมินหลังจาก allow
- QAAgent (reviews quality, only responds if issues found)
```
-
+
```
Group: "Project Management"
Agents:
@@ -77,10 +77,10 @@ Broadcast groups จะถูกประเมินหลังจาก allow
### การตั้งค่าพื้นฐาน
-เพิ่มส่วน `broadcast` ที่ระดับบนสุด (ถัดจาก `bindings`) คีย์คือ peer id ของ WhatsApp:
+เพิ่มส่วน `broadcast` ระดับบนสุด (ถัดจาก `bindings`) คีย์คือ WhatsApp peer ids:
- แชตกลุ่ม: group JID (เช่น `120363403215116621@g.us`)
-- DM: หมายเลขโทรศัพท์แบบ E.164 (เช่น `+15551234567`)
+- DM: หมายเลขโทรศัพท์ E.164 (เช่น `+15551234567`)
```json
{
@@ -90,7 +90,7 @@ Broadcast groups จะถูกประเมินหลังจาก allow
}
```
-**ผลลัพธ์:** เมื่อ OpenClaw จะตอบกลับในแชตนี้ ระบบจะเรียกใช้เอเจนต์ทั้งสามตัว
+**ผลลัพธ์:** เมื่อ OpenClaw ควรตอบกลับในแชตนี้ ระบบจะรันเอเจนต์ทั้งสามตัว
### กลยุทธ์การประมวลผล
@@ -111,7 +111,7 @@ Broadcast groups จะถูกประเมินหลังจาก allow
- เอเจนต์ประมวลผลตามลำดับ (ตัวหนึ่งรอให้ตัวก่อนหน้าทำงานเสร็จก่อน):
+ เอเจนต์ประมวลผลตามลำดับ (ตัวหนึ่งรอให้ตัวก่อนหน้าทำงานเสร็จ):
```json
{
@@ -125,7 +125,7 @@ Broadcast groups จะถูกประเมินหลังจาก allow
-### ตัวอย่างครบถ้วน
+### ตัวอย่างแบบสมบูรณ์
```json
{
@@ -165,46 +165,46 @@ Broadcast groups จะถูกประเมินหลังจาก allow
### ลำดับการไหลของข้อความ
-
- ข้อความกลุ่ม WhatsApp หรือ DM เข้ามา
+
+ ข้อความกลุ่ม WhatsApp หรือ DM มาถึง
-
+
ระบบตรวจสอบว่า peer ID อยู่ใน `broadcast` หรือไม่
-
+
- เอเจนต์ทั้งหมดที่ระบุไว้จะประมวลผลข้อความ
- - แต่ละเอเจนต์มีคีย์เซสชันและบริบทที่แยกกัน
+ - เอเจนต์แต่ละตัวมีคีย์เซสชันและบริบทที่แยกจากกัน
- เอเจนต์ประมวลผลแบบขนาน (ค่าเริ่มต้น) หรือตามลำดับ
-
+
ใช้การกำหนดเส้นทางปกติ (binding แรกที่ตรงกัน)
-Broadcast groups จะไม่ข้าม allowlist ของช่องทางหรือกฎการเปิดใช้งานกลุ่ม (การกล่าวถึง/คำสั่ง/ฯลฯ) แต่จะเปลี่ยนเฉพาะ _เอเจนต์ใดที่ถูกเรียกใช้_ เมื่อข้อความมีสิทธิ์ถูกประมวลผล
+กลุ่มบรอดคาสต์ไม่ข้ามรายการอนุญาตของช่องทางหรือกฎการเปิดใช้งานกลุ่ม (การกล่าวถึง/คำสั่ง/ฯลฯ) กลุ่มเหล่านี้เปลี่ยนเฉพาะ _เอเจนต์ตัวใดที่จะรัน_ เมื่อข้อความมีสิทธิ์ถูกประมวลผล
### การแยกเซสชัน
-แต่ละเอเจนต์ใน broadcast group จะรักษาสิ่งต่อไปนี้แยกจากกันโดยสมบูรณ์:
+เอเจนต์แต่ละตัวในกลุ่มบรอดคาสต์จะรักษาสิ่งต่อไปนี้แยกจากกันโดยสมบูรณ์:
- **คีย์เซสชัน** (`agent:alfred:whatsapp:group:120363...` เทียบกับ `agent:baerbel:whatsapp:group:120363...`)
-- **ประวัติการสนทนา** (เอเจนต์ไม่เห็นข้อความของเอเจนต์อื่น)
+- **ประวัติการสนทนา** (เอเจนต์จะไม่เห็นข้อความของเอเจนต์อื่น)
- **เวิร์กสเปซ** (sandbox แยกกันหากกำหนดค่าไว้)
- **การเข้าถึงเครื่องมือ** (รายการอนุญาต/ปฏิเสธต่างกัน)
- **หน่วยความจำ/บริบท** (IDENTITY.md, SOUL.md ฯลฯ แยกกัน)
-- **บัฟเฟอร์บริบทกลุ่ม** (ข้อความกลุ่มล่าสุดที่ใช้เป็นบริบท) ใช้ร่วมกันต่อ peer ดังนั้นเอเจนต์ broadcast ทั้งหมดจะเห็นบริบทเดียวกันเมื่อถูกกระตุ้น
+- **บัฟเฟอร์บริบทกลุ่ม** (ข้อความกลุ่มล่าสุดที่ใช้เป็นบริบท) ถูกแชร์ต่อ peer ดังนั้นเอเจนต์บรอดคาสต์ทั้งหมดจะเห็นบริบทเดียวกันเมื่อถูกทริกเกอร์
-สิ่งนี้ช่วยให้แต่ละเอเจนต์มี:
+สิ่งนี้ช่วยให้เอเจนต์แต่ละตัวมี:
-- บุคลิกที่ต่างกัน
-- การเข้าถึงเครื่องมือที่ต่างกัน (เช่น อ่านอย่างเดียว เทียบกับ อ่าน-เขียน)
-- โมเดลที่ต่างกัน (เช่น opus เทียบกับ sonnet)
+- บุคลิกที่แตกต่างกัน
+- การเข้าถึงเครื่องมือต่างกัน (เช่น อ่านอย่างเดียว เทียบกับ อ่าน-เขียน)
+- โมเดลต่างกัน (เช่น opus เทียบกับ sonnet)
- Skills ที่ติดตั้งต่างกัน
-### ตัวอย่าง: เซสชันที่แยกกัน
+### ตัวอย่าง: เซสชันที่แยกจากกัน
ในกลุ่ม `120363403215116621@g.us` ที่มีเอเจนต์ `["alfred", "baerbel"]`:
@@ -227,11 +227,11 @@ Broadcast groups จะไม่ข้าม allowlist ของช่องท
-## แนวทางปฏิบัติที่ดี
+## แนวทางปฏิบัติที่ดีที่สุด
-
- ออกแบบแต่ละเอเจนต์ให้มีความรับผิดชอบเดียวที่ชัดเจน:
+
+ ออกแบบเอเจนต์แต่ละตัวให้มีความรับผิดชอบเดียวที่ชัดเจน:
```json
{
@@ -241,11 +241,11 @@ Broadcast groups จะไม่ข้าม allowlist ของช่องท
}
```
- ✅ **ดี:** แต่ละเอเจนต์มีงานเดียว ❌ **ไม่ดี:** เอเจนต์ "dev-helper" แบบทั่วไปหนึ่งตัว
+ ✅ **ดี:** เอเจนต์แต่ละตัวมีงานเดียว ❌ **ไม่ดี:** เอเจนต์ "dev-helper" แบบทั่วไปตัวเดียว
- ทำให้ชัดเจนว่าแต่ละเอเจนต์ทำอะไร:
+ ทำให้ชัดเจนว่าเอเจนต์แต่ละตัวทำอะไร:
```json
{
@@ -258,33 +258,35 @@ Broadcast groups จะไม่ข้าม allowlist ของช่องท
```
-
- ให้เอเจนต์ใช้เฉพาะเครื่องมือที่ต้องใช้:
+
+ ให้เอเจนต์เข้าถึงเฉพาะเครื่องมือที่จำเป็น:
```json
{
"agents": {
"reviewer": {
- "tools": { "allow": ["read", "exec"] } // Read-only
+ "tools": { "allow": ["read", "exec"] }
},
"fixer": {
- "tools": { "allow": ["read", "write", "edit", "exec"] } // Read-write
+ "tools": { "allow": ["read", "write", "edit", "exec"] }
}
}
}
```
+ `reviewer` อ่านได้อย่างเดียว `fixer` อ่านและเขียนได้
+
เมื่อมีเอเจนต์จำนวนมาก ให้พิจารณา:
- ใช้ `"strategy": "parallel"` (ค่าเริ่มต้น) เพื่อความเร็ว
- - จำกัด broadcast groups ไว้ที่ 5-10 เอเจนต์
- - ใช้โมเดลที่เร็วขึ้นสำหรับเอเจนต์ที่เรียบง่ายกว่า
+ - จำกัดกลุ่มบรอดคาสต์ไว้ที่ 5-10 เอเจนต์
+ - ใช้โมเดลที่เร็วกว่าสำหรับเอเจนต์ที่เรียบง่ายกว่า
-
- เอเจนต์ล้มเหลวได้อย่างเป็นอิสระ ข้อผิดพลาดของเอเจนต์หนึ่งตัวจะไม่บล็อกตัวอื่น:
+
+ เอเจนต์ล้มเหลวแยกจากกัน ข้อผิดพลาดของเอเจนต์ตัวหนึ่งจะไม่บล็อกตัวอื่น:
```
Message → [Agent A ✓, Agent B ✗ error, Agent C ✓]
@@ -298,16 +300,16 @@ Broadcast groups จะไม่ข้าม allowlist ของช่องท
### ผู้ให้บริการ
-Broadcast groups ทำงานร่วมกับสิ่งต่อไปนี้ในปัจจุบัน:
+ปัจจุบันกลุ่มบรอดคาสต์ทำงานกับ:
-- ✅ WhatsApp (ใช้งานแล้ว)
-- 🚧 Telegram (มีแผน)
-- 🚧 Discord (มีแผน)
-- 🚧 Slack (มีแผน)
+- ✅ WhatsApp (นำไปใช้แล้ว)
+- 🚧 Telegram (วางแผนไว้)
+- 🚧 Discord (วางแผนไว้)
+- 🚧 Slack (วางแผนไว้)
### การกำหนดเส้นทาง
-Broadcast groups ทำงานร่วมกับการกำหนดเส้นทางที่มีอยู่ได้:
+กลุ่มบรอดคาสต์ทำงานควบคู่กับการกำหนดเส้นทางที่มีอยู่:
```json
{
@@ -324,10 +326,10 @@ Broadcast groups ทำงานร่วมกับการกำหนดเ
```
- `GROUP_A`: มีเพียง alfred ที่ตอบกลับ (การกำหนดเส้นทางปกติ)
-- `GROUP_B`: agent1 และ agent2 ตอบกลับ (broadcast)
+- `GROUP_B`: agent1 และ agent2 ตอบกลับ (บรอดคาสต์)
-**ลำดับความสำคัญ:** `broadcast` มีความสำคัญเหนือ `bindings`
+**ลำดับความสำคัญ:** `broadcast` มีลำดับความสำคัญสูงกว่า `bindings`
## การแก้ไขปัญหา
@@ -337,8 +339,8 @@ Broadcast groups ทำงานร่วมกับการกำหนดเ
**ตรวจสอบ:**
1. Agent IDs มีอยู่ใน `agents.list`
- 2. รูปแบบ Peer ID ถูกต้อง (เช่น `120363403215116621@g.us`)
- 3. เอเจนต์ไม่ได้อยู่ในรายการปฏิเสธ
+ 2. รูปแบบ peer ID ถูกต้อง (เช่น `120363403215116621@g.us`)
+ 3. เอเจนต์ไม่อยู่ในรายการปฏิเสธ
**ดีบัก:**
@@ -347,14 +349,14 @@ Broadcast groups ทำงานร่วมกับการกำหนดเ
```
-
- **สาเหตุ:** Peer ID อาจอยู่ใน `bindings` แต่ไม่อยู่ใน `broadcast`
+
+ **สาเหตุ:** peer ID อาจอยู่ใน `bindings` แต่ไม่อยู่ใน `broadcast`
- **วิธีแก้:** เพิ่มเข้า config ของ broadcast หรือลบออกจาก bindings
+ **วิธีแก้:** เพิ่มลงในการกำหนดค่า broadcast หรือลบออกจาก bindings
- หากทำงานช้าเมื่อมีเอเจนต์จำนวนมาก:
+ หากช้าเมื่อมีเอเจนต์จำนวนมาก:
- ลดจำนวนเอเจนต์ต่อกลุ่ม
- ใช้โมเดลที่เบากว่า (sonnet แทน opus)
@@ -366,7 +368,7 @@ Broadcast groups ทำงานร่วมกับการกำหนดเ
## ตัวอย่าง
-
+
```json
{
"broadcast": {
@@ -401,13 +403,13 @@ Broadcast groups ทำงานร่วมกับการกำหนดเ
}
```
- **ผู้ใช้ส่ง:** ส่วนย่อยของโค้ด
+ **ผู้ใช้ส่ง:** ชิ้นส่วนโค้ด
**คำตอบ:**
- - code-formatter: "แก้การย่อหน้าและเพิ่ม type hints แล้ว"
+ - code-formatter: "แก้การเยื้องและเพิ่ม type hints แล้ว"
- security-scanner: "⚠️ ช่องโหว่ SQL injection ในบรรทัดที่ 12"
- - test-coverage: "Coverage อยู่ที่ 45% ขาดการทดสอบสำหรับกรณีข้อผิดพลาด"
+ - test-coverage: "Coverage อยู่ที่ 45% ยังขาดเทสต์สำหรับกรณีข้อผิดพลาด"
- docs-checker: "ไม่มี docstring สำหรับฟังก์ชัน `process_data`"
@@ -432,7 +434,7 @@ Broadcast groups ทำงานร่วมกับการกำหนดเ
## ข้อมูลอ้างอิง API
-### สคีมา config
+### สคีมาการกำหนดค่า
```typescript
interface OpenClawConfig {
@@ -446,7 +448,7 @@ interface OpenClawConfig {
### ฟิลด์
- วิธีประมวลผลเอเจนต์ `parallel` เรียกใช้เอเจนต์ทั้งหมดพร้อมกัน ส่วน `sequential` เรียกใช้ตามลำดับในอาร์เรย์
+ วิธีประมวลผลเอเจนต์ `parallel` รันเอเจนต์ทั้งหมดพร้อมกัน ส่วน `sequential` รันตามลำดับในอาร์เรย์
WhatsApp group JID, หมายเลข E.164 หรือ peer ID อื่น ค่าเป็นอาร์เรย์ของ agent IDs ที่ควรประมวลผลข้อความ
@@ -454,24 +456,24 @@ interface OpenClawConfig {
## ข้อจำกัด
-1. **จำนวนเอเจนต์สูงสุด:** ไม่มีขีดจำกัดตายตัว แต่ 10+ เอเจนต์อาจทำงานช้า
-2. **บริบทที่ใช้ร่วมกัน:** เอเจนต์ไม่เห็นคำตอบของกันและกัน (ตามการออกแบบ)
+1. **จำนวนเอเจนต์สูงสุด:** ไม่มีขีดจำกัดตายตัว แต่เอเจนต์ 10+ ตัวอาจทำงานช้า
+2. **บริบทที่แชร์:** เอเจนต์จะไม่เห็นคำตอบของกันและกัน (โดยออกแบบไว้เช่นนั้น)
3. **ลำดับข้อความ:** คำตอบแบบขนานอาจมาถึงในลำดับใดก็ได้
-4. **Rate limits:** เอเจนต์ทั้งหมดนับรวมกับ rate limits ของ WhatsApp
+4. **ขีดจำกัดอัตรา:** เอเจนต์ทั้งหมดนับรวมในขีดจำกัดอัตราของ WhatsApp
## การปรับปรุงในอนาคต
ฟีเจอร์ที่วางแผนไว้:
-- [ ] โหมดบริบทที่ใช้ร่วมกัน (เอเจนต์เห็นคำตอบของกันและกัน)
-- [ ] การประสานงานของเอเจนต์ (เอเจนต์สามารถส่งสัญญาณถึงกันได้)
+- [ ] โหมดบริบทที่แชร์ (เอเจนต์เห็นคำตอบของกันและกัน)
+- [ ] การประสานงานของเอเจนต์ (เอเจนต์สามารถส่งสัญญาณหากันได้)
- [ ] การเลือกเอเจนต์แบบไดนามิก (เลือกเอเจนต์ตามเนื้อหาข้อความ)
-- [ ] ลำดับความสำคัญของเอเจนต์ (เอเจนต์บางตัวตอบก่อนตัวอื่น)
+- [ ] ลำดับความสำคัญของเอเจนต์ (เอเจนต์บางตัวตอบกลับก่อนตัวอื่น)
## ที่เกี่ยวข้อง
- [การกำหนดเส้นทางช่องทาง](/th/channels/channel-routing)
- [กลุ่ม](/th/channels/groups)
-- [เครื่องมือแซนด์บ็อกซ์สำหรับหลายเอเจนต์](/th/tools/multi-agent-sandbox-tools)
+- [เครื่องมือ sandbox สำหรับหลาย agent](/th/tools/multi-agent-sandbox-tools)
- [การจับคู่](/th/channels/pairing)
-- [การจัดการเซสชัน](/th/concepts/session)
+- [การจัดการ session](/th/concepts/session)
diff --git a/docs/th/channels/discord.md b/docs/th/channels/discord.md
index 87f9236f1..50c9cc80e 100644
--- a/docs/th/channels/discord.md
+++ b/docs/th/channels/discord.md
@@ -1,13 +1,13 @@
---
read_when:
- - การทำงานกับฟีเจอร์ช่อง Discord
+ - กำลังทำงานกับฟีเจอร์ช่องทาง Discord
summary: สถานะการรองรับบอต Discord ความสามารถ และการกำหนดค่า
title: Discord
x-i18n:
- generated_at: "2026-05-03T21:27:16Z"
+ generated_at: "2026-05-04T02:21:27Z"
model: gpt-5.5
provider: openai
- source_hash: 3a38cb3c8e25c1f3d6b7ddfc35a0445dc264be74d74b08d0051528b462b743a3
+ source_hash: df4e045e39f8977f779fe409abf41dad0d950c92f1230c51ff356343513df812
source_path: channels/discord.md
workflow: 16
---
@@ -16,57 +16,57 @@ x-i18n:
- Discord DM ใช้โหมดการจับคู่เป็นค่าเริ่มต้น
+ DM ของ Discord จะใช้โหมดการจับคู่เป็นค่าเริ่มต้น
- พฤติกรรมคำสั่งแบบเนทีฟและแค็ตตาล็อกคำสั่ง
+ พฤติกรรมคำสั่งแบบเนทีฟและแคตตาล็อกคำสั่ง
-
- การวินิจฉัยข้ามช่องทางและขั้นตอนการซ่อมแซม
+
+ การวินิจฉัยข้ามช่องทางและโฟลว์การซ่อมแซม
## การตั้งค่าอย่างรวดเร็ว
-คุณจะต้องสร้างแอปพลิเคชันใหม่ที่มีบอต เพิ่มบอตไปยังเซิร์ฟเวอร์ของคุณ และจับคู่กับ OpenClaw เราแนะนำให้เพิ่มบอตของคุณไปยังเซิร์ฟเวอร์ส่วนตัวของคุณเอง หากยังไม่มี ให้[สร้างก่อน](https://support.discord.com/hc/en-us/articles/204849977-How-do-I-create-a-server) (เลือก **Create My Own > For me and my friends**)
+คุณจะต้องสร้างแอปพลิเคชันใหม่พร้อมบอต เพิ่มบอตไปยังเซิร์ฟเวอร์ของคุณ และจับคู่กับ OpenClaw เราแนะนำให้เพิ่มบอตของคุณไปยังเซิร์ฟเวอร์ส่วนตัวของคุณเอง หากคุณยังไม่มี [ให้สร้างก่อน](https://support.discord.com/hc/en-us/articles/204849977-How-do-I-create-a-server) (เลือก **Create My Own > For me and my friends**)
- ไปที่ [Discord Developer Portal](https://discord.com/developers/applications) แล้วคลิก **New Application** ตั้งชื่อประมาณว่า "OpenClaw"
+ ไปที่ [Discord Developer Portal](https://discord.com/developers/applications) แล้วคลิก **New Application** ตั้งชื่อเป็นอย่างเช่น "OpenClaw"
- คลิก **Bot** ในแถบด้านข้าง ตั้งค่า **Username** เป็นชื่อที่คุณใช้เรียกเอเจนต์ OpenClaw ของคุณ
+ คลิก **Bot** บนแถบด้านข้าง ตั้งค่า **Username** เป็นชื่อที่คุณใช้เรียกเอเจนต์ OpenClaw ของคุณ
-
- ยังอยู่ในหน้า **Bot** ให้เลื่อนลงไปที่ **Privileged Gateway Intents** แล้วเปิดใช้:
+
+ ยังคงอยู่บนหน้า **Bot** เลื่อนลงไปที่ **Privileged Gateway Intents** แล้วเปิดใช้งาน:
- **Message Content Intent** (จำเป็น)
- - **Server Members Intent** (แนะนำ; จำเป็นสำหรับรายการอนุญาตตามบทบาทและการจับคู่ชื่อเป็น ID)
- - **Presence Intent** (ไม่บังคับ; จำเป็นเฉพาะสำหรับการอัปเดตสถานะการปรากฏตัว)
+ - **Server Members Intent** (แนะนำ; จำเป็นสำหรับรายการอนุญาตตามบทบาทและการจับคู่ชื่อกับ ID)
+ - **Presence Intent** (ไม่บังคับ; ต้องใช้เฉพาะสำหรับการอัปเดต presence)
- เลื่อนกลับขึ้นไปในหน้า **Bot** แล้วคลิก **Reset Token**
+ เลื่อนกลับขึ้นไปบนหน้า **Bot** แล้วคลิก **Reset Token**
- แม้ชื่อจะเป็นเช่นนั้น แต่สิ่งนี้จะสร้างโทเค็นแรกของคุณ โดยไม่มีอะไรถูก "รีเซ็ต"
+ แม้ชื่อจะเป็นเช่นนั้น แต่สิ่งนี้จะสร้างโทเค็นแรกของคุณ ไม่มีสิ่งใดถูก "รีเซ็ต"
- คัดลอกโทเค็นและบันทึกไว้ที่ใดที่หนึ่ง นี่คือ **Bot Token** ของคุณ และคุณจะต้องใช้ในอีกไม่นาน
+ คัดลอกโทเค็นแล้วบันทึกไว้ที่ใดที่หนึ่ง นี่คือ **Bot Token** ของคุณ และคุณจะต้องใช้ในไม่ช้า
-
- คลิก **OAuth2** ในแถบด้านข้าง คุณจะสร้าง URL เชิญพร้อมสิทธิ์ที่ถูกต้องเพื่อเพิ่มบอตไปยังเซิร์ฟเวอร์ของคุณ
+
+ คลิก **OAuth2** บนแถบด้านข้าง คุณจะสร้าง URL คำเชิญที่มีสิทธิ์ที่ถูกต้องเพื่อเพิ่มบอตไปยังเซิร์ฟเวอร์ของคุณ
- เลื่อนลงไปที่ **OAuth2 URL Generator** แล้วเปิดใช้:
+ เลื่อนลงไปที่ **OAuth2 URL Generator** แล้วเปิดใช้งาน:
- `bot`
- `applications.commands`
- ส่วน **Bot Permissions** จะปรากฏด้านล่าง เปิดใช้อย่างน้อย:
+ ส่วน **Bot Permissions** จะปรากฏด้านล่าง เปิดใช้งานอย่างน้อย:
**สิทธิ์ทั่วไป**
- ดูช่อง
@@ -77,31 +77,31 @@ x-i18n:
- แนบไฟล์
- เพิ่มรีแอ็กชัน (ไม่บังคับ)
- นี่คือชุดพื้นฐานสำหรับช่องข้อความปกติ หากคุณวางแผนจะโพสต์ในเธรด Discord รวมถึงเวิร์กโฟลว์ช่องฟอรัมหรือสื่อที่สร้างหรือดำเนินเธรดต่อ ให้เปิดใช้ **Send Messages in Threads** ด้วย
- คัดลอก URL ที่สร้างขึ้นที่ด้านล่าง วางลงในเบราว์เซอร์ เลือกเซิร์ฟเวอร์ของคุณ แล้วคลิก **Continue** เพื่อเชื่อมต่อ ตอนนี้คุณควรเห็นบอตของคุณในเซิร์ฟเวอร์ Discord แล้ว
+ นี่คือชุดพื้นฐานสำหรับช่องข้อความปกติ หากคุณวางแผนจะโพสต์ในเธรดของ Discord รวมถึงเวิร์กโฟลว์ช่องฟอรัมหรือสื่อที่สร้างหรือดำเนินเธรดต่อ ให้เปิดใช้งาน **Send Messages in Threads** ด้วย
+ คัดลอก URL ที่สร้างขึ้นที่ด้านล่าง วางลงในเบราว์เซอร์ของคุณ เลือกเซิร์ฟเวอร์ของคุณ แล้วคลิก **Continue** เพื่อเชื่อมต่อ ตอนนี้คุณควรเห็นบอตของคุณในเซิร์ฟเวอร์ Discord แล้ว
-
- กลับไปที่แอป Discord คุณต้องเปิดใช้ Developer Mode เพื่อให้คัดลอก ID ภายในได้
+
+ กลับไปที่แอป Discord คุณต้องเปิดใช้งาน Developer Mode เพื่อให้คัดลอก ID ภายในได้
- 1. คลิก **User Settings** (ไอคอนรูปเฟืองถัดจากอวาตาร์ของคุณ) → **Advanced** → เปิดสวิตช์ **Developer Mode**
+ 1. คลิก **User Settings** (ไอคอนเฟืองถัดจากอวาตาร์ของคุณ) → **Advanced** → เปิดสวิตช์ **Developer Mode**
2. คลิกขวาที่ **ไอคอนเซิร์ฟเวอร์** ของคุณในแถบด้านข้าง → **Copy Server ID**
3. คลิกขวาที่ **อวาตาร์ของคุณเอง** → **Copy User ID**
- บันทึก **Server ID** และ **User ID** ของคุณไว้พร้อมกับ Bot Token คุณจะส่งทั้งสามอย่างให้ OpenClaw ในขั้นตอนถัดไป
+ บันทึก **Server ID** และ **User ID** ของคุณไว้ร่วมกับ Bot Token คุณจะส่งทั้งสามรายการให้ OpenClaw ในขั้นตอนถัดไป
- เพื่อให้การจับคู่ทำงานได้ Discord ต้องอนุญาตให้บอตส่ง DM ถึงคุณ คลิกขวาที่ **ไอคอนเซิร์ฟเวอร์** ของคุณ → **Privacy Settings** → เปิดสวิตช์ **Direct Messages**
+ เพื่อให้การจับคู่ทำงานได้ Discord ต้องอนุญาตให้บอตของคุณส่ง DM ถึงคุณ คลิกขวาที่ **ไอคอนเซิร์ฟเวอร์** ของคุณ → **Privacy Settings** → เปิดสวิตช์ **Direct Messages**
- สิ่งนี้ทำให้สมาชิกเซิร์ฟเวอร์ (รวมถึงบอต) ส่ง DM ถึงคุณได้ เปิดค่านี้ไว้หากคุณต้องการใช้ Discord DM กับ OpenClaw หากคุณวางแผนจะใช้เฉพาะช่องกิลด์ คุณสามารถปิด DM หลังจากจับคู่แล้วได้
+ สิ่งนี้ทำให้สมาชิกเซิร์ฟเวอร์ (รวมถึงบอต) ส่ง DM ถึงคุณได้ เปิดใช้งานไว้หากคุณต้องการใช้ DM ของ Discord กับ OpenClaw หากคุณวางแผนจะใช้เฉพาะช่องกิลด์ คุณสามารถปิดใช้งาน DM หลังการจับคู่ได้
- โทเค็นบอต Discord ของคุณเป็นความลับ (เหมือนรหัสผ่าน) ตั้งค่าบนเครื่องที่เรียกใช้ OpenClaw ก่อนส่งข้อความหาเอเจนต์ของคุณ
+ โทเค็นบอต Discord ของคุณเป็นความลับ (เหมือนรหัสผ่าน) ตั้งค่าบนเครื่องที่รัน OpenClaw ก่อนส่งข้อความถึงเอเจนต์ของคุณ
```bash
export DISCORD_BOT_TOKEN="YOUR_BOT_TOKEN"
@@ -120,9 +120,9 @@ openclaw config patch --file ./discord.patch.json5
openclaw gateway
```
- หาก OpenClaw ทำงานเป็นบริการเบื้องหลังอยู่แล้ว ให้รีสตาร์ทผ่านแอป OpenClaw Mac หรือโดยหยุดแล้วเริ่มกระบวนการ `openclaw gateway run` ใหม่
- สำหรับการติดตั้งบริการที่มีการจัดการ ให้เรียกใช้ `openclaw gateway install` จากเชลล์ที่มี `DISCORD_BOT_TOKEN` อยู่ หรือจัดเก็บตัวแปรไว้ใน `~/.openclaw/.env` เพื่อให้บริการ resolve ค่า env SecretRef ได้หลังรีสตาร์ท
- หากโฮสต์ของคุณถูกบล็อกหรือถูกจำกัดอัตราโดยการค้นหาแอปพลิเคชันตอนเริ่มต้นของ Discord ให้ตั้งค่า ID แอปพลิเคชัน/ไคลเอนต์ Discord จาก Developer Portal เพื่อให้การเริ่มต้นข้ามการเรียก REST นั้นได้ ใช้ `channels.discord.applicationId` สำหรับบัญชีเริ่มต้น หรือ `channels.discord.accounts..applicationId` เมื่อคุณเรียกใช้บอต Discord หลายตัว
+ หาก OpenClaw กำลังรันเป็นบริการเบื้องหลังอยู่แล้ว ให้รีสตาร์ทผ่านแอป OpenClaw Mac หรือโดยหยุดและเริ่มกระบวนการ `openclaw gateway run` ใหม่
+ สำหรับการติดตั้งบริการที่จัดการแล้ว ให้รัน `openclaw gateway install` จากเชลล์ที่มี `DISCORD_BOT_TOKEN` อยู่ หรือเก็บตัวแปรไว้ใน `~/.openclaw/.env` เพื่อให้บริการสามารถ resolve env SecretRef ได้หลังรีสตาร์ท
+ หากโฮสต์ของคุณถูกบล็อกหรือถูกจำกัดอัตราโดยการค้นหาแอปพลิเคชันของ Discord ตอนเริ่มต้น ให้ตั้งค่า ID แอปพลิเคชัน/ไคลเอนต์ Discord จาก Developer Portal เพื่อให้การเริ่มต้นข้าม REST call นั้นได้ ใช้ `channels.discord.applicationId` สำหรับบัญชีเริ่มต้น หรือ `channels.discord.accounts..applicationId` เมื่อคุณรันบอต Discord หลายตัว
@@ -130,7 +130,7 @@ openclaw gateway
- แชตกับเอเจนต์ OpenClaw ของคุณในช่องทางที่มีอยู่ใดก็ได้ (เช่น Telegram) แล้วบอกเอเจนต์ หาก Discord เป็นช่องทางแรกของคุณ ให้ใช้แท็บ CLI / config แทน
+ แชตกับเอเจนต์ OpenClaw ของคุณบนช่องทางที่มีอยู่ใดก็ได้ (เช่น Telegram) แล้วบอกเอเจนต์ หาก Discord เป็นช่องทางแรกของคุณ ให้ใช้แท็บ CLI / config แทน
> "ฉันตั้งค่าโทเค็นบอต Discord ใน config แล้ว โปรดตั้งค่า Discord ให้เสร็จด้วย User ID `` และ Server ID ``"
@@ -152,15 +152,15 @@ openclaw gateway
}
```
- ค่า env fallback สำหรับบัญชีเริ่มต้น:
+ Env fallback สำหรับบัญชีเริ่มต้น:
```bash
DISCORD_BOT_TOKEN=...
```
- สำหรับการตั้งค่าแบบสคริปต์หรือระยะไกล ให้เขียนบล็อก JSON5 เดียวกันด้วย `openclaw config patch --file ./discord.patch.json5 --dry-run` แล้วเรียกใช้อีกครั้งโดยไม่มี `--dry-run` รองรับค่า `token` แบบข้อความล้วน รองรับค่า SecretRef สำหรับ `channels.discord.token` ใน provider แบบ env/file/exec ด้วยเช่นกัน ดู [การจัดการความลับ](/th/gateway/secrets)
+ สำหรับการตั้งค่าแบบสคริปต์หรือระยะไกล ให้เขียนบล็อก JSON5 เดียวกันด้วย `openclaw config patch --file ./discord.patch.json5 --dry-run` แล้วรันซ้ำโดยไม่มี `--dry-run` รองรับค่า `token` แบบ plaintext ค่า SecretRef ก็รองรับสำหรับ `channels.discord.token` ผ่านผู้ให้บริการ env/file/exec เช่นกัน ดู [การจัดการความลับ](/th/gateway/secrets)
- สำหรับบอต Discord หลายตัว ให้เก็บโทเค็นบอตและ ID แอปพลิเคชันแต่ละรายการไว้ใต้บัญชีของตัวเอง `channels.discord.applicationId` ระดับบนสุดจะถูกสืบทอดโดยบัญชี ดังนั้นตั้งค่าที่นั่นเฉพาะเมื่อทุกบัญชีควรใช้ ID แอปพลิเคชันเดียวกัน
+ สำหรับบอต Discord หลายตัว ให้เก็บโทเค็นบอตและ ID แอปพลิเคชันแต่ละตัวไว้ใต้บัญชีของมัน `channels.discord.applicationId` ระดับบนจะถูกสืบทอดโดยบัญชี ดังนั้นให้ตั้งค่าไว้ตรงนั้นเฉพาะเมื่อทุกบัญชีควรใช้ ID แอปพลิเคชันเดียวกัน
```json5
{
@@ -188,11 +188,11 @@ DISCORD_BOT_TOKEN=...
- รอจนกว่า gateway จะทำงาน แล้วส่ง DM ถึงบอตของคุณใน Discord บอตจะตอบกลับด้วยรหัสการจับคู่
+ รอจนกว่า gateway จะรันอยู่ จากนั้นส่ง DM ถึงบอตของคุณใน Discord บอตจะตอบกลับด้วยรหัสการจับคู่
- ส่งรหัสการจับคู่ให้เอเจนต์ของคุณในช่องทางที่มีอยู่:
+ ส่งรหัสการจับคู่ให้เอเจนต์ของคุณบนช่องทางที่มีอยู่:
> "อนุมัติรหัสการจับคู่ Discord นี้: ``"
@@ -206,22 +206,22 @@ openclaw pairing approve discord
- รหัสการจับคู่หมดอายุหลังจาก 1 ชั่วโมง
+ รหัสการจับคู่จะหมดอายุหลัง 1 ชั่วโมง
- ตอนนี้คุณควรแชตกับเอเจนต์ของคุณใน Discord ผ่าน DM ได้แล้ว
+ ตอนนี้คุณควรสามารถแชตกับเอเจนต์ของคุณใน Discord ผ่าน DM ได้แล้ว
-การ resolve โทเค็นรับรู้ตามบัญชี ค่าโทเค็นใน config จะมีสิทธิ์เหนือ env fallback `DISCORD_BOT_TOKEN` ใช้สำหรับบัญชีเริ่มต้นเท่านั้น
-หากบัญชี Discord ที่เปิดใช้สองบัญชี resolve เป็นโทเค็นบอตเดียวกัน OpenClaw จะเริ่มตัวตรวจสอบ gateway เพียงตัวเดียวสำหรับโทเค็นนั้น โทเค็นที่มาจาก config จะมีสิทธิ์เหนือ env fallback เริ่มต้น มิฉะนั้นบัญชีที่เปิดใช้งานบัญชีแรกจะมีสิทธิ์ และบัญชีซ้ำจะถูกรายงานว่าปิดใช้งาน
-สำหรับการเรียกออกขั้นสูง (เครื่องมือ message/การดำเนินการช่องทาง) ค่า `token` ต่อการเรียกที่ระบุอย่างชัดเจนจะถูกใช้สำหรับการเรียกนั้น สิ่งนี้ใช้กับการดำเนินการแบบส่งและอ่าน/ตรวจสอบ (เช่น read/search/fetch/thread/pins/permissions) การตั้งค่านโยบายบัญชี/การลองใหม่ยังคงมาจากบัญชีที่เลือกในสแนปช็อตรันไทม์ที่ใช้งานอยู่
+การ resolve โทเค็นรับรู้ตามบัญชี ค่าโทเค็นใน config จะชนะ env fallback `DISCORD_BOT_TOKEN` ใช้เฉพาะสำหรับบัญชีเริ่มต้นเท่านั้น
+หากบัญชี Discord ที่เปิดใช้งานสองบัญชี resolve ไปยังโทเค็นบอตเดียวกัน OpenClaw จะเริ่ม gateway monitor เพียงตัวเดียวสำหรับโทเค็นนั้น โทเค็นจาก config จะชนะ env fallback เริ่มต้น มิฉะนั้นบัญชีที่เปิดใช้งานบัญชีแรกจะชนะ และบัญชีที่ซ้ำจะถูกรายงานว่าปิดใช้งาน
+สำหรับการเรียกขาออกขั้นสูง (เครื่องมือข้อความ/การทำงานของช่องทาง) จะใช้ `token` แบบระบุต่อการเรียกสำหรับการเรียกนั้น สิ่งนี้ใช้กับการทำงานแบบส่งและอ่าน/ตรวจสอบ (เช่น read/search/fetch/thread/pins/permissions) การตั้งค่านโยบายบัญชี/การลองซ้ำยังคงมาจากบัญชีที่เลือกใน snapshot รันไทม์ที่ใช้งานอยู่
-## แนะนำ: ตั้งค่าพื้นที่ทำงานแบบกิลด์
+## แนะนำ: ตั้งค่าเวิร์กสเปซกิลด์
-เมื่อ DM ทำงานแล้ว คุณสามารถตั้งค่าเซิร์ฟเวอร์ Discord ของคุณเป็นพื้นที่ทำงานเต็มรูปแบบ โดยแต่ละช่องจะได้เซสชันเอเจนต์ของตัวเองพร้อมบริบทของตัวเอง วิธีนี้แนะนำสำหรับเซิร์ฟเวอร์ส่วนตัวที่มีเพียงคุณและบอตของคุณ
+เมื่อ DM ใช้งานได้แล้ว คุณสามารถตั้งค่าเซิร์ฟเวอร์ Discord ของคุณเป็นเวิร์กสเปซเต็มรูปแบบ โดยแต่ละช่องจะมีเซสชันเอเจนต์ของตัวเองพร้อมบริบทของตัวเอง วิธีนี้แนะนำสำหรับเซิร์ฟเวอร์ส่วนตัวที่มีเพียงคุณและบอตของคุณ
@@ -254,14 +254,16 @@ openclaw pairing approve discord
-
- โดยค่าเริ่มต้น เอเจนต์ของคุณจะตอบกลับในช่องกิลด์เฉพาะเมื่อถูก @mention เท่านั้น สำหรับเซิร์ฟเวอร์ส่วนตัว คุณอาจต้องการให้ตอบกลับทุกข้อความ
+
+ โดยค่าเริ่มต้น เอเจนต์ของคุณจะตอบกลับในช่องกิลด์เมื่อถูก @mention เท่านั้น สำหรับเซิร์ฟเวอร์ส่วนตัว คุณอาจต้องการให้ตอบกลับทุกข้อความ
- ในช่องกิลด์ คำตอบสุดท้ายปกติของผู้ช่วยยังคงเป็นส่วนตัวโดยค่าเริ่มต้น เอาต์พุต Discord ที่มองเห็นได้ต้องถูกส่งอย่างชัดเจนด้วยเครื่องมือ `message` เพื่อให้เอเจนต์สามารถเฝ้าดูแบบเงียบ ๆ เป็นค่าเริ่มต้น และโพสต์เฉพาะเมื่อเห็นว่าการตอบในช่องมีประโยชน์
+ ในช่องกิลด์ คำตอบสุดท้ายปกติของผู้ช่วยจะยังคงเป็นส่วนตัวโดยค่าเริ่มต้น เอาต์พุต Discord ที่มองเห็นได้ต้องถูกส่งอย่างชัดเจนด้วยเครื่องมือ `message` ดังนั้นเอเจนต์จึงสามารถเฝ้าดูอยู่เบื้องหลังเป็นค่าเริ่มต้น และโพสต์เฉพาะเมื่อมันตัดสินว่าคำตอบในช่องมีประโยชน์
+
+ ซึ่งหมายความว่าโมเดลที่เลือกต้องเรียกเครื่องมือได้อย่างเชื่อถือได้ หาก Discord แสดงว่ากำลังพิมพ์และบันทึกแสดงการใช้โทเค็นแต่ไม่มีข้อความที่โพสต์ ให้ตรวจสอบบันทึกเซสชันสำหรับข้อความผู้ช่วยที่มี `didSendViaMessagingTool: false` นั่นหมายความว่าโมเดลสร้างคำตอบสุดท้ายส่วนตัวแทนการเรียก `message(action=send)` เปลี่ยนไปใช้โมเดลที่เรียกเครื่องมือได้แข็งแรงกว่า หรือใช้ config ด้านล่างเพื่อคืนค่าคำตอบสุดท้ายอัตโนมัติแบบเดิม
- > "อนุญาตให้เอเจนต์ของฉันตอบกลับบนเซิร์ฟเวอร์นี้ได้โดยไม่ต้องถูก @mentioned"
+ > "อนุญาตให้เอเจนต์ของฉันตอบกลับบนเซิร์ฟเวอร์นี้โดยไม่ต้องถูก @mentioned"
ตั้งค่า `requireMention: false` ใน config กิลด์ของคุณ:
@@ -280,7 +282,7 @@ openclaw pairing approve discord
}
```
- หากต้องการคืนค่าการตอบกลับสุดท้ายอัตโนมัติแบบเดิมสำหรับห้องกลุ่ม/ช่อง ให้ตั้งค่า `messages.groupChat.visibleReplies: "automatic"`
+ หากต้องการคืนค่าคำตอบสุดท้ายอัตโนมัติแบบเดิมสำหรับห้องกลุ่ม/ช่อง ให้ตั้งค่า `messages.groupChat.visibleReplies: "automatic"`
@@ -288,46 +290,41 @@ openclaw pairing approve discord
- โดยค่าเริ่มต้น หน่วยความจำระยะยาว (MEMORY.md) จะโหลดเฉพาะในเซสชัน DM ช่องกิลด์จะไม่โหลด MEMORY.md อัตโนมัติ
+ โดยค่าเริ่มต้น หน่วยความจำระยะยาว (MEMORY.md) จะโหลดเฉพาะในเซสชัน DM ช่องกิลด์จะไม่โหลด MEMORY.md โดยอัตโนมัติ
> "เมื่อฉันถามคำถามในช่อง Discord ให้ใช้ memory_search หรือ memory_get หากคุณต้องการบริบทระยะยาวจาก MEMORY.md"
-
- หากคุณต้องการบริบทที่ใช้ร่วมกันในทุกช่อง ให้ใส่คำสั่งที่คงที่ไว้ใน `AGENTS.md` หรือ `USER.md` (ไฟล์เหล่านี้จะถูกแทรกสำหรับทุกเซสชัน) เก็บบันทึกระยะยาวไว้ใน `MEMORY.md` และเข้าถึงเมื่อจำเป็นด้วยเครื่องมือหน่วยความจำ
+
+ หากคุณต้องการบริบทที่ใช้ร่วมกันในทุกช่อง ให้วางคำสั่งที่คงที่ไว้ใน `AGENTS.md` หรือ `USER.md` (ไฟล์เหล่านี้จะถูกฉีดเข้าไปในทุกเซสชัน) เก็บบันทึกระยะยาวไว้ใน `MEMORY.md` และเข้าถึงเมื่อต้องการด้วยเครื่องมือหน่วยความจำ
-ตอนนี้สร้างช่องบางช่องบนเซิร์ฟเวอร์ Discord ของคุณแล้วเริ่มแชตได้เลย เอเจนต์ของคุณสามารถเห็นชื่อช่อง และแต่ละช่องจะได้เซสชันแยกของตัวเอง ดังนั้นคุณสามารถตั้งค่า `#coding`, `#home`, `#research` หรืออะไรก็ตามที่เหมาะกับเวิร์กโฟลว์ของคุณ
+ตอนนี้สร้างช่องบางช่องบนเซิร์ฟเวอร์ Discord ของคุณแล้วเริ่มแชตได้เลย เอเจนต์ของคุณสามารถเห็นชื่อช่อง และแต่ละช่องจะมีเซสชันแยกของตัวเอง ดังนั้นคุณจึงตั้งค่า `#coding`, `#home`, `#research` หรืออะไรก็ได้ที่เหมาะกับเวิร์กโฟลว์ของคุณ
## โมเดลรันไทม์
-- Gateway เป็นเจ้าของการเชื่อมต่อ Discord
-- การกำหนดเส้นทางการตอบกลับเป็นแบบกำหนดแน่นอน: การตอบกลับขาเข้าจาก Discord จะกลับไปยัง Discord
-- เมทาดาทาของกิลด์/ช่อง Discord จะถูกเพิ่มเข้าไปในพรอมป์ของโมเดลเป็นบริบทที่ไม่น่าเชื่อถือ
- ไม่ใช่คำนำหน้าการตอบกลับที่ผู้ใช้มองเห็น หากโมเดลคัดลอกซองข้อมูลนั้นกลับมา
- OpenClaw จะตัดเมทาดาทาที่ถูกคัดลอกออกจากการตอบกลับขาออกและจาก
- บริบทการเล่นซ้ำในอนาคต
-- โดยค่าเริ่มต้น (`session.dmScope=main`) แชตโดยตรงจะแชร์เซสชันหลักของเอเจนต์ (`agent:main:main`)
-- ช่องของกิลด์จะเป็นคีย์เซสชันที่แยกออกจากกัน (`agent::discord:channel:`)
-- Group DM จะถูกละเว้นโดยค่าเริ่มต้น (`channels.discord.dm.groupEnabled=false`)
-- คำสั่ง slash แบบเนทีฟจะทำงานในเซสชันคำสั่งที่แยกออกจากกัน (`agent::discord:slash:`) แต่ยังคงพา `CommandTargetSessionKey` ไปยังเซสชันการสนทนาที่ถูกกำหนดเส้นทาง
-- การส่งประกาศ Cron/Heartbeat แบบข้อความเท่านั้นไปยัง Discord ใช้คำตอบสุดท้าย
- ที่ผู้ช่วยมองเห็นหนึ่งครั้ง เพย์โหลดสื่อและคอมโพเนนต์แบบมีโครงสร้างยังคงเป็น
- หลายข้อความเมื่อเอเจนต์ปล่อยเพย์โหลดที่ส่งมอบได้หลายรายการ
+- Gateway เป็นเจ้าของการเชื่อมต่อ Discord.
+- การกำหนดเส้นทางการตอบกลับเป็นแบบกำหนดตายตัว: ข้อความตอบกลับขาเข้าจาก Discord จะย้อนกลับไปยัง Discord.
+- เมทาดาทาของ guild/channel ใน Discord จะถูกเพิ่มลงในพรอมป์ของโมเดลในฐานะบริบทที่ไม่น่าเชื่อถือ ไม่ใช่คำนำหน้าการตอบกลับที่ผู้ใช้เห็น หากโมเดลคัดลอกซองข้อมูลนั้นกลับมา OpenClaw จะลบเมทาดาทาที่ถูกคัดลอกออกจากคำตอบขาออกและจากบริบทการเล่นซ้ำในอนาคต.
+- โดยค่าเริ่มต้น (`session.dmScope=main`) แชตโดยตรงจะแชร์เซสชันหลักของเอเจนต์ (`agent:main:main`).
+- ช่อง guild จะถูกแยกเป็นคีย์เซสชัน (`agent::discord:channel:`).
+- Group DM จะถูกละเว้นโดยค่าเริ่มต้น (`channels.discord.dm.groupEnabled=false`).
+- คำสั่ง slash แบบเนทีฟจะทำงานในเซสชันคำสั่งที่แยกไว้ (`agent::discord:slash:`) โดยยังคงพา `CommandTargetSessionKey` ไปยังเซสชันการสนทนาที่ถูกกำหนดเส้นทาง.
+- การส่งประกาศ cron/heartbeat แบบข้อความล้วนไปยัง Discord จะใช้คำตอบสุดท้ายที่ assistant มองเห็นเพียงครั้งเดียว เพย์โหลดสื่อและคอมโพเนนต์แบบมีโครงสร้างยังคงเป็นหลายข้อความเมื่อเอเจนต์ปล่อยเพย์โหลดที่ส่งได้หลายรายการ.
## ช่องฟอรัม
-ช่องฟอรัมและช่องสื่อของ Discord รับได้เฉพาะโพสต์ในเธรดเท่านั้น OpenClaw รองรับสองวิธีในการสร้างเธรด:
+ช่องฟอรัมและช่องสื่อของ Discord รับเฉพาะโพสต์ในเธรดเท่านั้น OpenClaw รองรับสองวิธีในการสร้างโพสต์เหล่านี้:
-- ส่งข้อความไปยังพาเรนต์ของฟอรัม (`channel:`) เพื่อสร้างเธรดโดยอัตโนมัติ ชื่อเธรดจะใช้บรรทัดแรกที่ไม่ว่างของข้อความคุณ
-- ใช้ `openclaw message thread create` เพื่อสร้างเธรดโดยตรง ห้ามส่ง `--message-id` สำหรับช่องฟอรัม
+- ส่งข้อความไปยังฟอรัมหลัก (`channel:`) เพื่อสร้างเธรดอัตโนมัติ ชื่อเธรดจะใช้บรรทัดแรกที่ไม่ว่างของข้อความของคุณ.
+- ใช้ `openclaw message thread create` เพื่อสร้างเธรดโดยตรง อย่าส่ง `--message-id` สำหรับช่องฟอรัม.
-ตัวอย่าง: ส่งไปยังพาเรนต์ของฟอรัมเพื่อสร้างเธรด
+ตัวอย่าง: ส่งไปยังฟอรัมหลักเพื่อสร้างเธรด
```bash
openclaw message send --channel discord --target channel: \
@@ -341,23 +338,23 @@ openclaw message thread create --channel discord --target channel: \
--thread-name "Topic title" --message "Body of the post"
```
-พาเรนต์ของฟอรัมไม่รับคอมโพเนนต์ Discord หากต้องใช้คอมโพเนนต์ ให้ส่งไปยังตัวเธรดเอง (`channel:`)
+ฟอรัมหลักไม่รับคอมโพเนนต์ของ Discord หากคุณต้องการคอมโพเนนต์ ให้ส่งไปยังเธรดนั้นเอง (`channel:`).
## คอมโพเนนต์แบบโต้ตอบ
-OpenClaw รองรับคอนเทนเนอร์คอมโพเนนต์ v2 ของ Discord สำหรับข้อความเอเจนต์ ใช้เครื่องมือข้อความพร้อมเพย์โหลด `components` ผลลัพธ์จากการโต้ตอบจะถูกกำหนดเส้นทางกลับไปยังเอเจนต์ในฐานะข้อความขาเข้าปกติ และทำตามการตั้งค่า `replyToMode` ของ Discord ที่มีอยู่
+OpenClaw รองรับคอนเทนเนอร์คอมโพเนนต์ v2 ของ Discord สำหรับข้อความของเอเจนต์ ใช้เครื่องมือข้อความพร้อมเพย์โหลด `components` ผลลัพธ์การโต้ตอบจะถูกกำหนดเส้นทางกลับไปยังเอเจนต์เป็นข้อความขาเข้าปกติ และทำตามการตั้งค่า Discord `replyToMode` ที่มีอยู่.
บล็อกที่รองรับ:
- `text`, `section`, `separator`, `actions`, `media-gallery`, `file`
-- แถวการกระทำอนุญาตให้มีปุ่มได้สูงสุด 5 ปุ่มหรือเมนูเลือกเดียวหนึ่งรายการ
+- แถวการดำเนินการอนุญาตปุ่มได้สูงสุด 5 ปุ่มหรือเมนูเลือกเดียวหนึ่งเมนู
- ประเภทการเลือก: `string`, `user`, `role`, `mentionable`, `channel`
-โดยค่าเริ่มต้น คอมโพเนนต์ใช้ได้ครั้งเดียว ตั้งค่า `components.reusable=true` เพื่ออนุญาตให้ใช้ปุ่ม ตัวเลือก และฟอร์มได้หลายครั้งจนกว่าจะหมดอายุ
+โดยค่าเริ่มต้น คอมโพเนนต์ใช้ได้ครั้งเดียว ตั้งค่า `components.reusable=true` เพื่ออนุญาตให้ใช้ปุ่ม เมนูเลือก และฟอร์มได้หลายครั้งจนกว่าจะหมดอายุ.
-หากต้องการจำกัดว่าใครคลิกปุ่มได้ ให้ตั้งค่า `allowedUsers` บนปุ่มนั้น (ID ผู้ใช้ Discord, แท็ก หรือ `*`) เมื่อกำหนดค่าแล้ว ผู้ใช้ที่ไม่ตรงกันจะได้รับการปฏิเสธแบบชั่วคราว
+หากต้องการจำกัดว่าใครคลิกปุ่มได้ ให้ตั้งค่า `allowedUsers` บนปุ่มนั้น (ID ผู้ใช้ Discord, แท็ก หรือ `*`) เมื่อกำหนดค่าแล้ว ผู้ใช้ที่ไม่ตรงกันจะได้รับการปฏิเสธแบบ ephemeral.
-คำสั่ง slash `/model` และ `/models` จะเปิดตัวเลือกโมเดลแบบโต้ตอบพร้อมดรอปดาวน์ผู้ให้บริการ โมเดล และรันไทม์ที่เข้ากันได้ รวมถึงขั้นตอน Submit `/models add` เลิกใช้แล้วและตอนนี้จะส่งคืนข้อความการเลิกใช้แทนการลงทะเบียนโมเดลจากแชต การตอบกลับของตัวเลือกเป็นแบบชั่วคราว และมีเพียงผู้ใช้ที่เรียกใช้เท่านั้นที่ใช้งานได้
+คำสั่ง slash `/model` และ `/models` จะเปิดตัวเลือกโมเดลแบบโต้ตอบพร้อม dropdown สำหรับ provider, โมเดล และ runtime ที่เข้ากันได้ รวมถึงขั้นตอน Submit `/models add` เลิกใช้แล้วและตอนนี้จะส่งคืนข้อความแจ้งการเลิกใช้แทนการลงทะเบียนโมเดลจากแชต การตอบกลับของตัวเลือกเป็นแบบ ephemeral และมีเพียงผู้ใช้ที่เรียกใช้เท่านั้นที่ใช้ได้.
ไฟล์แนบ:
@@ -365,11 +362,11 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
- ระบุไฟล์แนบผ่าน `media`/`path`/`filePath` (ไฟล์เดียว); ใช้ `media-gallery` สำหรับหลายไฟล์
- ใช้ `filename` เพื่อแทนที่ชื่ออัปโหลดเมื่อควรตรงกับการอ้างอิงไฟล์แนบ
-ฟอร์มโมดัล:
+ฟอร์ม modal:
- เพิ่ม `components.modal` พร้อมฟิลด์ได้สูงสุด 5 ฟิลด์
- ประเภทฟิลด์: `text`, `checkbox`, `radio`, `select`, `role-select`, `user-select`
-- OpenClaw จะเพิ่มปุ่มทริกเกอร์โดยอัตโนมัติ
+- OpenClaw เพิ่มปุ่มทริกเกอร์โดยอัตโนมัติ
ตัวอย่าง:
@@ -429,37 +426,37 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
- `channels.discord.dmPolicy` ควบคุมการเข้าถึง DM `channels.discord.allowFrom` คือ allowlist สำหรับ DM ที่เป็นมาตรฐาน
+ `channels.discord.dmPolicy` ควบคุมการเข้าถึง DM `channels.discord.allowFrom` คือ allowlist สำหรับ DM ตามมาตรฐาน.
- `pairing` (ค่าเริ่มต้น)
- `allowlist`
- - `open` (ต้องมี `channels.discord.allowFrom` ที่รวม `"*"`)
+ - `open` (ต้องให้ `channels.discord.allowFrom` รวม `"*"`)
- `disabled`
- หากนโยบาย DM ไม่ได้เปิดอยู่ ผู้ใช้ที่ไม่รู้จักจะถูกบล็อก (หรือได้รับพรอมป์ให้จับคู่ในโหมด `pairing`)
+ หากนโยบาย DM ไม่ใช่แบบเปิด ผู้ใช้ที่ไม่รู้จักจะถูกบล็อก (หรือได้รับพรอมป์ให้จับคู่ในโหมด `pairing`).
- ลำดับความสำคัญของหลายบัญชี:
+ ลำดับความสำคัญสำหรับหลายบัญชี:
- - `channels.discord.accounts.default.allowFrom` ใช้กับบัญชี `default` เท่านั้น
- - สำหรับบัญชีเดียว `allowFrom` มีลำดับความสำคัญเหนือ `dm.allowFrom` แบบเดิม
- - บัญชีที่มีชื่อจะสืบทอด `channels.discord.allowFrom` เมื่อ `allowFrom` ของตัวเองและ `dm.allowFrom` แบบเดิมไม่ได้ถูกตั้งค่า
- - บัญชีที่มีชื่อจะไม่สืบทอด `channels.discord.accounts.default.allowFrom`
+ - `channels.discord.accounts.default.allowFrom` ใช้กับบัญชี `default` เท่านั้น.
+ - สำหรับบัญชีเดียว `allowFrom` มีลำดับความสำคัญเหนือ `dm.allowFrom` แบบเดิม.
+ - บัญชีที่มีชื่อจะสืบทอด `channels.discord.allowFrom` เมื่อ `allowFrom` ของตัวเองและ `dm.allowFrom` แบบเดิมไม่ได้ตั้งค่า.
+ - บัญชีที่มีชื่อจะไม่สืบทอด `channels.discord.accounts.default.allowFrom`.
- `channels.discord.dm.policy` และ `channels.discord.dm.allowFrom` แบบเดิมยังคงอ่านเพื่อความเข้ากันได้ `openclaw doctor --fix` จะย้ายค่าเหล่านี้ไปยัง `dmPolicy` และ `allowFrom` เมื่อทำได้โดยไม่เปลี่ยนการเข้าถึง
+ `channels.discord.dm.policy` และ `channels.discord.dm.allowFrom` แบบเดิมยังถูกอ่านเพื่อความเข้ากันได้ `openclaw doctor --fix` จะย้ายค่าเหล่านั้นไปยัง `dmPolicy` และ `allowFrom` เมื่อทำได้โดยไม่เปลี่ยนการเข้าถึง.
รูปแบบเป้าหมาย DM สำหรับการส่ง:
- `user:`
- - การกล่าวถึง `<@id>`
+ - การ mention แบบ `<@id>`
- ID ที่เป็นตัวเลขล้วนโดยปกติจะถูกแก้เป็น ID ช่องเมื่อมีค่าเริ่มต้นของช่องทำงานอยู่ แต่ ID ที่อยู่ใน `allowFrom` สำหรับ DM ที่มีผลของบัญชีจะถูกปฏิบัติเป็นเป้าหมาย DM ของผู้ใช้เพื่อความเข้ากันได้
+ โดยปกติ ID ตัวเลขล้วนจะ resolve เป็น ID ช่องเมื่อมีค่าเริ่มต้นของช่องที่ใช้งานอยู่ แต่ ID ที่อยู่ใน DM `allowFrom` ที่มีผลของบัญชีจะถูกถือเป็นเป้าหมาย DM ของผู้ใช้เพื่อความเข้ากันได้.
- DM ของ Discord สามารถใช้รายการ `accessGroup:` แบบไดนามิกใน `channels.discord.allowFrom`
+ DM ของ Discord สามารถใช้รายการ `accessGroup:` แบบไดนามิกใน `channels.discord.allowFrom`.
- ชื่อกลุ่มการเข้าถึงใช้ร่วมกันในช่องข้อความต่างๆ ใช้ `type: "message.senders"` สำหรับกลุ่มแบบคงที่ซึ่งสมาชิกถูกระบุด้วยไวยากรณ์ `allowFrom` ปกติของแต่ละช่อง หรือ `type: "discord.channelAudience"` เมื่อผู้ชม `ViewChannel` ปัจจุบันของช่อง Discord ควรกำหนดสมาชิกภาพแบบไดนามิก พฤติกรรมกลุ่มการเข้าถึงที่ใช้ร่วมกันมีเอกสารที่นี่: [กลุ่มการเข้าถึง](/th/channels/access-groups)
+ ชื่อ access group ใช้ร่วมกันระหว่างช่องข้อความ ใช้ `type: "message.senders"` สำหรับกลุ่มแบบคงที่ซึ่งสมาชิกแสดงด้วยไวยากรณ์ `allowFrom` ปกติของแต่ละช่อง หรือใช้ `type: "discord.channelAudience"` เมื่อผู้ชม `ViewChannel` ปัจจุบันของช่อง Discord ควรกำหนดสมาชิกแบบไดนามิก พฤติกรรม access-group ที่ใช้ร่วมกันมีเอกสารไว้ที่นี่: [กลุ่มการเข้าถึง](/th/channels/access-groups).
```json5
{
@@ -482,9 +479,9 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
}
```
- ช่องข้อความ Discord ไม่มีรายชื่อสมาชิกแยกต่างหาก `type: "discord.channelAudience"` จำลองสมาชิกภาพดังนี้: ผู้ส่ง DM เป็นสมาชิกของกิลด์ที่กำหนดค่าไว้ และในขณะนั้นมีสิทธิ์ `ViewChannel` ที่มีผลบนช่องที่กำหนดค่าไว้หลังจากนำบทบาทและการเขียนทับของช่องมาใช้แล้ว
+ ช่องข้อความของ Discord ไม่มีรายชื่อสมาชิกแยกต่างหาก `type: "discord.channelAudience"` จำลองสมาชิกภาพดังนี้: ผู้ส่ง DM เป็นสมาชิกของ guild ที่กำหนดค่าและปัจจุบันมีสิทธิ์ `ViewChannel` ที่มีผลบนช่องที่กำหนดค่าหลังจากนำ role และการ override ของช่องมาใช้แล้ว.
- ตัวอย่าง: อนุญาตให้ทุกคนที่เห็น `#maintainers` สามารถ DM บอตได้ ขณะเดียวกันยังคงปิด DM สำหรับคนอื่นทั้งหมด
+ ตัวอย่าง: อนุญาตให้ทุกคนที่เห็น `#maintainers` ได้ DM ไปยังบอท ขณะที่ยังปิด DM สำหรับคนอื่นทั้งหมด.
```json5
{
@@ -525,29 +522,29 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
}
```
- การค้นหาจะล้มเหลวแบบปิด หาก Discord ส่งคืน `Missing Access` การค้นหาสมาชิกล้มเหลว หรือช่องเป็นของกิลด์อื่น ผู้ส่ง DM จะถูกถือว่าไม่ได้รับอนุญาต
+ การค้นหาจะล้มเหลวแบบปิด หาก Discord ส่งคืน `Missing Access`, การค้นหาสมาชิกล้มเหลว หรือช่องอยู่ใน guild อื่น ผู้ส่ง DM จะถูกถือว่าไม่ได้รับอนุญาต.
- เปิดใช้ **Server Members Intent** ใน Discord Developer Portal สำหรับบอตเมื่อใช้กลุ่มการเข้าถึงแบบผู้ชมช่อง DM ไม่มีสถานะสมาชิกกิลด์ ดังนั้น OpenClaw จะแก้หาสมาชิกผ่าน Discord REST ตอนอนุญาตสิทธิ์
+ เปิดใช้ **Server Members Intent** ใน Discord Developer Portal สำหรับบอทเมื่อใช้ access group แบบ channel-audience DM ไม่มีสถานะสมาชิก guild ดังนั้น OpenClaw จะ resolve สมาชิกผ่าน Discord REST ณ เวลาตรวจสอบสิทธิ์.
- การจัดการกิลด์ถูกควบคุมโดย `channels.discord.groupPolicy`:
+ การจัดการ guild ถูกควบคุมโดย `channels.discord.groupPolicy`:
- `open`
- `allowlist`
- `disabled`
- เส้นฐานที่ปลอดภัยเมื่อมี `channels.discord` คือ `allowlist`
+ baseline ที่ปลอดภัยเมื่อมี `channels.discord` คือ `allowlist`.
- พฤติกรรมของ `allowlist`:
+ พฤติกรรม `allowlist`:
- - กิลด์ต้องตรงกับ `channels.discord.guilds` (แนะนำ `id`, รับ slug ได้)
- - allowlist ผู้ส่งแบบไม่บังคับ: `users` (แนะนำ ID ที่เสถียร) และ `roles` (เฉพาะ ID บทบาท); หากกำหนดค่าอย่างใดอย่างหนึ่ง ผู้ส่งจะได้รับอนุญาตเมื่อเข้าคู่กับ `users` หรือ `roles`
- - การจับคู่ชื่อ/แท็กโดยตรงถูกปิดใช้งานโดยค่าเริ่มต้น; เปิดใช้ `channels.discord.dangerouslyAllowNameMatching: true` เฉพาะเป็นโหมดความเข้ากันได้แบบฉุกเฉิน
+ - guild ต้องตรงกับ `channels.discord.guilds` (แนะนำให้ใช้ `id`, ยอมรับ slug)
+ - allowlist ของผู้ส่งแบบไม่บังคับ: `users` (แนะนำ ID ที่เสถียร) และ `roles` (เฉพาะ ID ของ role); หากกำหนดอย่างใดอย่างหนึ่ง ผู้ส่งจะได้รับอนุญาตเมื่อ ตรงกับ `users` หรือ `roles`
+ - การจับคู่ชื่อ/แท็กโดยตรงถูกปิดโดยค่าเริ่มต้น; เปิดใช้ `channels.discord.dangerouslyAllowNameMatching: true` เฉพาะเป็นโหมดความเข้ากันได้แบบฉุกเฉิน
- รองรับชื่อ/แท็กสำหรับ `users` แต่ ID ปลอดภัยกว่า; `openclaw security audit` จะเตือนเมื่อมีการใช้รายการชื่อ/แท็ก
- - หากกิลด์มีการกำหนดค่า `channels` ช่องที่ไม่อยู่ในรายการจะถูกปฏิเสธ
- - หากกิลด์ไม่มีบล็อก `channels` ช่องทั้งหมดในกิลด์ที่อยู่ใน allowlist นั้นจะได้รับอนุญาต
+ - หาก guild มีการกำหนดค่า `channels` ช่องที่ไม่ได้อยู่ในรายการจะถูกปฏิเสธ
+ - หาก guild ไม่มีบล็อก `channels` ช่องทั้งหมดใน guild ที่อยู่ใน allowlist นั้นจะได้รับอนุญาต
ตัวอย่าง:
@@ -573,35 +570,35 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
}
```
- หากคุณตั้งค่าเพียง `DISCORD_BOT_TOKEN` และไม่ได้สร้างบล็อก `channels.discord` ค่า fallback ตอนรันไทม์คือ `groupPolicy="allowlist"` (พร้อมคำเตือนในล็อก) แม้ว่า `channels.defaults.groupPolicy` จะเป็น `open`
+ หากคุณตั้งค่าเพียง `DISCORD_BOT_TOKEN` และไม่ได้สร้างบล็อก `channels.discord` fallback ขณะรันจะเป็น `groupPolicy="allowlist"` (พร้อมคำเตือนใน log) แม้ว่า `channels.defaults.groupPolicy` จะเป็น `open`.
- ข้อความของกิลด์ถูกควบคุมด้วยการกล่าวถึงโดยค่าเริ่มต้น
+ ข้อความ guild ต้องผ่าน mention gate โดยค่าเริ่มต้น.
- การตรวจจับการกล่าวถึงรวมถึง:
+ การตรวจจับ mention รวมถึง:
- - การกล่าวถึงบอตอย่างชัดเจน
- - รูปแบบการกล่าวถึงที่กำหนดค่าไว้ (`agents.list[].groupChat.mentionPatterns`, fallback `messages.groupChat.mentionPatterns`)
- - พฤติกรรมตอบกลับบอตโดยนัยในกรณีที่รองรับ
+ - การ mention บอทอย่างชัดเจน
+ - รูปแบบ mention ที่กำหนดค่า (`agents.list[].groupChat.mentionPatterns`, fallback `messages.groupChat.mentionPatterns`)
+ - พฤติกรรมตอบกลับถึงบอทโดยนัยในกรณีที่รองรับ
- เมื่อเขียนข้อความ Discord ขาออก ให้ใช้ไวยากรณ์การกล่าวถึงมาตรฐาน: `<@USER_ID>` สำหรับผู้ใช้, `<#CHANNEL_ID>` สำหรับช่อง และ `<@&ROLE_ID>` สำหรับบทบาท ห้ามใช้รูปแบบการกล่าวถึงชื่อเล่นแบบเดิม `<@!USER_ID>`
+ เมื่อเขียนข้อความ Discord ขาออก ให้ใช้ไวยากรณ์ mention ตามมาตรฐาน: `<@USER_ID>` สำหรับผู้ใช้, `<#CHANNEL_ID>` สำหรับช่อง และ `<@&ROLE_ID>` สำหรับ role อย่าใช้รูปแบบ mention ชื่อเล่นแบบเดิม `<@!USER_ID>`.
- `requireMention` ถูกกำหนดค่าต่อกิลด์/ช่อง (`channels.discord.guilds...`)
- `ignoreOtherMentions` เลือกได้ว่าจะทิ้งข้อความที่กล่าวถึงผู้ใช้/บทบาทอื่นแต่ไม่ได้กล่าวถึงบอตหรือไม่ (ยกเว้น @everyone/@here)
+ `requireMention` ถูกกำหนดค่าต่อ guild/channel (`channels.discord.guilds...`).
+ `ignoreOtherMentions` สามารถเลือกให้ทิ้งข้อความที่ mention ผู้ใช้/role อื่นแต่ไม่ได้ mention บอท (ยกเว้น @everyone/@here).
Group DM:
- - ค่าเริ่มต้น: ละเว้น (`dm.groupEnabled=false`)
+ - ค่าเริ่มต้น: ถูกละเว้น (`dm.groupEnabled=false`)
- allowlist แบบไม่บังคับผ่าน `dm.groupChannels` (ID ช่องหรือ slug)
-### การกำหนดเส้นทางเอเจนต์ตามบทบาท
+### การกำหนดเส้นทางเอเจนต์ตาม role
-ใช้ `bindings[].match.roles` เพื่อกำหนดเส้นทางสมาชิกกิลด์ Discord ไปยังเอเจนต์ต่างๆ ตาม ID บทบาท การผูกตามบทบาทรับเฉพาะ ID บทบาทเท่านั้น และจะถูกประเมินหลังจากการผูกแบบ peer หรือ parent-peer และก่อนการผูกแบบเฉพาะกิลด์ หากการผูกตั้งค่าฟิลด์ match อื่นด้วย (เช่น `peer` + `guildId` + `roles`) ฟิลด์ที่กำหนดค่าทั้งหมดต้องตรงกัน
+ใช้ `bindings[].match.roles` เพื่อกำหนดเส้นทางสมาชิก guild ของ Discord ไปยังเอเจนต์ต่างกันตาม ID ของ role การ binding ตาม role รับเฉพาะ ID ของ role และจะถูกประเมินหลังจาก binding แบบ peer หรือ parent-peer และก่อน binding แบบ guild-only หาก binding ตั้งค่าฟิลด์ match อื่นด้วย (เช่น `peer` + `guildId` + `roles`) ฟิลด์ที่กำหนดค่าทั้งหมดต้องตรงกัน.
```json5
{
@@ -627,11 +624,11 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
## คำสั่งเนทีฟและการยืนยันสิทธิ์คำสั่ง
-- `commands.native` มีค่าเริ่มต้นเป็น `"auto"` และเปิดใช้งานสำหรับ Discord
-- การ override ราย channel: `channels.discord.commands.native`
-- `commands.native=false` จะข้ามการลงทะเบียนและการล้างคำสั่ง slash ของ Discord ระหว่าง startup คำสั่งที่เคยลงทะเบียนไว้ก่อนหน้านี้อาจยังมองเห็นได้ใน Discord จนกว่าคุณจะลบออกจากแอป Discord
-- การยืนยันตัวตนของคำสั่ง native ใช้ allowlist/policy ของ Discord ชุดเดียวกับการจัดการข้อความปกติ
-- คำสั่งอาจยังมองเห็นได้ใน UI ของ Discord สำหรับผู้ใช้ที่ไม่ได้รับอนุญาต แต่การดำเนินการยังคงบังคับใช้การยืนยันตัวตนของ OpenClaw และส่งคืน "ไม่ได้รับอนุญาต"
+- `commands.native` มีค่าเริ่มต้นเป็น `"auto"` และเปิดใช้สำหรับ Discord
+- การเขียนทับรายช่องทาง: `channels.discord.commands.native`
+- `commands.native=false` จะข้ามการลงทะเบียนและการล้างคำสั่ง slash ของ Discord ระหว่างเริ่มต้น คำสั่งที่เคยลงทะเบียนไว้ก่อนหน้านี้อาจยังมองเห็นได้ใน Discord จนกว่าคุณจะนำออกจากแอป Discord
+- การยืนยันตัวตนของคำสั่งแบบเนทีฟใช้ allowlist/นโยบาย Discord ชุดเดียวกับการจัดการข้อความปกติ
+- คำสั่งอาจยังมองเห็นได้ใน UI ของ Discord สำหรับผู้ใช้ที่ไม่ได้รับอนุญาต แต่การเรียกใช้ยังคงบังคับใช้การยืนยันตัวตนของ OpenClaw และส่งคืน "ไม่ได้รับอนุญาต"
ดู [คำสั่ง Slash](/th/tools/slash-commands) สำหรับแค็ตตาล็อกคำสั่งและพฤติกรรม
@@ -642,8 +639,8 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
## รายละเอียดฟีเจอร์
-
- Discord รองรับแท็กการตอบกลับในเอาต์พุตของ agent:
+
+ Discord รองรับแท็กตอบกลับในเอาต์พุตของเอเจนต์:
- `[[reply_to_current]]`
- `[[reply_to:]]`
@@ -655,21 +652,21 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
- `all`
- `batched`
- หมายเหตุ: `off` ปิดใช้งานการจัดเธรดการตอบกลับแบบแฝง แท็ก `[[reply_to_*]]` แบบชัดเจนยังคงถูกใช้ตามปกติ
- `first` จะแนบอ้างอิงการตอบกลับ native แบบแฝงกับข้อความ Discord ขาออกแรกของรอบนั้นเสมอ
- `batched` จะแนบอ้างอิงการตอบกลับ native แบบแฝงของ Discord เฉพาะเมื่อ
- รอบขาเข้าเป็นแบตช์ที่หน่วงรวมจากหลายข้อความ สิ่งนี้มีประโยชน์
- เมื่อคุณต้องการการตอบกลับ native เป็นหลักสำหรับแชตที่ส่งถี่และกำกวม ไม่ใช่ทุก
+ หมายเหตุ: `off` ปิดการจัดเธรดการตอบกลับโดยนัย แท็ก `[[reply_to_*]]` ที่ระบุชัดเจนยังคงใช้งานได้
+ `first` จะแนบการอ้างอิงการตอบกลับแบบเนทีฟโดยนัยกับข้อความ Discord ขาออกแรกของรอบนั้นเสมอ
+ `batched` จะแนบการอ้างอิงการตอบกลับแบบเนทีฟโดยนัยของ Discord เฉพาะเมื่อ
+ รอบขาเข้าเป็นชุดข้อความหลายข้อความที่ถูกรวมด้วย debounce เท่านั้น วิธีนี้มีประโยชน์
+ เมื่อคุณต้องการการตอบกลับแบบเนทีฟเป็นหลักสำหรับแชตที่ส่งถี่และคลุมเครือ ไม่ใช่ทุก
รอบที่มีข้อความเดียว
- ID ข้อความจะถูกแสดงใน context/history เพื่อให้ agent สามารถกำหนดเป้าหมายข้อความเฉพาะได้
+ ID ข้อความจะแสดงในบริบท/ประวัติ เพื่อให้เอเจนต์สามารถเจาะจงข้อความเป้าหมายได้
-
- OpenClaw สามารถสตรีมคำตอบฉบับร่างได้โดยส่งข้อความชั่วคราวและแก้ไขข้อความนั้นเมื่อข้อความใหม่เข้ามา `channels.discord.streaming` รับค่า `off` (ค่าเริ่มต้น) | `partial` | `block` | `progress` `progress` จะคงฉบับร่างสถานะที่แก้ไขได้หนึ่งรายการและอัปเดตด้วยความคืบหน้าของเครื่องมือจนกว่าจะส่งผลลัพธ์สุดท้าย; `streamMode` เป็น alias แบบเดิมและจะถูกย้ายให้อัตโนมัติ
+
+ OpenClaw สามารถสตรีมร่างคำตอบได้โดยส่งข้อความชั่วคราวและแก้ไขเมื่อมีข้อความเข้ามา `channels.discord.streaming` รับค่า `off` (ค่าเริ่มต้น) | `partial` | `block` | `progress` `progress` จะคงร่างสถานะที่แก้ไขได้หนึ่งรายการไว้ และอัปเดตด้วยความคืบหน้าของเครื่องมือจนกว่าจะส่งคำตอบสุดท้าย; `streamMode` เป็น alias เดิมและจะถูกย้ายให้อัตโนมัติ
- ค่าเริ่มต้นยังคงเป็น `off` เพราะการแก้ไขตัวอย่างของ Discord ชน rate limit ได้อย่างรวดเร็วเมื่อ bot หรือ gateway หลายตัวใช้บัญชีเดียวกัน
+ ค่าเริ่มต้นยังคงเป็น `off` เพราะการแก้ไขตัวอย่างของ Discord จะชน rate limit ได้เร็วเมื่อมีบอตหรือ Gateway หลายตัวใช้บัญชีเดียวกัน
```json5
{
@@ -686,51 +683,51 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
}
```
- - `partial` แก้ไขข้อความตัวอย่างรายการเดียวเมื่อ token เข้ามา
- - `block` ส่ง chunk ขนาดฉบับร่าง (ใช้ `draftChunk` เพื่อปรับขนาดและจุดตัด โดยถูกจำกัดไม่เกิน `textChunkLimit`)
- - ผลลัพธ์สุดท้ายที่เป็นสื่อ ข้อผิดพลาด และการตอบกลับแบบชัดเจนจะยกเลิกการแก้ไขตัวอย่างที่ค้างอยู่
- - `streaming.preview.toolProgress` (ค่าเริ่มต้น `true`) ควบคุมว่าจะให้การอัปเดตเครื่องมือ/ความคืบหน้าใช้ข้อความตัวอย่างซ้ำหรือไม่
+ - `partial` แก้ไขข้อความตัวอย่างเดียวเมื่อ token เข้ามา
+ - `block` ส่งชิ้นส่วนขนาดร่างออกมา (ใช้ `draftChunk` เพื่อปรับขนาดและจุดแบ่ง โดยจำกัดไว้ที่ `textChunkLimit`)
+ - ผลลัพธ์สุดท้ายที่เป็นสื่อ ข้อผิดพลาด และการตอบกลับที่ระบุชัดเจนจะยกเลิกการแก้ไขตัวอย่างที่ค้างอยู่
+ - `streaming.preview.toolProgress` (ค่าเริ่มต้น `true`) ควบคุมว่าจะนำข้อความตัวอย่างกลับมาใช้กับการอัปเดตเครื่องมือ/ความคืบหน้าหรือไม่
- การสตรีมตัวอย่างรองรับเฉพาะข้อความ; การตอบกลับที่เป็นสื่อจะ fallback ไปใช้การส่งแบบปกติ เมื่อเปิดใช้งานการสตรีม `block` อย่างชัดเจน OpenClaw จะข้ามสตรีมตัวอย่างเพื่อหลีกเลี่ยงการสตรีมซ้ำซ้อน
+ การสตรีมตัวอย่างรองรับเฉพาะข้อความเท่านั้น; การตอบกลับด้วยสื่อจะย้อนกลับไปใช้การส่งตามปกติ เมื่อเปิดใช้การสตรีม `block` อย่างชัดเจน OpenClaw จะข้ามสตรีมตัวอย่างเพื่อหลีกเลี่ยงการสตรีมซ้ำซ้อน
-
- context ประวัติของ guild:
+
+ บริบทประวัติของกิลด์:
- - ค่าเริ่มต้นของ `channels.discord.historyLimit` คือ `20`
- - fallback: `messages.groupChat.historyLimit`
- - `0` ปิดใช้งาน
+ - `channels.discord.historyLimit` ค่าเริ่มต้น `20`
+ - ทางเลือกสำรอง: `messages.groupChat.historyLimit`
+ - `0` ปิดใช้
การควบคุมประวัติ DM:
- `channels.discord.dmHistoryLimit`
- `channels.discord.dms[""].historyLimit`
- พฤติกรรมของ thread:
+ พฤติกรรมเธรด:
- - thread ของ Discord จะ route เป็น session ของ channel และสืบทอด config ของ channel แม่ เว้นแต่จะถูก override
- - session ของ thread จะสืบทอดการเลือก `/model` ระดับ session ของ channel แม่เป็น fallback เฉพาะโมเดล; การเลือก `/model` เฉพาะใน thread ยังคงมีลำดับความสำคัญสูงกว่า และประวัติ transcript ของแม่จะไม่ถูกคัดลอก เว้นแต่จะเปิดใช้งานการสืบทอด transcript
- - `channels.discord.thread.inheritParent` (ค่าเริ่มต้น `false`) เลือกให้ auto-thread ใหม่ seed จาก transcript ของแม่ การ override รายบัญชีอยู่ภายใต้ `channels.discord.accounts..thread.inheritParent`
+ - เธรด Discord จะถูกกำหนดเส้นทางเป็นเซสชันช่องทางและสืบทอดค่าคอนฟิกช่องทางแม่ เว้นแต่จะมีการเขียนทับ
+ - เซสชันเธรดสืบทอดการเลือก `/model` ระดับเซสชันของช่องทางแม่เป็นทางเลือกสำรองเฉพาะโมเดล; การเลือก `/model` ภายในเธรดยังคงมีลำดับความสำคัญสูงกว่า และจะไม่คัดลอกประวัติ transcript ของแม่ เว้นแต่จะเปิดใช้การสืบทอด transcript
+ - `channels.discord.thread.inheritParent` (ค่าเริ่มต้น `false`) เลือกให้ auto-thread ใหม่เริ่มด้วยข้อมูลจาก transcript ของแม่ การเขียนทับรายบัญชีอยู่ใต้ `channels.discord.accounts..thread.inheritParent`
- reaction ของ message-tool สามารถ resolve เป้าหมาย DM แบบ `user:` ได้
- - `guilds..channels..requireMention: false` จะถูกคงไว้ระหว่าง fallback การเปิดใช้งานขั้นตอบกลับ
+ - `guilds..channels..requireMention: false` จะถูกคงไว้ระหว่างทางเลือกสำรองของการเปิดใช้งานขั้นตอบกลับ
- หัวข้อ channel จะถูกฉีดเข้าเป็น context ที่ **ไม่น่าเชื่อถือ** allowlist ควบคุมว่าใครเรียก agent ได้ ไม่ใช่ขอบเขตการลบข้อมูล context เสริมทั้งหมด
+ หัวข้อช่องทางถูกฉีดเข้าเป็นบริบทที่ **ไม่น่าเชื่อถือ** Allowlists จำกัดว่าใครสามารถกระตุ้นเอเจนต์ได้ ไม่ใช่ขอบเขตการปกปิดบริบทเสริมทั้งหมด
-
- Discord สามารถผูก thread กับเป้าหมาย session เพื่อให้ข้อความติดตามผลใน thread นั้นยังคง route ไปยัง session เดิม (รวมถึง session ของ subagent)
+
+ Discord สามารถผูกเธรดกับเป้าหมายเซสชันเพื่อให้ข้อความติดตามผลในเธรดนั้นยังคงถูกกำหนดเส้นทางไปยังเซสชันเดิม (รวมถึงเซสชัน subagent)
คำสั่ง:
- - `/focus ` ผูก thread ปัจจุบัน/ใหม่กับเป้าหมาย subagent/session
- - `/unfocus` ลบการผูก thread ปัจจุบัน
+ - `/focus ` ผูกเธรดปัจจุบัน/ใหม่กับเป้าหมาย subagent/เซสชัน
+ - `/unfocus` นำการผูกเธรดปัจจุบันออก
- `/agents` แสดง run ที่ใช้งานอยู่และสถานะการผูก
- - `/session idle ` ตรวจสอบ/อัปเดตการ auto-unfocus เมื่อไม่มี activity สำหรับการผูกที่โฟกัสอยู่
- - `/session max-age ` ตรวจสอบ/อัปเดตอายุสูงสุดแบบ hard max สำหรับการผูกที่โฟกัสอยู่
+ - `/session idle ` ตรวจสอบ/อัปเดตการ unfocus อัตโนมัติเมื่อไม่มีการใช้งานสำหรับการผูกที่ focus อยู่
+ - `/session max-age ` ตรวจสอบ/อัปเดตอายุสูงสุดแบบบังคับสำหรับการผูกที่ focus อยู่
- Config:
+ คอนฟิก:
```json5
{
@@ -758,22 +755,22 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
หมายเหตุ:
- `session.threadBindings.*` ตั้งค่าเริ่มต้นส่วนกลาง
- - `channels.discord.threadBindings.*` override พฤติกรรมของ Discord
- - `spawnSessions` ควบคุมการสร้าง/ผูก thread อัตโนมัติสำหรับ `sessions_spawn({ thread: true })` และการ spawn thread ของ ACP ค่าเริ่มต้น: `true`
- - `defaultSpawnContext` ควบคุม context ของ subagent native สำหรับการ spawn ที่ผูกกับ thread ค่าเริ่มต้น: `"fork"`
- - key `spawnSubagentSessions`/`spawnAcpSessions` ที่เลิกใช้แล้วจะถูกย้ายโดย `openclaw doctor --fix`
- - หากการผูก thread ถูกปิดใช้งานสำหรับบัญชี `/focus` และการดำเนินการผูก thread ที่เกี่ยวข้องจะไม่พร้อมใช้งาน
+ - `channels.discord.threadBindings.*` เขียนทับพฤติกรรม Discord
+ - `spawnSessions` ควบคุมการสร้าง/ผูกเธรดอัตโนมัติสำหรับ `sessions_spawn({ thread: true })` และการ spawn เธรด ACP ค่าเริ่มต้น: `true`
+ - `defaultSpawnContext` ควบคุมบริบท subagent แบบเนทีฟสำหรับการ spawn ที่ผูกกับเธรด ค่าเริ่มต้น: `"fork"`
+ - คีย์ `spawnSubagentSessions`/`spawnAcpSessions` ที่เลิกใช้แล้วจะถูกย้ายโดย `openclaw doctor --fix`
+ - หากปิดใช้การผูกเธรดสำหรับบัญชีหนึ่ง `/focus` และการดำเนินการผูกเธรดที่เกี่ยวข้องจะไม่พร้อมใช้งาน
- ดู [Sub-agents](/th/tools/subagents), [ACP Agents](/th/tools/acp-agents) และ [Configuration Reference](/th/gateway/configuration-reference)
+ ดู [Sub-agents](/th/tools/subagents), [เอเจนต์ ACP](/th/tools/acp-agents) และ [อ้างอิงการกำหนดค่า](/th/gateway/configuration-reference)
-
- สำหรับ workspace ACP แบบ "always-on" ที่เสถียร ให้กำหนดค่า binding ACP แบบมีชนิดที่ระดับบนสุดซึ่งกำหนดเป้าหมายไปยังบทสนทนา Discord
+
+ สำหรับเวิร์กสเปซ ACP แบบ "เปิดตลอด" ที่เสถียร ให้กำหนดค่าการผูก ACP แบบ typed ระดับบนสุดที่ชี้ไปยังการสนทนา Discord
- เส้นทาง config:
+ เส้นทางคอนฟิก:
- - `bindings[]` พร้อม `type: "acp"` และ `match.channel: "discord"`
+ - `bindings[]` ที่มี `type: "acp"` และ `match.channel: "discord"`
ตัวอย่าง:
@@ -825,49 +822,49 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
หมายเหตุ:
- - `/acp spawn codex --bind here` ผูก channel หรือ thread ปัจจุบันไว้ในตำแหน่งเดิมและคงข้อความในอนาคตไว้บน session ACP เดิม ข้อความใน thread จะสืบทอด binding ของ channel แม่
- - ใน channel หรือ thread ที่ถูกผูกไว้ `/new` และ `/reset` จะ reset session ACP เดิมในตำแหน่งเดิม การผูก thread ชั่วคราวสามารถ override การ resolve เป้าหมายได้ขณะใช้งานอยู่
- - `spawnSessions` ควบคุมการสร้าง/ผูก thread ลูกผ่าน `--thread auto|here`
+ - `/acp spawn codex --bind here` ผูกช่องทางหรือเธรดปัจจุบันไว้ที่เดิมและทำให้ข้อความในอนาคตอยู่ในเซสชัน ACP เดิม ข้อความในเธรดสืบทอดการผูกของช่องทางแม่
+ - ในช่องทางหรือเธรดที่ถูกผูกไว้ `/new` และ `/reset` จะรีเซ็ตเซสชัน ACP เดิมที่เดิม การผูกเธรดชั่วคราวสามารถเขียนทับการ resolve เป้าหมายขณะใช้งานอยู่
+ - `spawnSessions` จำกัดการสร้าง/ผูกเธรดลูกผ่าน `--thread auto|here`
- ดู [ACP Agents](/th/tools/acp-agents) สำหรับรายละเอียดพฤติกรรมการผูก
+ ดู [เอเจนต์ ACP](/th/tools/acp-agents) สำหรับรายละเอียดพฤติกรรมการผูก
-
- โหมดการแจ้งเตือน reaction ราย guild:
+
+ โหมดการแจ้งเตือน reaction รายกิลด์:
- `off`
- `own` (ค่าเริ่มต้น)
- `all`
- `allowlist` (ใช้ `guilds..users`)
- event ของ reaction จะถูกแปลงเป็น system event และแนบกับ session Discord ที่ถูก route
+ เหตุการณ์ reaction จะถูกแปลงเป็นเหตุการณ์ระบบและแนบกับเซสชัน Discord ที่ถูกกำหนดเส้นทาง
-
- `ackReaction` ส่ง emoji ยืนยันการรับทราบขณะที่ OpenClaw กำลังประมวลผลข้อความขาเข้า
+
+ `ackReaction` ส่งอีโมจิยืนยันการรับทราบขณะ OpenClaw กำลังประมวลผลข้อความขาเข้า
ลำดับการ resolve:
- `channels.discord.accounts..ackReaction`
- `channels.discord.ackReaction`
- `messages.ackReaction`
- - fallback emoji ของตัวตน agent (`agents.list[].identity.emoji` มิฉะนั้นคือ "👀")
+ - fallback อีโมจิตัวตนเอเจนต์ (`agents.list[].identity.emoji`, ไม่เช่นนั้น "👀")
หมายเหตุ:
- - Discord รับ emoji unicode หรือชื่อ emoji custom
- - ใช้ `""` เพื่อปิดใช้งาน reaction สำหรับ channel หรือบัญชี
+ - Discord รับอีโมจิ unicode หรือชื่ออีโมจิแบบกำหนดเอง
+ - ใช้ `""` เพื่อปิดใช้ reaction สำหรับช่องทางหรือบัญชี
-
- การเขียน config ที่เริ่มจาก channel เปิดใช้งานโดยค่าเริ่มต้น
+
+ การเขียนคอนฟิกที่เริ่มจากช่องทางเปิดใช้งานเป็นค่าเริ่มต้น
- สิ่งนี้มีผลกับ flow `/config set|unset` (เมื่อเปิดใช้งานฟีเจอร์คำสั่ง)
+ สิ่งนี้มีผลต่อ flow `/config set|unset` (เมื่อเปิดใช้ฟีเจอร์คำสั่ง)
- ปิดใช้งาน:
+ ปิดใช้:
```json5
{
@@ -881,8 +878,8 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
-
- route ทราฟฟิก WebSocket ของ Gateway Discord และการค้นหา REST ตอน startup (application ID + การ resolve allowlist) ผ่านพร็อกซี HTTP(S) ด้วย `channels.discord.proxy`
+
+ กำหนดเส้นทางทราฟฟิก WebSocket ของ Discord gateway และการ lookup REST ตอนเริ่มต้น (application ID + การ resolve allowlist) ผ่านพร็อกซี HTTP(S) ด้วย `channels.discord.proxy`
```json5
{
@@ -894,7 +891,7 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
}
```
- การ override รายบัญชี:
+ การเขียนทับรายบัญชี:
```json5
{
@@ -912,8 +909,8 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
-
- เปิดใช้งานการ resolve ของ PluralKit เพื่อ map ข้อความที่ถูก proxy ไปยังตัวตนสมาชิกของระบบ:
+
+ เปิดใช้การ resolve PluralKit เพื่อแมปข้อความที่ถูก proxy กับตัวตนสมาชิกระบบ:
```json5
{
@@ -930,15 +927,15 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
หมายเหตุ:
- - allowlist สามารถใช้ `pk:` ได้
- - ชื่อแสดงของสมาชิกจะถูกจับคู่ด้วยชื่อ/slug เท่านั้นเมื่อ `channels.discord.dangerouslyAllowNameMatching: true`
- - การ lookup ใช้ ID ข้อความต้นฉบับและถูกจำกัดด้วยช่วงเวลา
- - หาก lookup ล้มเหลว ข้อความที่ถูก proxy จะถูกถือเป็นข้อความ bot และถูกทิ้ง เว้นแต่ `allowBots=true`
+ - allowlist สามารถใช้ `pk:`
+ - ชื่อแสดงผลของสมาชิกจะถูกจับคู่ด้วยชื่อ/slug เฉพาะเมื่อ `channels.discord.dangerouslyAllowNameMatching: true`
+ - การ lookup ใช้ ID ข้อความต้นฉบับและถูกจำกัดด้วยกรอบเวลา
+ - หาก lookup ล้มเหลว ข้อความที่ถูก proxy จะถูกถือเป็นข้อความบอตและถูกทิ้ง เว้นแต่ `allowBots=true`
-
- ใช้ `mentionAliases` เมื่อ agent ต้องการ mention ขาออกแบบ deterministic สำหรับผู้ใช้ Discord ที่รู้จัก key เป็น handle ที่ไม่มี `@` นำหน้า; value เป็น ID ผู้ใช้ Discord handle ที่ไม่รู้จัก, `@everyone`, `@here` และ mention ภายใน span โค้ด Markdown จะถูกปล่อยไว้ไม่เปลี่ยนแปลง
+
+ ใช้ `mentionAliases` เมื่อเอเจนต์ต้องการ mention ขาออกแบบกำหนดแน่นอนสำหรับผู้ใช้ Discord ที่รู้จัก คีย์คือ handle ที่ไม่มี `@` นำหน้า; ค่าคือ ID ผู้ใช้ Discord handle ที่ไม่รู้จัก, `@everyone`, `@here` และ mention ภายใน code span ของ Markdown จะไม่ถูกเปลี่ยน
```json5
{
@@ -961,10 +958,10 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
-
- การอัปเดต presence จะถูกนำไปใช้เมื่อคุณตั้งค่า field status หรือ activity หรือเมื่อคุณเปิดใช้งาน auto presence
+
+ การอัปเดต presence จะถูกนำไปใช้เมื่อคุณตั้งค่าฟิลด์สถานะหรือกิจกรรม หรือเมื่อคุณเปิดใช้ auto presence
- ตัวอย่างเฉพาะ status:
+ ตัวอย่างเฉพาะสถานะ:
```json5
{
@@ -976,7 +973,7 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
}
```
- ตัวอย่าง activity (custom status เป็นชนิด activity เริ่มต้น):
+ ตัวอย่างกิจกรรม (สถานะแบบกำหนดเองเป็นประเภทกิจกรรมเริ่มต้น):
```json5
{
@@ -1003,14 +1000,14 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
}
```
- map ชนิด activity:
+ แผนที่ประเภทกิจกรรม:
- - 0: Playing
- - 1: Streaming (ต้องมี `activityUrl`)
- - 2: Listening
- - 3: Watching
- - 4: Custom (ใช้ข้อความ activity เป็นสถานะของ status; emoji เป็นตัวเลือก)
- - 5: Competing
+ - 0: กำลังเล่น
+ - 1: กำลังสตรีม (ต้องมี `activityUrl`)
+ - 2: กำลังฟัง
+ - 3: กำลังดู
+ - 4: กำหนดเอง (ใช้ข้อความกิจกรรมเป็น state ของสถานะ; อีโมจิเป็นตัวเลือก)
+ - 5: กำลังแข่งขัน
ตัวอย่าง auto presence (สัญญาณสุขภาพ runtime):
@@ -1029,7 +1026,7 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
}
```
- auto presence map ความพร้อมใช้งานของ runtime ไปยัง status ของ Discord: healthy => online, degraded หรือ unknown => idle, exhausted หรือ unavailable => dnd การ override ข้อความแบบตัวเลือก:
+ auto presence แมปความพร้อมใช้งานของ runtime ไปยังสถานะ Discord: healthy => online, degraded หรือ unknown => idle, exhausted หรือ unavailable => dnd การเขียนทับข้อความแบบเลือกได้:
- `autoPresence.healthyText`
- `autoPresence.degradedText`
@@ -1037,56 +1034,57 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
-
- Discord รองรับการจัดการการอนุมัติด้วยปุ่มใน DM และสามารถโพสต์ prompt การอนุมัติใน channel ต้นทางได้ตามตัวเลือก
+
+ Discord รองรับการจัดการการอนุมัติด้วยปุ่มใน DM และสามารถเลือกโพสต์ prompt การอนุมัติในช่องทางต้นทางได้
- เส้นทาง config:
+ เส้นทางคอนฟิก:
- `channels.discord.execApprovals.enabled`
- - `channels.discord.execApprovals.approvers` (ไม่บังคับ; ย้อนกลับไปใช้ `commands.ownerAllowFrom` เมื่อทำได้)
+ - `channels.discord.execApprovals.approvers` (ไม่บังคับ; ย้อนกลับไปใช้ `commands.ownerAllowFrom` เมื่อเป็นไปได้)
- `channels.discord.execApprovals.target` (`dm` | `channel` | `both`, ค่าเริ่มต้น: `dm`)
- `agentFilter`, `sessionFilter`, `cleanupAfterResolve`
- Discord จะเปิดใช้การอนุมัติ exec แบบเนทีฟโดยอัตโนมัติเมื่อไม่ได้ตั้งค่า `enabled` หรือเป็น `"auto"` และสามารถระบุผู้อนุมัติได้อย่างน้อยหนึ่งคน ไม่ว่าจะจาก `execApprovals.approvers` หรือจาก `commands.ownerAllowFrom` Discord จะไม่อนุมานผู้อนุมัติ exec จาก `allowFrom` ของแชนแนล, `dm.allowFrom` แบบเดิม หรือ `defaultTo` ของข้อความโดยตรง ตั้งค่า `enabled: false` เพื่อปิดใช้ Discord เป็นไคลเอนต์การอนุมัติแบบเนทีฟอย่างชัดเจน
+ Discord เปิดใช้การอนุมัติ exec แบบเนทีฟโดยอัตโนมัติเมื่อไม่ได้ตั้งค่า `enabled` หรือมีค่าเป็น `"auto"` และสามารถระบุผู้อนุมัติได้อย่างน้อยหนึ่งราย ไม่ว่าจะจาก `execApprovals.approvers` หรือจาก `commands.ownerAllowFrom` Discord จะไม่อนุมานผู้อนุมัติ exec จาก `allowFrom` ของช่อง, `dm.allowFrom` แบบเดิม, หรือ `defaultTo` ของข้อความส่วนตัว ตั้งค่า `enabled: false` เพื่อปิดใช้งาน Discord ในฐานะไคลเอนต์อนุมัติแบบเนทีฟอย่างชัดเจน
- สำหรับคำสั่งกลุ่มที่ละเอียดอ่อนและจำกัดเฉพาะเจ้าของ เช่น `/diagnostics` และ `/export-trajectory` OpenClaw จะส่งพรอมป์การอนุมัติและผลลัพธ์สุดท้ายแบบส่วนตัว โดยจะลองใช้ Discord DM ก่อนเมื่อเจ้าของที่เรียกใช้มีเส้นทางเจ้าของของ Discord; หากไม่มี จะย้อนกลับไปใช้เส้นทางเจ้าของแรกที่พร้อมใช้งานจาก `commands.ownerAllowFrom` เช่น Telegram
+ สำหรับคำสั่งกลุ่มที่ละเอียดอ่อนและจำกัดเฉพาะเจ้าของ เช่น `/diagnostics` และ `/export-trajectory` OpenClaw จะส่งพรอมต์อนุมัติและผลลัพธ์สุดท้ายแบบส่วนตัว โดยจะลองใช้ Discord DM ก่อนเมื่อเจ้าของที่เรียกใช้มีเส้นทางเจ้าของของ Discord; หากไม่พร้อมใช้งาน จะย้อนกลับไปใช้เส้นทางเจ้าของแรกที่พร้อมใช้งานจาก `commands.ownerAllowFrom` เช่น Telegram
- เมื่อ `target` เป็น `channel` หรือ `both` พรอมป์การอนุมัติจะมองเห็นได้ในแชนแนล เฉพาะผู้อนุมัติที่ระบุได้เท่านั้นที่ใช้ปุ่มได้; ผู้ใช้อื่นจะได้รับการปฏิเสธแบบชั่วคราว พรอมป์การอนุมัติจะมีข้อความคำสั่งอยู่ด้วย ดังนั้นให้เปิดใช้การส่งผ่านแชนแนลเฉพาะในแชนแนลที่เชื่อถือได้เท่านั้น หากไม่สามารถดึง ID แชนแนลจากคีย์เซสชันได้ OpenClaw จะย้อนกลับไปส่งผ่าน DM
+ เมื่อ `target` เป็น `channel` หรือ `both` พรอมต์อนุมัติจะปรากฏในช่อง เฉพาะผู้อนุมัติที่ระบุได้แล้วเท่านั้นที่ใช้ปุ่มได้; ผู้ใช้อื่นจะได้รับการปฏิเสธแบบชั่วคราว พรอมต์อนุมัติมีข้อความคำสั่งรวมอยู่ด้วย ดังนั้นให้เปิดใช้การส่งไปยังช่องเฉพาะในช่องที่เชื่อถือได้เท่านั้น หากไม่สามารถอนุมาน ID ช่องจากคีย์เซสชันได้ OpenClaw จะย้อนกลับไปส่งผ่าน DM
- Discord ยังแสดงปุ่มอนุมัติที่ใช้ร่วมกันกับแชนแนลแชทอื่นด้วย อะแดปเตอร์ Discord แบบเนทีฟหลัก ๆ จะเพิ่มการจัดเส้นทาง DM ของผู้อนุมัติและการกระจายไปยังแชนแนล
- เมื่อมีปุ่มเหล่านั้นอยู่ ปุ่มเหล่านั้นคือ UX การอนุมัติหลัก; OpenClaw
- ควรรวมคำสั่ง `/approve` แบบแมนนวลไว้เฉพาะเมื่อผลลัพธ์ของเครื่องมือระบุว่า
- การอนุมัติผ่านแชทไม่พร้อมใช้งาน หรือการอนุมัติแบบแมนนวลเป็นวิธีเดียวเท่านั้น
- หากรันไทม์การอนุมัติแบบเนทีฟของ Discord ไม่ทำงาน OpenClaw จะคงพรอมป์
- `/approve ` แบบกำหนดได้ในเครื่องให้มองเห็นได้ หากรันไทม์
- ทำงานอยู่แต่ไม่สามารถส่งการ์ดเนทีฟไปยังเป้าหมายใดได้ OpenClaw จะส่งประกาศ
- สำรองในแชทเดียวกันพร้อมคำสั่ง `/approve` ที่ตรงกันจากการอนุมัติที่รอดำเนินการ
+ Discord ยังแสดงปุ่มอนุมัติร่วมที่ช่องแชทอื่นใช้ด้วย อะแดปเตอร์ Discord แบบเนทีฟหลัก ๆ แล้วเพิ่มการกำหนดเส้นทาง DM ของผู้อนุมัติและการกระจายไปยังช่อง
+ เมื่อมีปุ่มเหล่านั้น ปุ่มดังกล่าวคือ UX การอนุมัติหลัก; OpenClaw
+ ควรมีคำสั่ง `/approve` แบบแมนนวลเฉพาะเมื่อผลลัพธ์ของเครื่องมือระบุว่า
+ การอนุมัติผ่านแชทไม่พร้อมใช้งาน หรือการอนุมัติแบบแมนนวลเป็นเส้นทางเดียวเท่านั้น
+ หากรันไทม์การอนุมัติแบบเนทีฟของ Discord ไม่ทำงาน OpenClaw จะคงพรอมต์
+ `/approve ` แบบกำหนดได้ซ้ำในเครื่องให้มองเห็นได้ หาก
+ รันไทม์ทำงานอยู่แต่ไม่สามารถส่งการ์ดแบบเนทีฟไปยังเป้าหมายใด ๆ ได้
+ OpenClaw จะส่งประกาศสำรองในแชทเดียวกันพร้อมคำสั่ง `/approve`
+ ที่ตรงกันจากการอนุมัติที่ค้างอยู่
- การตรวจสอบสิทธิ์ Gateway และการระบุผลการอนุมัติทำตามสัญญาไคลเอนต์ Gateway ที่ใช้ร่วมกัน (`plugin:` IDs ระบุผลผ่าน `plugin.approval.resolve`; IDs อื่นผ่าน `exec.approval.resolve`) การอนุมัติจะหมดอายุหลังจาก 30 นาทีตามค่าเริ่มต้น
+ การตรวจสอบสิทธิ์ของ Gateway และการแก้ผลการอนุมัติเป็นไปตามสัญญาไคลเอนต์ Gateway ร่วมกัน (`plugin:` IDs แก้ผ่าน `plugin.approval.resolve`; IDs อื่นแก้ผ่าน `exec.approval.resolve`) การอนุมัติหมดอายุหลังจาก 30 นาทีโดยค่าเริ่มต้น
- ดู [การอนุมัติ exec](/th/tools/exec-approvals)
+ ดู [การอนุมัติ Exec](/th/tools/exec-approvals)
-## เครื่องมือและเกตการดำเนินการ
+## เครื่องมือและเกตการกระทำ
-การดำเนินการกับข้อความ Discord รวมถึงการส่งข้อความ การดูแลแชนแนล การกลั่นกรอง การแสดงสถานะ และการดำเนินการกับเมตาดาต้า
+การกระทำของข้อความ Discord ประกอบด้วยการส่งข้อความ การดูแลช่อง การมอดเดอเรชัน สถานะการแสดงตัว และการกระทำกับเมทาดาทา
ตัวอย่างหลัก:
- การส่งข้อความ: `sendMessage`, `readMessages`, `editMessage`, `deleteMessage`, `threadReply`
- รีแอ็กชัน: `react`, `reactions`, `emojiList`
-- การกลั่นกรอง: `timeout`, `kick`, `ban`
-- การแสดงสถานะ: `setPresence`
+- มอดเดอเรชัน: `timeout`, `kick`, `ban`
+- สถานะการแสดงตัว: `setPresence`
-การดำเนินการ `event-create` รับพารามิเตอร์ `image` แบบไม่บังคับ (URL หรือพาธไฟล์ในเครื่อง) เพื่อตั้งค่าภาพปกของอีเวนต์ที่กำหนดเวลาไว้
+การกระทำ `event-create` รับพารามิเตอร์ `image` ที่ไม่บังคับ (URL หรือพาธไฟล์ในเครื่อง) เพื่อตั้งค่ารูปภาพหน้าปกของเหตุการณ์ที่กำหนดเวลาไว้
-เกตการดำเนินการอยู่ภายใต้ `channels.discord.actions.*`
+เกตการกระทำอยู่ใต้ `channels.discord.actions.*`
พฤติกรรมเกตเริ่มต้น:
-| กลุ่มการดำเนินการ | ค่าเริ่มต้น |
+| กลุ่มการกระทำ | ค่าเริ่มต้น |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- |
| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | เปิดใช้ |
| roles | ปิดใช้ |
@@ -1095,10 +1093,10 @@ OpenClaw รองรับคอนเทนเนอร์คอมโพเ
## UI Components v2
-OpenClaw ใช้ Discord components v2 สำหรับการอนุมัติ exec และมาร์กเกอร์ข้ามบริบท การดำเนินการกับข้อความ Discord ยังรับ `components` สำหรับ UI แบบกำหนดเองได้ด้วย (ขั้นสูง; ต้องสร้างเพย์โหลดคอมโพเนนต์ผ่านเครื่องมือ discord) ขณะที่ `embeds` แบบเดิมยังพร้อมใช้งานแต่ไม่แนะนำ
+OpenClaw ใช้ Discord components v2 สำหรับการอนุมัติ exec และเครื่องหมายข้ามบริบท การกระทำของข้อความ Discord ยังสามารถรับ `components` สำหรับ UI แบบกำหนดเองได้ด้วย (ขั้นสูง; ต้องสร้างเพย์โหลดคอมโพเนนต์ผ่านเครื่องมือ discord) ขณะที่ `embeds` แบบเดิมยังคงพร้อมใช้งาน แต่ไม่แนะนำ
-- `channels.discord.ui.components.accentColor` ตั้งค่าสีเน้นที่ใช้โดยคอนเทนเนอร์คอมโพเนนต์ของ Discord (hex)
-- ตั้งค่าต่อบัญชีด้วย `channels.discord.accounts..ui.components.accentColor`
+- `channels.discord.ui.components.accentColor` ตั้งค่าสีเน้นที่คอนเทนเนอร์คอมโพเนนต์ของ Discord ใช้ (hex)
+- ตั้งค่าแยกตามบัญชีด้วย `channels.discord.accounts..ui.components.accentColor`
- `embeds` จะถูกละเว้นเมื่อมี components v2 อยู่
ตัวอย่าง:
@@ -1119,20 +1117,20 @@ OpenClaw ใช้ Discord components v2 สำหรับการอนุม
## เสียง
-Discord มีพื้นผิวเสียงที่แตกต่างกันสองแบบ: **แชนแนลเสียง** แบบเรียลไทม์ (การสนทนาต่อเนื่อง) และ **ไฟล์แนบข้อความเสียง** (รูปแบบพรีวิวคลื่นเสียง) Gateway รองรับทั้งสองแบบ
+Discord มีพื้นผิวเสียงสองแบบที่แยกจากกัน: **ช่องเสียง** แบบเรียลไทม์ (การสนทนาต่อเนื่อง) และ **ไฟล์แนบข้อความเสียง** (รูปแบบพรีวิวคลื่นเสียง) Gateway รองรับทั้งสองแบบ
-### แชนแนลเสียง
+### ช่องเสียง
รายการตรวจสอบการตั้งค่า:
1. เปิดใช้ Message Content Intent ใน Discord Developer Portal
2. เปิดใช้ Server Members Intent เมื่อใช้รายการอนุญาตบทบาท/ผู้ใช้
-3. เชิญบอตด้วยสโคป `bot` และ `applications.commands`
-4. ให้สิทธิ์ Connect, Speak, Send Messages และ Read Message History ในแชนแนลเสียงเป้าหมาย
-5. เปิดใช้คำสั่งเนทีฟ (`commands.native` หรือ `channels.discord.commands.native`)
+3. เชิญบอทด้วยสโคป `bot` และ `applications.commands`
+4. ให้สิทธิ์ Connect, Speak, Send Messages และ Read Message History ในช่องเสียงเป้าหมาย
+5. เปิดใช้คำสั่งแบบเนทีฟ (`commands.native` หรือ `channels.discord.commands.native`)
6. กำหนดค่า `channels.discord.voice`
-ใช้ `/vc join|leave|status` เพื่อควบคุมเซสชัน คำสั่งนี้ใช้เอเจนต์เริ่มต้นของบัญชีและทำตามรายการอนุญาตและกฎนโยบายกลุ่มเดียวกับคำสั่ง Discord อื่น ๆ
+ใช้ `/vc join|leave|status` เพื่อควบคุมเซสชัน คำสั่งนี้ใช้เอเจนต์เริ่มต้นของบัญชีและทำตามกฎรายการอนุญาตและนโยบายกลุ่มเดียวกับคำสั่ง Discord อื่น ๆ
```bash
/vc join channel:
@@ -1171,37 +1169,37 @@ Discord มีพื้นผิวเสียงที่แตกต่าง
หมายเหตุ:
-- `voice.tts` แทนที่ `messages.tts` สำหรับการเล่นเสียงเท่านั้น
-- `voice.model` แทนที่ LLM ที่ใช้สำหรับการตอบกลับในแชนแนลเสียง Discord เท่านั้น ปล่อยว่างไว้เพื่อสืบทอดโมเดลเอเจนต์ที่ถูกกำหนดเส้นทาง
-- STT ใช้ `tools.media.audio`; `voice.model` ไม่ส่งผลต่อการถอดเสียง
-- การแทนที่ `systemPrompt` ของ Discord ต่อแชนแนลจะใช้กับรอบข้อความถอดเสียงสำหรับแชนแนลเสียงนั้น
-- รอบข้อความถอดเสียงจะดึงสถานะเจ้าของจาก `allowFrom` ของ Discord (หรือ `dm.allowFrom`); ผู้พูดที่ไม่ใช่เจ้าของไม่สามารถเข้าถึงเครื่องมือเฉพาะเจ้าของได้ (เช่น `gateway` และ `cron`)
-- เสียง Discord เป็นแบบเลือกเปิดสำหรับคอนฟิกที่เป็นข้อความเท่านั้น; ตั้งค่า `channels.discord.voice.enabled=true` (หรือคงบล็อก `channels.discord.voice` ที่มีอยู่) เพื่อเปิดใช้คำสั่ง `/vc`, รันไทม์เสียง และ Gateway intent `GuildVoiceStates`
-- `channels.discord.intents.voiceStates` สามารถแทนที่การสมัครรับ intent สถานะเสียงได้อย่างชัดเจน ปล่อยว่างไว้เพื่อให้ intent ทำตามการเปิดใช้เสียงที่มีผลจริง
-- `voice.daveEncryption` และ `voice.decryptionFailureTolerance` ส่งผ่านไปยังตัวเลือก join ของ `@discordjs/voice`
+- `voice.tts` จะแทนที่ `messages.tts` สำหรับการเล่นเสียงเท่านั้น
+- `voice.model` จะแทนที่ LLM ที่ใช้สำหรับการตอบกลับช่องเสียง Discord เท่านั้น ปล่อยไว้ไม่ตั้งค่าเพื่อสืบทอดโมเดลเอเจนต์ที่กำหนดเส้นทางไว้
+- STT ใช้ `tools.media.audio`; `voice.model` ไม่มีผลต่อการถอดเสียง
+- การแทนที่ `systemPrompt` ของ Discord รายช่องจะมีผลกับรอบถอดเสียงของช่องเสียงนั้น
+- รอบถอดเสียงจะอนุมานสถานะเจ้าของจาก `allowFrom` ของ Discord (หรือ `dm.allowFrom`); ผู้พูดที่ไม่ใช่เจ้าของไม่สามารถเข้าถึงเครื่องมือเฉพาะเจ้าของได้ (เช่น `gateway` และ `cron`)
+- เสียง Discord เป็นแบบเลือกเปิดสำหรับคอนฟิกข้อความเท่านั้น; ตั้งค่า `channels.discord.voice.enabled=true` (หรือคงบล็อก `channels.discord.voice` ที่มีอยู่) เพื่อเปิดใช้คำสั่ง `/vc`, รันไทม์เสียง และ Gateway intent `GuildVoiceStates`
+- `channels.discord.intents.voiceStates` สามารถแทนที่การสมัครใช้งาน voice-state intent ได้อย่างชัดเจน ปล่อยไว้ไม่ตั้งค่าเพื่อให้ intent เป็นไปตามการเปิดใช้เสียงที่มีผลจริง
+- `voice.daveEncryption` และ `voice.decryptionFailureTolerance` ส่งต่อไปยังตัวเลือก join ของ `@discordjs/voice`
- ค่าเริ่มต้นของ `@discordjs/voice` คือ `daveEncryption=true` และ `decryptionFailureTolerance=24` หากไม่ได้ตั้งค่า
-- `voice.connectTimeoutMs` ควบคุมการรอ Ready เริ่มต้นของ `@discordjs/voice` สำหรับ `/vc join` และการพยายามเข้าร่วมอัตโนมัติ ค่าเริ่มต้น: `30000`
-- `voice.reconnectGraceMs` ควบคุมระยะเวลาที่ OpenClaw รอให้เซสชันเสียงที่ถูกตัดการเชื่อมต่อเริ่มเชื่อมต่อใหม่ก่อนทำลายเซสชันนั้น ค่าเริ่มต้น: `15000`
-- OpenClaw ยังเฝ้าดูความล้มเหลวในการถอดรหัสฝั่งรับ และกู้คืนอัตโนมัติโดยออกจาก/เข้าร่วมแชนแนลเสียงอีกครั้งหลังเกิดความล้มเหลวซ้ำ ๆ ในช่วงเวลาสั้น
-- หากบันทึกฝั่งรับแสดง `DecryptionFailed(UnencryptedWhenPassthroughDisabled)` ซ้ำ ๆ หลังอัปเดต ให้รวบรวมรายงานการพึ่งพาและบันทึก บรรทัด `@discordjs/voice` ที่รวมมาแล้วมีแพตช์แก้ padding จาก upstream ใน discord.js PR #11449 ซึ่งปิด discord.js issue #11419
+- `voice.connectTimeoutMs` ควบคุมการรอ Ready เริ่มต้นของ `@discordjs/voice` สำหรับ `/vc join` และความพยายามเข้าร่วมอัตโนมัติ ค่าเริ่มต้น: `30000`
+- `voice.reconnectGraceMs` ควบคุมระยะเวลาที่ OpenClaw รอให้เซสชันเสียงที่ตัดการเชื่อมต่อเริ่มเชื่อมต่อใหม่ก่อนทำลายเซสชันนั้น ค่าเริ่มต้น: `15000`
+- OpenClaw ยังเฝ้าดูความล้มเหลวในการถอดรหัสฝั่งรับและกู้คืนอัตโนมัติโดยออกจากช่องเสียงแล้วเข้าร่วมใหม่หลังเกิดความล้มเหลวซ้ำ ๆ ในช่วงเวลาสั้น ๆ
+- หากบันทึกฝั่งรับแสดง `DecryptionFailed(UnencryptedWhenPassthroughDisabled)` ซ้ำ ๆ หลังอัปเดต ให้รวบรวมรายงาน dependency และบันทึก บรรทัด `@discordjs/voice` ที่รวมมาแล้วมี upstream padding fix จาก discord.js PR #11449 ซึ่งปิด discord.js issue #11419 แล้ว
-ไปป์ไลน์แชนแนลเสียง:
+ไปป์ไลน์ช่องเสียง:
-- การจับ PCM ของ Discord ถูกแปลงเป็นไฟล์ WAV ชั่วคราว
+- การจับ Discord PCM จะถูกแปลงเป็นไฟล์ WAV ชั่วคราว
- `tools.media.audio` จัดการ STT เช่น `openai/gpt-4o-mini-transcribe`
-- ข้อความถอดเสียงถูกส่งผ่านทางเข้าและการจัดเส้นทางของ Discord ขณะที่ LLM ตอบกลับทำงานด้วยนโยบายเอาต์พุตเสียงที่ซ่อนเครื่องมือ `tts` ของเอเจนต์และขอให้คืนข้อความ เพราะเสียง Discord เป็นเจ้าของการเล่น TTS สุดท้าย
-- `voice.model` เมื่อกำหนดไว้ จะแทนที่เฉพาะ LLM ตอบกลับสำหรับรอบแชนแนลเสียงนี้
-- `voice.tts` ถูกผสานทับ `messages.tts`; เสียงผลลัพธ์จะถูกเล่นในแชนแนลที่เข้าร่วมอยู่
+- ทรานสคริปต์ถูกส่งผ่านทางเข้าและการกำหนดเส้นทางของ Discord ขณะที่ LLM สำหรับตอบกลับทำงานด้วยนโยบายเอาต์พุตเสียงที่ซ่อนเครื่องมือ `tts` ของเอเจนต์และขอให้ส่งคืนเป็นข้อความ เพราะเสียง Discord เป็นเจ้าของการเล่น TTS สุดท้าย
+- เมื่อกำหนด `voice.model` ไว้ จะแทนที่เฉพาะ LLM สำหรับตอบกลับในรอบช่องเสียงนี้
+- `voice.tts` จะถูกผสานทับ `messages.tts`; เสียงที่ได้จะถูกเล่นในช่องที่เข้าร่วมอยู่
-ข้อมูลรับรองถูกระบุต่อคอมโพเนนต์: การตรวจสอบสิทธิ์เส้นทาง LLM สำหรับ `voice.model`, การตรวจสอบสิทธิ์ STT สำหรับ `tools.media.audio` และการตรวจสอบสิทธิ์ TTS สำหรับ `messages.tts`/`voice.tts`
+ข้อมูลประจำตัวถูกแก้แยกตามคอมโพเนนต์: การตรวจสอบสิทธิ์เส้นทาง LLM สำหรับ `voice.model`, การตรวจสอบสิทธิ์ STT สำหรับ `tools.media.audio`, และการตรวจสอบสิทธิ์ TTS สำหรับ `messages.tts`/`voice.tts`
### ข้อความเสียง
-ข้อความเสียง Discord แสดงพรีวิวคลื่นเสียงและต้องใช้ออดิโอ OGG/Opus OpenClaw สร้างคลื่นเสียงให้อัตโนมัติ แต่ต้องมี `ffmpeg` และ `ffprobe` บนโฮสต์ Gateway เพื่อตรวจสอบและแปลง
+ข้อความเสียง Discord แสดงพรีวิวคลื่นเสียงและต้องใช้เสียง OGG/Opus OpenClaw สร้างคลื่นเสียงให้อัตโนมัติ แต่ต้องมี `ffmpeg` และ `ffprobe` บนโฮสต์ Gateway เพื่อตรวจสอบและแปลง
- ระบุ **พาธไฟล์ในเครื่อง** (URL จะถูกปฏิเสธ)
- ละเว้นเนื้อหาข้อความ (Discord ปฏิเสธข้อความ + ข้อความเสียงในเพย์โหลดเดียวกัน)
-- รองรับรูปแบบออดิโอใดก็ได้; OpenClaw จะแปลงเป็น OGG/Opus ตามต้องการ
+- รองรับรูปแบบเสียงใดก็ได้; OpenClaw จะแปลงเป็น OGG/Opus ตามจำเป็น
```bash
message(action="send", channel="discord", target="channel:123", path="/path/to/audio.mp3", asVoice=true)
@@ -1210,7 +1208,7 @@ message(action="send", channel="discord", target="channel:123", path="/path/to/a
## การแก้ไขปัญหา
-
+
- เปิดใช้ Message Content Intent
- เปิดใช้ Server Members Intent เมื่อคุณพึ่งพาการระบุผู้ใช้/สมาชิก
@@ -1218,11 +1216,11 @@ message(action="send", channel="discord", target="channel:123", path="/path/to/a
-
+
- ตรวจสอบ `groupPolicy`
- - ตรวจสอบรายการอนุญาตกิลด์ภายใต้ `channels.discord.guilds`
- - หากมีแผนที่ `channels` ของกิลด์อยู่ จะอนุญาตเฉพาะแชนแนลที่ระบุไว้เท่านั้น
+ - ตรวจสอบรายการอนุญาต guild ใต้ `channels.discord.guilds`
+ - หากมีแมป `channels` ของ guild จะอนุญาตเฉพาะช่องที่ระบุไว้เท่านั้น
- ตรวจสอบพฤติกรรม `requireMention` และรูปแบบการกล่าวถึง
การตรวจสอบที่มีประโยชน์:
@@ -1235,16 +1233,16 @@ openclaw logs --follow
-
- สาเหตุทั่วไป:
+
+ สาเหตุที่พบบ่อย:
- - `groupPolicy="allowlist"` โดยไม่มีรายการอนุญาตกิลด์/แชนแนลที่ตรงกัน
- - กำหนดค่า `requireMention` ผิดตำแหน่ง (ต้องอยู่ภายใต้ `channels.discord.guilds` หรือรายการแชนแนล)
- - ผู้ส่งถูกบล็อกโดยรายการอนุญาต `users` ของกิลด์/แชนแนล
+ - `groupPolicy="allowlist"` โดยไม่มีรายการอนุญาต guild/channel ที่ตรงกัน
+ - กำหนดค่า `requireMention` ผิดตำแหน่ง (ต้องอยู่ใต้ `channels.discord.guilds` หรือรายการช่อง)
+ - ผู้ส่งถูกบล็อกโดยรายการอนุญาต `users` ของ guild/channel
-
+
บันทึกทั่วไป:
@@ -1255,9 +1253,9 @@ openclaw logs --follow
- บัญชีเดียว: `channels.discord.eventQueue.listenerTimeout`
- หลายบัญชี: `channels.discord.accounts..eventQueue.listenerTimeout`
- - ค่านี้ควบคุมเฉพาะงานตัวฟัง Gateway ของ Discord ไม่ใช่อายุรอบของเอเจนต์
+ - ค่านี้ควบคุมเฉพาะงาน listener ของ Gateway Discord ไม่ใช่อายุการทำงานของรอบเอเจนต์
- Discord ไม่ใช้ไทม์เอาต์ที่แชนแนลเป็นเจ้าของกับรอบเอเจนต์ที่เข้าคิวไว้ ตัวฟังข้อความจะส่งต่อทันที และการรัน Discord ที่เข้าคิวไว้จะรักษาลำดับต่อเซสชันจนกว่าอายุการทำงานของเซสชัน/เครื่องมือ/รันไทม์จะเสร็จสิ้นหรือยกเลิกงาน
+ Discord ไม่ใช้การหมดเวลาที่ช่องเป็นเจ้าของกับรอบเอเจนต์ที่อยู่ในคิว ตัวฟังข้อความจะส่งต่องานทันที และการรัน Discord ที่เข้าคิวจะรักษาลำดับรายเซสชันไว้จนกว่าวงจรชีวิตของเซสชัน/เครื่องมือ/รันไทม์จะเสร็จสมบูรณ์หรือยกเลิกงาน
```json5
{
@@ -1277,53 +1275,53 @@ openclaw logs --follow
-
- OpenClaw ดึงเมตาดาต้า `/gateway/bot` ของ Discord ก่อนเชื่อมต่อ ความล้มเหลวชั่วคราวจะย้อนกลับไปใช้ URL Gateway เริ่มต้นของ Discord และถูกจำกัดอัตราในบันทึก
+
+ OpenClaw ดึงข้อมูลเมทาดาทา `/gateway/bot` ของ Discord ก่อนเชื่อมต่อ ความล้มเหลวชั่วคราวจะย้อนกลับไปใช้ URL Gateway เริ่มต้นของ Discord และถูกจำกัดอัตราในบันทึก
- ปุ่มปรับแต่งไทม์เอาต์เมตาดาต้า:
+ ปุ่มปรับแต่งการหมดเวลาเมทาดาทา:
- บัญชีเดียว: `channels.discord.gatewayInfoTimeoutMs`
- หลายบัญชี: `channels.discord.accounts..gatewayInfoTimeoutMs`
- - env สำรองเมื่อไม่ได้ตั้งค่าคอนฟิก: `OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS`
+ - ค่า env สำรองเมื่อไม่ได้ตั้งค่าคอนฟิก: `OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS`
- ค่าเริ่มต้น: `30000` (30 วินาที), สูงสุด: `120000`
-
- OpenClaw รอเหตุการณ์ `READY` ของ gateway ของ Discord ระหว่างการเริ่มต้นและหลังการเชื่อมต่อใหม่ขณะรันไทม์ การตั้งค่าหลายบัญชีที่มีการหน่วงเวลาเริ่มต้นอาจต้องใช้ช่วงเวลา READY ตอนเริ่มต้นที่ยาวกว่าค่าเริ่มต้น
+
+ OpenClaw รอเหตุการณ์ `READY` ของ Gateway ของ Discord ระหว่างการเริ่มต้นและหลังจากการเชื่อมต่อใหม่ขณะรันไทม์ การตั้งค่าหลายบัญชีที่มีการหน่วงเวลาเริ่มต้นทีละบัญชีอาจต้องใช้ช่วงเวลา READY ตอนเริ่มต้นที่นานกว่าค่าเริ่มต้น
- ตัวปรับแต่งการหมดเวลา READY:
+ ปุ่มปรับค่าการหมดเวลา READY:
- - บัญชีเดียวตอนเริ่มต้น: `channels.discord.gatewayReadyTimeoutMs`
- - หลายบัญชีตอนเริ่มต้น: `channels.discord.accounts..gatewayReadyTimeoutMs`
- - ค่าสำรอง env ตอนเริ่มต้นเมื่อไม่ได้ตั้งค่า config: `OPENCLAW_DISCORD_READY_TIMEOUT_MS`
- - ค่าเริ่มต้นตอนเริ่มต้น: `15000` (15 วินาที), สูงสุด: `120000`
- - บัญชีเดียวขณะรันไทม์: `channels.discord.gatewayRuntimeReadyTimeoutMs`
- - หลายบัญชีขณะรันไทม์: `channels.discord.accounts..gatewayRuntimeReadyTimeoutMs`
- - ค่าสำรอง env ขณะรันไทม์เมื่อไม่ได้ตั้งค่า config: `OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS`
- - ค่าเริ่มต้นขณะรันไทม์: `30000` (30 วินาที), สูงสุด: `120000`
+ - การเริ่มต้นแบบบัญชีเดียว: `channels.discord.gatewayReadyTimeoutMs`
+ - การเริ่มต้นแบบหลายบัญชี: `channels.discord.accounts..gatewayReadyTimeoutMs`
+ - ค่า env สำรองสำหรับการเริ่มต้นเมื่อไม่ได้ตั้งค่าคอนฟิก: `OPENCLAW_DISCORD_READY_TIMEOUT_MS`
+ - ค่าเริ่มต้นสำหรับการเริ่มต้น: `15000` (15 วินาที), สูงสุด: `120000`
+ - รันไทม์แบบบัญชีเดียว: `channels.discord.gatewayRuntimeReadyTimeoutMs`
+ - รันไทม์แบบหลายบัญชี: `channels.discord.accounts..gatewayRuntimeReadyTimeoutMs`
+ - ค่า env สำรองสำหรับรันไทม์เมื่อไม่ได้ตั้งค่าคอนฟิก: `OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS`
+ - ค่าเริ่มต้นสำหรับรันไทม์: `30000` (30 วินาที), สูงสุด: `120000`
-
- การตรวจสอบสิทธิ์ของ `channels status --probe` ใช้งานได้เฉพาะกับ ID ช่องแบบตัวเลขเท่านั้น
+
+ การตรวจสอบสิทธิ์ด้วย `channels status --probe` ใช้งานได้เฉพาะกับ ID ช่องแบบตัวเลขเท่านั้น
- หากคุณใช้คีย์แบบ slug การจับคู่ขณะรันไทม์ยังคงทำงานได้ แต่ probe จะไม่สามารถตรวจสอบสิทธิ์ได้ครบถ้วน
+ หากคุณใช้คีย์แบบ slug การจับคู่ขณะรันไทม์อาจยังใช้งานได้ แต่ probe ไม่สามารถตรวจสอบสิทธิ์ได้ครบถ้วน
- ปิดใช้งาน DM: `channels.discord.dm.enabled=false`
- - ปิดใช้งานนโยบาย DM: `channels.discord.dmPolicy="disabled"` (เดิม: `channels.discord.dm.policy`)
+ - ปิดใช้งานนโยบาย DM: `channels.discord.dmPolicy="disabled"` (แบบเดิม: `channels.discord.dm.policy`)
- กำลังรออนุมัติการจับคู่ในโหมด `pairing`
- โดยค่าเริ่มต้น ข้อความที่บอตเป็นผู้เขียนจะถูกละเว้น
+ โดยค่าเริ่มต้น ข้อความที่เขียนโดยบอตจะถูกละเว้น
- หากคุณตั้งค่า `channels.discord.allowBots=true` ให้ใช้กฎการกล่าวถึงและ allowlist ที่เข้มงวดเพื่อหลีกเลี่ยงพฤติกรรมวนลูป
+ หากคุณตั้งค่า `channels.discord.allowBots=true` ให้ใช้กฎการกล่าวถึงและ allowlist ที่เข้มงวดเพื่อหลีกเลี่ยงพฤติกรรมแบบลูป
แนะนำให้ใช้ `channels.discord.allowBots="mentions"` เพื่อรับเฉพาะข้อความจากบอตที่กล่าวถึงบอตนี้เท่านั้น
```json5
@@ -1351,15 +1349,15 @@ openclaw logs --follow
-
+
- - ใช้ OpenClaw เวอร์ชันปัจจุบันเสมอ (`openclaw update`) เพื่อให้มีตรรกะกู้คืนการรับเสียงของ Discord
+ - ใช้ OpenClaw เวอร์ชันปัจจุบันอยู่เสมอ (`openclaw update`) เพื่อให้มีตรรกะกู้คืนการรับเสียงของ Discord
- ยืนยันว่า `channels.discord.voice.daveEncryption=true` (ค่าเริ่มต้น)
- เริ่มจาก `channels.discord.voice.decryptionFailureTolerance=24` (ค่าเริ่มต้นจาก upstream) และปรับเฉพาะเมื่อจำเป็น
- ดูบันทึกสำหรับ:
- `discord voice: DAVE decrypt failures detected`
- `discord voice: repeated decrypt failures; attempting rejoin`
- - หากยังล้มเหลวต่อหลังจากเข้าร่วมใหม่อัตโนมัติ ให้รวบรวมบันทึกและเปรียบเทียบกับประวัติการรับ DAVE จาก upstream ใน [discord.js #11419](https://github.com/discordjs/discord.js/issues/11419) และ [discord.js #11449](https://github.com/discordjs/discord.js/pull/11449)
+ - หากยังล้มเหลวต่อหลังจากเข้าร่วมใหม่โดยอัตโนมัติ ให้รวบรวมบันทึกและเปรียบเทียบกับประวัติการรับ DAVE จาก upstream ใน [discord.js #11419](https://github.com/discordjs/discord.js/issues/11419) และ [discord.js #11449](https://github.com/discordjs/discord.js/pull/11449)
@@ -1370,47 +1368,47 @@ openclaw logs --follow
-- การเริ่มต้น/การยืนยันตัวตน: `enabled`, `token`, `accounts.*`, `allowBots`
+- การเริ่มต้น/auth: `enabled`, `token`, `accounts.*`, `allowBots`
- นโยบาย: `groupPolicy`, `dm.*`, `guilds.*`, `guilds.*.channels.*`
- คำสั่ง: `commands.native`, `commands.useAccessGroups`, `configWrites`, `slashCommand.*`
-- คิวเหตุการณ์: `eventQueue.listenerTimeout` (งบเวลาของ listener), `eventQueue.maxQueueSize`, `eventQueue.maxConcurrency`
-- gateway: `gatewayInfoTimeoutMs`, `gatewayReadyTimeoutMs`, `gatewayRuntimeReadyTimeoutMs`
+- คิวเหตุการณ์: `eventQueue.listenerTimeout` (งบเวลา listener), `eventQueue.maxQueueSize`, `eventQueue.maxConcurrency`
+- Gateway: `gatewayInfoTimeoutMs`, `gatewayReadyTimeoutMs`, `gatewayRuntimeReadyTimeoutMs`
- การตอบกลับ/ประวัติ: `replyToMode`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit`
-- การส่ง: `textChunkLimit`, `chunkMode`, `maxLinesPerMessage`
+- การส่งข้อความ: `textChunkLimit`, `chunkMode`, `maxLinesPerMessage`
- การสตรีม: `streaming` (alias เดิม: `streamMode`), `streaming.preview.toolProgress`, `draftChunk`, `blockStreaming`, `blockStreamingCoalesce`
- สื่อ/การลองใหม่: `mediaMaxMb` (จำกัดการอัปโหลดออกไปยัง Discord, ค่าเริ่มต้น `100MB`), `retry`
-- การกระทำ: `actions.*`
+- การดำเนินการ: `actions.*`
- สถานะออนไลน์: `activity`, `status`, `activityType`, `activityUrl`
- UI: `ui.components.accentColor`
-- ฟีเจอร์: `threadBindings`, ระดับบนสุด `bindings[]` (`type: "acp"`), `pluralkit`, `execApprovals`, `intents`, `agentComponents`, `heartbeat`, `responsePrefix`
+- ฟีเจอร์: `threadBindings`, `bindings[]` ระดับบน (`type: "acp"`), `pluralkit`, `execApprovals`, `intents`, `agentComponents`, `heartbeat`, `responsePrefix`
-## ความปลอดภัยและการปฏิบัติการ
+## ความปลอดภัยและการปฏิบัติงาน
-- จัดการโทเค็นบอตเป็นความลับ (แนะนำให้ใช้ `DISCORD_BOT_TOKEN` ในสภาพแวดล้อมที่มีการกำกับดูแล)
-- ให้สิทธิ์ Discord เท่าที่จำเป็นเท่านั้น
-- หากการ deploy/สถานะของคำสั่งล้าสมัย ให้รีสตาร์ท gateway แล้วตรวจสอบอีกครั้งด้วย `openclaw channels status --probe`
+- ปฏิบัติต่อโทเคนบอตเป็นความลับ (แนะนำให้ใช้ `DISCORD_BOT_TOKEN` ในสภาพแวดล้อมที่มีการควบคุม)
+- ให้สิทธิ์ Discord เท่าที่จำเป็นน้อยที่สุด
+- หากสถานะการ deploy คำสั่ง/สถานะค้าง ให้รีสตาร์ต Gateway และตรวจสอบอีกครั้งด้วย `openclaw channels status --probe`
## ที่เกี่ยวข้อง
- จับคู่ผู้ใช้ Discord กับ gateway
+ จับคู่ผู้ใช้ Discord กับ Gateway
พฤติกรรมแชตกลุ่มและ allowlist
- กำหนดเส้นทางข้อความขาเข้าไปยัง agent
+ กำหนดเส้นทางข้อความขาเข้าไปยังเอเจนต์
- แบบจำลองภัยคุกคามและการเพิ่มความแข็งแกร่ง
+ โมเดลภัยคุกคามและการเสริมความปลอดภัย
-
- จับคู่ guild และช่องกับ agent
+
+ แมป guild และช่องกับเอเจนต์
-
- พฤติกรรมคำสั่ง native
+
+ พฤติกรรมคำสั่งแบบเนทีฟ
diff --git a/docs/th/channels/googlechat.md b/docs/th/channels/googlechat.md
index 11a107e4a..d7ca53de3 100644
--- a/docs/th/channels/googlechat.md
+++ b/docs/th/channels/googlechat.md
@@ -1,18 +1,18 @@
---
read_when:
- กำลังทำงานกับฟีเจอร์ช่องทาง Google Chat
-summary: สถานะการรองรับแอป Google Chat, ความสามารถ และการกำหนดค่า
+summary: สถานะการรองรับ ความสามารถ และการกำหนดค่าของแอป Google Chat
title: Google Chat
x-i18n:
- generated_at: "2026-05-02T10:07:23Z"
+ generated_at: "2026-05-04T02:21:27Z"
model: gpt-5.5
provider: openai
- source_hash: fdb8dcf651602e92801d7107646d853871ea6cef188a8733a831695a1243740e
+ source_hash: afa2ca4d9673396aa24a55ca5855a34ad26a4640c3a1f6928dbf7246e403cb04
source_path: channels/googlechat.md
workflow: 16
---
-สถานะ: Plugin ที่ดาวน์โหลดได้สำหรับ DM + สเปซผ่าน Webhook ของ Google Chat API (HTTP เท่านั้น)
+สถานะ: Plugin ที่ดาวน์โหลดได้สำหรับ DMs + พื้นที่ทำงานผ่าน Webhook ของ Google Chat API (HTTP เท่านั้น)
## ติดตั้ง
@@ -22,29 +22,29 @@ x-i18n:
openclaw plugins install @openclaw/googlechat
```
-เช็กเอาต์ในเครื่อง (เมื่อเรียกใช้จาก git repo):
+เช็กเอาต์ในเครื่อง (เมื่อเรียกใช้จาก repo git):
```bash
openclaw plugins install ./path/to/local/googlechat-plugin
```
-## ตั้งค่าอย่างรวดเร็ว (สำหรับผู้เริ่มต้น)
+## การตั้งค่าแบบเร็ว (สำหรับผู้เริ่มต้น)
1. สร้างโปรเจกต์ Google Cloud และเปิดใช้ **Google Chat API**
- - ไปที่: [ข้อมูลรับรอง Google Chat API](https://console.cloud.google.com/apis/api/chat.googleapis.com/credentials)
+ - ไปที่: [ข้อมูลประจำตัว Google Chat API](https://console.cloud.google.com/apis/api/chat.googleapis.com/credentials)
- เปิดใช้ API หากยังไม่ได้เปิดใช้
2. สร้าง **Service Account**:
- กด **Create Credentials** > **Service Account**
- - ตั้งชื่ออะไรก็ได้ที่ต้องการ (เช่น `openclaw-chat`)
- - เว้นสิทธิ์ว่างไว้ (กด **Continue**)
- - เว้นผู้รับสิทธิ์เข้าถึงว่างไว้ (กด **Done**)
+ - ตั้งชื่อใดก็ได้ที่คุณต้องการ (เช่น `openclaw-chat`)
+ - เว้นสิทธิ์ไว้เป็นค่าว่าง (กด **Continue**)
+ - เว้น principal ที่มีสิทธิ์เข้าถึงไว้เป็นค่าว่าง (กด **Done**)
3. สร้างและดาวน์โหลด **JSON Key**:
- - ในรายการ service account ให้คลิกตัวที่คุณเพิ่งสร้าง
+ - ในรายการ service account ให้คลิกรายการที่คุณเพิ่งสร้าง
- ไปที่แท็บ **Keys**
- คลิก **Add Key** > **Create new key**
- เลือก **JSON** แล้วกด **Create**
4. เก็บไฟล์ JSON ที่ดาวน์โหลดไว้บนโฮสต์ Gateway ของคุณ (เช่น `~/.openclaw/googlechat-service-account.json`)
-5. สร้างแอป Google Chat ใน [การกำหนดค่า Chat ของ Google Cloud Console](https://console.cloud.google.com/apis/api/chat.googleapis.com/hangouts-chat):
+5. สร้างแอป Google Chat ใน [การกำหนดค่า Chat ใน Google Cloud Console](https://console.cloud.google.com/apis/api/chat.googleapis.com/hangouts-chat):
- กรอก **Application info**:
- **App name**: (เช่น `OpenClaw`)
- **Avatar URL**: (เช่น `https://openclaw.ai/logo.png`)
@@ -53,42 +53,42 @@ openclaw plugins install ./path/to/local/googlechat-plugin
- ใต้ **Functionality** ให้เลือก **Join spaces and group conversations**
- ใต้ **Connection settings** ให้เลือก **HTTP endpoint URL**
- ใต้ **Triggers** ให้เลือก **Use a common HTTP endpoint URL for all triggers** แล้วตั้งค่าเป็น URL สาธารณะของ Gateway ตามด้วย `/googlechat`
- - _เคล็ดลับ: เรียกใช้ `openclaw status` เพื่อหา URL สาธารณะของ Gateway_
+ - _เคล็ดลับ: รัน `openclaw status` เพื่อหา URL สาธารณะของ Gateway_
- ใต้ **Visibility** ให้เลือก **Make this Chat app available to specific people and groups in ``**
- - ป้อนอีเมลของคุณ (เช่น `user@example.com`) ในกล่องข้อความ
+ - ป้อนที่อยู่อีเมลของคุณ (เช่น `user@example.com`) ในกล่องข้อความ
- คลิก **Save** ที่ด้านล่าง
6. **เปิดใช้สถานะแอป**:
- - หลังบันทึกแล้ว ให้ **รีเฟรชหน้า**
- - มองหาส่วน **App status** (มักอยู่ใกล้ด้านบนหรือด้านล่างหลังบันทึก)
+ - หลังจากบันทึกแล้ว ให้ **รีเฟรชหน้า**
+ - มองหาส่วน **App status** (โดยปกติจะอยู่ใกล้ด้านบนหรือด้านล่างหลังจากบันทึก)
- เปลี่ยนสถานะเป็น **Live - available to users**
- คลิก **Save** อีกครั้ง
-7. กำหนดค่า OpenClaw ด้วยพาธ service account + กลุ่มเป้าหมายของ Webhook:
+7. กำหนดค่า OpenClaw ด้วย path ของ service account + audience ของ Webhook:
- Env: `GOOGLE_CHAT_SERVICE_ACCOUNT_FILE=/path/to/service-account.json`
- หรือ config: `channels.googlechat.serviceAccountFile: "/path/to/service-account.json"`
-8. ตั้งค่าประเภท + ค่ากลุ่มเป้าหมายของ Webhook (ให้ตรงกับ config แอป Chat ของคุณ)
-9. เริ่ม Gateway Google Chat จะส่ง POST ไปยังพาธ Webhook ของคุณ
+8. ตั้งค่าประเภท + ค่าของ audience สำหรับ Webhook (ให้ตรงกับ config แอป Chat ของคุณ)
+9. เริ่ม Gateway จากนั้น Google Chat จะส่ง POST ไปยัง path ของ Webhook
-## เพิ่มไปยัง Google Chat
+## เพิ่มลงใน Google Chat
-เมื่อ Gateway ทำงานอยู่และอีเมลของคุณถูกเพิ่มในรายการการมองเห็นแล้ว:
+เมื่อ Gateway ทำงานอยู่และเพิ่มอีเมลของคุณในรายการ visibility แล้ว:
1. ไปที่ [Google Chat](https://chat.google.com/)
-2. คลิกไอคอน **+** (บวก) ถัดจาก **ข้อความส่วนตัว**
-3. ในแถบค้นหา (ตำแหน่งที่ปกติใช้เพิ่มคน) ให้พิมพ์ **ชื่อแอป** ที่คุณกำหนดค่าใน Google Cloud Console
- - **หมายเหตุ**: บอทจะ _ไม่_ ปรากฏในรายการเรียกดู "Marketplace" เพราะเป็นแอปส่วนตัว คุณต้องค้นหาด้วยชื่อ
-4. เลือกบอทของคุณจากผลลัพธ์
+2. คลิกไอคอน **+** (บวก) ข้าง **Direct Messages**
+3. ในแถบค้นหา (ตำแหน่งที่คุณมักเพิ่มคน) ให้พิมพ์ **App name** ที่คุณกำหนดค่าไว้ใน Google Cloud Console
+ - **หมายเหตุ**: บอตจะ _ไม่_ ปรากฏในรายการเรียกดู "Marketplace" เพราะเป็นแอปส่วนตัว คุณต้องค้นหาด้วยชื่อ
+4. เลือกบอตของคุณจากผลลัพธ์
5. คลิก **Add** หรือ **Chat** เพื่อเริ่มการสนทนาแบบ 1:1
-6. ส่ง "สวัสดี" เพื่อเรียกใช้งานผู้ช่วย!
+6. ส่ง "สวัสดี" เพื่อเรียกใช้ผู้ช่วย!
## URL สาธารณะ (เฉพาะ Webhook)
-Webhook ของ Google Chat ต้องใช้เอนด์พอยต์ HTTPS สาธารณะ เพื่อความปลอดภัย **ให้เปิดเผยเฉพาะพาธ `/googlechat`** สู่อินเทอร์เน็ต เก็บแดชบอร์ด OpenClaw และเอนด์พอยต์อ่อนไหวอื่น ๆ ไว้ในเครือข่ายส่วนตัวของคุณ
+Webhook ของ Google Chat ต้องใช้ endpoint HTTPS สาธารณะ เพื่อความปลอดภัย **ให้เปิดเผยเฉพาะ path `/googlechat`** สู่ internet เท่านั้น เก็บแดชบอร์ด OpenClaw และ endpoint ที่ละเอียดอ่อนอื่นๆ ไว้ในเครือข่ายส่วนตัวของคุณ
### ตัวเลือก A: Tailscale Funnel (แนะนำ)
-ใช้ Tailscale Serve สำหรับแดชบอร์ดส่วนตัวและ Funnel สำหรับพาธ Webhook สาธารณะ วิธีนี้ทำให้ `/` เป็นส่วนตัว ขณะเปิดเผยเฉพาะ `/googlechat`
+ใช้ Tailscale Serve สำหรับแดชบอร์ดส่วนตัว และ Funnel สำหรับ path Webhook สาธารณะ วิธีนี้ทำให้ `/` เป็นส่วนตัว ขณะที่เปิดเผยเฉพาะ `/googlechat`
-1. **ตรวจสอบว่า Gateway ของคุณผูกอยู่กับแอดเดรสใด:**
+1. **ตรวจสอบว่า Gateway ของคุณ bind อยู่กับที่อยู่ใด:**
```bash
ss -tlnp | grep 18789
@@ -96,7 +96,7 @@ Webhook ของ Google Chat ต้องใช้เอนด์พอยต
จดที่อยู่ IP ไว้ (เช่น `127.0.0.1`, `0.0.0.0` หรือ IP ของ Tailscale เช่น `100.x.x.x`)
-2. **เปิดแดชบอร์ดให้เฉพาะ tailnet เท่านั้น (พอร์ต 8443):**
+2. **เปิดเผยแดชบอร์ดให้เฉพาะ tailnet เท่านั้น (พอร์ต 8443):**
```bash
# If bound to localhost (127.0.0.1 or 0.0.0.0):
@@ -106,7 +106,7 @@ Webhook ของ Google Chat ต้องใช้เอนด์พอยต
tailscale serve --bg --https 8443 http://100.106.161.80:18789
```
-3. **เปิดเผยเฉพาะพาธ Webhook แบบสาธารณะ:**
+3. **เปิดเผยเฉพาะ path ของ Webhook แบบสาธารณะ:**
```bash
# If bound to localhost (127.0.0.1 or 0.0.0.0):
@@ -116,8 +116,8 @@ Webhook ของ Google Chat ต้องใช้เอนด์พอยต
tailscale funnel --bg --set-path /googlechat http://100.106.161.80:18789/googlechat
```
-4. **อนุญาต node ให้เข้าถึง Funnel:**
- หากระบบแจ้ง ให้ไปที่ URL อนุญาตที่แสดงในเอาต์พุตเพื่อเปิดใช้ Funnel สำหรับ node นี้ในนโยบาย tailnet ของคุณ
+4. **อนุญาต Node สำหรับการเข้าถึง Funnel:**
+ หากมี prompt ให้ไปที่ URL สำหรับการอนุญาตที่แสดงในเอาต์พุต เพื่อเปิดใช้ Funnel สำหรับ Node นี้ในนโยบาย tailnet ของคุณ
5. **ตรวจสอบการกำหนดค่า:**
@@ -129,16 +129,16 @@ Webhook ของ Google Chat ต้องใช้เอนด์พอยต
URL Webhook สาธารณะของคุณจะเป็น:
`https://..ts.net/googlechat`
-แดชบอร์ดส่วนตัวของคุณยังคงเข้าถึงได้เฉพาะ tailnet:
+แดชบอร์ดส่วนตัวของคุณจะยังคงเข้าถึงได้เฉพาะใน tailnet:
`https://..ts.net:8443/`
-ใช้ URL สาธารณะ (ไม่มี `:8443`) ใน config แอป Google Chat
+ใช้ URL สาธารณะ (ไม่รวม `:8443`) ใน config แอป Google Chat
-> หมายเหตุ: การกำหนดค่านี้คงอยู่ข้ามการรีบูต หากต้องการนำออกภายหลัง ให้เรียกใช้ `tailscale funnel reset` และ `tailscale serve reset`
+> หมายเหตุ: การกำหนดค่านี้จะคงอยู่หลังรีบูต หากต้องการนำออกภายหลัง ให้รัน `tailscale funnel reset` และ `tailscale serve reset`
-### ตัวเลือก B: รีเวิร์สพร็อกซี (Caddy)
+### ตัวเลือก B: Reverse Proxy (Caddy)
-หากคุณใช้รีเวิร์สพร็อกซีอย่าง Caddy ให้พร็อกซีเฉพาะพาธที่ระบุเท่านั้น:
+หากคุณใช้ reverse proxy เช่น Caddy ให้ proxy เฉพาะ path ที่ระบุ:
```caddy
your-domain.com {
@@ -146,38 +146,38 @@ your-domain.com {
}
```
-ด้วย config นี้ คำขอใด ๆ ไปยัง `your-domain.com/` จะถูกเพิกเฉยหรือส่งกลับเป็น 404 ขณะที่ `your-domain.com/googlechat` จะถูกกำหนดเส้นทางไปยัง OpenClaw อย่างปลอดภัย
+ด้วย config นี้ คำขอใดๆ ไปที่ `your-domain.com/` จะถูกละเว้นหรือส่งกลับเป็น 404 ขณะที่ `your-domain.com/googlechat` จะถูก route ไปยัง OpenClaw อย่างปลอดภัย
### ตัวเลือก C: Cloudflare Tunnel
-กำหนดค่า ingress rules ของ tunnel ให้กำหนดเส้นทางเฉพาะพาธ Webhook:
+กำหนดค่ากฎ ingress ของ tunnel ให้ route เฉพาะ path ของ Webhook:
-- **พาธ**: `/googlechat` -> `http://localhost:18789/googlechat`
-- **กฎเริ่มต้น**: HTTP 404 (Not Found)
+- **Path**: `/googlechat` -> `http://localhost:18789/googlechat`
+- **Default Rule**: HTTP 404 (Not Found)
-## วิธีการทำงาน
+## วิธีทำงาน
-1. Google Chat ส่ง Webhook POST ไปยัง Gateway แต่ละคำขอมีส่วนหัว `Authorization: Bearer `
- - OpenClaw ตรวจสอบ bearer auth ก่อนอ่าน/แยกวิเคราะห์เนื้อหา Webhook แบบเต็มเมื่อมีส่วนหัวนี้
- - รองรับคำขอ Google Workspace Add-on ที่มี `authorizationEventObject.systemIdToken` ในเนื้อหาผ่านงบประมาณเนื้อหา pre-auth ที่เข้มงวดยิ่งขึ้น
-2. OpenClaw ตรวจสอบ token เทียบกับ `audienceType` + `audience` ที่กำหนดค่าไว้:
- - `audienceType: "app-url"` → audience คือ URL Webhook HTTPS ของคุณ
+1. Google Chat ส่ง Webhook POST ไปยัง Gateway แต่ละคำขอมี header `Authorization: Bearer `
+ - OpenClaw ตรวจสอบ bearer auth ก่อนอ่าน/parse body ของ Webhook ทั้งหมดเมื่อมี header อยู่
+ - รองรับคำขอ Google Workspace Add-on ที่มี `authorizationEventObject.systemIdToken` ใน body ผ่านงบประมาณ body ก่อน auth ที่เข้มงวดยิ่งขึ้น
+2. OpenClaw ตรวจสอบ token กับ `audienceType` + `audience` ที่กำหนดค่าไว้:
+ - `audienceType: "app-url"` → audience คือ URL HTTPS Webhook ของคุณ
- `audienceType: "project-number"` → audience คือหมายเลขโปรเจกต์ Cloud
-3. ข้อความถูกกำหนดเส้นทางตามสเปซ:
- - DM ใช้คีย์เซสชัน `agent::googlechat:direct:`
- - สเปซใช้คีย์เซสชัน `agent::googlechat:group:`
-4. การเข้าถึง DM ใช้การจับคู่เป็นค่าเริ่มต้น ผู้ส่งที่ไม่รู้จักจะได้รับรหัสจับคู่ อนุมัติด้วย:
+3. ข้อความจะถูก route ตามพื้นที่ทำงาน:
+ - DMs ใช้ session key `agent::googlechat:direct:`
+ - พื้นที่ทำงานใช้ session key `agent::googlechat:group:`
+4. การเข้าถึง DM ใช้การ pairing เป็นค่าเริ่มต้น ผู้ส่งที่ไม่รู้จักจะได้รับ pairing code; อนุมัติด้วย:
- `openclaw pairing approve googlechat `
-5. สเปซแบบกลุ่มต้อง @-mention เป็นค่าเริ่มต้น ใช้ `botUser` หากการตรวจจับ mention ต้องใช้ชื่อผู้ใช้ของแอป
+5. พื้นที่ทำงานแบบกลุ่มต้อง @-mention เป็นค่าเริ่มต้น ใช้ `botUser` หากการตรวจจับ mention ต้องใช้ชื่อผู้ใช้ของแอป
## เป้าหมาย
ใช้ตัวระบุเหล่านี้สำหรับการส่งและ allowlist:
-- ข้อความส่วนตัว: `users/` (แนะนำ)
-- อีเมลดิบ `name@example.com` เปลี่ยนแปลงได้และใช้เฉพาะสำหรับการจับคู่ allowlist โดยตรงเมื่อ `channels.googlechat.dangerouslyAllowNameMatching: true`
-- เลิกใช้แล้ว: `users/` จะถูกถือว่าเป็น user id ไม่ใช่ allowlist อีเมล
-- สเปซ: `spaces/`
+- ข้อความโดยตรง: `users/` (แนะนำ)
+- อีเมลดิบ `name@example.com` เปลี่ยนแปลงได้ และใช้เฉพาะสำหรับการจับคู่ allowlist โดยตรงเมื่อ `channels.googlechat.dangerouslyAllowNameMatching: true`
+- เลิกใช้แล้ว: `users/` จะถูกถือเป็น user id ไม่ใช่ allowlist อีเมล
+- พื้นที่ทำงาน: `spaces/`
## ไฮไลต์ config
@@ -199,7 +199,7 @@ your-domain.com {
groupPolicy: "allowlist",
groups: {
"spaces/AAAA": {
- allow: true,
+ enabled: true,
requireMention: true,
users: ["users/1234567890"],
systemPrompt: "Short answers only.",
@@ -215,16 +215,16 @@ your-domain.com {
หมายเหตุ:
-- ข้อมูลรับรอง service account สามารถส่งแบบ inline ด้วย `serviceAccount` (สตริง JSON) ได้ด้วย
-- รองรับ `serviceAccountRef` ด้วยเช่นกัน (env/file SecretRef) รวมถึง refs แบบต่อบัญชีใต้ `channels.googlechat.accounts..serviceAccountRef`
-- พาธ Webhook เริ่มต้นคือ `/googlechat` หากไม่ได้ตั้งค่า `webhookPath`
+- สามารถส่งข้อมูลประจำตัวของ service account แบบ inline ด้วย `serviceAccount` (สตริง JSON) ได้เช่นกัน
+- รองรับ `serviceAccountRef` เช่นกัน (env/file SecretRef) รวมถึง refs ต่อบัญชีภายใต้ `channels.googlechat.accounts..serviceAccountRef`
+- path Webhook เริ่มต้นคือ `/googlechat` หากไม่ได้ตั้งค่า `webhookPath`
- `dangerouslyAllowNameMatching` เปิดใช้การจับคู่ principal อีเมลที่เปลี่ยนแปลงได้อีกครั้งสำหรับ allowlist (โหมดความเข้ากันได้แบบ break-glass)
-- ปฏิกิริยาพร้อมใช้งานผ่านเครื่องมือ `reactions` และ `channels action` เมื่อเปิดใช้ `actions.reactions`
-- การดำเนินการกับข้อความเปิดเผย `send` สำหรับข้อความ และ `upload-file` สำหรับการส่งไฟล์แนบแบบระบุชัดเจน `upload-file` รับ `media` / `filePath` / `path` พร้อม `message`, `filename` และการกำหนดเป้าหมายเธรดที่เป็นตัวเลือก
+- Reactions พร้อมใช้งานผ่านเครื่องมือ `reactions` และ `channels action` เมื่อเปิดใช้ `actions.reactions`
+- การดำเนินการกับข้อความเปิดเผย `send` สำหรับข้อความ และ `upload-file` สำหรับการส่งไฟล์แนบแบบชัดเจน `upload-file` รับ `media` / `filePath` / `path` รวมถึง `message`, `filename` และการกำหนดเป้าหมาย thread ที่เป็นตัวเลือก
- `typingIndicator` รองรับ `none`, `message` (ค่าเริ่มต้น) และ `reaction` (`reaction` ต้องใช้ OAuth ของผู้ใช้)
-- ไฟล์แนบถูกดาวน์โหลดผ่าน Chat API และจัดเก็บใน pipeline สื่อ (จำกัดขนาดด้วย `mediaMaxMb`)
+- ไฟล์แนบจะถูกดาวน์โหลดผ่าน Chat API และเก็บไว้ใน pipeline สื่อ (จำกัดขนาดด้วย `mediaMaxMb`)
-รายละเอียด secrets reference: [การจัดการ Secrets](/th/gateway/secrets)
+รายละเอียดการอ้างอิง secrets: [การจัดการ Secrets](/th/gateway/secrets)
## การแก้ไขปัญหา
@@ -236,25 +236,25 @@ your-domain.com {
status code: 405, reason phrase: HTTP error response: HTTP/1.1 405 Method Not Allowed
```
-หมายความว่า webhook handler ไม่ได้ลงทะเบียน สาเหตุที่พบบ่อย:
+หมายความว่า handler ของ Webhook ไม่ได้ถูกลงทะเบียน สาเหตุทั่วไป:
-1. **ไม่ได้กำหนดค่าช่องทาง**: ส่วน `channels.googlechat` หายไปจาก config ของคุณ ตรวจสอบด้วย:
+1. **ยังไม่ได้กำหนดค่าช่องทาง**: ส่วน `channels.googlechat` หายไปจาก config ของคุณ ตรวจสอบด้วย:
```bash
openclaw config get channels.googlechat
```
- หากส่งกลับ "Config path not found" ให้เพิ่มการกำหนดค่า (ดู [ไฮไลต์ config](#config-highlights))
+ หากส่งกลับ "ไม่พบ path config" ให้เพิ่มการกำหนดค่า (ดู [ไฮไลต์ config](#config-highlights))
-2. **ไม่ได้เปิดใช้ Plugin**: ตรวจสอบสถานะ Plugin:
+2. **Plugin ไม่ได้เปิดใช้**: ตรวจสอบสถานะ Plugin:
```bash
openclaw plugins list | grep googlechat
```
- หากแสดงว่า "disabled" ให้เพิ่ม `plugins.entries.googlechat.enabled: true` ใน config ของคุณ
+ หากแสดง "disabled" ให้เพิ่ม `plugins.entries.googlechat.enabled: true` ลงใน config ของคุณ
-3. **Gateway ยังไม่ได้รีสตาร์ต**: หลังเพิ่ม config แล้ว ให้รีสตาร์ต Gateway:
+3. **Gateway ยังไม่ได้รีสตาร์ต**: หลังจากเพิ่ม config แล้ว ให้รีสตาร์ต Gateway:
```bash
openclaw gateway restart
@@ -267,23 +267,23 @@ openclaw channels status
# Should show: Google Chat default: enabled, configured, ...
```
-### ปัญหาอื่น ๆ
+### ปัญหาอื่นๆ
-- ตรวจสอบ `openclaw channels status --probe` เพื่อดูข้อผิดพลาด auth หรือ config audience ที่ขาดหาย
-- หากไม่มีข้อความเข้ามา ให้ยืนยัน URL Webhook + การสมัครรับเหตุการณ์ของแอป Chat
-- หาก mention gating บล็อกการตอบกลับ ให้ตั้งค่า `botUser` เป็นชื่อทรัพยากรผู้ใช้ของแอปและตรวจสอบ `requireMention`
+- ตรวจสอบ `openclaw channels status --probe` สำหรับข้อผิดพลาด auth หรือ config audience ที่หายไป
+- หากไม่มีข้อความเข้ามา ให้ยืนยัน URL Webhook + event subscriptions ของแอป Chat
+- หาก mention gating บล็อกการตอบกลับ ให้ตั้งค่า `botUser` เป็นชื่อ resource ผู้ใช้ของแอป แล้วตรวจสอบ `requireMention`
- ใช้ `openclaw logs --follow` ขณะส่งข้อความทดสอบเพื่อดูว่าคำขอไปถึง Gateway หรือไม่
เอกสารที่เกี่ยวข้อง:
- [การกำหนดค่า Gateway](/th/gateway/configuration)
- [ความปลอดภัย](/th/gateway/security)
-- [ปฏิกิริยา](/th/tools/reactions)
+- [Reactions](/th/tools/reactions)
## ที่เกี่ยวข้อง
- [ภาพรวมช่องทาง](/th/channels) — ช่องทางที่รองรับทั้งหมด
-- [การจับคู่](/th/channels/pairing) — การยืนยันตัวตน DM และโฟลว์การจับคู่
+- [Pairing](/th/channels/pairing) — การยืนยันตัวตน DM และ flow การ pairing
- [กลุ่ม](/th/channels/groups) — พฤติกรรมแชตกลุ่มและ mention gating
-- [การกำหนดเส้นทางช่องทาง](/th/channels/channel-routing) — การกำหนดเส้นทางเซสชันสำหรับข้อความ
-- [ความปลอดภัย](/th/gateway/security) — โมเดลการเข้าถึงและการเสริมความปลอดภัย
+- [การ route ช่องทาง](/th/channels/channel-routing) — การ route session สำหรับข้อความ
+- [ความปลอดภัย](/th/gateway/security) — โมเดลการเข้าถึงและการ hardening
diff --git a/docs/th/channels/groups.md b/docs/th/channels/groups.md
index bf38ffa4e..092fc546a 100644
--- a/docs/th/channels/groups.md
+++ b/docs/th/channels/groups.md
@@ -1,42 +1,42 @@
---
read_when:
- - การเปลี่ยนพฤติกรรมแชทกลุ่มหรือการควบคุมด้วยการกล่าวถึง
+ - การเปลี่ยนลักษณะการทำงานของแชตกลุ่มหรือการกำหนดเงื่อนไขการกล่าวถึง
sidebarTitle: Groups
-summary: ลักษณะการทำงานของแชตกลุ่มในแต่ละพื้นผิว (Discord/iMessage/Matrix/Microsoft Teams/Signal/Slack/Telegram/WhatsApp/Zalo)
+summary: พฤติกรรมของแชทกลุ่มในพื้นผิวต่าง ๆ (Discord/iMessage/Matrix/Microsoft Teams/Signal/Slack/Telegram/WhatsApp/Zalo)
title: กลุ่ม
x-i18n:
- generated_at: "2026-05-03T10:10:05Z"
+ generated_at: "2026-05-04T02:21:34Z"
model: gpt-5.5
provider: openai
- source_hash: 6fd4fcaa8335f1dc4b4b1a719d6654ab0c10530f74284269ed6205dd5f87c116
+ source_hash: dea506c011a5d8f6155b2f56aacb236482cb8c5b7457001cb2171fd45932443d
source_path: channels/groups.md
workflow: 16
---
-OpenClaw จัดการแชตกลุ่มอย่างสอดคล้องกันในทุกพื้นผิว: Discord, iMessage, Matrix, Microsoft Teams, Signal, Slack, Telegram, WhatsApp, Zalo.
+OpenClaw ปฏิบัติต่อแชตกลุ่มอย่างสม่ำเสมอในทุกพื้นผิว: Discord, iMessage, Matrix, Microsoft Teams, Signal, Slack, Telegram, WhatsApp, Zalo.
-## บทนำสำหรับผู้เริ่มต้น (2 นาที)
+## แนะนำสำหรับผู้เริ่มต้น (2 นาที)
-OpenClaw "อยู่" บนบัญชีข้อความของคุณเอง ไม่มีผู้ใช้บอต WhatsApp แยกต่างหาก หาก **คุณ** อยู่ในกลุ่ม OpenClaw จะเห็นกลุ่มนั้นและตอบกลับที่นั่นได้
+OpenClaw "อยู่" ในบัญชีรับส่งข้อความของคุณเอง ไม่มีผู้ใช้บอต WhatsApp แยกต่างหาก หาก **คุณ** อยู่ในกลุ่ม OpenClaw จะมองเห็นกลุ่มนั้นและตอบกลับในนั้นได้
พฤติกรรมเริ่มต้น:
- กลุ่มถูกจำกัด (`groupPolicy: "allowlist"`)
-- การตอบกลับต้องมีการกล่าวถึง เว้นแต่คุณจะปิดการควบคุมด้วยการกล่าวถึงอย่างชัดเจน
-- การตอบกลับสุดท้ายปกติในกลุ่ม/ช่องเป็นแบบส่วนตัวโดยค่าเริ่มต้น เอาต์พุตที่มองเห็นได้ในห้องใช้เครื่องมือ `message`
+- การตอบกลับต้องมีการกล่าวถึง เว้นแต่คุณจะปิดการกั้นด้วยการกล่าวถึงอย่างชัดเจน
+- การตอบกลับสุดท้ายตามปกติในกลุ่ม/ช่องเป็นแบบส่วนตัวโดยค่าเริ่มต้น เอาต์พุตที่มองเห็นได้ในห้องใช้เครื่องมือ `message`
-ความหมาย: ผู้ส่งที่อยู่ในรายการอนุญาตสามารถเรียกใช้ OpenClaw ได้โดยกล่าวถึงมัน
+กล่าวคือ: ผู้ส่งที่อยู่ในรายการอนุญาตสามารถเรียก OpenClaw ได้ด้วยการกล่าวถึง
-**สรุปสั้น ๆ**
+**สรุปสั้นๆ**
-- **การเข้าถึงแชตส่วนตัว** ควบคุมโดย `*.allowFrom`
+- **การเข้าถึง DM** ควบคุมโดย `*.allowFrom`
- **การเข้าถึงกลุ่ม** ควบคุมโดย `*.groupPolicy` + รายการอนุญาต (`*.groups`, `*.groupAllowFrom`)
-- **การเรียกให้ตอบกลับ** ควบคุมโดยการควบคุมด้วยการกล่าวถึง (`requireMention`, `/activation`)
+- **การเรียกให้ตอบกลับ** ควบคุมโดยการกั้นด้วยการกล่าวถึง (`requireMention`, `/activation`)
-ลำดับแบบเร็ว (สิ่งที่เกิดขึ้นกับข้อความในกลุ่ม):
+ลำดับอย่างย่อ (สิ่งที่เกิดขึ้นกับข้อความกลุ่ม):
```
groupPolicy? disabled -> drop
@@ -47,20 +47,21 @@ otherwise -> reply
## การตอบกลับที่มองเห็นได้
-สำหรับห้องกลุ่ม/ช่อง OpenClaw ใช้ค่าเริ่มต้นเป็น `messages.groupChat.visibleReplies: "message_tool"`
-`openclaw doctor --fix` เขียนค่าเริ่มต้นนี้ลงในการกำหนดค่าช่องที่กำหนดไว้ซึ่งยังไม่ได้ระบุค่าไว้
-นั่นหมายความว่า agent ยังประมวลผลรอบสนทนาและอัปเดตสถานะหน่วยความจำ/เซสชันได้ แต่คำตอบสุดท้ายปกติของมันจะไม่ถูกโพสต์กลับเข้าไปในห้องโดยอัตโนมัติ หากต้องการพูดให้มองเห็นได้ agent จะใช้ `message(action=send)`
+สำหรับห้องกลุ่ม/ช่อง OpenClaw ตั้งค่าเริ่มต้นเป็น `messages.groupChat.visibleReplies: "message_tool"`
+`openclaw doctor --fix` จะเขียนค่าเริ่มต้นนี้ลงในการกำหนดค่าช่องที่ตั้งค่าไว้ซึ่งยังไม่ได้ระบุค่านี้
+นั่นหมายความว่า agent ยังคงประมวลผลรอบนั้นและอัปเดตสถานะ memory/session ได้ แต่คำตอบสุดท้ายตามปกติจะไม่ถูกโพสต์กลับเข้าไปในห้องโดยอัตโนมัติ หากต้องการพูดให้มองเห็นได้ agent จะใช้ `message(action=send)`
-หากเครื่องมือ message ไม่พร้อมใช้งานภายใต้นโยบายเครื่องมือที่ใช้งานอยู่ OpenClaw จะถอยกลับไปใช้การตอบกลับที่มองเห็นได้แบบอัตโนมัติแทนการกดการตอบสนองไว้เงียบ ๆ
-`openclaw doctor` จะเตือนเกี่ยวกับความไม่ตรงกันนี้
+ค่าเริ่มต้นนี้ขึ้นอยู่กับ model/runtime ที่เรียกใช้เครื่องมือได้อย่างเชื่อถือได้ หากล็อกแสดงข้อความ assistant แต่ `didSendViaMessagingTool: false` แสดงว่า model ตอบแบบส่วนตัวแทนที่จะเรียกเครื่องมือ message นั่นไม่ใช่ความล้มเหลวในการส่งของ Discord/Slack/Telegram ให้ใช้ model ที่เรียกเครื่องมือได้เชื่อถือได้สำหรับ session กลุ่ม/ช่อง หรือตั้งค่า `messages.groupChat.visibleReplies: "automatic"` เพื่อกู้คืนการตอบกลับสุดท้ายแบบมองเห็นได้ตามพฤติกรรมเดิม
-สำหรับแชตโดยตรงและรอบสนทนาจากแหล่งอื่น ให้ใช้ `messages.visibleReplies: "message_tool"` เพื่อใช้พฤติกรรมการตอบกลับที่มองเห็นได้แบบผ่านเครื่องมือเท่านั้นในระดับทั่วทั้งระบบ ชุดทดสอบยังสามารถเลือกค่านี้เป็นค่าเริ่มต้นเมื่อยังไม่ได้ตั้งค่าได้ด้วย ชุดทดสอบ Codex ทำเช่นนี้สำหรับแชตโดยตรงในโหมด Codex `messages.groupChat.visibleReplies` ยังคงเป็นการ override ที่เฉพาะเจาะจงกว่าสำหรับห้องกลุ่ม/ช่อง
+หากเครื่องมือ message ไม่พร้อมใช้งานภายใต้นโยบายเครื่องมือที่ใช้งานอยู่ OpenClaw จะ fallback ไปใช้การตอบกลับที่มองเห็นได้แบบอัตโนมัติแทนที่จะระงับการตอบสนองอย่างเงียบๆ `openclaw doctor` จะเตือนเกี่ยวกับความไม่ตรงกันนี้
-สิ่งนี้แทนที่รูปแบบเดิมที่บังคับให้โมเดลตอบ `NO_REPLY` สำหรับรอบสนทนาโหมดแอบดูส่วนใหญ่ ในโหมดผ่านเครื่องมือเท่านั้น การไม่ทำอะไรที่มองเห็นได้หมายถึงการไม่เรียกเครื่องมือ message เท่านั้น
+สำหรับแชตโดยตรงและรอบจากแหล่งอื่นใด ให้ใช้ `messages.visibleReplies: "message_tool"` เพื่อใช้พฤติกรรมการตอบกลับแบบมองเห็นได้ผ่านเครื่องมือเท่านั้นในระดับ global Harness ยังสามารถเลือกค่านี้เป็นค่าเริ่มต้นเมื่อยังไม่ได้ตั้งค่าได้ด้วย; Codex harness ทำเช่นนี้สำหรับแชตโดยตรงในโหมด Codex `messages.groupChat.visibleReplies` ยังคงเป็น override ที่เฉพาะเจาะจงกว่าสำหรับห้องกลุ่ม/ช่อง
-ยังคงส่งตัวบ่งชี้การพิมพ์ขณะที่ agent ทำงานในโหมดผ่านเครื่องมือเท่านั้น โหมดการพิมพ์ของกลุ่มเริ่มต้นจะถูกอัปเกรดจาก "message" เป็น "instant" สำหรับรอบสนทนาเหล่านี้ เพราะอาจไม่มีข้อความ assistant ปกติก่อนที่ agent จะตัดสินใจว่าจะเรียกเครื่องมือ message หรือไม่ การกำหนดค่าโหมดการพิมพ์อย่างชัดเจนยังคงมีผลเหนือกว่า
+สิ่งนี้แทนที่รูปแบบเดิมที่บังคับให้ model ตอบ `NO_REPLY` สำหรับรอบส่วนใหญ่ในโหมดเฝ้าดู ในโหมดใช้เครื่องมือเท่านั้น การไม่แสดงสิ่งใดให้มองเห็นได้หมายถึงการไม่เรียกเครื่องมือ message
-หากต้องการกู้คืนการตอบกลับสุดท้ายอัตโนมัติแบบเดิมสำหรับห้องกลุ่ม/ช่อง:
+ตัวบ่งชี้การพิมพ์ยังคงถูกส่งขณะที่ agent ทำงานในโหมดใช้เครื่องมือเท่านั้น โหมดการพิมพ์เริ่มต้นของกลุ่มจะถูกอัปเกรดจาก "message" เป็น "instant" สำหรับรอบเหล่านี้ เพราะอาจไม่มีข้อความ assistant ตามปกติก่อนที่ agent จะตัดสินใจว่าจะเรียกเครื่องมือ message หรือไม่ การกำหนดค่าโหมดการพิมพ์อย่างชัดเจนยังคงมีผลเหนือกว่า
+
+เพื่อกู้คืนการตอบกลับสุดท้ายแบบอัตโนมัติตามพฤติกรรมเดิมสำหรับห้องกลุ่ม/ช่อง:
```json5
{
@@ -72,9 +73,9 @@ otherwise -> reply
}
```
-Gateway จะโหลดการกำหนดค่า `messages` ใหม่แบบ hot reload หลังจากบันทึกไฟล์ รีสตาร์ตเฉพาะเมื่อการเฝ้าดูไฟล์หรือการโหลดการกำหนดค่าใหม่ถูกปิดใช้งานในการปรับใช้
+Gateway จะ hot-reload การกำหนดค่า `messages` หลังจากบันทึกไฟล์ ให้รีสตาร์ทเฉพาะเมื่อการเฝ้าดูไฟล์หรือการ reload การกำหนดค่าถูกปิดใช้งานในการติดตั้งใช้งาน
-หากต้องการบังคับให้เอาต์พุตที่มองเห็นได้ต้องผ่านเครื่องมือ message สำหรับทุกแชตจากแหล่งที่มา:
+เพื่อบังคับให้เอาต์พุตที่มองเห็นได้ต้องผ่านเครื่องมือ message สำหรับแชตทุกแหล่ง:
```json5
{
@@ -84,73 +85,73 @@ Gateway จะโหลดการกำหนดค่า `messages` ใหม
}
```
-คำสั่ง slash แบบ native (Discord, Telegram และพื้นผิวอื่นที่รองรับคำสั่ง native) จะข้าม `visibleReplies: "message_tool"` และตอบกลับแบบมองเห็นได้เสมอ เพื่อให้ UI คำสั่ง native ของช่องได้รับการตอบสนองที่คาดไว้ สิ่งนี้ใช้กับรอบสนทนาคำสั่ง native ที่ผ่านการตรวจสอบแล้วเท่านั้น คำสั่ง `/...` ที่พิมพ์เป็นข้อความและรอบสนทนาแชตทั่วไปยังคงทำตามค่าเริ่มต้นของกลุ่มที่กำหนดไว้
+คำสั่ง slash แบบเนทีฟ (Discord, Telegram และพื้นผิวอื่นๆ ที่รองรับคำสั่งเนทีฟ) จะข้าม `visibleReplies: "message_tool"` และตอบกลับแบบมองเห็นได้เสมอ เพื่อให้ UI คำสั่งเนทีฟของช่องได้รับการตอบสนองตามที่คาดไว้ สิ่งนี้ใช้กับรอบคำสั่งเนทีฟที่ผ่านการตรวจสอบแล้วเท่านั้น; คำสั่ง `/...` ที่พิมพ์เป็นข้อความและรอบแชตทั่วไปยังคงทำตามค่าเริ่มต้นของกลุ่มที่กำหนดไว้
## การมองเห็นบริบทและรายการอนุญาต
-มีการควบคุมสองแบบที่เกี่ยวข้องกับความปลอดภัยของกลุ่ม:
+การควบคุมสองอย่างที่เกี่ยวข้องกับความปลอดภัยของกลุ่ม:
-- **การอนุญาตการเรียกใช้**: ใครสามารถเรียกใช้ agent ได้ (`groupPolicy`, `groups`, `groupAllowFrom`, รายการอนุญาตเฉพาะช่อง)
-- **การมองเห็นบริบท**: บริบทเสริมใดถูกฉีดเข้าโมเดล (ข้อความตอบกลับ คำอ้างอิง ประวัติเธรด เมตาดาต้าที่ส่งต่อ)
+- **การอนุญาตให้เรียกใช้งาน**: ใครสามารถเรียก agent ได้ (`groupPolicy`, `groups`, `groupAllowFrom`, รายการอนุญาตเฉพาะช่อง)
+- **การมองเห็นบริบท**: บริบทเสริมใดถูกฉีดเข้าไปใน model (ข้อความตอบกลับ, คำอ้างอิง, ประวัติเธรด, metadata ที่ส่งต่อ)
-โดยค่าเริ่มต้น OpenClaw ให้ความสำคัญกับพฤติกรรมแชตปกติและเก็บบริบทไว้เกือบตามที่ได้รับมา นั่นหมายความว่ารายการอนุญาตจะกำหนดเป็นหลักว่าใครเรียกการทำงานได้ ไม่ใช่ขอบเขตการลบข้อมูลแบบสากลสำหรับทุกส่วนย่อยที่ถูกอ้างอิงหรือมีอยู่ในประวัติ
+โดยค่าเริ่มต้น OpenClaw ให้ความสำคัญกับพฤติกรรมแชตปกติและเก็บบริบทไว้ใกล้เคียงกับที่ได้รับมาเป็นส่วนใหญ่ ซึ่งหมายความว่ารายการอนุญาตมีหน้าที่หลักในการตัดสินว่าใครสามารถเรียกการดำเนินการได้ ไม่ใช่ขอบเขตการปกปิดข้อมูลแบบครอบจักรวาลสำหรับทุกส่วนย่อยที่ถูกอ้างอิงหรืออยู่ในประวัติ
-
- - บางช่องใช้การกรองตามผู้ส่งสำหรับบริบทเสริมในเส้นทางเฉพาะอยู่แล้ว (เช่น การป้อนข้อมูลเริ่มต้นของเธรด Slack, การค้นหาการตอบกลับ/เธรด Matrix)
- - ช่องอื่นยังคงส่งบริบทคำอ้างอิง/การตอบกลับ/การส่งต่อผ่านไปตามที่ได้รับมา
+
+ - บางช่องใช้การกรองตามผู้ส่งสำหรับบริบทเสริมในเส้นทางเฉพาะอยู่แล้ว (เช่น การ seeding เธรด Slack, การ lookup การตอบกลับ/เธรดของ Matrix)
+ - ช่องอื่นๆ ยังคงส่งผ่านบริบท quote/reply/forward ตามที่ได้รับมา
-
+
- `contextVisibility: "all"` (ค่าเริ่มต้น) คงพฤติกรรมปัจจุบันตามที่ได้รับมา
- `contextVisibility: "allowlist"` กรองบริบทเสริมให้เหลือเฉพาะผู้ส่งที่อยู่ในรายการอนุญาต
- - `contextVisibility: "allowlist_quote"` คือ `allowlist` พร้อมข้อยกเว้นคำอ้างอิง/การตอบกลับที่ชัดเจนหนึ่งรายการ
+ - `contextVisibility: "allowlist_quote"` คือ `allowlist` พร้อมข้อยกเว้น quote/reply แบบชัดเจนหนึ่งรายการ
- จนกว่าจะมีการนำโมเดลการเสริมความแข็งแรงนี้ไปใช้ให้สอดคล้องกันในทุกช่อง ให้คาดว่าจะมีความแตกต่างตามพื้นผิว
+ จนกว่าจะมีการนำโมเดลการทำให้เข้มงวดนี้ไปใช้อย่างสม่ำเสมอในทุกช่อง ให้คาดว่าจะมีความแตกต่างกันตามพื้นผิว
-
+
หากคุณต้องการ...
| เป้าหมาย | สิ่งที่ต้องตั้งค่า |
| -------------------------------------------- | ---------------------------------------------------------- |
-| อนุญาตทุกกลุ่ม แต่ตอบกลับเฉพาะเมื่อมี @mentions | `groups: { "*": { requireMention: true } }` |
+| อนุญาตทุกกลุ่มแต่ตอบกลับเฉพาะเมื่อมี @mentions | `groups: { "*": { requireMention: true } }` |
| ปิดการตอบกลับกลุ่มทั้งหมด | `groupPolicy: "disabled"` |
-| เฉพาะบางกลุ่ม | `groups: { "": { ... } }` (ไม่มีคีย์ `"*"`) |
-| เฉพาะคุณเท่านั้นที่เรียกใช้ในกลุ่มได้ | `groupPolicy: "allowlist"`, `groupAllowFrom: ["+1555..."]` |
-| ใช้ชุดผู้ส่งที่เชื่อถือได้หนึ่งชุดซ้ำในหลายช่อง | `groupAllowFrom: ["accessGroup:operators"]` |
+| เฉพาะกลุ่มที่ระบุ | `groups: { "": { ... } }` (ไม่มีคีย์ `"*"`) |
+| เฉพาะคุณที่เรียกในกลุ่มได้ | `groupPolicy: "allowlist"`, `groupAllowFrom: ["+1555..."]` |
+| ใช้ชุดผู้ส่งที่เชื่อถือได้ชุดเดียวซ้ำในหลายช่อง | `groupAllowFrom: ["accessGroup:operators"]` |
-สำหรับรายการอนุญาตผู้ส่งที่ใช้ซ้ำได้ โปรดดู [กลุ่มการเข้าถึง](/th/channels/access-groups)
+สำหรับรายการอนุญาตผู้ส่งที่ใช้ซ้ำได้ ดู [กลุ่มการเข้าถึง](/th/channels/access-groups)
-## คีย์เซสชัน
+## คีย์ session
-- เซสชันกลุ่มใช้คีย์เซสชัน `agent:::group:` (ห้อง/ช่องใช้ `agent:::channel:`)
-- หัวข้อฟอรัม Telegram เพิ่ม `:topic:` ต่อท้ายรหัสกลุ่มเพื่อให้แต่ละหัวข้อมีเซสชันของตัวเอง
-- แชตโดยตรงใช้เซสชันหลัก (หรือแยกตามผู้ส่งหากกำหนดค่าไว้)
-- ข้าม Heartbeat สำหรับเซสชันกลุ่ม
+- session กลุ่มใช้คีย์ session แบบ `agent:::group:` (ห้อง/ช่องใช้ `agent:::channel:`)
+- หัวข้อ forum ของ Telegram เพิ่ม `:topic:` ต่อท้าย group id เพื่อให้แต่ละหัวข้อมี session ของตัวเอง
+- แชตโดยตรงใช้ session หลัก (หรือแยกตามผู้ส่งหากกำหนดค่าไว้)
+- Heartbeats จะถูกข้ามสำหรับ session กลุ่ม
-## รูปแบบ: แชตส่วนตัว + กลุ่มสาธารณะ (agent เดียว)
+## รูปแบบ: DM ส่วนตัว + กลุ่มสาธารณะ (agent เดียว)
-ได้ สิ่งนี้ใช้งานได้ดีหากทราฟฟิก "ส่วนตัว" ของคุณคือ **แชตส่วนตัว** และทราฟฟิก "สาธารณะ" ของคุณคือ **กลุ่ม**
+ใช่ — วิธีนี้ทำงานได้ดีหากทราฟฟิก "ส่วนตัว" ของคุณคือ **DMs** และทราฟฟิก "สาธารณะ" ของคุณคือ **groups**
-เหตุผล: ในโหมด agent เดียว แชตส่วนตัวมักเข้าสู่คีย์เซสชัน **หลัก** (`agent:main:main`) ในขณะที่กลุ่มจะใช้คีย์เซสชัน **ที่ไม่ใช่หลัก** เสมอ (`agent:main::group:`) หากคุณเปิดใช้ sandboxing ด้วย `mode: "non-main"` เซสชันกลุ่มเหล่านั้นจะทำงานในแบ็กเอนด์ sandbox ที่กำหนดไว้ ขณะที่เซสชันแชตส่วนตัวหลักของคุณยังคงอยู่บนโฮสต์ Docker เป็นแบ็กเอนด์เริ่มต้นหากคุณไม่ได้เลือกไว้
+เหตุผล: ในโหมด agent เดียว โดยทั่วไป DMs จะเข้าสู่คีย์ session **หลัก** (`agent:main:main`) ขณะที่กลุ่มใช้คีย์ session **ที่ไม่ใช่หลัก** เสมอ (`agent:main::group:`) หากคุณเปิด sandboxing ด้วย `mode: "non-main"` session กลุ่มเหล่านั้นจะทำงานใน backend sandbox ที่กำหนดค่าไว้ ขณะที่ session DM หลักของคุณยังคงอยู่บน host Docker เป็น backend เริ่มต้นหากคุณไม่ได้เลือกอย่างอื่น
-สิ่งนี้ให้ "สมอง" agent หนึ่งชุด (พื้นที่ทำงาน + หน่วยความจำที่ใช้ร่วมกัน) แต่มีท่าทางการดำเนินงานสองแบบ:
+สิ่งนี้ทำให้คุณมี "สมอง" agent หนึ่งตัว (workspace + memory ที่ใช้ร่วมกัน) แต่มีท่าทางการดำเนินการสองแบบ:
-- **แชตส่วนตัว**: เครื่องมือเต็มรูปแบบ (โฮสต์)
-- **กลุ่ม**: sandbox + เครื่องมือที่ถูกจำกัด
+- **DMs**: เครื่องมือเต็มรูปแบบ (host)
+- **Groups**: sandbox + เครื่องมือที่ถูกจำกัด
-หากคุณต้องการพื้นที่ทำงาน/บุคลิกที่แยกจากกันจริง ๆ ("ส่วนตัว" และ "สาธารณะ" ต้องไม่ปะปนกันเลย) ให้ใช้ agent ตัวที่สอง + การผูก โปรดดู [การกำหนดเส้นทางหลาย Agent](/th/concepts/multi-agent)
+หากคุณต้องการ workspace/persona ที่แยกจากกันจริงๆ ("personal" และ "public" ต้องไม่ปะปนกันเลย) ให้ใช้ agent ตัวที่สอง + bindings ดู [การกำหนดเส้นทางหลาย Agent](/th/concepts/multi-agent)
-
+
```json5
{
agents: {
@@ -175,7 +176,7 @@ Gateway จะโหลดการกำหนดค่า `messages` ใหม
```
- ต้องการให้ "กลุ่มเห็นได้เฉพาะโฟลเดอร์ X" แทน "ไม่มีการเข้าถึงโฮสต์" ใช่ไหม ให้คง `workspaceAccess: "none"` และเมานต์เฉพาะเส้นทางที่อยู่ในรายการอนุญาตเข้าไปใน sandbox:
+ ต้องการให้ "กลุ่มเห็นได้เฉพาะโฟลเดอร์ X" แทนที่จะเป็น "ไม่มีการเข้าถึง host" ใช่ไหม ให้คง `workspaceAccess: "none"` ไว้และ mount เฉพาะ path ที่อยู่ในรายการอนุญาตเข้าไปใน sandbox:
```json5
{
@@ -200,20 +201,20 @@ Gateway จะโหลดการกำหนดค่า `messages` ใหม
-ที่เกี่ยวข้อง:
+เกี่ยวข้อง:
- คีย์การกำหนดค่าและค่าเริ่มต้น: [การกำหนดค่า Gateway](/th/gateway/config-agents#agentsdefaultssandbox)
-- การดีบักว่าเหตุใดเครื่องมือจึงถูกบล็อก: [Sandbox เทียบกับนโยบายเครื่องมือเทียบกับ Elevated](/th/gateway/sandbox-vs-tool-policy-vs-elevated)
+- การดีบักว่าทำไมเครื่องมือจึงถูกบล็อก: [Sandbox เทียบกับ Tool Policy เทียบกับ Elevated](/th/gateway/sandbox-vs-tool-policy-vs-elevated)
- รายละเอียด bind mounts: [Sandboxing](/th/gateway/sandboxing#custom-bind-mounts)
-## ป้ายกำกับการแสดงผล
+## ป้ายแสดงผล
-- ป้ายกำกับ UI ใช้ `displayName` เมื่อมี โดยจัดรูปแบบเป็น `:`
-- `#room` สงวนไว้สำหรับห้อง/ช่อง แชตกลุ่มใช้ `g-` (ตัวพิมพ์เล็ก, ช่องว่าง -> `-`, คง `#@+._-`)
+- ป้าย UI ใช้ `displayName` เมื่อมี โดยจัดรูปแบบเป็น `:`
+- `#room` สงวนไว้สำหรับห้อง/ช่อง; แชตกลุ่มใช้ `g-` (ตัวพิมพ์เล็ก, ช่องว่าง -> `-`, เก็บ `#@+._-` ไว้)
## นโยบายกลุ่ม
-ควบคุมวิธีจัดการข้อความกลุ่ม/ห้องต่อช่อง:
+ควบคุมวิธีจัดการข้อความกลุ่ม/ห้องในแต่ละช่อง:
```json5
{
@@ -262,46 +263,46 @@ Gateway จะโหลดการกำหนดค่า `messages` ใหม
| นโยบาย | พฤติกรรม |
| ------------- | ------------------------------------------------------------ |
-| `"open"` | กลุ่มข้ามรายการอนุญาต การควบคุมด้วยการกล่าวถึงยังคงมีผล |
-| `"disabled"` | บล็อกข้อความกลุ่มทั้งหมดโดยสมบูรณ์ |
-| `"allowlist"` | อนุญาตเฉพาะกลุ่ม/ห้องที่ตรงกับรายการอนุญาตที่กำหนดไว้ |
+| `"open"` | กลุ่มข้ามรายการอนุญาต; การกั้นด้วยการกล่าวถึงยังคงมีผล |
+| `"disabled"` | บล็อกข้อความกลุ่มทั้งหมดโดยสิ้นเชิง |
+| `"allowlist"` | อนุญาตเฉพาะกลุ่ม/ห้องที่ตรงกับรายการอนุญาตที่กำหนดค่าไว้ |
-
- - `groupPolicy` แยกจากการควบคุมด้วยการกล่าวถึง (ซึ่งต้องมี @mentions)
- - WhatsApp/Telegram/Signal/iMessage/Microsoft Teams/Zalo: ใช้ `groupAllowFrom` (สำรอง: `allowFrom` ที่ระบุชัดเจน)
- - Signal: `groupAllowFrom` สามารถตรงกับรหัสกลุ่ม Signal ขาเข้าหรือหมายเลขโทรศัพท์/UUID ของผู้ส่ง
- - การอนุมัติการจับคู่แชตส่วนตัว (รายการจัดเก็บ `*-allowFrom`) ใช้กับการเข้าถึงแชตส่วนตัวเท่านั้น การอนุญาตผู้ส่งในกลุ่มยังคงต้องระบุชัดเจนในรายการอนุญาตของกลุ่ม
+
+ - `groupPolicy` แยกจากการควบคุมด้วยการกล่าวถึง (ซึ่งต้องใช้ @mentions)
+ - WhatsApp/Telegram/Signal/iMessage/Microsoft Teams/Zalo: ใช้ `groupAllowFrom` (สำรอง: `allowFrom` แบบระบุชัดเจน)
+ - Signal: `groupAllowFrom` สามารถตรงกับ id กลุ่ม Signal ขาเข้าหรือโทรศัพท์/UUID ของผู้ส่งได้
+ - การอนุมัติการจับคู่ DM (รายการจัดเก็บ `*-allowFrom`) ใช้กับการเข้าถึง DM เท่านั้น; การอนุญาตผู้ส่งในกลุ่มยังคงต้องระบุอย่างชัดเจนในรายการอนุญาตของกลุ่ม
- Discord: รายการอนุญาตใช้ `channels.discord.guilds..channels`
- Slack: รายการอนุญาตใช้ `channels.slack.channels`
- - Matrix: รายการอนุญาตใช้ `channels.matrix.groups` แนะนำให้ใช้รหัสห้องหรือ alias การค้นหาชื่อห้องที่เข้าร่วมแล้วเป็นแบบ best-effort และชื่อที่แก้ไม่ได้จะถูกละเว้นขณะรันไทม์ ใช้ `channels.matrix.groupAllowFrom` เพื่อจำกัดผู้ส่ง รองรับรายการอนุญาต `users` รายห้องด้วย
- - แชตส่วนตัวแบบกลุ่มถูกควบคุมแยกต่างหาก (`channels.discord.dm.*`, `channels.slack.dm.*`)
- - รายการอนุญาต Telegram สามารถตรงกับรหัสผู้ใช้ (`"123456789"`, `"telegram:123456789"`, `"tg:123456789"`) หรือชื่อผู้ใช้ (`"@alice"` หรือ `"alice"`) prefix ไม่คำนึงถึงตัวพิมพ์ใหญ่เล็ก
- - ค่าเริ่มต้นคือ `groupPolicy: "allowlist"` หากรายการอนุญาตของกลุ่มว่าง ข้อความกลุ่มจะถูกบล็อก
- - ความปลอดภัยขณะรันไทม์: เมื่อไม่มีบล็อก provider เลย (`channels.` ไม่มีอยู่) นโยบายกลุ่มจะถอยกลับไปใช้โหมดปิดเมื่อไม่แน่ใจ (โดยทั่วไปคือ `allowlist`) แทนการสืบทอด `channels.defaults.groupPolicy`
+ - Matrix: รายการอนุญาตใช้ `channels.matrix.groups` ควรใช้ ID ห้องหรือนามแฝง; การค้นหาชื่อห้องที่เข้าร่วมแล้วเป็นแบบพยายามให้ดีที่สุด และชื่อที่แก้ไขไม่ได้จะถูกละเว้นขณะรันไทม์ ใช้ `channels.matrix.groupAllowFrom` เพื่อจำกัดผู้ส่ง; รองรับรายการอนุญาต `users` ต่อห้องด้วย
+ - DM กลุ่มถูกควบคุมแยกต่างหาก (`channels.discord.dm.*`, `channels.slack.dm.*`)
+ - รายการอนุญาตของ Telegram สามารถตรงกับ ID ผู้ใช้ (`"123456789"`, `"telegram:123456789"`, `"tg:123456789"`) หรือชื่อผู้ใช้ (`"@alice"` หรือ `"alice"`); prefix ไม่คำนึงถึงตัวพิมพ์ใหญ่เล็ก
+ - ค่าเริ่มต้นคือ `groupPolicy: "allowlist"`; หากรายการอนุญาตของกลุ่มว่าง ข้อความกลุ่มจะถูกบล็อก
+ - ความปลอดภัยขณะรันไทม์: เมื่อไม่มีบล็อกผู้ให้บริการเลย (`channels.` ไม่มีอยู่) นโยบายกลุ่มจะถอยกลับไปใช้โหมดปิดเมื่อผิดพลาด (โดยทั่วไปคือ `allowlist`) แทนที่จะสืบทอด `channels.defaults.groupPolicy`
-แบบจำลองทางความคิดแบบย่อ (ลำดับการประเมินสำหรับข้อความกลุ่ม):
+โมเดลคิดแบบเร็ว (ลำดับการประเมินสำหรับข้อความกลุ่ม):
- `groupPolicy` (เปิด/ปิดใช้งาน/allowlist)
+ `groupPolicy` (open/disabled/allowlist)
-
+
รายการอนุญาตของกลุ่ม (`*.groups`, `*.groupAllowFrom`, รายการอนุญาตเฉพาะช่องทาง)
-
- การกั้นด้วยการกล่าวถึง (`requireMention`, `/activation`)
+
+ การควบคุมด้วยการกล่าวถึง (`requireMention`, `/activation`)
-## การกั้นด้วยการกล่าวถึง (ค่าเริ่มต้น)
+## การควบคุมด้วยการกล่าวถึง (ค่าเริ่มต้น)
-ข้อความกลุ่มต้องมีการกล่าวถึง เว้นแต่จะถูกแทนที่เป็นรายกลุ่ม ค่าเริ่มต้นอยู่ต่อระบบย่อยภายใต้ `*.groups."*"`
+ข้อความกลุ่มต้องมีการกล่าวถึง เว้นแต่จะถูกแทนที่ต่อกลุ่ม ค่าเริ่มต้นอยู่ต่อระบบย่อยภายใต้ `*.groups."*"`
-การตอบกลับข้อความของบอตนับเป็นการกล่าวถึงโดยนัยเมื่อช่องทางรองรับเมทาดาทาการตอบกลับ การอ้างอิงข้อความของบอตยังสามารถนับเป็นการกล่าวถึงโดยนัยในช่องทางที่เปิดเผยเมทาดาทาการอ้างอิงได้ด้วย กรณีที่มีในตัวปัจจุบันรวมถึง Telegram, WhatsApp, Slack, Discord, Microsoft Teams และ ZaloUser
+การตอบกลับข้อความของบอทนับเป็นการกล่าวถึงโดยนัยเมื่อช่องทางรองรับ metadata ของการตอบกลับ การอ้างข้อความของบอทสามารถนับเป็นการกล่าวถึงโดยนัยได้เช่นกันในช่องทางที่เปิดเผย metadata ของการอ้าง กรณี built-in ปัจจุบันรวมถึง Telegram, WhatsApp, Slack, Discord, Microsoft Teams, และ ZaloUser
```json5
{
@@ -340,41 +341,41 @@ Gateway จะโหลดการกำหนดค่า `messages` ใหม
```
-
- - `mentionPatterns` เป็นรูปแบบ regex ที่ปลอดภัยและไม่คำนึงถึงตัวพิมพ์ใหญ่เล็ก รูปแบบที่ไม่ถูกต้องและรูปแบบการทำซ้ำซ้อนที่ไม่ปลอดภัยจะถูกละเว้น
- - พื้นผิวที่ให้การกล่าวถึงแบบชัดเจนยังคงผ่านได้ รูปแบบเหล่านี้เป็นเพียงทางสำรอง
+
+ - `mentionPatterns` เป็นรูปแบบ regex ที่ปลอดภัยและไม่คำนึงถึงตัวพิมพ์ใหญ่เล็ก; รูปแบบที่ไม่ถูกต้องและรูปแบบการทำซ้ำซ้อนที่ไม่ปลอดภัยจะถูกละเว้น
+ - พื้นผิวที่ให้การกล่าวถึงแบบชัดเจนยังคงผ่าน; รูปแบบเป็นตัวสำรอง
- การแทนที่ต่อเอเจนต์: `agents.list[].groupChat.mentionPatterns` (มีประโยชน์เมื่อหลายเอเจนต์ใช้กลุ่มร่วมกัน)
- - การกั้นด้วยการกล่าวถึงจะบังคับใช้เฉพาะเมื่อสามารถตรวจจับการกล่าวถึงได้เท่านั้น (มีการกล่าวถึงแบบเนทีฟหรือกำหนดค่า `mentionPatterns` ไว้)
- - การใส่กลุ่มหรือผู้ส่งในรายการอนุญาตไม่ได้ปิดใช้งานการกั้นด้วยการกล่าวถึง ให้ตั้งค่า `requireMention` ของกลุ่มนั้นเป็น `false` เมื่อควรให้ทุกข้อความทริกเกอร์
- - บริบทพรอมป์ของแชตกลุ่มจะส่งคำสั่งตอบกลับแบบเงียบที่แก้แล้วในทุกเทิร์น ไฟล์เวิร์กสเปซไม่ควรทำซ้ำกลไก `NO_REPLY`
- - กลุ่มที่อนุญาตการตอบกลับแบบเงียบจะถือว่าเทิร์นของโมเดลที่ว่างสะอาดหรือมีแต่เหตุผลเป็นแบบเงียบ เทียบเท่ากับ `NO_REPLY` แชตโดยตรงจะทำแบบเดียวกันเฉพาะเมื่ออนุญาตการตอบกลับแบบเงียบโดยตรงไว้อย่างชัดเจน มิฉะนั้นการตอบกลับที่ว่างยังคงเป็นเทิร์นเอเจนต์ที่ล้มเหลว
- - ค่าเริ่มต้นของ Discord อยู่ใน `channels.discord.guilds."*"` (แทนที่ได้ต่อกิลด์/ช่อง)
- - บริบทประวัติกลุ่มถูกครอบในรูปแบบเดียวกันในทุกช่องทางและเป็นแบบ **pending-only** (ข้อความที่ถูกข้ามเนื่องจากการกั้นด้วยการกล่าวถึง) ใช้ `messages.groupChat.historyLimit` สำหรับค่าเริ่มต้นส่วนกลาง และ `channels..historyLimit` (หรือ `channels..accounts.*.historyLimit`) สำหรับการแทนที่ ตั้งเป็น `0` เพื่อปิดใช้งาน
+ - การควบคุมด้วยการกล่าวถึงจะถูกบังคับใช้เฉพาะเมื่อสามารถตรวจจับการกล่าวถึงได้เท่านั้น (มีการกำหนดการกล่าวถึงแบบเนทีฟหรือ `mentionPatterns`)
+ - การอนุญาตกลุ่มหรือผู้ส่งไม่ได้ปิดการควบคุมด้วยการกล่าวถึง; ตั้งค่า `requireMention` ของกลุ่มนั้นเป็น `false` เมื่อข้อความทั้งหมดควรกระตุ้นการทำงาน
+ - บริบทพรอมป์แชตกลุ่มจะพาคำสั่งการตอบแบบเงียบที่แก้ไขแล้วไปทุกเทิร์น; ไฟล์พื้นที่ทำงานไม่ควรทำซ้ำกลไก `NO_REPLY`
+ - กลุ่มที่อนุญาตการตอบแบบเงียบจะถือว่าเทิร์นโมเดลที่ว่างเปล่าสะอาดหรือมีแต่เหตุผลเป็นแบบเงียบ เทียบเท่ากับ `NO_REPLY` แชตโดยตรงทำแบบเดียวกันเฉพาะเมื่ออนุญาตการตอบแบบเงียบโดยตรงอย่างชัดเจนเท่านั้น; ไม่เช่นนั้นการตอบว่างยังคงเป็นเทิร์นเอเจนต์ที่ล้มเหลว
+ - ค่าเริ่มต้นของ Discord อยู่ใน `channels.discord.guilds."*"` (แทนที่ได้ต่อ guild/channel)
+ - บริบทประวัติกลุ่มถูกห่ออย่างสม่ำเสมอข้ามช่องทางและเป็น **pending-only** (ข้อความที่ถูกข้ามเนื่องจากการควบคุมด้วยการกล่าวถึง); ใช้ `messages.groupChat.historyLimit` สำหรับค่าเริ่มต้นส่วนกลาง และ `channels..historyLimit` (หรือ `channels..accounts.*.historyLimit`) สำหรับการแทนที่ ตั้งค่าเป็น `0` เพื่อปิดใช้
## ข้อจำกัดเครื่องมือของกลุ่ม/ช่องทาง (ไม่บังคับ)
-การกำหนดค่าบางช่องทางรองรับการจำกัดว่าเครื่องมือใดพร้อมใช้งาน **ภายในกลุ่ม/ห้อง/ช่องที่ระบุ**
+คอนฟิกบางช่องทางรองรับการจำกัดว่าเครื่องมือใดพร้อมใช้ **ภายในกลุ่ม/ห้อง/ช่องทางเฉพาะ**
- `tools`: อนุญาต/ปฏิเสธเครื่องมือสำหรับทั้งกลุ่ม
-- `toolsBySender`: การแทนที่ต่อผู้ส่งภายในกลุ่ม ใช้คำนำหน้าคีย์แบบชัดเจน: `id:`, `e164:`, `username:`, `name:` และไวลด์การ์ด `"*"` คีย์แบบเดิมที่ไม่มีคำนำหน้ายังยอมรับอยู่และจับคู่เป็น `id:` เท่านั้น
+- `toolsBySender`: การแทนที่ต่อผู้ส่งภายในกลุ่ม ใช้ prefix คีย์แบบชัดเจน: `id:`, `e164:`, `username:`, `name:`, และ wildcard `"*"` คีย์เดิมที่ไม่มี prefix ยังยอมรับอยู่และจับคู่เป็น `id:` เท่านั้น
-ลำดับการแก้ค่า (รายการที่เฉพาะเจาะจงที่สุดชนะ):
+ลำดับการแก้ไข (รายการที่เฉพาะเจาะจงที่สุดชนะ):
-
+
การจับคู่ `toolsBySender` ของกลุ่ม/ช่องทาง
-
+
`tools` ของกลุ่ม/ช่องทาง
-
- การจับคู่ `toolsBySender` ค่าเริ่มต้น (`"*"`)
+
+ การจับคู่ `toolsBySender` เริ่มต้น (`"*"`)
-
- `tools` ค่าเริ่มต้น (`"*"`)
+
+ `tools` เริ่มต้น (`"*"`)
@@ -399,28 +400,28 @@ Gateway จะโหลดการกำหนดค่า `messages` ใหม
```
-ข้อจำกัดเครื่องมือของกลุ่ม/ช่องทางจะถูกนำไปใช้เพิ่มเติมจากนโยบายเครื่องมือส่วนกลาง/เอเจนต์ (การปฏิเสธยังคงชนะ) บางช่องทางใช้การซ้อนคนละแบบสำหรับห้อง/ช่อง (เช่น Discord `guilds.*.channels.*`, Slack `channels.*`, Microsoft Teams `teams.*.channels.*`)
+ข้อจำกัดเครื่องมือของกลุ่ม/ช่องทางจะถูกใช้เพิ่มเติมจากนโยบายเครื่องมือส่วนกลาง/ของเอเจนต์ (deny ยังคงชนะ) บางช่องทางใช้การซ้อนที่แตกต่างกันสำหรับห้อง/ช่องทาง (เช่น Discord `guilds.*.channels.*`, Slack `channels.*`, Microsoft Teams `teams.*.channels.*`)
## รายการอนุญาตของกลุ่ม
-เมื่อกำหนดค่า `channels.whatsapp.groups`, `channels.telegram.groups` หรือ `channels.imessage.groups` คีย์จะทำหน้าที่เป็นรายการอนุญาตของกลุ่ม ใช้ `"*"` เพื่ออนุญาตทุกกลุ่มในขณะที่ยังตั้งค่าพฤติกรรมการกล่าวถึงเริ่มต้นได้
+เมื่อกำหนดค่า `channels.whatsapp.groups`, `channels.telegram.groups`, หรือ `channels.imessage.groups` คีย์จะทำหน้าที่เป็นรายการอนุญาตของกลุ่ม ใช้ `"*"` เพื่ออนุญาตทุกกลุ่มในขณะที่ยังตั้งค่าพฤติกรรมการกล่าวถึงเริ่มต้น
-จุดที่มักสับสน: การอนุมัติการจับคู่ DM ไม่เหมือนกับการอนุญาตกลุ่ม สำหรับช่องทางที่รองรับการจับคู่ DM ที่เก็บการจับคู่จะปลดล็อกเฉพาะ DM เท่านั้น คำสั่งกลุ่มยังคงต้องมีการอนุญาตผู้ส่งกลุ่มแบบชัดเจนจากรายการอนุญาตในการกำหนดค่า เช่น `groupAllowFrom` หรือทางสำรองการกำหนดค่าที่บันทึกไว้สำหรับช่องทางนั้น
+ความสับสนที่พบบ่อย: การอนุมัติการจับคู่ DM ไม่เหมือนกับการอนุญาตกลุ่ม สำหรับช่องทางที่รองรับการจับคู่ DM ที่จัดเก็บการจับคู่จะปลดล็อกเฉพาะ DM เท่านั้น คำสั่งกลุ่มยังคงต้องมีการอนุญาตผู้ส่งกลุ่มแบบชัดเจนจากรายการอนุญาตในคอนฟิก เช่น `groupAllowFrom` หรือคอนฟิกสำรองที่จัดทำเอกสารไว้สำหรับช่องทางนั้น
-เจตนาที่พบบ่อย (คัดลอก/วาง):
+เจตนาทั่วไป (คัดลอก/วาง):
-
+
```json5
{
channels: { whatsapp: { groupPolicy: "disabled" } },
}
```
-
+
```json5
{
channels: {
@@ -434,7 +435,7 @@ Gateway จะโหลดการกำหนดค่า `messages` ใหม
}
```
-
+
```json5
{
channels: {
@@ -445,7 +446,7 @@ Gateway จะโหลดการกำหนดค่า `messages` ใหม
}
```
-
+
```json5
{
channels: {
@@ -467,41 +468,41 @@ Gateway จะโหลดการกำหนดค่า `messages` ใหม
- `/activation mention`
- `/activation always`
-เจ้าของถูกกำหนดโดย `channels.whatsapp.allowFrom` (หรือ E.164 ของตัวบอตเองเมื่อไม่ได้ตั้งค่า) ส่งคำสั่งเป็นข้อความเดี่ยว พื้นผิวอื่น ๆ ในปัจจุบันจะละเว้น `/activation`
+เจ้าของถูกกำหนดโดย `channels.whatsapp.allowFrom` (หรือ E.164 ของตัวบอทเองเมื่อไม่ได้ตั้งค่า) ส่งคำสั่งเป็นข้อความเดี่ยว พื้นผิวอื่นในปัจจุบันละเว้น `/activation`
## ฟิลด์บริบท
-เพย์โหลดขาเข้าของกลุ่มตั้งค่า:
+payload ขาเข้าของกลุ่มตั้งค่า:
- `ChatType=group`
-- `GroupSubject` (ถ้าทราบ)
-- `GroupMembers` (ถ้าทราบ)
-- `WasMentioned` (ผลลัพธ์การกั้นด้วยการกล่าวถึง)
-- หัวข้อฟอรัมของ Telegram ยังรวม `MessageThreadId` และ `IsForum` ด้วย
+- `GroupSubject` (หากทราบ)
+- `GroupMembers` (หากทราบ)
+- `WasMentioned` (ผลลัพธ์การควบคุมด้วยการกล่าวถึง)
+- หัวข้อฟอรัม Telegram ยังรวม `MessageThreadId` และ `IsForum` ด้วย
หมายเหตุเฉพาะช่องทาง:
-- BlueBubbles สามารถเลือกเพิ่มข้อมูลผู้เข้าร่วมกลุ่ม macOS ที่ไม่มีชื่อจากฐานข้อมูล Contacts ในเครื่องก่อนเติม `GroupMembers` ได้ ฟีเจอร์นี้ปิดอยู่ตามค่าเริ่มต้นและจะทำงานหลังจากการกั้นกลุ่มปกติผ่านแล้วเท่านั้น
+- BlueBubbles สามารถเพิ่มข้อมูลผู้เข้าร่วมกลุ่ม macOS ที่ไม่มีชื่อจากฐานข้อมูล Contacts ในเครื่องก่อนเติม `GroupMembers` ได้ตามตัวเลือก สิ่งนี้ปิดโดยค่าเริ่มต้นและทำงานหลังจากการควบคุมกลุ่มปกติผ่านแล้วเท่านั้น
-พรอมป์ระบบของเอเจนต์มีบทนำกลุ่มในเทิร์นแรกของเซสชันกลุ่มใหม่ โดยเตือนโมเดลให้ตอบเหมือนมนุษย์ หลีกเลี่ยงตาราง Markdown ลดบรรทัดว่างและใช้การเว้นระยะเหมือนแชตปกติ และหลีกเลี่ยงการพิมพ์ลำดับ `\n` แบบตัวอักษร ชื่อกลุ่มและป้ายชื่อผู้เข้าร่วมที่มาจากช่องทางจะแสดงเป็นเมทาดาทาที่ไม่น่าเชื่อถือในบล็อกโค้ด ไม่ใช่คำสั่งระบบแบบอินไลน์
+พรอมป์ระบบของเอเจนต์รวมบทนำกลุ่มในเทิร์นแรกของเซสชันกลุ่มใหม่ มันเตือนโมเดลให้ตอบเหมือนมนุษย์ หลีกเลี่ยงตาราง Markdown ลดบรรทัดว่างและเว้นระยะเหมือนแชตปกติ และหลีกเลี่ยงการพิมพ์ลำดับ `\n` แบบ literal ชื่อกลุ่มและป้ายกำกับผู้เข้าร่วมที่มาจากช่องทางจะแสดงเป็น metadata ที่ไม่น่าเชื่อถือใน fenced block ไม่ใช่คำสั่งระบบแบบ inline
## รายละเอียดเฉพาะของ iMessage
-- ควรใช้ `chat_id:` เมื่อกำหนดเส้นทางหรือใส่ในรายการอนุญาต
+- ควรใช้ `chat_id:` เมื่อกำหนดเส้นทางหรือเพิ่มในรายการอนุญาต
- แสดงรายการแชต: `imsg chats --limit 20`
- การตอบกลับกลุ่มจะกลับไปยัง `chat_id` เดิมเสมอ
-## พรอมป์ระบบของ WhatsApp
+## พรอมป์ระบบ WhatsApp
-ดู [WhatsApp](/th/channels/whatsapp#system-prompts) สำหรับกฎพรอมป์ระบบ WhatsApp ที่เป็นมาตรฐาน รวมถึงการแก้พรอมป์ของกลุ่มและโดยตรง พฤติกรรมไวลด์การ์ด และความหมายของการแทนที่บัญชี
+ดู [WhatsApp](/th/channels/whatsapp#system-prompts) สำหรับกฎพรอมป์ระบบ WhatsApp ที่เป็นมาตรฐาน รวมถึงการแก้ไขพรอมป์ของกลุ่มและโดยตรง พฤติกรรม wildcard และความหมายของการแทนที่บัญชี
## รายละเอียดเฉพาะของ WhatsApp
-ดู [ข้อความกลุ่ม](/th/channels/group-messages) สำหรับพฤติกรรมเฉพาะ WhatsApp (การแทรกประวัติ รายละเอียดการจัดการการกล่าวถึง)
+ดู [ข้อความกลุ่ม](/th/channels/group-messages) สำหรับพฤติกรรมเฉพาะ WhatsApp (การฉีดประวัติ รายละเอียดการจัดการการกล่าวถึง)
## ที่เกี่ยวข้อง
-- [กลุ่มกระจายข้อความ](/th/channels/broadcast-groups)
+- [กลุ่มบรอดแคสต์](/th/channels/broadcast-groups)
- [การกำหนดเส้นทางช่องทาง](/th/channels/channel-routing)
- [ข้อความกลุ่ม](/th/channels/group-messages)
- [การจับคู่](/th/channels/pairing)
diff --git a/docs/th/channels/irc.md b/docs/th/channels/irc.md
index a9cc1c388..2d3cc91d4 100644
--- a/docs/th/channels/irc.md
+++ b/docs/th/channels/irc.md
@@ -1,20 +1,20 @@
---
read_when:
- - คุณต้องการเชื่อมต่อ OpenClaw กับช่อง IRC หรือ DM
- - คุณกำลังกำหนดค่า allowlist ของ IRC นโยบายกลุ่ม หรือ mention gating
+ - คุณต้องการเชื่อมต่อ OpenClaw กับช่อง IRC หรือข้อความส่วนตัว
+ - คุณกำลังกำหนดค่ารายการอนุญาตของ IRC, นโยบายกลุ่ม, หรือการจำกัดการกล่าวถึง
summary: การตั้งค่า Plugin IRC การควบคุมการเข้าถึง และการแก้ไขปัญหา
title: IRC
x-i18n:
- generated_at: "2026-04-24T08:58:30Z"
- model: gpt-5.4
+ generated_at: "2026-05-04T02:21:35Z"
+ model: gpt-5.5
provider: openai
- source_hash: 76f316c0f026d0387a97dc5dcb6d8967f6e4841d94b95b36e42f6f6284882a69
+ source_hash: 43c3098fe49a5e7405443df73e1bf752a579460dc0b2070c3d07f43b512bb555
source_path: channels/irc.md
- workflow: 15
+ workflow: 16
---
-ใช้ IRC เมื่อคุณต้องการให้ OpenClaw อยู่ในช่องแบบดั้งเดิม (`#room`) และข้อความส่วนตัว
-IRC มาพร้อมเป็น Plugin ที่รวมมาให้ แต่จะกำหนดค่าในคอนฟิกหลักภายใต้ `channels.irc`
+ใช้ IRC เมื่อคุณต้องการใช้ OpenClaw ในช่องแบบคลาสสิก (`#room`) และข้อความส่วนตัว
+IRC จัดส่งมาเป็น Plugin ที่รวมมาให้ แต่กำหนดค่าในคอนฟิกหลักภายใต้ `channels.irc`
## เริ่มต้นอย่างรวดเร็ว
@@ -36,9 +36,9 @@ IRC มาพร้อมเป็น Plugin ที่รวมมาให้
}
```
-ควรใช้เซิร์ฟเวอร์ IRC แบบส่วนตัวสำหรับการประสานงานของบอต หากคุณตั้งใจใช้เครือข่าย IRC สาธารณะ ตัวเลือกที่พบบ่อยได้แก่ Libera.Chat, OFTC และ Snoonet หลีกเลี่ยงช่องสาธารณะที่คาดเดาได้ง่ายสำหรับทราฟฟิก backchannel ของบอตหรือ swarm
+ควรใช้เซิร์ฟเวอร์ IRC ส่วนตัวสำหรับการประสานงานบอต หากคุณตั้งใจใช้เครือข่าย IRC สาธารณะ ตัวเลือกที่พบบ่อยได้แก่ Libera.Chat, OFTC และ Snoonet หลีกเลี่ยงช่องสาธารณะที่คาดเดาได้สำหรับทราฟฟิกแบ็กแชนเนลของบอตหรือสวอร์ม
-3. เริ่มต้น/รีสตาร์ต Gateway:
+3. เริ่ม/รีสตาร์ท Gateway:
```bash
openclaw gateway run
@@ -46,38 +46,39 @@ openclaw gateway run
## ค่าเริ่มต้นด้านความปลอดภัย
-- `channels.irc.dmPolicy` มีค่าเริ่มต้นเป็น `"pairing"`
-- `channels.irc.groupPolicy` มีค่าเริ่มต้นเป็น `"allowlist"`
-- เมื่อ `groupPolicy="allowlist"` ให้ตั้งค่า `channels.irc.groups` เพื่อกำหนดช่องที่อนุญาต
-- ใช้ TLS (`channels.irc.tls=true`) เว้นแต่คุณตั้งใจยอมรับการส่งข้อมูลแบบ plaintext
+- IRC ใช้ซ็อกเก็ต TCP/TLS ดิบภายนอกการกำหนดเส้นทางผ่านพร็อกซีส่งต่อที่ผู้ดูแล OpenClaw จัดการ ในการปรับใช้ที่กำหนดให้ทราฟฟิกขาออกทั้งหมดต้องผ่านพร็อกซีส่งต่อนั้น ให้ตั้งค่า `channels.irc.enabled=false` เว้นแต่ว่าการออก IRC โดยตรงได้รับการอนุมัติอย่างชัดเจน
+- ค่าเริ่มต้นของ `channels.irc.dmPolicy` คือ `"pairing"`
+- ค่าเริ่มต้นของ `channels.irc.groupPolicy` คือ `"allowlist"`
+- เมื่อใช้ `groupPolicy="allowlist"` ให้ตั้งค่า `channels.irc.groups` เพื่อกำหนดช่องที่อนุญาต
+- ใช้ TLS (`channels.irc.tls=true`) เว้นแต่ว่าคุณตั้งใจยอมรับการขนส่งแบบข้อความธรรมดา
## การควบคุมการเข้าถึง
-มี “ด่าน” แยกกันสองชั้นสำหรับช่อง IRC:
+มี “เกต” แยกกันสองอย่างสำหรับช่อง IRC:
-1. **การเข้าถึงช่อง** (`groupPolicy` + `groups`): บอตจะยอมรับข้อความจากช่องนั้นเลยหรือไม่
-2. **การเข้าถึงของผู้ส่ง** (`groupAllowFrom` / `groups["#channel"].allowFrom` แบบรายช่อง): ใครบ้างที่ได้รับอนุญาตให้เรียกใช้บอตภายในช่องนั้น
+1. **การเข้าถึงช่อง** (`groupPolicy` + `groups`): บอตจะรับข้อความจากช่องนั้นหรือไม่
+2. **การเข้าถึงของผู้ส่ง** (`groupAllowFrom` / `groups["#channel"].allowFrom` รายช่อง): ใครบ้างที่ได้รับอนุญาตให้เรียกใช้บอตภายในช่องนั้น
คีย์คอนฟิก:
-- allowlist ของ DM (การเข้าถึงของผู้ส่ง DM): `channels.irc.allowFrom`
-- allowlist ของผู้ส่งในกลุ่ม (การเข้าถึงของผู้ส่งในช่อง): `channels.irc.groupAllowFrom`
-- ตัวควบคุมรายช่อง (ช่อง + ผู้ส่ง + กฎ mention): `channels.irc.groups["#channel"]`
-- `channels.irc.groupPolicy="open"` อนุญาตช่องที่ไม่ได้ตั้งค่า (**แต่ยังคงถูกควบคุมด้วย mention เป็นค่าเริ่มต้น**)
+- รายการอนุญาต DM (การเข้าถึงของผู้ส่ง DM): `channels.irc.allowFrom`
+- รายการอนุญาตผู้ส่งกลุ่ม (การเข้าถึงของผู้ส่งในช่อง): `channels.irc.groupAllowFrom`
+- การควบคุมรายช่อง (กฎช่อง + ผู้ส่ง + การกล่าวถึง): `channels.irc.groups["#channel"]`
+- `channels.irc.groupPolicy="open"` อนุญาตช่องที่ไม่ได้กำหนดค่าไว้ (**ยังคงถูกกั้นด้วยการกล่าวถึงตามค่าเริ่มต้น**)
-รายการใน allowlist ควรใช้ตัวตนผู้ส่งที่คงที่ (`nick!user@host`)
-การจับคู่ด้วย nick อย่างเดียวเปลี่ยนแปลงได้ และจะเปิดใช้ก็ต่อเมื่อ `channels.irc.dangerouslyAllowNameMatching: true`
+รายการในรายการอนุญาตควรใช้ตัวตนผู้ส่งที่เสถียร (`nick!user@host`)
+การจับคู่ด้วยชื่อเล่นล้วนเปลี่ยนแปลงได้ และเปิดใช้เมื่อ `channels.irc.dangerouslyAllowNameMatching: true` เท่านั้น
-### จุดที่พลาดกันบ่อย: `allowFrom` ใช้สำหรับ DM ไม่ใช่ช่อง
+### ข้อผิดพลาดที่พบบ่อย: `allowFrom` ใช้สำหรับ DM ไม่ใช่ช่อง
หากคุณเห็นล็อกเช่น:
- `irc: drop group sender alice!ident@host (policy=allowlist)`
-…นั่นหมายความว่าผู้ส่งไม่ได้รับอนุญาตสำหรับข้อความแบบ **group/channel** แก้ไขได้โดย:
+…หมายความว่าผู้ส่งไม่ได้รับอนุญาตสำหรับข้อความ **กลุ่ม/ช่อง** แก้ไขได้โดยเลือกอย่างใดอย่างหนึ่ง:
-- ตั้งค่า `channels.irc.groupAllowFrom` (ใช้ทั่วโลกกับทุกช่อง) หรือ
-- ตั้งค่า allowlist ผู้ส่งแบบรายช่อง: `channels.irc.groups["#channel"].allowFrom`
+- ตั้งค่า `channels.irc.groupAllowFrom` (ใช้ทั่วทุกช่อง), หรือ
+- ตั้งค่ารายการอนุญาตผู้ส่งรายช่อง: `channels.irc.groups["#channel"].allowFrom`
ตัวอย่าง (อนุญาตให้ทุกคนใน `#tuirc-dev` คุยกับบอตได้):
@@ -94,13 +95,13 @@ openclaw gateway run
}
```
-## การทริกเกอร์การตอบกลับ (mentions)
+## การเรียกให้ตอบกลับ (การกล่าวถึง)
-แม้ว่าช่องจะได้รับอนุญาตแล้ว (ผ่าน `groupPolicy` + `groups`) และผู้ส่งก็ได้รับอนุญาต OpenClaw จะใช้**การควบคุมด้วย mention**เป็นค่าเริ่มต้นในบริบทกลุ่ม
+แม้ว่าช่องจะได้รับอนุญาตแล้ว (ผ่าน `groupPolicy` + `groups`) และผู้ส่งได้รับอนุญาตแล้ว OpenClaw จะมีค่าเริ่มต้นเป็นการ **กั้นด้วยการกล่าวถึง** ในบริบทกลุ่ม
-นั่นหมายความว่าคุณอาจเห็นล็อกเช่น `drop channel … (missing-mention)` เว้นแต่ข้อความนั้นจะมีรูปแบบ mention ที่ตรงกับบอต
+นั่นหมายความว่าคุณอาจเห็นล็อกเช่น `drop channel … (missing-mention)` เว้นแต่ว่าข้อความมีรูปแบบการกล่าวถึงที่ตรงกับบอต
-หากต้องการให้บอตตอบในช่อง IRC **โดยไม่ต้องมี mention** ให้ปิดการควบคุมด้วย mention สำหรับช่องนั้น:
+หากต้องการให้บอตตอบกลับในช่อง IRC **โดยไม่ต้องกล่าวถึง** ให้ปิดการกั้นด้วยการกล่าวถึงสำหรับช่องนั้น:
```json5
{
@@ -118,7 +119,7 @@ openclaw gateway run
}
```
-หรือหากต้องการอนุญาต **ทุก** ช่อง IRC (ไม่มี allowlist รายช่อง) และยังให้ตอบโดยไม่ต้องมี mentions:
+หรือหากต้องการอนุญาตช่อง IRC **ทั้งหมด** (ไม่มีรายการอนุญาตรายช่อง) และยังตอบกลับได้โดยไม่ต้องกล่าวถึง:
```json5
{
@@ -135,10 +136,10 @@ openclaw gateway run
## หมายเหตุด้านความปลอดภัย (แนะนำสำหรับช่องสาธารณะ)
-หากคุณอนุญาต `allowFrom: ["*"]` ในช่องสาธารณะ ใครก็สามารถ prompt บอตได้
+หากคุณอนุญาต `allowFrom: ["*"]` ในช่องสาธารณะ ทุกคนสามารถพรอมป์บอตได้
เพื่อลดความเสี่ยง ให้จำกัดเครื่องมือสำหรับช่องนั้น
-### เครื่องมือชุดเดียวกันสำหรับทุกคนในช่อง
+### เครื่องมือเดียวกันสำหรับทุกคนในช่อง
```json5
{
@@ -157,9 +158,9 @@ openclaw gateway run
}
```
-### เครื่องมือต่างกันตามผู้ส่ง (เจ้าของมีสิทธิ์มากกว่า)
+### เครื่องมือต่างกันตามผู้ส่ง (เจ้าของได้สิทธิ์มากกว่า)
-ใช้ `toolsBySender` เพื่อใช้นโยบายที่เข้มงวดกว่ากับ `"*"` และผ่อนปรนกว่ากับ nick ของคุณ:
+ใช้ `toolsBySender` เพื่อใช้นโยบายที่เข้มงวดกว่าสำหรับ `"*"` และนโยบายที่ผ่อนปรนกว่าสำหรับชื่อเล่นของคุณ:
```json5
{
@@ -185,16 +186,16 @@ openclaw gateway run
หมายเหตุ:
-- คีย์ของ `toolsBySender` ควรใช้ `id:` สำหรับค่าตัวตนผู้ส่งของ IRC:
+- คีย์ `toolsBySender` ควรใช้ `id:` สำหรับค่าตัวตนผู้ส่ง IRC:
`id:eigen` หรือ `id:eigen!~eigen@174.127.248.171` เพื่อการจับคู่ที่เข้มงวดยิ่งขึ้น
-- คีย์แบบ legacy ที่ไม่มี prefix ยังรองรับอยู่ และจะจับคู่เป็น `id:` เท่านั้น
-- นโยบายผู้ส่งตัวแรกที่ตรงกันจะเป็นตัวชนะ; `"*"` คือ wildcard fallback
+- คีย์เดิมที่ไม่มีคำนำหน้ายังคงรองรับ และจะจับคู่เป็น `id:` เท่านั้น
+- นโยบายผู้ส่งรายการแรกที่ตรงกันจะถูกใช้; `"*"` คือค่าทดแทนแบบไวลด์การ์ด
-สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเข้าถึงกลุ่มเทียบกับการควบคุมด้วย mention (และวิธีที่ทั้งสองทำงานร่วมกัน) ดู: [/channels/groups](/th/channels/groups)
+สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเข้าถึงกลุ่มเทียบกับการกั้นด้วยการกล่าวถึง (และวิธีที่ทั้งสองโต้ตอบกัน) ดู: [/channels/groups](/th/channels/groups)
## NickServ
-หากต้องการยืนยันตัวตนกับ NickServ หลังจากเชื่อมต่อ:
+เพื่อระบุตัวตนกับ NickServ หลังเชื่อมต่อ:
```json5
{
@@ -210,7 +211,7 @@ openclaw gateway run
}
```
-การลงทะเบียนครั้งเดียวเมื่อเชื่อมต่อแบบไม่บังคับ:
+การลงทะเบียนแบบครั้งเดียวที่เป็นตัวเลือกเมื่อเชื่อมต่อ:
```json5
{
@@ -225,7 +226,7 @@ openclaw gateway run
}
```
-ปิด `register` หลังจากลงทะเบียน nick แล้ว เพื่อหลีกเลี่ยงการพยายาม REGISTER ซ้ำ
+ปิดใช้ `register` หลังชื่อเล่นลงทะเบียนแล้ว เพื่อหลีกเลี่ยงการพยายาม REGISTER ซ้ำ
## ตัวแปรสภาพแวดล้อม
@@ -242,18 +243,18 @@ openclaw gateway run
- `IRC_NICKSERV_PASSWORD`
- `IRC_NICKSERV_REGISTER_EMAIL`
-ไม่สามารถตั้งค่า `IRC_HOST` จาก `.env` ของ workspace ได้; ดู [ไฟล์ `.env` ของ Workspace](/th/gateway/security)
+ไม่สามารถตั้งค่า `IRC_HOST` จากไฟล์ `.env` ของเวิร์กสเปซได้; ดู [ไฟล์ `.env` ของเวิร์กสเปซ](/th/gateway/security)
## การแก้ไขปัญหา
-- หากบอตเชื่อมต่อได้แต่ไม่เคยตอบในช่อง ให้ตรวจสอบ `channels.irc.groups` **และ** ตรวจสอบว่าการควบคุมด้วย mention กำลังทิ้งข้อความอยู่หรือไม่ (`missing-mention`) หากคุณต้องการให้ตอบโดยไม่ต้อง ping ให้ตั้งค่า `requireMention:false` สำหรับช่องนั้น
-- หากเข้าสู่ระบบไม่สำเร็จ ให้ตรวจสอบว่า nick ใช้งานได้และรหัสผ่านเซิร์ฟเวอร์ถูกต้อง
-- หาก TLS ล้มเหลวบนเครือข่ายแบบกำหนดเอง ให้ตรวจสอบ host/port และการตั้งค่า certificate
+- หากบอตเชื่อมต่อได้แต่ไม่เคยตอบกลับในช่อง ให้ตรวจสอบ `channels.irc.groups` **และ** ตรวจสอบว่าการกั้นด้วยการกล่าวถึงกำลังทิ้งข้อความหรือไม่ (`missing-mention`) หากคุณต้องการให้ตอบกลับโดยไม่ต้องปิง ให้ตั้งค่า `requireMention:false` สำหรับช่องนั้น
+- หากเข้าสู่ระบบล้มเหลว ให้ตรวจสอบว่าชื่อเล่นยังใช้งานได้และรหัสผ่านเซิร์ฟเวอร์ถูกต้อง
+- หาก TLS ล้มเหลวบนเครือข่ายแบบกำหนดเอง ให้ตรวจสอบโฮสต์/พอร์ตและการตั้งค่าใบรับรอง
## ที่เกี่ยวข้อง
-- [ภาพรวม Channels](/th/channels) — ช่องที่รองรับทั้งหมด
-- [Pairing](/th/channels/pairing) — การยืนยันตัวตน DM และโฟลว์การจับคู่
-- [Groups](/th/channels/groups) — พฤติกรรมของแชตกลุ่มและการควบคุมด้วย mention
-- [Channel Routing](/th/channels/channel-routing) — การกำหนดเส้นทางเซสชันสำหรับข้อความ
-- [Security](/th/gateway/security) — โมเดลการเข้าถึงและการเสริมความปลอดภัย
+- [ภาพรวมช่องทาง](/th/channels) — ช่องทางทั้งหมดที่รองรับ
+- [การจับคู่](/th/channels/pairing) — การยืนยันตัวตน DM และโฟลว์การจับคู่
+- [กลุ่ม](/th/channels/groups) — พฤติกรรมแชตกลุ่มและการกั้นด้วยการกล่าวถึง
+- [การกำหนดเส้นทางช่องทาง](/th/channels/channel-routing) — การกำหนดเส้นทางเซสชันสำหรับข้อความ
+- [ความปลอดภัย](/th/gateway/security) — โมเดลการเข้าถึงและการเพิ่มความแข็งแกร่ง
diff --git a/docs/th/channels/pairing.md b/docs/th/channels/pairing.md
index d4db35ada..f715da846 100644
--- a/docs/th/channels/pairing.md
+++ b/docs/th/channels/pairing.md
@@ -1,41 +1,43 @@
---
read_when:
- - การตั้งค่าการควบคุมการเข้าถึงข้อความส่วนตัว
+ - การตั้งค่าการควบคุมการเข้าถึง DM
- การจับคู่ Node iOS/Android ใหม่
- การตรวจสอบสถานะด้านความปลอดภัยของ OpenClaw
-summary: 'ภาพรวมการจับคู่: อนุมัติว่าใครสามารถส่งข้อความส่วนตัวถึงคุณได้ + Node ใดบ้างสามารถเข้าร่วมได้'
+summary: 'ภาพรวมการจับคู่: อนุมัติว่าใครส่ง DM ถึงคุณได้ + โหนดใดสามารถเข้าร่วมได้'
title: การจับคู่
x-i18n:
- generated_at: "2026-05-02T10:08:30Z"
+ generated_at: "2026-05-04T02:21:45Z"
model: gpt-5.5
provider: openai
- source_hash: bb68d87c0e1dfe7c9a6a6d9415f4c63625755fb43a2e22a1d1374ff0a63e49c4
+ source_hash: 4fb27840f7c9ef55e7270cc29f813e6db90b240aa2180f30952eb9485f0f8874
source_path: channels/pairing.md
workflow: 16
---
-“การจับคู่” คือขั้นตอนการอนุมัติการเข้าถึงอย่างชัดเจนของ OpenClaw
+“การจับคู่” คือขั้นตอนอนุมัติการเข้าถึงแบบชัดเจนของ OpenClaw
ใช้ในสองตำแหน่ง:
-1. **การจับคู่ DM** (ใครได้รับอนุญาตให้คุยกับบอท)
-2. **การจับคู่ Node** (อุปกรณ์/โหนดใดได้รับอนุญาตให้เข้าร่วมเครือข่าย Gateway)
+1. **การจับคู่ DM** (ใครได้รับอนุญาตให้คุยกับบอต)
+2. **การจับคู่ Node** (อุปกรณ์/Node ใดได้รับอนุญาตให้เข้าร่วมเครือข่าย Gateway)
-บริบทความปลอดภัย: [ความปลอดภัย](/th/gateway/security)
+บริบทด้านความปลอดภัย: [ความปลอดภัย](/th/gateway/security)
## 1) การจับคู่ DM (การเข้าถึงแชทขาเข้า)
เมื่อช่องทางถูกกำหนดค่าด้วยนโยบาย DM `pairing` ผู้ส่งที่ไม่รู้จักจะได้รับรหัสสั้น และข้อความของพวกเขาจะ **ไม่ถูกประมวลผล** จนกว่าคุณจะอนุมัติ
-นโยบาย DM เริ่มต้นมีเอกสารอยู่ที่: [ความปลอดภัย](/th/gateway/security)
+นโยบาย DM เริ่มต้นมีเอกสารอยู่ใน: [ความปลอดภัย](/th/gateway/security)
-`dmPolicy: "open"` จะเป็นสาธารณะก็ต่อเมื่อ allowlist ของ DM ที่มีผลรวม `"*"` อยู่ด้วย
-การตั้งค่าและการตรวจสอบความถูกต้องต้องใช้ wildcard นั้นสำหรับ config แบบเปิดสาธารณะ หากสถานะที่มีอยู่มี `open` พร้อมรายการ `allowFrom` ที่เป็นรูปธรรม runtime จะยังคงยอมรับเฉพาะผู้ส่งเหล่านั้นเท่านั้น และการอนุมัติใน pairing-store จะไม่ขยายการเข้าถึงแบบ `open`
+`dmPolicy: "open"` เป็นสาธารณะเฉพาะเมื่อรายการอนุญาต DM ที่มีผลรวม `"*"` อยู่ด้วย
+การตั้งค่าและการตรวจสอบต้องใช้ไวลด์การ์ดนี้สำหรับค่ากำหนดแบบเปิดสาธารณะ หากสถานะเดิม
+มี `open` พร้อมรายการ `allowFrom` ที่เป็นรูปธรรม รันไทม์จะยังคงรับเฉพาะ
+ผู้ส่งเหล่านั้น และการอนุมัติในที่เก็บการจับคู่จะไม่ขยายการเข้าถึง `open`
รหัสจับคู่:
-- 8 อักขระ ตัวพิมพ์ใหญ่ ไม่มีอักขระที่สับสนง่าย (`0O1I`)
-- **หมดอายุหลัง 1 ชั่วโมง** บอทจะส่งข้อความจับคู่เฉพาะเมื่อมีการสร้างคำขอใหม่เท่านั้น (ประมาณหนึ่งครั้งต่อชั่วโมงต่อผู้ส่ง)
-- คำขอจับคู่ DM ที่รอดำเนินการถูกจำกัดไว้ที่ **3 รายการต่อช่องทาง** โดยค่าเริ่มต้น คำขอเพิ่มเติมจะถูกละเว้นจนกว่ารายการหนึ่งจะหมดอายุหรือได้รับอนุมัติ
+- 8 อักขระ ตัวพิมพ์ใหญ่ ไม่มีอักขระที่สับสนได้ (`0O1I`)
+- **หมดอายุหลัง 1 ชั่วโมง** บอตจะส่งข้อความจับคู่เฉพาะเมื่อมีการสร้างคำขอใหม่ (ประมาณหนึ่งครั้งต่อชั่วโมงต่อผู้ส่ง)
+- คำขอจับคู่ DM ที่รอดำเนินการถูกจำกัดไว้ที่ **3 รายการต่อช่องทาง** ตามค่าเริ่มต้น คำขอเพิ่มเติมจะถูกเพิกเฉยจนกว่ารายการหนึ่งจะหมดอายุหรือได้รับอนุมัติ
### อนุมัติผู้ส่ง
@@ -44,16 +46,21 @@ openclaw pairing list telegram
openclaw pairing approve telegram
```
-หากยังไม่ได้กำหนดเจ้าของคำสั่ง การอนุมัติรหัสจับคู่ DM จะเริ่มต้น `commands.ownerAllowFrom` ให้เป็นผู้ส่งที่ได้รับอนุมัติด้วย เช่น `telegram:123456789`
-สิ่งนี้ทำให้การตั้งค่าครั้งแรกมีเจ้าของที่ชัดเจนสำหรับคำสั่งที่มีสิทธิ์สูงและพรอมป์อนุมัติ exec หลังจากมีเจ้าของแล้ว การอนุมัติการจับคู่ภายหลังจะให้เฉพาะการเข้าถึง DM เท่านั้น และจะไม่เพิ่มเจ้าของเพิ่มเติม
+หากยังไม่ได้กำหนดค่าเจ้าของคำสั่ง การอนุมัติรหัสจับคู่ DM จะบูตสแตรป
+`commands.ownerAllowFrom` ไปยังผู้ส่งที่ได้รับอนุมัติด้วย เช่น `telegram:123456789`
+สิ่งนี้ทำให้การตั้งค่าครั้งแรกมีเจ้าของที่ชัดเจนสำหรับคำสั่งที่มีสิทธิ์สูงและพรอมป์อนุมัติ
+exec หลังจากมีเจ้าของแล้ว การอนุมัติการจับคู่ภายหลังจะให้สิทธิ์เข้าถึง DM
+เท่านั้น และจะไม่เพิ่มเจ้าของเพิ่มเติม
ช่องทางที่รองรับ: `bluebubbles`, `discord`, `feishu`, `googlechat`, `imessage`, `irc`, `line`, `matrix`, `mattermost`, `msteams`, `nextcloud-talk`, `nostr`, `openclaw-weixin`, `signal`, `slack`, `synology-chat`, `telegram`, `twitch`, `whatsapp`, `zalo`, `zalouser`
### กลุ่มผู้ส่งที่ใช้ซ้ำได้
-ใช้ `accessGroups` ระดับบนสุดเมื่อชุดผู้ส่งที่เชื่อถือได้ชุดเดียวกันควรใช้กับหลายช่องทางข้อความ หรือใช้กับทั้ง allowlist ของ DM และกลุ่ม
+ใช้ `accessGroups` ระดับบนสุดเมื่อชุดผู้ส่งที่เชื่อถือเดียวกันควรใช้กับ
+หลายช่องทางข้อความ หรือใช้กับทั้งรายการอนุญาต DM และกลุ่ม
-กลุ่มแบบคงที่ใช้ `type: "message.senders"` และอ้างอิงด้วย `accessGroup:` จาก allowlist ของช่องทาง:
+กลุ่มแบบคงที่ใช้ `type: "message.senders"` และถูกอ้างอิงด้วย
+`accessGroup:` จากรายการอนุญาตของช่องทาง:
```json5
{
@@ -74,58 +81,65 @@ openclaw pairing approve telegram
}
```
-กลุ่มการเข้าถึงมีเอกสารอย่างละเอียดที่นี่: [กลุ่มการเข้าถึง](/th/channels/access-groups)
+กลุ่มการเข้าถึงมีเอกสารโดยละเอียดที่นี่: [กลุ่มการเข้าถึง](/th/channels/access-groups)
-### ตำแหน่งที่เก็บสถานะ
+### สถานะถูกเก็บไว้ที่ใด
-จัดเก็บภายใต้ `~/.openclaw/credentials/`:
+เก็บไว้ภายใต้ `~/.openclaw/credentials/`:
- คำขอที่รอดำเนินการ: `-pairing.json`
-- ที่เก็บ allowlist ที่ได้รับอนุมัติ:
+- ที่เก็บรายการอนุญาตที่ได้รับอนุมัติ:
- บัญชีเริ่มต้น: `-allowFrom.json`
- บัญชีที่ไม่ใช่ค่าเริ่มต้น: `--allowFrom.json`
พฤติกรรมการกำหนดขอบเขตบัญชี:
-- บัญชีที่ไม่ใช่ค่าเริ่มต้นจะอ่าน/เขียนเฉพาะไฟล์ allowlist ตามขอบเขตของตน
-- บัญชีเริ่มต้นใช้ไฟล์ allowlist แบบไม่มีขอบเขตที่อิงตามช่องทาง
+- บัญชีที่ไม่ใช่ค่าเริ่มต้นอ่าน/เขียนเฉพาะไฟล์รายการอนุญาตที่กำหนดขอบเขตของตน
+- บัญชีเริ่มต้นใช้ไฟล์รายการอนุญาตแบบไม่กำหนดขอบเขตที่อิงตามช่องทาง
-ปฏิบัติกับไฟล์เหล่านี้เป็นข้อมูลอ่อนไหว (ไฟล์เหล่านี้ควบคุมการเข้าถึงผู้ช่วยของคุณ)
+ถือว่าสิ่งเหล่านี้เป็นข้อมูลอ่อนไหว (เพราะควบคุมการเข้าถึงผู้ช่วยของคุณ)
-ที่เก็บ allowlist สำหรับการจับคู่ใช้สำหรับการเข้าถึง DM การอนุญาตของกลุ่มแยกต่างหาก
-การอนุมัติรหัสจับคู่ DM จะไม่อนุญาตให้ผู้ส่งนั้นรันคำสั่งกลุ่มหรือควบคุมบอทในกลุ่มโดยอัตโนมัติ การเริ่มต้นเจ้าของคนแรกเป็นสถานะ config แยกต่างหากใน `commands.ownerAllowFrom` และการส่งข้อความในแชทกลุ่มยังคงเป็นไปตาม allowlist ของกลุ่มในช่องทางนั้น (เช่น `groupAllowFrom`, `groups` หรือการ override ต่อกลุ่มหรือต่อหัวข้อ ขึ้นอยู่กับช่องทาง)
+ที่เก็บรายการอนุญาตการจับคู่ใช้สำหรับการเข้าถึง DM การอนุญาตกลุ่มแยกต่างหาก
+การอนุมัติรหัสจับคู่ DM ไม่ได้อนุญาตให้ผู้ส่งนั้นเรียกใช้คำสั่งกลุ่ม
+หรือควบคุมบอตในกลุ่มโดยอัตโนมัติ การบูตสแตรปเจ้าของคนแรกเป็นสถานะค่ากำหนด
+แยกต่างหากใน `commands.ownerAllowFrom` และการส่งมอบในแชทกลุ่มยังคงเป็นไปตาม
+รายการอนุญาตกลุ่มของช่องทาง (เช่น `groupAllowFrom`, `groups` หรือการแทนที่ต่อกลุ่ม
+หรือต่อหัวข้อ ขึ้นอยู่กับช่องทาง)
-## 2) การจับคู่อุปกรณ์ Node (โหนด iOS/Android/macOS/headless)
+## 2) การจับคู่อุปกรณ์ Node (iOS/Android/macOS/Node แบบ headless)
-Node เชื่อมต่อกับ Gateway เป็น **อุปกรณ์** ด้วย `role: node` Gateway จะสร้างคำขอจับคู่อุปกรณ์ที่ต้องได้รับการอนุมัติ
+Node เชื่อมต่อกับ Gateway ในฐานะ **อุปกรณ์** ด้วย `role: node` Gateway
+จะสร้างคำขอจับคู่อุปกรณ์ที่ต้องได้รับอนุมัติ
### จับคู่ผ่าน Telegram (แนะนำสำหรับ iOS)
หากคุณใช้ Plugin `device-pair` คุณสามารถจับคู่อุปกรณ์ครั้งแรกทั้งหมดจาก Telegram ได้:
-1. ใน Telegram ส่งข้อความถึงบอทของคุณ: `/pair`
-2. บอทจะตอบกลับด้วยสองข้อความ: ข้อความคำแนะนำและข้อความ **รหัสตั้งค่า** แยกต่างหาก (คัดลอก/วางใน Telegram ได้ง่าย)
-3. บนโทรศัพท์ของคุณ เปิดแอป OpenClaw iOS → Settings → Gateway
+1. ใน Telegram ส่งข้อความถึงบอตของคุณ: `/pair`
+2. บอตตอบกลับด้วยสองข้อความ: ข้อความคำแนะนำและข้อความ **รหัสตั้งค่า** แยกต่างหาก (คัดลอก/วางใน Telegram ได้ง่าย)
+3. บนโทรศัพท์ของคุณ เปิดแอป OpenClaw iOS → การตั้งค่า → Gateway
4. วางรหัสตั้งค่าและเชื่อมต่อ
-5. กลับไปที่ Telegram: `/pair pending` (ตรวจสอบ ID คำขอ บทบาท และ scopes) จากนั้นอนุมัติ
+5. กลับไปที่ Telegram: `/pair pending` (ตรวจสอบ ID คำขอ บทบาท และขอบเขต) จากนั้นอนุมัติ
-รหัสตั้งค่าเป็น payload JSON ที่เข้ารหัสแบบ base64 ซึ่งมี:
+รหัสตั้งค่าเป็นเพย์โหลด JSON ที่เข้ารหัส base64 ซึ่งประกอบด้วย:
- `url`: URL WebSocket ของ Gateway (`ws://...` หรือ `wss://...`)
-- `bootstrapToken`: token bootstrap แบบอุปกรณ์เดียวที่มีอายุสั้น ใช้สำหรับ handshake การจับคู่ครั้งแรก
+- `bootstrapToken`: โทเค็นบูตสแตรปแบบอายุสั้นสำหรับอุปกรณ์เดียวที่ใช้กับการจับคู่เริ่มต้น
-token bootstrap นั้นมีโปรไฟล์ bootstrap สำหรับการจับคู่ในตัว:
+โทเค็นบูตสแตรปนั้นมีโปรไฟล์บูตสแตรปการจับคู่ในตัว:
-- token `node` หลักที่ส่งต่อยังคงเป็น `scopes: []`
-- token `operator` ใดๆ ที่ส่งต่อยังคงถูกจำกัดไว้ที่ allowlist ของ bootstrap:
+- โทเค็น `node` หลักที่ส่งมอบต่อยังคงเป็น `scopes: []`
+- โทเค็น `operator` ใดๆ ที่ส่งมอบต่อยังคงถูกจำกัดไว้กับรายการอนุญาตบูตสแตรป:
`operator.approvals`, `operator.read`, `operator.talk.secrets`, `operator.write`
-- การตรวจ scope ของ bootstrap มี prefix ตามบทบาท ไม่ใช่ pool ของ scope แบบแบนเดียว:
- รายการ scope ของ operator จะตอบสนองเฉพาะคำขอของ operator เท่านั้น และบทบาทที่ไม่ใช่ operator ยังต้องขอ scopes ภายใต้ prefix บทบาทของตนเอง
-- การหมุนเวียน/เพิกถอน token ภายหลังยังคงถูกจำกัดโดยทั้งสัญญาบทบาทที่อุปกรณ์ได้รับอนุมัติและ scopes ของ operator ใน session ผู้เรียก
+- การตรวจสอบขอบเขตบูตสแตรปมีคำนำหน้าตามบทบาท ไม่ใช่พูลขอบเขตแบบแบนเดียว:
+ รายการขอบเขตของ operator ตอบสนองเฉพาะคำขอของ operator และบทบาทที่ไม่ใช่ operator
+ ยังต้องร้องขอขอบเขตภายใต้คำนำหน้าบทบาทของตนเอง
+- การหมุนเวียน/เพิกถอนโทเค็นภายหลังยังคงถูกจำกัดโดยทั้งสัญญาบทบาทที่ได้รับอนุมัติ
+ ของอุปกรณ์และขอบเขต operator ของเซสชันผู้เรียก
-ปฏิบัติกับรหัสตั้งค่าเหมือนรหัสผ่านขณะที่ยังมีผลอยู่
+ถือว่ารหัสตั้งค่าเหมือนรหัสผ่านในขณะที่ยังใช้ได้
### อนุมัติอุปกรณ์ Node
@@ -135,15 +149,25 @@ openclaw devices approve
openclaw devices reject
```
-หากอุปกรณ์เดิมลองใหม่ด้วยรายละเอียด auth ที่แตกต่างกัน (เช่น role/scopes/public key ที่ต่างกัน) คำขอที่รอดำเนินการก่อนหน้าจะถูกแทนที่ และจะสร้าง `requestId` ใหม่
+เมื่อการอนุมัติแบบชัดเจนถูกปฏิเสธเพราะเซสชันอุปกรณ์ที่จับคู่ซึ่งใช้อนุมัติ
+ถูกเปิดด้วยขอบเขตเฉพาะการจับคู่ CLI จะลองส่งคำขอเดิมซ้ำด้วย
+`operator.admin` สิ่งนี้ทำให้อุปกรณ์ที่จับคู่แล้วซึ่งมีความสามารถระดับแอดมินกู้คืนการจับคู่
+Control UI/เบราว์เซอร์ใหม่ได้โดยไม่ต้องแก้ `devices/paired.json` ด้วยมือ
+Gateway ยังคงตรวจสอบการเชื่อมต่อที่ลองใหม่ โทเค็นที่ไม่สามารถยืนยันตัวตน
+ด้วย `operator.admin` จะยังคงถูกบล็อก
+
+หากอุปกรณ์เดิมลองใหม่ด้วยรายละเอียดการยืนยันตัวตนต่างออกไป (เช่น
+บทบาท/ขอบเขต/กุญแจสาธารณะต่างกัน) คำขอที่รอดำเนินการก่อนหน้าจะถูกแทนที่และมีการสร้าง
+`requestId` ใหม่
-อุปกรณ์ที่จับคู่แล้วจะไม่ได้รับการเข้าถึงที่กว้างขึ้นแบบเงียบๆ หากเชื่อมต่อใหม่โดยขอ scopes เพิ่มหรือบทบาทที่กว้างขึ้น OpenClaw จะคงการอนุมัติที่มีอยู่ไว้ตามเดิม และสร้างคำขออัปเกรดที่รอดำเนินการใหม่ ใช้ `openclaw devices list` เพื่อเปรียบเทียบการเข้าถึงที่อนุมัติอยู่ในปัจจุบันกับการเข้าถึงที่ขอใหม่ก่อนที่คุณจะอนุมัติ
+อุปกรณ์ที่จับคู่แล้วจะไม่รับสิทธิ์กว้างขึ้นอย่างเงียบๆ หากเชื่อมต่อใหม่โดยขอขอบเขตเพิ่มเติมหรือบทบาทที่กว้างขึ้น OpenClaw จะคงการอนุมัติเดิมไว้ตามเดิมและสร้างคำขออัปเกรดที่รอดำเนินการใหม่ ใช้ `openclaw devices list` เพื่อเปรียบเทียบการเข้าถึงที่ได้รับอนุมัติในปัจจุบันกับการเข้าถึงที่ขอใหม่ก่อนที่คุณจะอนุมัติ
-### การอนุมัติ Node อัตโนมัติด้วย trusted-CIDR แบบเลือกใช้ได้
+### การอนุมัติ Node อัตโนมัติแบบ trusted-CIDR ที่เป็นทางเลือก
-การจับคู่อุปกรณ์ยังคงเป็นแบบ manual โดยค่าเริ่มต้น สำหรับเครือข่าย Node ที่ควบคุมอย่างเข้มงวด คุณสามารถเลือกใช้การอนุมัติ Node ครั้งแรกอัตโนมัติด้วย CIDR ที่ระบุชัดเจนหรือ IP แบบตรงตัวได้:
+การจับคู่อุปกรณ์ยังคงเป็นแบบทำเองตามค่าเริ่มต้น สำหรับเครือข่าย Node ที่ควบคุมอย่างเข้มงวด
+คุณสามารถเลือกใช้การอนุมัติ Node ครั้งแรกอัตโนมัติด้วย CIDR หรือ IP แบบตรงตัวที่ระบุชัดเจน:
```json5
{
@@ -157,31 +181,35 @@ openclaw devices reject
}
```
-สิ่งนี้ใช้เฉพาะกับคำขอจับคู่ `role: node` ใหม่ที่ไม่มี scopes ที่ร้องขอ
-client แบบ operator, browser, UI ควบคุม และ WebChat ยังคงต้องได้รับการอนุมัติแบบ manual
-การเปลี่ยนแปลงบทบาท scope metadata และ public-key ยังคงต้องได้รับการอนุมัติแบบ manual
+สิ่งนี้ใช้เฉพาะกับคำขอจับคู่ `role: node` ใหม่ที่ไม่มี
+ขอบเขตที่ร้องขอ ไคลเอนต์ operator, เบราว์เซอร์, Control UI และ WebChat ยังต้อง
+ได้รับการอนุมัติด้วยตนเอง การเปลี่ยนแปลงบทบาท ขอบเขต เมตาดาตา และกุญแจสาธารณะยังต้อง
+ได้รับการอนุมัติด้วยตนเอง
-### การจัดเก็บสถานะการจับคู่ Node
+### ที่เก็บสถานะการจับคู่ Node
-จัดเก็บภายใต้ `~/.openclaw/devices/`:
+เก็บไว้ภายใต้ `~/.openclaw/devices/`:
-- `pending.json` (อายุสั้น คำขอที่รอดำเนินการจะหมดอายุ)
-- `paired.json` (อุปกรณ์ที่จับคู่แล้ว + tokens)
+- `pending.json` (อายุสั้น; คำขอที่รอดำเนินการจะหมดอายุ)
+- `paired.json` (อุปกรณ์ที่จับคู่แล้ว + โทเค็น)
### หมายเหตุ
-- API `node.pair.*` แบบ legacy (CLI: `openclaw nodes pending|approve|reject|remove|rename`) เป็นที่เก็บการจับคู่แยกต่างหากที่ Gateway เป็นเจ้าของ Node แบบ WS ยังคงต้องใช้การจับคู่อุปกรณ์
-- ระเบียนการจับคู่คือแหล่งความจริงถาวรสำหรับบทบาทที่ได้รับอนุมัติ token อุปกรณ์ที่ใช้งานอยู่ยังคงถูกจำกัดไว้ตามชุดบทบาทที่ได้รับอนุมัตินั้น รายการ token ที่หลุดอยู่นอกบทบาทที่ได้รับอนุมัติจะไม่สร้างการเข้าถึงใหม่
+- API เดิม `node.pair.*` (CLI: `openclaw nodes pending|approve|reject|remove|rename`) เป็น
+ ที่เก็บการจับคู่แยกต่างหากที่ Gateway เป็นเจ้าของ Node แบบ WS ยังต้องใช้การจับคู่อุปกรณ์
+- ระเบียนการจับคู่คือแหล่งความจริงที่คงทนสำหรับบทบาทที่ได้รับอนุมัติ โทเค็นอุปกรณ์
+ ที่ใช้งานอยู่ยังคงถูกจำกัดกับชุดบทบาทที่ได้รับอนุมัตินั้น รายการโทเค็นแปลกปลอม
+ นอกบทบาทที่ได้รับอนุมัติจะไม่สร้างการเข้าถึงใหม่
## เอกสารที่เกี่ยวข้อง
- โมเดลความปลอดภัย + prompt injection: [ความปลอดภัย](/th/gateway/security)
-- การอัปเดตอย่างปลอดภัย (รัน doctor): [การอัปเดต](/th/install/updating)
-- config ช่องทาง:
+- การอัปเดตอย่างปลอดภัย (เรียกใช้ doctor): [การอัปเดต](/th/install/updating)
+- ค่ากำหนดช่องทาง:
- Telegram: [Telegram](/th/channels/telegram)
- WhatsApp: [WhatsApp](/th/channels/whatsapp)
- Signal: [Signal](/th/channels/signal)
- BlueBubbles (iMessage): [BlueBubbles](/th/channels/bluebubbles)
- - iMessage (legacy): [iMessage](/th/channels/imessage)
+ - iMessage (แบบเดิม): [iMessage](/th/channels/imessage)
- Discord: [Discord](/th/channels/discord)
- Slack: [Slack](/th/channels/slack)
diff --git a/docs/th/channels/qqbot.md b/docs/th/channels/qqbot.md
index 279c85f83..c5d3b57fe 100644
--- a/docs/th/channels/qqbot.md
+++ b/docs/th/channels/qqbot.md
@@ -1,25 +1,25 @@
---
read_when:
- คุณต้องการเชื่อมต่อ OpenClaw กับ QQ
- - คุณต้องตั้งค่าข้อมูลประจำตัวของ QQ Bot
- - คุณต้องการการรองรับแชตกลุ่มหรือแชตส่วนตัวของ QQ Bot
+ - คุณต้องตั้งค่าข้อมูลรับรองของ QQ Bot
+ - คุณต้องการให้รองรับแชตกลุ่มหรือแชตส่วนตัวของ QQ Bot
summary: การตั้งค่า การกำหนดค่า และการใช้งาน QQ Bot
title: บอต QQ
x-i18n:
- generated_at: "2026-05-03T21:27:26Z"
+ generated_at: "2026-05-04T02:21:41Z"
model: gpt-5.5
provider: openai
- source_hash: 471c24110bf0ab8896d22f5bb5932ac4e03ff5169560c99ba6b9d1ca4025d9a8
+ source_hash: e17fa0da2f6939ed28cac5f13b3e37e6c63b87a10250ff213f7a86685a6141d6
source_path: channels/qqbot.md
workflow: 16
---
-QQ Bot เชื่อมต่อกับ OpenClaw ผ่าน QQ Bot API อย่างเป็นทางการ (WebSocket Gateway) Plugin
-รองรับแชตส่วนตัวแบบ C2C, ข้อความ @ ในกลุ่ม และข้อความช่องกิลด์ พร้อม
+QQ Bot เชื่อมต่อกับ OpenClaw ผ่าน QQ Bot API อย่างเป็นทางการ (Gateway แบบ WebSocket) Plugin
+รองรับแชตส่วนตัวแบบ C2C, @messages ในกลุ่ม และข้อความในช่องกิลด์ พร้อม
สื่อสมบูรณ์ (รูปภาพ, เสียง, วิดีโอ, ไฟล์)
สถานะ: Plugin ที่ดาวน์โหลดได้ รองรับข้อความส่วนตัว, แชตกลุ่ม, ช่องกิลด์ และ
-สื่อ ไม่รองรับรีแอ็กชันและเธรด
+สื่อ ไม่รองรับปฏิกิริยาและเธรด
## ติดตั้ง
@@ -31,13 +31,13 @@ openclaw plugins install @openclaw/qqbot
## ตั้งค่า
-1. ไปที่ [QQ Open Platform](https://q.qq.com/) แล้วสแกนคิวอาร์โค้ดด้วย
+1. ไปที่ [QQ Open Platform](https://q.qq.com/) แล้วสแกนรหัส QR ด้วย
QQ บนโทรศัพท์ของคุณเพื่อลงทะเบียน / เข้าสู่ระบบ
-2. คลิก **Create Bot** เพื่อสร้าง QQ bot ใหม่
-3. หา **AppID** และ **AppSecret** ในหน้าการตั้งค่าของ bot แล้วคัดลอกไว้
+2. คลิก **Create Bot** เพื่อสร้างบอต QQ ใหม่
+3. หา **AppID** และ **AppSecret** ในหน้าการตั้งค่าของบอต แล้วคัดลอกไว้
-> AppSecret จะไม่ถูกจัดเก็บเป็นข้อความธรรมดา — หากคุณออกจากหน้าโดยไม่ได้บันทึกไว้
-> คุณจะต้องสร้างค่าใหม่อีกครั้ง
+> AppSecret จะไม่ถูกจัดเก็บเป็นข้อความธรรมดา หากคุณออกจากหน้าโดยไม่บันทึก
+> คุณจะต้องสร้างใหม่อีกครั้ง
4. เพิ่มช่องทาง:
@@ -45,9 +45,9 @@ openclaw plugins install @openclaw/qqbot
openclaw channels add --channel qqbot --token "AppID:AppSecret"
```
-5. รีสตาร์ท Gateway
+5. รีสตาร์ต Gateway
-เส้นทางการตั้งค่าแบบโต้ตอบ:
+เส้นทางตั้งค่าแบบโต้ตอบ:
```bash
openclaw channels add
@@ -56,7 +56,7 @@ openclaw configure --section channels
## กำหนดค่า
-คอนฟิกขั้นต่ำ:
+ค่ากำหนดขั้นต่ำ:
```json5
{
@@ -89,7 +89,7 @@ AppSecret ที่อ้างอิงจากไฟล์:
}
```
-Env SecretRef AppSecret:
+AppSecret แบบ Env SecretRef:
```json5
{
@@ -105,16 +105,16 @@ Env SecretRef AppSecret:
หมายเหตุ:
-- การใช้ env เป็นค่าทดแทนใช้กับบัญชี QQ Bot เริ่มต้นเท่านั้น
-- `openclaw channels add --channel qqbot --token-file ...` ระบุเฉพาะ
- AppSecret; ต้องตั้งค่า AppID ไว้แล้วในคอนฟิกหรือ `QQBOT_APP_ID`
-- `clientSecret` ยังรับอินพุต SecretRef ได้ ไม่ใช่เฉพาะสตริงข้อความธรรมดา
-- สตริงมาร์กเกอร์เดิม `secretref:/...` ไม่ใช่ค่า `clientSecret` ที่ถูกต้อง;
- ให้ใช้อ็อบเจ็กต์ SecretRef แบบมีโครงสร้างตามตัวอย่างด้านบน
+- การสำรองด้วย env ใช้กับบัญชี QQ Bot เริ่มต้นเท่านั้น
+- `openclaw channels add --channel qqbot --token-file ...` ให้เฉพาะ
+ AppSecret เท่านั้น; ต้องตั้งค่า AppID ไว้แล้วใน config หรือ `QQBOT_APP_ID`
+- `clientSecret` ยังรับอินพุต SecretRef ได้ ไม่ใช่แค่สตริงข้อความธรรมดา
+- สตริงเครื่องหมาย `secretref:/...` แบบเดิมไม่ใช่ค่า `clientSecret` ที่ใช้ได้;
+ ให้ใช้ออบเจ็กต์ SecretRef แบบมีโครงสร้างเหมือนตัวอย่างด้านบน
### การตั้งค่าหลายบัญชี
-รัน QQ bots หลายตัวภายใต้อินสแตนซ์ OpenClaw เดียว:
+รันบอต QQ หลายตัวภายใต้อินสแตนซ์ OpenClaw เดียว:
```json5
{
@@ -135,10 +135,10 @@ Env SecretRef AppSecret:
}
```
-แต่ละบัญชีจะเปิดการเชื่อมต่อ WebSocket ของตัวเองและดูแล
-แคชโทเค็นที่เป็นอิสระ (แยกตาม `appId`)
+แต่ละบัญชีจะเปิดการเชื่อมต่อ WebSocket ของตัวเอง และดูแลแคช
+โทเค็นแยกต่างหาก (แยกด้วย `appId`)
-เพิ่ม bot ตัวที่สองผ่าน CLI:
+เพิ่มบอตตัวที่สองผ่าน CLI:
```bash
openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-of-bot-2"
@@ -146,8 +146,8 @@ openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-o
### แชตกลุ่ม
-การรองรับแชตกลุ่มของ QQ Bot ใช้ QQ group OpenIDs ไม่ใช่ชื่อที่แสดง เพิ่ม bot
-เข้าไปในกลุ่ม แล้วกล่าวถึง bot หรือตั้งค่าให้กลุ่มทำงานโดยไม่ต้องกล่าวถึง
+การรองรับแชตกลุ่มของ QQ Bot ใช้ OpenID ของกลุ่ม QQ ไม่ใช่ชื่อที่แสดง เพิ่มบอต
+เข้ากลุ่ม จากนั้นกล่าวถึงบอต หรือกำหนดค่ากลุ่มให้ทำงานโดยไม่ต้องกล่าวถึง
```json5
{
@@ -175,32 +175,32 @@ openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-o
```
`groups["*"]` ตั้งค่าเริ่มต้นสำหรับทุกกลุ่ม และรายการ
-`groups.GROUP_OPENID` ที่ระบุชัดเจนจะแทนที่ค่าเริ่มต้นเหล่านั้นสำหรับกลุ่มเดียว การตั้งค่า
+`groups.GROUP_OPENID` แบบเจาะจงจะแทนที่ค่าเริ่มต้นเหล่านั้นสำหรับหนึ่งกลุ่ม การตั้งค่า
กลุ่มประกอบด้วย:
-- `requireMention`: ต้องมี @mention ก่อนที่ bot จะตอบ ค่าเริ่มต้น: `true`
-- `ignoreOtherMentions`: ทิ้งข้อความที่กล่าวถึงคนอื่นแต่ไม่ได้กล่าวถึง bot
-- `historyLimit`: เก็บข้อความกลุ่มล่าสุดที่ไม่ได้กล่าวถึงเป็นบริบทสำหรับรอบถัดไปที่มีการกล่าวถึง ตั้งค่าเป็น `0` เพื่อปิดใช้
+- `requireMention`: กำหนดให้ต้องมี @mention ก่อนที่บอตจะตอบ ค่าเริ่มต้น: `true`
+- `ignoreOtherMentions`: ทิ้งข้อความที่กล่าวถึงคนอื่นแต่ไม่ได้กล่าวถึงบอต
+- `historyLimit`: เก็บข้อความกลุ่มล่าสุดที่ไม่ได้กล่าวถึงไว้เป็นบริบทสำหรับรอบถัดไปที่มีการกล่าวถึง ตั้งค่า `0` เพื่อปิดใช้
- `toolPolicy`: `full`, `restricted` หรือ `none` สำหรับเครื่องมือในขอบเขตกลุ่ม
-- `name`: ป้ายกำกับที่อ่านง่าย ใช้ในล็อกและบริบทกลุ่ม
-- `prompt`: พรอมป์พฤติกรรมรายกลุ่มที่ต่อท้ายบริบทของเอเจนต์
+- `name`: ป้ายชื่อที่อ่านง่าย ใช้ในบันทึกและบริบทกลุ่ม
+- `prompt`: พรอมป์พฤติกรรมรายกลุ่มที่ต่อท้ายในบริบทของเอเจนต์
-โหมดการเปิดใช้งานคือ `mention` และ `always` `requireMention: true` จะแมปเป็น
-`mention`; `requireMention: false` จะแมปเป็น `always` หากมีการแทนที่การเปิดใช้งาน
-ระดับเซสชัน ค่านั้นจะมีผลเหนือคอนฟิก
+โหมดการเปิดใช้งานคือ `mention` และ `always` โดย `requireMention: true` แมปไปที่
+`mention`; `requireMention: false` แมปไปที่ `always` หากมีการแทนที่การเปิดใช้งาน
+ระดับเซสชัน การตั้งค่านั้นจะมีผลเหนือ config
-คิวขาเข้าเป็นแบบต่อเพียร์ เพียร์กลุ่มจะมีขีดจำกัดคิวที่ใหญ่กว่า เก็บข้อความจากมนุษย์
-ไว้ก่อนข้อความสนทนาที่สร้างโดย bot เมื่อคิวเต็ม และรวมข้อความกลุ่มปกติที่เข้ามาเป็นชุด
-ให้เป็นรอบเดียวพร้อมแหล่งที่มา คำสั่งสแลชยังคงรันทีละรายการ
+คิวขาเข้าเป็นแบบต่อเพียร์ เพียร์กลุ่มจะได้ขนาดคิวสูงกว่า รักษาข้อความของมนุษย์
+ให้อยู่ก่อนข้อความพูดคุยที่เขียนโดยบอตเมื่อคิวเต็ม และรวมข้อความกลุ่มปกติ
+ที่เข้ามาเป็นชุดให้เป็นหนึ่งรอบพร้อมการระบุผู้ส่ง คำสั่งสแลชยังคงรันทีละคำสั่ง
### เสียง (STT / TTS)
-การรองรับ STT และ TTS ใช้การกำหนดค่าสองระดับพร้อมการถอยกลับตามลำดับความสำคัญ:
+STT และ TTS รองรับการกำหนดค่าสองระดับพร้อมการสำรองตามลำดับความสำคัญ:
-| การตั้งค่า | เฉพาะ Plugin | ค่าทดแทนของเฟรมเวิร์ก |
-| ------- | -------------------------------------------------------- | ----------------------------- |
-| STT | `channels.qqbot.stt` | `tools.media.audio.models[0]` |
-| TTS | `channels.qqbot.tts`, `channels.qqbot.accounts..tts` | `messages.tts` |
+| การตั้งค่า | เฉพาะ Plugin | ค่าสำรองของเฟรมเวิร์ก |
+| ---------- | -------------------------------------------------------- | ----------------------------- |
+| STT | `channels.qqbot.stt` | `tools.media.audio.models[0]` |
+| TTS | `channels.qqbot.tts`, `channels.qqbot.accounts..tts` | `messages.tts` |
```json5
{
@@ -216,7 +216,7 @@ openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-o
voice: "your-voice",
},
accounts: {
- qq-main: {
+ "qq-main": {
tts: {
providers: {
openai: { voice: "shimmer" },
@@ -229,16 +229,15 @@ openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-o
}
```
-ตั้งค่า `enabled: false` ที่รายการใดก็ได้เพื่อปิดใช้
-การแทนที่ TTS ระดับบัญชีใช้รูปแบบเดียวกับ `messages.tts` และ deep-merge
-ทับคอนฟิก TTS ระดับช่องทาง/ส่วนกลาง
+ตั้งค่า `enabled: false` ที่รายการใดรายการหนึ่งเพื่อปิดใช้
+การแทนที่ TTS ระดับบัญชีใช้รูปทรงเดียวกับ `messages.tts` และทำ deep-merge
+ทับ config TTS ระดับช่องทาง/ทั่วโลก
-ไฟล์แนบเสียงขาเข้าของ QQ จะแสดงให้เอเจนต์เห็นเป็นเมตาดาต้าสื่อเสียง ขณะเดียวกัน
-ก็กันไฟล์เสียงดิบออกจาก `MediaPaths` ทั่วไป การตอบกลับเป็นข้อความธรรมดา
-`[[audio_as_voice]]` จะสังเคราะห์ TTS และส่งข้อความเสียง QQ แบบเนทีฟเมื่อมีการ
-กำหนดค่า TTS
+ไฟล์แนบเสียงขาเข้าของ QQ จะถูกเปิดเผยต่อเอเจนต์เป็นเมตาดาทาสื่อเสียง ในขณะที่
+กันไฟล์เสียงดิบออกจาก `MediaPaths` ทั่วไป การตอบกลับข้อความธรรมดา `[[audio_as_voice]]`
+จะสังเคราะห์ TTS และส่งข้อความเสียง QQ แบบเนทีฟเมื่อกำหนดค่า TTS ไว้
-ยังสามารถปรับแต่งพฤติกรรมการอัปโหลด/แปลงรหัสเสียงขาออกได้ด้วย
+สามารถปรับพฤติกรรมการอัปโหลด/แปลงรหัสเสียงขาออกได้ด้วย
`channels.qqbot.audioFormatPolicy`:
- `sttDirectFormats`
@@ -247,67 +246,67 @@ openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-o
## รูปแบบเป้าหมาย
-| รูปแบบ | คำอธิบาย |
-| -------------------------- | ------------------ |
+| รูปแบบ | คำอธิบาย |
+| -------------------------- | ---------------- |
| `qqbot:c2c:OPENID` | แชตส่วนตัว (C2C) |
| `qqbot:group:GROUP_OPENID` | แชตกลุ่ม |
-| `qqbot:channel:CHANNEL_ID` | ช่องกิลด์ |
+| `qqbot:channel:CHANNEL_ID` | ช่องกิลด์ |
-> bot แต่ละตัวมีชุด OpenIDs ของผู้ใช้ของตัวเอง OpenID ที่ได้รับโดย Bot A **ไม่สามารถ**
+> แต่ละบอตมีชุด OpenID ของผู้ใช้เป็นของตัวเอง OpenID ที่ได้รับโดย Bot A **ไม่สามารถ**
> ใช้ส่งข้อความผ่าน Bot B ได้
## คำสั่งสแลช
คำสั่งในตัวที่ถูกดักก่อนคิว AI:
-| คำสั่ง | คำอธิบาย |
-| -------------- | -------------------------------------------------------------------------------------------------------- |
-| `/bot-ping` | ทดสอบเวลาแฝง |
-| `/bot-version` | แสดงเวอร์ชันเฟรมเวิร์ก OpenClaw |
-| `/bot-help` | แสดงรายการคำสั่งทั้งหมด |
-| `/bot-me` | แสดง QQ user ID (openid) ของผู้ส่ง สำหรับการตั้งค่า `allowFrom`/`groupAllowFrom` |
-| `/bot-upgrade` | แสดงลิงก์คู่มืออัปเกรด QQBot |
-| `/bot-logs` | ส่งออกล็อก Gateway ล่าสุดเป็นไฟล์ |
-| `/bot-approve` | อนุมัติการดำเนินการ QQ Bot ที่รอดำเนินการ (เช่น ยืนยันการอัปโหลดแบบ C2C หรือกลุ่ม) ผ่านโฟลว์เนทีฟ |
+| คำสั่ง | คำอธิบาย |
+| -------------- | ------------------------------------------------------------------------------------------------------ |
+| `/bot-ping` | ทดสอบเวลาแฝง |
+| `/bot-version` | แสดงเวอร์ชันเฟรมเวิร์ก OpenClaw |
+| `/bot-help` | แสดงรายการคำสั่งทั้งหมด |
+| `/bot-me` | แสดง ID ผู้ใช้ QQ ของผู้ส่ง (openid) สำหรับตั้งค่า `allowFrom`/`groupAllowFrom` |
+| `/bot-upgrade` | แสดงลิงก์คู่มืออัปเกรด QQBot |
+| `/bot-logs` | ส่งออกบันทึก Gateway ล่าสุดเป็นไฟล์ |
+| `/bot-approve` | อนุมัติการดำเนินการ QQ Bot ที่รอดำเนินการ (เช่น การยืนยันการอัปโหลด C2C หรือกลุ่ม) ผ่านโฟลว์เนทีฟ |
ต่อท้าย `?` กับคำสั่งใดก็ได้เพื่อดูวิธีใช้ (เช่น `/bot-upgrade ?`)
-คำสั่งแอดมิน (`/bot-me`, `/bot-upgrade`, `/bot-logs`, `/bot-clear-storage`, `/bot-streaming`, `/bot-approve`) ใช้ได้เฉพาะข้อความส่วนตัวและต้องมี openid ของผู้ส่งอยู่ในรายการ `allowFrom` แบบระบุชัดเจนที่ไม่ใช่ไวลด์การ์ด ไวลด์การ์ด `allowFrom: ["*"]` อนุญาตให้แชตได้ แต่ไม่ให้สิทธิ์เข้าถึงคำสั่งแอดมิน ข้อความกลุ่มจะจับคู่กับ `groupAllowFrom` ก่อน แล้วจึงถอยกลับไปที่ `allowFrom` การรันคำสั่งแอดมินในกลุ่มจะส่งคำแนะนำกลับมาแทนที่จะทิ้งไปเงียบ ๆ
+คำสั่งผู้ดูแล (`/bot-me`, `/bot-upgrade`, `/bot-logs`, `/bot-clear-storage`, `/bot-streaming`, `/bot-approve`) ใช้ได้เฉพาะข้อความส่วนตัว และต้องมี openid ของผู้ส่งในรายการ `allowFrom` แบบไม่ใช้ไวลด์การ์ดที่ระบุไว้อย่างชัดเจน ไวลด์การ์ด `allowFrom: ["*"]` อนุญาตให้แชตได้ แต่ไม่ได้ให้สิทธิ์เข้าถึงคำสั่งผู้ดูแล ข้อความกลุ่มจะเทียบกับ `groupAllowFrom` ก่อน แล้วจึงย้อนกลับไปใช้ `allowFrom` การรันคำสั่งผู้ดูแลในกลุ่มจะส่งคำแนะนำกลับแทนที่จะทิ้งเงียบๆ
## สถาปัตยกรรมเอนจิน
-QQ Bot มาพร้อมเอนจินแบบครบในตัวภายใน Plugin:
+QQ Bot มาพร้อมเอนจินที่สมบูรณ์ในตัวภายใน Plugin:
-- แต่ละบัญชีเป็นเจ้าของสแต็กทรัพยากรที่แยกจากกัน (การเชื่อมต่อ WebSocket, ไคลเอนต์ API, แคชโทเค็น, รากที่เก็บสื่อ) โดยอิงตาม `appId` บัญชีจะไม่ใช้สถานะขาเข้า/ขาออกร่วมกัน
-- ตัวบันทึกหลายบัญชีจะติดแท็กบรรทัดล็อกด้วยบัญชีเจ้าของ เพื่อให้การวินิจฉัยแยกกันได้เมื่อคุณรัน bot หลายตัวภายใต้ Gateway เดียว
-- เส้นทางขาเข้า, ขาออก และบริดจ์ Gateway ใช้รากเพย์โหลดสื่อเดียวกันภายใต้ `~/.openclaw/media` ดังนั้นการอัปโหลด, ดาวน์โหลด และแคชแปลงรหัสจะอยู่ในไดเรกทอรีที่มีการป้องกันเดียว แทนที่จะเป็นโครงสร้างแยกตามซับซิสเต็ม
-- การส่งสื่อสมบูรณ์ใช้เส้นทาง `sendMedia` เดียวสำหรับเป้าหมาย C2C และกลุ่ม ไฟล์ในเครื่องและบัฟเฟอร์ที่มีขนาดเกินเกณฑ์ไฟล์ใหญ่จะใช้เอนด์พอยต์อัปโหลดแบบแบ่งส่วนของ QQ ส่วนเพย์โหลดที่เล็กกว่าจะใช้ API สื่อแบบครั้งเดียว
-- สามารถสำรองและกู้คืนข้อมูลประจำตัวเป็นส่วนหนึ่งของสแนปช็อตข้อมูลประจำตัวมาตรฐานของ OpenClaw ได้; เอนจินจะผูกสแต็กทรัพยากรของแต่ละบัญชีกลับอีกครั้งเมื่อกู้คืน โดยไม่ต้องจับคู่คิวอาร์โค้ดใหม่
+- แต่ละบัญชีเป็นเจ้าของสแต็กทรัพยากรที่แยกกัน (การเชื่อมต่อ WebSocket, ไคลเอนต์ API, แคชโทเค็น, รากที่เก็บสื่อ) โดยใช้ `appId` เป็นคีย์ บัญชีจะไม่แชร์สถานะขาเข้า/ขาออกกัน
+- ตัวบันทึกหลายบัญชีจะแท็กบรรทัดบันทึกด้วยบัญชีที่เป็นเจ้าของ เพื่อให้การวินิจฉัยแยกจากกันได้เมื่อคุณรันบอตหลายตัวภายใต้ Gateway เดียว
+- เส้นทางขาเข้า, ขาออก และบริดจ์ Gateway ใช้รากเพย์โหลดสื่อเดียวกันภายใต้ `~/.openclaw/media` ดังนั้นการอัปโหลด, ดาวน์โหลด และแคชการแปลงรหัสจะอยู่ภายใต้ไดเรกทอรีที่มีการป้องกันเดียว แทนที่จะเป็นโครงสร้างแยกตามระบบย่อย
+- การส่งสื่อสมบูรณ์ผ่านเส้นทาง `sendMedia` เดียวสำหรับเป้าหมาย C2C และกลุ่ม ไฟล์ในเครื่องและบัฟเฟอร์ที่ใหญ่กว่าเกณฑ์ไฟล์ขนาดใหญ่จะใช้ endpoint อัปโหลดแบบแบ่งชิ้นของ QQ ขณะที่เพย์โหลดขนาดเล็กใช้ API สื่อแบบครั้งเดียว
+- สามารถสำรองและกู้คืนข้อมูลประจำตัวเป็นส่วนหนึ่งของสแนปช็อตข้อมูลประจำตัวมาตรฐานของ OpenClaw ได้ เอนจินจะแนบสแต็กทรัพยากรของแต่ละบัญชีกลับเข้าไปเมื่อกู้คืน โดยไม่ต้องจับคู่รหัส QR ใหม่
-## การเริ่มใช้งานด้วยคิวอาร์โค้ด
+## การเริ่มต้นใช้งานด้วยรหัส QR
-เป็นทางเลือกแทนการวาง `AppID:AppSecret` ด้วยตนเอง เอนจินรองรับโฟลว์การเริ่มใช้งานด้วยคิวอาร์โค้ดสำหรับเชื่อม QQ Bot เข้ากับ OpenClaw:
+นอกเหนือจากการวาง `AppID:AppSecret` ด้วยตนเอง เอนจินยังรองรับโฟลว์เริ่มต้นใช้งานด้วยรหัส QR สำหรับเชื่อมโยง QQ Bot กับ OpenClaw:
-1. รันเส้นทางการตั้งค่า QQ Bot (เช่น `openclaw channels add --channel qqbot`) แล้วเลือกโฟลว์คิวอาร์โค้ดเมื่อระบบถาม
-2. สแกนคิวอาร์โค้ดที่สร้างขึ้นด้วยแอปโทรศัพท์ที่ผูกกับ QQ Bot เป้าหมาย
-3. อนุมัติการจับคู่บนโทรศัพท์ OpenClaw จะบันทึกข้อมูลประจำตัวที่ส่งกลับลงใน `credentials/` ภายใต้ขอบเขตบัญชีที่ถูกต้อง
+1. รันเส้นทางตั้งค่า QQ Bot (เช่น `openclaw channels add --channel qqbot`) แล้วเลือกโฟลว์รหัส QR เมื่อระบบถาม
+2. สแกนรหัส QR ที่สร้างขึ้นด้วยแอปบนโทรศัพท์ที่ผูกกับ QQ Bot เป้าหมาย
+3. อนุมัติการจับคู่บนโทรศัพท์ OpenClaw จะคงข้อมูลประจำตัวที่ส่งกลับไว้ใน `credentials/` ภายใต้ขอบเขตบัญชีที่ถูกต้อง
-พรอมป์การอนุมัติที่สร้างโดย bot เอง (เช่น โฟลว์ "allow this action?" ที่เปิดเผยโดย QQ Bot API) จะแสดงเป็นพรอมป์ OpenClaw แบบเนทีฟที่คุณสามารถยอมรับด้วย `/bot-approve` แทนการตอบกลับผ่านไคลเอนต์ QQ ดิบ
+พรอมป์อนุมัติที่บอตสร้างขึ้นเอง (เช่น โฟลว์ "อนุญาตการดำเนินการนี้หรือไม่?" ที่เปิดเผยโดย QQ Bot API) จะแสดงเป็นพรอมป์ OpenClaw แบบเนทีฟ ซึ่งคุณสามารถยอมรับด้วย `/bot-approve` แทนการตอบผ่านไคลเอนต์ QQ ดิบ
## การแก้ไขปัญหา
-- **Bot ตอบว่า "gone to Mars":** ยังไม่ได้กำหนดค่าข้อมูลประจำตัว หรือ Gateway ยังไม่ได้เริ่มทำงาน
+- **บอตตอบว่า "gone to Mars":** ยังไม่ได้กำหนดค่าข้อมูลประจำตัว หรือยังไม่ได้เริ่ม Gateway
- **ไม่มีข้อความขาเข้า:** ตรวจสอบว่า `appId` และ `clientSecret` ถูกต้อง และ
- bot เปิดใช้งานอยู่บน QQ Open Platform
-- **การตอบกลับตัวเองซ้ำ:** OpenClaw บันทึกดัชนีอ้างอิงขาออกของ QQ เป็น
- ข้อความที่ bot เป็นผู้สร้าง และละเว้นอีเวนต์ขาเข้าที่ `msgIdx` ปัจจุบันตรงกับ
- บัญชี bot เดียวกันนั้น วิธีนี้ป้องกันลูปสะท้อนจากแพลตฟอร์ม ขณะเดียวกันยังเปิดให้ผู้ใช้
- อ้างอิงหรือตอบกลับข้อความ bot ก่อนหน้าได้
+ เปิดใช้บอตบน QQ Open Platform แล้ว
+- **ตอบตัวเองซ้ำ:** OpenClaw บันทึกดัชนีอ้างอิงขาออกของ QQ เป็น
+ ข้อความที่เขียนโดยบอต และละเว้นเหตุการณ์ขาเข้าที่ `msgIdx` ปัจจุบันตรงกับ
+ บัญชีบอตเดียวกัน วิธีนี้ป้องกันลูป echo ของแพลตฟอร์ม ขณะยังอนุญาตให้ผู้ใช้
+ อ้างอิงหรือตอบกลับข้อความก่อนหน้าของบอตได้
- **ตั้งค่าด้วย `--token-file` แล้วยังแสดงว่ายังไม่ได้กำหนดค่า:** `--token-file` ตั้งค่าเฉพาะ
- AppSecret เท่านั้น คุณยังต้องมี `appId` ในคอนฟิกหรือ `QQBOT_APP_ID`
-- **ข้อความเชิงรุกไม่มาถึง:** QQ อาจดักข้อความที่ bot เป็นฝ่ายเริ่มส่ง หาก
- ผู้ใช้ไม่ได้โต้ตอบเมื่อไม่นานมานี้
-- **เสียงไม่ถูกถอดความ:** ตรวจสอบว่ามีการกำหนดค่า STT และเข้าถึง provider ได้
+ AppSecret เท่านั้น คุณยังต้องมี `appId` ใน config หรือ `QQBOT_APP_ID`
+- **ข้อความเชิงรุกไม่มาถึง:** QQ อาจดักข้อความที่บอตเป็นฝ่ายเริ่ม หาก
+ ผู้ใช้ไม่ได้โต้ตอบเมื่อเร็วๆ นี้
+- **เสียงไม่ถูกถอดความ:** ตรวจสอบว่ากำหนดค่า STT แล้ว และเข้าถึง provider ได้
## ที่เกี่ยวข้อง
diff --git a/docs/th/channels/slack.md b/docs/th/channels/slack.md
index 2ade24bc0..7cdc81742 100644
--- a/docs/th/channels/slack.md
+++ b/docs/th/channels/slack.md
@@ -1,47 +1,47 @@
---
read_when:
- - การตั้งค่า Slack หรือการแก้ไขปัญหาโหมดซ็อกเก็ต/HTTP ของ Slack
-summary: การตั้งค่า Slack และพฤติกรรมขณะทำงาน (โหมด Socket + URL สำหรับคำขอ HTTP)
+ - การตั้งค่า Slack หรือการดีบักโหมดซ็อกเก็ต/HTTP ของ Slack
+summary: การตั้งค่า Slack และพฤติกรรมระหว่างการทำงาน (โหมดซ็อกเก็ต + URL คำขอ HTTP)
title: Slack
x-i18n:
- generated_at: "2026-05-03T21:27:21Z"
+ generated_at: "2026-05-04T02:22:24Z"
model: gpt-5.5
provider: openai
- source_hash: d902fbbad23cee9b3f0ab7d240845b7b229e2d2507c5ea1d1a0fa3baa915d80a
+ source_hash: 2be45f03511a64373b1f4316c59800eeeef8baccb4c00454b49999258b2e546b
source_path: channels/slack.md
workflow: 16
---
-พร้อมใช้งานจริงสำหรับ DM และช่องทางต่างๆ ผ่านการผสานรวมแอป Slack โหมดเริ่มต้นคือ Socket Mode; รองรับ HTTP Request URLs ด้วย
+พร้อมใช้งานระดับโปรดักชันสำหรับ DM และช่องผ่านการผสานรวมแอป Slack โหมดเริ่มต้นคือ Socket Mode และรองรับ HTTP Request URLs ด้วย
-
- Slack DM ใช้โหมดการจับคู่เป็นค่าเริ่มต้น
+
+ Slack DM ใช้โหมดจับคู่เป็นค่าเริ่มต้น
-
- พฤติกรรมคำสั่งแบบเนทีฟและแค็ตตาล็อกคำสั่ง
+
+ พฤติกรรมคำสั่งแบบเนทีฟและแคตตาล็อกคำสั่ง
-
- การวินิจฉัยข้ามช่องทางและเพลย์บุ๊กการซ่อมแซม
+
+ การวินิจฉัยข้ามช่องและคู่มือการซ่อมแซม
-## การตั้งค่าอย่างรวดเร็ว
+## การตั้งค่าแบบรวดเร็ว
-
+
-
+
ในการตั้งค่าแอป Slack ให้กดปุ่ม **[Create New App](https://api.slack.com/apps/new)**:
- - เลือก **from a manifest** และเลือก workspace สำหรับแอปของคุณ
- - วาง [manifest ตัวอย่าง](#manifest-and-scope-checklist) จากด้านล่าง แล้วดำเนินการสร้างต่อ
- - สร้าง **App-Level Token** (`xapp-...`) พร้อม `connections:write`
- - ติดตั้งแอปและคัดลอก **Bot Token** (`xoxb-...`) ที่แสดงอยู่
+ - เลือก **from a manifest** และเลือกเวิร์กสเปซสำหรับแอปของคุณ
+ - วาง [แมนิเฟสต์ตัวอย่าง](#manifest-and-scope-checklist) ด้านล่าง แล้วดำเนินการต่อเพื่อสร้าง
+ - สร้าง **App-Level Token** (`xapp-...`) ที่มี `connections:write`
+ - ติดตั้งแอปและคัดลอก **Bot Token** (`xoxb-...`) ที่แสดง
-
+
การตั้งค่า SecretRef ที่แนะนำ:
@@ -64,7 +64,7 @@ openclaw config patch --file ./slack.socket.patch.json5 --dry-run
openclaw config patch --file ./slack.socket.patch.json5
```
- Env fallback (บัญชีเริ่มต้นเท่านั้น):
+ ทางเลือกสำรอง Env (เฉพาะบัญชีเริ่มต้น):
```bash
SLACK_APP_TOKEN=xapp-...
@@ -73,7 +73,7 @@ SLACK_BOT_TOKEN=xoxb-...
-
+
```bash
openclaw gateway
@@ -86,17 +86,17 @@ openclaw gateway
-
+
ในการตั้งค่าแอป Slack ให้กดปุ่ม **[Create New App](https://api.slack.com/apps/new)**:
- - เลือก **from a manifest** และเลือก workspace สำหรับแอปของคุณ
- - วาง [manifest ตัวอย่าง](#manifest-and-scope-checklist) และอัปเดต URL ก่อนสร้าง
- - บันทึก **Signing Secret** สำหรับการยืนยันคำขอ
- - ติดตั้งแอปและคัดลอก **Bot Token** (`xoxb-...`) ที่แสดงอยู่
+ - เลือก **from a manifest** และเลือกเวิร์กสเปซสำหรับแอปของคุณ
+ - วาง [แมนิเฟสต์ตัวอย่าง](#manifest-and-scope-checklist) และอัปเดต URL ก่อนสร้าง
+ - บันทึก **Signing Secret** สำหรับการตรวจสอบคำขอ
+ - ติดตั้งแอปและคัดลอก **Bot Token** (`xoxb-...`) ที่แสดง
-
+
การตั้งค่า SecretRef ที่แนะนำ:
@@ -121,14 +121,14 @@ openclaw config patch --file ./slack.http.patch.json5
```
- ใช้เส้นทาง Webhook ที่ไม่ซ้ำกันสำหรับ HTTP หลายบัญชี
+ ใช้เส้นทาง Webhook ที่ไม่ซ้ำกันสำหรับ HTTP แบบหลายบัญชี
- กำหนด `webhookPath` ที่แตกต่างกันให้แต่ละบัญชี (ค่าเริ่มต้น `/slack/events`) เพื่อไม่ให้การลงทะเบียนชนกัน
+ กำหนด `webhookPath` แยกกันให้แต่ละบัญชี (ค่าเริ่มต้น `/slack/events`) เพื่อไม่ให้การลงทะเบียนชนกัน
-
+
```bash
openclaw gateway
@@ -140,9 +140,9 @@ openclaw gateway
-## การปรับแต่งการขนส่งของ Socket Mode
+## การปรับแต่งการส่งผ่าน Socket Mode
-OpenClaw ตั้งค่าเวลารอ pong ของไคลเอนต์ Slack SDK เป็น 15 วินาทีตามค่าเริ่มต้นสำหรับ Socket Mode ให้ override การตั้งค่าการขนส่งเฉพาะเมื่อคุณต้องปรับแต่งตาม workspace หรือ host เท่านั้น:
+OpenClaw ตั้งค่าระยะหมดเวลารอ pong ของไคลเอนต์ Slack SDK เป็น 15 วินาทีโดยค่าเริ่มต้นสำหรับ Socket Mode ให้แทนที่การตั้งค่าการส่งผ่านเฉพาะเมื่อคุณต้องปรับแต่งตามเวิร์กสเปซหรือโฮสต์เท่านั้น:
```json5
{
@@ -159,13 +159,13 @@ OpenClaw ตั้งค่าเวลารอ pong ของไคลเอ
}
```
-ใช้สิ่งนี้เฉพาะกับ workspace ของ Socket Mode ที่บันทึก timeout ของ Slack websocket pong/server-ping หรือรันบน host ที่ทราบว่ามี event-loop starvation `clientPingTimeout` คือเวลารอ pong หลังจาก SDK ส่ง client ping; `serverPingTimeout` คือเวลารอ ping จากเซิร์ฟเวอร์ Slack ข้อความและเหตุการณ์ของแอปยังคงเป็นสถานะแอปพลิเคชัน ไม่ใช่สัญญาณความมีชีวิตของการขนส่ง
+ใช้ตัวเลือกนี้เฉพาะกับเวิร์กสเปซ Socket Mode ที่บันทึก timeout ของ Slack websocket pong/server-ping หรือทำงานบนโฮสต์ที่ทราบว่ามีภาวะ event-loop starvation `clientPingTimeout` คือเวลารอ pong หลังจาก SDK ส่ง client ping; `serverPingTimeout` คือเวลารอ ping จากเซิร์ฟเวอร์ Slack ข้อความและอีเวนต์ของแอปยังคงเป็นสถานะแอปพลิเคชัน ไม่ใช่สัญญาณความพร้อมใช้งานของการส่งผ่าน
-## เช็กลิสต์ manifest และ scope
+## รายการตรวจสอบแมนิเฟสต์และขอบเขต
-manifest พื้นฐานของแอป Slack เหมือนกันสำหรับ Socket Mode และ HTTP Request URLs ต่างกันเฉพาะบล็อก `settings` (และ `url` ของคำสั่ง slash)
+แมนิเฟสต์แอป Slack พื้นฐานเหมือนกันสำหรับ Socket Mode และ HTTP Request URLs มีเพียงบล็อก `settings` (และ `url` ของ slash command) ที่แตกต่างกัน
-manifest พื้นฐาน (ค่าเริ่มต้นของ Socket Mode):
+แมนิเฟสต์พื้นฐาน (ค่าเริ่มต้น Socket Mode):
```json
{
@@ -240,7 +240,7 @@ manifest พื้นฐาน (ค่าเริ่มต้นของ Socke
}
```
-สำหรับ **โหมด HTTP Request URLs** ให้แทนที่ `settings` ด้วยตัวแปร HTTP และเพิ่ม `url` ให้แต่ละคำสั่ง slash ต้องมี URL สาธารณะ:
+สำหรับ **โหมด HTTP Request URLs** ให้แทนที่ `settings` ด้วยตัวแปร HTTP และเพิ่ม `url` ให้แต่ละ slash command ต้องมี URL สาธารณะ:
```json
{
@@ -258,7 +258,19 @@ manifest พื้นฐาน (ค่าเริ่มต้นของ Socke
"event_subscriptions": {
"request_url": "https://gateway-host.example.com/slack/events",
"bot_events": [
- /* same as Socket Mode */
+ "app_home_opened",
+ "app_mention",
+ "channel_rename",
+ "member_joined_channel",
+ "member_left_channel",
+ "message.channels",
+ "message.groups",
+ "message.im",
+ "message.mpim",
+ "pin_added",
+ "pin_removed",
+ "reaction_added",
+ "reaction_removed"
]
},
"interactivity": {
@@ -270,141 +282,143 @@ manifest พื้นฐาน (ค่าเริ่มต้นของ Socke
}
```
-### การตั้งค่า manifest เพิ่มเติม
+### การตั้งค่าแมนิเฟสต์เพิ่มเติม
-แสดงฟีเจอร์ต่างๆ ที่ขยายจากค่าเริ่มต้นด้านบน
+แสดงฟีเจอร์ต่าง ๆ ที่ขยายค่าเริ่มต้นด้านบน
-manifest เริ่มต้นเปิดใช้แท็บ **Home** ของ Slack App Home และสมัครรับ `app_home_opened` เมื่อสมาชิก workspace เปิดแท็บ Home OpenClaw จะเผยแพร่มุมมอง Home เริ่มต้นที่ปลอดภัยด้วย `views.publish`; ไม่มีการรวม payload การสนทนาหรือการกำหนดค่าส่วนตัว แท็บ **Messages** ยังคงเปิดใช้สำหรับ Slack DM
+แมนิเฟสต์เริ่มต้นเปิดใช้แท็บ **Home** ของ Slack App Home และสมัครรับ `app_home_opened` เมื่อสมาชิกเวิร์กสเปซเปิดแท็บ Home, OpenClaw จะเผยแพร่มุมมอง Home เริ่มต้นที่ปลอดภัยด้วย `views.publish`; ไม่มีเพย์โหลดการสนทนาหรือการกำหนดค่าส่วนตัวรวมอยู่ แท็บ **Messages** ยังคงเปิดใช้งานสำหรับ Slack DM
-
+
- สามารถใช้ [คำสั่ง slash แบบเนทีฟ](#commands-and-slash-behavior) หลายคำสั่งแทนคำสั่งเดียวที่กำหนดค่าพร้อมรายละเอียดปลีกย่อยได้:
+ สามารถใช้ [slash command แบบเนทีฟ](#commands-and-slash-behavior) หลายรายการแทนคำสั่งที่กำหนดค่าไว้รายการเดียวได้ โดยมีรายละเอียดดังนี้:
- ใช้ `/agentstatus` แทน `/status` เพราะคำสั่ง `/status` ถูกสงวนไว้
- - เปิดใช้คำสั่ง slash ได้พร้อมกันไม่เกิน 25 คำสั่ง
+ - ทำให้มี slash command ใช้งานได้พร้อมกันไม่เกิน 25 รายการ
- แทนที่ส่วน `features.slash_commands` ที่มีอยู่ด้วย subset ของ [คำสั่งที่พร้อมใช้งาน](/th/tools/slash-commands#command-list):
+ แทนที่ส่วน `features.slash_commands` เดิมของคุณด้วยชุดย่อยของ [คำสั่งที่มีให้ใช้](/th/tools/slash-commands#command-list):
-
+
```json
- "slash_commands": [
- {
- "command": "/new",
- "description": "Start a new session",
- "usage_hint": "[model]"
- },
- {
- "command": "/reset",
- "description": "Reset the current session"
- },
- {
- "command": "/compact",
- "description": "Compact the session context",
- "usage_hint": "[instructions]"
- },
- {
- "command": "/stop",
- "description": "Stop the current run"
- },
- {
- "command": "/session",
- "description": "Manage thread-binding expiry",
- "usage_hint": "idle or max-age "
- },
- {
- "command": "/think",
- "description": "Set the thinking level",
- "usage_hint": ""
- },
- {
- "command": "/verbose",
- "description": "Toggle verbose output",
- "usage_hint": "on|off|full"
- },
- {
- "command": "/fast",
- "description": "Show or set fast mode",
- "usage_hint": "[status|on|off]"
- },
- {
- "command": "/reasoning",
- "description": "Toggle reasoning visibility",
- "usage_hint": "[on|off|stream]"
- },
- {
- "command": "/elevated",
- "description": "Toggle elevated mode",
- "usage_hint": "[on|off|ask|full]"
- },
- {
- "command": "/exec",
- "description": "Show or set exec defaults",
- "usage_hint": "host= security= ask= node="
- },
- {
- "command": "/model",
- "description": "Show or set the model",
- "usage_hint": "[name|#|status]"
- },
- {
- "command": "/models",
- "description": "List providers/models",
- "usage_hint": "[provider] [page] [limit=|size=|all]"
- },
- {
- "command": "/help",
- "description": "Show the short help summary"
- },
- {
- "command": "/commands",
- "description": "Show the generated command catalog"
- },
- {
- "command": "/tools",
- "description": "Show what the current agent can use right now",
- "usage_hint": "[compact|verbose]"
- },
- {
- "command": "/agentstatus",
- "description": "Show runtime status, including provider usage/quota when available"
- },
- {
- "command": "/tasks",
- "description": "List active/recent background tasks for the current session"
- },
- {
- "command": "/context",
- "description": "Explain how context is assembled",
- "usage_hint": "[list|detail|json]"
- },
- {
- "command": "/whoami",
- "description": "Show your sender identity"
- },
- {
- "command": "/skill",
- "description": "Run a skill by name",
- "usage_hint": " [input]"
- },
- {
- "command": "/btw",
- "description": "Ask a side question without changing session context",
- "usage_hint": ""
- },
- {
- "command": "/side",
- "description": "Ask a side question without changing session context",
- "usage_hint": ""
- },
- {
- "command": "/usage",
- "description": "Control the usage footer or show cost summary",
- "usage_hint": "off|tokens|full|cost"
- }
- ]
+{
+ "slash_commands": [
+ {
+ "command": "/new",
+ "description": "Start a new session",
+ "usage_hint": "[model]"
+ },
+ {
+ "command": "/reset",
+ "description": "Reset the current session"
+ },
+ {
+ "command": "/compact",
+ "description": "Compact the session context",
+ "usage_hint": "[instructions]"
+ },
+ {
+ "command": "/stop",
+ "description": "Stop the current run"
+ },
+ {
+ "command": "/session",
+ "description": "Manage thread-binding expiry",
+ "usage_hint": "idle or max-age "
+ },
+ {
+ "command": "/think",
+ "description": "Set the thinking level",
+ "usage_hint": ""
+ },
+ {
+ "command": "/verbose",
+ "description": "Toggle verbose output",
+ "usage_hint": "on|off|full"
+ },
+ {
+ "command": "/fast",
+ "description": "Show or set fast mode",
+ "usage_hint": "[status|on|off]"
+ },
+ {
+ "command": "/reasoning",
+ "description": "Toggle reasoning visibility",
+ "usage_hint": "[on|off|stream]"
+ },
+ {
+ "command": "/elevated",
+ "description": "Toggle elevated mode",
+ "usage_hint": "[on|off|ask|full]"
+ },
+ {
+ "command": "/exec",
+ "description": "Show or set exec defaults",
+ "usage_hint": "host= security= ask= node="
+ },
+ {
+ "command": "/model",
+ "description": "Show or set the model",
+ "usage_hint": "[name|#|status]"
+ },
+ {
+ "command": "/models",
+ "description": "List providers/models",
+ "usage_hint": "[provider] [page] [limit=|size=|all]"
+ },
+ {
+ "command": "/help",
+ "description": "Show the short help summary"
+ },
+ {
+ "command": "/commands",
+ "description": "Show the generated command catalog"
+ },
+ {
+ "command": "/tools",
+ "description": "Show what the current agent can use right now",
+ "usage_hint": "[compact|verbose]"
+ },
+ {
+ "command": "/agentstatus",
+ "description": "Show runtime status, including provider usage/quota when available"
+ },
+ {
+ "command": "/tasks",
+ "description": "List active/recent background tasks for the current session"
+ },
+ {
+ "command": "/context",
+ "description": "Explain how context is assembled",
+ "usage_hint": "[list|detail|json]"
+ },
+ {
+ "command": "/whoami",
+ "description": "Show your sender identity"
+ },
+ {
+ "command": "/skill",
+ "description": "Run a skill by name",
+ "usage_hint": " [input]"
+ },
+ {
+ "command": "/btw",
+ "description": "Ask a side question without changing session context",
+ "usage_hint": ""
+ },
+ {
+ "command": "/side",
+ "description": "Ask a side question without changing session context",
+ "usage_hint": ""
+ },
+ {
+ "command": "/usage",
+ "description": "Control the usage footer or show cost summary",
+ "usage_hint": "off|tokens|full|cost"
+ }
+ ]
+}
```
@@ -412,33 +426,36 @@ manifest เริ่มต้นเปิดใช้แท็บ **Home** ข
ใช้รายการ `slash_commands` เดียวกับ Socket Mode ด้านบน และเพิ่ม `"url": "https://gateway-host.example.com/slack/events"` ให้ทุกรายการ ตัวอย่าง:
```json
- "slash_commands": [
- {
- "command": "/new",
- "description": "Start a new session",
- "usage_hint": "[model]",
- "url": "https://gateway-host.example.com/slack/events"
- },
- {
- "command": "/help",
- "description": "Show the short help summary",
- "url": "https://gateway-host.example.com/slack/events"
- }
- // ...repeat for every command with the same `url` value
- ]
+{
+ "slash_commands": [
+ {
+ "command": "/new",
+ "description": "Start a new session",
+ "usage_hint": "[model]",
+ "url": "https://gateway-host.example.com/slack/events"
+ },
+ {
+ "command": "/help",
+ "description": "Show the short help summary",
+ "url": "https://gateway-host.example.com/slack/events"
+ }
+ ]
+}
```
+ ทำซ้ำค่า `url` นั้นในทุกคำสั่งในรายการ
+
-
- เพิ่มขอบเขตบอต `chat:write.customize` หากต้องการให้ข้อความขาออกใช้ตัวตนของเอเจนต์ที่ใช้งานอยู่ (ชื่อผู้ใช้และไอคอนที่กำหนดเอง) แทนตัวตนเริ่มต้นของแอป Slack
+
+ เพิ่มขอบเขตบอท `chat:write.customize` หากคุณต้องการให้ข้อความขาออกใช้ตัวตนของเอเจนต์ที่ใช้งานอยู่ (ชื่อผู้ใช้และไอคอนแบบกำหนดเอง) แทนตัวตนเริ่มต้นของแอป Slack
- หากคุณใช้ไอคอนอีโมจิ Slack ต้องการไวยากรณ์ `:emoji_name:`
+ หากคุณใช้ไอคอนอีโมจิ Slack คาดหวังไวยากรณ์ `:emoji_name:`
-
+
หากคุณกำหนดค่า `channels.slack.userToken` ขอบเขตการอ่านทั่วไปคือ:
- `channels:history`, `groups:history`, `im:history`, `mpim:history`
@@ -447,7 +464,7 @@ manifest เริ่มต้นเปิดใช้แท็บ **Home** ข
- `reactions:read`
- `pins:read`
- `emoji:read`
- - `search:read` (หากคุณพึ่งพาการอ่านผ่านการค้นหาของ Slack)
+ - `search:read` (หากคุณพึ่งพาการอ่านจากการค้นหาของ Slack)
@@ -456,52 +473,52 @@ manifest เริ่มต้นเปิดใช้แท็บ **Home** ข
- ต้องมี `botToken` + `appToken` สำหรับ Socket Mode
- โหมด HTTP ต้องมี `botToken` + `signingSecret`
-- `botToken`, `appToken`, `signingSecret` และ `userToken` รองรับสตริงแบบข้อความล้วน
- หรืออ็อบเจกต์ SecretRef
-- โทเค็นใน Config จะแทนที่ env fallback
-- env fallback ของ `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` ใช้กับบัญชีเริ่มต้นเท่านั้น
-- `userToken` (`xoxp-...`) กำหนดค่าได้เฉพาะใน Config (ไม่มี env fallback) และมีค่าเริ่มต้นเป็นพฤติกรรมอ่านอย่างเดียว (`userTokenReadOnly: true`)
+- `botToken`, `appToken`, `signingSecret` และ `userToken` รับสตริงข้อความล้วน
+ หรือออบเจ็กต์ SecretRef
+- โทเค็นในค่ากำหนดจะแทนที่ env fallback
+- env fallback `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` ใช้กับบัญชีเริ่มต้นเท่านั้น
+- `userToken` (`xoxp-...`) กำหนดค่าได้ผ่าน config เท่านั้น (ไม่มี env fallback) และค่าเริ่มต้นเป็นพฤติกรรมแบบอ่านอย่างเดียว (`userTokenReadOnly: true`)
พฤติกรรมสแนปช็อตสถานะ:
- การตรวจสอบบัญชี Slack ติดตามฟิลด์ `*Source` และ `*Status`
- ตามข้อมูลประจำตัว (`botToken`, `appToken`, `signingSecret`, `userToken`)
+ ต่อข้อมูลรับรอง (`botToken`, `appToken`, `signingSecret`, `userToken`)
- สถานะคือ `available`, `configured_unavailable` หรือ `missing`
- `configured_unavailable` หมายความว่าบัญชีถูกกำหนดค่าผ่าน SecretRef
- หรือแหล่งความลับอื่นที่ไม่ใช่แบบ inline แต่พาธคำสั่ง/รันไทม์ปัจจุบัน
- ไม่สามารถแก้ค่าแท้จริงได้
+ หรือแหล่งข้อมูลลับแบบไม่ฝังในบรรทัดแบบอื่น แต่เส้นทางคำสั่ง/รันไทม์ปัจจุบัน
+ ไม่สามารถ resolve ค่าจริงได้
- ในโหมด HTTP จะรวม `signingSecretStatus`; ใน Socket Mode
- คู่ที่ต้องมีคือ `botTokenStatus` + `appTokenStatus`
+ คู่ที่จำเป็นคือ `botTokenStatus` + `appTokenStatus`
-สำหรับการดำเนินการ/การอ่านไดเรกทอรี สามารถให้ความสำคัญกับโทเค็นผู้ใช้เมื่อกำหนดค่าไว้ได้ สำหรับการเขียน โทเค็นบอตยังคงเป็นตัวเลือกหลัก; การเขียนด้วยโทเค็นผู้ใช้อนุญาตเฉพาะเมื่อ `userTokenReadOnly: false` และโทเค็นบอตไม่พร้อมใช้งาน
+สำหรับ actions/การอ่าน directory สามารถเลือกใช้โทเค็นผู้ใช้ก่อนเมื่อกำหนดค่าไว้ สำหรับการเขียน โทเค็นบอทยังคงเป็นตัวเลือกหลัก; การเขียนด้วยโทเค็นผู้ใช้จะอนุญาตเฉพาะเมื่อ `userTokenReadOnly: false` และไม่มีโทเค็นบอทให้ใช้
-## การดำเนินการและเกต
+## Actions และ gates
-การดำเนินการของ Slack ควบคุมโดย `channels.slack.actions.*`
+Slack actions ถูกควบคุมโดย `channels.slack.actions.*`
-กลุ่มการดำเนินการที่มีในเครื่องมือ Slack ปัจจุบัน:
+กลุ่ม action ที่มีในเครื่องมือ Slack ปัจจุบัน:
| กลุ่ม | ค่าเริ่มต้น |
| ---------- | ------- |
-| messages | เปิดใช้ |
-| reactions | เปิดใช้ |
-| pins | เปิดใช้ |
-| memberInfo | เปิดใช้ |
-| emojiList | เปิดใช้ |
+| messages | เปิดใช้งาน |
+| reactions | เปิดใช้งาน |
+| pins | เปิดใช้งาน |
+| memberInfo | เปิดใช้งาน |
+| emojiList | เปิดใช้งาน |
-การดำเนินการข้อความ Slack ปัจจุบันรวมถึง `send`, `upload-file`, `download-file`, `read`, `edit`, `delete`, `pin`, `unpin`, `list-pins`, `member-info` และ `emoji-list` `download-file` รองรับ ID ไฟล์ Slack ที่แสดงใน placeholder ไฟล์ขาเข้า และส่งคืนตัวอย่างรูปภาพสำหรับรูปภาพ หรือเมทาดาทาไฟล์ local สำหรับไฟล์ประเภทอื่น
+action ข้อความ Slack ปัจจุบันประกอบด้วย `send`, `upload-file`, `download-file`, `read`, `edit`, `delete`, `pin`, `unpin`, `list-pins`, `member-info` และ `emoji-list` `download-file` รับ ID ไฟล์ Slack ที่แสดงใน placeholder ไฟล์ขาเข้า และส่งคืนตัวอย่างภาพสำหรับรูปภาพหรือ metadata ของไฟล์ภายในเครื่องสำหรับไฟล์ชนิดอื่น
## การควบคุมการเข้าถึงและการกำหนดเส้นทาง
-
- `channels.slack.dmPolicy` ควบคุมการเข้าถึง DM `channels.slack.allowFrom` คือรายการอนุญาต DM มาตรฐาน
+
+ `channels.slack.dmPolicy` ควบคุมการเข้าถึง DM `channels.slack.allowFrom` คือ allowlist ของ DM ตามมาตรฐาน
- `pairing` (ค่าเริ่มต้น)
- `allowlist`
- - `open` (ต้องให้ `channels.slack.allowFrom` มี `"*"`)
+ - `open` (ต้องให้ `channels.slack.allowFrom` รวม `"*"`)
- `disabled`
แฟล็ก DM:
@@ -509,8 +526,8 @@ manifest เริ่มต้นเปิดใช้แท็บ **Home** ข
- `dm.enabled` (ค่าเริ่มต้น true)
- `channels.slack.allowFrom`
- `dm.allowFrom` (เดิม)
- - `dm.groupEnabled` (DM แบบกลุ่มมีค่าเริ่มต้น false)
- - `dm.groupChannels` (รายการอนุญาต MPIM แบบไม่บังคับ)
+ - `dm.groupEnabled` (DM กลุ่มมีค่าเริ่มต้นเป็น false)
+ - `dm.groupChannels` (allowlist MPIM แบบไม่บังคับ)
ลำดับความสำคัญแบบหลายบัญชี:
@@ -518,31 +535,31 @@ manifest เริ่มต้นเปิดใช้แท็บ **Home** ข
- บัญชีที่มีชื่อจะสืบทอด `channels.slack.allowFrom` เมื่อไม่ได้ตั้งค่า `allowFrom` ของตัวเอง
- บัญชีที่มีชื่อจะไม่สืบทอด `channels.slack.accounts.default.allowFrom`
- `channels.slack.dm.policy` และ `channels.slack.dm.allowFrom` แบบเดิมยังคงอ่านเพื่อความเข้ากันได้ `openclaw doctor --fix` จะย้ายค่าเหล่านี้ไปยัง `dmPolicy` และ `allowFrom` เมื่อทำได้โดยไม่เปลี่ยนการเข้าถึง
+ `channels.slack.dm.policy` และ `channels.slack.dm.allowFrom` แบบเดิมยังอ่านได้เพื่อความเข้ากันได้ `openclaw doctor --fix` จะย้ายค่าเหล่านี้ไปเป็น `dmPolicy` และ `allowFrom` เมื่อทำได้โดยไม่เปลี่ยนการเข้าถึง
การจับคู่ใน DM ใช้ `openclaw pairing approve slack `
-
+
`channels.slack.groupPolicy` ควบคุมการจัดการช่อง:
- `open`
- `allowlist`
- `disabled`
- รายการอนุญาตของช่องอยู่ภายใต้ `channels.slack.channels` และ **ต้องใช้ ID ช่อง Slack ที่เสถียร** (เช่น `C12345678`) เป็นคีย์ Config
+ allowlist ของช่องอยู่ใต้ `channels.slack.channels` และ **ต้องใช้ ID ช่อง Slack ที่เสถียร** (เช่น `C12345678`) เป็นคีย์ config
- หมายเหตุรันไทม์: หากไม่มี `channels.slack` เลย (การตั้งค่าแบบ env-only) รันไทม์จะ fallback ไปที่ `groupPolicy="allowlist"` และบันทึกคำเตือน (แม้จะตั้งค่า `channels.defaults.groupPolicy` ไว้ก็ตาม)
+ หมายเหตุรันไทม์: หากไม่มี `channels.slack` เลย (การตั้งค่าแบบ env เท่านั้น) รันไทม์จะ fallback ไปที่ `groupPolicy="allowlist"` และบันทึกคำเตือน (แม้ว่าจะตั้งค่า `channels.defaults.groupPolicy` ไว้ก็ตาม)
- การแก้ชื่อ/ID:
+ การ resolve ชื่อ/ID:
- - รายการในรายการอนุญาตของช่องและรายการอนุญาตของ DM จะถูกแก้เมื่อเริ่มทำงานเมื่อการเข้าถึงโทเค็นอนุญาต
- - รายการชื่อช่องที่แก้ไม่ได้จะคงไว้ตามที่กำหนดค่า แต่จะถูกละเว้นในการกำหนดเส้นทางตามค่าเริ่มต้น
- - การอนุญาตขาเข้าและการกำหนดเส้นทางช่องใช้ ID เป็นหลักตามค่าเริ่มต้น; การจับคู่ชื่อผู้ใช้/slug โดยตรงต้องใช้ `channels.slack.dangerouslyAllowNameMatching: true`
+ - รายการ allowlist ของช่องและรายการ allowlist ของ DM จะถูก resolve ตอนเริ่มทำงานเมื่อการเข้าถึงโทเค็นอนุญาต
+ - รายการชื่อช่องที่ resolve ไม่ได้จะถูกเก็บไว้ตามที่กำหนดค่า แต่จะถูกละเว้นสำหรับการกำหนดเส้นทางโดยค่าเริ่มต้น
+ - การอนุญาตขาเข้าและการกำหนดเส้นทางช่องจะใช้ ID ก่อนโดยค่าเริ่มต้น; การจับคู่ชื่อผู้ใช้/slug โดยตรงต้องใช้ `channels.slack.dangerouslyAllowNameMatching: true`
- คีย์ตามชื่อ (`#channel-name` หรือ `channel-name`) จะ **ไม่** ตรงกันภายใต้ `groupPolicy: "allowlist"` การค้นหาช่องใช้ ID เป็นหลักตามค่าเริ่มต้น ดังนั้นคีย์ตามชื่อจะไม่มีวันกำหนดเส้นทางสำเร็จ และข้อความทั้งหมดในช่องนั้นจะถูกบล็อกอย่างเงียบๆ ซึ่งต่างจาก `groupPolicy: "open"` ที่ไม่ต้องใช้คีย์ช่องสำหรับการกำหนดเส้นทาง และคีย์ตามชื่อดูเหมือนจะใช้งานได้
+ คีย์ตามชื่อ (`#channel-name` หรือ `channel-name`) **จะไม่** ตรงกันภายใต้ `groupPolicy: "allowlist"` การค้นหาช่องใช้ ID ก่อนโดยค่าเริ่มต้น ดังนั้นคีย์ตามชื่อจะไม่สามารถกำหนดเส้นทางสำเร็จได้เลย และข้อความทั้งหมดในช่องนั้นจะถูกบล็อกอย่างเงียบ ๆ ซึ่งต่างจาก `groupPolicy: "open"` ที่ไม่ต้องใช้คีย์ช่องสำหรับการกำหนดเส้นทาง และคีย์ตามชื่อดูเหมือนจะใช้งานได้
ใช้ ID ช่อง Slack เป็นคีย์เสมอ วิธีค้นหา: คลิกขวาที่ช่องใน Slack → **Copy link** — ID (`C...`) จะปรากฏที่ท้าย URL
@@ -561,7 +578,7 @@ manifest เริ่มต้นเปิดใช้แท็บ **Home** ข
}
```
- ไม่ถูกต้อง (ถูกบล็อกอย่างเงียบๆ ภายใต้ `groupPolicy: "allowlist"`):
+ ไม่ถูกต้อง (ถูกบล็อกอย่างเงียบ ๆ ภายใต้ `groupPolicy: "allowlist"`):
```json5
{
@@ -579,63 +596,63 @@ manifest เริ่มต้นเปิดใช้แท็บ **Home** ข
-
- ข้อความช่องต้องผ่านเกตการกล่าวถึงตามค่าเริ่มต้น
+
+ ข้อความในช่องถูกกั้นด้วยการกล่าวถึงโดยค่าเริ่มต้น
แหล่งที่มาของการกล่าวถึง:
- การกล่าวถึงแอปอย่างชัดเจน (`<@botId>`)
- - การกล่าวถึงกลุ่มผู้ใช้ Slack (``) เมื่อผู้ใช้บอตเป็นสมาชิกของกลุ่มผู้ใช้นั้น; ต้องมี `usergroups:read`
+ - การกล่าวถึงกลุ่มผู้ใช้ Slack (``) เมื่อผู้ใช้บอทเป็นสมาชิกของกลุ่มผู้ใช้นั้น; ต้องมี `usergroups:read`
- รูปแบบ regex สำหรับการกล่าวถึง (`agents.list[].groupChat.mentionPatterns`, fallback `messages.groupChat.mentionPatterns`)
- - พฤติกรรมเธรดตอบกลับบอตโดยนัย (ปิดใช้งานเมื่อ `thread.requireExplicitMention` เป็น `true`)
+ - พฤติกรรม thread แบบตอบกลับถึงบอทโดยนัย (ปิดใช้งานเมื่อ `thread.requireExplicitMention` เป็น `true`)
- การควบคุมต่อช่อง (`channels.slack.channels.`; ชื่อใช้ได้เฉพาะผ่านการแก้ตอนเริ่มทำงานหรือ `dangerouslyAllowNameMatching`):
+ การควบคุมรายช่อง (`channels.slack.channels.`; ชื่อใช้ได้เฉพาะผ่านการ resolve ตอนเริ่มทำงานหรือ `dangerouslyAllowNameMatching`):
- `requireMention`
- - `users` (รายการอนุญาต)
+ - `users` (allowlist)
- `allowBots`
- `skills`
- `systemPrompt`
- `tools`, `toolsBySender`
- - รูปแบบคีย์ `toolsBySender`: `id:`, `e164:`, `username:`, `name:` หรือไวลด์การ์ด `"*"`
- (คีย์เดิมที่ไม่มีคำนำหน้ายังคงแมปเป็น `id:` เท่านั้น)
+ - รูปแบบคีย์ `toolsBySender`: `id:`, `e164:`, `username:`, `name:` หรือ wildcard `"*"`
+ (คีย์เดิมที่ไม่มี prefix ยัง map ไปที่ `id:` เท่านั้น)
- `allowBots` เป็นแบบอนุรักษ์นิยมสำหรับช่องและช่องส่วนตัว: ข้อความในห้องที่เขียนโดยบอตจะถูกรับเฉพาะเมื่อบอตผู้ส่งถูกระบุไว้อย่างชัดเจนในรายการอนุญาต `users` ของห้องนั้น หรือเมื่อมี ID เจ้าของ Slack ที่ชัดเจนอย่างน้อยหนึ่งรายการจาก `channels.slack.allowFrom` เป็นสมาชิกห้องอยู่ในขณะนั้น ไวลด์การ์ดและรายการเจ้าของแบบชื่อที่แสดงไม่ถือว่ามีเจ้าของอยู่ การตรวจสอบการมีอยู่ของเจ้าของใช้ Slack `conversations.members`; ตรวจให้แน่ใจว่าแอปมีขอบเขตการอ่านที่ตรงกับประเภทห้อง (`channels:read` สำหรับช่องสาธารณะ, `groups:read` สำหรับช่องส่วนตัว) หากการค้นหาสมาชิกล้มเหลว OpenClaw จะทิ้งข้อความในห้องที่เขียนโดยบอต
+ `allowBots` เป็นแบบระมัดระวังสำหรับช่องและช่องส่วนตัว: ข้อความในห้องที่เขียนโดยบอทจะถูกรับเฉพาะเมื่อบอทผู้ส่งอยู่ใน allowlist `users` ของห้องนั้นอย่างชัดเจน หรือเมื่อมี ID เจ้าของ Slack ที่ชัดเจนอย่างน้อยหนึ่งรายการจาก `channels.slack.allowFrom` เป็นสมาชิกห้องอยู่ในปัจจุบัน wildcard และรายการเจ้าของแบบชื่อที่แสดงไม่ถือว่าตอบสนองเงื่อนไขการมีอยู่ของเจ้าของ การมีอยู่ของเจ้าของใช้ Slack `conversations.members`; ตรวจสอบให้แน่ใจว่าแอปมีขอบเขตการอ่านที่ตรงกับชนิดห้อง (`channels:read` สำหรับช่องสาธารณะ, `groups:read` สำหรับช่องส่วนตัว) หากการค้นหาสมาชิกล้มเหลว OpenClaw จะทิ้งข้อความในห้องที่เขียนโดยบอท
-## เธรด เซสชัน และแท็กตอบกลับ
+## Threading, sessions และแท็กตอบกลับ
- DM กำหนดเส้นทางเป็น `direct`; ช่องเป็น `channel`; MPIM เป็น `group`
-- การผูกเส้นทาง Slack รองรับ ID ของเพียร์แบบดิบ รวมถึงรูปแบบเป้าหมาย Slack เช่น `channel:C12345678`, `user:U12345678` และ `<@U12345678>`
-- ด้วยค่าเริ่มต้น `session.dmScope=main` DM ของ Slack จะยุบรวมไปยังเซสชันหลักของเอเจนต์
-- เซสชันช่อง: `agent::slack:channel:`
-- การตอบกลับในเธรดสามารถสร้างส่วนต่อท้ายเซสชันเธรด (`:thread:`) เมื่อใช้ได้
+- การผูกเส้นทาง Slack รับ ID peer แบบดิบ รวมถึงรูปแบบเป้าหมาย Slack เช่น `channel:C12345678`, `user:U12345678` และ `<@U12345678>`
+- ด้วยค่าเริ่มต้น `session.dmScope=main` DM ของ Slack จะถูกรวมไปที่ session หลักของเอเจนต์
+- session ช่อง: `agent::slack:channel:`
+- การตอบกลับใน thread สามารถสร้าง suffix ของ session thread (`:thread:`) ได้เมื่อเกี่ยวข้อง
- ค่าเริ่มต้นของ `channels.slack.thread.historyScope` คือ `thread`; ค่าเริ่มต้นของ `thread.inheritParent` คือ `false`
-- `channels.slack.thread.initialHistoryLimit` ควบคุมจำนวนข้อความเธรดที่มีอยู่ซึ่งจะถูกดึงเมื่อเริ่มเซสชันเธรดใหม่ (ค่าเริ่มต้น `20`; ตั้งเป็น `0` เพื่อปิดใช้งาน)
-- `channels.slack.thread.requireExplicitMention` (ค่าเริ่มต้น `false`): เมื่อเป็น `true` จะระงับการกล่าวถึงในเธรดโดยนัย เพื่อให้บอตตอบเฉพาะการกล่าวถึง `@bot` อย่างชัดเจนภายในเธรด แม้บอตจะเคยมีส่วนร่วมในเธรดแล้วก็ตาม หากไม่มีสิ่งนี้ การตอบกลับในเธรดที่บอตเคยมีส่วนร่วมจะข้ามเกต `requireMention`
+- `channels.slack.thread.initialHistoryLimit` ควบคุมจำนวนข้อความ thread ที่มีอยู่ซึ่งจะถูกดึงเมื่อ session thread ใหม่เริ่มต้น (ค่าเริ่มต้น `20`; ตั้ง `0` เพื่อปิดใช้งาน)
+- `channels.slack.thread.requireExplicitMention` (ค่าเริ่มต้น `false`): เมื่อเป็น `true` จะระงับการกล่าวถึง thread โดยนัย เพื่อให้บอทตอบกลับเฉพาะการกล่าวถึง `@bot` อย่างชัดเจนภายใน thread แม้ว่าบอทจะเคยเข้าร่วมใน thread แล้วก็ตาม หากไม่มีค่านี้ การตอบกลับใน thread ที่บอทเคยเข้าร่วมจะข้าม gating ของ `requireMention`
-การควบคุมเธรดตอบกลับ:
+การควบคุม reply threading:
- `channels.slack.replyToMode`: `off|first|all|batched` (ค่าเริ่มต้น `off`)
- `channels.slack.replyToModeByChatType`: ต่อ `direct|group|channel`
- fallback เดิมสำหรับแชทโดยตรง: `channels.slack.dm.replyToMode`
-รองรับแท็กตอบกลับแบบกำหนดเอง:
+รองรับแท็กตอบกลับแบบแมนนวล:
- `[[reply_to_current]]`
- `[[reply_to:]]`
-`replyToMode="off"` ปิดใช้งานเธรดตอบกลับ **ทั้งหมด** ใน Slack รวมถึงแท็ก `[[reply_to_*]]` ที่ชัดเจน ซึ่งต่างจาก Telegram ที่แท็กชัดเจนยังคงได้รับการใช้ในโหมด `"off"` เธรดของ Slack จะซ่อนข้อความจากช่อง ในขณะที่การตอบกลับของ Telegram ยังคงมองเห็นแบบ inline
+`replyToMode="off"` ปิดใช้งาน reply threading **ทั้งหมด** ใน Slack รวมถึงแท็ก `[[reply_to_*]]` ที่ระบุอย่างชัดเจน ซึ่งต่างจาก Telegram ที่แท็กชัดเจนยังคงทำงานในโหมด `"off"` thread ของ Slack ซ่อนข้อความจากช่อง ขณะที่การตอบกลับของ Telegram ยังคงมองเห็นแบบ inline
-## รีแอ็กชันรับทราบ
+## รีแอ็กชันตอบรับ
-`ackReaction` ส่งอีโมจิรับทราบขณะที่ OpenClaw กำลังประมวลผลข้อความขาเข้า
+`ackReaction` ส่งอีโมจิยืนยันขณะที่ OpenClaw กำลังประมวลผลข้อความขาเข้า
-ลำดับการแก้ค่า:
+ลำดับการ resolve:
- `channels.slack.accounts..ackReaction`
- `channels.slack.ackReaction`
@@ -644,29 +661,29 @@ manifest เริ่มต้นเปิดใช้แท็บ **Home** ข
หมายเหตุ:
-- Slack ต้องการ shortcode (เช่น `"eyes"`)
-- ใช้ `""` เพื่อปิดใช้งานรีแอ็กชันสำหรับบัญชี Slack หรือทั่วทั้งระบบ
+- Slack คาดหวัง shortcode (เช่น `"eyes"`)
+- ใช้ `""` เพื่อปิดใช้งานรีแอ็กชันสำหรับบัญชี Slack หรือทั้งระบบ
## การสตรีมข้อความ
`channels.slack.streaming` ควบคุมพฤติกรรมตัวอย่างสด:
- `off`: ปิดใช้งานการสตรีมตัวอย่างสด
-- `partial` (ค่าเริ่มต้น): แทนที่ข้อความตัวอย่างด้วยเอาต์พุตบางส่วนล่าสุด
-- `block`: ต่อท้ายการอัปเดตตัวอย่างแบบแบ่งชิ้น
-- `progress`: แสดงข้อความสถานะความคืบหน้าขณะสร้าง แล้วส่งข้อความสุดท้าย
-- `streaming.preview.toolProgress`: เมื่อตัวอย่างแบบร่างทำงานอยู่ ให้กำหนดเส้นทางการอัปเดตเครื่องมือ/ความคืบหน้าไปยังข้อความตัวอย่างที่แก้ไขเดียวกัน (ค่าเริ่มต้น: `true`) ตั้งเป็น `false` เพื่อเก็บข้อความเครื่องมือ/ความคืบหน้าแยกกัน
+- `partial` (ค่าเริ่มต้น): แทนที่ข้อความตัวอย่างด้วยผลลัพธ์บางส่วนล่าสุด
+- `block`: ต่อท้ายการอัปเดตตัวอย่างแบบแบ่ง chunk
+- `progress`: แสดงข้อความสถานะความคืบหน้าขณะสร้าง จากนั้นส่งข้อความสุดท้าย
+- `streaming.preview.toolProgress`: เมื่อตัวอย่างฉบับร่างทำงานอยู่ ให้กำหนดเส้นทางการอัปเดตเครื่องมือ/ความคืบหน้าเข้าไปในข้อความตัวอย่างที่แก้ไขข้อความเดียวกัน (ค่าเริ่มต้น: `true`) ตั้งเป็น `false` เพื่อคงข้อความเครื่องมือ/ความคืบหน้าแยกกัน
-`channels.slack.streaming.nativeTransport` ควบคุมการสตรีมข้อความเนทีฟของ Slack เมื่อ `channels.slack.streaming.mode` เป็น `partial` (ค่าเริ่มต้น: `true`)
+`channels.slack.streaming.nativeTransport` ควบคุมการสตรีมข้อความ native ของ Slack เมื่อ `channels.slack.streaming.mode` เป็น `partial` (ค่าเริ่มต้น: `true`)
-- ต้องมีเธรดตอบกลับเพื่อให้การสตรีมข้อความเนทีฟและสถานะเธรดผู้ช่วยของ Slack ปรากฏ การเลือกเธรดยังคงเป็นไปตาม `replyToMode`
-- รูทของช่อง แชทกลุ่ม และ DM ระดับบนสุดยังคงใช้ตัวอย่างแบบร่างปกติได้เมื่อการสตรีมเนทีฟไม่พร้อมใช้งานหรือไม่มีเธรดตอบกลับ
-- DM ระดับบนสุดของ Slack อยู่นอกเธรดตามค่าเริ่มต้น จึงไม่แสดงตัวอย่างสตรีม/สถานะแบบเธรดเนทีฟของ Slack; OpenClaw จะโพสต์และแก้ไขตัวอย่างแบบร่างใน DM แทน
-- เพย์โหลดสื่อและที่ไม่ใช่ข้อความ fallback ไปยังการส่งตามปกติ
-- ผลลัพธ์สุดท้ายของสื่อ/ข้อผิดพลาดจะยกเลิกการแก้ไขตัวอย่างที่ค้างอยู่; ผลลัพธ์สุดท้ายของข้อความ/บล็อกที่เข้าเกณฑ์จะ flush เฉพาะเมื่อแก้ไขตัวอย่างในที่เดิมได้
-- หากการสตรีมล้มเหลวระหว่างตอบกลับ OpenClaw จะ fallback ไปยังการส่งตามปกติสำหรับเพย์โหลดที่เหลือ
+- ต้องมี thread ตอบกลับเพื่อให้การสตรีมข้อความ native และสถานะ thread assistant ของ Slack ปรากฏ การเลือก thread ยังคงทำตาม `replyToMode`
+- ช่อง, แชทกลุ่ม และราก DM ระดับบนสุดยังสามารถใช้ตัวอย่างฉบับร่างปกติได้เมื่อ native streaming ไม่พร้อมใช้งานหรือไม่มี thread ตอบกลับ
+- DM ของ Slack ระดับบนสุดจะอยู่นอก thread โดยค่าเริ่มต้น ดังนั้นจึงไม่แสดงตัวอย่าง native stream/status แบบ thread-style ของ Slack; OpenClaw จะโพสต์และแก้ไขตัวอย่างฉบับร่างใน DM แทน
+- payload สื่อและที่ไม่ใช่ข้อความจะ fallback ไปยังการส่งมอบปกติ
+- ผลสุดท้ายของสื่อ/ข้อผิดพลาดจะยกเลิกการแก้ไขตัวอย่างที่ค้างอยู่; ผลสุดท้ายแบบข้อความ/บล็อกที่เข้าเกณฑ์จะ flush เฉพาะเมื่อสามารถแก้ไขตัวอย่างในตำแหน่งเดิมได้
+- หากการสตรีมล้มเหลวระหว่างตอบกลับ OpenClaw จะ fallback ไปยังการส่งมอบปกติสำหรับ payload ที่เหลือ
-ใช้ตัวอย่างแบบร่างแทนการสตรีมข้อความเนทีฟของ Slack:
+ใช้ตัวอย่างฉบับร่างแทนการสตรีมข้อความ native ของ Slack:
```json5
{
@@ -683,58 +700,58 @@ manifest เริ่มต้นเปิดใช้แท็บ **Home** ข
คีย์เดิม:
-- `channels.slack.streamMode` (`replace | status_final | append`) จะถูกย้ายอัตโนมัติไปยัง `channels.slack.streaming.mode`
-- บูลีน `channels.slack.streaming` จะถูกย้ายอัตโนมัติไปยัง `channels.slack.streaming.mode` และ `channels.slack.streaming.nativeTransport`
-- `channels.slack.nativeStreaming` เดิมจะถูกย้ายอัตโนมัติไปยัง `channels.slack.streaming.nativeTransport`
+- `channels.slack.streamMode` (`replace | status_final | append`) ถูกย้ายอัตโนมัติไปเป็น `channels.slack.streaming.mode`
+- boolean `channels.slack.streaming` ถูกย้ายอัตโนมัติไปเป็น `channels.slack.streaming.mode` และ `channels.slack.streaming.nativeTransport`
+- `channels.slack.nativeStreaming` เดิมถูกย้ายอัตโนมัติไปเป็น `channels.slack.streaming.nativeTransport`
-## fallback รีแอ็กชันการพิมพ์
+## fallback ของรีแอ็กชันการพิมพ์
-`typingReaction` เพิ่มรีแอ็กชันชั่วคราวไปยังข้อความ Slack ขาเข้าขณะที่ OpenClaw กำลังประมวลผลการตอบกลับ แล้วลบออกเมื่อการรันเสร็จสิ้น สิ่งนี้มีประโยชน์ที่สุดนอกการตอบกลับในเธรด ซึ่งใช้ตัวบ่งชี้สถานะ "กำลังพิมพ์..." เริ่มต้น
+`typingReaction` เพิ่มรีแอ็กชันชั่วคราวให้กับข้อความ Slack ขาเข้าขณะที่ OpenClaw กำลังประมวลผลการตอบกลับ จากนั้นลบออกเมื่อการรันเสร็จสิ้น สิ่งนี้มีประโยชน์มากที่สุดภายนอกการตอบกลับใน thread ซึ่งใช้ตัวบ่งชี้สถานะเริ่มต้น "is typing..."
-ลำดับการแก้ค่า:
+ลำดับการ resolve:
- `channels.slack.accounts..typingReaction`
- `channels.slack.typingReaction`
หมายเหตุ:
-- Slack คาดหวัง shortcodes (ตัวอย่างเช่น `"hourglass_flowing_sand"`)
-- reaction เป็นแบบพยายามให้ดีที่สุด และจะพยายามล้างข้อมูลโดยอัตโนมัติหลังจาก reply หรือเส้นทางความล้มเหลวเสร็จสิ้น
+- Slack คาดหวัง shortcode (เช่น `"hourglass_flowing_sand"`)
+- reaction เป็นแบบ best-effort และจะพยายามล้างข้อมูลอัตโนมัติหลังจากเส้นทางการตอบกลับหรือความล้มเหลวเสร็จสิ้น
-## สื่อ การแบ่งชิ้น และการส่งมอบ
+## สื่อ, การแบ่งชิ้นส่วน, และการส่งมอบ
- ไฟล์แนบของ Slack จะถูกดาวน์โหลดจาก URL ส่วนตัวที่โฮสต์โดย Slack (โฟลว์คำขอที่ยืนยันตัวตนด้วยโทเค็น) และเขียนไปยัง media store เมื่อ fetch สำเร็จและขีดจำกัดขนาดอนุญาต placeholder ของไฟล์มี Slack `fileId` เพื่อให้เอเจนต์สามารถ fetch ไฟล์ต้นฉบับด้วย `download-file`
+ ไฟล์แนบของ Slack จะถูกดาวน์โหลดจาก URL ส่วนตัวที่โฮสต์โดย Slack (โฟลว์คำขอที่ยืนยันตัวตนด้วย token) และเขียนลง media store เมื่อ fetch สำเร็จและขีดจำกัดขนาดอนุญาต placeholder ของไฟล์จะมี Slack `fileId` เพื่อให้ agent สามารถ fetch ไฟล์ต้นฉบับด้วย `download-file`
- การดาวน์โหลดใช้ timeout สำหรับ idle และเวลารวมแบบมีขอบเขต หากการดึงไฟล์ Slack ค้างหรือล้มเหลว OpenClaw จะประมวลผลข้อความต่อไปและ fallback ไปที่ placeholder ของไฟล์
+ การดาวน์โหลดใช้ timeout ทั้งแบบ idle และ total ที่มีขอบเขตจำกัด หากการดึงไฟล์ Slack ค้างหรือล้มเหลว OpenClaw จะประมวลผลข้อความต่อไปและ fallback ไปยัง placeholder ของไฟล์
- ขีดจำกัดขนาด inbound ขณะ runtime มีค่าเริ่มต้นเป็น `20MB` เว้นแต่จะ override ด้วย `channels.slack.mediaMaxMb`
+ ค่าเริ่มต้นของขีดจำกัดขนาด inbound ระหว่าง runtime คือ `20MB` เว้นแต่จะถูก override ด้วย `channels.slack.mediaMaxMb`
- - ชิ้นข้อความใช้ `channels.slack.textChunkLimit` (ค่าเริ่มต้น 4000)
- - `channels.slack.chunkMode="newline"` เปิดใช้การแบ่งโดยให้ย่อหน้ามาก่อน
- - การส่งไฟล์ใช้ Slack upload APIs และสามารถรวม thread replies (`thread_ts`)
- - ขีดจำกัดสื่อ outbound ใช้ `channels.slack.mediaMaxMb` เมื่อกำหนดค่าไว้ มิฉะนั้นการส่งผ่าน channel จะใช้ค่าเริ่มต้นตามชนิด MIME จาก media pipeline
+ - ชิ้นส่วนข้อความใช้ `channels.slack.textChunkLimit` (ค่าเริ่มต้น 4000)
+ - `channels.slack.chunkMode="newline"` เปิดใช้การแบ่งแบบย่อหน้าก่อน
+ - การส่งไฟล์ใช้ Slack upload APIs และสามารถรวมการตอบกลับใน thread (`thread_ts`)
+ - ขีดจำกัดสื่อ outbound จะทำตาม `channels.slack.mediaMaxMb` เมื่อกำหนดค่าไว้ มิฉะนั้นการส่งผ่าน channel จะใช้ค่าเริ่มต้นตามชนิด MIME จาก media pipeline
- เป้าหมายแบบ explicit ที่แนะนำ:
+ เป้าหมายแบบชัดเจนที่แนะนำ:
- `user:` สำหรับ DM
- - `channel:` สำหรับ channels
+ - `channel:` สำหรับ channel
- Slack DM ที่เป็นข้อความ/บล็อกเท่านั้นสามารถโพสต์ไปยัง user IDs ได้โดยตรง ส่วนการอัปโหลดไฟล์และการส่งแบบ threaded จะเปิด DM ผ่าน Slack conversation APIs ก่อน เพราะเส้นทางเหล่านั้นต้องใช้ conversation ID ที่เป็นรูปธรรม
+ Slack DM ที่เป็นข้อความ/บล็อกเท่านั้นสามารถโพสต์ไปยัง user ID ได้โดยตรง ส่วนการอัปโหลดไฟล์และการส่งแบบ thread จะเปิด DM ผ่าน Slack conversation APIs ก่อน เพราะเส้นทางเหล่านั้นต้องใช้ conversation ID ที่เป็นรูปธรรม
## คำสั่งและพฤติกรรม slash
-Slash commands ปรากฏใน Slack เป็นได้ทั้งคำสั่งที่กำหนดค่าไว้คำสั่งเดียวหรือ native commands หลายรายการ กำหนดค่า `channels.slack.slashCommand` เพื่อเปลี่ยนค่าเริ่มต้นของคำสั่ง:
+คำสั่ง slash จะปรากฏใน Slack เป็นคำสั่งเดียวที่กำหนดค่าไว้ หรือเป็นหลายคำสั่ง native กำหนดค่า `channels.slack.slashCommand` เพื่อเปลี่ยนค่าเริ่มต้นของคำสั่ง:
- `enabled: false`
- `name: "openclaw"`
@@ -745,32 +762,32 @@ Slash commands ปรากฏใน Slack เป็นได้ทั้งค
/openclaw /help
```
-Native commands ต้องใช้ [การตั้งค่า manifest เพิ่มเติม](#additional-manifest-settings) ในแอป Slack ของคุณ และเปิดใช้ด้วย `channels.slack.commands.native: true` หรือ `commands.native: true` ในการกำหนดค่าทั่วโลกแทน
+คำสั่ง native ต้องใช้ [การตั้งค่า manifest เพิ่มเติม](#additional-manifest-settings) ในแอป Slack ของคุณ และเปิดใช้ด้วย `channels.slack.commands.native: true` หรือ `commands.native: true` ในการกำหนดค่าระดับ global แทน
-- auto-mode ของ native command ปิดอยู่สำหรับ Slack ดังนั้น `commands.native: "auto"` จึงไม่เปิดใช้ Slack native commands
+- โหมดอัตโนมัติของคำสั่ง native จะ **ปิด** สำหรับ Slack ดังนั้น `commands.native: "auto"` จะไม่เปิดใช้คำสั่ง native ของ Slack
```txt
/help
```
-เมนูอาร์กิวเมนต์แบบ native ใช้กลยุทธ์การ render แบบปรับตามสถานการณ์ ซึ่งจะแสดง modal ยืนยันก่อน dispatch ค่าตัวเลือกที่เลือก:
+เมนู argument แบบ native ใช้กลยุทธ์การ render แบบ adaptive ที่แสดง modal ยืนยันก่อน dispatch ค่า option ที่เลือก:
-- สูงสุด 5 ตัวเลือก: button blocks
-- 6-100 ตัวเลือก: static select menu
-- มากกว่า 100 ตัวเลือก: external select พร้อมการกรองตัวเลือกแบบ async เมื่อมี interactivity options handlers
-- เกินขีดจำกัดของ Slack: ค่าตัวเลือกที่เข้ารหัสจะ fallback เป็น buttons
+- สูงสุด 5 options: บล็อกปุ่ม
+- 6-100 options: เมนู static select
+- มากกว่า 100 options: external select พร้อมการกรอง option แบบ async เมื่อมีตัวจัดการ interactivity options
+- เกินขีดจำกัดของ Slack: ค่า option ที่เข้ารหัสจะ fallback ไปเป็นปุ่ม
```txt
/think
```
-Slash sessions ใช้ key แบบแยก เช่น `agent::slack:slash:` และยัง route การเรียกใช้คำสั่งไปยัง session ของบทสนทนาเป้าหมายโดยใช้ `CommandTargetSessionKey`
+session แบบ slash ใช้คีย์แยก เช่น `agent::slack:slash:` และยังคง route การรันคำสั่งไปยัง session การสนทนาเป้าหมายโดยใช้ `CommandTargetSessionKey`
-## Replies แบบโต้ตอบ
+## การตอบกลับแบบ interactive
-Slack สามารถ render ตัวควบคุม reply แบบโต้ตอบที่เอเจนต์เขียนได้ แต่ฟีเจอร์นี้ปิดไว้โดยค่าเริ่มต้น
+Slack สามารถ render คอนโทรลการตอบกลับแบบ interactive ที่ agent เขียนได้ แต่ฟีเจอร์นี้ถูกปิดไว้โดยค่าเริ่มต้น
-เปิดใช้ทั่วโลก:
+เปิดใช้แบบ global:
```json5
{
@@ -784,7 +801,7 @@ Slack สามารถ render ตัวควบคุม reply แบบโ
}
```
-หรือเปิดใช้สำหรับบัญชี Slack บัญชีเดียวเท่านั้น:
+หรือเปิดใช้เฉพาะบัญชี Slack หนึ่งบัญชี:
```json5
{
@@ -802,44 +819,44 @@ Slack สามารถ render ตัวควบคุม reply แบบโ
}
```
-เมื่อเปิดใช้ เอเจนต์สามารถ emit directives สำหรับ reply ที่ใช้เฉพาะ Slack ได้:
+เมื่อเปิดใช้แล้ว agent สามารถ emit directive การตอบกลับเฉพาะ Slack ได้:
- `[[slack_buttons: Approve:approve, Reject:reject]]`
- `[[slack_select: Choose a target | Canary:canary, Production:production]]`
-directives เหล่านี้จะ compile เป็น Slack Block Kit และ route การคลิกหรือการเลือกกลับผ่านเส้นทาง event ของ Slack interaction ที่มีอยู่
+directive เหล่านี้จะ compile เป็น Slack Block Kit และ route การคลิกหรือการเลือกกลับผ่านเส้นทาง event interaction ของ Slack ที่มีอยู่
หมายเหตุ:
-- นี่คือ UI เฉพาะ Slack channel อื่นจะไม่แปล Slack Block Kit directives เป็นระบบปุ่มของตนเอง
-- ค่า callback แบบโต้ตอบเป็น opaque tokens ที่ OpenClaw สร้าง ไม่ใช่ค่าดิบที่เอเจนต์เขียน
-- หาก interactive blocks ที่สร้างขึ้นจะเกินขีดจำกัด Slack Block Kit OpenClaw จะ fallback เป็นข้อความ reply ต้นฉบับแทนการส่ง blocks payload ที่ไม่ถูกต้อง
+- นี่คือ UI เฉพาะ Slack channel อื่นจะไม่แปล directive ของ Slack Block Kit เป็นระบบปุ่มของตนเอง
+- ค่า callback แบบ interactive เป็น opaque token ที่ OpenClaw สร้างขึ้น ไม่ใช่ค่าดิบที่ agent เขียน
+- หากบล็อก interactive ที่สร้างขึ้นจะเกินขีดจำกัดของ Slack Block Kit, OpenClaw จะ fallback ไปยังข้อความตอบกลับเดิมแทนการส่ง payload blocks ที่ไม่ถูกต้อง
## การอนุมัติ exec ใน Slack
-Slack สามารถทำหน้าที่เป็น approval client แบบ native พร้อมปุ่มและ interactions แบบโต้ตอบ แทนการ fallback ไปที่ Web UI หรือ terminal
+Slack สามารถทำหน้าที่เป็น client การอนุมัติ native พร้อมปุ่มและ interaction แบบ interactive แทนการ fallback ไปยัง Web UI หรือ terminal
-- การอนุมัติ exec ใช้ `channels.slack.execApprovals.*` สำหรับ routing ของ DM/channel แบบ native
-- การอนุมัติ Plugin ยังสามารถ resolve ผ่านพื้นผิวปุ่ม Slack-native เดียวกันได้ เมื่อคำขอนั้นมาถึง Slack อยู่แล้วและชนิด approval id เป็น `plugin:`
-- การ authorize ผู้อนุมัติยังถูกบังคับใช้: เฉพาะผู้ใช้ที่ระบุว่าเป็นผู้อนุมัติเท่านั้นที่สามารถอนุมัติหรือปฏิเสธคำขอผ่าน Slack ได้
+- การอนุมัติ exec ใช้ `channels.slack.execApprovals.*` สำหรับการ route DM/channel แบบ native
+- การอนุมัติ Plugin ยังสามารถ resolve ผ่านพื้นผิวปุ่ม native ของ Slack เดียวกันได้ เมื่อคำขอมาถึง Slack อยู่แล้วและชนิด approval id คือ `plugin:`
+- การตรวจสอบสิทธิ์ผู้อนุมัติยังคงถูกบังคับใช้: เฉพาะผู้ใช้ที่ระบุเป็น approver เท่านั้นที่สามารถ approve หรือ deny คำขอผ่าน Slack ได้
-ส่วนนี้ใช้พื้นผิวปุ่ม approval แบบ shared เดียวกับ channel อื่น เมื่อเปิดใช้ `interactivity` ในการตั้งค่าแอป Slack ของคุณ prompt การอนุมัติจะ render เป็นปุ่ม Block Kit โดยตรงในบทสนทนา
-เมื่อปุ่มเหล่านั้นมีอยู่ ปุ่มเหล่านั้นคือ UX การอนุมัติหลัก OpenClaw
-ควรรวมคำสั่ง `/approve` แบบ manual เฉพาะเมื่อผลลัพธ์ของ tool ระบุว่า chat
-approvals ใช้ไม่ได้หรือการอนุมัติแบบ manual เป็นเส้นทางเดียวเท่านั้น
+สิ่งนี้ใช้พื้นผิวปุ่มการอนุมัติร่วมแบบเดียวกับ channel อื่น เมื่อเปิดใช้ `interactivity` ในการตั้งค่าแอป Slack ของคุณ prompt การอนุมัติจะ render เป็นปุ่ม Block Kit โดยตรงในการสนทนา
+เมื่อมีปุ่มเหล่านั้น ปุ่มเหล่านั้นคือ UX การอนุมัติหลัก OpenClaw
+ควรรวมคำสั่ง `/approve` แบบ manual เฉพาะเมื่อผลลัพธ์ของเครื่องมือบอกว่าการอนุมัติผ่าน chat
+ไม่พร้อมใช้งาน หรือการอนุมัติแบบ manual เป็นเส้นทางเดียวเท่านั้น
-พาธ config:
+เส้นทาง config:
- `channels.slack.execApprovals.enabled`
-- `channels.slack.execApprovals.approvers` (ไม่บังคับ; fallback เป็น `commands.ownerAllowFrom` เมื่อเป็นไปได้)
+- `channels.slack.execApprovals.approvers` (ไม่บังคับ; fallback ไปยัง `commands.ownerAllowFrom` เมื่อเป็นไปได้)
- `channels.slack.execApprovals.target` (`dm` | `channel` | `both`, ค่าเริ่มต้น: `dm`)
- `agentFilter`, `sessionFilter`
-Slack จะเปิดใช้ native exec approvals โดยอัตโนมัติเมื่อไม่ได้ตั้งค่า `enabled` หรือเป็น `"auto"` และมี
-ผู้อนุมัติอย่างน้อยหนึ่งราย resolve ได้ ตั้งค่า `enabled: false` เพื่อปิดใช้ Slack เป็น native approval client อย่าง explicit
-ตั้งค่า `enabled: true` เพื่อบังคับเปิด native approvals เมื่อผู้อนุมัติ resolve ได้
+Slack จะเปิดใช้การอนุมัติ exec แบบ native โดยอัตโนมัติเมื่อไม่ได้ตั้งค่า `enabled` หรือเป็น `"auto"` และ resolve
+approver ได้อย่างน้อยหนึ่งรายการ ตั้งค่า `enabled: false` เพื่อปิดใช้ Slack เป็น client การอนุมัติ native อย่างชัดเจน
+ตั้งค่า `enabled: true` เพื่อบังคับเปิดการอนุมัติ native เมื่อ resolve approver ได้
-พฤติกรรมเริ่มต้นเมื่อไม่มี config การอนุมัติ exec ของ Slack แบบ explicit:
+พฤติกรรมเริ่มต้นเมื่อไม่มี config การอนุมัติ exec ของ Slack ที่ชัดเจน:
```json5
{
@@ -849,8 +866,8 @@ Slack จะเปิดใช้ native exec approvals โดยอัตโน
}
```
-จำเป็นต้องใช้ config แบบ Slack-native อย่าง explicit เฉพาะเมื่อคุณต้องการ override ผู้อนุมัติ เพิ่ม filters หรือ
-เลือกใช้การส่งมอบผ่าน origin-chat:
+config แบบ Slack-native ที่ชัดเจนจำเป็นเฉพาะเมื่อคุณต้องการ override approver, เพิ่ม filter, หรือ
+เลือกใช้การส่งมอบไปยัง chat ต้นทาง:
```json5
{
@@ -866,25 +883,25 @@ Slack จะเปิดใช้ native exec approvals โดยอัตโน
}
```
-การ forwarding ของ `approvals.exec` แบบ shared แยกต่างหาก ใช้เฉพาะเมื่อ prompt การอนุมัติ exec ต้อง
-route ไปยัง chat อื่นหรือเป้าหมายนอกช่องทางที่ explicit ด้วย การ forwarding ของ `approvals.plugin` แบบ shared ก็
-แยกต่างหากเช่นกัน ปุ่ม Slack-native ยังสามารถ resolve การอนุมัติ Plugin ได้เมื่อคำขอเหล่านั้นมาถึง
+การส่งต่อ `approvals.exec` แบบ shared แยกต่างหาก ใช้เฉพาะเมื่อ prompt การอนุมัติ exec ต้อง
+route ไปยัง chat อื่นหรือเป้าหมาย out-of-band ที่ชัดเจนด้วย การส่งต่อ `approvals.plugin` แบบ shared ก็
+แยกต่างหากเช่นกัน ปุ่ม Slack-native ยังคงสามารถ resolve การอนุมัติ Plugin ได้เมื่อคำขอเหล่านั้นมาถึง
Slack อยู่แล้ว
-Same-chat `/approve` ยังทำงานใน Slack channels และ DM ที่รองรับคำสั่งอยู่แล้ว ดู [การอนุมัติ exec](/th/tools/exec-approvals) สำหรับโมเดลการ forwarding approval ฉบับเต็ม
+`/approve` ใน chat เดียวกันยังทำงานใน channel และ DM ของ Slack ที่รองรับคำสั่งอยู่แล้ว ดู [การอนุมัติ exec](/th/tools/exec-approvals) สำหรับโมเดลการส่งต่อการอนุมัติแบบเต็ม
-## Events และพฤติกรรมด้านปฏิบัติการ
+## Events และพฤติกรรมการปฏิบัติการ
-- การแก้ไข/ลบข้อความถูก map เป็น system events
-- Thread broadcasts (thread replies แบบ "Also send to channel") ถูกประมวลผลเป็นข้อความผู้ใช้ปกติ
-- Events การเพิ่ม/ลบ reaction ถูก map เป็น system events
-- Events สมาชิกเข้าร่วม/ออก, สร้าง/เปลี่ยนชื่อ channel และเพิ่ม/ลบ pin ถูก map เป็น system events
-- `channel_id_changed` สามารถ migrate channel config keys ได้เมื่อเปิดใช้ `configWrites`
-- metadata ของ channel topic/purpose ถูกถือเป็น context ที่ไม่น่าเชื่อถือและสามารถ inject เข้าไปใน routing context ได้
-- การ seed context ของ thread starter และ initial thread-history จะถูกกรองตาม sender allowlists ที่กำหนดค่าไว้เมื่อใช้ได้
-- Block actions และ modal interactions emit system events แบบมีโครงสร้าง `Slack interaction: ...` พร้อมฟิลด์ payload ที่ละเอียด:
- - block actions: selected values, labels, picker values และ metadata `workflow_*`
- - events ของ modal `view_submission` และ `view_closed` พร้อม routed channel metadata และ form inputs
+- การแก้ไข/ลบข้อความจะถูก map เป็น system events
+- thread broadcast (การตอบกลับ thread แบบ "Also send to channel") จะถูกประมวลผลเป็นข้อความผู้ใช้ปกติ
+- event การเพิ่ม/ลบ reaction จะถูก map เป็น system events
+- event สมาชิกเข้าร่วม/ออก, channel ถูกสร้าง/เปลี่ยนชื่อ, และ pin ถูกเพิ่ม/ลบ จะถูก map เป็น system events
+- `channel_id_changed` สามารถ migrate คีย์ config ของ channel ได้เมื่อเปิดใช้ `configWrites`
+- metadata ของหัวข้อ/วัตถุประสงค์ channel จะถูกปฏิบัติเป็น context ที่ไม่น่าเชื่อถือ และสามารถ inject เข้าไปใน routing context ได้
+- thread starter และการ seed context จากประวัติ thread เริ่มต้นจะถูกกรองด้วย allowlist ผู้ส่งที่กำหนดค่าไว้เมื่อเกี่ยวข้อง
+- block actions และ modal interactions จะ emit system events แบบมีโครงสร้าง `Slack interaction: ...` พร้อมฟิลด์ payload ที่ละเอียด:
+ - block actions: ค่าที่เลือก, label, ค่า picker, และ metadata `workflow_*`
+ - event modal `view_submission` และ `view_closed` พร้อม metadata channel ที่ถูก route และ input ของฟอร์ม
## ข้อมูลอ้างอิงการกำหนดค่า
@@ -894,10 +911,10 @@ Same-chat `/approve` ยังทำงานใน Slack channels และ DM
- mode/auth: `mode`, `botToken`, `appToken`, `signingSecret`, `webhookPath`, `accounts.*`
- การเข้าถึง DM: `dm.enabled`, `dmPolicy`, `allowFrom` (legacy: `dm.policy`, `dm.allowFrom`), `dm.groupEnabled`, `dm.groupChannels`
-- compatibility toggle: `dangerouslyAllowNameMatching` (break-glass; ปิดไว้เว้นแต่จำเป็น)
+- toggle ความเข้ากันได้: `dangerouslyAllowNameMatching` (break-glass; ปิดไว้เว้นแต่จำเป็น)
- การเข้าถึง channel: `groupPolicy`, `channels.*`, `channels.*.users`, `channels.*.requireMention`
- threading/history: `replyToMode`, `replyToModeByChatType`, `thread.*`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit`
-- การส่งมอบ: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `streaming`, `streaming.nativeTransport`, `streaming.preview.toolProgress`
+- delivery: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `streaming`, `streaming.nativeTransport`, `streaming.preview.toolProgress`
- ops/features: `configWrites`, `commands.native`, `slashCommand.*`, `actions.*`, `userToken`, `userTokenReadOnly`
@@ -909,11 +926,11 @@ Same-chat `/approve` ยังทำงานใน Slack channels และ DM
ตรวจสอบตามลำดับ:
- `groupPolicy`
- - channel allowlist (`channels.slack.channels`) — **keys ต้องเป็น channel IDs** (`C12345678`) ไม่ใช่ชื่อ (`#channel-name`) keys ที่อิงชื่อล้มเหลวแบบเงียบภายใต้ `groupPolicy: "allowlist"` เพราะ channel routing เป็นแบบ ID-first โดยค่าเริ่มต้น วิธีหา ID: คลิกขวาที่ channel ใน Slack → **Copy link** — ค่า `C...` ที่ท้าย URL คือ channel ID
+ - allowlist ของ channel (`channels.slack.channels`) — **คีย์ต้องเป็น channel ID** (`C12345678`) ไม่ใช่ชื่อ (`#channel-name`) คีย์ที่อิงชื่อจะล้มเหลวแบบเงียบภายใต้ `groupPolicy: "allowlist"` เพราะค่าเริ่มต้นของการ route channel ใช้ ID ก่อน วิธีหา ID: คลิกขวาที่ channel ใน Slack → **Copy link** — ค่า `C...` ที่ท้าย URL คือ channel ID
- `requireMention`
- allowlist `users` ต่อ channel
- คำสั่งที่เป็นประโยชน์:
+ คำสั่งที่มีประโยชน์:
```bash
openclaw channels status --probe
@@ -928,10 +945,10 @@ openclaw doctor
- `channels.slack.dm.enabled`
- `channels.slack.dmPolicy` (หรือ legacy `channels.slack.dm.policy`)
- - รายการ pairing approvals / allowlist
- - Slack Assistant DM events: logs แบบ verbose ที่กล่าวถึง `drop message_changed`
- มักหมายความว่า Slack ส่ง event ของ Assistant-thread ที่ถูกแก้ไขโดยไม่มี
- human sender ที่กู้คืนได้ใน metadata ของข้อความ
+ - การอนุมัติ pairing / รายการ allowlist
+ - event DM ของ Slack Assistant: log แบบ verbose ที่กล่าวถึง `drop message_changed`
+ มักหมายความว่า Slack ส่ง event thread ของ Assistant ที่ถูกแก้ไขโดยไม่มี
+ ผู้ส่งมนุษย์ที่กู้คืนได้ใน metadata ของข้อความ
```bash
openclaw pairing list slack
@@ -940,104 +957,104 @@ openclaw pairing list slack
- ตรวจสอบความถูกต้องของ bot + app tokens และการเปิดใช้ Socket Mode ในการตั้งค่าแอป Slack
+ ตรวจสอบ bot + app token และการเปิดใช้ Socket Mode ในการตั้งค่าแอป Slack
หาก `openclaw channels status --probe --json` แสดง `botTokenStatus` หรือ
- `appTokenStatus: "configured_unavailable"` หมายความว่าบัญชี Slack
- ได้รับการกำหนดค่าแล้ว แต่ runtime ปัจจุบันไม่สามารถ resolve ค่า
- ที่อิง SecretRef ได้
+ `appTokenStatus: "configured_unavailable"` แสดงว่าบัญชี Slack ถูก
+ กำหนดค่าแล้ว แต่ runtime ปัจจุบันไม่สามารถ resolve ค่า
+ ที่รองรับด้วย SecretRef ได้
- ตรวจสอบความถูกต้องของ:
+ ตรวจสอบ:
- signing secret
- - webhook path
+ - path ของ Webhook
- Slack Request URLs (Events + Interactivity + Slash Commands)
- `webhookPath` ที่ไม่ซ้ำกันต่อบัญชี HTTP
- หาก `signingSecretStatus: "configured_unavailable"` ปรากฏใน account
- snapshots หมายความว่าบัญชี HTTP ได้รับการกำหนดค่าแล้ว แต่ runtime ปัจจุบันไม่สามารถ
- resolve signing secret ที่อิง SecretRef ได้
+ หาก `signingSecretStatus: "configured_unavailable"` ปรากฏใน snapshot
+ ของบัญชี แสดงว่าบัญชี HTTP ถูกกำหนดค่าแล้ว แต่ runtime ปัจจุบันไม่สามารถ
+ resolve signing secret ที่รองรับด้วย SecretRef ได้
- ตรวจสอบว่าคุณตั้งใจใช้แบบใด:
+ ตรวจสอบว่าคุณตั้งใจใช้:
- - native command mode (`channels.slack.commands.native: true`) พร้อม slash commands ที่ตรงกันซึ่งลงทะเบียนไว้ใน Slack
- - หรือ single slash command mode (`channels.slack.slashCommand.enabled: true`)
+ - โหมดคำสั่ง native (`channels.slack.commands.native: true`) พร้อมคำสั่ง slash ที่ตรงกันซึ่งลงทะเบียนใน Slack
+ - หรือโหมดคำสั่ง slash เดี่ยว (`channels.slack.slashCommand.enabled: true`)
- ตรวจสอบ `commands.useAccessGroups` และ channel/user allowlists ด้วย
+ ตรวจสอบ `commands.useAccessGroups` และ allowlist ของ channel/user ด้วย
-## ข้อมูลอ้างอิง attachment vision
+## ข้อมูลอ้างอิง vision สำหรับไฟล์แนบ
-Slack สามารถแนบสื่อที่ดาวน์โหลดแล้วเข้ากับ turn ของเอเจนต์เมื่อการดาวน์โหลดไฟล์ Slack สำเร็จและขีดจำกัดขนาดอนุญาต ไฟล์รูปภาพสามารถส่งผ่านเส้นทาง media understanding หรือส่งตรงไปยัง reply model ที่รองรับ vision ได้ ไฟล์อื่นจะถูกเก็บไว้เป็น context ของไฟล์ที่ดาวน์โหลดได้ แทนที่จะถูกถือเป็น image input
+Slack สามารถแนบสื่อที่ดาวน์โหลดแล้วเข้ากับ turn ของ agent เมื่อการดาวน์โหลดไฟล์ Slack สำเร็จและขีดจำกัดขนาดอนุญาต ไฟล์รูปภาพสามารถส่งผ่านเส้นทางการเข้าใจสื่อ หรือส่งตรงไปยังโมเดลตอบกลับที่รองรับ vision ได้ ส่วนไฟล์อื่นจะถูกเก็บเป็นบริบทไฟล์ที่ดาวน์โหลดได้ แทนที่จะถูกปฏิบัติเป็น input รูปภาพ
### ประเภทสื่อที่รองรับ
-| ประเภทสื่อ | แหล่งที่มา | ลักษณะการทำงานปัจจุบัน | หมายเหตุ |
+| ประเภทสื่อ | แหล่งที่มา | พฤติกรรมปัจจุบัน | หมายเหตุ |
| ------------------------------ | -------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
-| รูปภาพ JPEG / PNG / GIF / WebP | URL ไฟล์ Slack | ดาวน์โหลดและแนบเข้ากับรอบการสนทนาเพื่อการจัดการที่รองรับการมองเห็น | ขีดจำกัดต่อไฟล์: `channels.slack.mediaMaxMb` (ค่าเริ่มต้น 20 MB) |
-| ไฟล์ PDF | URL ไฟล์ Slack | ดาวน์โหลดและเปิดเผยเป็นบริบทไฟล์สำหรับเครื่องมือ เช่น `download-file` หรือ `pdf` | ข้อมูลขาเข้า Slack ไม่แปลง PDF เป็นอินพุตภาพสำหรับการมองเห็นโดยอัตโนมัติ |
-| ไฟล์อื่น | URL ไฟล์ Slack | ดาวน์โหลดเมื่อเป็นไปได้และเปิดเผยเป็นบริบทไฟล์ | ไฟล์ไบนารีจะไม่ถูกจัดการเป็นอินพุตรูปภาพ |
-| การตอบกลับในเธรด | ไฟล์ของข้อความเริ่มเธรด | ไฟล์ของข้อความรากสามารถถูกเติมเป็นบริบทได้เมื่อการตอบกลับไม่มีสื่อโดยตรง | ข้อความเริ่มเธรดที่มีเฉพาะไฟล์ใช้ตัวยึดตำแหน่งไฟล์แนบ |
-| ข้อความหลายรูปภาพ | ไฟล์ Slack หลายไฟล์ | แต่ละไฟล์จะถูกประเมินแยกกัน | การประมวลผล Slack ถูกจำกัดไว้ที่แปดไฟล์ต่อข้อความ |
+| รูปภาพ JPEG / PNG / GIF / WebP | URL ไฟล์ Slack | ดาวน์โหลดและแนบเข้ากับรอบสนทนาเพื่อให้จัดการด้วยความสามารถด้านวิชันได้ | ขีดจำกัดต่อไฟล์: `channels.slack.mediaMaxMb` (ค่าเริ่มต้น 20 MB) |
+| ไฟล์ PDF | URL ไฟล์ Slack | ดาวน์โหลดและเปิดเผยเป็นบริบทไฟล์สำหรับเครื่องมือ เช่น `download-file` หรือ `pdf` | ขาเข้า Slack ไม่แปลง PDF เป็นอินพุตภาพสำหรับวิชันโดยอัตโนมัติ |
+| ไฟล์อื่น ๆ | URL ไฟล์ Slack | ดาวน์โหลดเมื่อเป็นไปได้และเปิดเผยเป็นบริบทไฟล์ | ไฟล์ไบนารีจะไม่ถูกถือเป็นอินพุตรูปภาพ |
+| การตอบกลับในเธรด | ไฟล์ของข้อความเริ่มเธรด | ไฟล์จากข้อความรากสามารถเติมเป็นบริบทได้เมื่อการตอบกลับไม่มีสื่อโดยตรง | ข้อความเริ่มที่มีเฉพาะไฟล์ใช้ตัวยึดตำแหน่งไฟล์แนบ |
+| ข้อความหลายรูปภาพ | ไฟล์ Slack หลายไฟล์ | แต่ละไฟล์จะถูกประเมินแยกกัน | การประมวลผล Slack จำกัดไว้ที่แปดไฟล์ต่อข้อความ |
### ไปป์ไลน์ขาเข้า
-เมื่อข้อความ Slack ที่มีไฟล์แนบมาถึง:
+เมื่อมีข้อความ Slack พร้อมไฟล์แนบเข้ามา:
1. OpenClaw ดาวน์โหลดไฟล์จาก URL ส่วนตัวของ Slack โดยใช้โทเค็นบอต (`xoxb-...`)
-2. เมื่อสำเร็จ ไฟล์จะถูกเขียนไปยังที่จัดเก็บสื่อ
-3. เส้นทางสื่อที่ดาวน์โหลดแล้วและประเภทเนื้อหาจะถูกเพิ่มลงในบริบทขาเข้า
-4. เส้นทางของโมเดล/เครื่องมือที่รองรับรูปภาพสามารถใช้ไฟล์แนบรูปภาพจากบริบทนั้นได้
-5. ไฟล์ที่ไม่ใช่รูปภาพยังคงพร้อมใช้งานเป็นเมทาดาทาไฟล์หรือการอ้างอิงสื่อสำหรับเครื่องมือที่จัดการไฟล์เหล่านั้นได้
+2. เมื่อสำเร็จ ไฟล์จะถูกเขียนลงในที่เก็บสื่อ
+3. พาธสื่อที่ดาวน์โหลดและประเภทเนื้อหาจะถูกเพิ่มลงในบริบทขาเข้า
+4. พาธของโมเดล/เครื่องมือที่รองรับรูปภาพสามารถใช้ไฟล์แนบรูปภาพจากบริบทนั้นได้
+5. ไฟล์ที่ไม่ใช่รูปภาพยังคงพร้อมใช้งานเป็นเมตาดาต้าไฟล์หรือการอ้างอิงสื่อสำหรับเครื่องมือที่จัดการไฟล์เหล่านั้นได้
-### การสืบทอดไฟล์แนบจากข้อความรากของเธรด
+### การสืบทอดไฟล์แนบจากรากเธรด
-เมื่อข้อความมาถึงในเธรด (มีพาเรนต์ `thread_ts`):
+เมื่อมีข้อความเข้ามาในเธรด (มีพาเรนต์ `thread_ts`):
-- หากการตอบกลับเองไม่มีสื่อโดยตรง และข้อความรากที่รวมมามีไฟล์ Slack สามารถเติมไฟล์รากเป็นบริบทของข้อความเริ่มเธรดได้
+- หากตัวการตอบกลับเองไม่มีสื่อโดยตรง และข้อความรากที่รวมมามีไฟล์ Slack สามารถเติมไฟล์รากเป็นบริบทข้อความเริ่มเธรดได้
- ไฟล์แนบของการตอบกลับโดยตรงมีลำดับความสำคัญเหนือไฟล์แนบของข้อความราก
-- ข้อความรากที่มีเฉพาะไฟล์และไม่มีข้อความจะแสดงด้วยตัวยึดตำแหน่งไฟล์แนบ เพื่อให้กลไกสำรองยังคงรวมไฟล์ของข้อความนั้นได้
+- ข้อความรากที่มีเฉพาะไฟล์และไม่มีข้อความจะแสดงด้วยตัวยึดตำแหน่งไฟล์แนบ เพื่อให้กลไกสำรองยังสามารถรวมไฟล์ของข้อความนั้นได้
### การจัดการไฟล์แนบหลายรายการ
เมื่อข้อความ Slack เดียวมีไฟล์แนบหลายรายการ:
- ไฟล์แนบแต่ละรายการจะถูกประมวลผลแยกกันผ่านไปป์ไลน์สื่อ
-- การอ้างอิงสื่อที่ดาวน์โหลดแล้วจะถูกรวมเข้ากับบริบทข้อความ
+- การอ้างอิงสื่อที่ดาวน์โหลดจะถูกรวมไว้ในบริบทข้อความ
- ลำดับการประมวลผลเป็นไปตามลำดับไฟล์ของ Slack ในเพย์โหลดเหตุการณ์
-- ความล้มเหลวในการดาวน์โหลดไฟล์แนบหนึ่งรายการไม่บล็อกไฟล์แนบอื่น
+- ความล้มเหลวในการดาวน์โหลดไฟล์แนบหนึ่งรายการจะไม่บล็อกรายการอื่น
-### ขนาด การดาวน์โหลด และขีดจำกัดของโมเดล
+### ขีดจำกัดขนาด การดาวน์โหลด และโมเดล
- **ขีดจำกัดขนาด**: ค่าเริ่มต้น 20 MB ต่อไฟล์ กำหนดค่าได้ผ่าน `channels.slack.mediaMaxMb`
-- **ความล้มเหลวในการดาวน์โหลด**: ไฟล์ที่ Slack ให้บริการไม่ได้, URL หมดอายุ, ไฟล์ที่เข้าถึงไม่ได้, ไฟล์เกินขนาด และการตอบกลับ HTML สำหรับการยืนยันตัวตน/เข้าสู่ระบบของ Slack จะถูกข้าม แทนที่จะถูกรายงานว่าเป็นรูปแบบที่ไม่รองรับ
-- **โมเดลการมองเห็น**: การวิเคราะห์รูปภาพใช้โมเดลตอบกลับที่ใช้งานอยู่เมื่อโมเดลนั้นรองรับการมองเห็น หรือใช้โมเดลรูปภาพที่กำหนดค่าไว้ที่ `agents.defaults.imageModel`
+- **ความล้มเหลวในการดาวน์โหลด**: ไฟล์ที่ Slack ให้บริการไม่ได้, URL หมดอายุ, ไฟล์ที่เข้าถึงไม่ได้, ไฟล์เกินขนาด และการตอบกลับ HTML สำหรับการตรวจสอบสิทธิ์/เข้าสู่ระบบของ Slack จะถูกข้ามแทนที่จะถูกรายงานว่าเป็นรูปแบบที่ไม่รองรับ
+- **โมเดลวิชัน**: การวิเคราะห์รูปภาพใช้โมเดลตอบกลับที่ใช้งานอยู่เมื่อรองรับวิชัน หรือใช้โมเดลรูปภาพที่กำหนดค่าไว้ที่ `agents.defaults.imageModel`
### ขีดจำกัดที่ทราบ
-| สถานการณ์ | ลักษณะการทำงานปัจจุบัน | วิธีแก้ปัญหาชั่วคราว |
+| สถานการณ์ | พฤติกรรมปัจจุบัน | วิธีแก้ไขชั่วคราว |
| -------------------------------------- | ---------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
-| URL ไฟล์ Slack หมดอายุ | ข้ามไฟล์ ไม่มีข้อผิดพลาดแสดง | อัปโหลดไฟล์ใหม่ใน Slack |
-| ไม่ได้กำหนดค่าโมเดลการมองเห็น | ไฟล์แนบรูปภาพถูกจัดเก็บเป็นการอ้างอิงสื่อ แต่ไม่ถูกวิเคราะห์เป็นรูปภาพ | กำหนดค่า `agents.defaults.imageModel` หรือใช้โมเดลตอบกลับที่รองรับการมองเห็น |
+| URL ไฟล์ Slack หมดอายุ | ข้ามไฟล์; ไม่แสดงข้อผิดพลาด | อัปโหลดไฟล์ใหม่ใน Slack |
+| ไม่ได้กำหนดค่าโมเดลวิชัน | ไฟล์แนบรูปภาพถูกจัดเก็บเป็นการอ้างอิงสื่อ แต่ไม่ถูกวิเคราะห์เป็นรูปภาพ | กำหนดค่า `agents.defaults.imageModel` หรือใช้โมเดลตอบกลับที่รองรับวิชัน |
| รูปภาพขนาดใหญ่มาก (> 20 MB โดยค่าเริ่มต้น) | ข้ามตามขีดจำกัดขนาด | เพิ่ม `channels.slack.mediaMaxMb` หาก Slack อนุญาต |
-| ไฟล์แนบที่ส่งต่อ/แชร์ | ข้อความและสื่อรูปภาพ/ไฟล์ที่โฮสต์บน Slack เป็นแบบพยายามอย่างดีที่สุด | แชร์ใหม่โดยตรงในเธรด OpenClaw |
-| ไฟล์แนบ PDF | จัดเก็บเป็นบริบทไฟล์/สื่อ ไม่ได้กำหนดเส้นทางผ่านการมองเห็นรูปภาพโดยอัตโนมัติ | ใช้ `download-file` สำหรับเมทาดาทาไฟล์ หรือเครื่องมือ `pdf` สำหรับการวิเคราะห์ PDF |
+| ไฟล์แนบที่ส่งต่อ/แชร์ | ข้อความและสื่อรูปภาพ/ไฟล์ที่โฮสต์บน Slack เป็นแบบพยายามให้ดีที่สุด | แชร์ใหม่โดยตรงในเธรด OpenClaw |
+| ไฟล์แนบ PDF | จัดเก็บเป็นบริบทไฟล์/สื่อ ไม่ได้ถูกส่งผ่านวิชันรูปภาพโดยอัตโนมัติ | ใช้ `download-file` สำหรับเมตาดาต้าไฟล์ หรือเครื่องมือ `pdf` สำหรับการวิเคราะห์ PDF |
### เอกสารที่เกี่ยวข้อง
- [ไปป์ไลน์การทำความเข้าใจสื่อ](/th/nodes/media-understanding)
- [เครื่องมือ PDF](/th/tools/pdf)
-- มหากาพย์: [#51349](https://github.com/openclaw/openclaw/issues/51349) — การเปิดใช้งานการมองเห็นสำหรับไฟล์แนบ Slack
-- การทดสอบถดถอย: [#51353](https://github.com/openclaw/openclaw/issues/51353)
-- การตรวจสอบยืนยันแบบสด: [#51354](https://github.com/openclaw/openclaw/issues/51354)
+- มหากาพย์: [#51349](https://github.com/openclaw/openclaw/issues/51349) — การเปิดใช้วิชันสำหรับไฟล์แนบ Slack
+- การทดสอบรีเกรสชัน: [#51353](https://github.com/openclaw/openclaw/issues/51353)
+- การยืนยันแบบสด: [#51354](https://github.com/openclaw/openclaw/issues/51354)
## ที่เกี่ยวข้อง
@@ -1046,18 +1063,18 @@ Slack สามารถแนบสื่อที่ดาวน์โหล
จับคู่ผู้ใช้ Slack กับ Gateway
- ลักษณะการทำงานของช่องและ DM กลุ่ม
+ พฤติกรรมช่องและ DM กลุ่ม
กำหนดเส้นทางข้อความขาเข้าไปยังเอเจนต์
- โมเดลภัยคุกคามและการเสริมความแข็งแกร่ง
+ โมเดลภัยคุกคามและการเสริมความปลอดภัย
- โครงร่างคอนฟิกและลำดับความสำคัญ
+ เค้าโครงการกำหนดค่าและลำดับความสำคัญ
- แค็ตตาล็อกคำสั่งและลักษณะการทำงาน
+ แคตตาล็อกคำสั่งและพฤติกรรม
diff --git a/docs/th/channels/tlon.md b/docs/th/channels/tlon.md
index d8a2e64d8..669f29479 100644
--- a/docs/th/channels/tlon.md
+++ b/docs/th/channels/tlon.md
@@ -1,30 +1,30 @@
---
read_when:
- - กำลังทำงานกับฟีเจอร์ช่องทาง Tlon/Urbit
-summary: สถานะการรองรับ Tlon/Urbit ความสามารถ และการกำหนดค่า
+ - กำลังทำงานเกี่ยวกับฟีเจอร์ช่องทาง Tlon/Urbit
+summary: สถานะการรองรับ ความสามารถ และการกำหนดค่าของ Tlon/Urbit
title: Tlon
x-i18n:
- generated_at: "2026-05-02T22:16:35Z"
+ generated_at: "2026-05-04T02:22:26Z"
model: gpt-5.5
provider: openai
- source_hash: 30915170786fc1ee8b84fb8be2ea42280262923064cfa9ca7107036096a13add
+ source_hash: 1718044541b431ff2437508e7e6659c14206f4aa84ab8b207e0d791dea2a48c5
source_path: channels/tlon.md
workflow: 16
---
Tlon เป็นเมสเซนเจอร์แบบกระจายศูนย์ที่สร้างบน Urbit OpenClaw เชื่อมต่อกับ Urbit ship ของคุณและสามารถ
-ตอบ DM และข้อความแชทกลุ่มได้ โดยค่าเริ่มต้น การตอบกลับในกลุ่มต้องมีการกล่าวถึงด้วย @ และสามารถ
+ตอบกลับ DM และข้อความแชทกลุ่มได้ การตอบกลับกลุ่มต้องมีการกล่าวถึงด้วย @ ตามค่าเริ่มต้น และสามารถ
จำกัดเพิ่มเติมผ่าน allowlist ได้
-สถานะ: Plugin ที่รวมมาในแพ็กเกจ รองรับ DM, การกล่าวถึงในกลุ่ม, การตอบกลับในเธรด, การจัดรูปแบบ rich text และ
-การอัปโหลดรูปภาพ ยังไม่รองรับรีแอ็กชันและโพล
+สถานะ: Plugin ที่รวมมาให้แล้ว รองรับ DM, การกล่าวถึงในกลุ่ม, การตอบกลับในเธรด, การจัดรูปแบบข้อความแบบ rich text และ
+การอัปโหลดรูปภาพแล้ว ยังไม่รองรับ reactions และ polls
-## Plugin ที่รวมมาในแพ็กเกจ
+## Plugin ที่รวมมาให้แล้ว
-Tlon มาพร้อมเป็น Plugin ที่รวมมาในแพ็กเกจใน OpenClaw รุ่นปัจจุบัน ดังนั้นบิลด์แบบแพ็กเกจตามปกติ
+Tlon มาพร้อมเป็น Plugin ที่รวมมาให้แล้วใน OpenClaw รุ่นปัจจุบัน ดังนั้น build แบบแพ็กเกจปกติ
จึงไม่ต้องติดตั้งแยกต่างหาก
-หากคุณใช้บิลด์เก่ากว่าหรือการติดตั้งแบบกำหนดเองที่ไม่รวม Tlon ให้ติดตั้ง
+หากคุณใช้ build เก่ากว่าหรือการติดตั้งแบบกำหนดเองที่ไม่รวม Tlon ให้ติดตั้ง
แพ็กเกจ npm ปัจจุบัน:
ติดตั้งผ่าน CLI (npm registry):
@@ -33,10 +33,10 @@ Tlon มาพร้อมเป็น Plugin ที่รวมมาในแ
openclaw plugins install @openclaw/tlon
```
-ใช้แพ็กเกจเปล่าเพื่อให้ตามแท็กรุ่นทางการปัจจุบัน ปักหมุดเวอร์ชันที่แน่นอน
-เฉพาะเมื่อคุณต้องการการติดตั้งที่ทำซ้ำได้
+ใช้แพ็กเกจแบบไม่ระบุเวอร์ชันเพื่อให้ตามแท็กรุ่นทางการปัจจุบัน ระบุ
+เวอร์ชันที่แน่นอนเฉพาะเมื่อคุณต้องการการติดตั้งที่ทำซ้ำได้เท่านั้น
-เช็กเอาต์ในเครื่อง (เมื่อรันจาก git repo):
+การ checkout ภายในเครื่อง (เมื่อรันจาก git repo):
```bash
openclaw plugins install ./path/to/local/tlon-plugin
@@ -46,13 +46,13 @@ openclaw plugins install ./path/to/local/tlon-plugin
## การตั้งค่า
-1. ตรวจสอบว่า Plugin Tlon พร้อมใช้งาน
- - OpenClaw รุ่นแพ็กเกจปัจจุบันรวมมาให้อยู่แล้ว
- - การติดตั้งรุ่นเก่า/แบบกำหนดเองสามารถเพิ่มด้วยตนเองได้ด้วยคำสั่งด้านบน
-2. รวบรวม URL ของ ship และโค้ดเข้าสู่ระบบ
+1. ตรวจสอบว่า Tlon Plugin พร้อมใช้งาน
+ - OpenClaw รุ่นแพ็กเกจปัจจุบันรวมไว้ให้แล้ว
+ - การติดตั้งเก่ากว่า/แบบกำหนดเองสามารถเพิ่มเองได้ด้วยคำสั่งด้านบน
+2. รวบรวม URL ของ ship และรหัสเข้าสู่ระบบของคุณ
3. กำหนดค่า `channels.tlon`
-4. รีสตาร์ท Gateway
-5. DM บอทหรือกล่าวถึงบอทในช่องกลุ่ม
+4. รีสตาร์ท gateway
+5. DM ไปยังบอตหรือกล่าวถึงบอตในช่องกลุ่ม
การกำหนดค่าขั้นต่ำ (บัญชีเดียว):
@@ -70,11 +70,11 @@ openclaw plugins install ./path/to/local/tlon-plugin
}
```
-## Ship ส่วนตัว/LAN
+## ship ส่วนตัว/LAN
-โดยค่าเริ่มต้น OpenClaw จะบล็อกชื่อโฮสต์และช่วง IP ส่วนตัว/ภายในเพื่อป้องกัน SSRF
-หาก ship ของคุณรันอยู่บนเครือข่ายส่วนตัว (localhost, LAN IP หรือชื่อโฮสต์ภายใน)
-คุณต้องเลือกเปิดใช้งานอย่างชัดเจน:
+ตามค่าเริ่มต้น OpenClaw จะบล็อก hostname และช่วง IP ส่วนตัว/ภายในเพื่อป้องกัน SSRF
+หาก ship ของคุณทำงานอยู่บนเครือข่ายส่วนตัว (localhost, IP ของ LAN หรือ hostname ภายใน)
+คุณต้องเลือกเปิดใช้อย่างชัดเจน:
```json5
{
@@ -87,18 +87,18 @@ openclaw plugins install ./path/to/local/tlon-plugin
}
```
-การตั้งค่านี้ใช้กับ URL เช่น:
+สิ่งนี้ใช้กับ URL เช่น:
- `http://localhost:8080`
- `http://192.168.x.x:8080`
- `http://my-ship.local:8080`
-⚠️ เปิดใช้งานเฉพาะเมื่อคุณเชื่อถือเครือข่ายภายในของคุณเท่านั้น การตั้งค่านี้จะปิดการป้องกัน SSRF
+⚠️ เปิดใช้งานเฉพาะเมื่อคุณไว้วางใจเครือข่ายภายในของคุณเท่านั้น การตั้งค่านี้จะปิดการป้องกัน SSRF
สำหรับคำขอไปยัง URL ของ ship ของคุณ
## ช่องกลุ่ม
-การค้นหาอัตโนมัติเปิดใช้งานโดยค่าเริ่มต้น คุณยังสามารถปักหมุดช่องด้วยตนเองได้:
+การค้นหาอัตโนมัติเปิดใช้งานตามค่าเริ่มต้น คุณยังสามารถปักหมุดช่องด้วยตนเองได้:
```json5
{
@@ -110,7 +110,7 @@ openclaw plugins install ./path/to/local/tlon-plugin
}
```
-ปิดใช้งานการค้นหาอัตโนมัติ:
+ปิดการค้นหาอัตโนมัติ:
```json5
{
@@ -124,7 +124,7 @@ openclaw plugins install ./path/to/local/tlon-plugin
## การควบคุมการเข้าถึง
-allowlist สำหรับ DM (ว่าง = ไม่อนุญาต DM ให้ใช้ `ownerShip` สำหรับโฟลว์การอนุมัติ):
+allowlist สำหรับ DM (ว่าง = ไม่อนุญาต DM, ใช้ `ownerShip` สำหรับขั้นตอนการอนุมัติ):
```json5
{
@@ -136,7 +136,7 @@ allowlist สำหรับ DM (ว่าง = ไม่อนุญาต DM
}
```
-การอนุญาตกลุ่ม (จำกัดโดยค่าเริ่มต้น):
+การอนุญาตของกลุ่ม (จำกัดตามค่าเริ่มต้น):
```json5
{
@@ -159,7 +159,7 @@ allowlist สำหรับ DM (ว่าง = ไม่อนุญาต DM
}
```
-## ระบบเจ้าของและการอนุมัติ
+## เจ้าของและระบบอนุมัติ
ตั้งค่า owner ship เพื่อรับคำขออนุมัติเมื่อผู้ใช้ที่ไม่ได้รับอนุญาตพยายามโต้ตอบ:
@@ -173,8 +173,8 @@ allowlist สำหรับ DM (ว่าง = ไม่อนุญาต DM
}
```
-owner ship จะได้รับอนุญาต **โดยอัตโนมัติทุกที่** — คำเชิญ DM จะถูกยอมรับอัตโนมัติ และ
-ข้อความในช่องจะได้รับอนุญาตเสมอ คุณไม่จำเป็นต้องเพิ่มเจ้าของลงใน `dmAllowlist` หรือ
+owner ship จะ **ได้รับอนุญาตโดยอัตโนมัติทุกที่** — คำเชิญ DM จะถูกยอมรับอัตโนมัติ และ
+ข้อความในช่องจะได้รับอนุญาตเสมอ คุณไม่จำเป็นต้องเพิ่มเจ้าของใน `dmAllowlist` หรือ
`defaultAuthorizedShips`
เมื่อตั้งค่าแล้ว เจ้าของจะได้รับการแจ้งเตือนทาง DM สำหรับ:
@@ -197,55 +197,59 @@ owner ship จะได้รับอนุญาต **โดยอัตโน
}
```
-ยอมรับคำเชิญเข้ากลุ่มอัตโนมัติ:
+ยอมรับคำเชิญเข้ากลุ่มอัตโนมัติจาก ship ที่เชื่อถือได้:
```json5
{
channels: {
tlon: {
autoAcceptGroupInvites: true,
+ groupInviteAllowlist: ["~zod"],
},
},
}
```
-## เป้าหมายการส่งมอบ (CLI/cron)
+`autoAcceptGroupInvites` จะปฏิเสธโดยอัตโนมัติเมื่อ `groupInviteAllowlist` ว่าง ตั้งค่า
+allowlist เป็น ship ที่ควรยอมรับคำเชิญเข้ากลุ่มโดยอัตโนมัติ
-ใช้สิ่งเหล่านี้กับ `openclaw message send` หรือการส่งมอบด้วย cron:
+## เป้าหมายการส่ง (CLI/cron)
+
+ใช้สิ่งเหล่านี้กับ `openclaw message send` หรือการส่งผ่าน cron:
- DM: `~sampel-palnet` หรือ `dm/~sampel-palnet`
- กลุ่ม: `chat/~host-ship/channel` หรือ `group:~host-ship/channel`
-## Skills ที่รวมมาในแพ็กเกจ
+## Skill ที่รวมมาให้แล้ว
-Plugin Tlon รวม Skills ที่มาพร้อมแพ็กเกจ ([`@tloncorp/tlon-skill`](https://github.com/tloncorp/tlon-skill))
+Tlon Plugin มี Skill ที่รวมมาให้แล้ว ([`@tloncorp/tlon-skill`](https://github.com/tloncorp/tlon-skill))
ซึ่งให้การเข้าถึงการทำงานของ Tlon ผ่าน CLI:
-- **ผู้ติดต่อ**: รับ/อัปเดตโปรไฟล์, แสดงรายการผู้ติดต่อ
+- **รายชื่อผู้ติดต่อ**: รับ/อัปเดตโปรไฟล์, แสดงรายชื่อผู้ติดต่อ
- **ช่อง**: แสดงรายการ, สร้าง, โพสต์ข้อความ, ดึงประวัติ
- **กลุ่ม**: แสดงรายการ, สร้าง, จัดการสมาชิก
-- **DM**: ส่งข้อความ, รีแอ็กต์ต่อข้อความ
-- **รีแอ็กชัน**: เพิ่ม/ลบรีแอ็กชันอีโมจิในโพสต์และ DM
+- **DM**: ส่งข้อความ, react ต่อข้อความ
+- **Reactions**: เพิ่ม/ลบ emoji reactions ในโพสต์และ DM
- **การตั้งค่า**: จัดการสิทธิ์ Plugin ผ่านคำสั่ง slash
-Skills จะพร้อมใช้งานโดยอัตโนมัติเมื่อติดตั้ง Plugin แล้ว
+Skill จะพร้อมใช้งานโดยอัตโนมัติเมื่อ Plugin ได้รับการติดตั้ง
## ความสามารถ
| ฟีเจอร์ | สถานะ |
| --------------- | --------------------------------------- |
| ข้อความโดยตรง | ✅ รองรับ |
-| กลุ่ม/ช่อง | ✅ รองรับ (ต้องกล่าวถึงโดยค่าเริ่มต้น) |
+| กลุ่ม/ช่อง | ✅ รองรับ (ต้องมีการกล่าวถึงตามค่าเริ่มต้น) |
| เธรด | ✅ รองรับ (ตอบกลับอัตโนมัติในเธรด) |
| Rich text | ✅ แปลง Markdown เป็นรูปแบบ Tlon |
| รูปภาพ | ✅ อัปโหลดไปยังพื้นที่จัดเก็บของ Tlon |
-| รีแอ็กชัน | ✅ ผ่าน [Skills ที่รวมมาในแพ็กเกจ](#bundled-skill) |
-| โพล | ❌ ยังไม่รองรับ |
-| คำสั่งเนทีฟ | ✅ รองรับ (เฉพาะเจ้าของโดยค่าเริ่มต้น) |
+| Reactions | ✅ ผ่าน [Skill ที่รวมมาให้แล้ว](#bundled-skill) |
+| Polls | ❌ ยังไม่รองรับ |
+| คำสั่งเนทีฟ | ✅ รองรับ (เฉพาะเจ้าของตามค่าเริ่มต้น) |
## การแก้ไขปัญหา
-รันขั้นตอนต่อไปนี้ก่อน:
+รันลำดับนี้ก่อน:
```bash
openclaw status
@@ -254,45 +258,46 @@ openclaw logs --follow
openclaw doctor
```
-ข้อผิดพลาดที่พบบ่อย:
+ความล้มเหลวที่พบบ่อย:
-- **DM ถูกละเว้น**: ผู้ส่งไม่อยู่ใน `dmAllowlist` และไม่ได้กำหนดค่า `ownerShip` สำหรับโฟลว์การอนุมัติ
+- **DM ถูกละเว้น**: ผู้ส่งไม่อยู่ใน `dmAllowlist` และไม่ได้กำหนดค่า `ownerShip` สำหรับขั้นตอนการอนุมัติ
- **ข้อความกลุ่มถูกละเว้น**: ไม่พบช่องหรือผู้ส่งไม่ได้รับอนุญาต
-- **ข้อผิดพลาดการเชื่อมต่อ**: ตรวจสอบว่าเข้าถึง URL ของ ship ได้; เปิดใช้ `allowPrivateNetwork` สำหรับ ship ในเครื่อง
-- **ข้อผิดพลาดการยืนยันตัวตน**: ตรวจสอบว่าโค้ดเข้าสู่ระบบยังเป็นปัจจุบัน (โค้ดจะหมุนเวียน)
+- **ข้อผิดพลาดการเชื่อมต่อ**: ตรวจสอบว่า URL ของ ship เข้าถึงได้; เปิดใช้ `allowPrivateNetwork` สำหรับ ship ภายในเครื่อง
+- **ข้อผิดพลาดการยืนยันตัวตน**: ตรวจสอบว่ารหัสเข้าสู่ระบบเป็นปัจจุบัน (รหัสจะหมุนเวียน)
## อ้างอิงการกำหนดค่า
-การกำหนดค่าฉบับเต็ม: [การกำหนดค่า](/th/gateway/configuration)
+การกำหนดค่าแบบเต็ม: [การกำหนดค่า](/th/gateway/configuration)
ตัวเลือกผู้ให้บริการ:
- `channels.tlon.enabled`: เปิด/ปิดการเริ่มต้นช่อง
-- `channels.tlon.ship`: ชื่อ Urbit ship ของบอท (เช่น `~sampel-palnet`)
+- `channels.tlon.ship`: ชื่อ Urbit ship ของบอต (เช่น `~sampel-palnet`)
- `channels.tlon.url`: URL ของ ship (เช่น `https://sampel-palnet.tlon.network`)
-- `channels.tlon.code`: โค้ดเข้าสู่ระบบของ ship
-- `channels.tlon.allowPrivateNetwork`: อนุญาต URL localhost/LAN (บายพาส SSRF)
-- `channels.tlon.ownerShip`: owner ship สำหรับระบบการอนุมัติ (ได้รับอนุญาตเสมอ)
-- `channels.tlon.dmAllowlist`: ship ที่อนุญาตให้ DM (ว่าง = ไม่มี)
-- `channels.tlon.autoAcceptDmInvites`: ยอมรับ DM จาก ship ที่อยู่ใน allowlist โดยอัตโนมัติ
-- `channels.tlon.autoAcceptGroupInvites`: ยอมรับคำเชิญเข้ากลุ่มทั้งหมดโดยอัตโนมัติ
-- `channels.tlon.autoDiscoverChannels`: ค้นหาช่องกลุ่มโดยอัตโนมัติ (ค่าเริ่มต้น: true)
-- `channels.tlon.groupChannels`: channel nest ที่ปักหมุดด้วยตนเอง
+- `channels.tlon.code`: รหัสเข้าสู่ระบบของ ship
+- `channels.tlon.allowPrivateNetwork`: อนุญาต URL localhost/LAN (ข้าม SSRF)
+- `channels.tlon.ownerShip`: owner ship สำหรับระบบอนุมัติ (ได้รับอนุญาตเสมอ)
+- `channels.tlon.dmAllowlist`: ship ที่ได้รับอนุญาตให้ DM (ว่าง = ไม่มี)
+- `channels.tlon.autoAcceptDmInvites`: ยอมรับ DM อัตโนมัติจาก ship ที่อยู่ใน allowlist
+- `channels.tlon.autoAcceptGroupInvites`: ยอมรับคำเชิญเข้ากลุ่มอัตโนมัติจาก ship ที่อยู่ใน allowlist
+- `channels.tlon.groupInviteAllowlist`: ship ที่คำเชิญเข้ากลุ่มอาจได้รับการยอมรับอัตโนมัติ
+- `channels.tlon.autoDiscoverChannels`: ค้นหาช่องกลุ่มอัตโนมัติ (ค่าเริ่มต้น: true)
+- `channels.tlon.groupChannels`: nest ของช่องที่ปักหมุดด้วยตนเอง
- `channels.tlon.defaultAuthorizedShips`: ship ที่ได้รับอนุญาตสำหรับทุกช่อง
- `channels.tlon.authorization.channelRules`: กฎการยืนยันสิทธิ์รายช่อง
- `channels.tlon.showModelSignature`: ต่อท้ายชื่อโมเดลในข้อความ
## หมายเหตุ
-- การตอบกลับในกลุ่มต้องมีการกล่าวถึง (เช่น `~your-bot-ship`) เพื่อให้ตอบกลับ
-- การตอบกลับในเธรด: หากข้อความขาเข้าอยู่ในเธรด OpenClaw จะตอบกลับในเธรด
-- Rich text: การจัดรูปแบบ Markdown (ตัวหนา, ตัวเอียง, โค้ด, หัวเรื่อง, รายการ) จะถูกแปลงเป็นรูปแบบเนทีฟของ Tlon
+- การตอบกลับกลุ่มต้องมีการกล่าวถึง (เช่น `~your-bot-ship`) เพื่อให้ตอบกลับ
+- การตอบกลับเธรด: หากข้อความขาเข้าอยู่ในเธรด OpenClaw จะตอบกลับในเธรด
+- Rich text: การจัดรูปแบบ Markdown (ตัวหนา, ตัวเอียง, code, headers, lists) จะถูกแปลงเป็นรูปแบบเนทีฟของ Tlon
- รูปภาพ: URL จะถูกอัปโหลดไปยังพื้นที่จัดเก็บของ Tlon และฝังเป็นบล็อกรูปภาพ
## ที่เกี่ยวข้อง
-- [ภาพรวมช่อง](/th/channels) — ช่องทั้งหมดที่รองรับ
-- [การจับคู่](/th/channels/pairing) — การยืนยันตัวตนและโฟลว์การจับคู่ผ่าน DM
-- [กลุ่ม](/th/channels/groups) — พฤติกรรมแชทกลุ่มและการกำกับด้วยการกล่าวถึง
+- [ภาพรวมช่อง](/th/channels) — ช่องที่รองรับทั้งหมด
+- [การจับคู่](/th/channels/pairing) — การยืนยันตัวตน DM และขั้นตอนการจับคู่
+- [กลุ่ม](/th/channels/groups) — พฤติกรรมแชทกลุ่มและการควบคุมด้วยการกล่าวถึง
- [การกำหนดเส้นทางช่อง](/th/channels/channel-routing) — การกำหนดเส้นทางเซสชันสำหรับข้อความ
- [ความปลอดภัย](/th/gateway/security) — โมเดลการเข้าถึงและการเสริมความแข็งแกร่ง
diff --git a/docs/th/channels/troubleshooting.md b/docs/th/channels/troubleshooting.md
index 5f49020fd..012ee4a44 100644
--- a/docs/th/channels/troubleshooting.md
+++ b/docs/th/channels/troubleshooting.md
@@ -1,19 +1,19 @@
---
read_when:
- - ทรานสปอร์ตของช่องทางระบุว่าเชื่อมต่อแล้ว แต่การตอบกลับล้มเหลว
- - คุณต้องตรวจสอบเฉพาะช่องทางก่อนอ่านเอกสารเชิงลึกของผู้ให้บริการ
-summary: การแก้ไขปัญหาระดับช่องทางอย่างรวดเร็ว พร้อมสัญญาณบ่งชี้ความล้มเหลวและวิธีแก้ไขของแต่ละช่องทาง
+ - ทรานสปอร์ตของช่องทางรายงานว่าเชื่อมต่อแล้ว แต่การตอบกลับล้มเหลว
+ - คุณต้องตรวจสอบเฉพาะช่องทางก่อนอ่านเอกสารผู้ให้บริการเชิงลึก
+summary: การแก้ปัญหาระดับช่องทางอย่างรวดเร็ว พร้อมลักษณะบ่งชี้ความล้มเหลวและวิธีแก้ไขแยกตามแต่ละช่องทาง
title: การแก้ไขปัญหาช่องทาง
x-i18n:
- generated_at: "2026-04-30T09:40:05Z"
+ generated_at: "2026-05-04T02:22:46Z"
model: gpt-5.5
provider: openai
- source_hash: 6024f2ae0a058b2296758c237c912a5cd8ea6bbafea33cc201690cc081efcbee
+ source_hash: a3a0737156ae83897c44d18505e0355a5d8e5700106b984496d94874c270deb2
source_path: channels/troubleshooting.md
workflow: 16
---
-ใช้หน้านี้เมื่อ channel เชื่อมต่อแล้ว แต่ลักษณะการทำงานไม่ถูกต้อง
+ใช้หน้านี้เมื่อช่องทางเชื่อมต่อได้ แต่พฤติกรรมไม่ถูกต้อง
## ลำดับคำสั่ง
@@ -32,117 +32,118 @@ openclaw channels status --probe
- `Runtime: running`
- `Connectivity probe: ok`
- `Capability: read-only`, `write-capable`, หรือ `admin-capable`
-- การตรวจสอบ channel แสดงว่า transport เชื่อมต่อแล้ว และเมื่อรองรับ จะแสดง `works` หรือ `audit ok`
+- การตรวจสอบช่องทางแสดงว่าการขนส่งเชื่อมต่อแล้ว และในกรณีที่รองรับ จะแสดง `works` หรือ `audit ok`
## WhatsApp
-### สัญญาณความล้มเหลวของ WhatsApp
+### ลักษณะความล้มเหลวของ WhatsApp
-| อาการ | การตรวจสอบที่เร็วที่สุด | วิธีแก้ |
+| อาการ | วิธีตรวจสอบที่เร็วที่สุด | วิธีแก้ |
| ------------------------------- | --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
-| เชื่อมต่อแล้วแต่ไม่มีการตอบกลับ DM | `openclaw pairing list whatsapp` | อนุมัติผู้ส่ง หรือเปลี่ยนนโยบาย/allowlist ของ DM |
-| ข้อความกลุ่มถูกละเว้น | ตรวจสอบ `requireMention` + รูปแบบการ mention ใน config | mention บอต หรือผ่อนคลายนโยบายการ mention สำหรับกลุ่มนั้น |
-| การเข้าสู่ระบบด้วย QR หมดเวลาด้วย 408 | ตรวจสอบ env `HTTPS_PROXY` / `HTTP_PROXY` ของ gateway | ตั้งค่า proxy ที่เข้าถึงได้ ใช้ `NO_PROXY` เฉพาะสำหรับการ bypass |
-| การตัดการเชื่อมต่อ/วนเข้าสู่ระบบใหม่แบบสุ่ม | `openclaw channels status --probe` + logs | การ reconnect ล่าสุดจะถูกทำเครื่องหมายแม้ตอนนี้จะเชื่อมต่ออยู่ ดู logs, รีสตาร์ท gateway แล้ว relink หากยังคง flapping ต่อไป |
+| เชื่อมต่อแล้วแต่ไม่มีการตอบกลับ DM | `openclaw pairing list whatsapp` | อนุมัติผู้ส่ง หรือเปลี่ยนนโยบาย/รายการอนุญาตของ DM |
+| ข้อความกลุ่มถูกละเว้น | ตรวจสอบ `requireMention` และรูปแบบการกล่าวถึงในคอนฟิก | กล่าวถึงบอต หรือผ่อนคลายนโยบายการกล่าวถึงสำหรับกลุ่มนั้น |
+| การเข้าสู่ระบบด้วย QR หมดเวลาด้วย 408 | ตรวจสอบ env `HTTPS_PROXY` / `HTTP_PROXY` ของ Gateway | ตั้งค่าพร็อกซีที่เข้าถึงได้ ใช้ `NO_PROXY` เฉพาะสำหรับการข้ามพร็อกซีเท่านั้น |
+| หลุดการเชื่อมต่อ/วนเข้าสู่ระบบใหม่แบบสุ่ม | `openclaw channels status --probe` และบันทึก | การเชื่อมต่อใหม่ล่าสุดจะถูกแจ้งไว้แม้ปัจจุบันจะเชื่อมต่ออยู่ ให้ดูบันทึก รีสตาร์ท Gateway แล้วลิงก์ใหม่หากยังหลุด ๆ ติด ๆ ต่อไป |
-การแก้ปัญหาแบบเต็ม: [การแก้ปัญหา WhatsApp](/th/channels/whatsapp#troubleshooting)
+การแก้ไขปัญหาแบบเต็ม: [การแก้ไขปัญหา WhatsApp](/th/channels/whatsapp#troubleshooting)
## Telegram
-### สัญญาณความล้มเหลวของ Telegram
+### ลักษณะความล้มเหลวของ Telegram
-| อาการ | การตรวจสอบที่เร็วที่สุด | วิธีแก้ |
+| อาการ | วิธีตรวจสอบที่เร็วที่สุด | วิธีแก้ |
| ------------------------------------ | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------- |
-| `/start` แต่ไม่มี flow ตอบกลับที่ใช้งานได้ | `openclaw pairing list telegram` | อนุมัติ pairing หรือเปลี่ยนนโยบาย DM |
-| บอตออนไลน์แต่กลุ่มยังเงียบ | ตรวจสอบข้อกำหนดการ mention และโหมดความเป็นส่วนตัวของบอต | ปิดโหมดความเป็นส่วนตัวเพื่อให้มองเห็นในกลุ่ม หรือ mention บอต |
-| ส่งล้มเหลวพร้อมข้อผิดพลาดเครือข่าย | ตรวจสอบ logs สำหรับความล้มเหลวในการเรียก Telegram API | แก้ DNS/IPv6/proxy routing ไปยัง `api.telegram.org` |
-| ตอนเริ่มต้นรายงานว่า `getMe returned 401` | ตรวจสอบแหล่งที่มาของ token ที่กำหนดค่าไว้ | คัดลอกใหม่หรือสร้าง token ของ BotFather ใหม่ แล้วอัปเดต `botToken`, `tokenFile`, หรือ default-account `TELEGRAM_BOT_TOKEN` |
-| Polling ค้างหรือ reconnect ช้า | `openclaw logs --follow` สำหรับ diagnostics ของ polling | อัปเกรด หากการรีสตาร์ทเป็นผลบวกลวง ให้ปรับ `pollingStallThresholdMs` การค้างต่อเนื่องยังคงชี้ไปที่ proxy/DNS/IPv6 |
-| `setMyCommands` ถูกปฏิเสธตอนเริ่มต้น | ตรวจสอบ logs สำหรับ `BOT_COMMANDS_TOO_MUCH` | ลดคำสั่ง Telegram ของ plugin/skill/custom หรือปิด native menus |
-| อัปเกรดแล้ว allowlist บล็อกคุณ | `openclaw security audit` และ allowlists ใน config | รัน `openclaw doctor --fix` หรือแทนที่ `@username` ด้วย ID ผู้ส่งแบบตัวเลข |
+| `/start` แต่ไม่มีโฟลว์ตอบกลับที่ใช้งานได้ | `openclaw pairing list telegram` | อนุมัติการจับคู่ หรือเปลี่ยนนโยบาย DM |
+| บอตออนไลน์แต่กลุ่มยังเงียบอยู่ | ตรวจสอบข้อกำหนดการกล่าวถึงและโหมดความเป็นส่วนตัวของบอต | ปิดโหมดความเป็นส่วนตัวเพื่อให้มองเห็นกลุ่ม หรือกล่าวถึงบอต |
+| การส่งล้มเหลวพร้อมข้อผิดพลาดเครือข่าย | ตรวจสอบบันทึกเพื่อดูความล้มเหลวของการเรียก Telegram API | แก้ไขการกำหนดเส้นทาง DNS/IPv6/พร็อกซีไปยัง `api.telegram.org` |
+| ตอนเริ่มทำงานรายงานว่า `getMe returned 401` | ตรวจสอบแหล่งที่มาของโทเค็นที่กำหนดค่าไว้ | คัดลอกใหม่หรือสร้างโทเค็น BotFather ใหม่ แล้วอัปเดต `botToken`, `tokenFile` หรือ `TELEGRAM_BOT_TOKEN` ของบัญชีเริ่มต้น |
+| การโพลหยุดค้างหรือเชื่อมต่อใหม่ช้า | `openclaw logs --follow` เพื่อดูการวินิจฉัยการโพล | อัปเกรด หากการรีสตาร์ทเป็นผลบวกลวง ให้ปรับ `pollingStallThresholdMs` การหยุดค้างถาวรยังคงชี้ไปที่พร็อกซี/DNS/IPv6 |
+| `setMyCommands` ถูกปฏิเสธตอนเริ่มทำงาน | ตรวจสอบบันทึกหา `BOT_COMMANDS_TOO_MUCH` | ลดคำสั่ง Plugin/Skill/Telegram แบบกำหนดเอง หรือปิดเมนูเนทีฟ |
+| อัปเกรดแล้วรายการอนุญาตบล็อกคุณ | `openclaw security audit` และรายการอนุญาตในคอนฟิก | รัน `openclaw doctor --fix` หรือแทนที่ `@username` ด้วย ID ผู้ส่งแบบตัวเลข |
-การแก้ปัญหาแบบเต็ม: [การแก้ปัญหา Telegram](/th/channels/telegram#troubleshooting)
+การแก้ไขปัญหาแบบเต็ม: [การแก้ไขปัญหา Telegram](/th/channels/telegram#troubleshooting)
## Discord
-### สัญญาณความล้มเหลวของ Discord
+### ลักษณะความล้มเหลวของ Discord
-| อาการ | การตรวจสอบที่เร็วที่สุด | วิธีแก้ |
-| ------------------------------- | ----------------------------------- | --------------------------------------------------------- |
-| บอตออนไลน์แต่ไม่มีการตอบกลับใน guild | `openclaw channels status --probe` | อนุญาต guild/channel และตรวจสอบ message content intent |
-| ข้อความกลุ่มถูกละเว้น | ตรวจสอบ logs สำหรับการ drop จาก mention gating | mention บอต หรือกำหนด `requireMention: false` ของ guild/channel |
-| ไม่มีการตอบกลับ DM | `openclaw pairing list discord` | อนุมัติ DM pairing หรือปรับนโยบาย DM |
+| อาการ | วิธีตรวจสอบที่เร็วที่สุด | วิธีแก้ |
+| ----------------------------------------- | ---------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| บอตออนไลน์แต่ไม่มีการตอบกลับในกิลด์ | `openclaw channels status --probe` | อนุญาตกิลด์/ช่อง และตรวจสอบ intent สำหรับเนื้อหาข้อความ |
+| ข้อความกลุ่มถูกละเว้น | ตรวจสอบบันทึกหาการทิ้งข้อความจากการกั้นด้วยการกล่าวถึง | กล่าวถึงบอต หรือตั้งค่า `requireMention: false` ให้กับกิลด์/ช่อง |
+| มีการพิมพ์/ใช้โทเค็นแต่ไม่มีข้อความ Discord | บันทึกเซสชันแสดงข้อความผู้ช่วยพร้อม `didSendViaMessagingTool: false` | โมเดลตอบแบบส่วนตัวแทนที่จะเรียกเครื่องมือข้อความ ใช้โมเดลที่เรียกเครื่องมือได้อย่างน่าเชื่อถือ หรือตั้งค่า `messages.groupChat.visibleReplies: "automatic"` เพื่อโพสต์อัตโนมัติ |
+| การตอบกลับ DM หายไป | `openclaw pairing list discord` | อนุมัติการจับคู่ DM หรือปรับนโยบาย DM |
-การแก้ปัญหาแบบเต็ม: [การแก้ปัญหา Discord](/th/channels/discord#troubleshooting)
+การแก้ไขปัญหาแบบเต็ม: [การแก้ไขปัญหา Discord](/th/channels/discord#troubleshooting)
## Slack
-### สัญญาณความล้มเหลวของ Slack
+### ลักษณะความล้มเหลวของ Slack
-| อาการ | การตรวจสอบที่เร็วที่สุด | วิธีแก้ |
+| อาการ | วิธีตรวจสอบที่เร็วที่สุด | วิธีแก้ |
| -------------------------------------- | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Socket mode เชื่อมต่อแล้วแต่ไม่มีการตอบสนอง | `openclaw channels status --probe` | ตรวจสอบ app token + bot token และ scopes ที่จำเป็น เฝ้าดู `botTokenStatus` / `appTokenStatus = configured_unavailable` บนการตั้งค่าที่รองรับด้วย SecretRef |
-| DM ถูกบล็อก | `openclaw pairing list slack` | อนุมัติ pairing หรือผ่อนคลายนโยบาย DM |
-| ข้อความใน channel ถูกละเว้น | ตรวจสอบ `groupPolicy` และ channel allowlist | อนุญาต channel หรือเปลี่ยนนโยบายเป็น `open` |
+| โหมดซ็อกเก็ตเชื่อมต่อแล้วแต่ไม่มีการตอบสนอง | `openclaw channels status --probe` | ตรวจสอบโทเค็นแอป + โทเค็นบอต และ scope ที่จำเป็น ดู `botTokenStatus` / `appTokenStatus = configured_unavailable` ในการตั้งค่าที่ใช้ SecretRef |
+| DM ถูกบล็อก | `openclaw pairing list slack` | อนุมัติการจับคู่ หรือผ่อนคลายนโยบาย DM |
+| ข้อความช่องถูกละเว้น | ตรวจสอบ `groupPolicy` และรายการอนุญาตของช่อง | อนุญาตช่อง หรือเปลี่ยนนโยบายเป็น `open` |
-การแก้ปัญหาแบบเต็ม: [การแก้ปัญหา Slack](/th/channels/slack#troubleshooting)
+การแก้ไขปัญหาแบบเต็ม: [การแก้ไขปัญหา Slack](/th/channels/slack#troubleshooting)
## iMessage และ BlueBubbles
-### สัญญาณความล้มเหลวของ iMessage และ BlueBubbles
+### ลักษณะความล้มเหลวของ iMessage และ BlueBubbles
-| อาการ | การตรวจสอบที่เร็วที่สุด | วิธีแก้ |
+| อาการ | วิธีตรวจสอบที่เร็วที่สุด | วิธีแก้ |
| -------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------- |
-| ไม่มี event ขาเข้า | ตรวจสอบการเข้าถึง webhook/server และสิทธิ์ของแอป | แก้ URL ของ webhook หรือสถานะ server ของ BlueBubbles |
-| ส่งได้แต่รับไม่ได้บน macOS | ตรวจสอบสิทธิ์ความเป็นส่วนตัวของ macOS สำหรับ automation ของ Messages | ให้สิทธิ์ TCC ใหม่ แล้วรีสตาร์ทกระบวนการ channel |
-| ผู้ส่ง DM ถูกบล็อก | `openclaw pairing list imessage` หรือ `openclaw pairing list bluebubbles` | อนุมัติ pairing หรืออัปเดต allowlist |
+| ไม่มีเหตุการณ์ขาเข้า | ตรวจสอบการเข้าถึง Webhook/เซิร์ฟเวอร์และสิทธิ์ของแอป | แก้ไข URL ของ Webhook หรือสถานะเซิร์ฟเวอร์ BlueBubbles |
+| ส่งได้แต่รับไม่ได้บน macOS | ตรวจสอบสิทธิ์ความเป็นส่วนตัวของ macOS สำหรับการทำงานอัตโนมัติของ Messages | ให้สิทธิ์ TCC อีกครั้ง และรีสตาร์ทโปรเซสของช่องทาง |
+| ผู้ส่ง DM ถูกบล็อก | `openclaw pairing list imessage` หรือ `openclaw pairing list bluebubbles` | อนุมัติการจับคู่ หรืออัปเดตรายการอนุญาต |
-การแก้ปัญหาแบบเต็ม:
+การแก้ไขปัญหาแบบเต็ม:
-- [การแก้ปัญหา iMessage](/th/channels/imessage#troubleshooting)
-- [การแก้ปัญหา BlueBubbles](/th/channels/bluebubbles#troubleshooting)
+- [การแก้ไขปัญหา iMessage](/th/channels/imessage#troubleshooting)
+- [การแก้ไขปัญหา BlueBubbles](/th/channels/bluebubbles#troubleshooting)
## Signal
-### สัญญาณความล้มเหลวของ Signal
+### ลักษณะความล้มเหลวของ Signal
-| อาการ | การตรวจสอบที่เร็วที่สุด | วิธีแก้ |
+| อาการ | วิธีตรวจสอบที่เร็วที่สุด | วิธีแก้ |
| ------------------------------- | ------------------------------------------ | -------------------------------------------------------- |
-| Daemon เข้าถึงได้แต่บอตเงียบ | `openclaw channels status --probe` | ตรวจสอบ URL/account ของ daemon `signal-cli` และ receive mode |
-| DM ถูกบล็อก | `openclaw pairing list signal` | อนุมัติผู้ส่ง หรือปรับนโยบาย DM |
-| การตอบกลับกลุ่มไม่ถูก trigger | ตรวจสอบ group allowlist และรูปแบบการ mention | เพิ่มผู้ส่ง/กลุ่ม หรือผ่อนคลาย gating |
+| ดีมอนเข้าถึงได้แต่บอตเงียบ | `openclaw channels status --probe` | ตรวจสอบ URL/บัญชีดีมอน `signal-cli` และโหมดการรับ |
+| DM ถูกบล็อก | `openclaw pairing list signal` | อนุมัติผู้ส่ง หรือปรับนโยบาย DM |
+| การตอบกลับกลุ่มไม่ถูกทริกเกอร์ | ตรวจสอบรายการอนุญาตของกลุ่มและรูปแบบการกล่าวถึง | เพิ่มผู้ส่ง/กลุ่ม หรือผ่อนคลายการกั้น |
-การแก้ปัญหาแบบเต็ม: [การแก้ปัญหา Signal](/th/channels/signal#troubleshooting)
+การแก้ไขปัญหาแบบเต็ม: [การแก้ไขปัญหา Signal](/th/channels/signal#troubleshooting)
## QQ Bot
-### สัญญาณความล้มเหลวของ QQ Bot
+### ลักษณะความล้มเหลวของ QQ Bot
-| อาการ | การตรวจสอบที่เร็วที่สุด | วิธีแก้ |
+| อาการ | วิธีตรวจสอบที่เร็วที่สุด | วิธีแก้ |
| ------------------------------- | ------------------------------------------- | --------------------------------------------------------------- |
-| บอตตอบว่า "ไปดาวอังคารแล้ว" | ตรวจสอบ `appId` และ `clientSecret` ใน config | ตั้งค่า credentials หรือรีสตาร์ท gateway |
-| ไม่มีข้อความขาเข้า | `openclaw channels status --probe` | ตรวจสอบ credentials บน QQ Open Platform |
-| เสียงไม่ได้รับการถอดความ | ตรวจสอบ config ของผู้ให้บริการ STT | กำหนดค่า `channels.qqbot.stt` หรือ `tools.media.audio` |
-| ข้อความเชิงรุกไม่มาถึง | ตรวจสอบข้อกำหนดการโต้ตอบของแพลตฟอร์ม QQ | QQ อาจบล็อกข้อความที่บอตเริ่มก่อน หากไม่มีการโต้ตอบล่าสุด |
+| บอตตอบว่า "gone to Mars" | ตรวจสอบ `appId` และ `clientSecret` ในคอนฟิก | ตั้งค่าข้อมูลประจำตัว หรือรีสตาร์ท Gateway |
+| ไม่มีข้อความขาเข้า | `openclaw channels status --probe` | ตรวจสอบข้อมูลประจำตัวบน QQ Open Platform |
+| เสียงไม่ได้ถูกถอดความ | ตรวจสอบคอนฟิกผู้ให้บริการ STT | กำหนดค่า `channels.qqbot.stt` หรือ `tools.media.audio` |
+| ข้อความเชิงรุกไม่มาถึง | ตรวจสอบข้อกำหนดการโต้ตอบของแพลตฟอร์ม QQ | QQ อาจบล็อกข้อความที่บอตเริ่มเองหากไม่มีการโต้ตอบล่าสุด |
-การแก้ปัญหาแบบเต็ม: [การแก้ปัญหา QQ Bot](/th/channels/qqbot#troubleshooting)
+การแก้ไขปัญหาแบบเต็ม: [การแก้ไขปัญหา QQ Bot](/th/channels/qqbot#troubleshooting)
## Matrix
-### สัญญาณความล้มเหลวของ Matrix
+### ลักษณะความล้มเหลวของ Matrix
-| อาการ | การตรวจสอบที่เร็วที่สุด | วิธีแก้ |
+| อาการ | วิธีตรวจสอบที่เร็วที่สุด | วิธีแก้ |
| ----------------------------------- | -------------------------------------- | ------------------------------------------------------------------------- |
-| เข้าสู่ระบบแล้วแต่ละเว้นข้อความใน room | `openclaw channels status --probe` | ตรวจสอบ `groupPolicy`, room allowlist และ mention gating |
-| DM ไม่ถูกประมวลผล | `openclaw pairing list matrix` | อนุมัติผู้ส่ง หรือปรับนโยบาย DM |
-| rooms ที่เข้ารหัสล้มเหลว | `openclaw matrix verify status` | ยืนยันอุปกรณ์อีกครั้ง แล้วตรวจสอบ `openclaw matrix verify backup status` |
-| การ restore backup ค้างอยู่/เสียหาย | `openclaw matrix verify backup status` | รัน `openclaw matrix verify backup restore` หรือรันใหม่พร้อม recovery key |
-| Cross-signing/bootstrap ดูผิดปกติ | `openclaw matrix verify bootstrap` | ซ่อม secret storage, cross-signing และสถานะ backup ในรอบเดียว |
+| เข้าสู่ระบบแล้วแต่ละเว้นข้อความในห้อง | `openclaw channels status --probe` | ตรวจสอบ `groupPolicy`, รายการอนุญาตของห้อง และการกั้นด้วยการกล่าวถึง |
+| DM ไม่ถูกประมวลผล | `openclaw pairing list matrix` | อนุมัติผู้ส่ง หรือปรับนโยบาย DM |
+| ห้องที่เข้ารหัสล้มเหลว | `openclaw matrix verify status` | ยืนยันอุปกรณ์อีกครั้ง แล้วตรวจสอบ `openclaw matrix verify backup status` |
+| การกู้คืนข้อมูลสำรองค้างอยู่/เสียหาย | `openclaw matrix verify backup status` | รัน `openclaw matrix verify backup restore` หรือรันใหม่พร้อมคีย์กู้คืน |
+| การลงนามข้ามอุปกรณ์/บูตสแตรปดูผิดปกติ | `openclaw matrix verify bootstrap` | ซ่อมแซมพื้นที่จัดเก็บลับ การลงนามข้ามอุปกรณ์ และสถานะข้อมูลสำรองในครั้งเดียว |
-การตั้งค่าและ config แบบเต็ม: [Matrix](/th/channels/matrix)
+การตั้งค่าและคอนฟิกแบบเต็ม: [Matrix](/th/channels/matrix)
## ที่เกี่ยวข้อง
-- [Pairing](/th/channels/pairing)
-- [Channel routing](/th/channels/channel-routing)
-- [การแก้ปัญหา Gateway](/th/gateway/troubleshooting)
+- [การจับคู่](/th/channels/pairing)
+- [การกำหนดเส้นทางช่องทาง](/th/channels/channel-routing)
+- [การแก้ไขปัญหา Gateway](/th/gateway/troubleshooting)
diff --git a/docs/th/cli/doctor.md b/docs/th/cli/doctor.md
index 83411e443..e57055a1f 100644
--- a/docs/th/cli/doctor.md
+++ b/docs/th/cli/doctor.md
@@ -1,14 +1,14 @@
---
read_when:
- - คุณพบปัญหาการเชื่อมต่อ/การตรวจสอบสิทธิ์ และต้องการวิธีแก้ไขแบบมีคำแนะนำ
+ - คุณมีปัญหาด้านการเชื่อมต่อ/การยืนยันตัวตนและต้องการคำแนะนำในการแก้ไข
- คุณอัปเดตแล้วและต้องการตรวจสอบความถูกต้องเบื้องต้น
-summary: ข้อมูลอ้างอิง CLI สำหรับ `openclaw doctor` (การตรวจสอบสถานะ + การซ่อมแซมแบบมีคำแนะนำ)
-title: ตัวตรวจวินิจฉัย
+summary: ข้อมูลอ้างอิง CLI สำหรับ `openclaw doctor` (การตรวจสอบสุขภาพ + การซ่อมแซมแบบมีคำแนะนำ)
+title: ตรวจสุขภาพ
x-i18n:
- generated_at: "2026-05-03T21:28:28Z"
+ generated_at: "2026-05-04T02:22:46Z"
model: gpt-5.5
provider: openai
- source_hash: d4baab5b0cd4d046d12ae5bd14ccf05224115856d45e630a57e77a2be15e5db0
+ source_hash: cd7fb09d373c313e4be45ad9e3b19ceb187a5787ef3e70fcd2b1f1f01b50c905
source_path: cli/doctor.md
workflow: 16
---
@@ -19,7 +19,7 @@ x-i18n:
ที่เกี่ยวข้อง:
-- การแก้ปัญหา: [การแก้ปัญหา](/th/gateway/troubleshooting)
+- การแก้ไขปัญหา: [การแก้ไขปัญหา](/th/gateway/troubleshooting)
- การตรวจสอบความปลอดภัย: [ความปลอดภัย](/th/gateway/security)
## ตัวอย่าง
@@ -36,43 +36,43 @@ openclaw doctor --generate-gateway-token
- `--no-workspace-suggestions`: ปิดคำแนะนำหน่วยความจำ/การค้นหาของเวิร์กสเปซ
- `--yes`: ยอมรับค่าเริ่มต้นโดยไม่ถาม
-- `--repair`: ใช้การซ่อมแซมที่แนะนำซึ่งไม่เกี่ยวกับบริการโดยไม่ถาม; การติดตั้งและการเขียนบริการ Gateway ใหม่ยังต้องมีการยืนยันแบบโต้ตอบหรือคำสั่ง Gateway ที่ระบุชัดเจน
+- `--repair`: ใช้การซ่อมแซมที่แนะนำซึ่งไม่ใช่บริการโดยไม่ถาม; การติดตั้งและการเขียนบริการ Gateway ใหม่ยังคงต้องมีการยืนยันแบบโต้ตอบหรือคำสั่ง Gateway ที่ระบุชัดเจน
- `--fix`: นามแฝงของ `--repair`
-- `--force`: ใช้การซ่อมแซมเชิงรุก รวมถึงการเขียนทับการตั้งค่าบริการแบบกำหนดเองเมื่อจำเป็น
-- `--non-interactive`: รันโดยไม่มีพรอมป์; เฉพาะการย้ายข้อมูลที่ปลอดภัยและการซ่อมแซมที่ไม่เกี่ยวกับบริการ
+- `--force`: ใช้การซ่อมแซมเชิงรุก รวมถึงการเขียนทับการกำหนดค่าบริการแบบกำหนดเองเมื่อจำเป็น
+- `--non-interactive`: รันโดยไม่มีพรอมป์; เฉพาะการย้ายข้อมูลที่ปลอดภัยและการซ่อมแซมที่ไม่ใช่บริการเท่านั้น
- `--generate-gateway-token`: สร้างและกำหนดค่าโทเค็น Gateway
- `--deep`: สแกนบริการระบบเพื่อหาการติดตั้ง Gateway เพิ่มเติม
หมายเหตุ:
-- พรอมป์แบบโต้ตอบ (เช่น การแก้ไข keychain/OAuth) จะรันเฉพาะเมื่อ stdin เป็น TTY และ **ไม่ได้** ตั้งค่า `--non-interactive` การรันแบบไม่มีหัว (cron, Telegram, ไม่มีเทอร์มินัล) จะข้ามพรอมป์
-- ประสิทธิภาพ: การรัน `doctor` แบบไม่โต้ตอบจะข้ามการโหลด Plugin แบบ eager เพื่อให้การตรวจสุขภาพแบบไม่มีหัวทำงานเร็ว เซสชันแบบโต้ตอบยังคงโหลด Plugin ทั้งหมดเมื่อการตรวจต้องใช้ส่วนร่วมจาก Plugin เหล่านั้น
-- `--fix` (นามแฝงของ `--repair`) เขียนข้อมูลสำรองไปที่ `~/.openclaw/openclaw.json.bak` และลบคีย์การตั้งค่าที่ไม่รู้จัก โดยแสดงรายการการลบแต่ละรายการ
-- `doctor --fix --non-interactive` รายงานนิยามบริการ Gateway ที่ขาดหายหรือล้าสมัย แต่จะไม่ติดตั้งหรือเขียนใหม่ภายนอกโหมดซ่อมแซมการอัปเดต รัน `openclaw gateway install` สำหรับบริการที่ขาดหาย หรือ `openclaw gateway install --force` เมื่อคุณตั้งใจจะแทนที่ตัวเรียกใช้งาน
-- ตอนนี้การตรวจความสมบูรณ์ของสถานะตรวจพบไฟล์ทรานสคริปต์กำพร้าในไดเรกทอรีเซสชันแล้ว การเก็บถาวรไฟล์เหล่านั้นเป็น `.deleted.` ต้องมีการยืนยันแบบโต้ตอบ; `--fix`, `--yes` และการรันแบบไม่มีหัวจะปล่อยไฟล์เหล่านั้นไว้ที่เดิม
-- Doctor ยังสแกน `~/.openclaw/cron/jobs.json` (หรือ `cron.store`) เพื่อหารูปแบบงาน cron แบบเก่า และสามารถเขียนใหม่ทับที่เดิมได้ก่อนที่ตัวจัดตารางเวลาจะต้องปรับให้เป็นมาตรฐานอัตโนมัติขณะรันไทม์
-- บน Linux, doctor จะเตือนเมื่อ crontab ของผู้ใช้ยังคงรัน `~/.openclaw/bin/ensure-whatsapp.sh` แบบเก่า; สคริปต์นั้นไม่ได้รับการดูแลอีกต่อไปและอาจบันทึกเหตุขัดข้อง Gateway ของ WhatsApp ที่เป็นเท็จเมื่อ cron ไม่มีสภาพแวดล้อม systemd user-bus
-- Doctor ล้างสถานะการเตรียม dependency ของ Plugin แบบเก่าที่สร้างโดย OpenClaw เวอร์ชันเก่า นอกจากนี้ยังซ่อมแซม Plugin แบบดาวน์โหลดได้ที่ถูกตั้งค่าไว้แต่ขาดหายเมื่อ registry สามารถ resolve ได้ และการรัน doctor ใน 2026.5.2 จะติดตั้ง Plugin แบบดาวน์โหลดได้ที่ config เก่าใช้อยู่โดยอัตโนมัติก่อนทำเครื่องหมายว่า config ถูกแตะสำหรับรีลีสนั้น
-- Doctor ซ่อมแซม config Plugin ที่ล้าสมัยโดยลบ id ของ Plugin ที่ขาดหายจาก `plugins.allow`/`plugins.entries` รวมถึง config ช่องทางที่ค้างอยู่ เป้าหมาย Heartbeat และการ override โมเดลของช่องทางที่ตรงกัน เมื่อการค้นพบ Plugin ทำงานปกติ
-- Doctor กักกัน config Plugin ที่ไม่ถูกต้องโดยปิดใช้งานรายการ `plugins.entries.` ที่ได้รับผลกระทบ และลบ payload `config` ที่ไม่ถูกต้อง การเริ่มต้น Gateway จะข้ามเฉพาะ Plugin ที่เสียอยู่แล้ว เพื่อให้ Plugin และช่องทางอื่น ๆ ทำงานต่อได้
-- ตั้งค่า `OPENCLAW_SERVICE_REPAIR_POLICY=external` เมื่อ supervisor อื่นเป็นเจ้าของวงจรชีวิตของ Gateway Doctor ยังคงรายงานสุขภาพ Gateway/บริการและใช้การซ่อมแซมที่ไม่เกี่ยวกับบริการ แต่ข้ามการติดตั้ง/เริ่ม/รีสตาร์ต/bootstrap บริการและการล้างบริการเก่า
-- บน Linux, doctor จะไม่สนใจหน่วย systemd เพิ่มเติมที่คล้าย Gateway ซึ่ง inactive และจะไม่เขียน metadata ของคำสั่ง/entrypoint ใหม่สำหรับบริการ Gateway ของ systemd ที่กำลังรันอยู่ระหว่างการซ่อมแซม หยุดบริการก่อนหรือใช้ `openclaw gateway install --force` เมื่อคุณตั้งใจจะแทนที่ตัวเรียกใช้งานที่ active อยู่
-- Doctor ย้าย config Talk แบบ flat เก่า (`talk.voiceId`, `talk.modelId` และรายการที่เกี่ยวข้อง) ไปเป็น `talk.provider` + `talk.providers.` โดยอัตโนมัติ
-- การรัน `doctor --fix` ซ้ำจะไม่รายงาน/ใช้การ normalize ของ Talk อีกต่อไปเมื่อความแตกต่างมีเพียงลำดับคีย์ของ object
-- Doctor รวมการตรวจความพร้อมของการค้นหาหน่วยความจำ และสามารถแนะนำ `openclaw configure --section model` เมื่อไม่มี credentials สำหรับ embedding
-- Doctor เตือนเมื่อไม่มีการกำหนดค่าเจ้าของคำสั่ง เจ้าของคำสั่งคือบัญชีผู้ปฏิบัติการที่เป็นมนุษย์ซึ่งได้รับอนุญาตให้รันคำสั่งเฉพาะเจ้าของและอนุมัติการกระทำที่อันตราย การจับคู่ DM เพียงแค่อนุญาตให้ใครบางคนคุยกับบอตได้; หากคุณอนุมัติผู้ส่งก่อนที่ bootstrap เจ้าของคนแรกจะมีอยู่ ให้ตั้งค่า `commands.ownerAllowFrom` อย่างชัดเจน
-- Doctor เตือนเมื่อมีการกำหนดค่าเอเจนต์โหมด Codex และมี asset ของ Codex CLI ส่วนบุคคลอยู่ใน Codex home ของผู้ปฏิบัติการ การเปิด local Codex app-server ใช้ home แยกต่อเอเจนต์ ดังนั้นให้ใช้ `openclaw migrate codex --dry-run` เพื่อทำบัญชี asset ที่ควรถูกเลื่อนสถานะอย่างตั้งใจ
-- Doctor เตือนเมื่อ Skills ที่อนุญาตสำหรับเอเจนต์เริ่มต้นไม่พร้อมใช้งานในสภาพแวดล้อมรันไทม์ปัจจุบัน เพราะขาด bin, env var, config หรือข้อกำหนดของ OS `doctor --fix` สามารถปิดใช้งาน Skills ที่ไม่พร้อมใช้งานเหล่านั้นด้วย `skills.entries..enabled=false`; ให้ติดตั้ง/กำหนดค่าข้อกำหนดที่ขาดแทนเมื่อคุณต้องการให้ Skills นั้นยัง active
-- หากเปิดใช้โหมด sandbox แต่ Docker ไม่พร้อมใช้งาน doctor จะรายงานคำเตือนที่มีสัญญาณชัดเจนพร้อมวิธีแก้ไข (`install Docker` หรือ `openclaw config set agents.defaults.sandbox.mode off`)
-- หากมีไฟล์ registry sandbox แบบเก่า (`~/.openclaw/sandbox/containers.json` หรือ `~/.openclaw/sandbox/browsers.json`) doctor จะรายงานไฟล์เหล่านั้น; `openclaw doctor --fix` จะย้ายรายการที่ถูกต้องไปยังไดเรกทอรี registry แบบ sharded และกักกันไฟล์เก่าที่ไม่ถูกต้อง
-- หาก `gateway.auth.token`/`gateway.auth.password` ถูกจัดการโดย SecretRef และไม่พร้อมใช้งานในเส้นทางคำสั่งปัจจุบัน doctor จะรายงานคำเตือนแบบอ่านอย่างเดียวและจะไม่เขียน credentials fallback แบบ plaintext
-- หากการตรวจสอบ SecretRef ของช่องทางล้มเหลวในเส้นทางการแก้ไข doctor จะดำเนินการต่อและรายงานคำเตือนแทนที่จะออกก่อนเวลา
-- หลังการย้ายข้อมูลไดเรกทอรีสถานะ doctor จะเตือนเมื่อบัญชี Telegram หรือ Discord เริ่มต้นที่เปิดใช้งานอยู่พึ่งพา env fallback และ `TELEGRAM_BOT_TOKEN` หรือ `DISCORD_BOT_TOKEN` ไม่พร้อมใช้งานสำหรับโปรเซส doctor
-- การ resolve ชื่อผู้ใช้ `allowFrom` ของ Telegram โดยอัตโนมัติ (`doctor --fix`) ต้องใช้โทเค็น Telegram ที่ resolve ได้ในเส้นทางคำสั่งปัจจุบัน หากการตรวจสอบโทเค็นไม่พร้อมใช้งาน doctor จะรายงานคำเตือนและข้ามการ resolve อัตโนมัติสำหรับการรันครั้งนั้น
+- พรอมป์แบบโต้ตอบ (เช่น การแก้ไข keychain/OAuth) จะรันเฉพาะเมื่อ stdin เป็น TTY และ **ไม่ได้** ตั้งค่า `--non-interactive` การรันแบบไม่มีหน้าจอ (Cron, Telegram, ไม่มีเทอร์มินัล) จะข้ามพรอมป์
+- ประสิทธิภาพ: การรัน `doctor` แบบไม่โต้ตอบจะข้ามการโหลด Plugin แบบ eager เพื่อให้การตรวจสุขภาพแบบไม่มีหน้าจอยังคงเร็ว เซสชันแบบโต้ตอบยังคงโหลด Plugin ทั้งหมดเมื่อการตรวจสอบต้องใช้ข้อมูลจาก Plugin เหล่านั้น
+- `--fix` (นามแฝงของ `--repair`) เขียนข้อมูลสำรองไปที่ `~/.openclaw/openclaw.json.bak` และลบคีย์การกำหนดค่าที่ไม่รู้จัก พร้อมแสดงรายการการลบแต่ละรายการ
+- `doctor --fix --non-interactive` รายงานนิยามบริการ Gateway ที่หายไปหรือล้าสมัย แต่ไม่ติดตั้งหรือเขียนใหม่ภายนอกโหมดซ่อมแซมการอัปเดต รัน `openclaw gateway install` สำหรับบริการที่หายไป หรือ `openclaw gateway install --force` เมื่อคุณตั้งใจต้องการแทนที่ตัวเรียกใช้งาน
+- การตรวจสอบความถูกต้องของสถานะตอนนี้ตรวจพบไฟล์ transcript กำพร้าในไดเรกทอรีเซสชันแล้ว การเก็บถาวรเป็น `.deleted.` ต้องมีการยืนยันแบบโต้ตอบ; `--fix`, `--yes` และการรันแบบไม่มีหน้าจอจะปล่อยไว้ตามเดิม
+- Doctor ยังสแกน `~/.openclaw/cron/jobs.json` (หรือ `cron.store`) เพื่อหารูปแบบงาน Cron รุ่นเก่า และสามารถเขียนใหม่ในที่เดิมก่อนที่ตัวจัดกำหนดการจะต้องทำให้เป็นมาตรฐานโดยอัตโนมัติในขณะรันไทม์
+- บน Linux, doctor จะเตือนเมื่อ crontab ของผู้ใช้ยังรัน `~/.openclaw/bin/ensure-whatsapp.sh` รุ่นเก่า; สคริปต์นั้นไม่ได้รับการดูแลอีกต่อไป และอาจบันทึกเหตุขัดข้อง Gateway ของ WhatsApp ที่เป็นเท็จเมื่อ Cron ไม่มีสภาพแวดล้อม systemd user-bus
+- Doctor ล้างสถานะการเตรียม dependency ของ Plugin รุ่นเก่าที่สร้างโดย OpenClaw เวอร์ชันเก่า นอกจากนี้ยังซ่อมแซม Plugin แบบดาวน์โหลดได้ที่กำหนดค่าไว้แต่หายไปเมื่อ registry สามารถ resolve ได้ และการผ่าน doctor รุ่น 2026.5.2 จะติดตั้ง Plugin แบบดาวน์โหลดได้ที่การกำหนดค่ารุ่นเก่าใช้อยู่แล้วโดยอัตโนมัติก่อนทำเครื่องหมายว่าการกำหนดค่านั้นถูกแตะสำหรับรุ่นดังกล่าว หากดาวน์โหลดล้มเหลว doctor จะรายงานข้อผิดพลาดการติดตั้งและคงรายการ Plugin ที่กำหนดค่าไว้สำหรับความพยายามซ่อมแซมครั้งถัดไป
+- Doctor ซ่อมแซมการกำหนดค่า Plugin ที่ล้าสมัยโดยลบ id ของ Plugin ที่หายไปออกจาก `plugins.allow`/`plugins.entries` รวมถึงการกำหนดค่าช่องทางที่ค้างอยู่ เป้าหมาย Heartbeat และการ override โมเดลของช่องทางที่ตรงกันเมื่อการค้นพบ Plugin ทำงานปกติ
+- Doctor กักกันการกำหนดค่า Plugin ที่ไม่ถูกต้องโดยปิดใช้งานรายการ `plugins.entries.` ที่ได้รับผลกระทบและลบ payload `config` ที่ไม่ถูกต้องออก การเริ่มต้น Gateway ข้ามเฉพาะ Plugin ที่เสียรายการนั้นอยู่แล้ว เพื่อให้ Plugin และช่องทางอื่น ๆ ทำงานต่อได้
+- ตั้งค่า `OPENCLAW_SERVICE_REPAIR_POLICY=external` เมื่อ supervisor อื่นเป็นเจ้าของวงจรชีวิตของ Gateway Doctor ยังคงรายงานสุขภาพของ Gateway/บริการและใช้การซ่อมแซมที่ไม่ใช่บริการ แต่ข้ามการติดตั้ง/เริ่ม/รีสตาร์ต/bootstrap บริการ และการล้างบริการรุ่นเก่า
+- บน Linux, doctor จะละเว้น systemd unit ลักษณะคล้าย Gateway เพิ่มเติมที่ไม่ทำงาน และไม่เขียน metadata ของคำสั่ง/entrypoint ใหม่สำหรับบริการ Gateway ของ systemd ที่กำลังทำงานระหว่างการซ่อมแซม หยุดบริการก่อน หรือใช้ `openclaw gateway install --force` เมื่อคุณตั้งใจต้องการแทนที่ตัวเรียกใช้งานที่ใช้งานอยู่
+- Doctor ย้ายการกำหนดค่า Talk แบบ flat รุ่นเก่า (`talk.voiceId`, `talk.modelId` และรายการที่เกี่ยวข้อง) ไปเป็น `talk.provider` + `talk.providers.` โดยอัตโนมัติ
+- การรัน `doctor --fix` ซ้ำจะไม่รายงาน/ใช้การทำให้ Talk เป็นมาตรฐานอีกต่อไปเมื่อความแตกต่างเดียวคือการเรียงลำดับคีย์ของออบเจ็กต์
+- Doctor รวมการตรวจสอบความพร้อมของการค้นหาหน่วยความจำ และสามารถแนะนำ `openclaw configure --section model` เมื่อข้อมูลรับรอง embedding หายไป
+- Doctor เตือนเมื่อไม่ได้กำหนดค่าเจ้าของคำสั่ง เจ้าของคำสั่งคือบัญชีผู้ปฏิบัติงานที่เป็นมนุษย์ซึ่งได้รับอนุญาตให้รันคำสั่งสำหรับเจ้าของเท่านั้นและอนุมัติการดำเนินการที่อันตราย การจับคู่ DM แค่อนุญาตให้บางคนคุยกับบอทได้; หากคุณเคยอนุมัติผู้ส่งก่อนมี bootstrap เจ้าของคนแรก ให้ตั้งค่า `commands.ownerAllowFrom` อย่างชัดเจน
+- Doctor เตือนเมื่อมีการกำหนดค่า agent โหมด Codex และมี asset ของ Codex CLI ส่วนบุคคลอยู่ใน Codex home ของผู้ปฏิบัติงาน การเปิดใช้ app-server ของ Codex ในเครื่องใช้ home แยกต่อ agent ดังนั้นให้ใช้ `openclaw migrate codex --dry-run` เพื่อทำบัญชี asset ที่ควรเลื่อนระดับอย่างตั้งใจ
+- Doctor เตือนเมื่อ Skills ที่อนุญาตสำหรับ agent เริ่มต้นไม่พร้อมใช้งานในสภาพแวดล้อมรันไทม์ปัจจุบันเนื่องจาก bins, env vars, config หรือข้อกำหนดของ OS หายไป `doctor --fix` สามารถปิดใช้งาน Skills ที่ไม่พร้อมใช้งานเหล่านั้นด้วย `skills.entries..enabled=false`; ให้ติดตั้ง/กำหนดค่าข้อกำหนดที่หายไปแทนเมื่อคุณต้องการให้ skill ยังคงทำงานอยู่
+- หากเปิดใช้งานโหมด sandbox แต่ Docker ไม่พร้อมใช้งาน doctor จะรายงานคำเตือนที่มีสัญญาณชัดเจนพร้อมวิธีแก้ไข (`install Docker` หรือ `openclaw config set agents.defaults.sandbox.mode off`)
+- หากมีไฟล์ registry ของ sandbox รุ่นเก่า (`~/.openclaw/sandbox/containers.json` หรือ `~/.openclaw/sandbox/browsers.json`) doctor จะรายงานไฟล์เหล่านั้น; `openclaw doctor --fix` จะย้ายรายการที่ถูกต้องเข้าไปในไดเรกทอรี registry แบบ sharded และกักกันไฟล์รุ่นเก่าที่ไม่ถูกต้อง
+- หาก `gateway.auth.token`/`gateway.auth.password` จัดการด้วย SecretRef และไม่พร้อมใช้งานในเส้นทางคำสั่งปัจจุบัน doctor จะรายงานคำเตือนแบบอ่านอย่างเดียวและไม่เขียนข้อมูลรับรอง fallback แบบ plaintext
+- หากการตรวจสอบ SecretRef ของช่องทางล้มเหลวในเส้นทาง fix doctor จะทำงานต่อและรายงานคำเตือนแทนที่จะออกก่อนกำหนด
+- หลังจากการย้ายไดเรกทอรีสถานะ doctor จะเตือนเมื่อบัญชี Telegram หรือ Discord เริ่มต้นที่เปิดใช้งานพึ่งพา env fallback และ `TELEGRAM_BOT_TOKEN` หรือ `DISCORD_BOT_TOKEN` ไม่พร้อมใช้งานกับโปรเซส doctor
+- การ resolve ชื่อผู้ใช้ `allowFrom` ของ Telegram โดยอัตโนมัติ (`doctor --fix`) ต้องใช้โทเค็น Telegram ที่ resolve ได้ในเส้นทางคำสั่งปัจจุบัน หากไม่สามารถตรวจสอบโทเค็นได้ doctor จะรายงานคำเตือนและข้ามการ resolve อัตโนมัติสำหรับรอบนั้น
## macOS: การ override env ของ `launchctl`
-หากก่อนหน้านี้คุณรัน `launchctl setenv OPENCLAW_GATEWAY_TOKEN ...` (หรือ `...PASSWORD`) ค่านั้นจะ override ไฟล์ config ของคุณและอาจทำให้เกิดข้อผิดพลาด “unauthorized” ต่อเนื่องได้
+หากคุณเคยรัน `launchctl setenv OPENCLAW_GATEWAY_TOKEN ...` (หรือ `...PASSWORD`) ค่านั้นจะ override ไฟล์การกำหนดค่าของคุณและอาจทำให้เกิดข้อผิดพลาด “ไม่ได้รับอนุญาต” อย่างต่อเนื่อง
```bash
launchctl getenv OPENCLAW_GATEWAY_TOKEN
@@ -84,5 +84,5 @@ launchctl unsetenv OPENCLAW_GATEWAY_PASSWORD
## ที่เกี่ยวข้อง
-- [เอกสารอ้างอิง CLI](/th/cli)
+- [อ้างอิง CLI](/th/cli)
- [Gateway doctor](/th/gateway/doctor)
diff --git a/docs/th/concepts/agent.md b/docs/th/concepts/agent.md
index 2235ad209..fb4eebbe3 100644
--- a/docs/th/concepts/agent.md
+++ b/docs/th/concepts/agent.md
@@ -1,54 +1,54 @@
---
read_when:
- - การเปลี่ยนรันไทม์ของเอเจนต์, การบูตสแตรปเวิร์กสเปซ หรือพฤติกรรมของเซสชัน
-summary: รันไทม์ของเอเจนต์ สัญญาพื้นที่ทำงาน และการบูตสแตรปเซสชัน
+ - การเปลี่ยนรันไทม์ของเอเจนต์ การเริ่มต้นพื้นที่ทำงาน หรือพฤติกรรมของเซสชัน
+summary: รันไทม์ของเอเจนต์ ข้อตกลงของเวิร์กสเปซ และการบูตสแตรปเซสชัน
title: รันไทม์ของเอเจนต์
x-i18n:
- generated_at: "2026-04-30T09:45:45Z"
+ generated_at: "2026-05-04T02:22:44Z"
model: gpt-5.5
provider: openai
- source_hash: f4d65ee96cece296251d7d3a0512f12d2dfa900db0e5ffc0f37dcddae7ea55ad
+ source_hash: 89bbbd05a9bf2054d3a1f24aeed005a05b61152a047b593addfb46817baae05a
source_path: concepts/agent.md
workflow: 16
---
-OpenClaw เรียกใช้ **รันไทม์เอเจนต์แบบฝังตัวตัวเดียว** — หนึ่งโปรเซสเอเจนต์ต่อหนึ่ง
-Gateway พร้อมพื้นที่ทำงาน ไฟล์บูตสแตรป และที่เก็บเซสชันของตัวเอง หน้านี้
-ครอบคลุมสัญญาของรันไทม์นั้น: พื้นที่ทำงานต้องมีอะไรบ้าง ไฟล์ใดถูก
+OpenClaw เรียกใช้ **รันไทม์เอเจนต์แบบฝังตัวเพียงหนึ่งเดียว** — หนึ่งโปรเซสเอเจนต์ต่อ
+Gateway พร้อมเวิร์กสเปซ ไฟล์บูตสแตรป และที่เก็บเซสชันของตัวเอง หน้านี้
+ครอบคลุมสัญญาของรันไทม์นั้น: เวิร์กสเปซต้องมีอะไรบ้าง ไฟล์ใดถูก
ฉีดเข้าไป และเซสชันบูตสแตรปกับสิ่งนั้นอย่างไร
-## พื้นที่ทำงาน (จำเป็น)
+## เวิร์กสเปซ (จำเป็น)
-OpenClaw ใช้ไดเรกทอรีพื้นที่ทำงานเอเจนต์เดียว (`agents.defaults.workspace`) เป็นไดเรกทอรีทำงาน (`cwd`) **เดียวเท่านั้น** ของเอเจนต์สำหรับเครื่องมือและบริบท
+OpenClaw ใช้ไดเรกทอรีเวิร์กสเปซเอเจนต์เดียว (`agents.defaults.workspace`) เป็นไดเรกทอรีทำงาน (`cwd`) **เพียงแห่งเดียว** ของเอเจนต์สำหรับเครื่องมือและบริบท
-แนะนำ: ใช้ `openclaw setup` เพื่อสร้าง `~/.openclaw/openclaw.json` หากยังไม่มี และเริ่มต้นไฟล์พื้นที่ทำงาน
+แนะนำ: ใช้ `openclaw setup` เพื่อสร้าง `~/.openclaw/openclaw.json` หากยังไม่มี และเริ่มต้นไฟล์เวิร์กสเปซ
-เค้าโครงพื้นที่ทำงานแบบเต็ม + คู่มือการสำรองข้อมูล: [พื้นที่ทำงานของเอเจนต์](/th/concepts/agent-workspace)
+เลย์เอาต์เวิร์กสเปซฉบับเต็ม + คู่มือสำรองข้อมูล: [เวิร์กสเปซเอเจนต์](/th/concepts/agent-workspace)
-หากเปิดใช้งาน `agents.defaults.sandbox` เซสชันที่ไม่ใช่เซสชันหลักสามารถแทนที่สิ่งนี้ด้วย
-พื้นที่ทำงานรายเซสชันภายใต้ `agents.defaults.sandbox.workspaceRoot` (ดู
+หากเปิดใช้ `agents.defaults.sandbox` เซสชันที่ไม่ใช่ main สามารถแทนที่ค่านี้ด้วย
+เวิร์กสเปซรายเซสชันภายใต้ `agents.defaults.sandbox.workspaceRoot` ได้ (ดู
[การกำหนดค่า Gateway](/th/gateway/configuration))
-## ไฟล์บูตสแตรป (ฉีดเข้าไป)
+## ไฟล์บูตสแตรป (ถูกฉีดเข้าไป)
-ภายใน `agents.defaults.workspace` OpenClaw คาดว่าจะมีไฟล์ที่ผู้ใช้แก้ไขได้เหล่านี้:
+ภายใน `agents.defaults.workspace` OpenClaw คาดหวังไฟล์ที่ผู้ใช้แก้ไขได้เหล่านี้:
-- `AGENTS.md` — คำสั่งการทำงาน + “หน่วยความจำ”
+- `AGENTS.md` — คำแนะนำการทำงาน + “ความจำ”
- `SOUL.md` — บุคลิก ขอบเขต น้ำเสียง
-- `TOOLS.md` — บันทึกเครื่องมือที่ผู้ใช้ดูแลเอง (เช่น `imsg`, `sag`, ข้อตกลง)
-- `BOOTSTRAP.md` — พิธีใช้งานครั้งแรกแบบครั้งเดียว (ลบหลังเสร็จสิ้น)
+- `TOOLS.md` — บันทึกเครื่องมือที่ผู้ใช้ดูแลเอง (เช่น `imsg`, `sag`, ข้อตกลงต่าง ๆ)
+- `BOOTSTRAP.md` — พิธีเริ่มใช้งานครั้งแรกแบบทำครั้งเดียว (ลบหลังเสร็จสิ้น)
- `IDENTITY.md` — ชื่อ/บรรยากาศ/อีโมจิของเอเจนต์
-- `USER.md` — โปรไฟล์ผู้ใช้ + คำเรียกที่ต้องการ
+- `USER.md` — โปรไฟล์ผู้ใช้ + วิธีเรียกที่ต้องการ
-ในเทิร์นแรกของเซสชันใหม่ OpenClaw จะฉีดเนื้อหาของไฟล์เหล่านี้เข้าไปในบริบทเอเจนต์โดยตรง
+ในเทิร์นแรกของเซสชันใหม่ OpenClaw จะฉีดเนื้อหาของไฟล์เหล่านี้เข้าไปในบริบทโปรเจกต์ของพรอมป์ระบบ
-ไฟล์ว่างจะถูกข้าม ไฟล์ขนาดใหญ่จะถูกตัดและย่อพร้อมเครื่องหมายกำกับเพื่อให้พรอมป์ยังคงกระชับ (อ่านไฟล์เพื่อดูเนื้อหาเต็ม)
+ไฟล์ว่างจะถูกข้าม ไฟล์ขนาดใหญ่จะถูกตัดให้กระชับและตัดท้ายพร้อมมาร์กเกอร์เพื่อให้พรอมป์ยังคงกะทัดรัด (อ่านไฟล์เพื่อดูเนื้อหาฉบับเต็ม)
-หากไฟล์หายไป OpenClaw จะฉีดบรรทัดเครื่องหมาย “ไฟล์หายไป” เพียงบรรทัดเดียว (และ `openclaw setup` จะสร้างเทมเพลตเริ่มต้นที่ปลอดภัยให้)
+หากไฟล์ขาดหาย OpenClaw จะฉีดบรรทัดมาร์กเกอร์ “ไฟล์ขาดหาย” เพียงบรรทัดเดียว (และ `openclaw setup` จะสร้างเทมเพลตค่าเริ่มต้นที่ปลอดภัยให้)
-`BOOTSTRAP.md` จะถูกสร้างเฉพาะสำหรับ **พื้นที่ทำงานใหม่เอี่ยม** (ไม่มีไฟล์บูตสแตรปอื่นอยู่) หากคุณลบไฟล์นี้หลังทำพิธีเสร็จแล้ว ไม่ควรถูกสร้างขึ้นใหม่ในการรีสตาร์ตภายหลัง
+`BOOTSTRAP.md` จะถูกสร้างเฉพาะสำหรับ **เวิร์กสเปซใหม่เอี่ยม** (ไม่มีไฟล์บูตสแตรปอื่นอยู่เลย) ขณะที่ยังค้างอยู่ OpenClaw จะเก็บไฟล์นี้ไว้ในบริบทโปรเจกต์และเพิ่มคำแนะนำบูตสแตรปในพรอมป์ระบบสำหรับพิธีเริ่มต้น แทนที่จะคัดลอกเข้าไปในข้อความผู้ใช้ หากคุณลบไฟล์นี้หลังทำพิธีเสร็จแล้ว ไม่ควรถูกสร้างขึ้นใหม่ในการเริ่มระบบครั้งต่อ ๆ ไป
-หากต้องการปิดการสร้างไฟล์บูตสแตรปทั้งหมด (สำหรับพื้นที่ทำงานที่เตรียมข้อมูลไว้ล่วงหน้า) ให้ตั้งค่า:
+หากต้องการปิดการสร้างไฟล์บูตสแตรปทั้งหมด (สำหรับเวิร์กสเปซที่เตรียมไว้ล่วงหน้า) ให้ตั้งค่า:
```json5
{ agents: { defaults: { skipBootstrap: true } } }
@@ -56,76 +56,76 @@ OpenClaw ใช้ไดเรกทอรีพื้นที่ทำงา
## เครื่องมือในตัว
-เครื่องมือหลัก (read/exec/edit/write และเครื่องมือระบบที่เกี่ยวข้อง) พร้อมใช้งานเสมอ
-ภายใต้นโยบายเครื่องมือ `apply_patch` เป็นตัวเลือกเสริมและถูกควบคุมด้วย
+เครื่องมือหลัก (อ่าน/ดำเนินการ/แก้ไข/เขียน และเครื่องมือระบบที่เกี่ยวข้อง) พร้อมใช้งานเสมอ
+ภายใต้นโยบายเครื่องมือ `apply_patch` เป็นตัวเลือกและถูกควบคุมด้วย
`tools.exec.applyPatch` `TOOLS.md` **ไม่ได้** ควบคุมว่ามีเครื่องมือใดอยู่บ้าง แต่เป็น
-แนวทางว่าคุณต้องการให้ใช้เครื่องมือเหล่านั้นอย่างไร
+คำแนะนำว่าคุณต้องการให้ใช้เครื่องมือเหล่านั้น _อย่างไร_
## Skills
OpenClaw โหลด Skills จากตำแหน่งเหล่านี้ (ลำดับความสำคัญสูงสุดมาก่อน):
-- พื้นที่ทำงาน: `/skills`
-- Skills ของเอเจนต์โปรเจกต์: `/.agents/skills`
-- Skills ของเอเจนต์ส่วนตัว: `~/.agents/skills`
-- แบบจัดการ/ภายในเครื่อง: `~/.openclaw/skills`
-- ที่มาพร้อมชุดติดตั้ง (จัดส่งมากับการติดตั้ง)
+- เวิร์กสเปซ: `/skills`
+- Skills เอเจนต์ของโปรเจกต์: `/.agents/skills`
+- Skills เอเจนต์ส่วนตัว: `~/.agents/skills`
+- ที่จัดการ/โลคัล: `~/.openclaw/skills`
+- ที่รวมมากับชุดติดตั้ง (ส่งมาพร้อมการติดตั้ง)
- โฟลเดอร์ Skills เพิ่มเติม: `skills.load.extraDirs`
-Skills สามารถถูกควบคุมด้วย config/env (ดู `skills` ใน [การกำหนดค่า Gateway](/th/gateway/configuration))
+Skills สามารถถูกควบคุมด้วยการกำหนดค่า/ตัวแปรสภาพแวดล้อมได้ (ดู `skills` ใน [การกำหนดค่า Gateway](/th/gateway/configuration))
## ขอบเขตรันไทม์
-รันไทม์เอเจนต์แบบฝังตัวสร้างอยู่บนแกนเอเจนต์ Pi (โมเดล เครื่องมือ และ
-ไปป์ไลน์พรอมป์) การจัดการเซสชัน การค้นพบ การเชื่อมสายเครื่องมือ และการส่งมอบผ่านช่องทาง
-เป็นเลเยอร์ที่ OpenClaw เป็นเจ้าของซึ่งอยู่เหนือแกนนั้น
+รันไทม์เอเจนต์แบบฝังตัวสร้างบนแกนเอเจนต์ Pi (โมเดล เครื่องมือ และ
+ไปป์ไลน์พรอมป์) การจัดการเซสชัน การค้นพบ การเชื่อมเครื่องมือ และการส่งมอบผ่านช่องทาง
+เป็นเลเยอร์ที่ OpenClaw เป็นเจ้าของซึ่งอยู่เหนือแกนดังกล่าว
## เซสชัน
-ทรานสคริปต์เซสชันถูกเก็บเป็น JSONL ที่:
+ทรานสคริปต์เซสชันถูกจัดเก็บเป็น JSONL ที่:
- `~/.openclaw/agents//sessions/.jsonl`
-ID เซสชันมีความคงที่และ OpenClaw เป็นผู้เลือก
-โฟลเดอร์เซสชันเก่าจากเครื่องมืออื่นจะไม่ถูกอ่าน
+ID เซสชันมีความเสถียรและถูกเลือกโดย OpenClaw
+โฟลเดอร์เซสชันเดิมจากเครื่องมืออื่นจะไม่ถูกอ่าน
-## การบังคับทิศทางระหว่างสตรีม
+## การกำกับขณะสตรีม
-เมื่อโหมดคิวเป็น `steer` ข้อความขาเข้าจะถูกฉีดเข้าไปในรันปัจจุบัน
-การบังคับทิศทางที่อยู่ในคิวจะถูกส่งมอบ **หลังจากเทิร์นผู้ช่วยปัจจุบันดำเนินการ
-เรียกเครื่องมือเสร็จแล้ว** ก่อนการเรียก LLM ครั้งถัดไป Pi จะระบายข้อความ
-การบังคับทิศทางที่ค้างอยู่ทั้งหมดพร้อมกันสำหรับ `steer`; `queue` แบบเดิมจะระบายหนึ่งข้อความต่อ
-ขอบเขตโมเดลหนึ่งครั้ง การบังคับทิศทางจะไม่ข้ามการเรียกเครื่องมือที่เหลือจากข้อความ
-ผู้ช่วยปัจจุบันอีกต่อไป
+เมื่อโหมดคิวเป็น `steer` ข้อความขาเข้าจะถูกฉีดเข้าไปในการรันปัจจุบัน
+การกำกับที่อยู่ในคิวจะถูกส่งมอบ **หลังจากเทิร์นผู้ช่วยปัจจุบันดำเนินการ
+เรียกเครื่องมือเสร็จสิ้นแล้ว** ก่อนการเรียก LLM ถัดไป Pi จะระบายข้อความกำกับ
+ที่ค้างอยู่ทั้งหมดพร้อมกันสำหรับ `steer`; `queue` แบบเดิมจะระบายหนึ่งข้อความต่อ
+ขอบเขตโมเดล การกำกับจะไม่ข้ามการเรียกเครื่องมือที่เหลืออยู่จากข้อความผู้ช่วย
+ปัจจุบันอีกต่อไป
เมื่อโหมดคิวเป็น `followup` หรือ `collect` ข้อความขาเข้าจะถูกพักไว้จนกว่า
เทิร์นปัจจุบันจะจบ จากนั้นเทิร์นเอเจนต์ใหม่จะเริ่มพร้อมเพย์โหลดที่อยู่ในคิว ดู
-[คิว](/th/concepts/queue) และ [คิวการบังคับทิศทาง](/th/concepts/queue-steering) สำหรับพฤติกรรมของโหมด
+[คิว](/th/concepts/queue) และ [คิวกำกับ](/th/concepts/queue-steering) สำหรับพฤติกรรมของโหมด
และขอบเขต
-การสตรีมบล็อกจะส่งบล็อกผู้ช่วยที่เสร็จสมบูรณ์ทันทีที่เสร็จ; ฟีเจอร์นี้
-**ปิดตามค่าเริ่มต้น** (`agents.defaults.blockStreamingDefault: "off"`)
-ปรับขอบเขตผ่าน `agents.defaults.blockStreamingBreak` (`text_end` เทียบกับ `message_end`; ค่าเริ่มต้นคือ text_end)
-ควบคุมการแบ่งชังก์บล็อกแบบอ่อนด้วย `agents.defaults.blockStreamingChunk` (ค่าเริ่มต้น
-800–1200 อักขระ; ให้ความสำคัญกับการแบ่งย่อหน้า จากนั้นบรรทัดใหม่ และประโยคเป็นลำดับสุดท้าย)
-รวมชังก์ที่สตรีมด้วย `agents.defaults.blockStreamingCoalesce` เพื่อลดสแปม
-บรรทัดเดียว (รวมตามช่วงว่างก่อนส่ง) ช่องทางที่ไม่ใช่ Telegram ต้องมี
+การสตรีมแบบบล็อกจะส่งบล็อกผู้ช่วยที่เสร็จสมบูรณ์ทันทีที่บล็อกนั้นเสร็จ; โดย
+**ปิดเป็นค่าเริ่มต้น** (`agents.defaults.blockStreamingDefault: "off"`)
+ปรับขอบเขตผ่าน `agents.defaults.blockStreamingBreak` (`text_end` เทียบกับ `message_end`; ค่าเริ่มต้นเป็น text_end)
+ควบคุมการแบ่งชังก์บล็อกแบบนุ่มนวลด้วย `agents.defaults.blockStreamingChunk` (ค่าเริ่มต้น
+800–1200 อักขระ; ให้ความสำคัญกับการแบ่งย่อหน้า จากนั้นขึ้นบรรทัดใหม่; ประโยคเป็นลำดับสุดท้าย)
+รวมชังก์ที่สตรีมด้วย `agents.defaults.blockStreamingCoalesce` เพื่อลด
+สแปมบรรทัดเดียว (รวมตามช่วงว่างก่อนส่ง) ช่องทางที่ไม่ใช่ Telegram ต้องใช้
`*.blockStreaming: true` อย่างชัดเจนเพื่อเปิดใช้การตอบกลับแบบบล็อก
-สรุปเครื่องมือแบบละเอียดจะถูกปล่อยเมื่อเครื่องมือเริ่มทำงาน (ไม่มี debounce); Control UI
+สรุปเครื่องมือแบบละเอียดจะถูกปล่อยเมื่อเครื่องมือเริ่มทำงาน (ไม่มีดีเบานซ์); Control UI
สตรีมเอาต์พุตเครื่องมือผ่านเหตุการณ์เอเจนต์เมื่อพร้อมใช้งาน
รายละเอียดเพิ่มเติม: [การสตรีม + การแบ่งชังก์](/th/concepts/streaming)
## การอ้างอิงโมเดล
-การอ้างอิงโมเดลใน config (ตัวอย่างเช่น `agents.defaults.model` และ `agents.defaults.models`) จะถูกแยกโดยแบ่งที่ `/` ตัว **แรก**
+การอ้างอิงโมเดลในการกำหนดค่า (เช่น `agents.defaults.model` และ `agents.defaults.models`) จะถูกแยกโดยแบ่งที่ `/` **ตัวแรก**
- ใช้ `provider/model` เมื่อกำหนดค่าโมเดล
- หาก ID โมเดลเองมี `/` (แบบ OpenRouter) ให้ใส่คำนำหน้าผู้ให้บริการ (ตัวอย่าง: `openrouter/moonshotai/kimi-k2`)
-- หากคุณละผู้ให้บริการไว้ OpenClaw จะลองใช้นามแฝงก่อน จากนั้นจึงหาคู่ที่ตรงกับ
- ผู้ให้บริการที่กำหนดค่าไว้และไม่ซ้ำสำหรับ ID โมเดลนั้นแบบตรงตัว และหลังจากนั้นจึงค่อย fallback
- ไปยังผู้ให้บริการเริ่มต้นที่กำหนดค่าไว้ หากผู้ให้บริการนั้นไม่เปิดเผยโมเดลเริ่มต้น
- ที่กำหนดค่าไว้แล้ว OpenClaw จะ fallback ไปยังผู้ให้บริการ/โมเดลที่กำหนดค่าไว้รายการแรก
- แทนการแสดงค่าเริ่มต้นของผู้ให้บริการที่ถูกลบไปและล้าสมัย
+- หากคุณละผู้ให้บริการไว้ OpenClaw จะลองใช้นามแฝงก่อน จากนั้นจึงจับคู่กับ
+ ผู้ให้บริการที่กำหนดค่าไว้ซึ่งไม่ซ้ำกันสำหรับ ID โมเดลที่ตรงกันนั้น และหลังจากนั้นเท่านั้นจึงจะถอยกลับ
+ ไปใช้ผู้ให้บริการค่าเริ่มต้นที่กำหนดค่าไว้ หากผู้ให้บริการนั้นไม่เผยแพร่
+ โมเดลค่าเริ่มต้นที่กำหนดค่าไว้อีกต่อไป OpenClaw จะถอยกลับไปยัง
+ ผู้ให้บริการ/โมเดลที่กำหนดค่าไว้ตัวแรก แทนที่จะแสดงค่าเริ่มต้นของผู้ให้บริการที่ถูกลบไปแล้วซึ่งล้าสมัย
## การกำหนดค่า (ขั้นต่ำ)
@@ -136,10 +136,10 @@ ID เซสชันมีความคงที่และ OpenClaw เป
---
-_ถัดไป: [แชตกลุ่ม](/th/channels/group-messages)_ 🦞
+_ถัดไป: [แชทกลุ่ม](/th/channels/group-messages)_ 🦞
## ที่เกี่ยวข้อง
-- [พื้นที่ทำงานของเอเจนต์](/th/concepts/agent-workspace)
+- [เวิร์กสเปซเอเจนต์](/th/concepts/agent-workspace)
- [การกำหนดเส้นทางหลายเอเจนต์](/th/concepts/multi-agent)
- [การจัดการเซสชัน](/th/concepts/session)
diff --git a/docs/th/concepts/mantis.md b/docs/th/concepts/mantis.md
index de6d62d4e..c66f4133a 100644
--- a/docs/th/concepts/mantis.md
+++ b/docs/th/concepts/mantis.md
@@ -1,58 +1,58 @@
---
read_when:
- - การสร้างหรือเรียกใช้การประกันคุณภาพด้านภาพแบบสดสำหรับข้อบกพร่องของ OpenClaw
+ - การสร้างหรือเรียกใช้การตรวจสอบคุณภาพด้านภาพแบบสดสำหรับข้อบกพร่องของ OpenClaw
- การเพิ่มการตรวจสอบก่อนและหลังสำหรับคำขอดึง
- - การเพิ่มสถานการณ์การรับส่งแบบสดสำหรับ Discord, Slack, WhatsApp หรือช่องทางอื่น ๆ
+ - การเพิ่มสถานการณ์การรับส่งแบบสดสำหรับ Discord, Slack, WhatsApp หรืออื่นๆ
- การดีบักการรัน QA ที่ต้องใช้ภาพหน้าจอ การทำงานอัตโนมัติของเบราว์เซอร์ หรือการเข้าถึง VNC
-summary: Mantis คือระบบตรวจสอบยืนยันเชิงภาพตั้งแต่ต้นจนจบสำหรับทำซ้ำบั๊กของ OpenClaw บนทรานสปอร์ตจริง บันทึกหลักฐานก่อนและหลัง และแนบอาร์ติแฟกต์ไปยังคำขอรวมโค้ด
+summary: Mantis คือระบบตรวจสอบด้วยภาพแบบต้นทางถึงปลายทางสำหรับจำลองบั๊กของ OpenClaw ซ้ำบนทรานสปอร์ตที่ใช้งานจริง บันทึกหลักฐานก่อนและหลัง และแนบอาร์ติแฟกต์ไปยัง PR
title: ตั๊กแตนตำข้าว
x-i18n:
- generated_at: "2026-05-03T21:30:32Z"
+ generated_at: "2026-05-04T02:23:26Z"
model: gpt-5.5
provider: openai
- source_hash: 3463882b01a7941f6d758c509d6cd70e099aa8352053347fa9c37a80e5b256ce
+ source_hash: 5a86ab4bc876d1c53ada1c30580034165f028194a072f559eb54a898a369211d
source_path: concepts/mantis.md
workflow: 16
---
-Mantis คือระบบตรวจสอบแบบ end-to-end ของ OpenClaw สำหรับบั๊กที่ต้องใช้รันไทม์จริง ทรานสปอร์ตจริง และหลักฐานที่มองเห็นได้ ระบบจะรันสถานการณ์กับเรฟที่ทราบว่าเสีย เก็บหลักฐาน รันสถานการณ์เดียวกันกับเรฟตัวเลือก แล้วเผยแพร่การเปรียบเทียบเป็นอาร์ติแฟกต์ที่ผู้ดูแลสามารถตรวจสอบได้จาก PR หรือจากคำสั่งภายในเครื่อง
+Mantis คือระบบตรวจสอบแบบต้นทางถึงปลายทางของ OpenClaw สำหรับบั๊กที่ต้องใช้แรนไทม์จริง ทรานสปอร์ตจริง และหลักฐานที่มองเห็นได้ ระบบจะรันสถานการณ์กับ ref ที่ทราบว่ามีปัญหา เก็บหลักฐาน รันสถานการณ์เดียวกันกับ ref candidate แล้วเผยแพร่การเปรียบเทียบเป็นอาร์ติแฟกต์ที่ผู้ดูแลสามารถตรวจสอบได้จาก PR หรือจากคำสั่งภายในเครื่อง
-Mantis เริ่มจาก Discord เพราะ Discord ให้เลนแรกที่มีคุณค่าสูงแก่เรา: การยืนยันตัวตนบอตจริง แชนเนลกิลด์จริง รีแอ็กชัน เธรด คำสั่งเนทีฟ และ UI บนเบราว์เซอร์ที่มนุษย์สามารถยืนยันด้วยสายตาได้ว่าทรานสปอร์ตแสดงอะไร
+Mantis เริ่มจาก Discord เพราะ Discord ให้เลนแรกที่มีคุณค่าสูงแก่เรา: การยืนยันตัวตนบอตจริง ช่องกิลด์จริง รีแอ็กชัน เธรด คำสั่งเนทีฟ และ UI บนเบราว์เซอร์ที่มนุษย์สามารถยืนยันด้วยสายตาได้ว่าทรานสปอร์ตแสดงอะไร
## เป้าหมาย
- ทำซ้ำบั๊กจาก issue หรือ PR บน GitHub ด้วยรูปแบบทรานสปอร์ตเดียวกับที่ผู้ใช้เห็น
-- เก็บอาร์ติแฟกต์ **ก่อนแก้** บนเรฟฐานก่อนใช้การแก้ไข
-- เก็บอาร์ติแฟกต์ **หลังแก้** บนเรฟตัวเลือกหลังใช้การแก้ไข
-- ใช้ตัวชี้ขาดที่กำหนดได้แน่นอนเมื่อเป็นไปได้ เช่น การอ่านรีแอ็กชันผ่าน Discord REST หรือการตรวจทรานสคริปต์ของแชนเนล
+- เก็บอาร์ติแฟกต์ **ก่อน** บน ref พื้นฐานก่อนใช้การแก้ไข
+- เก็บอาร์ติแฟกต์ **หลัง** บน ref candidate หลังใช้การแก้ไข
+- ใช้ oracle แบบกำหนดแน่นอนเมื่อทำได้ เช่น การอ่านรีแอ็กชันผ่าน Discord REST หรือการตรวจทรานสคริปต์ของช่อง
- เก็บภาพหน้าจอเมื่อบั๊กมีพื้นผิว UI ที่มองเห็นได้
-- รันภายในเครื่องจาก CLI ที่เอเจนต์ควบคุม และรันระยะไกลจาก GitHub
-- เก็บสถานะเครื่องให้เพียงพอสำหรับการกู้ผ่าน VNC เมื่อการเข้าสู่ระบบ ระบบอัตโนมัติของเบราว์เซอร์ หรือการยืนยันตัวตนกับผู้ให้บริการติดขัด
-- โพสต์สถานะที่กระชับไปยังแชนเนล Discord สำหรับผู้ปฏิบัติการเมื่อการรันถูกบล็อก ต้องการความช่วยเหลือผ่าน VNC แบบแมนนวล หรือเสร็จสิ้น
+- รันภายในเครื่องจาก CLI ที่ agent ควบคุม และรันระยะไกลจาก GitHub
+- เก็บสถานะเครื่องให้เพียงพอสำหรับการกู้ผ่าน VNC เมื่อการเข้าสู่ระบบ ระบบอัตโนมัติของเบราว์เซอร์ หรือการยืนยันตัวตนของผู้ให้บริการติดขัด
+- โพสต์สถานะอย่างกระชับไปยังช่อง Discord ของโอเปอเรเตอร์เมื่อการรันถูกบล็อก ต้องการความช่วยเหลือผ่าน VNC แบบแมนนวล หรือเสร็จสิ้น
## สิ่งที่ไม่ใช่เป้าหมาย
-- Mantis ไม่ใช่สิ่งทดแทน unit tests โดยปกติการรัน Mantis ควรถูกแปลงเป็นการทดสอบถดถอยที่เล็กลงหลังเข้าใจการแก้ไขแล้ว
-- Mantis ไม่ใช่เกต CI ปกติที่รวดเร็ว ระบบช้ากว่า ใช้ข้อมูลลับจริง และสงวนไว้สำหรับบั๊กที่สภาพแวดล้อมจริงมีความสำคัญ
-- Mantis ไม่ควรต้องมีมนุษย์สำหรับการทำงานปกติ VNC แบบแมนนวลคือเส้นทางกู้คืน ไม่ใช่เส้นทางหลัก
-- Mantis ไม่เก็บข้อมูลลับดิบไว้ในอาร์ติแฟกต์ ล็อก ภาพหน้าจอ รายงาน Markdown หรือคอมเมนต์ PR
+- Mantis ไม่ใช่สิ่งทดแทน unit test โดยปกติการรัน Mantis ควรถูกแปลงเป็น regression test ที่เล็กลงหลังจากเข้าใจการแก้ไขแล้ว
+- Mantis ไม่ใช่ gate CI ที่รวดเร็วตามปกติ ระบบนี้ช้ากว่า ใช้ข้อมูลประจำตัวจริง และสงวนไว้สำหรับบั๊กที่สภาพแวดล้อมจริงมีความสำคัญ
+- Mantis ไม่ควรต้องพึ่งมนุษย์ในการทำงานตามปกติ VNC แบบแมนนวลเป็นเส้นทางกู้คืน ไม่ใช่เส้นทางปกติ
+- Mantis ไม่เก็บความลับดิบไว้ในอาร์ติแฟกต์ ล็อก ภาพหน้าจอ รายงาน Markdown หรือคอมเมนต์ PR
## ความเป็นเจ้าของ
-Mantis อยู่ในสแตก QA ของ OpenClaw
+Mantis อยู่ในสแต็ก QA ของ OpenClaw
-- OpenClaw เป็นเจ้าของรันไทม์สถานการณ์ อะแดปเตอร์ทรานสปอร์ต สคีมาหลักฐาน และ CLI ภายในเครื่องใต้ `pnpm openclaw qa mantis`
-- QA Lab เป็นเจ้าของชิ้นส่วนชุดทดสอบทรานสปอร์ตจริง ตัวช่วยจับภาพเบราว์เซอร์ และตัวเขียนอาร์ติแฟกต์
-- Crabbox เป็นเจ้าของเครื่อง Linux ที่อุ่นไว้แล้วเมื่อจำเป็นต้องใช้ VM ระยะไกล
-- GitHub Actions เป็นเจ้าของจุดเข้าเวิร์กโฟลว์ระยะไกลและการเก็บรักษาอาร์ติแฟกต์
-- ClawSweeper เป็นเจ้าของการกำหนดเส้นทางคอมเมนต์ GitHub: การแยกวิเคราะห์คำสั่งผู้ดูแล การ dispatch เวิร์กโฟลว์ และการโพสต์คอมเมนต์ PR สุดท้าย
-- เอเจนต์ OpenClaw ขับเคลื่อน Mantis ผ่าน Codex เมื่อสถานการณ์ต้องการการตั้งค่าแบบเอเจนต์ การดีบัก หรือการรายงานสถานะติดขัด
+- OpenClaw เป็นเจ้าของแรนไทม์สถานการณ์ อะแดปเตอร์ทรานสปอร์ต สคีมาหลักฐาน และ CLI ภายในเครื่องภายใต้ `pnpm openclaw qa mantis`
+- QA Lab เป็นเจ้าของชิ้นส่วนฮาร์เนสของทรานสปอร์ตจริง ตัวช่วยเก็บภาพเบราว์เซอร์ และตัวเขียนอาร์ติแฟกต์
+- Crabbox เป็นเจ้าของเครื่อง Linux ที่วอร์มไว้เมื่อจำเป็นต้องใช้ VM ระยะไกล
+- GitHub Actions เป็นเจ้าของจุดเข้าของเวิร์กโฟลว์ระยะไกลและการเก็บรักษาอาร์ติแฟกต์
+- ClawSweeper เป็นเจ้าของการกำหนดเส้นทางคอมเมนต์ GitHub: การแยกคำสั่งผู้ดูแล การ dispatch เวิร์กโฟลว์ และการโพสต์คอมเมนต์ PR สุดท้าย
+- agent ของ OpenClaw ขับเคลื่อน Mantis ผ่าน Codex เมื่อสถานการณ์ต้องการการตั้งค่าแบบ agentic การดีบัก หรือการรายงานสถานะค้าง
-ขอบเขตนี้เก็บความรู้ด้านทรานสปอร์ตไว้ใน OpenClaw การจัดตารางเครื่องไว้ใน Crabbox และกาวเชื่อมเวิร์กโฟลว์ผู้ดูแลไว้ใน ClawSweeper
+ขอบเขตนี้ทำให้ความรู้ด้านทรานสปอร์ตอยู่ใน OpenClaw การจัดกำหนดการเครื่องอยู่ใน Crabbox และกาวเชื่อมเวิร์กโฟลว์ผู้ดูแลอยู่ใน ClawSweeper
## รูปแบบคำสั่ง
-คำสั่งภายในเครื่องแรกตรวจสอบบอต Discord, กิลด์, แชนเนล, การส่งข้อความ, การส่งรีแอ็กชัน และพาธอาร์ติแฟกต์:
+คำสั่งภายในเครื่องแรกตรวจสอบบอต Discord, กิลด์, ช่อง, การส่งข้อความ, การส่งรีแอ็กชัน และพาธอาร์ติแฟกต์:
```bash
pnpm openclaw qa mantis discord-smoke \
@@ -70,22 +70,39 @@ pnpm openclaw qa mantis run \
--output-dir .artifacts/qa-e2e/mantis/local-discord-status-reactions
```
-ตัวรันสร้าง worktree ฐานและตัวเลือกแบบ detached ใต้ไดเรกทอรีเอาต์พุต ติดตั้ง dependencies สร้างแต่ละเรฟ รันสถานการณ์ด้วย `--allow-failures` จากนั้นเขียน `baseline/`, `candidate/`, `comparison.json` และ `mantis-report.md` สำหรับสถานการณ์ Discord แรก การตรวจสอบที่สำเร็จหมายถึงสถานะฐานคือ `fail` และสถานะตัวเลือกคือ `pass`
+ตัวรันสร้าง worktree แบบ detached สำหรับ baseline และ candidate ภายใต้ไดเรกทอรีเอาต์พุต ติดตั้ง dependency บิลด์แต่ละ ref รันสถานการณ์ด้วย `--allow-failures` จากนั้นเขียน `baseline/`, `candidate/`, `comparison.json` และ `mantis-report.md` สำหรับสถานการณ์ Discord แรก การตรวจสอบที่สำเร็จหมายความว่าสถานะ baseline คือ `fail` และสถานะ candidate คือ `pass`
-เวิร์กโฟลว์ smoke ของ GitHub คือ `Mantis Discord Smoke` เวิร์กโฟลว์ก่อนและหลังบน GitHub สำหรับสถานการณ์จริงแรกคือ `Mantis Discord Status Reactions` โดยรับค่า:
+primitive แรกของ VM/เบราว์เซอร์คือ desktop smoke:
-- `baseline_ref`: เรฟที่คาดว่าจะทำซ้ำพฤติกรรม queued-only
-- `candidate_ref`: เรฟที่คาดว่าจะแสดง `queued -> thinking -> done`
+```bash
+pnpm openclaw qa mantis desktop-browser-smoke \
+ --output-dir .artifacts/qa-e2e/mantis/desktop-browser
+```
-ระบบจะเช็คเอาต์เรฟชุดทดสอบเวิร์กโฟลว์ สร้าง worktree ฐานและตัวเลือกแยกกัน รัน `discord-status-reactions-tool-only` กับแต่ละ worktree และอัปโหลด `baseline/`, `candidate/`, `comparison.json` และ `mantis-report.md` เป็นอาร์ติแฟกต์ของ Actions
+คำสั่งนี้เช่าหรือนำเครื่องเดสก์ท็อป Crabbox มาใช้ซ้ำ เริ่มเบราว์เซอร์ที่มองเห็นได้ภายในเซสชัน VNC เก็บภาพเดสก์ท็อป ดึงอาร์ติแฟกต์กลับมายังไดเรกทอรีเอาต์พุตภายในเครื่อง และเขียนคำสั่งเชื่อมต่อใหม่ลงในรายงาน คำสั่งตั้งค่าเริ่มต้นเป็นผู้ให้บริการ Hetzner เพราะเป็นผู้ให้บริการรายแรกที่มี desktop/VNC coverage ที่ทำงานได้ในเลน Mantis แทนที่ได้ด้วย `--provider`, `--crabbox-bin` หรือ `OPENCLAW_MANTIS_CRABBOX_PROVIDER` เมื่อรันกับฟลีต Crabbox อื่น
-คุณยังสามารถทริกเกอร์การรัน status-reactions โดยตรงจากคอมเมนต์ PR ได้:
+แฟล็ก desktop smoke ที่มีประโยชน์:
+
+- `--lease-id ` หรือ `OPENCLAW_MANTIS_CRABBOX_LEASE_ID` นำเดสก์ท็อปที่วอร์มไว้มาใช้ซ้ำ
+- `--browser-url ` เปลี่ยนหน้าที่เปิดในเบราว์เซอร์ที่มองเห็นได้
+- `--html-file ` เรนเดอร์อาร์ติแฟกต์ HTML ภายใน repo ในเบราว์เซอร์ที่มองเห็นได้ Mantis ใช้สิ่งนี้เพื่อเก็บภาพไทม์ไลน์ Discord status-reaction ที่สร้างขึ้นผ่านเดสก์ท็อป Crabbox จริง
+- `--keep-lease` หรือ `OPENCLAW_MANTIS_KEEP_VM=1` คง lease ที่สร้างใหม่และผ่านไว้สำหรับการตรวจสอบผ่าน VNC การรันที่ล้มเหลวจะคง lease ไว้ตามค่าเริ่มต้นเมื่อมีการสร้าง lease เพื่อให้โอเปอเรเตอร์เชื่อมต่อใหม่ได้
+- `--class`, `--idle-timeout` และ `--ttl` ปรับขนาดเครื่องและอายุของ lease
+
+เวิร์กโฟลว์ smoke บน GitHub คือ `Mantis Discord Smoke` เวิร์กโฟลว์ก่อนและหลังบน GitHub สำหรับสถานการณ์จริงแรกคือ `Mantis Discord Status Reactions` โดยรับ:
+
+- `baseline_ref`: ref ที่คาดว่าจะทำซ้ำพฤติกรรม queued-only
+- `candidate_ref`: ref ที่คาดว่าจะแสดง `queued -> thinking -> done`
+
+เวิร์กโฟลว์ checkout ref ของฮาร์เนสเวิร์กโฟลว์ บิลด์ worktree baseline และ candidate แยกกัน รัน `discord-status-reactions-tool-only` กับแต่ละ worktree และอัปโหลด `baseline/`, `candidate/`, `comparison.json` และ `mantis-report.md` เป็นอาร์ติแฟกต์ของ Actions นอกจากนี้ยังเรนเดอร์ HTML ไทม์ไลน์ของแต่ละเลนในเบราว์เซอร์เดสก์ท็อป Crabbox และเผยแพร่ภาพหน้าจอ VNC เหล่านั้นคู่กับ PNG ไทม์ไลน์แบบกำหนดแน่นอนในคอมเมนต์ PR เวิร์กโฟลว์บิลด์ Crabbox CLI จาก `openclaw/crabbox` main เพื่อให้ใช้แฟล็ก desktop/browser lease ปัจจุบันได้ก่อนที่จะตัด release ไบนารี Crabbox ถัดไป
+
+คุณยังสามารถทริกเกอร์การรัน status-reactions โดยตรงจากคอมเมนต์ PR:
```text
@Mantis discord status reactions
```
-ทริกเกอร์คอมเมนต์ถูกจำกัดไว้อย่างตั้งใจ โดยจะรันเฉพาะคอมเมนต์ใน pull request จากผู้ใช้ที่มีสิทธิ์ write, maintain หรือ admin และจะจดจำเฉพาะคำขอ status-reaction ของ Discord เท่านั้น โดยค่าเริ่มต้นจะใช้เรฟฐานที่ทราบว่าเสีย และ SHA ของหัว PR ปัจจุบันเป็นตัวเลือก ผู้ดูแลสามารถแทนที่เรฟใดก็ได้:
+ทริกเกอร์คอมเมนต์นี้ตั้งใจให้แคบ โดยจะรันเฉพาะบนคอมเมนต์ pull request จากผู้ใช้ที่มีสิทธิ์ write, maintain หรือ admin และจะรู้จักเฉพาะคำขอ Discord status-reaction เท่านั้น ตามค่าเริ่มต้นจะใช้ ref พื้นฐานที่ทราบว่ามีปัญหาและ SHA ของหัว PR ปัจจุบันเป็น candidate ผู้ดูแลสามารถแทนที่ ref ใดก็ได้:
```text
@Mantis discord status reactions baseline=origin/main candidate=HEAD
@@ -98,42 +115,43 @@ pnpm openclaw qa mantis run \
@clawsweeper verify e2e discord
```
-คำสั่งแรกระบุชัดเจนและโฟกัสที่สถานการณ์ คำสั่งที่สองสามารถแมป PR หรือ issue ไปยังสถานการณ์ Mantis ที่แนะนำจาก labels, ไฟล์ที่เปลี่ยน และข้อค้นพบจากการรีวิวของ ClawSweeper ได้ในภายหลัง
+คำสั่งแรกระบุชัดเจนและมุ่งเน้นสถานการณ์ คำสั่งที่สองสามารถแมป PR หรือ issue ไปยังสถานการณ์ Mantis ที่แนะนำได้ในภายหลังจากป้ายกำกับ ไฟล์ที่เปลี่ยน และข้อค้นพบจากรีวิวของ ClawSweeper
## วงจรชีวิตการรัน
-1. รับ credentials
+1. รับข้อมูลประจำตัว
2. จัดสรรหรือนำ VM มาใช้ซ้ำ
-3. เตรียม checkout ที่สะอาดสำหรับเรฟฐาน
-4. ติดตั้ง dependencies และ build เฉพาะสิ่งที่สถานการณ์ต้องใช้
-5. เริ่ม OpenClaw Gateway ลูกด้วยไดเรกทอรีสถานะแยก
-6. กำหนดค่าทรานสปอร์ตจริง ผู้ให้บริการ โมเดล และโปรไฟล์เบราว์เซอร์
-7. รันสถานการณ์และเก็บหลักฐานฐาน
-8. หยุด Gateway และเก็บล็อกไว้
-9. เตรียมเรฟตัวเลือกใน VM เดียวกัน
-10. รันสถานการณ์เดียวกันและเก็บหลักฐานตัวเลือก
-11. เปรียบเทียบผลตัวชี้ขาดและหลักฐานภาพ
-12. เขียน Markdown, JSON, ล็อก, ภาพหน้าจอ และอาร์ติแฟกต์ trace ทางเลือก
-13. อัปโหลดอาร์ติแฟกต์ GitHub Actions
-14. โพสต์ข้อความสถานะ PR หรือ Discord ที่กระชับ
+3. เตรียมโปรไฟล์เดสก์ท็อป/เบราว์เซอร์เมื่อสถานการณ์ต้องการหลักฐาน UI
+4. เตรียม checkout ที่สะอาดสำหรับ ref พื้นฐาน
+5. ติดตั้ง dependency และบิลด์เฉพาะสิ่งที่สถานการณ์ต้องใช้
+6. เริ่ม OpenClaw Gateway ลูกด้วยไดเรกทอรีสถานะแบบแยก
+7. กำหนดค่าทรานสปอร์ตจริง ผู้ให้บริการ โมเดล และโปรไฟล์เบราว์เซอร์
+8. รันสถานการณ์และเก็บหลักฐาน baseline
+9. หยุด gateway และเก็บรักษาล็อก
+10. เตรียม ref candidate ใน VM เดียวกัน
+11. รันสถานการณ์เดียวกันและเก็บหลักฐาน candidate
+12. เปรียบเทียบผลลัพธ์ oracle และหลักฐานภาพ
+13. เขียน Markdown, JSON, ล็อก, ภาพหน้าจอ และอาร์ติแฟกต์ trace ที่เป็นตัวเลือก
+14. อัปโหลดอาร์ติแฟกต์ GitHub Actions
+15. โพสต์ข้อความสถานะ PR หรือ Discord แบบกระชับ
-สถานการณ์ควรล้มเหลวได้สองแบบที่ต่างกัน:
+สถานการณ์ควรล้มเหลวได้สองแบบที่แตกต่างกัน:
-- **ทำซ้ำบั๊กได้**: ฐานล้มเหลวตามวิธีที่คาดไว้
-- **ชุดทดสอบล้มเหลว**: การตั้งค่าสภาพแวดล้อม, credentials, Discord API, เบราว์เซอร์ หรือผู้ให้บริการล้มเหลวก่อนที่ตัวชี้ขาดของบั๊กจะมีความหมาย
+- **ทำซ้ำบั๊กได้**: baseline ล้มเหลวในแบบที่คาดไว้
+- **ฮาร์เนสล้มเหลว**: การตั้งค่าสภาพแวดล้อม ข้อมูลประจำตัว Discord API เบราว์เซอร์ หรือผู้ให้บริการล้มเหลวก่อนที่ bug oracle จะมีความหมาย
-รายงานสุดท้ายต้องแยกกรณีเหล่านี้เพื่อให้ผู้ดูแลไม่สับสนระหว่างสภาพแวดล้อมที่ไม่เสถียรกับพฤติกรรมของผลิตภัณฑ์
+รายงานสุดท้ายต้องแยกกรณีเหล่านี้เพื่อให้ผู้ดูแลไม่สับสนระหว่างสภาพแวดล้อมที่ไม่นิ่งกับพฤติกรรมของผลิตภัณฑ์
-## Discord MVP
+## MVP ของ Discord
-สถานการณ์แรกควรมุ่งไปที่รีแอ็กชันสถานะของ Discord ในแชนเนลกิลด์ที่โหมดการส่งคำตอบต้นทางเป็น `message_tool_only`
+สถานการณ์แรกควรมุ่งเป้าไปที่ Discord status reactions ในช่องกิลด์ที่โหมดส่ง reply ต้นทางคือ `message_tool_only`
-เหตุผลที่เป็นจุดเริ่มต้น Mantis ที่ดี:
+เหตุผลที่เป็น seed ที่ดีสำหรับ Mantis:
- มองเห็นได้ใน Discord เป็นรีแอ็กชันบนข้อความที่ทริกเกอร์
-- มีตัวชี้ขาด REST ที่แข็งแรงผ่านสถานะรีแอ็กชันของข้อความ Discord
-- ครอบคลุม OpenClaw Gateway จริง การยืนยันตัวตนบอต Discord การ dispatch ข้อความ โหมดการส่งคำตอบต้นทาง สถานะรีแอ็กชันสถานะ และวงจรชีวิต turn ของโมเดล
-- แคบพอที่จะทำให้การใช้งานครั้งแรกตรงไปตรงมา
+- มี REST oracle ที่แข็งแรงผ่านสถานะรีแอ็กชันของข้อความ Discord
+- ครอบคลุม OpenClaw Gateway จริง การยืนยันตัวตนบอต Discord การ dispatch ข้อความ โหมดส่ง reply ต้นทาง สถานะรีแอ็กชัน และวงจรชีวิต turn ของโมเดล
+- แคบพอที่จะทำให้การติดตั้งใช้งานครั้งแรกตรงไปตรงมา
รูปแบบสถานการณ์ที่คาดไว้:
@@ -166,9 +184,9 @@ evidence:
screenshotMessageRow: true
```
-หลักฐานฐานควรแสดงรีแอ็กชันตอบรับแบบ queued แต่ไม่มีการเปลี่ยนผ่านวงจรชีวิตในโหมด tool-only หลักฐานตัวเลือกควรแสดงรีแอ็กชันสถานะตามวงจรชีวิตที่รันเมื่อ `messages.statusReactions.enabled` เป็น true อย่างชัดเจน
+หลักฐาน baseline ควรแสดงรีแอ็กชัน acknowledgement แบบ queued แต่ไม่มี lifecycle transition ในโหมด tool-only หลักฐาน candidate ควรแสดง lifecycle status reactions ที่ทำงานเมื่อ `messages.statusReactions.enabled` เป็น true อย่างชัดเจน
-ส่วนแรกที่รันได้คือสถานการณ์ QA จริงของ Discord แบบ opt-in:
+slice แรกที่รันได้คือสถานการณ์ QA จริงของ Discord แบบ opt-in:
```bash
pnpm openclaw qa discord \
@@ -180,19 +198,20 @@ pnpm openclaw qa discord \
--output-dir .artifacts/qa-e2e/mantis/discord-status-reactions-candidate
```
-ระบบกำหนดค่า SUT ด้วยการจัดการกิลด์แบบเปิดตลอด, `visibleReplies: "message_tool"`, `ackReaction: "👀"` และรีแอ็กชันสถานะอย่างชัดเจน ตัวชี้ขาดจะโพลข้อความ Discord จริงที่ทริกเกอร์ และคาดหวังลำดับที่สังเกตได้ `👀 -> 🤔 -> 👍` อาร์ติแฟกต์ประกอบด้วย `discord-qa-reaction-timelines.json`, `discord-status-reactions-tool-only-timeline.html` และ `discord-status-reactions-tool-only-timeline.png`
+คำสั่งนี้กำหนดค่า SUT ให้จัดการกิลด์แบบเปิดตลอด, `visibleReplies:
+"message_tool"`, `ackReaction: "👀"` และ status reactions ที่ระบุชัดเจน oracle จะ poll ข้อความ Discord ที่ทริกเกอร์จริงและคาดหวังลำดับที่สังเกตได้คือ `👀 -> 🤔 -> 👍` อาร์ติแฟกต์ประกอบด้วย `discord-qa-reaction-timelines.json`, `discord-status-reactions-tool-only-timeline.html` และ `discord-status-reactions-tool-only-timeline.png`
-## ชิ้นส่วน QA ที่มีอยู่
+## ส่วนประกอบ QA ที่มีอยู่
-Mantis ควรต่อยอดจากสแตก QA ส่วนตัวที่มีอยู่แทนที่จะเริ่มจากศูนย์:
+Mantis ควรต่อยอดจากสแต็ก QA ส่วนตัวที่มีอยู่แทนที่จะเริ่มจากศูนย์:
- `pnpm openclaw qa discord` รันเลน Discord จริงพร้อมบอต driver และ SUT อยู่แล้ว
-- ตัวรันทรานสปอร์ตจริงเขียนรายงานและอาร์ติแฟกต์ observed-message ใต้ `.artifacts/qa-e2e/` อยู่แล้ว
-- การเช่า credential ของ Convex ให้สิทธิ์เข้าถึง credentials ทรานสปอร์ตจริงแบบใช้ร่วมกันอย่างเป็นเอกสิทธิ์อยู่แล้ว
-- บริการควบคุมเบราว์เซอร์รองรับภาพหน้าจอ สแนปชอต โปรไฟล์แบบจัดการ headless และโปรไฟล์ CDP ระยะไกลอยู่แล้ว
-- QA Lab มี UI ดีบักเกอร์และบัสสำหรับการทดสอบที่มีรูปแบบทรานสปอร์ตอยู่แล้ว
+- ตัวรันทรานสปอร์ตจริงเขียนรายงานและอาร์ติแฟกต์ observed-message ภายใต้ `.artifacts/qa-e2e/` อยู่แล้ว
+- lease ข้อมูลประจำตัว Convex ให้สิทธิ์เข้าถึงข้อมูลประจำตัวทรานสปอร์ตจริงที่ใช้ร่วมกันแบบเอกสิทธิ์อยู่แล้ว
+- บริการควบคุมเบราว์เซอร์รองรับภาพหน้าจอ สแนปช็อต โปรไฟล์ managed แบบ headless และโปรไฟล์ CDP ระยะไกลอยู่แล้ว
+- QA Lab มี UI ดีบักเกอร์และ bus สำหรับการทดสอบที่มีรูปแบบเหมือนทรานสปอร์ตอยู่แล้ว
-การใช้งาน Mantis ครั้งแรกสามารถเป็นตัวรันก่อน/หลังบางๆ บนชิ้นส่วนเหล่านี้ พร้อมชั้นหลักฐานภาพหนึ่งชั้น
+การติดตั้ง Mantis ครั้งแรกสามารถเป็นตัวรันก่อน/หลังแบบบางบนชิ้นส่วนเหล่านี้ พร้อมชั้นหลักฐานภาพหนึ่งชั้น
## โมเดลหลักฐาน
@@ -216,65 +235,73 @@ Mantis ควรต่อยอดจากสแตก QA ส่วนตัว
run.log
```
-`mantis-summary.json` ควรเป็นแหล่งความจริงที่เครื่องอ่านได้ รายงาน Markdown มีไว้สำหรับคอมเมนต์ PR และการรีวิวโดยมนุษย์
+`mantis-summary.json` ควรเป็นแหล่งความจริงที่เครื่องอ่านได้ รายงาน Markdown ใช้สำหรับคอมเมนต์ PR และการรีวิวโดยมนุษย์
-สรุปต้องมี:
+summary ต้องมี:
-- refs และ SHAs ที่ทดสอบ
+- ref และ SHA ที่ทดสอบ
- ทรานสปอร์ตและรหัสสถานการณ์
- ผู้ให้บริการเครื่องและรหัสเครื่องหรือรหัส lease
-- แหล่งที่มาของ credential โดยไม่มีค่าลับ
-- ผลลัพธ์ฐาน
-- ผลลัพธ์ตัวเลือก
-- บั๊กทำซ้ำบนฐานได้หรือไม่
-- ตัวเลือกแก้ไขได้หรือไม่
+- แหล่งข้อมูลประจำตัวโดยไม่มีค่าความลับ
+- ผลลัพธ์ baseline
+- ผลลัพธ์ candidate
+- บั๊กถูกทำซ้ำบน baseline หรือไม่
+- candidate แก้ไขได้หรือไม่
- พาธอาร์ติแฟกต์
-- ปัญหาการตั้งค่าหรือการล้างข้อมูลที่ sanitize แล้ว
+- ปัญหาการตั้งค่าหรือการล้างข้อมูลที่ผ่านการทำให้ปลอดภัยแล้ว
-ภาพหน้าจอคือหลักฐาน ไม่ใช่ข้อมูลลับ แต่ยังต้องมีวินัยในการ redaction: ชื่อแชนเนลส่วนตัว ชื่อผู้ใช้ หรือเนื้อหาข้อความอาจปรากฏ สำหรับ PR สาธารณะ ให้ใช้ลิงก์อาร์ติแฟกต์ GitHub Actions แทนภาพแบบ inline จนกว่าเรื่องการ redaction จะแข็งแรงขึ้น
+ภาพหน้าจอคือหลักฐาน ไม่ใช่ความลับ แต่ยังต้องมีวินัยด้านการ redact: ชื่อช่องส่วนตัว ชื่อผู้ใช้ หรือเนื้อหาข้อความอาจปรากฏ สำหรับ PR สาธารณะ ให้ใช้ลิงก์อาร์ติแฟกต์ GitHub Actions แทนภาพ inline จนกว่าเรื่องการ redact จะแข็งแรงขึ้น
## เบราว์เซอร์และ VNC
เลนเบราว์เซอร์มีสองโหมด:
-- **ระบบอัตโนมัติแบบ headless**: ค่าเริ่มต้นสำหรับ CI โดย Chrome รันพร้อมเปิด CDP และ Playwright หรือระบบควบคุมเบราว์เซอร์ของ OpenClaw จะจับภาพหน้าจอ
-- **การกู้ผ่าน VNC**: เปิดใช้บน VM เดียวกันเมื่อการเข้าสู่ระบบ, MFA, การป้องกันอัตโนมัติของ Discord หรือการดีบักภาพต้องการมนุษย์
+- **ระบบอัตโนมัติแบบ headless**: ค่าเริ่มต้นสำหรับ CI Chrome รันโดยเปิด CDP และ Playwright หรือการควบคุมเบราว์เซอร์ของ OpenClaw จะเก็บภาพหน้าจอ
+- **การกู้ผ่าน VNC**: เปิดใช้บน VM เดียวกันเมื่อการเข้าสู่ระบบ MFA ระบบป้องกันอัตโนมัติของ Discord หรือการดีบักภาพต้องใช้มนุษย์
-โปรไฟล์เบราว์เซอร์ผู้สังเกตการณ์ Discord ควรคงอยู่เพียงพอเพื่อหลีกเลี่ยงการเข้าสู่ระบบทุกครั้งที่รัน แต่แยกออกจากสถานะเบราว์เซอร์ส่วนตัว โปรไฟล์เป็นของพูลเครื่อง Mantis ไม่ใช่แล็ปท็อปของนักพัฒนา
+โปรไฟล์เบราว์เซอร์ผู้สังเกตการณ์ Discord ควรคงอยู่เพียงพอเพื่อหลีกเลี่ยง
+การเข้าสู่ระบบทุกครั้งที่รัน แต่ต้องแยกจากสถานะเบราว์เซอร์ส่วนตัว โปรไฟล์
+เป็นของพูลเครื่อง Mantis ไม่ใช่แล็ปท็อปของนักพัฒนา
-เมื่อ Mantis ติดขัด ระบบจะโพสต์ข้อความสถานะ Discord พร้อม:
+เมื่อ Mantis ติดขัด ระบบจะโพสต์ข้อความสถานะ Discord พร้อมข้อมูลต่อไปนี้:
-- รหัสการรัน
-- รหัสสถานการณ์
+- id การรัน
+- id สถานการณ์
- ผู้ให้บริการเครื่อง
- ไดเรกทอรีอาร์ติแฟกต์
- คำแนะนำการเชื่อมต่อ VNC หรือ noVNC หากมี
-- ข้อความบล็อกสั้นๆ
+- ข้อความตัวบล็อกสั้น ๆ
-การใช้งานส่วนตัวครั้งแรกสามารถโพสต์ข้อความเหล่านี้ไปยังแชนเนลผู้ปฏิบัติการที่มีอยู่ และย้ายไปยังแชนเนล Mantis เฉพาะในภายหลัง
+การปรับใช้แบบส่วนตัวครั้งแรกสามารถโพสต์ข้อความเหล่านี้ไปยังช่องผู้ปฏิบัติงาน
+ที่มีอยู่ แล้วค่อยย้ายไปยังช่อง Mantis เฉพาะในภายหลัง
## เครื่อง
-Mantis ควรเลือกใช้ AWS ผ่าน Crabbox สำหรับการใช้งานระยะไกลครั้งแรก Crabbox ให้เครื่องที่อุ่นไว้แล้ว การติดตาม lease การเติมสภาพแวดล้อม ล็อก ผลลัพธ์ และการล้างข้อมูล หากความจุ AWS ช้าเกินไปหรือไม่พร้อมใช้งาน ให้เพิ่มผู้ให้บริการ Hetzner ไว้หลังอินเทอร์เฟซเครื่องเดียวกัน
+Mantis ควรเลือกใช้ AWS ผ่าน Crabbox สำหรับการใช้งานระยะไกลครั้งแรก
+Crabbox ให้เครื่องที่อุ่นไว้แล้ว การติดตามสัญญาเช่า การเติมสภาพแวดล้อม ล็อก ผลลัพธ์ และ
+การทำความสะอาด หากความจุของ AWS ช้าเกินไปหรือไม่พร้อมใช้งาน ให้เพิ่มผู้ให้บริการ Hetzner
+ไว้หลังอินเทอร์เฟซเครื่องเดียวกัน
-ข้อกำหนดขั้นต่ำของ VM:
+ข้อกำหนด VM ขั้นต่ำ:
-- Linux ที่มีการติดตั้ง Chrome หรือ Chromium ที่รองรับเดสก์ท็อป
-- การเข้าถึง CDP สำหรับระบบอัตโนมัติของเบราว์เซอร์
-- VNC หรือ noVNC สำหรับการกู้
+- Linux ที่มี Chrome หรือ Chromium ซึ่งรองรับเดสก์ท็อปติดตั้งอยู่
+- การเข้าถึง CDP สำหรับการทำงานอัตโนมัติของเบราว์เซอร์
+- VNC หรือ noVNC สำหรับการกู้คืน
- Node 22 และ pnpm
-- OpenClaw checkout และแคช dependency
+- การ checkout OpenClaw และแคช dependency
- แคชเบราว์เซอร์ Playwright Chromium เมื่อใช้ Playwright
- CPU และหน่วยความจำเพียงพอสำหรับ OpenClaw Gateway หนึ่งตัว เบราว์เซอร์หนึ่งตัว และการรันโมเดลหนึ่งครั้ง
-- การเข้าถึงขาออกไปยัง Discord, GitHub, ผู้ให้บริการโมเดล และ credential broker
+- การเข้าถึงขาออกไปยัง Discord, GitHub, ผู้ให้บริการโมเดล และโบรกเกอร์ข้อมูลรับรอง
-VM ไม่ควรเก็บข้อมูลลับดิบที่มีอายุยืนยาวไว้นอกแหล่งเก็บ credential หรือโปรไฟล์เบราว์เซอร์ที่คาดไว้
+VM ไม่ควรเก็บความลับดิบที่มีอายุยาวนอกเหนือจากที่เก็บข้อมูลรับรองหรือ
+ที่เก็บโปรไฟล์เบราว์เซอร์ที่คาดไว้
-## ข้อมูลลับ
+## ความลับ
-ข้อมูลลับอยู่ใน secrets ระดับองค์กรหรือ repository ของ GitHub สำหรับการรันระยะไกล และอยู่ในไฟล์ secret ที่ผู้ปฏิบัติการควบคุมภายในเครื่องสำหรับการรันภายในเครื่อง
+ความลับอยู่ใน GitHub organization หรือ repository secrets สำหรับการรันระยะไกล และอยู่ใน
+ไฟล์ความลับภายในเครื่องที่ควบคุมโดยผู้ปฏิบัติงานสำหรับการรันภายในเครื่อง
-ชื่อ secret ที่แนะนำ:
+ชื่อความลับที่แนะนำ:
- `OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKEN`
- `OPENCLAW_QA_DISCORD_DRIVER_BOT_TOKEN`
@@ -282,127 +309,138 @@ VM ไม่ควรเก็บข้อมูลลับดิบที่
- `OPENCLAW_QA_DISCORD_GUILD_ID`
- `OPENCLAW_QA_DISCORD_CHANNEL_ID`
- `OPENCLAW_QA_DISCORD_NOTIFY_CHANNEL_ID`
-- `OPENCLAW_QA_REDACT_PUBLIC_METADATA=1` สำหรับการอัปโหลด artifact ของ GitHub แบบสาธารณะ
+- `OPENCLAW_QA_REDACT_PUBLIC_METADATA=1` สำหรับการอัปโหลดอาร์ติแฟกต์ GitHub สาธารณะ
- `OPENCLAW_QA_CONVEX_SITE_URL`
- `OPENCLAW_QA_CONVEX_SECRET_CI`
+- `OPENCLAW_QA_MANTIS_CRABBOX_COORDINATOR`
+- `OPENCLAW_QA_MANTIS_CRABBOX_COORDINATOR_TOKEN`
-ในระยะยาว พูลข้อมูลประจำตัวของ Convex ควรยังคงเป็นแหล่งปกติสำหรับข้อมูลประจำตัวของการรับส่งแบบ live
-GitHub secrets ใช้ bootstrap broker และเลนสำรอง
+ในระยะยาว พูลข้อมูลรับรอง Convex ควรยังคงเป็นแหล่งปกติสำหรับข้อมูลรับรอง
+การขนส่งแบบสด GitHub secrets ใช้บูตสแตรปโบรกเกอร์และเลนสำรอง
+เวิร์กโฟลว์สถานะ-รีแอ็กชันของ Discord จับคู่ความลับ Mantis Crabbox กลับไปยัง
+ตัวแปรสภาพแวดล้อม `CRABBOX_COORDINATOR` และ `CRABBOX_COORDINATOR_TOKEN`
+ที่ Crabbox CLI คาดหวัง ชื่อ GitHub secret แบบธรรมดา `CRABBOX_*` ยังคง
+ได้รับการยอมรับเป็น fallback เพื่อความเข้ากันได้
-Mantis runner ต้องไม่พิมพ์สิ่งต่อไปนี้เด็ดขาด:
+ตัวรัน Mantis ต้องไม่พิมพ์สิ่งต่อไปนี้:
- โทเค็นบอต Discord
-- คีย์ API ของ provider
+- คีย์ API ของผู้ให้บริการ
- คุกกี้เบราว์เซอร์
-- เนื้อหา auth profile
+- เนื้อหาโปรไฟล์การยืนยันตัวตน
- รหัสผ่าน VNC
-- เพย์โหลดข้อมูลประจำตัวแบบ raw
+- payload ข้อมูลรับรองดิบ
-การอัปโหลด artifact แบบสาธารณะควรปกปิด metadata เป้าหมายของ Discord เช่น id ของบอต,
-guild, channel และ message ด้วย เวิร์กโฟลว์ smoke ของ GitHub เปิดใช้
+การอัปโหลดอาร์ติแฟกต์สาธารณะควรปกปิดเมทาดาทาเป้าหมาย Discord ด้วย เช่น id ของบอต,
+กิลด์, ช่อง และข้อความ เวิร์กโฟลว์ smoke ของ GitHub เปิดใช้
`OPENCLAW_QA_REDACT_PUBLIC_METADATA=1` ด้วยเหตุผลนี้
-หากมีการวางโทเค็นลงใน issue, PR, แชต หรือ log โดยไม่ตั้งใจ ให้หมุนเวียนโทเค็นนั้น
-หลังจากเก็บ secret ใหม่แล้ว
+หากโทเค็นถูกวางลงใน issue, PR, แชต หรือบันทึกโดยไม่ได้ตั้งใจ ให้หมุนเวียนโทเค็นนั้น
+หลังจากเก็บความลับใหม่แล้ว
## GitHub Artifacts และความคิดเห็น PR
-เวิร์กโฟลว์ Mantis ควรอัปโหลดชุดหลักฐานครบถ้วนเป็น artifact ของ Actions ที่มีอายุสั้น
-เมื่อรันเวิร์กโฟลว์สำหรับรายงานบั๊กหรือ PR แก้ไข ควรเผยแพร่ภาพหน้าจอ PNG ที่ปกปิดข้อมูลแล้วไปยัง branch `qa-artifacts` ด้วย และ upsert
-ความคิดเห็นในบั๊กหรือ PR แก้ไขนั้นพร้อมภาพหน้าจอ before/after แบบ inline อย่าโพสต์
-หลักฐานหลักไว้เฉพาะบน PR ระบบอัตโนมัติ QA ทั่วไปเท่านั้น log แบบ raw, ข้อความที่สังเกตได้,
-และหลักฐานขนาดใหญ่อื่น ๆ ให้อยู่ใน artifact ของ Actions
+เวิร์กโฟลว์ Mantis ควรอัปโหลดชุดหลักฐานเต็มเป็นอาร์ติแฟกต์ Actions
+ที่มีอายุสั้น เมื่อเวิร์กโฟลว์ถูกรันสำหรับรายงานบั๊กหรือ PR แก้ไข ควร
+เผยแพร่ภาพหน้าจอ PNG ที่ปกปิดแล้วไปยัง branch `qa-artifacts` และ upsert
+ความคิดเห็นบนบั๊กหรือ PR แก้ไขนั้นพร้อมภาพหน้าจอแบบ inline ก่อน/หลัง อย่าโพสต์
+หลักฐานหลักไว้เฉพาะบน PR ระบบอัตโนมัติ QA ทั่วไป ล็อกดิบ ข้อความที่สังเกตเห็น
+และหลักฐานขนาดใหญ่อื่น ๆ ให้อยู่ในอาร์ติแฟกต์ Actions
-เวิร์กโฟลว์ production ควรโพสต์ความคิดเห็นเหล่านั้นด้วย Mantis GitHub App ไม่ใช่
-`github-actions[bot]` ให้เก็บ app id และ private key เป็น GitHub Actions
+เวิร์กโฟลว์โปรดักชันควรโพสต์ความคิดเห็นเหล่านั้นด้วย Mantis GitHub App ไม่ใช่
+ด้วย `github-actions[bot]` เก็บ app id และ private key เป็น GitHub Actions
secrets ชื่อ `MANTIS_GITHUB_APP_ID` และ `MANTIS_GITHUB_APP_PRIVATE_KEY`
-เวิร์กโฟลว์ใช้ marker ที่ซ่อนไว้เป็นคีย์ upsert อัปเดตความคิดเห็นนั้นเมื่อโทเค็นแก้ไขได้
-และสร้างความคิดเห็นใหม่ที่ Mantis เป็นเจ้าของเมื่อ marker เก่าที่บอตเป็นเจ้าของไม่สามารถแก้ไขได้
+เวิร์กโฟลว์ใช้ marker ที่ซ่อนอยู่เป็นคีย์ upsert อัปเดตความคิดเห็นนั้นเมื่อ
+โทเค็นสามารถแก้ไขได้ และสร้างความคิดเห็นใหม่ที่ Mantis เป็นเจ้าของเมื่อ
+marker เก่าที่บอตเป็นเจ้าของไม่สามารถแก้ไขได้
ความคิดเห็น PR ควรสั้นและเน้นภาพ:
```md
Mantis Discord Status Reactions QA
-สรุป: Mantis รันบั๊ก status-reaction ของ Discord ที่รายงานอีกครั้งกับ baseline ที่ทราบว่า
-เสียและ candidate fix baseline ทำให้เกิดบั๊กซ้ำได้ ส่วน candidate แสดงลำดับ queued -> thinking -> done ตามที่คาดไว้
+Summary: Mantis reran the reported Discord status-reaction bug against the known
+bad baseline and the candidate fix. The baseline reproduced the bug, while the
+candidate showed the expected queued -> thinking -> done sequence.
-- สถานการณ์: `discord-status-reactions-tool-only`
-- การรัน:
+- Scenario: `discord-status-reactions-tool-only`
+- Run:
- Artifact:
-- Baseline: `` ที่ ``
-- Candidate: `` ที่ ``
+- Baseline: `` at ``
+- Candidate: `` at ``
| Baseline | Candidate |
| ------------------- | ------------------- |
| | |
```
-เมื่อการรันล้มเหลวเพราะ harness ล้มเหลว ความคิดเห็นต้องระบุเรื่องนั้นแทน
-การสื่อเป็นนัยว่า candidate ล้มเหลว
+เมื่อการรันล้มเหลวเพราะ harness ล้มเหลว ความคิดเห็นต้องระบุเช่นนั้น
+แทนที่จะสื่อว่าตัวเลือก candidate ล้มเหลว
## หมายเหตุการปรับใช้แบบส่วนตัว
-การปรับใช้แบบส่วนตัวอาจมีแอปพลิเคชัน Mantis Discord อยู่แล้ว ให้ใช้ซ้ำ
-แอปพลิเคชันนั้นแทนการสร้าง app อีกตัว เมื่อมีสิทธิ์บอตที่ถูกต้อง
+การปรับใช้แบบส่วนตัวอาจมีแอปพลิเคชัน Discord ของ Mantis อยู่แล้ว ให้นำ
+แอปพลิเคชันนั้นกลับมาใช้แทนการสร้างแอปใหม่ เมื่อแอปนั้นมีสิทธิ์บอตที่ถูกต้อง
และสามารถหมุนเวียนได้อย่างปลอดภัย
-ตั้งค่าช่องทางแจ้งเตือน operator เริ่มต้นผ่าน secrets หรือ configuration ของการปรับใช้
-ช่องทางนี้สามารถชี้ไปยังช่อง maintainer หรือ operations ที่มีอยู่ก่อน
-แล้วจึงย้ายไปยังช่อง Mantis เฉพาะเมื่อมีช่องนั้นแล้ว
+ตั้งค่าช่องแจ้งเตือนผู้ปฏิบัติงานเริ่มต้นผ่าน secrets หรือการกำหนดค่าการปรับใช้
+ช่องนี้สามารถชี้ไปยังช่องผู้ดูแลหรือปฏิบัติการที่มีอยู่ก่อน แล้วค่อยย้ายไปยัง
+ช่อง Mantis เฉพาะเมื่อมีช่องนั้นแล้ว
อย่าใส่ guild ids, channel ids, bot tokens, browser cookies หรือ VNC passwords
-ในเอกสารนี้ ให้เก็บไว้ใน GitHub secrets, credential broker หรือ secret store ภายในเครื่องของ operator
+ในเอกสารนี้ ให้เก็บไว้ใน GitHub secrets, โบรกเกอร์ข้อมูลรับรอง หรือที่เก็บ
+ความลับภายในเครื่องของผู้ปฏิบัติงาน
## การเพิ่มสถานการณ์
สถานการณ์ Mantis ควรประกาศ:
-- id และ title
-- transport
-- ข้อมูลประจำตัวที่ต้องใช้
+- id และชื่อเรื่อง
+- การขนส่ง
+- ข้อมูลรับรองที่ต้องใช้
- นโยบาย baseline ref
- นโยบาย candidate ref
- patch การกำหนดค่า OpenClaw
- ขั้นตอนการตั้งค่า
-- stimulus
-- oracle baseline ที่คาดไว้
-- oracle candidate ที่คาดไว้
-- เป้าหมาย visual capture
-- งบประมาณ timeout
-- ขั้นตอน cleanup
+- สิ่งกระตุ้น
+- oracle baseline ที่คาดหวัง
+- oracle candidate ที่คาดหวัง
+- เป้าหมายการจับภาพ
+- งบประมาณเวลา timeout
+- ขั้นตอนการทำความสะอาด
สถานการณ์ควรเลือกใช้ oracle ขนาดเล็กที่มี type:
-- สถานะ reaction ของ Discord สำหรับบั๊ก reaction
+- สถานะรีแอ็กชัน Discord สำหรับบั๊กรีแอ็กชัน
- การอ้างอิงข้อความ Discord สำหรับบั๊ก threading
-- thread ts ของ Slack และสถานะ reaction API สำหรับบั๊ก Slack
-- id ข้อความอีเมลและ headers สำหรับบั๊กอีเมล
+- thread ts ของ Slack และสถานะ API รีแอ็กชันสำหรับบั๊ก Slack
+- id ข้อความอีเมลและส่วนหัวสำหรับบั๊กอีเมล
- ภาพหน้าจอเบราว์เซอร์เมื่อ UI เป็นสิ่งที่สังเกตได้อย่างน่าเชื่อถือเพียงอย่างเดียว
-การตรวจสอบด้วย vision ควรเป็นแบบเพิ่มเติม หาก API ของแพลตฟอร์มสามารถพิสูจน์บั๊กได้ ให้ใช้
-API เป็น oracle pass/fail และเก็บภาพหน้าจอไว้เพื่อเพิ่มความมั่นใจให้มนุษย์
+การตรวจด้วย vision ควรเป็นแบบเพิ่มเติม หาก API ของแพลตฟอร์มสามารถพิสูจน์บั๊กได้ ให้ใช้
+API เป็น oracle ผ่าน/ไม่ผ่าน และเก็บภาพหน้าจอไว้เพื่อเพิ่มความมั่นใจของมนุษย์
-## การขยาย Provider
+## การขยายผู้ให้บริการ
-หลังจาก Discord runner เดียวกันสามารถเพิ่มได้:
+หลังจาก Discord ตัวรันเดียวกันสามารถเพิ่ม:
-- Slack: reactions, threads, app mentions, modals, file uploads
-- Email: การ auth ของ Gmail และ message threading โดยใช้ `gog` เมื่อ connectors ไม่เพียงพอ
-- WhatsApp: การเข้าสู่ระบบด้วย QR, การระบุตัวตนซ้ำ, การส่งข้อความ, media, reactions
-- Telegram: group mention gating, commands, reactions เมื่อพร้อมใช้งาน
-- Matrix: ห้องที่เข้ารหัส, ความสัมพันธ์แบบ thread หรือ reply, การ resume หลัง restart
+- Slack: รีแอ็กชัน, thread, app mentions, modals, การอัปโหลดไฟล์
+- อีเมล: การยืนยันตัวตน Gmail และ message threading โดยใช้ `gog` เมื่อ connector
+ ไม่เพียงพอ
+- WhatsApp: การเข้าสู่ระบบ QR, การระบุตัวตนใหม่, การส่งข้อความ, สื่อ, รีแอ็กชัน
+- Telegram: group mention gating, คำสั่ง, รีแอ็กชันเมื่อพร้อมใช้งาน
+- Matrix: ห้องที่เข้ารหัส, ความสัมพันธ์ของ thread หรือ reply, การ resume หลัง restart
-แต่ละ transport ควรมีสถานการณ์ smoke ราคาถูกหนึ่งรายการและสถานการณ์ตามกลุ่มบั๊กอย่างน้อยหนึ่งรายการ
-สถานการณ์ visual ที่มีค่าใช้จ่ายสูงควรเป็นแบบ opt-in
+แต่ละการขนส่งควรมีสถานการณ์ smoke ราคาถูกหนึ่งรายการ และสถานการณ์ตามกลุ่มบั๊กหนึ่งรายการขึ้นไป
+สถานการณ์ภาพที่มีค่าใช้จ่ายสูงควรเป็นแบบ opt-in
## คำถามที่ยังเปิดอยู่
-- บอต Discord ตัวใดควรเป็น driver และตัวใดควรเป็น SUT เมื่อ
- ใช้บอต Mantis ที่มีอยู่ซ้ำ
-- การเข้าสู่ระบบเบราว์เซอร์ของ observer ควรใช้บัญชี Discord ของมนุษย์, บัญชีทดสอบ,
+- บอต Discord ใดควรเป็น driver และบอตใดควรเป็น SUT เมื่อมีการนำ
+ บอต Mantis ที่มีอยู่กลับมาใช้
+- การเข้าสู่ระบบเบราว์เซอร์ผู้สังเกตการณ์ควรใช้บัญชี Discord ของมนุษย์ บัญชีทดสอบ
หรือใช้เฉพาะหลักฐาน REST ที่บอตอ่านได้สำหรับเฟสแรก
-- GitHub ควรเก็บ artifact ของ Mantis สำหรับ PR ไว้นานเท่าใด
-- ClawSweeper ควรแนะนำ Mantis โดยอัตโนมัติเมื่อใด แทนที่จะรอ
- คำสั่งจาก maintainer
-- ควรปกปิดหรือตัดภาพหน้าจอก่อนอัปโหลดสำหรับ PR สาธารณะหรือไม่
+- GitHub ควรเก็บอาร์ติแฟกต์ Mantis สำหรับ PR ไว้นานเท่าใด
+- เมื่อใด ClawSweeper ควรแนะนำ Mantis โดยอัตโนมัติแทนการรอคำสั่ง
+ จากผู้ดูแล
+- ภาพหน้าจอควรถูกปกปิดหรือตัดก่อนอัปโหลดสำหรับ PR สาธารณะหรือไม่
diff --git a/docs/th/concepts/progress-drafts.md b/docs/th/concepts/progress-drafts.md
index a88516d32..3f48009eb 100644
--- a/docs/th/concepts/progress-drafts.md
+++ b/docs/th/concepts/progress-drafts.md
@@ -1,36 +1,41 @@
---
read_when:
- การกำหนดค่าการอัปเดตความคืบหน้าที่มองเห็นได้สำหรับรอบการสนทนาที่ใช้เวลานาน
- - การเลือกระหว่างโหมดการสตรีมแบบบางส่วน แบบบล็อก และแบบความคืบหน้า
- - อธิบายวิธีที่ OpenClaw อัปเดตข้อความเดียวในช่องทางระหว่างที่งานกำลังดำเนินอยู่
- - การแก้ไขปัญหาร่างความคืบหน้า ข้อความความคืบหน้าแบบสแตนด์อโลน หรือทางเลือกสำรองในการสรุปผล
-summary: 'ร่างความคืบหน้า: ข้อความงานที่กำลังดำเนินการที่มองเห็นได้หนึ่งข้อความ ซึ่งจะอัปเดตขณะเอเจนต์ทำงาน'
+ - การเลือกระหว่างโหมดสตรีมมิงแบบบางส่วน แบบบล็อก และแบบความคืบหน้า
+ - อธิบายวิธีที่ OpenClaw อัปเดตข้อความเดียวในช่องระหว่างที่งานกำลังดำเนินอยู่
+ - การแก้ไขปัญหาร่างความคืบหน้า ข้อความความคืบหน้าแบบแยกอิสระ หรือกลไกสำรองสำหรับการสรุปผล
+summary: 'ฉบับร่างความคืบหน้า: ข้อความงานที่กำลังดำเนินการที่มองเห็นได้หนึ่งรายการ ซึ่งอัปเดตระหว่างที่ agent ทำงาน'
title: ฉบับร่างความคืบหน้า
x-i18n:
- generated_at: "2026-05-03T21:30:43Z"
+ generated_at: "2026-05-04T02:23:44Z"
model: gpt-5.5
provider: openai
- source_hash: 0fc0dff38232228b49872d66f4498f065675cdd3abf3a0f4003cb34fcbb7de8c
+ source_hash: 8ce19262800f1c3c3e505a3cf1d41ed5c3dffcbca168ad7b7afabdce62eee8fe
source_path: concepts/progress-drafts.md
workflow: 16
---
-แบบร่างความคืบหน้าทำให้รอบการทำงานของเอเจนต์ที่ใช้เวลานานดูมีชีวิตในแชท โดยไม่เปลี่ยนบทสนทนาให้กลายเป็นกองข้อความตอบกลับสถานะชั่วคราว
+ร่างความคืบหน้าช่วยให้เทิร์นของ agent ที่ใช้เวลานานดูมีการดำเนินการอยู่ในแชต โดยไม่ทำให้
+บทสนทนากลายเป็นกองข้อความตอบกลับสถานะชั่วคราว
-เมื่อเปิดใช้แบบร่างความคืบหน้า OpenClaw จะสร้างข้อความงานที่กำลังดำเนินอยู่ที่มองเห็นได้หนึ่งข้อความ อัปเดตข้อความนั้นขณะที่เอเจนต์อ่าน วางแผน เรียกเครื่องมือ หรือรอการอนุมัติ แล้วจึงเปลี่ยนแบบร่างนั้นเป็นคำตอบสุดท้ายเมื่อช่องทางทำได้อย่างปลอดภัย
+เมื่อเปิดใช้ร่างความคืบหน้า OpenClaw จะสร้างข้อความงานระหว่างทำที่มองเห็นได้หนึ่งข้อความ
+เฉพาะหลังจากเทิร์นนั้นพิสูจน์แล้วว่ากำลังทำงานจริง อัปเดตข้อความนั้นขณะที่
+agent อ่าน วางแผน เรียกเครื่องมือ หรือรอการอนุมัติ จากนั้นเปลี่ยนร่างนั้น
+เป็นคำตอบสุดท้ายเมื่อช่องทางสามารถทำได้อย่างปลอดภัย
```text
-Shelling
-- reading recent channel context
-- checking matching issues
-- preparing reply
+Shelling...
+📖 Read: from docs/concepts/progress-drafts.md
+🔎 Web Search: for "discord edit message"
+🛠️ Exec: run tests
```
-ใช้แบบร่างความคืบหน้าเมื่อคุณต้องการข้อความสถานะที่เป็นระเบียบหนึ่งข้อความระหว่างงานที่ใช้เครื่องมือหนัก และต้องการคำตอบสุดท้ายเมื่อรอบการทำงานเสร็จสิ้น
+ใช้ร่างความคืบหน้าเมื่อคุณต้องการข้อความสถานะที่เป็นระเบียบหนึ่งข้อความระหว่างงานที่ใช้เครื่องมือมาก
+และคำตอบสุดท้ายเมื่อเทิร์นเสร็จสิ้น
## เริ่มต้นอย่างรวดเร็ว
-เปิดใช้แบบร่างความคืบหน้าต่อช่องทางด้วย `streaming.mode: "progress"`:
+เปิดใช้ร่างความคืบหน้าต่อช่องทางด้วย `streaming.mode: "progress"`:
```json5
{
@@ -44,63 +49,80 @@ Shelling
}
```
-โดยทั่วไปเท่านี้ก็เพียงพอแล้ว OpenClaw จะเลือกป้ายกำกับหนึ่งคำโดยอัตโนมัติ เพิ่มบรรทัดความคืบหน้าแบบกระชับขณะที่มีงานที่เป็นประโยชน์เกิดขึ้น และระงับข้อความความคืบหน้าแบบเดี่ยวที่ซ้ำซ้อนสำหรับรอบการทำงานนั้น
+โดยทั่วไปเท่านี้ก็เพียงพอแล้ว OpenClaw จะเลือกป้ายกำกับคำเดียวโดยอัตโนมัติ รอ
+จนกว่างานจะใช้เวลาอย่างน้อยห้าวินาทีหรือปล่อยเหตุการณ์งานครั้งที่สอง เพิ่มบรรทัด
+ความคืบหน้าแบบกระชับขณะที่มีงานที่เป็นประโยชน์เกิดขึ้น และระงับข้อความความคืบหน้า
+แยกซ้ำๆ สำหรับเทิร์นนั้น
## สิ่งที่ผู้ใช้เห็น
-แบบร่างความคืบหน้ามีสองส่วน:
+ร่างความคืบหน้ามีสองส่วน:
-| ส่วน | วัตถุประสงค์ |
-| -------------- | ----------------------------------------------------------------- |
-| ป้ายกำกับ | ชื่อสั้น ๆ เช่น `Thinking` หรือ `Shelling` |
-| บรรทัดความคืบหน้า | อัปเดตการรันแบบกระชับ เช่น การเรียกเครื่องมือ ขั้นตอนงาน หรือการอนุมัติ |
+| ส่วน | วัตถุประสงค์ |
+| -------------- | --------------------------------------------------------------------------- |
+| ป้ายกำกับ | ชื่อสั้นๆ เช่น `Thinking...` หรือ `Shelling...` |
+| บรรทัดความคืบหน้า | อัปเดตการทำงานแบบกระชับโดยใช้ป้ายกำกับเครื่องมือและไอคอนเดียวกับเอาต์พุตแบบละเอียด |
-ป้ายกำกับจะปรากฏทันทีเมื่อเอเจนต์เริ่มตอบกลับ บรรทัดความคืบหน้าจะถูกเพิ่มเฉพาะเมื่อเอเจนต์ปล่อยอัปเดตงานที่เป็นประโยชน์ คำตอบสุดท้ายจะแทนที่แบบร่างเมื่อทำได้ มิฉะนั้น OpenClaw จะส่งคำตอบสุดท้ายตามปกติ และล้างหรือหยุดอัปเดตแบบร่างตามการขนส่งของช่องทางนั้น
+ป้ายกำกับจะปรากฏหลังจาก agent เริ่มงานที่มีความหมาย และยังคงทำงานอยู่
+เป็นเวลาห้าวินาทีหรือปล่อยเหตุการณ์งานครั้งที่สอง การตอบกลับที่เป็นข้อความล้วนจะไม่
+แสดงร่างความคืบหน้า บรรทัดความคืบหน้าจะถูกเพิ่มเฉพาะเมื่อ agent ปล่อย
+อัปเดตงานที่เป็นประโยชน์ เช่น `🛠️ Exec`, `🔎 Web Search` หรือ `✍️ Write: to /tmp/file`
+โดยค่าเริ่มต้นจะใช้โหมดอธิบายแบบกระชับเดียวกับ `/verbose`; ตั้งค่า
+`agents.defaults.toolProgressDetail: "raw"` เมื่อดีบักและคุณต้องการให้ต่อท้าย
+คำสั่ง/รายละเอียดดิบด้วย
+คำตอบสุดท้ายจะแทนที่ร่างเมื่อทำได้ มิฉะนั้น
+OpenClaw จะส่งคำตอบสุดท้ายตามปกติ และล้างหรือตัดการอัปเดต
+ร่างตาม transport ของช่องทางนั้น
## เลือกโหมด
-`channels..streaming.mode` ควบคุมพฤติกรรมระหว่างดำเนินการที่มองเห็นได้:
+`channels..streaming.mode` ควบคุมลักษณะงานระหว่างทำที่มองเห็นได้:
-| โหมด | เหมาะที่สุดสำหรับ | สิ่งที่ปรากฏในแชท |
+| โหมด | เหมาะสำหรับ | สิ่งที่ปรากฏในแชต |
| ---------- | -------------------------------- | ------------------------------------------------- |
-| `off` | ช่องทางที่เงียบ | เฉพาะคำตอบสุดท้าย |
-| `partial` | การดูข้อความคำตอบค่อย ๆ ปรากฏ | แบบร่างหนึ่งข้อความที่แก้ไขด้วยข้อความคำตอบล่าสุด |
-| `block` | ชิ้นส่วนตัวอย่างคำตอบขนาดใหญ่ | ตัวอย่างหนึ่งรายการที่อัปเดตหรือต่อท้ายเป็นชิ้นใหญ่ขึ้น |
-| `progress` | รอบการทำงานที่ใช้เครื่องมือหนักหรือใช้เวลานาน | แบบร่างสถานะหนึ่งข้อความ แล้วตามด้วยคำตอบสุดท้าย |
+| `off` | ช่องทางที่ต้องการความเงียบ | เฉพาะคำตอบสุดท้าย |
+| `partial` | การดูข้อความคำตอบปรากฏขึ้น | ร่างหนึ่งฉบับที่แก้ไขด้วยข้อความคำตอบล่าสุด |
+| `block` | ก้อนพรีวิวคำตอบที่ใหญ่ขึ้น | พรีวิวหนึ่งรายการที่อัปเดตหรือต่อท้ายเป็นก้อนใหญ่ขึ้น |
+| `progress` | เทิร์นที่ใช้เครื่องมือมากหรือทำงานนาน | ร่างสถานะหนึ่งฉบับ แล้วตามด้วยคำตอบสุดท้าย |
-เลือก `progress` เมื่อผู้ใช้สนใจว่า "เกิดอะไรขึ้น" มากกว่าการดูข้อความคำตอบสตรีมทีละโทเค็น
+เลือก `progress` เมื่อผู้ใช้ให้ความสำคัญกับ "กำลังเกิดอะไรขึ้น" มากกว่าการดู
+ข้อความคำตอบสตรีมทีละ token
-เลือก `partial` เมื่อคำตอบเองคือสัญญาณความคืบหน้า
+เลือก `partial` เมื่อคำตอบเองเป็นสัญญาณความคืบหน้า
-เลือก `block` เมื่อคุณต้องการอัปเดตตัวอย่างแบบร่างเป็นชิ้นข้อความที่ใหญ่ขึ้น บน Discord และ Telegram, `streaming.mode: "block"` ยังคงเป็นการสตรีมตัวอย่าง ไม่ใช่การส่งแบบบล็อกปกติ ใช้ `streaming.block.enabled` หรือ `blockStreaming` แบบเดิมเมื่อคุณต้องการการตอบกลับแบบบล็อกปกติ
+เลือก `block` เมื่อคุณต้องการอัปเดตร่างพรีวิวเป็นก้อนข้อความที่ใหญ่ขึ้น บน
+Discord และ Telegram, `streaming.mode: "block"` ยังคงเป็นการสตรีมพรีวิว ไม่ใช่
+การส่งแบบบล็อกปกติ ใช้ `streaming.block.enabled` หรือ
+`blockStreaming` แบบเก่าเมื่อคุณต้องการการตอบกลับแบบบล็อกปกติ
## กำหนดค่าป้ายกำกับ
ป้ายกำกับความคืบหน้าอยู่ภายใต้ `channels..streaming.progress`
-ป้ายกำกับเริ่มต้นคือ `auto` ซึ่งเลือกจากชุดป้ายกำกับหนึ่งคำในตัวของ OpenClaw:
+ป้ายกำกับเริ่มต้นคือ `auto` ซึ่งเลือกจากชุดป้ายกำกับในตัวของ OpenClaw
+แบบคำเดียวตามด้วยจุดไข่ปลา:
```text
-Thinking
-Shelling
-Scuttling
-Clawing
-Pinching
-Molting
-Bubbling
-Tiding
-Reefing
-Cracking
-Sifting
-Brining
-Nautiling
-Krilling
-Barnacling
-Lobstering
-Tidepooling
-Pearling
-Snapping
-Surfacing
+Thinking...
+Shelling...
+Scuttling...
+Clawing...
+Pinching...
+Molting...
+Bubbling...
+Tiding...
+Reefing...
+Cracking...
+Sifting...
+Brining...
+Nautiling...
+Krilling...
+Barnacling...
+Lobstering...
+Tidepooling...
+Pearling...
+Snapping...
+Surfacing...
```
ใช้ป้ายกำกับคงที่:
@@ -157,9 +179,35 @@ Surfacing
## ควบคุมบรรทัดความคืบหน้า
-บรรทัดความคืบหน้าเปิดใช้งานตามค่าเริ่มต้นในโหมดความคืบหน้า บรรทัดเหล่านี้มาจากเหตุการณ์การรันจริง ได้แก่ การเริ่มเครื่องมือ การอัปเดตรายการ แผนงาน การอนุมัติ เอาต์พุตคำสั่ง สรุปแพตช์ และกิจกรรมเอเจนต์ที่คล้ายกัน
+บรรทัดความคืบหน้าเปิดใช้โดยค่าเริ่มต้นในโหมดความคืบหน้า บรรทัดเหล่านี้มาจากเหตุการณ์การทำงานจริง:
+การเริ่มใช้เครื่องมือ การอัปเดตรายการ แผนงาน การอนุมัติ เอาต์พุตคำสั่ง สรุป
+patch และกิจกรรม agent ที่คล้ายกัน
-จำกัดจำนวนบรรทัดที่ยังคงมองเห็นได้:
+OpenClaw ใช้ตัวจัดรูปแบบเดียวกันสำหรับร่างความคืบหน้าและ `/verbose`:
+
+```json5
+{
+ agents: {
+ defaults: {
+ toolProgressDetail: "explain", // explain | raw
+ },
+ },
+}
+```
+
+`"explain"` เป็นค่าเริ่มต้น และทำให้ร่างมีความคงที่ด้วยป้ายกำกับกระชับ เช่น
+`🛠️ Exec: check JS syntax for /tmp/app.js` `"raw"` จะต่อท้าย
+คำสั่ง/รายละเอียดพื้นฐานเมื่อมี ซึ่งมีประโยชน์ขณะดีบักแต่รบกวนมากกว่าใน
+แชต
+
+ตัวอย่างเช่น คำสั่งเดียวกันจะปรากฏต่างกันตามโหมดรายละเอียด:
+
+| โหมด | บรรทัดความคืบหน้า |
+| --------- | -------------------------------------------------------------------- |
+| `explain` | `🛠️ Exec: check JS syntax for /tmp/app.js` |
+| `raw` | `🛠️ Exec: check JS syntax for /tmp/app.js, node --check /tmp/app.js` |
+
+จำกัดจำนวนบรรทัดที่ยังมองเห็นได้:
```json5
{
@@ -176,7 +224,7 @@ Surfacing
}
```
-คงแบบร่างความคืบหน้าเดี่ยวไว้ แต่ซ่อนบรรทัดเครื่องมือและงาน:
+คงร่างความคืบหน้าเดี่ยวไว้ แต่ซ่อนบรรทัดเครื่องมือและงาน:
```json5
{
@@ -193,58 +241,77 @@ Surfacing
}
```
-เมื่อใช้ `toolProgress: false` OpenClaw ยังคงระงับข้อความความคืบหน้าของเครื่องมือแบบเดี่ยวรุ่นเก่าสำหรับรอบการทำงานนั้น ช่องทางจะยังคงเงียบทางสายตาจนถึงคำตอบสุดท้าย ยกเว้นป้ายกำกับหากมีการกำหนดค่าไว้
+ด้วย `toolProgress: false` OpenClaw ยังคงระงับข้อความ
+ความคืบหน้าของเครื่องมือแบบแยกเดิมสำหรับเทิร์นนั้น ช่องทางจะยังดูเงียบ
+จนกว่าจะมีคำตอบสุดท้าย ยกเว้นป้ายกำกับหากมีการกำหนดค่าไว้
## พฤติกรรมของช่องทาง
-แต่ละช่องทางใช้การขนส่งที่สะอาดที่สุดที่รองรับ:
+แต่ละช่องทางใช้ transport ที่สะอาดที่สุดที่รองรับ:
-| ช่องทาง | การขนส่งความคืบหน้า | หมายเหตุ |
+| ช่องทาง | transport ความคืบหน้า | หมายเหตุ |
| --------------- | -------------------------------------- | --------------------------------------------------------------------- |
-| Discord | ส่งข้อความหนึ่งข้อความ แล้วแก้ไขข้อความนั้น | ข้อความสุดท้ายถูกแก้ไขแทนที่เดิมเมื่อพอดีกับข้อความตัวอย่างที่ปลอดภัยหนึ่งข้อความ |
-| Matrix | ส่งเหตุการณ์หนึ่งรายการ แล้วแก้ไขเหตุการณ์นั้น | การกำหนดค่าสตรีมมิงระดับบัญชีควบคุมแบบร่างระดับบัญชี |
-| Microsoft Teams | สตรีม Teams แบบเนทีฟในแชทส่วนตัว | `streaming.mode: "block"` จับคู่กับการส่งแบบบล็อกของ Teams |
-| Slack | สตรีมเนทีฟหรือโพสต์แบบร่างที่แก้ไขได้ | ความพร้อมใช้งานของเธรดมีผลต่อการใช้สตรีมมิงเนทีฟ |
-| Telegram | ส่งข้อความหนึ่งข้อความ แล้วแก้ไขข้อความนั้น | แบบร่างที่มองเห็นได้เก่ากว่าอาจถูกแทนที่เพื่อให้เวลาประทับสุดท้ายยังมีประโยชน์ |
-| Mattermost | โพสต์แบบร่างที่แก้ไขได้ | กิจกรรมเครื่องมือถูกรวมไว้ในโพสต์ลักษณะแบบร่างเดียวกัน |
+| Discord | ส่งหนึ่งข้อความ แล้วแก้ไขข้อความนั้น | ข้อความสุดท้ายจะแก้ไขในตำแหน่งเดิมเมื่อพอดีกับข้อความพรีวิวที่ปลอดภัยหนึ่งข้อความ |
+| Matrix | ส่งหนึ่ง event แล้วแก้ไข event นั้น | การกำหนดค่าสตรีมระดับบัญชีควบคุมร่างระดับบัญชี |
+| Microsoft Teams | สตรีม Teams แบบ native ในแชตส่วนตัว | `streaming.mode: "block"` แมปไปยังการส่งแบบบล็อกของ Teams |
+| Slack | สตรีมแบบ native หรือโพสต์ร่างที่แก้ไขได้ | ความพร้อมของ thread ส่งผลต่อว่าสามารถใช้สตรีมแบบ native ได้หรือไม่ |
+| Telegram | ส่งหนึ่งข้อความ แล้วแก้ไขข้อความนั้น | ร่างเก่าที่มองเห็นได้อาจถูกแทนที่ เพื่อให้เวลาประทับสุดท้ายยังมีประโยชน์ |
+| Mattermost | โพสต์ร่างที่แก้ไขได้ | กิจกรรมเครื่องมือถูกรวมเข้าในโพสต์แบบร่างเดียวกัน |
-ช่องทางที่ไม่มีการรองรับการแก้ไขอย่างปลอดภัยโดยทั่วไปจะถอยกลับไปใช้ตัวบ่งชี้การพิมพ์หรือการส่งเฉพาะคำตอบสุดท้าย
+ช่องทางที่ไม่มีการรองรับการแก้ไขอย่างปลอดภัยมักถอยกลับไปใช้ตัวบ่งชี้การพิมพ์หรือ
+การส่งเฉพาะคำตอบสุดท้าย
-## การสรุปผล
+## การปิดท้าย
-เมื่อคำตอบสุดท้ายพร้อมแล้ว OpenClaw จะพยายามทำให้แชทสะอาด:
+เมื่อคำตอบสุดท้ายพร้อม OpenClaw จะพยายามรักษาแชตให้สะอาด:
-- หากแบบร่างสามารถกลายเป็นคำตอบสุดท้ายได้อย่างปลอดภัย OpenClaw จะแก้ไขแทนที่เดิม
-- หากช่องทางใช้สตรีมความคืบหน้าแบบเนทีฟ OpenClaw จะสรุปสตรีมนั้นเมื่อการขนส่งเนทีฟยอมรับข้อความสุดท้าย
-- หากคำตอบสุดท้ายมีสื่อ พรอมป์อนุมัติ เป้าหมายการตอบกลับที่ระบุชัดเจน ชิ้นส่วนมากเกินไป หรือการแก้ไข/ส่งล้มเหลว OpenClaw จะส่งคำตอบสุดท้ายผ่านเส้นทางการส่งของช่องทางปกติ
+- หากร่างสามารถกลายเป็นคำตอบสุดท้ายได้อย่างปลอดภัย OpenClaw จะแก้ไขร่างนั้นในตำแหน่งเดิม
+- หากช่องทางใช้การสตรีมความคืบหน้าแบบ native OpenClaw จะปิดท้ายสตรีมนั้น
+ เมื่อ transport แบบ native รับข้อความสุดท้าย
+- หากคำตอบสุดท้ายมีสื่อ พรอมต์อนุมัติ เป้าหมายการตอบกลับที่ระบุชัด
+ มีจำนวนก้อนมากเกินไป หรือการแก้ไข/ส่งล้มเหลว OpenClaw จะส่งคำตอบสุดท้ายผ่าน
+ เส้นทางการส่งปกติของช่องทาง
-เส้นทางถอยกลับนี้ตั้งใจให้เป็นเช่นนั้น การส่งคำตอบสุดท้ายใหม่ดีกว่าการทำข้อความหาย ตอบผิดเธรด หรือเขียนทับแบบร่างด้วยเพย์โหลดที่ช่องทางไม่สามารถแสดงได้อย่างปลอดภัย
+เส้นทาง fallback เป็นความตั้งใจ การส่งคำตอบสุดท้ายใหม่ดีกว่า
+การทำข้อความหาย ตอบผิด thread หรือเขียนทับร่างด้วย payload ที่ช่องทาง
+ไม่สามารถแสดงแทนได้อย่างปลอดภัย
-## การแก้ไขปัญหา
+## การแก้ปัญหา
**ฉันเห็นเฉพาะคำตอบสุดท้าย**
-ตรวจสอบว่า `channels..streaming.mode` ถูกตั้งค่าเป็น `progress` สำหรับบัญชีหรือช่องทางที่จัดการข้อความนั้น เส้นทางบางแบบของกลุ่มหรือการตอบกลับแบบอ้างอิงอาจปิดใช้ตัวอย่างแบบร่างสำหรับรอบการทำงานหนึ่ง เมื่อช่องทางไม่สามารถแก้ไขข้อความที่ถูกต้องได้อย่างปลอดภัย
+ตรวจสอบว่า `channels..streaming.mode` ตั้งค่าเป็น `progress` สำหรับ
+บัญชีหรือช่องทางที่จัดการข้อความนั้น เส้นทางบางแบบของกลุ่มหรือการตอบกลับแบบอ้างอิงอาจ
+ปิดใช้พรีวิวร่างสำหรับเทิร์นหนึ่งเมื่อช่องทางไม่สามารถแก้ไขข้อความที่ถูกต้องได้อย่างปลอดภัย
**ฉันเห็นป้ายกำกับแต่ไม่มีบรรทัดเครื่องมือ**
-ตรวจสอบ `streaming.progress.toolProgress` หากเป็น `false` OpenClaw จะคงพฤติกรรมแบบร่างเดี่ยวไว้ แต่ซ่อนบรรทัดความคืบหน้าของเครื่องมือและงาน
+ตรวจสอบ `streaming.progress.toolProgress` หากเป็น `false` OpenClaw จะคง
+พฤติกรรมร่างเดี่ยวไว้ แต่ซ่อนบรรทัดความคืบหน้าของเครื่องมือและงาน
-**ฉันเห็นข้อความสุดท้ายใหม่แทนที่จะเป็นแบบร่างที่ถูกแก้ไข**
+**ฉันเห็นข้อความสุดท้ายใหม่แทนร่างที่ถูกแก้ไข**
-นั่นคือการถอยกลับเพื่อความปลอดภัย สิ่งนี้อาจเกิดขึ้นกับการตอบกลับที่มีสื่อ คำตอบยาว เป้าหมายการตอบกลับที่ระบุชัดเจน แบบร่าง Telegram เก่า เป้าหมายเธรด Slack ที่หายไป ข้อความตัวอย่างที่ถูกลบ หรือการสรุปสตรีมเนทีฟที่ล้มเหลว
+นั่นคือ fallback เพื่อความปลอดภัย สิ่งนี้อาจเกิดขึ้นกับการตอบกลับที่มีสื่อ คำตอบยาว
+เป้าหมายการตอบกลับที่ระบุชัด ร่าง Telegram เก่า เป้าหมาย thread ของ Slack ที่ขาดหาย
+ข้อความพรีวิวที่ถูกลบ หรือการปิดท้ายสตรีมแบบ native ที่ล้มเหลว
-**ฉันยังเห็นข้อความความคืบหน้าแบบเดี่ยวอยู่**
+**ฉันยังเห็นข้อความความคืบหน้าแบบแยกอยู่**
-โหมดความคืบหน้าจะระงับข้อความความคืบหน้าของเครื่องมือแบบเดี่ยวเริ่มต้นเมื่อมีแบบร่างใช้งานอยู่ หากข้อความแบบเดี่ยวยังปรากฏ ให้ตรวจสอบว่ารอบการทำงานนั้นกำลังใช้โหมดความคืบหน้าจริง และไม่ใช่ `streaming.mode: "off"` หรือเส้นทางช่องทางที่ไม่สามารถสร้างแบบร่างสำหรับข้อความนั้นได้
+โหมดความคืบหน้าจะระงับข้อความความคืบหน้าของเครื่องมือแบบแยกตามค่าเริ่มต้นเมื่อร่าง
+กำลังทำงานอยู่ หากข้อความแยกยังปรากฏ ให้ตรวจสอบว่าเทิร์นนั้นกำลัง
+ใช้โหมดความคืบหน้าจริง ไม่ใช่ `streaming.mode: "off"` หรือเส้นทางช่องทางที่
+ไม่สามารถสร้างร่างสำหรับข้อความนั้นได้
**Teams ทำงานต่างจาก Discord หรือ Telegram**
-Microsoft Teams ใช้สตรีมเนทีฟในแชทส่วนตัวแทนการขนส่งตัวอย่างแบบส่งแล้วแก้ไขทั่วไป Teams ยังถือว่า `streaming.mode: "block"` เป็นการส่งแบบบล็อกของ Teams เพราะไม่มีโหมดบล็อกตัวอย่างแบบร่างเดียวกับที่ Discord และ Telegram ใช้
+Microsoft Teams ใช้สตรีมแบบ native ในแชตส่วนตัว แทน transport พรีวิว
+แบบส่งแล้วแก้ไขทั่วไป Teams ยังถือว่า `streaming.mode: "block"` เป็น
+การส่งแบบบล็อกของ Teams เพราะไม่มีโหมดบล็อกพรีวิวร่างแบบเดียวกับ
+ที่ Discord และ Telegram ใช้
## ที่เกี่ยวข้อง
-- [การสตรีมและการแบ่งชิ้น](/th/concepts/streaming)
+- [การสตรีมและการแบ่งก้อน](/th/concepts/streaming)
- [ข้อความ](/th/concepts/messages)
- [การกำหนดค่าช่องทาง](/th/gateway/config-channels)
- [Discord](/th/channels/discord)
diff --git a/docs/th/concepts/qa-e2e-automation.md b/docs/th/concepts/qa-e2e-automation.md
index 7e691e2ef..5b6d243db 100644
--- a/docs/th/concepts/qa-e2e-automation.md
+++ b/docs/th/concepts/qa-e2e-automation.md
@@ -1,67 +1,67 @@
---
read_when:
- - ทำความเข้าใจว่าสแต็ก QA ประกอบเข้าด้วยกันอย่างไร
+ - ทำความเข้าใจว่าสแต็ก QA เชื่อมโยงกันอย่างไร
- การขยาย qa-lab, qa-channel หรืออะแดปเตอร์การขนส่ง
- - การเพิ่มสถานการณ์ QA ที่อ้างอิงจากคลังโค้ด
- - การสร้างระบบ QA อัตโนมัติที่สมจริงยิ่งขึ้นสำหรับแดชบอร์ด Gateway
-summary: 'ภาพรวมสแต็ก QA: qa-lab, qa-channel, สถานการณ์ที่อิงกับคลังโค้ด, เลนการรับส่งแบบสด, อะแดปเตอร์การรับส่ง, และการรายงาน.'
+ - การเพิ่มสถานการณ์ QA ที่อิงกับรีโป
+ - การสร้างระบบอัตโนมัติด้านการประกันคุณภาพที่สมจริงยิ่งขึ้นสำหรับแดชบอร์ด Gateway
+summary: 'ภาพรวมสแต็ก QA: qa-lab, qa-channel, สถานการณ์ที่อิง repo, ช่องทางการขนส่งแบบ live, อะแดปเตอร์การขนส่ง และการรายงาน.'
title: ภาพรวมการประกันคุณภาพ
x-i18n:
- generated_at: "2026-05-03T21:30:56Z"
+ generated_at: "2026-05-04T02:23:57Z"
model: gpt-5.5
provider: openai
- source_hash: 6a1446fddb00855634d34662a0a47be1e5054a9e7bfed5bc9ae21185d87094d8
+ source_hash: 0b376767b967a51cc8a45ca5ce420f78067b52e6368d2abe921ffed533f6f9ba
source_path: concepts/qa-e2e-automation.md
workflow: 16
---
-สแตก QA ส่วนตัวมีไว้เพื่อทดสอบ OpenClaw ในลักษณะที่สมจริงและมีรูปแบบเหมือนช่องทาง
-มากกว่าที่การทดสอบหน่วยเดียวจะทำได้
+สแตก QA ส่วนตัวมีไว้เพื่อทดสอบ OpenClaw ในรูปแบบที่สมจริงและมีลักษณะเหมือนช่องทางมากกว่าที่ unit test เดี่ยวจะทำได้
ส่วนประกอบปัจจุบัน:
-- `extensions/qa-channel`: ช่องทางข้อความสังเคราะห์ที่มีพื้นผิว DM, channel, thread,
- reaction, edit และ delete
-- `extensions/qa-lab`: UI ดีบักเกอร์และบัส QA สำหรับสังเกตทรานสคริปต์
- ฉีดข้อความขาเข้า และส่งออกรายงาน Markdown
-- `extensions/qa-matrix`, Plugin รันเนอร์ในอนาคต: อะแดปเตอร์ live-transport ที่
- ขับเคลื่อนช่องทางจริงภายใน Gateway QA ลูก
-- `qa/`: แอสเซตเริ่มต้นที่อิงรีโพสำหรับงาน kickoff และสถานการณ์ QA
- พื้นฐาน
-- [Mantis](/th/concepts/mantis): การตรวจสอบสดก่อนและหลังสำหรับบั๊กที่
- ต้องใช้ทรานสปอร์ตจริง ภาพหน้าจอเบราว์เซอร์ สถานะ VM และหลักฐาน PR
+- `extensions/qa-channel`: ช่องทางข้อความสังเคราะห์ที่มีพื้นผิว DM, ช่องทาง, เธรด,
+ รีแอ็กชัน, การแก้ไข และการลบ
+- `extensions/qa-lab`: UI ดีบักเกอร์และบัส QA สำหรับสังเกต transcript,
+ แทรกข้อความขาเข้า และส่งออกรายงาน Markdown
+- `extensions/qa-matrix`, Plugin ตัวรันเนอร์ในอนาคต: อะแดปเตอร์ live-transport ที่
+ ขับช่องทางจริงภายใน Gateway QA ย่อย
+- `qa/`: แอสเซต seed ที่รองรับโดยรีโปสำหรับงาน kickoff และสถานการณ์ QA
+ baseline
+- [Mantis](/th/concepts/mantis): การตรวจสอบแบบ live ก่อนและหลังสำหรับบั๊กที่
+ ต้องใช้ transport จริง, ภาพหน้าจอเบราว์เซอร์, สถานะ VM และหลักฐาน PR
## พื้นผิวคำสั่ง
-ทุกโฟลว์ QA ทำงานภายใต้ `pnpm openclaw qa ` หลายรายการมี
-นามแฝงสคริปต์ `pnpm qa:*`; รองรับทั้งสองรูปแบบ
+ทุกโฟลว์ QA ทำงานภายใต้ `pnpm openclaw qa ` หลายรายการมี alias สคริปต์ `pnpm qa:*`;
+รองรับทั้งสองรูปแบบ
-| คำสั่ง | วัตถุประสงค์ |
-| --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `qa run` | การตรวจสอบตัวเอง QA ที่รวมมาให้; เขียนรายงาน Markdown |
-| `qa suite` | รันสถานการณ์ที่อิงรีโพกับเลน Gateway QA นามแฝง: `pnpm openclaw qa suite --runner multipass` สำหรับ VM Linux แบบใช้แล้วทิ้ง |
-| `qa coverage` | พิมพ์อินเวนทอรีความครอบคลุมของสถานการณ์ในรูปแบบ markdown (`--json` สำหรับเอาต์พุตเครื่อง) |
-| `qa parity-report` | เปรียบเทียบไฟล์ `qa-suite-summary.json` สองไฟล์และเขียนรายงาน agentic parity |
-| `qa character-eval` | รันสถานการณ์ QA ด้านตัวละครข้ามหลายโมเดลสดพร้อมรายงานที่ผ่านการตัดสิน ดู [การรายงาน](#reporting) |
-| `qa manual` | รันพรอมป์ครั้งเดียวกับเลน provider/model ที่เลือก |
-| `qa ui` | เริ่ม UI ดีบักเกอร์ QA และบัส QA ในเครื่อง (นามแฝง: `pnpm qa:lab:ui`) |
-| `qa docker-build-image` | สร้างอิมเมจ Docker QA ที่อบไว้ล่วงหน้า |
-| `qa docker-scaffold` | เขียนสแกฟโฟลด์ docker-compose สำหรับแดชบอร์ด QA + เลน Gateway |
-| `qa up` | สร้างไซต์ QA เริ่มสแตกที่อิง Docker และพิมพ์ URL (นามแฝง: `pnpm qa:lab:up`; ตัวแปร `:fast` เพิ่ม `--use-prebuilt-image --bind-ui-dist --skip-ui-build`) |
-| `qa aimock` | เริ่มเฉพาะเซิร์ฟเวอร์ provider AIMock |
-| `qa mock-openai` | เริ่มเฉพาะเซิร์ฟเวอร์ provider `mock-openai` ที่รับรู้สถานการณ์ |
-| `qa credentials doctor` / `add` / `list` / `remove` | จัดการพูลข้อมูลรับรอง Convex ที่ใช้ร่วมกัน |
-| `qa matrix` | เลนทรานสปอร์ตสดกับ homeserver Tuwunel แบบใช้แล้วทิ้ง ดู [QA ของ Matrix](/th/concepts/qa-matrix) |
-| `qa telegram` | เลนทรานสปอร์ตสดกับกลุ่ม Telegram ส่วนตัวจริง |
-| `qa discord` | เลนทรานสปอร์ตสดกับช่อง guild Discord ส่วนตัวจริง |
-| `qa mantis` | รันเนอร์การตรวจสอบก่อนและหลังสำหรับบั๊กทรานสปอร์ตสด พร้อมสถานการณ์ status-reactions แรกของ Discord ดู [Mantis](/th/concepts/mantis) |
+| คำสั่ง | วัตถุประสงค์ |
+| --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `qa run` | self-check QA ที่บันเดิลมา; เขียนรายงาน Markdown |
+| `qa suite` | รันสถานการณ์ที่รองรับโดยรีโปกับเลน Gateway QA Alias: `pnpm openclaw qa suite --runner multipass` สำหรับ Linux VM แบบใช้แล้วทิ้ง |
+| `qa coverage` | พิมพ์ inventory ความครอบคลุมของสถานการณ์ใน markdown (`--json` สำหรับเอาต์พุตสำหรับเครื่อง) |
+| `qa parity-report` | เปรียบเทียบไฟล์ `qa-suite-summary.json` สองไฟล์และเขียนรายงาน parity แบบ agentic |
+| `qa character-eval` | รันสถานการณ์ QA ด้านคาแรกเตอร์กับโมเดล live หลายตัวพร้อมรายงานที่มีการตัดสิน ดู [การรายงาน](#reporting) |
+| `qa manual` | รัน prompt แบบครั้งเดียวกับเลน provider/model ที่เลือก |
+| `qa ui` | เริ่ม UI ดีบักเกอร์ QA และบัส QA ภายในเครื่อง (alias: `pnpm qa:lab:ui`) |
+| `qa docker-build-image` | สร้างอิมเมจ Docker QA ที่ prebake ไว้ |
+| `qa docker-scaffold` | เขียน scaffold docker-compose สำหรับแดชบอร์ด QA + เลน Gateway |
+| `qa up` | สร้างไซต์ QA, เริ่มสแตกที่รองรับด้วย Docker, พิมพ์ URL (alias: `pnpm qa:lab:up`; variant `:fast` เพิ่ม `--use-prebuilt-image --bind-ui-dist --skip-ui-build`) |
+| `qa aimock` | เริ่มเฉพาะเซิร์ฟเวอร์ provider AIMock |
+| `qa mock-openai` | เริ่มเฉพาะเซิร์ฟเวอร์ provider `mock-openai` ที่รู้จักสถานการณ์ |
+| `qa credentials doctor` / `add` / `list` / `remove` | จัดการพูล credential Convex ที่ใช้ร่วมกัน |
+| `qa matrix` | เลน transport live กับ homeserver Tuwunel แบบใช้แล้วทิ้ง ดู [Matrix QA](/th/concepts/qa-matrix) |
+| `qa telegram` | เลน transport live กับกลุ่ม Telegram ส่วนตัวจริง |
+| `qa discord` | เลน transport live กับช่อง guild Discord ส่วนตัวจริง |
+| `qa slack` | เลน transport live กับช่อง Slack ส่วนตัวจริง |
+| `qa mantis` | ตัวรันตรวจสอบก่อนและหลังสำหรับบั๊ก transport live พร้อมหลักฐาน status-reactions ของ Discord และ smoke เดสก์ท็อป/เบราว์เซอร์ Crabbox ดู [Mantis](/th/concepts/mantis) |
-## โฟลว์ผู้ปฏิบัติงาน
+## โฟลว์ผู้ปฏิบัติการ
-โฟลว์ผู้ปฏิบัติงาน QA ปัจจุบันคือไซต์ QA แบบสองพาเนล:
+โฟลว์ผู้ปฏิบัติการ QA ปัจจุบันเป็นไซต์ QA แบบสองพาเนล:
-- ซ้าย: แดชบอร์ด Gateway (Control UI) พร้อมเอเจนต์
-- ขวา: QA Lab แสดงทรานสคริปต์คล้าย Slack และแผนสถานการณ์
+- ซ้าย: แดชบอร์ด Gateway (Control UI) พร้อม agent
+- ขวา: QA Lab แสดง transcript แบบคล้าย Slack และแผนสถานการณ์
รันด้วย:
@@ -69,13 +69,12 @@ x-i18n:
pnpm qa:lab:up
```
-คำสั่งนี้สร้างไซต์ QA เริ่มเลน Gateway ที่อิง Docker และเปิดเผยหน้า
-QA Lab ซึ่งผู้ปฏิบัติงานหรือลูปอัตโนมัติสามารถมอบภารกิจ QA ให้เอเจนต์
-สังเกตพฤติกรรมช่องทางจริง และบันทึกว่าสิ่งใดทำงาน ล้มเหลว หรือ
-ยังถูกบล็อกอยู่
+คำสั่งนั้นสร้างไซต์ QA, เริ่มเลน Gateway ที่รองรับด้วย Docker และเปิดหน้า
+QA Lab ซึ่งผู้ปฏิบัติการหรือ automation loop สามารถให้ภารกิจ QA กับ agent,
+สังเกตพฤติกรรมช่องทางจริง และบันทึกว่าสิ่งใดทำงาน ล้มเหลว หรือยังถูกบล็อก
-สำหรับการวนปรับ UI ของ QA Lab ในเครื่องให้เร็วขึ้นโดยไม่ต้องสร้างอิมเมจ Docker ใหม่ทุกครั้ง
-ให้เริ่มสแตกด้วยบันเดิล QA Lab ที่เมานต์แบบ bind:
+สำหรับการวนปรับ UI ของ QA Lab ภายในเครื่องให้เร็วขึ้นโดยไม่ต้องสร้างอิมเมจ Docker ใหม่ทุกครั้ง,
+ให้เริ่มสแตกด้วยบันเดิล QA Lab แบบ bind-mounted:
```bash
pnpm openclaw qa docker-build-image
@@ -85,110 +84,112 @@ pnpm qa:lab:watch
```
`qa:lab:up:fast` คงบริการ Docker ไว้บนอิมเมจที่สร้างไว้ล่วงหน้าและ bind-mount
-`extensions/qa-lab/web/dist` เข้าไปในคอนเทนเนอร์ `qa-lab` `qa:lab:watch`
-จะสร้างบันเดิลนั้นใหม่เมื่อมีการเปลี่ยนแปลง และเบราว์เซอร์จะโหลดใหม่อัตโนมัติเมื่อแฮชแอสเซต
-QA Lab เปลี่ยน
+`extensions/qa-lab/web/dist` เข้าในคอนเทนเนอร์ `qa-lab` ส่วน `qa:lab:watch`
+จะสร้างบันเดิลนั้นใหม่เมื่อมีการเปลี่ยนแปลง และเบราว์เซอร์จะ reload อัตโนมัติเมื่อ hash แอสเซต QA Lab
+เปลี่ยนไป
-สำหรับการตรวจสอบควัน trace OpenTelemetry ในเครื่อง ให้รัน:
+สำหรับ smoke trace OpenTelemetry ภายในเครื่อง ให้รัน:
```bash
pnpm qa:otel:smoke
```
-สคริปต์นั้นเริ่มตัวรับ trace OTLP/HTTP ในเครื่อง รันสถานการณ์ QA
+สคริปต์นั้นเริ่มตัวรับ trace OTLP/HTTP ภายในเครื่อง, รันสถานการณ์ QA
`otel-trace-smoke` โดยเปิดใช้ Plugin `diagnostics-otel` จากนั้น
-ถอดรหัส protobuf spans ที่ส่งออกและยืนยันรูปทรงที่สำคัญต่อการปล่อยรุ่น:
+decode protobuf spans ที่ export แล้วตรวจยืนยันรูปร่างที่สำคัญต่อ release:
ต้องมี `openclaw.run`, `openclaw.harness.run`, `openclaw.model.call`,
`openclaw.context.assembled` และ `openclaw.message.delivery`;
-model calls ต้องไม่ส่งออก `StreamAbandoned` ในเทิร์นที่สำเร็จ; ID การวินิจฉัยดิบและ
-แอตทริบิวต์ `openclaw.content.*` ต้องไม่อยู่ใน trace สคริปต์เขียน
-`otel-smoke-summary.json` ไว้ข้างอาร์ติแฟกต์ชุด QA
+การเรียกโมเดลต้องไม่ export `StreamAbandoned` ในเทิร์นที่สำเร็จ; raw diagnostic IDs และ
+แอตทริบิวต์ `openclaw.content.*` ต้องไม่อยู่ใน trace โดยเขียน
+`otel-smoke-summary.json` ไว้ถัดจาก artifacts ของ QA suite
-QA ด้าน observability คงเป็นแบบ source-checkout เท่านั้น npm tarball จงใจไม่รวม
-QA Lab ดังนั้นเลนปล่อยแพ็กเกจ Docker จะไม่รันคำสั่ง `qa` ใช้
-`pnpm qa:otel:smoke` จาก source checkout ที่สร้างแล้วเมื่อเปลี่ยนเครื่องมือวัด
-การวินิจฉัย
+Observability QA ใช้ได้เฉพาะจาก source checkout เท่านั้น npm tarball จงใจละเว้น
+QA Lab ดังนั้นเลน Docker release ของแพ็กเกจจึงไม่รันคำสั่ง `qa` ใช้
+`pnpm qa:otel:smoke` จาก source checkout ที่ build แล้วเมื่อเปลี่ยน instrumentation
+ด้าน diagnostics
-สำหรับเลนตรวจสอบควัน Matrix ที่ใช้ทรานสปอร์ตจริง ให้รัน:
+สำหรับเลน smoke Matrix ที่ใช้ transport จริง ให้รัน:
```bash
pnpm openclaw qa matrix --profile fast --fail-fast
```
-ข้อมูลอ้างอิง CLI เต็ม แค็ตตาล็อกโปรไฟล์/สถานการณ์ ตัวแปร env และเลย์เอาต์อาร์ติแฟกต์สำหรับเลนนี้อยู่ใน [QA ของ Matrix](/th/concepts/qa-matrix) โดยสรุป: คำสั่งจะจัดเตรียม homeserver Tuwunel แบบใช้แล้วทิ้งใน Docker ลงทะเบียนผู้ใช้ driver/SUT/observer ชั่วคราว รัน Plugin Matrix จริงภายใน Gateway QA ลูกที่จำกัดขอบเขตไว้กับทรานสปอร์ตนั้น (ไม่มี `qa-channel`) จากนั้นเขียนรายงาน Markdown สรุป JSON อาร์ติแฟกต์ observed-events และล็อกเอาต์พุตรวมไว้ใต้ `.artifacts/qa-e2e/matrix-/`
+เอกสารอ้างอิง CLI ฉบับเต็ม, แคตตาล็อก profile/scenario, env vars และเลย์เอาต์ artifact สำหรับเลนนี้อยู่ใน [Matrix QA](/th/concepts/qa-matrix) โดยสรุป: มัน provision homeserver Tuwunel แบบใช้แล้วทิ้งใน Docker, ลงทะเบียนผู้ใช้ driver/SUT/observer ชั่วคราว, รัน Plugin Matrix จริงภายใน Gateway QA ย่อยที่ scope กับ transport นั้น (ไม่มี `qa-channel`) จากนั้นเขียนรายงาน Markdown, สรุป JSON, artifact observed-events และ log เอาต์พุตรวมภายใต้ `.artifacts/qa-e2e/matrix-/`
-สำหรับเลนตรวจสอบควัน Telegram และ Discord ที่ใช้ทรานสปอร์ตจริง:
+สำหรับเลน smoke Telegram, Discord และ Slack ที่ใช้ transport จริง:
```bash
pnpm openclaw qa telegram
pnpm openclaw qa discord
+pnpm openclaw qa slack
```
-ทั้งสองเล็งไปที่ช่องทางจริงที่มีอยู่แล้วพร้อมบอทสองตัว (driver + SUT) ตัวแปร env ที่จำเป็น รายการสถานการณ์ อาร์ติแฟกต์เอาต์พุต และพูลข้อมูลรับรอง Convex มีเอกสารอยู่ใน [ข้อมูลอ้างอิง QA ของ Telegram และ Discord](#telegram-and-discord-qa-reference) ด้านล่าง
+เลนเหล่านี้เล็งไปที่ช่องทางจริงที่มีอยู่แล้วพร้อมบอตสองตัว (driver + SUT) env vars ที่จำเป็น, รายการสถานการณ์, output artifacts และพูล credential Convex มีเอกสารอยู่ใน [เอกสารอ้างอิง QA สำหรับ Telegram, Discord และ Slack](#telegram-discord-and-slack-qa-reference) ด้านล่าง
-ก่อนใช้ข้อมูลรับรองสดจากพูล ให้รัน:
+ก่อนใช้ credential live แบบ pooled ให้รัน:
```bash
pnpm openclaw qa credentials doctor
```
-doctor ตรวจสอบ env ของโบรกเกอร์ Convex ตรวจสอบความถูกต้องของการตั้งค่า endpoint และยืนยันการเข้าถึง admin/list เมื่อมีความลับของผู้ดูแลอยู่ โดยรายงานเฉพาะสถานะตั้งค่าแล้ว/ขาดหายสำหรับความลับ
+doctor ตรวจ env ของ broker Convex, ตรวจสอบการตั้งค่า endpoint และตรวจยืนยันว่าเข้าถึง admin/list ได้เมื่อมี secret ของ maintainer อยู่ โดยรายงานเฉพาะสถานะตั้งค่าแล้ว/ขาดหายสำหรับ secrets
-## ความครอบคลุมทรานสปอร์ตสด
+## ความครอบคลุม transport live
-เลนทรานสปอร์ตสดใช้สัญญาร่วมกันหนึ่งชุด แทนที่แต่ละเลนจะประดิษฐ์รูปทรงรายการสถานการณ์ของตัวเอง `qa-channel` คือชุดพฤติกรรมผลิตภัณฑ์สังเคราะห์แบบกว้าง และไม่ใช่ส่วนหนึ่งของเมทริกซ์ความครอบคลุมทรานสปอร์ตสด
+เลน transport live ใช้ contract เดียวร่วมกันแทนที่แต่ละเลนจะประดิษฐ์รูปร่างรายการสถานการณ์ของตัวเอง `qa-channel` เป็นชุดทดสอบพฤติกรรมผลิตภัณฑ์สังเคราะห์แบบกว้างและไม่เป็นส่วนหนึ่งของเมทริกซ์ความครอบคลุม transport live
-| เลน | Canary | การกั้น mention | บอทถึงบอท | บล็อก allowlist | การตอบกลับระดับบน | กลับมาทำต่อหลังรีสตาร์ต | การติดตาม thread | การแยก thread | การสังเกต reaction | คำสั่งช่วยเหลือ | การลงทะเบียนคำสั่งเนทีฟ |
+| เลน | Canary | Mention gating | Bot-to-bot | บล็อก allowlist | การตอบกลับระดับบนสุด | กลับมาทำต่อหลัง restart | follow-up ของเธรด | การแยกเธรด | การสังเกตรีแอ็กชัน | คำสั่งช่วยเหลือ | การลงทะเบียนคำสั่ง native |
| -------- | ------ | -------------- | ---------- | --------------- | --------------- | -------------- | ---------------- | ---------------- | -------------------- | ------------ | --------------------------- |
| Matrix | x | x | x | x | x | x | x | x | x | | |
| Telegram | x | x | x | | | | | | | x | |
| Discord | x | x | x | | | | | | | | x |
+| Slack | x | x | x | | | | | | | | |
-สิ่งนี้คง `qa-channel` ไว้เป็นชุดพฤติกรรมผลิตภัณฑ์แบบกว้าง ขณะที่ Matrix,
-Telegram และทรานสปอร์ตสดในอนาคตใช้เช็กลิสต์สัญญาทรานสปอร์ตที่ชัดเจนร่วมกันหนึ่งชุด
+สิ่งนี้คง `qa-channel` ไว้เป็นชุดทดสอบพฤติกรรมผลิตภัณฑ์แบบกว้าง ขณะที่ Matrix,
+Telegram และ transport live ในอนาคตใช้ checklist transport-contract ที่ชัดเจนร่วมกัน
-สำหรับเลน VM Linux แบบใช้แล้วทิ้งโดยไม่ต้องนำ Docker เข้ามาในเส้นทาง QA ให้รัน:
+สำหรับเลน Linux VM แบบใช้แล้วทิ้งโดยไม่ต้องนำ Docker เข้ามาในเส้นทาง QA ให้รัน:
```bash
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
```
-คำสั่งนี้บูต guest Multipass ใหม่ ติดตั้ง dependency สร้าง OpenClaw
-ภายใน guest รัน `qa suite` จากนั้นคัดลอกรายงาน QA และสรุปตามปกติ
-กลับไปยัง `.artifacts/qa-e2e/...` บน host
-คำสั่งใช้พฤติกรรมการเลือกสถานการณ์แบบเดียวกับ `qa suite` บน host
-การรันชุดบน host และ Multipass ดำเนินสถานการณ์หลายรายการที่เลือกพร้อมกัน
-ด้วย worker Gateway ที่แยกกันโดยค่าเริ่มต้น `qa-channel` ตั้งค่าเริ่มต้นเป็น concurrency
-4 โดยถูกจำกัดด้วยจำนวนสถานการณ์ที่เลือก ใช้ `--concurrency ` เพื่อปรับ
-จำนวน worker หรือ `--concurrency 1` สำหรับการดำเนินการแบบอนุกรม
-คำสั่งออกด้วยสถานะไม่ใช่ศูนย์เมื่อมีสถานการณ์ใดล้มเหลว ใช้ `--allow-failures` เมื่อ
-คุณต้องการอาร์ติแฟกต์โดยไม่มีรหัสออกที่ล้มเหลว
-การรันสดส่งต่ออินพุต auth ของ QA ที่รองรับและเหมาะสำหรับ
-guest: คีย์ provider ที่อิง env, พาธคอนฟิก provider สดของ QA และ
-`CODEX_HOME` เมื่อมีอยู่ เก็บ `--output-dir` ไว้ใต้รากรีโพเพื่อให้ guest
-เขียนกลับผ่าน workspace ที่เมานต์ได้
+คำสั่งนี้บูต guest Multipass ใหม่, ติดตั้ง dependency, build OpenClaw
+ภายใน guest, รัน `qa suite` จากนั้นคัดลอกรายงาน QA และ
+สรุปปกติกลับเข้า `.artifacts/qa-e2e/...` บน host
+มันใช้พฤติกรรมการเลือกสถานการณ์เดียวกับ `qa suite` บน host
+การรัน suite บน host และ Multipass จะ execute สถานการณ์ที่เลือกหลายรายการพร้อมกัน
+ด้วย worker Gateway ที่แยกกันโดยค่าเริ่มต้น `qa-channel` ค่าเริ่มต้น concurrency
+คือ 4 โดยถูก cap ตามจำนวนสถานการณ์ที่เลือก ใช้ `--concurrency ` เพื่อปรับ
+จำนวน worker หรือ `--concurrency 1` สำหรับการ execute แบบ serial
+คำสั่งจะ exit ด้วยค่าไม่เป็นศูนย์เมื่อสถานการณ์ใดล้มเหลว ใช้ `--allow-failures` เมื่อ
+คุณต้องการ artifacts โดยไม่มี exit code ที่ล้มเหลว
+การรัน live จะส่งต่ออินพุต auth ของ QA ที่รองรับและใช้ได้จริงสำหรับ
+guest: provider keys ผ่าน env, path คอนฟิก QA live provider และ
+`CODEX_HOME` เมื่อมีอยู่ คง `--output-dir` ไว้ภายใต้ root ของรีโปเพื่อให้ guest
+เขียนกลับผ่าน workspace ที่ mount ไว้ได้
-## ข้อมูลอ้างอิง QA ของ Telegram และ Discord
+## เอกสารอ้างอิง QA สำหรับ Telegram, Discord และ Slack
-Matrix มี [หน้าเฉพาะ](/th/concepts/qa-matrix) เนื่องจากจำนวนสถานการณ์และการจัดเตรียม homeserver ที่อิง Docker Telegram และ Discord มีขนาดเล็กกว่า — มีสถานการณ์อย่างละไม่กี่รายการ ไม่มีระบบโปรไฟล์ และรันกับช่องทางจริงที่มีอยู่แล้ว — ดังนั้นข้อมูลอ้างอิงจึงอยู่ที่นี่
+Matrix มี [หน้าเฉพาะ](/th/concepts/qa-matrix) เนื่องจากจำนวนสถานการณ์และการ provision homeserver ที่รองรับด้วย Docker Telegram, Discord และ Slack มีขนาดเล็กกว่า — มีสถานการณ์ไม่กี่รายการต่อแต่ละตัว, ไม่มีระบบ profile, ทำงานกับช่องทางจริงที่มีอยู่แล้ว — ดังนั้นเอกสารอ้างอิงของพวกมันจึงอยู่ที่นี่
### แฟล็ก CLI ที่ใช้ร่วมกัน
-ทั้งสองเลนลงทะเบียนผ่าน `extensions/qa-lab/src/live-transports/shared/live-transport-cli.ts` และรับแฟล็กเดียวกัน:
+เลนเหล่านี้ลงทะเบียนผ่าน `extensions/qa-lab/src/live-transports/shared/live-transport-cli.ts` และรับแฟล็กเดียวกัน:
-| แฟล็ก | ค่าเริ่มต้น | คำอธิบาย |
-| ------------------------------------- | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
-| `--scenario ` | — | รันเฉพาะสถานการณ์นี้ ทำซ้ำได้ |
-| `--output-dir ` | `/.artifacts/qa-e2e/{telegram,discord}-` | ตำแหน่งที่เขียนรายงาน/สรุป/ข้อความที่สังเกตพบ และบันทึกผลลัพธ์ พาธแบบสัมพัทธ์จะอ้างอิงจาก `--repo-root` |
-| `--repo-root ` | `process.cwd()` | รากของ Repository เมื่อเรียกใช้จาก cwd ที่เป็นกลาง |
-| `--sut-account ` | `sut` | ID บัญชีชั่วคราวภายในคอนฟิก Gateway ของ QA |
-| `--provider-mode ` | `live-frontier` | `mock-openai` หรือ `live-frontier` (`live-openai` แบบเดิมยังใช้งานได้) |
-| `--model [` / `--alt-model ][` | ค่าเริ่มต้นของผู้ให้บริการ | ref ของโมเดลหลัก/สำรอง |
-| `--fast` | ปิด | โหมดเร็วของผู้ให้บริการเมื่อรองรับ |
-| `--credential-source ` | `env` | ดู [พูลข้อมูลรับรอง Convex](#convex-credential-pool) |
-| `--credential-role ` | `ci` ใน CI, มิฉะนั้นเป็น `maintainer` | บทบาทที่ใช้เมื่อ `--credential-source convex` |
+| แฟล็ก | ค่าเริ่มต้น | คำอธิบาย |
+| ------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
+| `--scenario ` | — | เรียกใช้เฉพาะสถานการณ์นี้ ทำซ้ำได้ |
+| `--output-dir ` | `/.artifacts/qa-e2e/{telegram,discord,slack}-` | ตำแหน่งที่เขียนรายงาน/สรุป/ข้อความที่สังเกตได้ และบันทึกเอาต์พุต พาธสัมพัทธ์จะอิงจาก `--repo-root` |
+| `--repo-root ` | `process.cwd()` | รากของ repository เมื่อเรียกใช้จาก cwd ที่เป็นกลาง |
+| `--sut-account ` | `sut` | ID บัญชีชั่วคราวภายในคอนฟิก Gateway ของ QA |
+| `--provider-mode ` | `live-frontier` | `mock-openai` หรือ `live-frontier` (`live-openai` แบบเดิมยังใช้งานได้) |
+| `--model ][` / `--alt-model ][` | ค่าเริ่มต้นของผู้ให้บริการ | การอ้างอิงโมเดลหลัก/สำรอง |
+| `--fast` | ปิด | โหมดเร็วของผู้ให้บริการเมื่อรองรับ |
+| `--credential-source ` | `env` | ดู [กลุ่มข้อมูลประจำตัว Convex](#convex-credential-pool) |
+| `--credential-role ` | `ci` ใน CI, มิฉะนั้นเป็น `maintainer` | บทบาทที่ใช้เมื่อ `--credential-source convex` |
-ทั้งสองจะออกด้วยค่าที่ไม่ใช่ศูนย์เมื่อมีสถานการณ์ใดล้มเหลว `--allow-failures` จะเขียนอาร์ติแฟกต์โดยไม่ตั้งรหัสออกให้เป็นสถานะล้มเหลว
+แต่ละ lane จะออกด้วยค่าที่ไม่ใช่ศูนย์เมื่อมีสถานการณ์ใดล้มเหลว `--allow-failures` จะเขียน artifacts โดยไม่ตั้งค่า exit code เป็นล้มเหลว
### QA ของ Telegram
@@ -196,7 +197,7 @@ Matrix มี [หน้าเฉพาะ](/th/concepts/qa-matrix) เนื่
pnpm openclaw qa telegram
```
-กำหนดเป้าหมายไปยังกลุ่ม Telegram ส่วนตัวจริงหนึ่งกลุ่มที่มีบอตสองตัวแยกกัน (driver + SUT) บอต SUT ต้องมีชื่อผู้ใช้ Telegram; การสังเกตการณ์แบบบอตต่อบอตทำงานได้ดีที่สุดเมื่อบอตทั้งสองเปิดใช้งาน **Bot-to-Bot Communication Mode** ใน `@BotFather`
+กำหนดเป้าหมายไปยังกลุ่ม Telegram ส่วนตัวจริงหนึ่งกลุ่มที่มีบอทแตกต่างกันสองตัว (driver + SUT) บอท SUT ต้องมีชื่อผู้ใช้ Telegram; การสังเกตแบบบอทถึงบอททำงานได้ดีที่สุดเมื่อบอททั้งสองเปิดใช้ **โหมดการสื่อสารแบบบอทถึงบอท** ใน `@BotFather`
env ที่จำเป็นเมื่อ `--credential-source env`:
@@ -204,9 +205,9 @@ env ที่จำเป็นเมื่อ `--credential-source env`:
- `OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN`
- `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`
-ตัวเลือกเพิ่มเติม:
+ตัวเลือกเสริม:
-- `OPENCLAW_QA_TELEGRAM_CAPTURE_CONTENT=1` จะเก็บเนื้อหาข้อความไว้ในอาร์ติแฟกต์ข้อความที่สังเกตพบ (ค่าเริ่มต้นจะปกปิด)
+- `OPENCLAW_QA_TELEGRAM_CAPTURE_CONTENT=1` เก็บเนื้อหาข้อความไว้ใน artifacts ของข้อความที่สังเกตได้ (ค่าเริ่มต้นจะปกปิด)
สถานการณ์ (`extensions/qa-lab/src/live-transports/telegram/telegram-live.runtime.ts:44`):
@@ -219,11 +220,11 @@ env ที่จำเป็นเมื่อ `--credential-source env`:
- `telegram-whoami-command`
- `telegram-context-command`
-อาร์ติแฟกต์ผลลัพธ์:
+Artifacts เอาต์พุต:
- `telegram-qa-report.md`
-- `telegram-qa-summary.json` — รวม RTT ต่อการตอบกลับ (driver ส่ง → สังเกตพบการตอบกลับของ SUT) เริ่มตั้งแต่ canary
-- `telegram-qa-observed-messages.json` — เนื้อหาจะถูกปกปิด เว้นแต่ตั้ง `OPENCLAW_QA_TELEGRAM_CAPTURE_CONTENT=1`
+- `telegram-qa-summary.json` — รวม RTT ต่อการตอบกลับ (driver ส่ง → สังเกตเห็น SUT ตอบกลับ) โดยเริ่มจาก canary
+- `telegram-qa-observed-messages.json` — เนื้อหาถูกปกปิด เว้นแต่ `OPENCLAW_QA_TELEGRAM_CAPTURE_CONTENT=1`
### QA ของ Discord
@@ -231,7 +232,7 @@ env ที่จำเป็นเมื่อ `--credential-source env`:
pnpm openclaw qa discord
```
-กำหนดเป้าหมายไปยังช่องใน Discord guild ส่วนตัวจริงหนึ่งช่องที่มีบอตสองตัว: บอต driver ที่ควบคุมโดย harness และบอต SUT ที่เริ่มโดย Gateway ย่อยของ OpenClaw ผ่าน Plugin Discord ที่บันเดิลมา ตรวจสอบการจัดการการ mention ในช่อง ว่าบอต SUT ได้ลงทะเบียนคำสั่งเนทีฟ `/help` กับ Discord แล้ว และสถานการณ์หลักฐาน Mantis แบบ opt-in
+กำหนดเป้าหมายไปยังช่อง guild ส่วนตัวจริงหนึ่งช่องใน Discord ด้วยบอทสองตัว: บอท driver ที่ควบคุมโดย harness และบอท SUT ที่เริ่มโดย Gateway ลูกของ OpenClaw ผ่าน Plugin Discord ที่ bundled มา ตรวจสอบการจัดการการกล่าวถึงช่อง, การที่บอท SUT ลงทะเบียนคำสั่งเนทีฟ `/help` กับ Discord แล้ว, และสถานการณ์หลักฐาน Mantis แบบ opt-in
env ที่จำเป็นเมื่อ `--credential-source env`:
@@ -239,20 +240,20 @@ env ที่จำเป็นเมื่อ `--credential-source env`:
- `OPENCLAW_QA_DISCORD_CHANNEL_ID`
- `OPENCLAW_QA_DISCORD_DRIVER_BOT_TOKEN`
- `OPENCLAW_QA_DISCORD_SUT_BOT_TOKEN`
-- `OPENCLAW_QA_DISCORD_SUT_APPLICATION_ID` — ต้องตรงกับ ID ผู้ใช้ของบอต SUT ที่ Discord ส่งกลับมา (ไม่เช่นนั้น lane จะล้มเหลวทันที)
+- `OPENCLAW_QA_DISCORD_SUT_APPLICATION_ID` — ต้องตรงกับ ID ผู้ใช้ของบอท SUT ที่ Discord ส่งคืน (มิฉะนั้น lane จะล้มเหลวอย่างรวดเร็ว)
-ตัวเลือกเพิ่มเติม:
+ตัวเลือกเสริม:
-- `OPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1` จะเก็บเนื้อหาข้อความไว้ในอาร์ติแฟกต์ข้อความที่สังเกตพบ
+- `OPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1` เก็บเนื้อหาข้อความไว้ใน artifacts ของข้อความที่สังเกตได้
สถานการณ์ (`extensions/qa-lab/src/live-transports/discord/discord-live.runtime.ts:36`):
- `discord-canary`
- `discord-mention-gating`
- `discord-native-help-command-registration`
-- `discord-status-reactions-tool-only` — สถานการณ์ Mantis แบบ opt-in รันแยกเดี่ยวเพราะจะสลับ SUT ไปเป็นการตอบกลับใน guild แบบเปิดตลอดเวลาและใช้เฉพาะเครื่องมือ โดยตั้ง `messages.statusReactions.enabled=true` จากนั้นจับไทม์ไลน์ reaction ผ่าน REST รวมถึงอาร์ติแฟกต์ภาพ HTML/PNG
+- `discord-status-reactions-tool-only` — สถานการณ์ Mantis แบบ opt-in ทำงานด้วยตัวเองเพราะจะสลับ SUT ให้ตอบกลับ guild แบบเปิดตลอดเวลาและใช้เฉพาะเครื่องมือด้วย `messages.statusReactions.enabled=true` จากนั้นจับไทม์ไลน์ reaction ผ่าน REST พร้อม artifact ภาพ HTML/PNG
-รันสถานการณ์ status-reaction ของ Mantis อย่างชัดเจน:
+เรียกใช้สถานการณ์ status-reaction ของ Mantis อย่างชัดเจน:
```bash
pnpm openclaw qa discord \
@@ -263,141 +264,168 @@ pnpm openclaw qa discord \
--fast
```
-อาร์ติแฟกต์ผลลัพธ์:
+Artifacts เอาต์พุต:
- `discord-qa-report.md`
- `discord-qa-summary.json`
-- `discord-qa-observed-messages.json` — เนื้อหาจะถูกปกปิด เว้นแต่ตั้ง `OPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1`
-- `discord-qa-reaction-timelines.json` และ `discord-status-reactions-tool-only-timeline.png` เมื่อสถานการณ์ status-reaction รัน
+- `discord-qa-observed-messages.json` — เนื้อหาถูกปกปิด เว้นแต่ `OPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1`
+- `discord-qa-reaction-timelines.json` และ `discord-status-reactions-tool-only-timeline.png` เมื่อสถานการณ์ status-reaction ทำงาน
-### พูลข้อมูลรับรอง Convex
+### QA ของ Slack
-ทั้ง lane ของ Telegram และ Discord สามารถเช่าข้อมูลรับรองจากพูล Convex ที่ใช้ร่วมกันแทนการอ่าน env vars ด้านบน ส่ง `--credential-source convex` (หรือตั้ง `OPENCLAW_QA_CREDENTIAL_SOURCE=convex`); QA Lab จะรับ lease แบบเอกสิทธิ์ ส่ง Heartbeat ตลอดระยะเวลาการรัน และปล่อย lease เมื่อปิดระบบ ชนิดของพูลคือ `"telegram"` และ `"discord"`
+```bash
+pnpm openclaw qa slack
+```
-รูปแบบ payload ที่ broker ตรวจสอบใน `admin/add`:
+กำหนดเป้าหมายไปยังช่อง Slack ส่วนตัวจริงหนึ่งช่องที่มีบอทแตกต่างกันสองตัว: บอท driver ที่ควบคุมโดย harness และบอท SUT ที่เริ่มโดย Gateway ลูกของ OpenClaw ผ่าน Plugin Slack ที่ bundled มา
+
+env ที่จำเป็นเมื่อ `--credential-source env`:
+
+- `OPENCLAW_QA_SLACK_CHANNEL_ID`
+- `OPENCLAW_QA_SLACK_DRIVER_BOT_TOKEN`
+- `OPENCLAW_QA_SLACK_SUT_BOT_TOKEN`
+- `OPENCLAW_QA_SLACK_SUT_APP_TOKEN`
+
+ตัวเลือกเสริม:
+
+- `OPENCLAW_QA_SLACK_CAPTURE_CONTENT=1` เก็บเนื้อหาข้อความไว้ใน artifacts ของข้อความที่สังเกตได้
+
+สถานการณ์ (`extensions/qa-lab/src/live-transports/slack/slack-live.runtime.ts:39`):
+
+- `slack-canary`
+- `slack-mention-gating`
+
+Artifacts เอาต์พุต:
+
+- `slack-qa-report.md`
+- `slack-qa-summary.json`
+- `slack-qa-observed-messages.json` — เนื้อหาถูกปกปิด เว้นแต่ `OPENCLAW_QA_SLACK_CAPTURE_CONTENT=1`
+
+### กลุ่มข้อมูลประจำตัว Convex
+
+lane ของ Telegram, Discord, และ Slack สามารถเช่าข้อมูลประจำตัวจากกลุ่ม Convex ที่ใช้ร่วมกันแทนการอ่าน env vars ข้างต้นได้ ส่ง `--credential-source convex` (หรือตั้งค่า `OPENCLAW_QA_CREDENTIAL_SOURCE=convex`); QA Lab จะขอ lease แบบเอกสิทธิ์ ส่ง Heartbeat ตลอดช่วงเวลาการรัน และปล่อย lease เมื่อปิดระบบ ชนิดของกลุ่มคือ `"telegram"`, `"discord"`, และ `"slack"`
+
+รูปแบบ payload ที่ broker ตรวจสอบบน `admin/add`:
- Telegram (`kind: "telegram"`): `{ groupId: string, driverToken: string, sutToken: string }` — `groupId` ต้องเป็นสตริง chat-id แบบตัวเลข
- Discord (`kind: "discord"`): `{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string }`
-env vars สำหรับปฏิบัติการและสัญญาของ endpoint broker ของ Convex อยู่ใน [การทดสอบ → ข้อมูลรับรอง Telegram ที่ใช้ร่วมกันผ่าน Convex](/th/help/testing#shared-telegram-credentials-via-convex-v1) (ชื่อส่วนนี้มีมาก่อนการรองรับ Discord; ความหมายของ broker เหมือนกันสำหรับทั้งสองชนิด)
+env vars สำหรับปฏิบัติการและสัญญา endpoint ของ broker Convex อยู่ใน [การทดสอบ → ข้อมูลประจำตัว Telegram ที่ใช้ร่วมกันผ่าน Convex](/th/help/testing#shared-telegram-credentials-via-convex-v1) (ชื่อส่วนนี้มีมาก่อนการรองรับ Discord; ความหมายของ broker เหมือนกันสำหรับทั้งสองชนิด)
-## seed ที่อิง Repository
+## Seeds ที่อิงจาก repo
-แอสเซ็ต seed อยู่ใน `qa/`:
+Seed assets อยู่ใน `qa/`:
- `qa/scenarios/index.md`
- `qa/scenarios//*.md`
-ไฟล์เหล่านี้ตั้งใจให้อยู่ใน git เพื่อให้แผน QA มองเห็นได้ทั้งสำหรับมนุษย์และ
+สิ่งเหล่านี้ตั้งใจให้อยู่ใน git เพื่อให้แผน QA มองเห็นได้ทั้งสำหรับมนุษย์และ
agent
-`qa-lab` ควรคงเป็น runner markdown ทั่วไป ไฟล์ markdown ของแต่ละสถานการณ์เป็น
-แหล่งข้อมูลจริงสำหรับการรันทดสอบหนึ่งครั้ง และควรกำหนด:
+`qa-lab` ควรยังคงเป็น runner markdown ทั่วไป ไฟล์ markdown ของแต่ละสถานการณ์คือ
+แหล่งความจริงสำหรับการทดสอบหนึ่งครั้ง และควรกำหนด:
-- เมทาดาต้าของสถานการณ์
-- เมทาดาต้าหมวดหมู่ ความสามารถ lane และความเสี่ยงแบบเลือกได้
+- metadata ของสถานการณ์
+- metadata หมวดหมู่, capability, lane, และความเสี่ยงแบบเลือกได้
- refs ของเอกสารและโค้ด
- ข้อกำหนด Plugin แบบเลือกได้
-- แพตช์คอนฟิก Gateway แบบเลือกได้
-- `qa-flow` ที่เรียกใช้งานได้
+- patch คอนฟิก Gateway แบบเลือกได้
+- `qa-flow` ที่เรียกใช้ได้
-พื้นผิว runtime ที่ใช้ซ้ำได้ซึ่งรองรับ `qa-flow` สามารถคงเป็นแบบทั่วไป
-และครอบคลุมหลายส่วนได้ ตัวอย่างเช่น สถานการณ์ markdown สามารถรวม helper ฝั่ง transport
-กับ helper ฝั่งเบราว์เซอร์ที่ควบคุม Control UI แบบฝังผ่าน
-seam `browser.request` ของ Gateway ได้ โดยไม่ต้องเพิ่ม runner แบบกรณีพิเศษ
+พื้นผิว runtime ที่ใช้ซ้ำได้ซึ่งรองรับ `qa-flow` สามารถคงความทั่วไป
+และข้ามหลายส่วนได้ ตัวอย่างเช่น สถานการณ์ markdown สามารถรวม helper ฝั่ง transport
+กับ helper ฝั่งเบราว์เซอร์ที่ขับ Control UI แบบฝังผ่าน
+seam `browser.request` ของ Gateway ได้โดยไม่ต้องเพิ่ม runner แบบกรณีพิเศษ
-ไฟล์สถานการณ์ควรถูกจัดกลุ่มตามความสามารถของผลิตภัณฑ์แทนที่จะตามโฟลเดอร์
-source tree รักษา ID สถานการณ์ให้คงที่เมื่อย้ายไฟล์; ใช้ `docsRefs` และ `codeRefs`
-เพื่อให้ตรวจสอบย้อนกลับไปยังการนำไปใช้ได้
+ควรจัดกลุ่มไฟล์สถานการณ์ตาม capability ของผลิตภัณฑ์แทนที่จะตามโฟลเดอร์ source tree
+ให้ ID สถานการณ์คงที่เมื่อย้ายไฟล์; ใช้ `docsRefs` และ `codeRefs`
+เพื่อให้ตามรอยการ implement ได้
รายการ baseline ควรกว้างพอที่จะครอบคลุม:
- แชต DM และช่อง
-- พฤติกรรมของเธรด
-- วงจรชีวิตของ action ข้อความ
-- callback ของ cron
-- การเรียกคืนหน่วยความจำ
+- พฤติกรรมของ thread
+- lifecycle ของ message action
+- callbacks ของ cron
+- การเรียกคืน memory
- การสลับโมเดล
-- การส่งต่อไปยัง subagent
-- การอ่าน Repository และการอ่านเอกสาร
+- การส่งต่อให้ subagent
+- การอ่าน repo และการอ่านเอกสาร
- งาน build ขนาดเล็กหนึ่งงาน เช่น Lobster Invaders
## Lane mock ของผู้ให้บริการ
-`qa suite` มี lane mock ของผู้ให้บริการภายในเครื่องสองแบบ:
+`qa suite` มี lane mock ผู้ให้บริการแบบ local สอง lane:
-- `mock-openai` คือ mock ของ OpenClaw ที่รู้จักสถานการณ์ ยังคงเป็น lane mock
- แบบกำหนดผลได้ค่าเดิมสำหรับ QA ที่อิง Repository และ parity gates
-- `aimock` เริ่มเซิร์ฟเวอร์ผู้ให้บริการที่อิง AIMock สำหรับความครอบคลุมของ protocol
- ทดลอง fixture การบันทึก/เล่นซ้ำ และ chaos เป็นส่วนเพิ่มเติมและไม่ได้
- แทนที่ dispatcher สถานการณ์ `mock-openai`
+- `mock-openai` คือ mock ของ OpenClaw ที่รับรู้สถานการณ์ มันยังคงเป็น lane mock แบบกำหนดแน่นอนค่าเริ่มต้นสำหรับ QA ที่อิงจาก repo และ parity gates
+- `aimock` เริ่ม server ผู้ให้บริการที่อิงจาก AIMock สำหรับความครอบคลุมของ protocol, fixture, record/replay, และ chaos เชิงทดลอง เป็นส่วนเสริมและไม่แทนที่ dispatcher สถานการณ์ `mock-openai`
-การนำ lane ของผู้ให้บริการไปใช้อยู่ภายใต้ `extensions/qa-lab/src/providers/`
-ผู้ให้บริการแต่ละรายเป็นเจ้าของค่าเริ่มต้นของตนเอง การเริ่มเซิร์ฟเวอร์ภายในเครื่อง คอนฟิกโมเดล Gateway
-ความต้องการ staging ของ auth-profile และแฟล็กความสามารถ live/mock โค้ด suite และ
-Gateway ที่ใช้ร่วมกันควร route ผ่าน registry ของผู้ให้บริการแทนการ branching ตาม
+การ implement provider-lane อยู่ใต้ `extensions/qa-lab/src/providers/`
+ผู้ให้บริการแต่ละรายเป็นเจ้าของค่าเริ่มต้น, การเริ่ม server local, คอนฟิกโมเดล Gateway,
+ความต้องการ staging ของ auth-profile, และ flag capability แบบ live/mock โค้ด suite และ
+Gateway ที่ใช้ร่วมกันควร route ผ่าน provider registry แทนการ branch ตาม
ชื่อผู้ให้บริการ
-## Adapter ของ transport
+## Transport adapters
-`qa-lab` เป็นเจ้าของ seam transport ทั่วไปสำหรับสถานการณ์ QA แบบ markdown `qa-channel` เป็น adapter แรกบน seam นั้น แต่เป้าหมายการออกแบบกว้างกว่า: ช่องจริงหรือสังเคราะห์ในอนาคตควรเสียบเข้ากับ suite runner เดียวกันแทนการเพิ่ม QA runner เฉพาะ transport
+`qa-lab` เป็นเจ้าของ seam transport ทั่วไปสำหรับสถานการณ์ QA แบบ markdown `qa-channel` คือ adapter ตัวแรกบน seam นั้น แต่เป้าหมายการออกแบบกว้างกว่า: channel จริงหรือสังเคราะห์ในอนาคตควร plug into suite runner เดียวกันแทนการเพิ่ม runner QA เฉพาะ transport
-ในระดับสถาปัตยกรรม การแบ่งมีดังนี้:
+ในระดับสถาปัตยกรรม การแบ่งคือ:
-- `qa-lab` เป็นเจ้าของการเรียกใช้สถานการณ์ทั่วไป concurrency ของ worker การเขียนอาร์ติแฟกต์ และการรายงาน
-- Adapter ของ transport เป็นเจ้าของคอนฟิก Gateway ความพร้อม การสังเกตการณ์ inbound และ outbound, action ของ transport และสถานะ transport ที่ทำให้เป็นมาตรฐานแล้ว
-- ไฟล์สถานการณ์ markdown ภายใต้ `qa/scenarios/` กำหนดการรันทดสอบ; `qa-lab` ให้พื้นผิว runtime ที่ใช้ซ้ำได้ซึ่งเรียกใช้ไฟล์เหล่านั้น
+- `qa-lab` เป็นเจ้าของการดำเนินการสถานการณ์ทั่วไป, concurrency ของ worker, การเขียน artifact, และการรายงาน
+- transport adapter เป็นเจ้าของคอนฟิก Gateway, readiness, การสังเกต inbound และ outbound, transport actions, และสถานะ transport ที่ normalize แล้ว
+- ไฟล์สถานการณ์ markdown ใต้ `qa/scenarios/` กำหนดการทดสอบ; `qa-lab` ให้พื้นผิว runtime ที่ใช้ซ้ำได้ซึ่งเรียกใช้ไฟล์เหล่านั้น
-### การเพิ่มช่อง
+### การเพิ่ม channel
-การเพิ่มช่องเข้าในระบบ QA แบบ markdown ต้องมีสองอย่างเท่านั้น:
+การเพิ่ม channel ให้ระบบ QA แบบ markdown ต้องมีสองสิ่งเท่านั้น:
-1. Adapter ของ transport สำหรับช่องนั้น
-2. ชุดสถานการณ์ที่ทดสอบสัญญาของช่องนั้น
+1. transport adapter สำหรับ channel
+2. scenario pack ที่ทดสอบสัญญา channel
-อย่าเพิ่ม root คำสั่ง QA ระดับบนสุดใหม่เมื่อ host `qa-lab` ที่ใช้ร่วมกันสามารถเป็นเจ้าของ flow ได้
+อย่าเพิ่มรากคำสั่ง QA ระดับบนใหม่เมื่อ host `qa-lab` ที่ใช้ร่วมกันสามารถเป็นเจ้าของ flow ได้
`qa-lab` เป็นเจ้าของกลไก host ที่ใช้ร่วมกัน:
-- root คำสั่ง `openclaw qa`
-- การเริ่มและการรื้อถอน suite
+- รากคำสั่ง `openclaw qa`
+- การเริ่มและ teardown ของ suite
- concurrency ของ worker
-- การเขียนอาร์ติแฟกต์
+- การเขียน artifact
- การสร้างรายงาน
-- การเรียกใช้สถานการณ์
-- alias ความเข้ากันได้สำหรับสถานการณ์ `qa-channel` รุ่นเก่า
+- การดำเนินการสถานการณ์
+- alias เพื่อ compatibility สำหรับสถานการณ์ `qa-channel` เก่า
-Plugin ของ runner เป็นเจ้าของสัญญา transport:
+Runner plugins เป็นเจ้าของสัญญา transport:
-- วิธี mount `openclaw qa ` ไว้ใต้ root `qa` ที่ใช้ร่วมกัน
+- วิธี mount `openclaw qa ` ใต้ราก `qa` ที่ใช้ร่วมกัน
- วิธีคอนฟิก Gateway สำหรับ transport นั้น
-- วิธีตรวจสอบความพร้อม
-- วิธี inject event inbound
+- วิธีตรวจ readiness
+- วิธี inject เหตุการณ์ inbound
- วิธีสังเกตข้อความ outbound
-- วิธีเปิดเผย transcript และสถานะ transport ที่ทำให้เป็นมาตรฐานแล้ว
-- วิธีเรียกใช้ action ที่อิง transport
+- วิธีเปิดเผย transcripts และสถานะ transport ที่ normalize แล้ว
+- วิธีดำเนินการ actions ที่อิงจาก transport
- วิธีจัดการ reset หรือ cleanup เฉพาะ transport
-เกณฑ์ขั้นต่ำในการรับช่องใหม่:
+เกณฑ์ขั้นต่ำในการนำ channel ใหม่มาใช้:
-1. ให้ `qa-lab` เป็นเจ้าของ root `qa` ที่ใช้ร่วมกัน
-2. นำ transport runner ไปใช้บน seam host `qa-lab` ที่ใช้ร่วมกัน
-3. เก็บกลไกเฉพาะ transport ไว้ภายใน Plugin ของ runner หรือ harness ของช่อง
-4. Mount runner เป็น `openclaw qa ` แทนการลงทะเบียน root command ที่แข่งขันกัน Plugin ของ runner ควรประกาศ `qaRunners` ใน `openclaw.plugin.json` และ export array `qaRunnerCliRegistrations` ที่ตรงกันจาก `runtime-api.ts` ให้ `runtime-api.ts` เบาไว้; CLI แบบ lazy และการเรียกใช้ runner ควรอยู่หลัง entrypoint แยกต่างหาก
+1. ให้ `qa-lab` เป็นเจ้าของ root `qa` ที่ใช้ร่วมกันต่อไป
+2. นำ transport runner ไปใช้งานบนจุดเชื่อมของโฮสต์ `qa-lab` ที่ใช้ร่วมกัน
+3. เก็บกลไกเฉพาะ transport ไว้ใน Plugin ของ runner หรือ harness ของ channel
+4. เมานต์ runner เป็น `openclaw qa ` แทนการลงทะเบียนคำสั่ง root ที่แข่งขันกัน Plugin ของ runner ควรประกาศ `qaRunners` ใน `openclaw.plugin.json` และส่งออกอาร์เรย์ `qaRunnerCliRegistrations` ที่ตรงกันจาก `runtime-api.ts` ทำให้ `runtime-api.ts` เบาไว้; การทำงานของ CLI และ runner แบบ lazy ควรอยู่หลัง entrypoint แยกต่างหาก
5. เขียนหรือปรับสถานการณ์ markdown ภายใต้ไดเรกทอรี `qa/scenarios/` ตามธีม
-6. ใช้ helper สถานการณ์ทั่วไปสำหรับสถานการณ์ใหม่
-7. รักษา alias ความเข้ากันได้ที่มีอยู่ให้ทำงานต่อไป เว้นแต่ Repository กำลังทำ migration โดยตั้งใจ
+6. ใช้ helper สถานการณ์แบบทั่วไปสำหรับสถานการณ์ใหม่
+7. รักษา alias สำหรับความเข้ากันได้เดิมให้ใช้งานได้ต่อไป เว้นแต่ repo กำลังทำ migration โดยตั้งใจ
กฎการตัดสินใจเข้มงวด:
-- หากพฤติกรรมสามารถแสดงได้ครั้งเดียวใน `qa-lab` ให้ใส่ไว้ใน `qa-lab`
-- หากพฤติกรรมขึ้นอยู่กับ transport ของช่องหนึ่ง ให้เก็บไว้ใน Plugin ของ runner นั้นหรือ harness ของ Plugin
-- หากสถานการณ์ต้องการความสามารถใหม่ที่หลายช่องสามารถใช้ได้ ให้เพิ่ม helper ทั่วไปแทน branch เฉพาะช่องใน `suite.ts`
-- หากพฤติกรรมมีความหมายเฉพาะกับ transport หนึ่งเท่านั้น ให้คงสถานการณ์เป็นแบบเฉพาะ transport และระบุให้ชัดเจนในสัญญาของสถานการณ์
+- ถ้าพฤติกรรมสามารถอธิบายได้ครั้งเดียวใน `qa-lab` ให้ใส่ไว้ใน `qa-lab`
+- ถ้าพฤติกรรมขึ้นกับ channel transport หนึ่งรายการ ให้เก็บไว้ใน Plugin ของ runner หรือ harness ของ Plugin นั้น
+- ถ้าสถานการณ์ต้องการความสามารถใหม่ที่มากกว่าหนึ่ง channel ใช้ได้ ให้เพิ่ม helper แบบทั่วไปแทน branch เฉพาะ channel ใน `suite.ts`
+- ถ้าพฤติกรรมมีความหมายเฉพาะกับ transport เดียว ให้สถานการณ์เป็นแบบเฉพาะ transport และระบุเรื่องนั้นให้ชัดเจนในสัญญาของสถานการณ์
### ชื่อ helper ของสถานการณ์
-helper ทั่วไปที่แนะนำสำหรับสถานการณ์ใหม่:
+helper แบบทั่วไปที่แนะนำสำหรับสถานการณ์ใหม่:
- `waitForTransportReady`
- `waitForChannelReady`
@@ -412,22 +440,22 @@ helper ทั่วไปที่แนะนำสำหรับสถาน
- `formatTransportTranscript`
- `resetTransport`
-Aliases ความเข้ากันได้ยังคงพร้อมใช้งานสำหรับสถานการณ์ที่มีอยู่ — `waitForQaChannelReady`, `waitForOutboundMessage`, `waitForNoOutbound`, `formatConversationTranscript`, `resetBus` — แต่การเขียนสถานการณ์ใหม่ควรใช้ชื่อทั่วไป Aliases มีไว้เพื่อหลีกเลี่ยงการย้ายแบบเปลี่ยนพร้อมกันทั้งหมด ไม่ใช่เป็นรูปแบบสำหรับอนาคต
+alias สำหรับความเข้ากันได้ยังคงมีให้ใช้สำหรับสถานการณ์เดิม — `waitForQaChannelReady`, `waitForOutboundMessage`, `waitForNoOutbound`, `formatConversationTranscript`, `resetBus` — แต่การเขียนสถานการณ์ใหม่ควรใช้ชื่อแบบทั่วไป alias เหล่านี้มีไว้เพื่อหลีกเลี่ยงการ migration แบบบังคับพร้อมกันทั้งหมด ไม่ใช่โมเดลสำหรับอนาคต
## การรายงาน
-`qa-lab` ส่งออกรายงานโปรโตคอล Markdown จากไทม์ไลน์ bus ที่สังเกตได้
+`qa-lab` ส่งออกรายงานโปรโตคอล Markdown จากไทม์ไลน์ของ bus ที่สังเกตได้
รายงานควรตอบว่า:
- อะไรทำงานได้
- อะไรล้มเหลว
-- อะไรยังคงถูกบล็อก
-- สถานการณ์ติดตามผลใดควรค่าแก่การเพิ่ม
+- อะไรยังถูกบล็อกอยู่
+- สถานการณ์ติดตามผลใดควรเพิ่ม
-สำหรับรายการสถานการณ์ที่พร้อมใช้งาน — มีประโยชน์เมื่อประเมินขนาดงานติดตามผลหรือเชื่อมต่อ transport ใหม่ — ให้รัน `pnpm openclaw qa coverage` (เพิ่ม `--json` สำหรับเอาต์พุตที่เครื่องอ่านได้)
+สำหรับรายการสถานการณ์ที่มีอยู่ — ซึ่งมีประโยชน์เมื่อประเมินขนาดงานติดตามผลหรือเชื่อมต่อ transport ใหม่ — ให้รัน `pnpm openclaw qa coverage` (เพิ่ม `--json` สำหรับเอาต์พุตที่เครื่องอ่านได้)
-สำหรับการตรวจสอบบุคลิกและสไตล์ ให้รันสถานการณ์เดียวกันกับ refs ของโมเดลจริงหลายรายการ
-และเขียนรายงาน Markdown ที่ผ่านการตัดสิน:
+สำหรับการตรวจสอบลักษณะตัวละครและสไตล์ ให้รันสถานการณ์เดียวกันกับ ref ของโมเดล live หลายรายการ
+แล้วเขียนรายงาน Markdown ที่ผ่านการตัดสิน:
```bash
pnpm openclaw qa character-eval \
@@ -446,41 +474,42 @@ pnpm openclaw qa character-eval \
--judge-concurrency 16
```
-คำสั่งนี้รันโปรเซสลูกของ Gateway QA ภายในเครื่อง ไม่ใช่ Docker สถานการณ์ character eval
-ควรกำหนด persona ผ่าน `SOUL.md` แล้วรันเทิร์นผู้ใช้ทั่วไป
-เช่น แชต ความช่วยเหลือเกี่ยวกับ workspace และงานไฟล์ขนาดเล็ก ไม่ควรบอกโมเดลผู้สมัคร
-ว่ากำลังถูกประเมิน คำสั่งจะเก็บ transcript แบบเต็มแต่ละรายการ
-บันทึกสถิติการรันพื้นฐาน จากนั้นขอให้โมเดลผู้ตัดสินในโหมดเร็วพร้อมการให้เหตุผล
-`xhigh` เมื่อรองรับ จัดอันดับการรันตามความเป็นธรรมชาติ บรรยากาศ และอารมณ์ขัน
+คำสั่งนี้รันโปรเซสลูกของ QA gateway ในเครื่อง ไม่ใช่ Docker สถานการณ์ character eval
+ควรกำหนด persona ผ่าน `SOUL.md` จากนั้นรัน turn ผู้ใช้ตามปกติ
+เช่น chat, ความช่วยเหลือใน workspace และงานไฟล์ขนาดเล็ก ไม่ควรบอกโมเดลผู้สมัคร
+ว่ากำลังถูกประเมิน คำสั่งจะเก็บ transcript ฉบับเต็มแต่ละรายการ
+บันทึกสถิติพื้นฐานของการรัน จากนั้นถามโมเดลผู้ตัดสินในโหมด fast พร้อมการให้เหตุผล
+`xhigh` เมื่อรองรับ เพื่อจัดอันดับการรันตามความเป็นธรรมชาติ vibe และอารมณ์ขัน
ใช้ `--blind-judge-models` เมื่อเปรียบเทียบผู้ให้บริการ: prompt ของผู้ตัดสินยังคงได้รับ
-transcript และสถานะการรันทุกอย่าง แต่ refs ของผู้สมัครจะถูกแทนที่ด้วยป้ายกำกับกลาง
-เช่น `candidate-01`; รายงานจะแมปอันดับกลับไปยัง refs จริงหลังการแยกวิเคราะห์
-การรันผู้สมัครมีค่าเริ่มต้นเป็นการคิดระดับ `high` โดยใช้ `medium` สำหรับ GPT-5.5 และ `xhigh`
-สำหรับ refs การประเมิน OpenAI รุ่นเก่าที่รองรับ แทนที่ค่าของผู้สมัครเฉพาะรายแบบ inline ด้วย
+transcript และสถานะการรันทุกอย่าง แต่ ref ของผู้สมัครจะถูกแทนที่ด้วย
+ป้ายกำกับกลาง เช่น `candidate-01`; รายงานจะแมปอันดับกลับไปยัง ref จริงหลังจาก
+parse แล้ว
+การรันผู้สมัครมีค่าเริ่มต้นเป็น thinking `high` โดยใช้ `medium` สำหรับ GPT-5.5 และ `xhigh`
+สำหรับ ref eval ของ OpenAI รุ่นเก่าที่รองรับ กำหนดทับผู้สมัครเฉพาะรายแบบ inline ด้วย
`--model provider/model,thinking=` `--thinking ` ยังคงตั้งค่า
-fallback ส่วนกลาง และรูปแบบเดิม `--model-thinking ` ยังคง
+fallback ส่วนกลาง และรูปแบบเก่า `--model-thinking ` ยังคง
เก็บไว้เพื่อความเข้ากันได้
-refs ผู้สมัครของ OpenAI มีค่าเริ่มต้นเป็นโหมดเร็วเพื่อให้ใช้การประมวลผลแบบ priority ในที่ที่
+ref ผู้สมัครของ OpenAI มีค่าเริ่มต้นเป็นโหมด fast เพื่อให้ใช้ priority processing ในจุดที่
ผู้ให้บริการรองรับ เพิ่ม `,fast`, `,no-fast` หรือ `,fast=false` แบบ inline เมื่อ
-ผู้สมัครหรือผู้ตัดสินรายเดียวต้องการการแทนที่ ส่ง `--fast` เฉพาะเมื่อคุณต้องการ
-บังคับเปิดโหมดเร็วสำหรับโมเดลผู้สมัครทุกตัว ระยะเวลาของผู้สมัครและผู้ตัดสิน
-จะถูกบันทึกไว้ในรายงานสำหรับการวิเคราะห์ benchmark แต่ prompt ของผู้ตัดสินระบุอย่างชัดเจน
+ผู้สมัครหรือผู้ตัดสินรายเดียวต้องการ override ส่ง `--fast` เฉพาะเมื่อคุณต้องการ
+บังคับเปิดโหมด fast สำหรับโมเดลผู้สมัครทุกตัว ระยะเวลาของผู้สมัครและผู้ตัดสินจะ
+ถูกบันทึกในรายงานสำหรับการวิเคราะห์ benchmark แต่ prompt ของผู้ตัดสินระบุอย่างชัดเจน
ว่าอย่าจัดอันดับตามความเร็ว
-การรันโมเดลผู้สมัครและผู้ตัดสินทั้งคู่มีค่าเริ่มต้นเป็น concurrency 16 ลดค่า
-`--concurrency` หรือ `--judge-concurrency` เมื่อขีดจำกัดของผู้ให้บริการหรือแรงกดดันต่อ Gateway
-ภายในเครื่องทำให้การรันมีสัญญาณรบกวนมากเกินไป
-เมื่อไม่ได้ส่ง `--model` ของผู้สมัคร character eval จะมีค่าเริ่มต้นเป็น
+การรันโมเดลผู้สมัครและผู้ตัดสินมีค่า concurrency เริ่มต้นเป็น 16 ทั้งคู่ ลด
+`--concurrency` หรือ `--judge-concurrency` เมื่อขีดจำกัดของผู้ให้บริการหรือแรงกดบน gateway
+ในเครื่องทำให้การรันมีสัญญาณรบกวนมากเกินไป
+เมื่อไม่ได้ส่ง `--model` ของผู้สมัคร character eval จะใช้ค่าเริ่มต้นเป็น
`openai/gpt-5.5`, `openai/gpt-5.2`, `openai/gpt-5`, `anthropic/claude-opus-4-6`,
`anthropic/claude-sonnet-4-6`, `zai/glm-5.1`,
`moonshot/kimi-k2.5` และ
`google/gemini-3.1-pro-preview` เมื่อไม่ได้ส่ง `--model`
-เมื่อไม่ได้ส่ง `--judge-model` ผู้ตัดสินจะมีค่าเริ่มต้นเป็น
+เมื่อไม่ได้ส่ง `--judge-model` ผู้ตัดสินจะใช้ค่าเริ่มต้นเป็น
`openai/gpt-5.5,thinking=xhigh,fast` และ
`anthropic/claude-opus-4-6,thinking=high`
## เอกสารที่เกี่ยวข้อง
-- [Matrix QA](/th/concepts/qa-matrix)
-- [ช่อง QA](/th/channels/qa-channel)
+- [QA แบบเมทริกซ์](/th/concepts/qa-matrix)
+- [QA Channel](/th/channels/qa-channel)
- [การทดสอบ](/th/help/testing)
- [แดชบอร์ด](/th/web/dashboard)
diff --git a/docs/th/concepts/queue-steering.md b/docs/th/concepts/queue-steering.md
index 34cad1888..5cfe8330f 100644
--- a/docs/th/concepts/queue-steering.md
+++ b/docs/th/concepts/queue-steering.md
@@ -1,96 +1,101 @@
---
read_when:
- อธิบายว่าการชี้นำทำงานอย่างไรขณะที่เอเจนต์กำลังใช้เครื่องมือ
- - การเปลี่ยนลักษณะการทำงานของคิวการรันที่ใช้งานอยู่หรือการผสานการกำกับทิศทางขณะรัน
+ - การเปลี่ยนพฤติกรรมของคิวการรันที่ใช้งานอยู่หรือการผสานการกำกับทิศทางรันไทม์
- การเปรียบเทียบโหมด steer, queue, collect และ followup
-summary: การกำกับการรันที่กำลังทำงานอยู่จัดคิวข้อความที่ขอบเขตรันไทม์อย่างไร
+summary: วิธีที่การกำกับการรันที่ทำงานอยู่จัดคิวข้อความที่ขอบเขตรันไทม์
title: คิวการกำกับทิศทาง
x-i18n:
- generated_at: "2026-04-30T09:49:06Z"
+ generated_at: "2026-05-04T02:23:56Z"
model: gpt-5.5
provider: openai
- source_hash: 560390c8c26bcce95e0137f4336ad6e62bc3e2344cb15fd12ca3cfe4a85a8acc
+ source_hash: c8df35b127ae0c1e1b3b684a1f63ce33874eb3d0b7bf9d0df7cb9dfce093090a
source_path: concepts/queue-steering.md
workflow: 16
---
-เมื่อมีข้อความเข้ามาขณะที่การรันของเซสชันกำลังสตรีมอยู่ OpenClaw สามารถ
-ส่งข้อความนั้นเข้าไปในรันไทม์ที่ใช้งานอยู่แทนการเริ่มรันอีกครั้งสำหรับ
-เซสชันเดียวกันได้ โหมดสาธารณะไม่ผูกกับรันไทม์ใดโดยเฉพาะ; Pi และฮาร์เนส
-app-server ดั้งเดิมของ Codex ใช้รายละเอียดการส่งมอบต่างกัน
+เมื่อมีข้อความเข้ามาขณะที่การรันเซสชันกำลังสตรีมอยู่ OpenClaw สามารถ
+ส่งข้อความนั้นเข้าไปในรันไทม์ที่ใช้งานอยู่ แทนที่จะเริ่มการรันใหม่อีกครั้งสำหรับ
+เซสชันเดียวกัน โหมดสาธารณะเป็นกลางต่อรันไทม์ ส่วน Pi และฮาร์เนส app-server
+ดั้งเดิมของ Codex ใช้รายละเอียดการส่งมอบที่ต่างกัน
## ขอบเขตรันไทม์
-การบังคับทิศทางจะไม่ขัดจังหวะการเรียกเครื่องมือที่กำลังทำงานอยู่ Pi จะตรวจหา
-ข้อความบังคับทิศทางที่เข้าคิวไว้ที่ขอบเขตของโมเดล:
+การสั่งทิศทางจะไม่ขัดจังหวะ tool call ที่กำลังทำงานอยู่ Pi จะตรวจสอบ
+ข้อความสั่งทิศทางที่รอคิวอยู่ที่ขอบเขตของโมเดล:
-1. ผู้ช่วยร้องขอการเรียกเครื่องมือ
-2. Pi ดำเนินการแบตช์การเรียกเครื่องมือของข้อความผู้ช่วยปัจจุบัน
+1. ผู้ช่วยขอ tool calls
+2. Pi เรียกใช้ชุด tool-call ของข้อความผู้ช่วยปัจจุบัน
3. Pi ส่งเหตุการณ์สิ้นสุดเทิร์น
-4. Pi ระบายข้อความบังคับทิศทางที่เข้าคิวไว้
-5. Pi ผนวกข้อความเหล่านั้นเป็นข้อความผู้ใช้ก่อนการเรียก LLM ครั้งถัดไป
+4. Pi ระบายข้อความสั่งทิศทางที่รอคิว
+5. Pi ผนวกข้อความเหล่านั้นเป็นข้อความของผู้ใช้ก่อนการเรียก LLM ถัดไป
-วิธีนี้ทำให้ผลลัพธ์ของเครื่องมือจับคู่กับข้อความผู้ช่วยที่ร้องขอผลลัพธ์นั้น
-จากนั้นให้การเรียกโมเดลครั้งถัดไปเห็นอินพุตล่าสุดจากผู้ใช้
+วิธีนี้ทำให้ผลลัพธ์ของเครื่องมือจับคู่กับข้อความผู้ช่วยที่ร้องขอผลลัพธ์เหล่านั้น
+จากนั้นจึงให้การเรียกโมเดลถัดไปเห็นอินพุตล่าสุดจากผู้ใช้
-ฮาร์เนส app-server ดั้งเดิมของ Codex เปิดเผย `turn/steer` แทนคิวบังคับทิศทาง
-ภายในของ Pi OpenClaw ปรับโหมดเดียวกันไปใช้ที่นั่น:
+ฮาร์เนส app-server ดั้งเดิมของ Codex เปิดเผย `turn/steer` แทนคิวสั่งทิศทาง
+ภายในของ Pi OpenClaw ปรับใช้โหมดเดียวกันที่นั่น:
-- `steer` จัดแบตช์ข้อความที่เข้าคิวไว้สำหรับช่วงเวลานิ่งที่กำหนดค่าไว้ แล้วส่ง
- คำขอ `turn/steer` เดียวพร้อมอินพุตผู้ใช้ทั้งหมดที่รวบรวมไว้ตามลำดับที่มาถึง
-- `queue` คงรูปแบบการจัดลำดับแบบเดิมไว้โดยส่งคำขอ `turn/steer` แยกกัน
-- `followup`, `collect`, `steer-backlog`, และ `interrupt` ยังคงเป็นพฤติกรรมคิว
- ที่ OpenClaw เป็นเจ้าของรอบเทิร์น Codex ที่ใช้งานอยู่
+- `steer` รวมข้อความที่รอคิวไว้เป็นชุดตามช่วงเวลานิ่งที่กำหนดค่าไว้ จากนั้นส่ง
+ คำขอ `turn/steer` เดียวพร้อมอินพุตผู้ใช้ทั้งหมดที่รวบรวมมาเรียงตามลำดับที่มาถึง
+- `queue` คงรูปแบบที่เรียงลำดับแบบเดิมไว้ โดยส่งคำขอ `turn/steer`
+ แยกกัน
+- `followup`, `collect`, `steer-backlog`, และ `interrupt` ยังคงเป็น
+ พฤติกรรมคิวที่ OpenClaw เป็นเจ้าของรอบเทิร์น Codex ที่ใช้งานอยู่
-เทิร์นการตรวจทาน Codex และ Compaction แบบกำหนดเองจะปฏิเสธการบังคับทิศทางในเทิร์นเดียวกัน
-เมื่อรันไทม์ไม่สามารถรับการบังคับทิศทางได้ OpenClaw จะถอยกลับไปใช้คิวติดตามผลในกรณีที่
-โหมดนั้นอนุญาต
+เทิร์นรีวิวของ Codex และเทิร์น Compaction แบบแมนนวลจะปฏิเสธการสั่งทิศทางในเทิร์นเดียวกัน
+เมื่อรันไทม์ไม่สามารถรับการสั่งทิศทางได้ OpenClaw จะถอยกลับไปใช้คิว followup
+ในกรณีที่โหมดนั้นอนุญาต
+
+หน้านี้อธิบายการสั่งทิศทางในโหมดคิวสำหรับข้อความขาเข้าปกติ สำหรับคำสั่ง
+`/steer ` แบบชัดเจน โปรดดู [สั่งทิศทาง](/th/tools/steer)
## โหมด
-| โหมด | พฤติกรรมเมื่อมีการรันที่ใช้งานอยู่ | พฤติกรรมติดตามผลภายหลัง |
+| โหมด | พฤติกรรมเมื่อมีการรันที่ใช้งานอยู่ | พฤติกรรม followup ภายหลัง |
| --------------- | ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
-| `steer` | แทรกข้อความบังคับทิศทางที่เข้าคิวไว้ทั้งหมดพร้อมกันที่ขอบเขตรันไทม์ถัดไป นี่คือค่าเริ่มต้น | ถอยกลับไปใช้ติดตามผลเฉพาะเมื่อการบังคับทิศทางไม่พร้อมใช้งาน |
-| `queue` | การบังคับทิศทางแบบเดิมทีละรายการ Pi แทรกข้อความที่เข้าคิวไว้หนึ่งข้อความต่อขอบเขตโมเดลหนึ่งครั้ง; Codex ส่งคำขอ `turn/steer` แยกกัน | ถอยกลับไปใช้ติดตามผลเฉพาะเมื่อการบังคับทิศทางไม่พร้อมใช้งาน |
-| `steer-backlog` | ใช้พฤติกรรมการบังคับทิศทางเมื่อมีการรันที่ใช้งานอยู่เหมือนกับ `steer` | เก็บข้อความเดียวกันไว้สำหรับเทิร์นติดตามผลภายหลังด้วย |
-| `followup` | ไม่บังคับทิศทางการรันปัจจุบัน | เรียกใช้ข้อความที่เข้าคิวไว้ภายหลัง |
-| `collect` | ไม่บังคับทิศทางการรันปัจจุบัน | รวมข้อความที่เข้าคิวไว้ซึ่งเข้ากันได้ให้เป็นเทิร์นภายหลังหนึ่งเทิร์นหลังช่วงหน้าต่างดีบาวน์ |
-| `interrupt` | ยกเลิกการรันที่ใช้งานอยู่ แล้วเริ่มข้อความใหม่ล่าสุด | ไม่มี |
+| `steer` | แทรกข้อความสั่งทิศทางที่รอคิวทั้งหมดพร้อมกันที่ขอบเขตรันไทม์ถัดไป นี่คือค่าเริ่มต้น | ถอยกลับไปใช้ followup เฉพาะเมื่อการสั่งทิศทางไม่พร้อมใช้งาน |
+| `queue` | การสั่งทิศทางแบบเดิมทีละรายการ Pi แทรกข้อความที่รอคิวหนึ่งข้อความต่อขอบเขตโมเดลหนึ่งครั้ง; Codex ส่งคำขอ `turn/steer` แยกกัน | ถอยกลับไปใช้ followup เฉพาะเมื่อการสั่งทิศทางไม่พร้อมใช้งาน |
+| `steer-backlog` | พฤติกรรมการสั่งทิศทางเมื่อมีการรันที่ใช้งานอยู่เหมือนกับ `steer` | ยังเก็บข้อความเดียวกันไว้สำหรับเทิร์น followup ภายหลังด้วย |
+| `followup` | ไม่สั่งทิศทางการรันปัจจุบัน | รันข้อความที่รอคิวในภายหลัง |
+| `collect` | ไม่สั่งทิศทางการรันปัจจุบัน | รวมข้อความที่รอคิวที่เข้ากันได้เป็นเทิร์นภายหลังหนึ่งเทิร์นหลังช่วงเวลา debounce |
+| `interrupt` | ยกเลิกการรันที่ใช้งานอยู่ จากนั้นเริ่มข้อความล่าสุด | ไม่มี |
-## ตัวอย่างการส่งเป็นชุด
+## ตัวอย่างการส่งข้อความเป็นชุด
-หากผู้ใช้สี่คนส่งข้อความขณะที่เอเจนต์กำลังดำเนินการเรียกเครื่องมือ:
+หากผู้ใช้สี่คนส่งข้อความขณะที่ agent กำลังเรียกใช้ tool call:
- `steer`: รันไทม์ที่ใช้งานอยู่ได้รับข้อความทั้งสี่ตามลำดับที่มาถึงก่อน
การตัดสินใจของโมเดลครั้งถัดไป Pi ระบายข้อความเหล่านั้นที่ขอบเขตโมเดลถัดไป; Codex
- รับข้อความเหล่านั้นเป็น `turn/steer` แบบแบตช์เดียว
-- `queue`: การบังคับทิศทางแบบจัดลำดับเดิม Pi แทรกข้อความที่เข้าคิวไว้ทีละข้อความ;
- Codex รับคำขอ `turn/steer` แยกกัน
-- `collect`: OpenClaw รอจนกว่าการรันที่ใช้งานอยู่จะจบ จากนั้นสร้าง
- เทิร์นติดตามผลพร้อมข้อความที่เข้าคิวไว้ซึ่งเข้ากันได้หลังช่วงหน้าต่างดีบาวน์
+ ได้รับเป็น `turn/steer` แบบรวมชุดหนึ่งรายการ
+- `queue`: การสั่งทิศทางแบบเดิมที่เรียงลำดับทีละรายการ Pi แทรกข้อความที่รอคิวทีละข้อความ;
+ Codex ได้รับคำขอ `turn/steer` แยกกัน
+- `collect`: OpenClaw รอจนกว่าการรันที่ใช้งานอยู่จะสิ้นสุด จากนั้นสร้างเทิร์น followup
+ พร้อมข้อความที่รอคิวซึ่งเข้ากันได้หลังช่วงเวลา debounce
## ขอบเขต
-การบังคับทิศทางมุ่งเป้าไปยังการรันของเซสชันที่ใช้งานอยู่ปัจจุบันเสมอ ไม่สร้างเซสชันใหม่
-ไม่เปลี่ยนนโยบายเครื่องมือของการรันที่ใช้งานอยู่ และไม่แยกข้อความตามผู้ส่ง ใน
-ช่องทางที่มีผู้ใช้หลายคน พรอมป์ขาเข้ามีบริบทของผู้ส่งและเส้นทางอยู่แล้ว ดังนั้น
-การเรียกโมเดลครั้งถัดไปจึงเห็นได้ว่าใครส่งแต่ละข้อความ
+การสั่งทิศทางจะกำหนดเป้าหมายไปยังการรันเซสชันที่ใช้งานอยู่ปัจจุบันเสมอ ไม่ได้สร้าง
+เซสชันใหม่ เปลี่ยนนโยบายเครื่องมือของการรันที่ใช้งานอยู่ หรือแยกข้อความตามผู้ส่ง ใน
+ช่องทางแบบหลายผู้ใช้ พรอมป์ขาเข้ามีบริบทผู้ส่งและเส้นทางอยู่แล้ว ดังนั้น
+การเรียกโมเดลถัดไปจึงเห็นได้ว่าใครส่งแต่ละข้อความ
-ใช้ `collect` เมื่อคุณต้องการให้ OpenClaw สร้างเทิร์นติดตามผลภายหลังที่สามารถ
-รวมข้อความที่เข้ากันได้และรักษานโยบายการทิ้งของคิวติดตามผลไว้ ใช้
-`queue` เฉพาะเมื่อคุณต้องการพฤติกรรมการบังคับทิศทางแบบเดิมทีละรายการ
+ใช้ `collect` เมื่อคุณต้องการให้ OpenClaw สร้างเทิร์น followup ภายหลังที่สามารถ
+รวมข้อความที่เข้ากันได้และรักษานโยบายการดรอปของคิว followup ไว้ ใช้
+`queue` เฉพาะเมื่อคุณต้องการพฤติกรรมการสั่งทิศทางแบบเก่าทีละรายการ
-## ดีบาวน์
+## Debounce
-`messages.queue.debounceMs` ใช้กับการส่งมอบติดตามผล รวมถึง `collect`,
-`followup`, `steer-backlog`, และการถอยกลับของ `steer` เมื่อการบังคับทิศทางของการรันที่ใช้งานอยู่ไม่
-พร้อมใช้งาน สำหรับ Pi นั้น `steer` ที่ใช้งานอยู่เองไม่ใช้ตัวจับเวลาดีบาวน์ เพราะ
-Pi จัดแบตช์ข้อความโดยธรรมชาติจนถึงขอบเขตโมเดลถัดไป สำหรับฮาร์เนส Codex
-ดั้งเดิม OpenClaw ใช้ค่าดีบาวน์เดียวกันเป็นช่วงเวลานิ่งก่อน
-ส่ง `turn/steer` แบบแบตช์
+`messages.queue.debounceMs` ใช้กับการส่งมอบ followup รวมถึง `collect`,
+`followup`, `steer-backlog`, และการถอยกลับของ `steer` เมื่อการสั่งทิศทางขณะมีการรันที่ใช้งานอยู่
+ไม่พร้อมใช้งาน สำหรับ Pi ตัว `steer` ที่ใช้งานอยู่เองไม่ใช้ตัวจับเวลา debounce
+เพราะ Pi รวมข้อความเป็นชุดตามธรรมชาติจนถึงขอบเขตโมเดลถัดไป สำหรับฮาร์เนส
+Codex ดั้งเดิม OpenClaw ใช้ค่า debounce เดียวกันเป็นช่วงเวลานิ่งก่อน
+ส่ง `turn/steer` แบบรวมชุด
## ที่เกี่ยวข้อง
- [คิวคำสั่ง](/th/concepts/queue)
+- [สั่งทิศทาง](/th/tools/steer)
- [ข้อความ](/th/concepts/messages)
-- [ลูปเอเจนต์](/th/concepts/agent-loop)
+- [ลูป agent](/th/concepts/agent-loop)
diff --git a/docs/th/concepts/queue.md b/docs/th/concepts/queue.md
index cee128904..9bde1a172 100644
--- a/docs/th/concepts/queue.md
+++ b/docs/th/concepts/queue.md
@@ -1,32 +1,32 @@
---
read_when:
- - การเปลี่ยนการดำเนินการตอบกลับอัตโนมัติหรือการทำงานพร้อมกัน
- - การอธิบายโหมด /queue หรือพฤติกรรมการกำหนดทิศทางข้อความ
-summary: โหมดคิวตอบกลับอัตโนมัติ ค่าเริ่มต้น และการกำหนดทับต่อเซสชัน
+ - การเปลี่ยนการดำเนินการหรือการทำงานพร้อมกันของการตอบกลับอัตโนมัติ
+ - อธิบายโหมดของ /queue หรือพฤติกรรมการกำหนดทิศทางข้อความ
+summary: โหมดคิวการตอบกลับอัตโนมัติ ค่าเริ่มต้น และการแทนที่ต่อเซสชัน
title: คิวคำสั่ง
x-i18n:
- generated_at: "2026-05-02T10:14:17Z"
+ generated_at: "2026-05-04T02:23:43Z"
model: gpt-5.5
provider: openai
- source_hash: c59ea6802d8bf526f4005db3b1baa87d96a23d561c916f91520e8e641fbaf74f
+ source_hash: 085aebe7059020f027eb08bb382cce2d253ea117eed0ca77d6ffd208f295acb1
source_path: concepts/queue.md
workflow: 16
---
-เราทำให้การรันการตอบกลับอัตโนมัติขาเข้า (ทุกช่องทาง) เป็นลำดับผ่านคิวขนาดเล็กภายในโปรเซส เพื่อป้องกันไม่ให้การรัน agent หลายรายการชนกัน ขณะเดียวกันยังอนุญาตให้ทำงานขนานอย่างปลอดภัยข้าม session ได้
+เราทำให้การรันการตอบกลับอัตโนมัติขาเข้า (ทุกช่องทาง) ผ่านคิวขนาดเล็กในโปรเซสแบบเรียงลำดับ เพื่อป้องกันไม่ให้การรันเอเจนต์หลายรายการชนกัน ขณะเดียวกันยังอนุญาตให้ทำงานแบบขนานอย่างปลอดภัยข้ามเซสชันได้
## เหตุผล
-- การรันการตอบกลับอัตโนมัติอาจมีต้นทุนสูง (การเรียก LLM) และอาจชนกันเมื่อมีข้อความขาเข้าหลายรายการมาถึงในเวลาใกล้กัน
-- การทำให้เป็นลำดับช่วยหลีกเลี่ยงการแย่งใช้ทรัพยากรร่วมกัน (ไฟล์ session, บันทึก, stdin ของ CLI) และลดโอกาสเจอ rate limit จากต้นทาง
+- การรันการตอบกลับอัตโนมัติอาจมีค่าใช้จ่ายสูง (การเรียก LLM) และอาจชนกันเมื่อมีข้อความขาเข้าหลายข้อความมาถึงในเวลาใกล้กัน
+- การจัดลำดับช่วยหลีกเลี่ยงการแย่งใช้ทรัพยากรที่แชร์กัน (ไฟล์เซสชัน, บันทึก, CLI stdin) และลดโอกาสเจอขีดจำกัดอัตราจาก upstream
## วิธีทำงาน
-- คิว FIFO ที่รู้จัก lane จะ drain แต่ละ lane ด้วยเพดาน concurrency ที่กำหนดค่าได้ (ค่าเริ่มต้น 1 สำหรับ lane ที่ไม่ได้กำหนดค่า; main มีค่าเริ่มต้นเป็น 4, subagent เป็น 8)
-- `runEmbeddedPiAgent` เข้าคิวตาม **session key** (lane `session:`) เพื่อรับประกันว่ามีการรันที่ทำงานอยู่เพียงหนึ่งรายการต่อ session
-- จากนั้นการรันของแต่ละ session จะถูกเข้าคิวใน **global lane** (`main` ตามค่าเริ่มต้น) เพื่อจำกัด parallelism โดยรวมด้วย `agents.defaults.maxConcurrent`
-- เมื่อเปิดใช้ verbose logging การรันที่เข้าคิวจะส่งประกาศสั้น ๆ หากรอนานกว่า ~2s ก่อนเริ่ม
-- typing indicators ยังทำงานทันทีเมื่อเข้าคิว (เมื่อช่องทางรองรับ) ดังนั้นประสบการณ์ผู้ใช้จะไม่เปลี่ยนระหว่างที่รอคิว
+- คิว FIFO ที่รับรู้ lane จะระบายแต่ละ lane ด้วยเพดาน concurrency ที่กำหนดค่าได้ (ค่าเริ่มต้น 1 สำหรับ lane ที่ไม่ได้กำหนดค่า; main มีค่าเริ่มต้นเป็น 4, subagent เป็น 8)
+- `runEmbeddedPiAgent` เข้าคิวตาม **คีย์เซสชัน** (lane `session:`) เพื่อรับประกันว่ามีการรันที่ทำงานอยู่ได้เพียงรายการเดียวต่อเซสชัน
+- จากนั้นการรันแต่ละเซสชันจะถูกเข้าคิวใน **lane ส่วนกลาง** (`main` โดยค่าเริ่มต้น) เพื่อให้ parallelism โดยรวมถูกจำกัดด้วย `agents.defaults.maxConcurrent`
+- เมื่อเปิดใช้การบันทึกแบบละเอียด การรันที่อยู่ในคิวจะแสดงข้อความแจ้งสั้น ๆ หากต้องรอนานกว่า ~2 วินาทีก่อนเริ่ม
+- ตัวบ่งชี้การพิมพ์ยังส่งทันทีเมื่อเข้าคิว (เมื่อช่องทางรองรับ) ดังนั้นประสบการณ์ผู้ใช้จึงไม่เปลี่ยนขณะรอถึงลำดับของเรา
## ค่าเริ่มต้น
@@ -37,30 +37,24 @@ x-i18n:
- `cap: 20`
- `drop: "summarize"`
-`steer` เป็นค่าเริ่มต้นเพราะช่วยให้ model turn ที่กำลังทำงานตอบสนองได้ดีโดยไม่ต้อง
-เริ่มการรัน session ที่สอง มันจะ drain ข้อความ steering ทั้งหมดที่มาถึง
-ก่อนขอบเขต model ถัดไป หากการรันปัจจุบันรับ steering ไม่ได้
-OpenClaw จะถอยกลับไปใช้รายการคิว followup
+`steer` เป็นค่าเริ่มต้นเพราะช่วยให้รอบของโมเดลที่กำลังทำงานตอบสนองได้ดี โดยไม่เริ่มการรันเซสชันที่สอง ระบบจะระบายข้อความ steering ทั้งหมดที่มาถึงก่อน boundary ของโมเดลถัดไป หากการรันปัจจุบันรับ steering ไม่ได้ OpenClaw จะ fallback ไปยังรายการคิว followup
## โหมดคิว
-ข้อความขาเข้าสามารถ steer การรันปัจจุบัน รอ turn followup หรือทำทั้งสองอย่างได้:
+ข้อความขาเข้าสามารถ steer การรันปัจจุบัน, รอรอบ followup หรือทำทั้งสองอย่างได้:
-- `steer`: เข้าคิวข้อความ steering เข้าไปใน runtime ที่ทำงานอยู่ Pi ส่งข้อความ steering ที่ค้างอยู่ทั้งหมด **หลังจาก assistant turn ปัจจุบันรัน tool calls เสร็จ** ก่อนการเรียก LLM ถัดไป; Codex app-server รับ `turn/steer` ที่รวมเป็น batch หนึ่งรายการ หากการรันไม่ได้ streaming อยู่จริงหรือ steering ใช้ไม่ได้ OpenClaw จะถอยกลับไปใช้รายการคิว followup
-- `queue` (เดิม): steering แบบเก่าทีละรายการ Pi ส่งข้อความ steering ที่เข้าคิวไว้หนึ่งรายการที่แต่ละขอบเขต model; Codex app-server รับคำขอ `turn/steer` แยกกัน ควรใช้ `steer` เว้นแต่คุณต้องการพฤติกรรมแบบ serialized เดิม
-- `followup`: เข้าคิวแต่ละข้อความสำหรับ agent turn ภายหลังหลังจากการรันปัจจุบันจบ
-- `collect`: รวมข้อความที่เข้าคิวเป็น turn followup **เดียว** หลังช่วง quiet window หากข้อความมีเป้าหมายเป็นช่องทาง/thread ต่างกัน จะ drain แยกกันเพื่อรักษา routing
-- `steer-backlog` (หรือ `steer+backlog`): steer ตอนนี้ **และ** เก็บข้อความเดียวกันไว้สำหรับ turn followup
-- `interrupt` (เดิม): ยกเลิกการรันที่ทำงานอยู่สำหรับ session นั้น แล้วรันข้อความล่าสุด
+- `steer`: เข้าคิวข้อความ steering เข้าไปใน runtime ที่กำลังทำงานอยู่ Pi จะส่งข้อความ steering ที่รออยู่ทั้งหมด **หลังจากรอบ assistant ปัจจุบันเรียกใช้เครื่องมือเสร็จสิ้นแล้ว** ก่อนการเรียก LLM ครั้งถัดไป; Codex app-server จะได้รับ `turn/steer` แบบแบตช์หนึ่งรายการ หากการรันไม่ได้ streaming อยู่จริงหรือ steering ไม่พร้อมใช้งาน OpenClaw จะ fallback ไปยังรายการคิว followup
+- `queue` (เดิม): steering แบบทีละรายการเก่า Pi จะส่งข้อความ steering ที่เข้าคิวไว้หนึ่งข้อความที่แต่ละ boundary ของโมเดล; Codex app-server จะได้รับคำขอ `turn/steer` แยกกัน ควรใช้ `steer` เว้นแต่คุณต้องการพฤติกรรมแบบเรียงลำดับเดิม
+- `followup`: เข้าคิวแต่ละข้อความสำหรับรอบเอเจนต์ภายหลังหลังจากการรันปัจจุบันสิ้นสุด
+- `collect`: รวมข้อความที่เข้าคิวไว้เป็นรอบ followup **เดียว** หลังช่วงเวลาที่เงียบลง หากข้อความชี้ไปยังช่องทาง/เธรดต่างกัน จะระบายแยกกันเพื่อรักษาการกำหนดเส้นทาง
+- `steer-backlog` (หรือ `steer+backlog`): steer ทันที **และ** เก็บข้อความเดียวกันไว้สำหรับรอบ followup
+- `interrupt` (เดิม): ยกเลิกการรันที่กำลังทำงานอยู่สำหรับเซสชันนั้น แล้วรันข้อความล่าสุด
-Steer-backlog หมายความว่าคุณอาจได้การตอบกลับ followup หลังการรันที่ถูก steer ดังนั้น
-พื้นผิว streaming อาจดูเหมือนซ้ำกัน ควรใช้ `collect`/`steer` หากคุณต้องการ
-หนึ่งคำตอบต่อข้อความขาเข้าหนึ่งรายการ
+Steer-backlog หมายความว่าคุณอาจได้รับการตอบกลับ followup หลังการรันที่ถูก steer ดังนั้นพื้นผิว streaming อาจดูเหมือนมีรายการซ้ำ ควรใช้ `collect`/`steer` หากคุณต้องการการตอบกลับหนึ่งรายการต่อข้อความขาเข้าหนึ่งข้อความ
-สำหรับ timing และพฤติกรรม dependency เฉพาะ runtime โปรดดู
-[คิว Steering](/th/concepts/queue-steering)
+สำหรับ timing และพฤติกรรม dependency เฉพาะ runtime โปรดดู [คิว Steering](/th/concepts/queue-steering) สำหรับคำสั่ง `/steer ` แบบชัดเจน โปรดดู [Steer](/th/tools/steer)
-กำหนดค่าแบบ global หรือรายช่องทางผ่าน `messages.queue`:
+กำหนดค่าแบบส่วนกลางหรือต่อช่องทางผ่าน `messages.queue`:
```json5
{
@@ -78,53 +72,51 @@ Steer-backlog หมายความว่าคุณอาจได้กา
## ตัวเลือกคิว
-ตัวเลือกใช้กับ `followup`, `collect`, และ `steer-backlog` (และกับ `steer` หรือ `queue` แบบเดิมเมื่อ steering ถอยกลับไปเป็น followup):
+ตัวเลือกใช้กับ `followup`, `collect` และ `steer-backlog` (และกับ `steer` หรือ `queue` เดิมเมื่อ steering fallback ไปเป็น followup):
-- `debounceMs`: ช่วง quiet window ก่อน drain followup ที่เข้าคิว ตัวเลขล้วนคือมิลลิวินาที; ตัวเลือก `/queue` ยอมรับหน่วย `ms`, `s`, `m`, `h` และ `d`
-- `cap`: จำนวนข้อความสูงสุดที่เข้าคิวต่อ session ค่าต่ำกว่า `1` จะถูกละเว้น
-- `drop: "summarize"`: ค่าเริ่มต้น ทิ้งรายการที่เก่าที่สุดในคิวตามจำเป็น เก็บสรุปแบบกะทัดรัดไว้ และฉีดเป็น prompt followup สังเคราะห์
-- `drop: "old"`: ทิ้งรายการที่เก่าที่สุดในคิวตามจำเป็น โดยไม่เก็บสรุปไว้
+- `debounceMs`: ช่วงเวลาที่เงียบลงก่อนระบาย followup ที่เข้าคิวไว้ ตัวเลขล้วนคือมิลลิวินาที; ตัวเลือก `/queue` รับหน่วย `ms`, `s`, `m`, `h` และ `d`
+- `cap`: จำนวนข้อความสูงสุดที่เข้าคิวได้ต่อเซสชัน ค่าต่ำกว่า `1` จะถูกละเว้น
+- `drop: "summarize"`: ค่าเริ่มต้น ทิ้งรายการที่เข้าคิวเก่าที่สุดตามจำเป็น เก็บสรุปแบบย่อไว้ และฉีดเข้าไปเป็นพรอมป์ followup สังเคราะห์
+- `drop: "old"`: ทิ้งรายการที่เข้าคิวเก่าที่สุดตามจำเป็น โดยไม่เก็บสรุปไว้
- `drop: "new"`: ปฏิเสธข้อความล่าสุดเมื่อคิวเต็มอยู่แล้ว
ค่าเริ่มต้น: `debounceMs: 500`, `cap: 20`, `drop: summarize`
## ลำดับความสำคัญ
-สำหรับการเลือกโหมด OpenClaw จะ resolve ตามนี้:
+สำหรับการเลือกโหมด OpenClaw จะ resolve ตามลำดับ:
-1. override ของ `/queue` แบบ inline หรือที่จัดเก็บไว้ราย session
+1. override `/queue` แบบ inline หรือที่จัดเก็บไว้ต่อเซสชัน
2. `messages.queue.byChannel.`
3. `messages.queue.mode`
4. ค่าเริ่มต้น `steer`
-สำหรับตัวเลือก ตัวเลือก `/queue` แบบ inline หรือที่จัดเก็บไว้จะชนะ config จากนั้นจึงใช้
-debounce เฉพาะช่องทาง (`messages.queue.debounceMsByChannel`), ค่าเริ่มต้น
-debounce ของ Plugin, ตัวเลือก `messages.queue` แบบ global และค่าเริ่มต้นในตัว
-`cap` และ `drop` เป็นตัวเลือก global/session ไม่ใช่คีย์ config รายช่องทาง
+สำหรับตัวเลือก ตัวเลือก `/queue` แบบ inline หรือที่จัดเก็บไว้จะชนะ config จากนั้นจะใช้ debounce เฉพาะช่องทาง (`messages.queue.debounceMsByChannel`), ค่าเริ่มต้น debounce ของ Plugin, ตัวเลือก `messages.queue` ส่วนกลาง และค่าเริ่มต้นในตัว ระบบจะใช้ `cap` และ `drop` เป็นตัวเลือกส่วนกลาง/เซสชัน ไม่ใช่คีย์ config ต่อช่องทาง
-## Override ราย session
+## override ต่อเซสชัน
-- ส่ง `/queue ` เป็นคำสั่งเดี่ยวเพื่อจัดเก็บโหมดสำหรับ session ปัจจุบัน
-- รวมตัวเลือกได้: `/queue collect debounce:0.5s cap:25 drop:summarize`
-- `/queue default` หรือ `/queue reset` จะล้าง override ของ session
+- ส่ง `/queue ` เป็นคำสั่งเดี่ยวเพื่อจัดเก็บโหมดสำหรับเซสชันปัจจุบัน
+- สามารถรวมตัวเลือกได้: `/queue collect debounce:0.5s cap:25 drop:summarize`
+- `/queue default` หรือ `/queue reset` จะล้าง override ของเซสชัน
## ขอบเขตและการรับประกัน
-- ใช้กับการรัน agent ตอบกลับอัตโนมัติในทุกช่องทางขาเข้าที่ใช้ไปป์ไลน์ตอบกลับของ Gateway (WhatsApp web, Telegram, Slack, Discord, Signal, iMessage, webchat ฯลฯ)
-- lane ค่าเริ่มต้น (`main`) ครอบคลุมทั้งโปรเซสสำหรับขาเข้า + Heartbeat หลัก; ตั้งค่า `agents.defaults.maxConcurrent` เพื่ออนุญาตให้หลาย session ทำงานขนานกัน
-- อาจมี lane เพิ่มเติม (เช่น `cron`, `cron-nested`, `nested`, `subagent`) เพื่อให้งานเบื้องหลังทำงานขนานได้โดยไม่บล็อกการตอบกลับขาเข้า turn ของ agent Cron แบบ isolated จะถือ slot `cron` ไว้ขณะที่การรัน agent ภายในใช้ `cron-nested`; ทั้งสองใช้ `cron.maxConcurrentRuns` flow `nested` ร่วมที่ไม่ใช่ Cron จะคงพฤติกรรม lane ของตนเอง การรันที่แยกออกมาเหล่านี้จะถูกติดตามเป็น [งานเบื้องหลัง](/th/automation/tasks)
-- lane ราย session รับประกันว่ามีการรัน agent เพียงหนึ่งรายการที่แตะ session ที่กำหนดในเวลาเดียวกัน
-- ไม่มี dependency ภายนอกหรือเธรด worker เบื้องหลัง; เป็น TypeScript + promises ล้วน
+- ใช้กับการรันเอเจนต์การตอบกลับอัตโนมัติในทุกช่องทางขาเข้าที่ใช้ไปป์ไลน์ตอบกลับของ Gateway (WhatsApp web, Telegram, Slack, Discord, Signal, iMessage, webchat ฯลฯ)
+- lane เริ่มต้น (`main`) มีผลทั่วทั้งโปรเซสสำหรับขาเข้า + Heartbeat หลัก; ตั้งค่า `agents.defaults.maxConcurrent` เพื่ออนุญาตให้หลายเซสชันทำงานพร้อมกันได้
+- อาจมี lane เพิ่มเติม (เช่น `cron`, `cron-nested`, `nested`, `subagent`) เพื่อให้งานพื้นหลังทำงานพร้อมกันได้โดยไม่บล็อกการตอบกลับขาเข้า รอบเอเจนต์ cron แบบแยกจะถือ slot `cron` ไว้ ขณะที่การทำงานเอเจนต์ภายในใช้ `cron-nested`; ทั้งสองใช้ `cron.maxConcurrentRuns` โฟลว์ `nested` ที่แชร์และไม่ใช่ cron จะคงพฤติกรรม lane ของตัวเอง การรันแบบแยกเหล่านี้ถูกติดตามเป็น [งานพื้นหลัง](/th/automation/tasks)
+- lane ต่อเซสชันรับประกันว่ามีการรันเอเจนต์เพียงรายการเดียวที่แตะเซสชันหนึ่ง ๆ ในเวลาเดียวกัน
+- ไม่มี dependency ภายนอกหรือเธรด worker พื้นหลัง; เป็น TypeScript + promise ล้วน
## การแก้ไขปัญหา
-- หากคำสั่งดูเหมือนค้าง ให้เปิดใช้ verbose logs และมองหาบรรทัด “queued for …ms” เพื่อยืนยันว่าคิวกำลัง drain
-- หากคุณต้องการดู queue depth ให้เปิดใช้ verbose logs และดูบรรทัด timing ของคิว
-- การรัน Codex app-server ที่รับ turn แล้วหยุดส่ง progress จะถูกขัดจังหวะโดย Codex adapter เพื่อให้ lane ของ session ที่ทำงานอยู่ปล่อยได้ แทนที่จะรอ timeout ของการรันภายนอก
-- เมื่อเปิดใช้ diagnostics แล้ว session ที่ยังอยู่ใน `processing` เกิน `diagnostics.stuckSessionWarnMs` โดยไม่มีการตอบกลับ, tool, status, block หรือ progress ของ ACP ที่สังเกตเห็น จะถูกจัดประเภทตามกิจกรรมปัจจุบัน งานที่ทำงานอยู่จะบันทึกเป็น `session.long_running`; งานที่ทำงานอยู่แต่ไม่มี progress ล่าสุดจะบันทึกเป็น `session.stalled`; `session.stuck` สงวนไว้สำหรับ bookkeeping ของ session ที่ stale และไม่มีงานที่ทำงานอยู่ และมีเพียงเส้นทางนั้นเท่านั้นที่ปล่อย lane ของ session ที่ได้รับผลกระทบเพื่อให้งานที่เข้าคิว drain ได้ diagnostics `session.stuck` ที่เกิดซ้ำจะ back off ตราบใดที่ session ยังไม่เปลี่ยนแปลง
+- หากคำสั่งดูเหมือนค้าง ให้เปิดใช้บันทึกแบบละเอียดแล้วมองหาบรรทัด “queued for …ms” เพื่อยืนยันว่าคิวกำลังระบาย
+- หากคุณต้องการความลึกของคิว ให้เปิดใช้บันทึกแบบละเอียดแล้วดูบรรทัด timing ของคิว
+- การรัน Codex app-server ที่รับ turn แล้วหยุดส่ง progress จะถูก interrupt โดย Codex adapter เพื่อให้ lane ของเซสชันที่กำลังทำงานอยู่ปล่อยได้ แทนที่จะรอ timeout ของการรันชั้นนอก
+- เมื่อเปิดใช้ diagnostics เซสชันที่ยังอยู่ใน `processing` เกิน `diagnostics.stuckSessionWarnMs` โดยไม่พบ reply, tool, status, block หรือ progress ของ ACP จะถูกจัดประเภทตามกิจกรรมปัจจุบัน งานที่ยัง active จะบันทึกเป็น `session.long_running`; งานที่ยัง active แต่ไม่มี progress ล่าสุดจะบันทึกเป็น `session.stalled`; `session.stuck` สงวนไว้สำหรับ bookkeeping ของเซสชันที่ค้างเก่าโดยไม่มีงาน active และมีเพียงเส้นทางนั้นเท่านั้นที่ปล่อย lane ของเซสชันที่ได้รับผลกระทบได้ เพื่อให้งานที่เข้าคิวไว้ระบายต่อ diagnostics `session.stuck` ที่เกิดซ้ำจะ back off ขณะที่เซสชันยังไม่เปลี่ยนแปลง
## ที่เกี่ยวข้อง
-- [การจัดการ Session](/th/concepts/session)
+- [การจัดการเซสชัน](/th/concepts/session)
- [คิว Steering](/th/concepts/queue-steering)
-- [นโยบาย Retry](/th/concepts/retry)
+- [Steer](/th/tools/steer)
+- [นโยบายการลองใหม่](/th/concepts/retry)
diff --git a/docs/th/concepts/system-prompt.md b/docs/th/concepts/system-prompt.md
index bc58c9cde..03a4291fa 100644
--- a/docs/th/concepts/system-prompt.md
+++ b/docs/th/concepts/system-prompt.md
@@ -1,155 +1,146 @@
---
read_when:
- การแก้ไขข้อความพรอมป์ระบบ รายการเครื่องมือ หรือส่วนเวลา/Heartbeat
- - การเปลี่ยนลักษณะการทำงานของการบูตสแตรปพื้นที่ทำงานหรือการฉีด Skills
-summary: พรอมต์ระบบของ OpenClaw ประกอบด้วยอะไรและถูกประกอบขึ้นอย่างไร
-title: พรอมป์ระบบ
+ - การเปลี่ยนแปลงพฤติกรรมการบูตสแตรปเวิร์กสเปซหรือการฉีด Skills
+summary: พรอมต์ระบบของ OpenClaw มีอะไรบ้างและประกอบขึ้นอย่างไร
+title: พรอมต์ระบบ
x-i18n:
- generated_at: "2026-05-03T21:30:55Z"
+ generated_at: "2026-05-04T02:23:53Z"
model: gpt-5.5
provider: openai
- source_hash: 93533ac8090897a7b5fd82b80e542a4ad573670408314b3519c5e317d0408ade
+ source_hash: 5e6067e760eccf58106f0a646c2656e902d5951580abd750f342d70b0568b81b
source_path: concepts/system-prompt.md
workflow: 16
---
-OpenClaw สร้างพรอมป์ระบบแบบกำหนดเองสำหรับการรัน agent ทุกครั้ง พรอมป์นี้เป็น **ของ OpenClaw** และไม่ใช้พรอมป์เริ่มต้นของ pi-coding-agent
+OpenClaw สร้างพรอมป์ระบบแบบกำหนดเองสำหรับการรันเอเจนต์ทุกครั้ง พรอมป์นี้เป็น **ของ OpenClaw** และไม่ได้ใช้พรอมป์เริ่มต้นของ pi-coding-agent
-พรอมป์ถูกประกอบโดย OpenClaw และฉีดเข้าไปในการรัน agent แต่ละครั้ง
+พรอมป์ถูกประกอบโดย OpenClaw และฉีดเข้าไปในการรันเอเจนต์แต่ละครั้ง
-Plugin ของผู้ให้บริการสามารถเพิ่มคำแนะนำพรอมป์ที่รับรู้แคชได้โดยไม่แทนที่
-พรอมป์เต็มรูปแบบที่เป็นของ OpenClaw runtime ของผู้ให้บริการสามารถ:
+Plugin ของผู้ให้บริการสามารถมีส่วนร่วมกับคำแนะนำพรอมป์ที่รับรู้แคชได้โดยไม่ต้องแทนที่พรอมป์ทั้งหมดที่ OpenClaw เป็นเจ้าของ รันไทม์ของผู้ให้บริการสามารถ:
-- แทนที่ส่วน core ที่มีชื่อไว้ชุดเล็ก ๆ (`interaction_style`,
+- แทนที่ส่วนแกนหลักที่มีชื่อจำนวนเล็กน้อย (`interaction_style`,
`tool_call_style`, `execution_bias`)
-- ฉีด **คำนำหน้าที่เสถียร** เหนือขอบเขตแคชพรอมป์
-- ฉีด **คำต่อท้ายแบบไดนามิก** ใต้ขอบเขตแคชพรอมป์
+- ฉีด **stable prefix** เหนือขอบเขตแคชพรอมป์
+- ฉีด **dynamic suffix** ใต้ขอบเขตแคชพรอมป์
-ใช้ contribution ที่ผู้ให้บริการเป็นเจ้าของสำหรับการปรับแต่งเฉพาะตระกูลโมเดล เก็บการกลายพันธุ์พรอมป์แบบเดิม
-`before_prompt_build` ไว้สำหรับความเข้ากันได้หรือการเปลี่ยนแปลงพรอมป์
-แบบทั่วทั้งระบบจริง ๆ ไม่ใช่พฤติกรรมปกติของผู้ให้บริการ
+ใช้การมีส่วนร่วมที่ผู้ให้บริการเป็นเจ้าของสำหรับการปรับแต่งเฉพาะตระกูลโมเดล เก็บการกลายพันธุ์พรอมป์แบบเดิม
+`before_prompt_build` ไว้สำหรับความเข้ากันได้หรือการเปลี่ยนพรอมป์แบบทั่วทั้งระบบจริงๆ ไม่ใช่พฤติกรรมปกติของผู้ให้บริการ
-โอเวอร์เลย์ตระกูล OpenAI GPT-5 ทำให้กฎการทำงาน core มีขนาดเล็กและเพิ่ม
-คำแนะนำเฉพาะโมเดลสำหรับการยึด persona, output ที่กระชับ, วินัยการใช้ tool,
-การค้นหาแบบขนาน, ความครอบคลุมของ deliverable, การตรวจสอบยืนยัน, บริบทที่ขาดหาย และ
-สุขอนามัยของ terminal-tool
+โอเวอร์เลย์ตระกูล OpenAI GPT-5 ทำให้กฎการดำเนินการแกนหลักมีขนาดเล็ก และเพิ่มคำแนะนำเฉพาะโมเดลสำหรับการยึด persona, เอาต์พุตที่กระชับ, วินัยในการใช้เครื่องมือ,
+การค้นหาแบบขนาน, ความครอบคลุมของสิ่งส่งมอบ, การตรวจสอบ, บริบทที่ขาดหาย และ
+สุขอนามัยของเครื่องมือเทอร์มินัล
## โครงสร้าง
-พรอมป์ตั้งใจให้กระชับและใช้ส่วนที่คงที่:
+พรอมป์ถูกตั้งใจให้กระชับและใช้ส่วนคงที่:
-- **Tooling**: คำเตือนแหล่งจริงของ structured-tool พร้อมคำแนะนำการใช้ tool ของ runtime
-- **Execution Bias**: คำแนะนำ follow-through แบบกระชับ: ลงมือภายใน turn กับ
- คำขอที่ดำเนินการได้, ทำต่อจนเสร็จหรือถูกบล็อก, กู้คืนจากผล tool
- ที่อ่อน, ตรวจสอบสถานะที่เปลี่ยนแปลงได้แบบ live, และตรวจสอบยืนยันก่อนสรุป final
-- **Safety**: คำเตือน guardrail สั้น ๆ เพื่อหลีกเลี่ยงพฤติกรรมแสวงหาอำนาจหรือการเลี่ยงการกำกับดูแล
-- **Skills** (เมื่อมี): บอกโมเดลว่าจะโหลดคำสั่ง skill ตามต้องการอย่างไร
+- **เครื่องมือ**: ตัวเตือนแหล่งความจริงของ structured-tool พร้อมคำแนะนำการใช้เครื่องมือขณะรันไทม์
+- **อคติการดำเนินการ**: คำแนะนำการติดตามผลแบบกระชับ: ดำเนินการภายในเทิร์นต่อคำขอที่ทำได้จริง, ดำเนินต่อจนเสร็จหรือถูกบล็อก, กู้คืนจากผลลัพธ์เครื่องมือที่อ่อน,
+ ตรวจสอบสถานะที่เปลี่ยนแปลงได้แบบสด และตรวจสอบก่อนสรุปสุดท้าย
+- **ความปลอดภัย**: ตัวเตือน guardrail สั้นๆ เพื่อหลีกเลี่ยงพฤติกรรมแสวงหาอำนาจหรือการเลี่ยงการกำกับดูแล
+- **Skills** (เมื่อพร้อมใช้งาน): บอกโมเดลว่าจะโหลดคำแนะนำ Skills ตามต้องการอย่างไร
- **OpenClaw Self-Update**: วิธีตรวจสอบ config อย่างปลอดภัยด้วย
- `config.schema.lookup`, patch config ด้วย `config.patch`, แทนที่ config ทั้งหมด
- ด้วย `config.apply`, และรัน `update.run` เฉพาะเมื่อผู้ใช้ร้องขออย่างชัดเจน
- เท่านั้น tool `gateway` แบบ owner-only ยังปฏิเสธการเขียนทับ
- `tools.exec.ask` / `tools.exec.security` รวมถึง alias แบบเดิม `tools.bash.*`
- ที่ normalize ไปยัง exec paths ที่ได้รับการป้องกันเหล่านั้น
-- **Workspace**: ไดเรกทอรีทำงาน (`agents.defaults.workspace`)
-- **Documentation**: path ภายในเครื่องไปยังเอกสาร OpenClaw (repo หรือแพ็กเกจ npm) และควรอ่านเมื่อใด
-- **Workspace Files (injected)**: ระบุว่า bootstrap files ถูกรวมไว้ด้านล่าง
-- **Sandbox** (เมื่อเปิดใช้งาน): ระบุ sandboxed runtime, sandbox paths, และมี elevated exec หรือไม่
-- **Current Date & Time**: เวลาท้องถิ่นของผู้ใช้, timezone, และรูปแบบเวลา
-- **Reply Tags**: syntax ของ reply tag แบบ optional สำหรับผู้ให้บริการที่รองรับ
-- **Heartbeats**: พรอมป์ Heartbeat และพฤติกรรม ack เมื่อเปิดใช้งาน Heartbeat สำหรับ agent เริ่มต้น
-- **Runtime**: host, OS, node, model, repo root (เมื่อตรวจพบ), ระดับ thinking (หนึ่งบรรทัด)
-- **Reasoning**: ระดับ visibility ปัจจุบัน + hint toggle /reasoning
+ `config.schema.lookup`, แพตช์ config ด้วย `config.patch`, แทนที่ config ทั้งหมดด้วย `config.apply`, และรัน `update.run` เฉพาะเมื่อผู้ใช้ร้องขออย่างชัดเจนเท่านั้น เครื่องมือ `gateway` เฉพาะเจ้าของยังปฏิเสธการเขียน
+ `tools.exec.ask` / `tools.exec.security` ใหม่ รวมถึง alias เดิม `tools.bash.*`
+ ที่ normalize ไปยังพาธ exec ที่ได้รับการป้องกันเหล่านั้น
+- **พื้นที่ทำงาน**: ไดเรกทอรีทำงาน (`agents.defaults.workspace`)
+- **เอกสาร**: พาธในเครื่องไปยังเอกสาร OpenClaw (repo หรือแพ็กเกจ npm) และเมื่อใดควรอ่าน
+- **ไฟล์พื้นที่ทำงาน (ฉีดเข้าไป)**: ระบุว่าไฟล์ bootstrap รวมอยู่ด้านล่าง
+- **Sandbox** (เมื่อเปิดใช้): ระบุรันไทม์แบบ sandbox, พาธ sandbox และว่ามี exec แบบยกระดับหรือไม่
+- **วันที่และเวลาปัจจุบัน**: เวลาท้องถิ่นของผู้ใช้, timezone และรูปแบบเวลา
+- **แท็กตอบกลับ**: ไวยากรณ์แท็กตอบกลับแบบไม่บังคับสำหรับผู้ให้บริการที่รองรับ
+- **Heartbeat**: พรอมป์ Heartbeat และพฤติกรรม ack เมื่อเปิดใช้ Heartbeat สำหรับเอเจนต์เริ่มต้น
+- **รันไทม์**: โฮสต์, OS, node, โมเดล, ราก repo (เมื่อตรวจพบ), ระดับการคิด (หนึ่งบรรทัด)
+- **การให้เหตุผล**: ระดับการมองเห็นปัจจุบัน + คำใบ้สวิตช์ /reasoning
-OpenClaw เก็บเนื้อหาขนาดใหญ่ที่เสถียร รวมถึง **Project Context** ไว้เหนือ
-ขอบเขตแคชพรอมป์ภายใน ส่วน channel/session ที่เปลี่ยนแปลงบ่อย เช่น
-คำแนะนำ Control UI embed, **Messaging**, **Voice**, **Group Chat Context**,
-**Reactions**, **Heartbeats**, และ **Runtime** จะถูกต่อท้ายใต้ขอบเขตนั้น
-เพื่อให้ backend ภายในเครื่องที่มี prefix caches สามารถใช้คำนำหน้า workspace ที่เสถียร
-ซ้ำได้ข้าม channel turns คำอธิบาย tool ก็ควรหลีกเลี่ยงการฝังชื่อ
-channel ปัจจุบันเช่นกัน เมื่อ schema ที่ยอมรับได้มีรายละเอียด runtime นั้นอยู่แล้ว
+OpenClaw เก็บเนื้อหาเสถียรขนาดใหญ่ รวมถึง **Project Context** ไว้เหนือขอบเขตแคชพรอมป์ภายใน ส่วนของช่องทาง/เซสชันที่ผันผวน เช่น
+คำแนะนำฝัง Control UI, **การส่งข้อความ**, **เสียง**, **บริบทแชทกลุ่ม**,
+**ปฏิกิริยา**, **Heartbeat** และ **รันไทม์** จะถูกต่อท้ายไว้ใต้ขอบเขตนั้น
+เพื่อให้แบ็กเอนด์ในเครื่องที่มี prefix cache สามารถใช้ prefix พื้นที่ทำงานที่เสถียรซ้ำได้
+ข้ามเทิร์นของช่องทาง คำอธิบายเครื่องมือก็ควรหลีกเลี่ยงการฝังชื่อช่องทางปัจจุบันเช่นกัน
+เมื่อ schema ที่ยอมรับมีรายละเอียดรันไทม์นั้นอยู่แล้ว
-ส่วน Tooling ยังรวมคำแนะนำ runtime สำหรับงานที่ใช้เวลานาน:
+ส่วนเครื่องมือยังรวมคำแนะนำรันไทม์สำหรับงานที่รันนาน:
-- ใช้ cron สำหรับการติดตามผลในอนาคต (`check back later`, reminders, recurring work)
- แทน `exec` sleep loops, เทคนิคหน่วงเวลา `yieldMs`, หรือการ polling `process`
- ซ้ำ ๆ
-- ใช้ `exec` / `process` เฉพาะสำหรับคำสั่งที่เริ่มตอนนี้และทำงานต่อ
- ในเบื้องหลัง
-- เมื่อเปิดใช้งาน automatic completion wake ให้เริ่มคำสั่งหนึ่งครั้งและพึ่งพา
- path wake แบบ push-based เมื่อมี output หรือ fail
-- ใช้ `process` สำหรับ logs, status, input, หรือ intervention เมื่อคุณต้อง
- ตรวจสอบคำสั่งที่กำลังทำงาน
-- หากงานมีขนาดใหญ่กว่า ให้เลือกใช้ `sessions_spawn`; การเสร็จของ sub-agent เป็น
- แบบ push-based และประกาศกลับไปยัง requester โดยอัตโนมัติ
-- อย่า poll `subagents list` / `sessions_list` ใน loop เพียงเพื่อรอ
- completion
+- ใช้ Cron สำหรับการติดตามผลในอนาคต (`check back later`, การเตือนความจำ, งานที่เกิดซ้ำ)
+ แทนลูป sleep ของ `exec`, เทคนิคหน่วงเวลา `yieldMs` หรือการ polling
+ `process` ซ้ำๆ
+- ใช้ `exec` / `process` เฉพาะสำหรับคำสั่งที่เริ่มตอนนี้และยังรันต่อ
+ ในพื้นหลัง
+- เมื่อเปิดใช้การปลุกเมื่อเสร็จสิ้นอัตโนมัติ ให้เริ่มคำสั่งครั้งเดียวและพึ่งพา
+ เส้นทางปลุกแบบ push-based เมื่อมันปล่อยเอาต์พุตหรือล้มเหลว
+- ใช้ `process` สำหรับ logs, สถานะ, input หรือการแทรกแซงเมื่อคุณต้อง
+ ตรวจสอบคำสั่งที่กำลังรันอยู่
+- ถ้างานมีขนาดใหญ่กว่า ให้ใช้ `sessions_spawn`; การเสร็จสิ้นของ sub-agent เป็นแบบ
+ push-based และประกาศกลับไปยังผู้ร้องขอโดยอัตโนมัติ
+- อย่า poll `subagents list` / `sessions_list` ในลูปเพียงเพื่อรอ
+ การเสร็จสิ้น
-เมื่อเปิดใช้งาน tool ทดลอง `update_plan` แล้ว Tooling ยังบอกให้
-โมเดลใช้เฉพาะงานหลายขั้นตอนที่ไม่ง่าย, คง step `in_progress` ไว้ให้มีเพียงหนึ่งรายการ
-และหลีกเลี่ยงการทำซ้ำแผนทั้งหมดหลังการอัปเดตแต่ละครั้ง
+เมื่อเปิดใช้เครื่องมือทดลอง `update_plan` ส่วนเครื่องมือยังบอกโมเดลให้ใช้
+เฉพาะกับงานหลายขั้นตอนที่ไม่ใช่เรื่องเล็ก, คงไว้เพียงหนึ่งขั้นตอน
+`in_progress` และหลีกเลี่ยงการทำซ้ำแผนทั้งหมดหลังการอัปเดตแต่ละครั้ง
-Safety guardrails ในพรอมป์ระบบเป็นคำแนะนำเท่านั้น สิ่งเหล่านี้ชี้นำพฤติกรรมของโมเดลแต่ไม่ได้บังคับใช้นโยบาย ใช้ tool policy, exec approvals, sandboxing, และ channel allowlists สำหรับการบังคับใช้จริง; operator สามารถปิดสิ่งเหล่านี้ได้โดยเจตนา
+guardrail ด้านความปลอดภัยในพรอมป์ระบบเป็นคำแนะนำ มันชี้นำพฤติกรรมของโมเดลแต่ไม่ได้บังคับใช้นโยบาย ใช้นโยบายเครื่องมือ, การอนุมัติ exec, sandboxing และ allowlist ของช่องทางสำหรับการบังคับใช้อย่างแข็งแรง; ผู้ปฏิบัติงานสามารถปิดสิ่งเหล่านี้ได้ตามการออกแบบ
-บน channel ที่มี approval cards/buttons แบบ native ตอนนี้พรอมป์ runtime บอกให้
-agent พึ่งพา UI approval แบบ native นั้นก่อน ควรรวมคำสั่งแบบ manual
-`/approve` เฉพาะเมื่อผล tool บอกว่า chat approvals ไม่พร้อมใช้งานหรือ
-manual approval เป็น path เดียวเท่านั้น
+บนช่องทางที่มีการ์ด/ปุ่มอนุมัติแบบ native ตอนนี้พรอมป์รันไทม์บอกให้
+เอเจนต์พึ่งพา UI การอนุมัติแบบ native นั้นก่อน ควรรวมคำสั่ง
+`/approve` แบบ manual เฉพาะเมื่อผลลัพธ์เครื่องมือบอกว่าการอนุมัติผ่านแชทไม่พร้อมใช้งาน หรือ
+การอนุมัติแบบ manual เป็นเส้นทางเดียวเท่านั้น
## โหมดพรอมป์
-OpenClaw สามารถ render พรอมป์ระบบที่เล็กลงสำหรับ sub-agents runtime ตั้งค่า
-`promptMode` สำหรับแต่ละ run (ไม่ใช่ config ที่แสดงต่อผู้ใช้):
+OpenClaw สามารถเรนเดอร์พรอมป์ระบบที่เล็กลงสำหรับ sub-agent ได้ รันไทม์ตั้งค่า
+`promptMode` สำหรับแต่ละการรัน (ไม่ใช่ config ที่ผู้ใช้เห็น):
-- `full` (ค่าเริ่มต้น): รวมทุกส่วนด้านบน
-- `minimal`: ใช้สำหรับ sub-agents; ละเว้น **Skills**, **Memory Recall**, **OpenClaw
+- `full` (ค่าเริ่มต้น): รวมทุกส่วนข้างต้น
+- `minimal`: ใช้สำหรับ sub-agent; ละเว้น **Skills**, **Memory Recall**, **OpenClaw
Self-Update**, **Model Aliases**, **User Identity**, **Reply Tags**,
- **Messaging**, **Silent Replies**, และ **Heartbeats** Tooling, **Safety**,
- Workspace, Sandbox, Current Date & Time (เมื่อทราบ), Runtime, และ injected
- context ยังคงพร้อมใช้งาน
-- `none`: ส่งคืนเฉพาะบรรทัด base identity
+ **Messaging**, **Silent Replies** และ **Heartbeats** เครื่องมือ, **ความปลอดภัย**,
+ พื้นที่ทำงาน, Sandbox, วันที่และเวลาปัจจุบัน (เมื่อทราบ), รันไทม์ และบริบทที่ฉีดเข้าไป
+ ยังคงพร้อมใช้งาน
+- `none`: ส่งคืนเฉพาะบรรทัดตัวตนพื้นฐาน
-เมื่อ `promptMode=minimal` พรอมป์ที่ฉีดเพิ่มจะมีป้ายกำกับเป็น **Subagent
-Context** แทน **Group Chat Context**
+เมื่อ `promptMode=minimal` พรอมป์ที่ฉีดเพิ่มจะถูกติดป้ายว่า **บริบท Subagent**
+แทน **บริบทแชทกลุ่ม**
-สำหรับการรัน auto-reply ของ channel OpenClaw สามารถละเว้นส่วน **Silent Replies**
-แบบทั่วไปได้ เมื่อบริบท direct/group chat มีพฤติกรรม `NO_REPLY`
-เฉพาะบทสนทนาที่ resolve แล้วอยู่แล้ว วิธีนี้หลีกเลี่ยงการทำซ้ำกลไก token
-ทั้งในพรอมป์ระบบ global และบริบท channel
+สำหรับการรัน auto-reply ของช่องทาง OpenClaw สามารถละเว้นส่วน **Silent Replies**
+ทั่วไปได้ เมื่อบริบทแชท direct/group มีพฤติกรรม `NO_REPLY`
+เฉพาะบทสนทนาที่ resolve แล้วอยู่แล้ว สิ่งนี้หลีกเลี่ยงการทำซ้ำกลไก token
+ทั้งในพรอมป์ระบบแบบ global และบริบทช่องทาง
## สแนปช็อตพรอมป์
-OpenClaw เก็บสแนปช็อตพรอมป์ที่ commit แล้วสำหรับ happy path ของ runtime Codex ไว้ใต้
-`test/fixtures/agents/prompt-snapshots/codex-runtime-happy-path/` สแนปช็อตเหล่านี้ render
-พารามิเตอร์ thread/turn ของ app-server ที่เลือกไว้ พร้อม stack ของชั้นพรอมป์ที่ผูกกับโมเดล
-ซึ่ง reconstruct สำหรับ Telegram direct, Discord group, และ heartbeat turns stack นั้น
-รวม fixture พรอมป์โมเดล Codex `gpt-5.5` ที่ pin ไว้ซึ่งสร้างจากรูปทรง
-model catalog/cache ของ Codex, ข้อความ developer permission happy-path ของ Codex,
-คำสั่ง developer ของ OpenClaw, คำสั่ง collaboration-mode ที่ scoped ตาม turn
-เมื่อ OpenClaw จัดให้, input ของ user turn, และการอ้างอิงถึง dynamic tool
-specs
+OpenClaw เก็บสแนปช็อตพรอมป์ที่ commit แล้วสำหรับเส้นทาง happy path ของรันไทม์ Codex ไว้ใต้
+`test/fixtures/agents/prompt-snapshots/codex-runtime-happy-path/` สแนปช็อตเหล่านี้เรนเดอร์
+พารามิเตอร์ thread/turn ของ app-server ที่เลือก พร้อมสแต็กเลเยอร์พรอมป์ที่ผูกกับโมเดลซึ่งสร้างใหม่
+สำหรับ Telegram direct, Discord group และเทิร์น heartbeat สแต็กนั้น
+รวม fixture พรอมป์โมเดล Codex `gpt-5.5` ที่ตรึงไว้ ซึ่งสร้างจากรูปทรง
+catalog/cache โมเดลของ Codex, ข้อความ developer สิทธิ์ happy-path ของ Codex,
+คำแนะนำ developer ของ OpenClaw, คำแนะนำ collaboration-mode ที่มีขอบเขตตามเทิร์น
+เมื่อ OpenClaw จัดให้, input เทิร์นของผู้ใช้ และการอ้างอิงถึงสเปกเครื่องมือแบบ dynamic
-รีเฟรช fixture พรอมป์โมเดล Codex ที่ pin ไว้ด้วย
-`pnpm prompt:snapshots:sync-codex-model` โดยค่าเริ่มต้น script จะหา
-runtime cache ของ Codex ที่ `$CODEX_HOME/models_cache.json`, จากนั้น
+รีเฟรช fixture พรอมป์โมเดล Codex ที่ตรึงไว้ด้วย
+`pnpm prompt:snapshots:sync-codex-model` โดยค่าเริ่มต้น สคริปต์จะมองหา
+แคชรันไทม์ของ Codex ที่ `$CODEX_HOME/models_cache.json`, จากนั้น
`~/.codex/models_cache.json`, และหลังจากนั้นจึง fallback ไปยัง convention ของ checkout Codex
-สำหรับ maintainer ที่ `~/code/codex/codex-rs/models-manager/models.json` หาก
-ไม่มี source เหล่านี้อยู่ คำสั่งจะ exit โดยไม่เปลี่ยน fixture ที่ commit แล้ว
+ของ maintainer ที่ `~/code/codex/codex-rs/models-manager/models.json` หากไม่มี
+แหล่งใดอยู่เลย คำสั่งจะออกโดยไม่เปลี่ยน fixture ที่ commit ไว้
ส่ง `--catalog ` เพื่อรีเฟรชจากไฟล์ `models_cache.json`
หรือ `models.json` ที่ระบุ
-สแนปช็อตเหล่านี้ยังไม่ใช่การจับ raw OpenAI request แบบ byte-for-byte Codex
-สามารถเพิ่ม workspace context ที่ runtime เป็นเจ้าของ เช่น `AGENTS.md`, environment
-context, memories, คำสั่ง app/plugin, และคำสั่ง collaboration-mode Default
-ในตัว ภายใน runtime Codex หลังจาก OpenClaw ส่ง
-พารามิเตอร์ thread และ turn แล้ว
+สแนปช็อตเหล่านี้ยังไม่ใช่การจับคำขอ OpenAI ดิบแบบ byte-for-byte Codex
+สามารถเพิ่มบริบทพื้นที่ทำงานที่รันไทม์เป็นเจ้าของ เช่น `AGENTS.md`, บริบทสภาพแวดล้อม,
+memories, คำแนะนำ app/plugin และคำแนะนำ collaboration-mode แบบ Default
+ในตัว ภายในรันไทม์ Codex หลังจาก OpenClaw ส่งพารามิเตอร์ thread และ turn แล้ว
-Regenerate ด้วย `pnpm prompt:snapshots:gen` และตรวจสอบ drift ด้วย
-`pnpm prompt:snapshots:check` CI รัน drift check ใน additional
-boundary shard เพื่อให้การเปลี่ยนแปลงพรอมป์และการอัปเดตสแนปช็อตผูกกับ PR เดียวกัน
+สร้างใหม่ด้วย `pnpm prompt:snapshots:gen` และตรวจสอบ drift ด้วย
+`pnpm prompt:snapshots:check` CI รันการตรวจสอบ drift ใน boundary shard เพิ่มเติม
+เพื่อให้การเปลี่ยนพรอมป์และการอัปเดตสแนปช็อตผูกอยู่กับ PR เดียวกัน
-## การฉีด bootstrap ของ workspace
+## การฉีด bootstrap พื้นที่ทำงาน
-Bootstrap files ถูก trim และต่อท้ายใต้ **Project Context** เพื่อให้โมเดลเห็นบริบท identity และ profile โดยไม่ต้องอ่านอย่างชัดเจน:
+ไฟล์ bootstrap ถูกตัดแต่งและต่อท้ายใต้ **Project Context** เพื่อให้โมเดลเห็นบริบทตัวตนและโปรไฟล์โดยไม่ต้องอ่านอย่างชัดเจน:
- `AGENTS.md`
- `SOUL.md`
@@ -157,78 +148,79 @@ Bootstrap files ถูก trim และต่อท้ายใต้ **Project
- `IDENTITY.md`
- `USER.md`
- `HEARTBEAT.md`
-- `BOOTSTRAP.md` (เฉพาะ workspace ที่สร้างใหม่)
-- `MEMORY.md` เมื่อมี
+- `BOOTSTRAP.md` (เฉพาะบนพื้นที่ทำงานใหม่เอี่ยม)
+- `MEMORY.md` เมื่อมีอยู่
-ไฟล์ทั้งหมดเหล่านี้ถูก **ฉีดเข้าไปใน context window** ในทุก turn เว้นแต่
-จะมี gate เฉพาะไฟล์ใช้อยู่ `HEARTBEAT.md` จะถูกละเว้นในการรันปกติเมื่อ
-ปิดใช้งาน Heartbeat สำหรับ agent เริ่มต้น หรือ
-`agents.defaults.heartbeat.includeSystemPromptSection` เป็น false รักษาไฟล์ที่ฉีดให้กระชับ
-โดยเฉพาะ `MEMORY.md` ซึ่งสามารถโตขึ้นตามเวลาและนำไปสู่
-การใช้บริบทสูงโดยไม่คาดคิดและ Compaction ที่ถี่ขึ้น
+ไฟล์ทั้งหมดเหล่านี้ถูก **ฉีดเข้าไปในหน้าต่างบริบท** ในทุกเทิร์น เว้นแต่
+มี gate เฉพาะไฟล์ใช้บังคับ `HEARTBEAT.md` จะถูกละเว้นในการรันปกติเมื่อ
+ปิดใช้ Heartbeat สำหรับเอเจนต์เริ่มต้น หรือ
+`agents.defaults.heartbeat.includeSystemPromptSection` เป็น false รักษาไฟล์ที่ฉีดเข้าไป
+ให้กระชับ โดยเฉพาะ `MEMORY.md` ซึ่งสามารถเติบโตเมื่อเวลาผ่านไปและนำไปสู่
+การใช้บริบทที่สูงเกินคาดและ Compaction ที่ถี่ขึ้น
-เมื่อ session รันบน native Codex harness, Codex จะโหลด `AGENTS.md`
-ผ่าน project-doc discovery ของตัวเอง OpenClaw ยังคง resolve bootstrap files
-ที่เหลือและ forward เป็นคำสั่ง config ของ Codex ดังนั้น `SOUL.md`,
-`TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md`, และ
-`MEMORY.md` จึงยังคงมีบทบาท workspace-context เดิมโดยไม่ทำซ้ำ
+เมื่อเซสชันรันบน harness ของ Codex แบบ native Codex จะโหลด `AGENTS.md`
+ผ่านการค้นหา project-doc ของตัวเอง OpenClaw ยังคง resolve ไฟล์
+bootstrap ที่เหลือและส่งต่อเป็นคำแนะนำ config ของ Codex ดังนั้น `SOUL.md`,
+`TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md` และ
+`MEMORY.md` ยังคงมีบทบาทบริบทพื้นที่ทำงานแบบเดิมโดยไม่ทำซ้ำ
`AGENTS.md`
-ไฟล์รายวัน `memory/*.md` **ไม่ใช่** ส่วนหนึ่งของ Project Context สำหรับ bootstrap ปกติ ใน turn ทั่วไปไฟล์เหล่านี้ถูกเข้าถึงตามต้องการผ่าน tools `memory_search` และ `memory_get` ดังนั้นจึงไม่นับรวมใน context window เว้นแต่โมเดลจะอ่านโดยชัดเจน turn แบบ bare `/new` และ `/reset` เป็นข้อยกเว้น: runtime สามารถ prepend daily memory ล่าสุดเป็นบล็อก startup-context แบบครั้งเดียวสำหรับ turn แรกนั้น
+ไฟล์รายวัน `memory/*.md` **ไม่ใช่** ส่วนหนึ่งของ Project Context bootstrap ปกติ ในเทิร์นทั่วไป ไฟล์เหล่านี้ถูกเข้าถึงตามต้องการผ่านเครื่องมือ `memory_search` และ `memory_get` ดังนั้นจึงไม่นับรวมกับหน้าต่างบริบท เว้นแต่ว่าโมเดลจะอ่านอย่างชัดเจน เทิร์น `/new` และ `/reset` แบบเปล่าเป็นข้อยกเว้น: รันไทม์สามารถ prepend หน่วยความจำรายวันล่าสุดเป็นบล็อก startup-context แบบใช้ครั้งเดียวสำหรับเทิร์นแรกนั้น
-ไฟล์ขนาดใหญ่จะถูกตัดทอนพร้อม marker ขนาดสูงสุดต่อไฟล์ถูกควบคุมโดย
+ไฟล์ขนาดใหญ่จะถูกตัดด้วย marker ขนาดสูงสุดต่อไฟล์ควบคุมโดย
`agents.defaults.bootstrapMaxChars` (ค่าเริ่มต้น: 12000) เนื้อหา bootstrap ที่ฉีดทั้งหมด
ข้ามไฟล์ถูกจำกัดโดย `agents.defaults.bootstrapTotalMaxChars`
-(ค่าเริ่มต้น: 60000) ไฟล์ที่หายไปจะฉีด marker สั้น ๆ ว่าไฟล์หายไป เมื่อเกิดการตัดทอน
-OpenClaw สามารถฉีดบล็อกคำเตือนใน Project Context; ควบคุมสิ่งนี้ด้วย
+(ค่าเริ่มต้น: 60000) ไฟล์ที่ขาดหายจะฉีด marker ไฟล์หายสั้นๆ เมื่อเกิดการตัด
+OpenClaw สามารถฉีดประกาศคำเตือนพรอมป์ระบบแบบกระชับได้; ควบคุมสิ่งนี้ด้วย
`agents.defaults.bootstrapPromptTruncationWarning` (`off`, `once`, `always`;
-ค่าเริ่มต้น: `once`)
+ค่าเริ่มต้น: `once`) จำนวน raw/injected แบบละเอียดจะยังอยู่ใน diagnostics เช่น
+`/context`, `/status`, doctor และ logs
-Session ของ sub-agent จะฉีดเฉพาะ `AGENTS.md` และ `TOOLS.md` (bootstrap files อื่น
-ถูกกรองออกเพื่อรักษาบริบท sub-agent ให้เล็ก)
+เซสชัน sub-agent จะฉีดเฉพาะ `AGENTS.md` และ `TOOLS.md` (ไฟล์ bootstrap อื่นๆ
+ถูกกรองออกเพื่อให้บริบทของ sub-agent มีขนาดเล็ก)
-Internal hooks สามารถ intercept ขั้นตอนนี้ผ่าน `agent:bootstrap` เพื่อ mutate หรือ replace
-bootstrap files ที่ฉีด (เช่น สลับ `SOUL.md` เป็น persona ทางเลือก)
+hook ภายในสามารถดักขั้นตอนนี้ผ่าน `agent:bootstrap` เพื่อกลายพันธุ์หรือแทนที่
+ไฟล์ bootstrap ที่ฉีดเข้าไป (เช่น สลับ `SOUL.md` เป็น persona ทางเลือก)
-หากคุณต้องการทำให้ agent ฟังดู generic น้อยลง ให้เริ่มด้วย
+หากคุณต้องการให้เอเจนต์ฟังดูทั่วไปน้อยลง ให้เริ่มด้วย
[คู่มือบุคลิกภาพ SOUL.md](/th/concepts/soul)
-หากต้องการตรวจสอบว่าไฟล์ที่ฉีดแต่ละไฟล์มี contribution เท่าใด (raw เทียบกับ injected, truncation, รวมถึง overhead ของ tool schema) ให้ใช้ `/context list` หรือ `/context detail` ดู [Context](/th/concepts/context)
+เพื่อตรวจสอบว่าแต่ละไฟล์ที่ฉีดมีส่วนต่อบริบทมากเพียงใด (raw เทียบกับ injected, การตัด, รวมถึง overhead ของ schema เครื่องมือ) ให้ใช้ `/context list` หรือ `/context detail` ดู [บริบท](/th/concepts/context)
## การจัดการเวลา
-พรอมป์ระบบมีส่วน **Current Date & Time** เฉพาะเมื่อทราบ
-timezone ของผู้ใช้ เพื่อให้พรอมป์ cache-stable ตอนนี้จึงรวมเฉพาะ
-**time zone** (ไม่มี dynamic clock หรือ time format)
+พรอมป์ระบบมีส่วน **วันที่และเวลาปัจจุบัน** โดยเฉพาะเมื่อทราบ
+timezone ของผู้ใช้ เพื่อให้พรอมป์มีความเสถียรต่อแคช ตอนนี้จึงรวมเฉพาะ
+**เขตเวลา** (ไม่มีนาฬิกา dynamic หรือรูปแบบเวลา)
-ใช้ `session_status` เมื่อ agent ต้องการเวลาปัจจุบัน; status card
-มีบรรทัด timestamp tool เดียวกันยังสามารถตั้ง per-session model
-override ได้แบบ optional (`model=default` จะล้างค่า)
+ใช้ `session_status` เมื่อเอเจนต์ต้องการเวลาปัจจุบัน; การ์ดสถานะ
+มีบรรทัด timestamp เครื่องมือเดียวกันยังสามารถตั้งค่า override โมเดลต่อเซสชัน
+แบบไม่บังคับได้ (`model=default` จะล้างค่า)
กำหนดค่าด้วย:
- `agents.defaults.userTimezone`
- `agents.defaults.timeFormat` (`auto` | `12` | `24`)
-ดู [Date & Time](/th/date-time) สำหรับรายละเอียดพฤติกรรมทั้งหมด
+ดู [วันที่และเวลา](/th/date-time) สำหรับรายละเอียดพฤติกรรมทั้งหมด
## Skills
-เมื่อมี skills ที่ eligible OpenClaw จะฉีด **available skills list** แบบกระชับ
-(`formatSkillsForPrompt`) ที่รวม **file path** สำหรับแต่ละ skill พรอมป์
-สั่งให้โมเดลใช้ `read` เพื่อโหลด SKILL.md ที่ตำแหน่งที่ระบุ
-(workspace, managed, หรือ bundled) หากไม่มี skills ที่ eligible ส่วน
-Skills จะถูกละเว้น
+เมื่อมี Skills ที่มีสิทธิ์ OpenClaw จะฉีด **รายการ Skills ที่พร้อมใช้งาน** แบบกระชับ
+(`formatSkillsForPrompt`) ซึ่งรวม **พาธไฟล์** สำหรับแต่ละ Skill พรอมป์
+สั่งให้โมเดลใช้ `read` เพื่อโหลด SKILL.md ที่ตำแหน่งที่ระบุไว้
+(พื้นที่ทำงาน, managed หรือ bundled) หากไม่มี Skills ที่มีสิทธิ์
+ส่วน Skills จะถูกละเว้น
-Eligibility รวมถึง gates ของ skill metadata, การตรวจสอบ runtime environment/config,
-และ agent skill allowlist ที่มีผลเมื่อกำหนดค่า `agents.defaults.skills` หรือ
+การมีสิทธิ์รวมถึง gate metadata ของ Skill, การตรวจสอบสภาพแวดล้อม/การกำหนดค่ารันไทม์,
+และ allowlist Skill ของเอเจนต์ที่มีผลเมื่อกำหนดค่า `agents.defaults.skills` หรือ
`agents.list[].skills`
-Skills ที่ bundled มากับ Plugin จะ eligible เฉพาะเมื่อ Plugin เจ้าของเปิดใช้งานอยู่
-สิ่งนี้ช่วยให้ tool plugins เปิดเผย operating guides ที่ลึกขึ้นได้โดยไม่ฝัง
-คำแนะนำทั้งหมดนั้นโดยตรงในทุกคำอธิบาย tool
+Skills ที่ bundled มากับ Plugin จะมีสิทธิ์เฉพาะเมื่อเปิดใช้ Plugin เจ้าของ
+สิ่งนี้ทำให้ Plugin เครื่องมือเปิดเผยคู่มือการปฏิบัติงานที่ลึกขึ้นได้โดยไม่ต้องฝัง
+คำแนะนำทั้งหมดนั้นโดยตรงในคำอธิบายเครื่องมือทุกครั้ง
```
@@ -240,33 +232,28 @@ Skills ที่ bundled มากับ Plugin จะ eligible เฉพาะ
```
-วิธีนี้ทำให้ base prompt มีขนาดเล็กในขณะที่ยังเปิดใช้งานการใช้ skill แบบ targeted
+สิ่งนี้ทำให้พรอมป์ฐานมีขนาดเล็ก ในขณะที่ยังเปิดใช้การใช้งาน Skill แบบเจาะจงได้
-งบประมาณ skills list เป็นของระบบย่อย skills:
+งบประมาณรายการ Skills เป็นของระบบย่อย Skills:
-- ค่าเริ่มต้น global: `skills.limits.maxSkillsPromptChars`
-- override ต่อ agent: `agents.list[].skillsLimits.maxSkillsPromptChars`
+- ค่าเริ่มต้นส่วนกลาง: `skills.limits.maxSkillsPromptChars`
+- การตั้งทับรายเอเจนต์: `agents.list[].skillsLimits.maxSkillsPromptChars`
-ข้อความตัดตอนของรันไทม์แบบมีขอบเขตทั่วไปใช้พื้นผิวที่ต่างกัน:
+ข้อความตัดตอนของรันไทม์แบบมีขอบเขตทั่วไปใช้พื้นผิวที่ต่างออกไป:
- `agents.defaults.contextLimits.*`
- `agents.list[].contextLimits.*`
-การแยกนี้ทำให้การกำหนดขนาดของ Skills แยกจากการกำหนดขนาดสำหรับการอ่าน/การฉีดข้อมูลของรันไทม์ เช่น `memory_get`, ผลลัพธ์ของเครื่องมือสด และการรีเฟรช AGENTS.md หลัง Compaction
+การแยกนี้ทำให้การกำหนดขนาดของ Skills แยกจากการกำหนดขนาดการอ่าน/การฉีดข้อมูลของรันไทม์ เช่น `memory_get`, ผลลัพธ์เครื่องมือแบบสด และการรีเฟรช AGENTS.md หลัง Compaction
-## เอกสารประกอบ
+## เอกสาร
-พรอมป์ระบบมีส่วน **เอกสารประกอบ** เมื่อมีเอกสารในเครื่องพร้อมใช้งาน ส่วนนี้จะชี้ไปยังไดเรกทอรีเอกสาร OpenClaw ในเครื่อง (`docs/` ใน Git checkout หรือเอกสารที่มาพร้อมกับแพ็กเกจ npm) หากเอกสารในเครื่องไม่พร้อมใช้งาน ระบบจะย้อนกลับไปใช้
-[https://docs.openclaw.ai](https://docs.openclaw.ai)
+พรอมป์ระบบมีส่วน **เอกสาร** เมื่อมีเอกสารภายในเครื่อง ระบบจะชี้ไปยังไดเรกทอรีเอกสาร OpenClaw ภายในเครื่อง (`docs/` ใน Git checkout หรือเอกสารแพ็กเกจ npm ที่บันเดิลมา) หากไม่มีเอกสารภายในเครื่อง ระบบจะถอยกลับไปใช้ [https://docs.openclaw.ai](https://docs.openclaw.ai)
-ส่วนเดียวกันนี้ยังรวมตำแหน่งซอร์สของ OpenClaw ด้วย Git checkout จะแสดงรูทซอร์สในเครื่องเพื่อให้เอเจนต์ตรวจสอบโค้ดได้โดยตรง การติดตั้งแบบแพ็กเกจจะรวม URL ซอร์ส GitHub และบอกให้เอเจนต์ตรวจสอบซอร์สที่นั่นเมื่อเอกสารไม่สมบูรณ์หรือล้าสมัย พรอมป์ยังระบุถึงมิเรอร์เอกสารสาธารณะ, Discord ชุมชน และ ClawHub
-([https://clawhub.ai](https://clawhub.ai)) สำหรับการค้นหา Skills โดยจะบอกโมเดลให้ปรึกษาเอกสารก่อนสำหรับพฤติกรรม คำสั่ง การกำหนดค่า หรือสถาปัตยกรรมของ OpenClaw และให้รัน `openclaw status` ด้วยตนเองเมื่อเป็นไปได้ (ถามผู้ใช้เฉพาะเมื่อไม่มีสิทธิ์เข้าถึง) สำหรับการกำหนดค่าโดยเฉพาะ จะชี้เอเจนต์ไปยังการดำเนินการเครื่องมือ `gateway` ชื่อ
-`config.schema.lookup` เพื่อดูเอกสารและข้อจำกัดระดับฟิลด์ที่แม่นยำ จากนั้นไปที่
-`docs/gateway/configuration.md` และ `docs/gateway/configuration-reference.md`
-เพื่อคำแนะนำที่กว้างขึ้น
+ส่วนเดียวกันนี้ยังรวมตำแหน่งซอร์สของ OpenClaw ด้วย Git checkouts จะแสดงรูทซอร์สภายในเครื่องเพื่อให้เอเจนต์ตรวจสอบโค้ดได้โดยตรง การติดตั้งแพ็กเกจจะรวม URL ซอร์ส GitHub และบอกให้เอเจนต์ตรวจทานซอร์สที่นั่นเมื่อเอกสารไม่สมบูรณ์หรือล้าสมัย พรอมป์ยังระบุถึงมิเรอร์เอกสารสาธารณะ, Discord ชุมชน และ ClawHub ([https://clawhub.ai](https://clawhub.ai)) สำหรับการค้นพบ Skills โดยบอกโมเดลให้ดูเอกสารก่อนสำหรับพฤติกรรม คำสั่ง การกำหนดค่า หรือสถาปัตยกรรมของ OpenClaw และให้เรียก `openclaw status` เองเมื่อทำได้ (ถามผู้ใช้เฉพาะเมื่อไม่มีสิทธิ์เข้าถึง) สำหรับการกำหนดค่าโดยเฉพาะ ระบบจะชี้เอเจนต์ไปยังการดำเนินการเครื่องมือ `gateway` คือ `config.schema.lookup` เพื่อดูเอกสารและข้อจำกัดระดับฟิลด์ที่แน่นอน จากนั้นจึงไปที่ `docs/gateway/configuration.md` และ `docs/gateway/configuration-reference.md` สำหรับคำแนะนำที่กว้างขึ้น
## ที่เกี่ยวข้อง
-- [รันไทม์เอเจนต์](/th/concepts/agent)
-- [พื้นที่ทำงานเอเจนต์](/th/concepts/agent-workspace)
+- [รันไทม์ของเอเจนต์](/th/concepts/agent)
+- [พื้นที่ทำงานของเอเจนต์](/th/concepts/agent-workspace)
- [เอนจินบริบท](/th/concepts/context-engine)
diff --git a/docs/th/gateway/config-agents.md b/docs/th/gateway/config-agents.md
index bb58060c1..a1c8ccb4f 100644
--- a/docs/th/gateway/config-agents.md
+++ b/docs/th/gateway/config-agents.md
@@ -1,28 +1,28 @@
---
read_when:
- การปรับแต่งค่าเริ่มต้นของเอเจนต์ (โมเดล, การคิด, พื้นที่ทำงาน, Heartbeat, สื่อ, Skills)
- - การกำหนดค่าการกำหนดเส้นทางและการผูกแบบหลายเอเจนต์
- - การปรับลักษณะการทำงานของเซสชัน การนำส่งข้อความ และโหมดพูดคุย
-summary: ค่าเริ่มต้นของเอเจนต์, การกำหนดเส้นทางแบบหลายเอเจนต์, เซสชัน, ข้อความ และการกำหนดค่าการสนทนา
+ - การกำหนดค่าการกำหนดเส้นทางและการผูกสำหรับหลายเอเจนต์
+ - การปรับพฤติกรรมของเซสชัน การส่งข้อความ และโหมดพูดคุย
+summary: ค่าเริ่มต้นของเอเจนต์ การกำหนดเส้นทางหลายเอเจนต์ เซสชัน ข้อความ และการกำหนดค่า talk
title: การกำหนดค่า — เอเจนต์
x-i18n:
- generated_at: "2026-05-03T10:10:57Z"
+ generated_at: "2026-05-04T02:24:55Z"
model: gpt-5.5
provider: openai
- source_hash: b25371c34b9f8b0cacce021879e43e6a65b86d626dc87d5bfa05dcae80ac32e4
+ source_hash: 9d339b82b8b3b82e55820ca6568b3ed569fe64135e698515fa7f316c3afbbfd9
source_path: gateway/config-agents.md
workflow: 16
---
-คีย์การกำหนดค่าที่มีขอบเขตระดับเอเจนต์ภายใต้ `agents.*`, `multiAgent.*`, `session.*`,
-`messages.*` และ `talk.*` สำหรับช่องทาง เครื่องมือ Gateway runtime และคีย์ระดับบนสุดอื่นๆ
-ดู [ข้อมูลอ้างอิงการกำหนดค่า](/th/gateway/configuration-reference)
+คีย์การกำหนดค่าระดับเอเจนต์ภายใต้ `agents.*`, `multiAgent.*`, `session.*`,
+`messages.*` และ `talk.*` สำหรับช่องทาง เครื่องมือ รันไทม์ Gateway และคีย์ระดับบนสุดอื่นๆ
+โปรดดู [ข้อมูลอ้างอิงการกำหนดค่า](/th/gateway/configuration-reference)
## ค่าเริ่มต้นของเอเจนต์
### `agents.defaults.workspace`
-ค่าเริ่มต้น: `~/.openclaw/workspace`
+ค่าเริ่มต้น: `~/.openclaw/workspace`.
```json5
{
@@ -32,7 +32,7 @@ x-i18n:
### `agents.defaults.repoRoot`
-รากของที่เก็บโค้ดแบบไม่บังคับที่แสดงในบรรทัด Runtime ของ system prompt หากไม่ได้ตั้งค่า OpenClaw จะตรวจหาอัตโนมัติโดยไล่ขึ้นจาก workspace
+รากรีโพซิทอรีที่ไม่บังคับ ซึ่งแสดงในบรรทัด Runtime ของพรอมป์ต์ระบบ หากไม่ได้ตั้งค่าไว้ OpenClaw จะตรวจหาอัตโนมัติโดยไล่ขึ้นจากพื้นที่ทำงาน
```json5
{
@@ -42,7 +42,7 @@ x-i18n:
### `agents.defaults.skills`
-allowlist เริ่มต้นแบบไม่บังคับสำหรับ Skills ของเอเจนต์ที่ไม่ได้ตั้งค่า
+รายการอนุญาต Skills เริ่มต้นที่ไม่บังคับสำหรับเอเจนต์ที่ไม่ได้ตั้งค่า
`agents.list[].skills`
```json5
@@ -58,15 +58,15 @@ allowlist เริ่มต้นแบบไม่บังคับสำห
}
```
-- ละ `agents.defaults.skills` เพื่อให้ใช้ Skills ได้ไม่จำกัดโดยค่าเริ่มต้น
+- ละ `agents.defaults.skills` เพื่อให้อนุญาต Skills ทั้งหมดโดยค่าเริ่มต้น
- ละ `agents.list[].skills` เพื่อสืบทอดค่าเริ่มต้น
- ตั้งค่า `agents.list[].skills: []` เพื่อไม่ให้มี Skills
-- รายการ `agents.list[].skills` ที่ไม่ว่างคือชุดสุดท้ายสำหรับเอเจนต์นั้น และ
- จะไม่รวมกับค่าเริ่มต้น
+- รายการ `agents.list[].skills` ที่ไม่ว่างคือชุดสุดท้ายสำหรับเอเจนต์นั้น โดยจะ
+ ไม่ผสานกับค่าเริ่มต้น
### `agents.defaults.skipBootstrap`
-ปิดใช้งานการสร้างไฟล์ bootstrap ของ workspace โดยอัตโนมัติ (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md`)
+ปิดใช้งานการสร้างไฟล์บูตสแตรปของพื้นที่ทำงานโดยอัตโนมัติ (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md`)
```json5
{
@@ -76,7 +76,7 @@ allowlist เริ่มต้นแบบไม่บังคับสำห
### `agents.defaults.skipOptionalBootstrapFiles`
-ข้ามการสร้างไฟล์ workspace แบบไม่บังคับที่เลือกไว้ ขณะที่ยังคงเขียนไฟล์ bootstrap ที่จำเป็น ค่าที่ใช้ได้: `SOUL.md`, `USER.md`, `HEARTBEAT.md` และ `IDENTITY.md`
+ข้ามการสร้างไฟล์พื้นที่ทำงานที่เป็นทางเลือกบางไฟล์ โดยยังคงเขียนไฟล์บูตสแตรปที่จำเป็น ค่าที่ใช้ได้: `SOUL.md`, `USER.md`, `HEARTBEAT.md` และ `IDENTITY.md`
```json5
{
@@ -90,10 +90,10 @@ allowlist เริ่มต้นแบบไม่บังคับสำห
### `agents.defaults.contextInjection`
-ควบคุมว่าไฟล์ bootstrap ของ workspace จะถูกแทรกเข้าไปใน system prompt เมื่อใด ค่าเริ่มต้น: `"always"`
+ควบคุมว่าไฟล์บูตสแตรปของพื้นที่ทำงานจะถูกฉีดเข้าไปในพรอมป์ต์ระบบเมื่อใด ค่าเริ่มต้น: `"always"`
-- `"continuation-skip"`: เทิร์นการดำเนินต่อที่ปลอดภัย (หลังจากคำตอบของผู้ช่วยเสร็จสมบูรณ์) จะข้ามการแทรก bootstrap ของ workspace ซ้ำ เพื่อลดขนาด prompt การรัน Heartbeat และการลองใหม่หลัง Compaction จะยังคงสร้าง context ใหม่
-- `"never"`: ปิดใช้งาน bootstrap ของ workspace และการแทรกไฟล์ context ในทุกเทิร์น ใช้ค่านี้เฉพาะกับเอเจนต์ที่จัดการวงจรชีวิต prompt ของตนเองทั้งหมด (เอนจิน context แบบกำหนดเอง runtime แบบเนทีฟที่สร้าง context เอง หรือ workflow เฉพาะที่ไม่ใช้ bootstrap) เทิร์น Heartbeat และเทิร์นกู้คืนหลัง Compaction จะข้ามการแทรกด้วย
+- `"continuation-skip"`: รอบต่อเนื่องที่ปลอดภัย (หลังจากคำตอบของผู้ช่วยเสร็จสมบูรณ์) จะข้ามการฉีดบูตสแตรปพื้นที่ทำงานซ้ำ เพื่อลดขนาดพรอมป์ต์ การรัน Heartbeat และการลองใหม่หลัง Compaction จะยังคงสร้างบริบทใหม่
+- `"never"`: ปิดใช้งานบูตสแตรปพื้นที่ทำงานและการฉีดไฟล์บริบทในทุกรอบ ใช้ค่านี้เฉพาะกับเอเจนต์ที่เป็นเจ้าของวงจรชีวิตพรอมป์ต์ของตนเองทั้งหมด (เอนจินบริบทแบบกำหนดเอง รันไทม์เนทีฟที่สร้างบริบทเอง หรือเวิร์กโฟลว์เฉพาะทางที่ไม่ใช้บูตสแตรป) รอบ Heartbeat และรอบกู้คืนจาก Compaction จะข้ามการฉีดด้วย
```json5
{
@@ -103,7 +103,7 @@ allowlist เริ่มต้นแบบไม่บังคับสำห
### `agents.defaults.bootstrapMaxChars`
-จำนวนอักขระสูงสุดต่อไฟล์ bootstrap ของ workspace ก่อนตัดทอน ค่าเริ่มต้น: `12000`
+จำนวนอักขระสูงสุดต่อไฟล์บูตสแตรปของพื้นที่ทำงานก่อนตัดทอน ค่าเริ่มต้น: `12000`
```json5
{
@@ -113,7 +113,7 @@ allowlist เริ่มต้นแบบไม่บังคับสำห
### `agents.defaults.bootstrapTotalMaxChars`
-จำนวนอักขระรวมสูงสุดที่แทรกจากไฟล์ bootstrap ของ workspace ทั้งหมด ค่าเริ่มต้น: `60000`
+จำนวนอักขระรวมสูงสุดที่ฉีดจากไฟล์บูตสแตรปของพื้นที่ทำงานทั้งหมด ค่าเริ่มต้น: `60000`
```json5
{
@@ -123,12 +123,16 @@ allowlist เริ่มต้นแบบไม่บังคับสำห
### `agents.defaults.bootstrapPromptTruncationWarning`
-ควบคุมข้อความเตือนที่เอเจนต์มองเห็นเมื่อ bootstrap context ถูกตัดทอน
+ควบคุมประกาศในพรอมป์ต์ระบบที่เอเจนต์มองเห็น เมื่อบริบทบูตสแตรปถูกตัดทอน
ค่าเริ่มต้น: `"once"`
-- `"off"`: ไม่แทรกข้อความเตือนเข้าไปใน system prompt
-- `"once"`: แทรกคำเตือนหนึ่งครั้งต่อ signature การตัดทอนที่ไม่ซ้ำกัน (แนะนำ)
-- `"always"`: แทรกคำเตือนทุกครั้งที่รันเมื่อมีการตัดทอน
+- `"off"`: ไม่ฉีดข้อความประกาศการตัดทอนเข้าไปในพรอมป์ต์ระบบ
+- `"once"`: ฉีดประกาศแบบกระชับหนึ่งครั้งต่อซิกเนเจอร์การตัดทอนที่ไม่ซ้ำกัน (แนะนำ)
+- `"always"`: ฉีดประกาศแบบกระชับทุกครั้งที่รันเมื่อมีการตัดทอน
+
+จำนวนดิบ/ที่ฉีดโดยละเอียดและฟิลด์ปรับแต่งการกำหนดค่าจะอยู่ในการวินิจฉัย เช่น
+รายงานบริบท/สถานะและบันทึก ส่วนบริบทผู้ใช้/รันไทม์ WebChat ตามปกติจะ
+ได้รับเฉพาะประกาศการกู้คืนแบบกระชับ
```json5
{
@@ -136,36 +140,35 @@ allowlist เริ่มต้นแบบไม่บังคับสำห
}
```
-### แผนที่เจ้าของงบประมาณ Context
+### แผนผังเจ้าของงบบริบท
-OpenClaw มีงบประมาณ prompt/context ปริมาณมากหลายส่วน และจงใจ
-แยกตามระบบย่อยแทนที่จะให้ทั้งหมดไหลผ่าน knob ทั่วไปเพียงตัวเดียว
+OpenClaw มีงบพรอมป์ต์/บริบทปริมาณสูงหลายรายการ และงบเหล่านี้ถูก
+แยกตามระบบย่อยโดยตั้งใจ แทนที่จะไหลผ่านปุ่มปรับทั่วไปเพียงตัวเดียวทั้งหมด
- `agents.defaults.bootstrapMaxChars` /
`agents.defaults.bootstrapTotalMaxChars`:
- การแทรก bootstrap ของ workspace ตามปกติ
+ การฉีดบูตสแตรปพื้นที่ทำงานตามปกติ
- `agents.defaults.startupContext.*`:
- prelude แบบครั้งเดียวสำหรับการรันโมเดลตอน reset/startup รวมถึงไฟล์รายวันล่าสุด
- `memory/*.md` คำสั่งแชตเปล่า `/new` และ `/reset` จะได้รับการตอบรับ
- โดยไม่เรียกใช้โมเดล
+ คำนำการรันโมเดลแบบครั้งเดียวสำหรับการรีเซ็ต/เริ่มต้น รวมถึงไฟล์
+ `memory/*.md` รายวันล่าสุด คำสั่งแชตเปล่า `/new` และ `/reset` จะ
+ ได้รับการตอบรับโดยไม่เรียกใช้โมเดล
- `skills.limits.*`:
- รายการ Skills แบบย่อที่แทรกเข้าไปใน system prompt
+ รายการ Skills แบบย่อที่ฉีดเข้าไปในพรอมป์ต์ระบบ
- `agents.defaults.contextLimits.*`:
- ข้อความตัดตอน runtime ที่มีขอบเขตและบล็อกที่ runtime เป็นเจ้าของซึ่งถูกแทรก
+ ข้อความตัดตอนรันไทม์แบบจำกัดขนาดและบล็อกที่รันไทม์เป็นเจ้าของซึ่งถูกฉีดเข้าไป
- `memory.qmd.limits.*`:
- การกำหนดขนาด snippet และการแทรกสำหรับการค้นหา memory ที่ทำดัชนีไว้
+ สไนปเป็ตการค้นหาหน่วยความจำที่ทำดัชนีและการกำหนดขนาดการฉีด
-ใช้ override ระดับเอเจนต์ที่ตรงกันเฉพาะเมื่อเอเจนต์หนึ่งต้องการ
-งบประมาณที่แตกต่าง:
+ใช้การแทนที่ต่อเอเจนต์ที่ตรงกันเฉพาะเมื่อเอเจนต์หนึ่งต้องใช้งบที่แตกต่างออกไป:
- `agents.list[].skillsLimits.maxSkillsPromptChars`
- `agents.list[].contextLimits.*`
#### `agents.defaults.startupContext`
-ควบคุม startup prelude ในเทิร์นแรกที่แทรกในการรันโมเดลตอน reset/startup
-คำสั่งแชตเปล่า `/new` และ `/reset` จะตอบรับการ reset โดยไม่เรียกใช้
-โมเดล จึงไม่โหลด prelude นี้
+ควบคุมคำนำเริ่มต้นรอบแรกที่ฉีดเข้าไปในการรันโมเดลแบบรีเซ็ต/เริ่มต้น
+คำสั่งแชตเปล่า `/new` และ `/reset` จะตอบรับการรีเซ็ตโดยไม่เรียกใช้
+โมเดล ดังนั้นจึงไม่โหลดคำนำนี้
```json5
{
@@ -186,7 +189,7 @@ OpenClaw มีงบประมาณ prompt/context ปริมาณมา
#### `agents.defaults.contextLimits`
-ค่าเริ่มต้นที่ใช้ร่วมกันสำหรับพื้นผิว context ของ runtime ที่มีขอบเขต
+ค่าเริ่มต้นร่วมสำหรับพื้นผิวบริบทรันไทม์แบบจำกัดขนาด
```json5
{
@@ -203,17 +206,18 @@ OpenClaw มีงบประมาณ prompt/context ปริมาณมา
}
```
-- `memoryGetMaxChars`: เพดานเริ่มต้นของข้อความตัดตอน `memory_get` ก่อนเพิ่ม
- metadata การตัดทอนและประกาศการดำเนินต่อ
-- `memoryGetDefaultLines`: หน้าต่างบรรทัดเริ่มต้นของ `memory_get` เมื่อไม่ได้ระบุ `lines`
-- `toolResultMaxChars`: เพดานผลลัพธ์เครื่องมือแบบ live ที่ใช้กับผลลัพธ์ที่เก็บถาวรและ
- การกู้คืนเมื่อมี overflow
-- `postCompactionMaxChars`: เพดานข้อความตัดตอน AGENTS.md ที่ใช้ระหว่างการแทรก
- refresh หลัง Compaction
+- `memoryGetMaxChars`: เพดานข้อความตัดตอน `memory_get` เริ่มต้นก่อนเพิ่ม
+ เมทาดาทาการตัดทอนและประกาศการต่อเนื่อง
+- `memoryGetDefaultLines`: หน้าต่างบรรทัด `memory_get` เริ่มต้นเมื่อ
+ ละ `lines`
+- `toolResultMaxChars`: เพดานผลลัพธ์เครื่องมือแบบสดที่ใช้สำหรับผลลัพธ์ที่คงอยู่และ
+ การกู้คืนเมื่อเกินขนาด
+- `postCompactionMaxChars`: เพดานข้อความตัดตอน AGENTS.md ที่ใช้ระหว่างการฉีด
+ รีเฟรชหลัง Compaction
#### `agents.list[].contextLimits`
-override ระดับเอเจนต์สำหรับ knob `contextLimits` ที่ใช้ร่วมกัน ฟิลด์ที่ละไว้จะสืบทอด
+การแทนที่ต่อเอเจนต์สำหรับปุ่มปรับ `contextLimits` ร่วม ฟิลด์ที่ละไว้จะสืบทอด
จาก `agents.defaults.contextLimits`
```json5
@@ -240,7 +244,7 @@ override ระดับเอเจนต์สำหรับ knob `contextLim
#### `skills.limits.maxSkillsPromptChars`
-เพดานส่วนกลางสำหรับรายการ Skills แบบย่อที่แทรกเข้าไปใน system prompt ค่านี้
+เพดานส่วนกลางสำหรับรายการ Skills แบบย่อที่ฉีดเข้าไปในพรอมป์ต์ระบบ ค่านี้
ไม่ส่งผลต่อการอ่านไฟล์ `SKILL.md` ตามต้องการ
```json5
@@ -255,7 +259,7 @@ override ระดับเอเจนต์สำหรับ knob `contextLim
#### `agents.list[].skillsLimits.maxSkillsPromptChars`
-override ระดับเอเจนต์สำหรับงบประมาณ prompt ของ Skills
+การแทนที่ต่อเอเจนต์สำหรับงบพรอมป์ต์ Skills
```json5
{
@@ -274,11 +278,11 @@ override ระดับเอเจนต์สำหรับงบประ
### `agents.defaults.imageMaxDimensionPx`
-ขนาดพิกเซลสูงสุดสำหรับด้านที่ยาวที่สุดของรูปภาพในบล็อกรูปภาพของ transcript/เครื่องมือก่อนเรียก provider
+ขนาดพิกเซลสูงสุดสำหรับด้านที่ยาวที่สุดของรูปภาพในบล็อกรูปภาพของทรานสคริปต์/เครื่องมือก่อนเรียกผู้ให้บริการ
ค่าเริ่มต้น: `1200`
-ค่าที่ต่ำกว่ามักลดการใช้ vision-token และขนาด payload ของคำขอสำหรับการรันที่มี screenshot จำนวนมาก
-ค่าที่สูงกว่าจะคงรายละเอียดภาพไว้มากขึ้น
+ค่าที่ต่ำกว่ามักลดการใช้โทเคนวิชันและขนาดเพย์โหลดของคำขอสำหรับการรันที่มีภาพหน้าจอจำนวนมาก
+ค่าที่สูงกว่าจะรักษารายละเอียดภาพได้มากขึ้น
```json5
{
@@ -288,7 +292,7 @@ override ระดับเอเจนต์สำหรับงบประ
### `agents.defaults.userTimezone`
-เขตเวลาสำหรับ context ของ system prompt (ไม่ใช่ timestamp ของข้อความ) หากไม่มีจะ fallback ไปใช้เขตเวลาของ host
+เขตเวลาสำหรับบริบทพรอมป์ต์ระบบ (ไม่ใช่เวลาประทับข้อความ) จะถอยกลับไปใช้เขตเวลาของโฮสต์
```json5
{
@@ -298,7 +302,7 @@ override ระดับเอเจนต์สำหรับงบประ
### `agents.defaults.timeFormat`
-รูปแบบเวลาใน system prompt ค่าเริ่มต้น: `auto` (ค่ากำหนดของ OS)
+รูปแบบเวลาในพรอมป์ต์ระบบ ค่าเริ่มต้น: `auto` (การตั้งค่าของ OS)
```json5
{
@@ -344,6 +348,7 @@ override ระดับเอเจนต์สำหรับงบประ
pdfMaxPages: 20,
thinkingDefault: "low",
verboseDefault: "off",
+ toolProgressDetail: "explain",
reasoningDefault: "off",
elevatedDefault: "on",
timeoutSeconds: 600,
@@ -356,54 +361,55 @@ override ระดับเอเจนต์สำหรับงบประ
```
- `model`: รับได้ทั้งสตริง (`"provider/model"`) หรืออ็อบเจ็กต์ (`{ primary, fallbacks }`)
- - รูปแบบสตริงจะตั้งค่าเฉพาะโมเดลหลัก
- - รูปแบบอ็อบเจ็กต์จะตั้งค่าโมเดลหลักพร้อมโมเดลสำรองตามลำดับเมื่อเกิดการล้มเหลว
+ - รูปแบบสตริงจะตั้งค่าเฉพาะโมเดลหลักเท่านั้น
+ - รูปแบบอ็อบเจ็กต์จะตั้งค่าโมเดลหลักพร้อมโมเดลเฟลโอเวอร์แบบเรียงลำดับ
- `imageModel`: รับได้ทั้งสตริง (`"provider/model"`) หรืออ็อบเจ็กต์ (`{ primary, fallbacks }`)
- - ใช้โดยเส้นทางเครื่องมือ `image` เป็นการกำหนดค่าโมเดลวิชัน
- - ยังใช้เป็นการกำหนดเส้นทางสำรองเมื่อโมเดลที่เลือก/ค่าเริ่มต้นไม่สามารถรับอินพุตรูปภาพได้
- - แนะนำให้ใช้การอ้างอิง `provider/model` อย่างชัดเจน ยอมรับรหัสแบบไม่มีคำนำหน้าเพื่อความเข้ากันได้ หากรหัสแบบไม่มีคำนำหน้าตรงกับรายการที่รองรับรูปภาพซึ่งกำหนดค่าไว้ใน `models.providers.*.models` ได้เพียงรายการเดียว OpenClaw จะเติมผู้ให้บริการนั้นให้ครบถ้วน รายการที่กำหนดค่าไว้ซึ่งตรงกันแบบกำกวมต้องใช้คำนำหน้าผู้ให้บริการอย่างชัดเจน
+ - ใช้โดยเส้นทางเครื่องมือ `image` เป็นคอนฟิกโมเดลวิชัน
+ - ใช้เป็นเส้นทางสำรองด้วยเมื่อโมเดลที่เลือก/ค่าเริ่มต้นไม่สามารถรับอินพุตรูปภาพได้
+ - แนะนำให้ใช้การอ้างอิง `provider/model` แบบชัดเจน รองรับไอดีเปล่าเพื่อความเข้ากันได้ หากไอดีเปล่าตรงกับรายการที่รองรับรูปภาพซึ่งคอนฟิกไว้ใน `models.providers.*.models` เพียงรายการเดียว OpenClaw จะเติมผู้ให้บริการนั้นให้ รายการที่คอนฟิกไว้ซึ่งตรงกันแบบกำกวมต้องใช้คำนำหน้าผู้ให้บริการอย่างชัดเจน
- `imageGenerationModel`: รับได้ทั้งสตริง (`"provider/model"`) หรืออ็อบเจ็กต์ (`{ primary, fallbacks }`)
- - ใช้โดยความสามารถการสร้างรูปภาพร่วมกันและพื้นผิวเครื่องมือ/Plugin ใดๆ ในอนาคตที่สร้างรูปภาพ
- - ค่าทั่วไป: `google/gemini-3.1-flash-image-preview` สำหรับการสร้างรูปภาพ Gemini แบบเนทีฟ, `fal/fal-ai/flux/dev` สำหรับ fal, `openai/gpt-image-2` สำหรับ OpenAI Images หรือ `openai/gpt-image-1.5` สำหรับเอาต์พุต OpenAI PNG/WebP ที่มีพื้นหลังโปร่งใส
- - หากคุณเลือกผู้ให้บริการ/โมเดลโดยตรง ให้กำหนดค่าการยืนยันตัวตนของผู้ให้บริการที่ตรงกันด้วย (เช่น `GEMINI_API_KEY` หรือ `GOOGLE_API_KEY` สำหรับ `google/*`, `OPENAI_API_KEY` หรือ OpenAI Codex OAuth สำหรับ `openai/gpt-image-2` / `openai/gpt-image-1.5`, `FAL_KEY` สำหรับ `fal/*`)
- - หากละไว้ `image_generate` ยังสามารถอนุมานค่าเริ่มต้นของผู้ให้บริการที่มีการยืนยันตัวตนรองรับได้ โดยจะลองผู้ให้บริการค่าเริ่มต้นปัจจุบันก่อน จากนั้นจึงลองผู้ให้บริการสร้างรูปภาพที่ลงทะเบียนไว้ที่เหลือตามลำดับรหัสผู้ให้บริการ
+ - ใช้โดยความสามารถสร้างรูปภาพที่ใช้ร่วมกันและพื้นผิวเครื่องมือ/Plugin ในอนาคตที่สร้างรูปภาพ
+ - ค่าทั่วไป: `google/gemini-3.1-flash-image-preview` สำหรับการสร้างรูปภาพ Gemini แบบเนทีฟ, `fal/fal-ai/flux/dev` สำหรับ fal, `openai/gpt-image-2` สำหรับ OpenAI Images หรือ `openai/gpt-image-1.5` สำหรับเอาต์พุต OpenAI PNG/WebP แบบพื้นหลังโปร่งใส
+ - หากคุณเลือกผู้ให้บริการ/โมเดลโดยตรง ให้คอนฟิกการยืนยันตัวตนของผู้ให้บริการที่ตรงกันด้วย (เช่น `GEMINI_API_KEY` หรือ `GOOGLE_API_KEY` สำหรับ `google/*`, `OPENAI_API_KEY` หรือ OpenAI Codex OAuth สำหรับ `openai/gpt-image-2` / `openai/gpt-image-1.5`, `FAL_KEY` สำหรับ `fal/*`)
+ - หากละไว้ `image_generate` ยังสามารถอนุมานค่าเริ่มต้นของผู้ให้บริการที่มีการยืนยันตัวตนรองรับได้ โดยจะลองผู้ให้บริการค่าเริ่มต้นปัจจุบันก่อน จากนั้นจึงลองผู้ให้บริการสร้างรูปภาพที่ลงทะเบียนไว้ที่เหลือตามลำดับไอดีผู้ให้บริการ
- `musicGenerationModel`: รับได้ทั้งสตริง (`"provider/model"`) หรืออ็อบเจ็กต์ (`{ primary, fallbacks }`)
- - ใช้โดยความสามารถการสร้างเพลงร่วมกันและเครื่องมือ `music_generate` ในตัว
+ - ใช้โดยความสามารถสร้างเพลงที่ใช้ร่วมกันและเครื่องมือในตัว `music_generate`
- ค่าทั่วไป: `google/lyria-3-clip-preview`, `google/lyria-3-pro-preview` หรือ `minimax/music-2.6`
- - หากละไว้ `music_generate` ยังสามารถอนุมานค่าเริ่มต้นของผู้ให้บริการที่มีการยืนยันตัวตนรองรับได้ โดยจะลองผู้ให้บริการค่าเริ่มต้นปัจจุบันก่อน จากนั้นจึงลองผู้ให้บริการสร้างเพลงที่ลงทะเบียนไว้ที่เหลือตามลำดับรหัสผู้ให้บริการ
- - หากคุณเลือกผู้ให้บริการ/โมเดลโดยตรง ให้กำหนดค่าการยืนยันตัวตน/คีย์ API ของผู้ให้บริการที่ตรงกันด้วย
+ - หากละไว้ `music_generate` ยังสามารถอนุมานค่าเริ่มต้นของผู้ให้บริการที่มีการยืนยันตัวตนรองรับได้ โดยจะลองผู้ให้บริการค่าเริ่มต้นปัจจุบันก่อน จากนั้นจึงลองผู้ให้บริการสร้างเพลงที่ลงทะเบียนไว้ที่เหลือตามลำดับไอดีผู้ให้บริการ
+ - หากคุณเลือกผู้ให้บริการ/โมเดลโดยตรง ให้คอนฟิกการยืนยันตัวตน/คีย์ API ของผู้ให้บริการที่ตรงกันด้วย
- `videoGenerationModel`: รับได้ทั้งสตริง (`"provider/model"`) หรืออ็อบเจ็กต์ (`{ primary, fallbacks }`)
- - ใช้โดยความสามารถการสร้างวิดีโอร่วมกันและเครื่องมือ `video_generate` ในตัว
+ - ใช้โดยความสามารถสร้างวิดีโอที่ใช้ร่วมกันและเครื่องมือในตัว `video_generate`
- ค่าทั่วไป: `qwen/wan2.6-t2v`, `qwen/wan2.6-i2v`, `qwen/wan2.6-r2v`, `qwen/wan2.6-r2v-flash` หรือ `qwen/wan2.7-r2v`
- - หากละไว้ `video_generate` ยังสามารถอนุมานค่าเริ่มต้นของผู้ให้บริการที่มีการยืนยันตัวตนรองรับได้ โดยจะลองผู้ให้บริการค่าเริ่มต้นปัจจุบันก่อน จากนั้นจึงลองผู้ให้บริการสร้างวิดีโอที่ลงทะเบียนไว้ที่เหลือตามลำดับรหัสผู้ให้บริการ
- - หากคุณเลือกผู้ให้บริการ/โมเดลโดยตรง ให้กำหนดค่าการยืนยันตัวตน/คีย์ API ของผู้ให้บริการที่ตรงกันด้วย
- - ผู้ให้บริการสร้างวิดีโอ Qwen ที่รวมมาให้รองรับวิดีโอเอาต์พุตสูงสุด 1 รายการ, รูปภาพอินพุต 1 รายการ, วิดีโออินพุต 4 รายการ, ระยะเวลา 10 วินาที และตัวเลือกระดับผู้ให้บริการ `size`, `aspectRatio`, `resolution`, `audio` และ `watermark`
+ - หากละไว้ `video_generate` ยังสามารถอนุมานค่าเริ่มต้นของผู้ให้บริการที่มีการยืนยันตัวตนรองรับได้ โดยจะลองผู้ให้บริการค่าเริ่มต้นปัจจุบันก่อน จากนั้นจึงลองผู้ให้บริการสร้างวิดีโอที่ลงทะเบียนไว้ที่เหลือตามลำดับไอดีผู้ให้บริการ
+ - หากคุณเลือกผู้ให้บริการ/โมเดลโดยตรง ให้คอนฟิกการยืนยันตัวตน/คีย์ API ของผู้ให้บริการที่ตรงกันด้วย
+ - ผู้ให้บริการสร้างวิดีโอ Qwen ที่รวมมาด้วยรองรับวิดีโอเอาต์พุตได้สูงสุด 1 รายการ, รูปภาพอินพุต 1 รายการ, วิดีโออินพุต 4 รายการ, ระยะเวลา 10 วินาที และตัวเลือกระดับผู้ให้บริการ `size`, `aspectRatio`, `resolution`, `audio` และ `watermark`
- `pdfModel`: รับได้ทั้งสตริง (`"provider/model"`) หรืออ็อบเจ็กต์ (`{ primary, fallbacks }`)
- ใช้โดยเครื่องมือ `pdf` สำหรับการกำหนดเส้นทางโมเดล
- - หากละไว้ เครื่องมือ PDF จะถอยกลับไปใช้ `imageModel` จากนั้นถอยกลับไปยังโมเดลเซสชัน/ค่าเริ่มต้นที่แก้ไขได้แล้ว
-- `pdfMaxBytesMb`: ขีดจำกัดขนาด PDF เริ่มต้นสำหรับเครื่องมือ `pdf` เมื่อไม่ได้ส่ง `maxBytesMb` ตอนเรียกใช้
-- `pdfMaxPages`: จำนวนหน้าสูงสุดเริ่มต้นที่พิจารณาโดยโหมดสำรองการแยกข้อมูลในเครื่องมือ `pdf`
-- `verboseDefault`: ระดับรายละเอียดเริ่มต้นสำหรับเอเจนต์ ค่า: `"off"`, `"on"`, `"full"` ค่าเริ่มต้น: `"off"`
-- `reasoningDefault`: การมองเห็นเหตุผลเริ่มต้นสำหรับเอเจนต์ ค่า: `"off"`, `"on"`, `"stream"` `agents.list[].reasoningDefault` รายเอเจนต์จะแทนที่ค่าเริ่มต้นนี้ ค่าเริ่มต้นของเหตุผลที่กำหนดค่าไว้จะถูกใช้เฉพาะกับเจ้าของ ผู้ส่งที่ได้รับอนุญาต หรือบริบท Gateway ของผู้ดูแลระบบปฏิบัติการ เมื่อไม่มีการตั้งค่าทับเหตุผลรายข้อความหรือรายเซสชัน
-- `elevatedDefault`: ระดับเอาต์พุตยกระดับเริ่มต้นสำหรับเอเจนต์ ค่า: `"off"`, `"on"`, `"ask"`, `"full"` ค่าเริ่มต้น: `"on"`
-- `model.primary`: รูปแบบ `provider/model` (เช่น `openai/gpt-5.5` สำหรับการเข้าถึงด้วยคีย์ API หรือ `openai-codex/gpt-5.5` สำหรับ Codex OAuth) หากคุณละผู้ให้บริการ OpenClaw จะลองนามแฝงก่อน จากนั้นจึงลองการจับคู่ผู้ให้บริการที่กำหนดค่าไว้แบบไม่ซ้ำสำหรับรหัสโมเดลที่ตรงกันนั้น และหลังจากนั้นจึงถอยกลับไปยังผู้ให้บริการค่าเริ่มต้นที่กำหนดค่าไว้ (พฤติกรรมความเข้ากันได้ที่เลิกแนะนำแล้ว ดังนั้นควรใช้ `provider/model` อย่างชัดเจน) หากผู้ให้บริการนั้นไม่เปิดเผยโมเดลค่าเริ่มต้นที่กำหนดค่าไว้อีกต่อไป OpenClaw จะถอยกลับไปยังผู้ให้บริการ/โมเดลที่กำหนดค่าไว้รายการแรกแทนการแสดงค่าเริ่มต้นของผู้ให้บริการที่ถูกนำออกแล้วซึ่งล้าสมัย
-- `models`: แค็ตตาล็อกโมเดลและรายการอนุญาตที่กำหนดค่าไว้สำหรับ `/model` แต่ละรายการสามารถมี `alias` (ทางลัด) และ `params` (เฉพาะผู้ให้บริการ เช่น `temperature`, `maxTokens`, `cacheRetention`, `context1m`, `responsesServerCompaction`, `responsesCompactThreshold`, `chat_template_kwargs`, `extra_body`/`extraBody`)
+ - หากละไว้ เครื่องมือ PDF จะสำรองไปที่ `imageModel` แล้วจึงไปที่โมเดลเซสชัน/ค่าเริ่มต้นที่แก้ค่าแล้ว
+- `pdfMaxBytesMb`: ขีดจำกัดขนาด PDF ค่าเริ่มต้นสำหรับเครื่องมือ `pdf` เมื่อไม่ได้ส่ง `maxBytesMb` ตอนเรียกใช้
+- `pdfMaxPages`: จำนวนหน้าสูงสุดค่าเริ่มต้นที่โหมดสำรองการแยกข้อมูลในเครื่องมือ `pdf` จะพิจารณา
+- `verboseDefault`: ระดับ verbose ค่าเริ่มต้นสำหรับเอเจนต์ ค่า: `"off"`, `"on"`, `"full"` ค่าเริ่มต้น: `"off"`
+- `toolProgressDetail`: โหมดรายละเอียดสำหรับสรุปเครื่องมือ `/verbose` และบรรทัดเครื่องมือฉบับร่างความคืบหน้า ค่า: `"explain"` (ค่าเริ่มต้น, ป้ายกำกับสำหรับมนุษย์แบบกระชับ) หรือ `"raw"` (ต่อท้ายคำสั่ง/รายละเอียดดิบเมื่อมี) `agents.list[].toolProgressDetail` รายเอเจนต์จะเขียนทับค่าเริ่มต้นนี้
+- `reasoningDefault`: การมองเห็นการใช้เหตุผลค่าเริ่มต้นสำหรับเอเจนต์ ค่า: `"off"`, `"on"`, `"stream"` `agents.list[].reasoningDefault` รายเอเจนต์จะเขียนทับค่าเริ่มต้นนี้ ค่าเริ่มต้นการใช้เหตุผลที่คอนฟิกไว้จะถูกใช้เฉพาะกับเจ้าของ ผู้ส่งที่ได้รับอนุญาต หรือบริบท Gateway ผู้ดูแลระบบปฏิบัติการ เมื่อไม่มีการตั้งค่าการใช้เหตุผลแบบรายข้อความหรือรายเซสชัน
+- `elevatedDefault`: ระดับเอาต์พุตแบบยกระดับค่าเริ่มต้นสำหรับเอเจนต์ ค่า: `"off"`, `"on"`, `"ask"`, `"full"` ค่าเริ่มต้น: `"on"`
+- `model.primary`: รูปแบบ `provider/model` (เช่น `openai/gpt-5.5` สำหรับการเข้าถึงด้วยคีย์ API หรือ `openai-codex/gpt-5.5` สำหรับ Codex OAuth) หากคุณละผู้ให้บริการ OpenClaw จะลองใช้นามแฝงก่อน จากนั้นจึงลองจับคู่ผู้ให้บริการที่คอนฟิกไว้แบบไม่ซ้ำสำหรับไอดีโมเดลนั้นแบบตรงตัว และหลังจากนั้นเท่านั้นจึงสำรองไปยังผู้ให้บริการค่าเริ่มต้นที่คอนฟิกไว้ (พฤติกรรมความเข้ากันได้ที่เลิกแนะนำแล้ว ดังนั้นควรใช้ `provider/model` แบบชัดเจน) หากผู้ให้บริการนั้นไม่ได้เปิดเผยโมเดลค่าเริ่มต้นที่คอนฟิกไว้อีกต่อไป OpenClaw จะสำรองไปยังผู้ให้บริการ/โมเดลที่คอนฟิกไว้รายการแรก แทนที่จะแสดงค่าเริ่มต้นของผู้ให้บริการที่ถูกลบซึ่งค้างอยู่
+- `models`: แค็ตตาล็อกโมเดลที่คอนฟิกไว้และรายการอนุญาตสำหรับ `/model` แต่ละรายการสามารถรวม `alias` (ทางลัด) และ `params` (เฉพาะผู้ให้บริการ เช่น `temperature`, `maxTokens`, `cacheRetention`, `context1m`, `responsesServerCompaction`, `responsesCompactThreshold`, `chat_template_kwargs`, `extra_body`/`extraBody`)
- การแก้ไขที่ปลอดภัย: ใช้ `openclaw config set agents.defaults.models '' --strict-json --merge` เพื่อเพิ่มรายการ `config set` จะปฏิเสธการแทนที่ที่จะลบรายการอนุญาตที่มีอยู่ เว้นแต่คุณจะส่ง `--replace`
- - โฟลว์การกำหนดค่า/การเริ่มใช้งานที่มีขอบเขตตามผู้ให้บริการจะผสานโมเดลผู้ให้บริการที่เลือกเข้าไปในแมปนี้ และคงผู้ให้บริการที่ไม่เกี่ยวข้องซึ่งกำหนดค่าไว้แล้วไว้
- - สำหรับโมเดล OpenAI Responses โดยตรง การ Compaction ฝั่งเซิร์ฟเวอร์จะเปิดใช้งานโดยอัตโนมัติ ใช้ `params.responsesServerCompaction: false` เพื่อหยุดการแทรก `context_management` หรือใช้ `params.responsesCompactThreshold` เพื่อแทนที่เกณฑ์ ดู [การ Compaction ฝั่งเซิร์ฟเวอร์ของ OpenAI](/th/providers/openai#server-side-compaction-responses-api)
-- `params`: พารามิเตอร์ผู้ให้บริการค่าเริ่มต้นแบบโกลบอลที่ใช้กับทุกโมเดล ตั้งค่าที่ `agents.defaults.params` (เช่น `{ cacheRetention: "long" }`)
-- ลำดับความสำคัญการผสาน `params` (การกำหนดค่า): `agents.defaults.params` (ฐานโกลบอล) จะถูกแทนที่โดย `agents.defaults.models["provider/model"].params` (รายโมเดล) จากนั้น `agents.list[].params` (รหัสเอเจนต์ที่ตรงกัน) จะแทนที่ตามคีย์ ดูรายละเอียดที่ [Prompt Caching](/th/reference/prompt-caching)
-- `params.extra_body`/`params.extraBody`: JSON ส่งผ่านขั้นสูงที่ผสานเข้าไปในบอดีคำขอ `api: "openai-completions"` สำหรับพร็อกซีที่เข้ากันได้กับ OpenAI หากชนกับคีย์คำขอที่สร้างขึ้น บอดีส่วนเพิ่มจะชนะ เส้นทาง completions ที่ไม่ใช่เนทีฟยังคงลบ `store` ที่เป็นเฉพาะ OpenAI ออกภายหลัง
-- `params.chat_template_kwargs`: อาร์กิวเมนต์เทมเพลตแชตที่เข้ากันได้กับ vLLM/OpenAI ซึ่งผสานเข้าไปในบอดีคำขอระดับบนสุด `api: "openai-completions"` สำหรับ `vllm/nemotron-3-*` เมื่อปิดการคิด Plugin vLLM ที่รวมมาให้จะส่ง `enable_thinking: false` และ `force_nonempty_content: true` โดยอัตโนมัติ `chat_template_kwargs` ที่ระบุชัดเจนจะแทนที่ค่าเริ่มต้นที่สร้างขึ้น และ `extra_body.chat_template_kwargs` ยังคงมีลำดับความสำคัญสุดท้าย สำหรับตัวควบคุมการคิดของ vLLM Qwen ให้ตั้งค่า `params.qwenThinkingFormat` เป็น `"chat-template"` หรือ `"top-level"` ในรายการโมเดลนั้น
-- `compat.supportedReasoningEfforts`: รายการระดับความพยายามด้านเหตุผลที่เข้ากันได้กับ OpenAI รายโมเดล ใส่ `"xhigh"` สำหรับปลายทางแบบกำหนดเองที่ยอมรับจริงๆ จากนั้น OpenClaw จะแสดง `/think xhigh` ในเมนูคำสั่ง แถวเซสชัน Gateway การตรวจสอบแพตช์เซสชัน การตรวจสอบ CLI ของเอเจนต์ และการตรวจสอบ `llm-task` สำหรับผู้ให้บริการ/โมเดลที่กำหนดค่านั้น ใช้ `compat.reasoningEffortMap` เมื่อแบ็กเอนด์ต้องการค่าเฉพาะผู้ให้บริการสำหรับระดับมาตรฐาน
-- `params.preserveThinking`: การเลือกใช้เฉพาะ Z.AI สำหรับการคงการคิดไว้ เมื่อเปิดใช้งานและเปิดการคิดอยู่ OpenClaw จะส่ง `thinking.clear_thinking: false` และเล่นซ้ำ `reasoning_content` ก่อนหน้า ดู [การคิดของ Z.AI และการคงการคิดไว้](/th/providers/zai#thinking-and-preserved-thinking)
-- `agentRuntime`: นโยบายรันไทม์เอเจนต์ระดับต่ำเริ่มต้น รหัสที่ละไว้จะตั้งค่าเริ่มต้นเป็น OpenClaw Pi ใช้ `id: "pi"` เพื่อบังคับใช้ฮาร์เนส PI ในตัว, `id: "auto"` เพื่อให้ฮาร์เนส Plugin ที่ลงทะเบียนไว้รับโมเดลที่รองรับและใช้ PI เมื่อไม่มีรายการใดตรงกัน, รหัสฮาร์เนสที่ลงทะเบียนไว้ เช่น `id: "codex"` เพื่อบังคับใช้ฮาร์เนสนั้น หรือชื่อแทนแบ็กเอนด์ CLI ที่รองรับ เช่น `id: "claude-cli"` รันไทม์ Plugin ที่ระบุชัดเจนจะล้มเหลวแบบปิดเมื่อฮาร์เนสไม่พร้อมใช้งานหรือล้มเหลว คงการอ้างอิงโมเดลให้เป็นรูปแบบมาตรฐาน `provider/model`; เลือก Codex, Claude CLI, Gemini CLI และแบ็กเอนด์การดำเนินการอื่นๆ ผ่านการกำหนดค่ารันไทม์แทนคำนำหน้าผู้ให้บริการรันไทม์แบบเก่า ดู [รันไทม์เอเจนต์](/th/concepts/agent-runtimes) สำหรับความแตกต่างจากการเลือกผู้ให้บริการ/โมเดล
-- ตัวเขียนการกำหนดค่าที่ปรับเปลี่ยนฟิลด์เหล่านี้ (เช่น `/models set`, `/models set-image` และคำสั่งเพิ่ม/ลบ fallback) จะบันทึกรูปแบบอ็อบเจ็กต์มาตรฐาน และคงรายการ fallback ที่มีอยู่ไว้เมื่อเป็นไปได้
-- `maxConcurrent`: จำนวนรันเอเจนต์แบบขนานสูงสุดข้ามเซสชัน (แต่ละเซสชันยังคงถูกทำแบบอนุกรม) ค่าเริ่มต้น: 4
+ - โฟลว์คอนฟิก/เริ่มใช้งานที่มีขอบเขตตามผู้ให้บริการจะผสานโมเดลผู้ให้บริการที่เลือกเข้ากับแมปนี้ และคงผู้ให้บริการอื่นที่คอนฟิกไว้แล้วซึ่งไม่เกี่ยวข้องไว้
+ - สำหรับโมเดล OpenAI Responses โดยตรง Compaction ฝั่งเซิร์ฟเวอร์จะเปิดใช้โดยอัตโนมัติ ใช้ `params.responsesServerCompaction: false` เพื่อหยุดการแทรก `context_management` หรือใช้ `params.responsesCompactThreshold` เพื่อเขียนทับค่าเกณฑ์ ดู [Compaction ฝั่งเซิร์ฟเวอร์ของ OpenAI](/th/providers/openai#server-side-compaction-responses-api)
+- `params`: พารามิเตอร์ผู้ให้บริการค่าเริ่มต้นส่วนกลางที่ใช้กับทุกโมเดล ตั้งค่าที่ `agents.defaults.params` (เช่น `{ cacheRetention: "long" }`)
+- ลำดับความสำคัญในการผสาน `params` (คอนฟิก): `agents.defaults.params` (ฐานส่วนกลาง) จะถูกเขียนทับโดย `agents.defaults.models["provider/model"].params` (รายโมเดล) จากนั้น `agents.list[].params` (ไอดีเอเจนต์ที่ตรงกัน) จะเขียนทับตามคีย์ ดูรายละเอียดใน [การแคชพรอมป์](/th/reference/prompt-caching)
+- `params.extra_body`/`params.extraBody`: JSON ส่งผ่านขั้นสูงที่ผสานเข้ากับบอดีคำขอ `api: "openai-completions"` สำหรับพร็อกซีที่เข้ากันได้กับ OpenAI หากชนกับคีย์คำขอที่สร้างขึ้น บอดีเพิ่มเติมจะมีผลเหนือกว่า เส้นทาง completions ที่ไม่ใช่แบบเนทีฟยังคงลบ `store` ที่ใช้เฉพาะ OpenAI ออกภายหลัง
+- `params.chat_template_kwargs`: อาร์กิวเมนต์เทมเพลตแชตที่เข้ากันได้กับ vLLM/OpenAI ซึ่งผสานเข้ากับบอดีคำขอ `api: "openai-completions"` ระดับบนสุด สำหรับ `vllm/nemotron-3-*` เมื่อปิดการคิด Plugin vLLM ที่รวมมาด้วยจะส่ง `enable_thinking: false` และ `force_nonempty_content: true` โดยอัตโนมัติ `chat_template_kwargs` ที่ระบุชัดเจนจะเขียนทับค่าเริ่มต้นที่สร้างขึ้น และ `extra_body.chat_template_kwargs` ยังมีลำดับความสำคัญสุดท้าย สำหรับการควบคุมการคิดของ vLLM Qwen ให้ตั้ง `params.qwenThinkingFormat` เป็น `"chat-template"` หรือ `"top-level"` ในรายการโมเดลนั้น
+- `compat.supportedReasoningEfforts`: รายการระดับความพยายามในการใช้เหตุผลที่เข้ากันได้กับ OpenAI แบบรายโมเดล รวม `"xhigh"` สำหรับเอนด์พอยต์กำหนดเองที่รองรับจริง จากนั้น OpenClaw จะแสดง `/think xhigh` ในเมนูคำสั่ง, แถวเซสชัน Gateway, การตรวจสอบแพตช์เซสชัน, การตรวจสอบ CLI ของเอเจนต์ และการตรวจสอบ `llm-task` สำหรับผู้ให้บริการ/โมเดลที่คอนฟิกไว้นั้น ใช้ `compat.reasoningEffortMap` เมื่อแบ็กเอนด์ต้องการค่าที่เฉพาะผู้ให้บริการสำหรับระดับมาตรฐาน
+- `params.preserveThinking`: การเลือกใช้เฉพาะ Z.AI สำหรับการคิดที่เก็บรักษาไว้ เมื่อเปิดใช้และการคิดเปิดอยู่ OpenClaw จะส่ง `thinking.clear_thinking: false` และเล่นซ้ำ `reasoning_content` ก่อนหน้า ดู [การคิดของ Z.AI และการคิดที่เก็บรักษาไว้](/th/providers/zai#thinking-and-preserved-thinking)
+- `agentRuntime`: นโยบายรันไทม์เอเจนต์ระดับต่ำค่าเริ่มต้น ไอดีที่ละไว้จะใช้ค่าเริ่มต้นเป็น OpenClaw Pi ใช้ `id: "pi"` เพื่อบังคับใช้ฮาร์เนส PI ในตัว, `id: "auto"` เพื่อให้ฮาร์เนส Plugin ที่ลงทะเบียนไว้เคลมโมเดลที่รองรับและใช้ PI เมื่อไม่มีรายการใดตรงกัน, ไอดีฮาร์เนสที่ลงทะเบียนไว้ เช่น `id: "codex"` เพื่อบังคับใช้ฮาร์เนสนั้น หรือชื่อแฝงแบ็กเอนด์ CLI ที่รองรับ เช่น `id: "claude-cli"` รันไทม์ Plugin ที่ระบุชัดเจนจะล้มเหลวแบบปิดเมื่อฮาร์เนสไม่พร้อมใช้งานหรือล้มเหลว คงการอ้างอิงโมเดลให้เป็นมาตรฐานในรูปแบบ `provider/model`; เลือก Codex, Claude CLI, Gemini CLI และแบ็กเอนด์การดำเนินการอื่นผ่านคอนฟิกรันไทม์แทนคำนำหน้าผู้ให้บริการรันไทม์แบบเดิม ดู [รันไทม์เอเจนต์](/th/concepts/agent-runtimes) เพื่อดูว่าสิ่งนี้แตกต่างจากการเลือกผู้ให้บริการ/โมเดลอย่างไร
+- ตัวเขียนคอนฟิกที่เปลี่ยนแปลงฟิลด์เหล่านี้ (เช่น `/models set`, `/models set-image` และคำสั่งเพิ่ม/ลบตัวสำรอง) จะบันทึกรูปแบบอ็อบเจ็กต์มาตรฐานและคงรายการตัวสำรองที่มีอยู่ไว้เมื่อเป็นไปได้
+- `maxConcurrent`: จำนวนการรันเอเจนต์แบบขนานสูงสุดข้ามเซสชัน (แต่ละเซสชันยังคงทำงานแบบอนุกรม) ค่าเริ่มต้น: 4
### `agents.defaults.agentRuntime`
-`agentRuntime` ควบคุมตัวดำเนินการระดับต่ำที่จะรันรอบของเอเจนต์ การใช้งานส่วนใหญ่ควรคงรันไทม์ OpenClaw Pi ค่าเริ่มต้นไว้ ใช้เมื่อ Plugin ที่เชื่อถือได้มีฮาร์เนสเนทีฟ เช่น ฮาร์เนสเซิร์ฟเวอร์แอป Codex ที่รวมมาให้ หรือเมื่อคุณต้องการแบ็กเอนด์ CLI ที่รองรับ เช่น Claude CLI สำหรับโมเดลทางความคิด ดู [รันไทม์เอเจนต์](/th/concepts/agent-runtimes)
+`agentRuntime` ควบคุมตัวดำเนินการระดับต่ำที่จะรันเทิร์นของเอเจนต์ การติดตั้งส่วนใหญ่ควรคงรันไทม์ OpenClaw Pi ค่าเริ่มต้นไว้ ใช้เมื่อ Plugin ที่เชื่อถือได้มีฮาร์เนสเนทีฟ เช่น ฮาร์เนสเซิร์ฟเวอร์แอป Codex ที่รวมมาด้วย หรือเมื่อคุณต้องการแบ็กเอนด์ CLI ที่รองรับ เช่น Claude CLI สำหรับภาพรวมแนวคิด ดู [รันไทม์เอเจนต์](/th/concepts/agent-runtimes)
```json5
{
@@ -418,37 +424,37 @@ override ระดับเอเจนต์สำหรับงบประ
}
```
-- `id`: `"auto"`, `"pi"`, รหัสฮาร์เนส Plugin ที่ลงทะเบียนไว้ หรือชื่อแทนแบ็กเอนด์ CLI ที่รองรับ Plugin Codex ที่รวมมาให้ลงทะเบียน `codex`; Plugin Anthropic ที่รวมมาให้มีแบ็กเอนด์ CLI `claude-cli`
-- `id: "auto"` อนุญาตให้ฮาร์เนส Plugin ที่ลงทะเบียนไว้รับรอบที่รองรับ และใช้ PI เมื่อไม่มีฮาร์เนสที่ตรงกัน รันไทม์ Plugin ที่ระบุชัดเจน เช่น `id: "codex"` จะต้องมีฮาร์เนสนั้น และจะล้มเหลวแบบปิดหากไม่พร้อมใช้งานหรือล้มเหลว
-- การแทนที่จากสภาพแวดล้อม: `OPENCLAW_AGENT_RUNTIME=` แทนที่ `id` สำหรับโปรเซสนั้น
-- สำหรับการปรับใช้เฉพาะ Codex ให้ตั้งค่า `model: "openai/gpt-5.5"` และ `agentRuntime.id: "codex"`
-- สำหรับการปรับใช้ Claude CLI แนะนำให้ใช้ `model: "anthropic/claude-opus-4-7"` พร้อม `agentRuntime.id: "claude-cli"` การอ้างอิงโมเดลแบบเก่า `claude-cli/claude-opus-4-7` ยังคงทำงานเพื่อความเข้ากันได้ แต่การกำหนดค่าใหม่ควรคงการเลือกผู้ให้บริการ/โมเดลให้เป็นมาตรฐาน และใส่แบ็กเอนด์การดำเนินการไว้ใน `agentRuntime.id`
-- คีย์นโยบายรันไทม์แบบเก่าจะถูกเขียนใหม่เป็น `agentRuntime` โดย `openclaw doctor --fix`
-- การเลือกฮาร์เนสจะถูกตรึงตามรหัสเซสชันหลังจากการรันแบบฝังตัวครั้งแรก การเปลี่ยนแปลงการกำหนดค่า/สภาพแวดล้อมมีผลกับเซสชันใหม่หรือเซสชันที่รีเซ็ต ไม่ใช่ทรานสคริปต์ที่มีอยู่ เซสชันเก่าที่มีประวัติทรานสคริปต์แต่ไม่มีพินที่บันทึกไว้จะถือว่าถูกตรึงกับ PI `/status` รายงานรันไทม์ที่มีผล เช่น `Runtime: OpenClaw Pi Default` หรือ `Runtime: OpenAI Codex`
-- สิ่งนี้ควบคุมเฉพาะการดำเนินการรอบเอเจนต์แบบข้อความเท่านั้น การสร้างสื่อ วิชัน PDF เพลง วิดีโอ และ TTS ยังคงใช้การตั้งค่าผู้ให้บริการ/โมเดลของตน
+- `id`: `"auto"`, `"pi"`, ไอดีฮาร์เนส Plugin ที่ลงทะเบียนไว้ หรือชื่อแฝงแบ็กเอนด์ CLI ที่รองรับ Plugin Codex ที่รวมมาด้วยลงทะเบียน `codex`; Plugin Anthropic ที่รวมมาด้วยให้แบ็กเอนด์ CLI `claude-cli`
+- `id: "auto"` อนุญาตให้ฮาร์เนส Plugin ที่ลงทะเบียนไว้เคลมเทิร์นที่รองรับและใช้ PI เมื่อไม่มีฮาร์เนสใดตรงกัน รันไทม์ Plugin ที่ระบุชัดเจน เช่น `id: "codex"` ต้องมีฮาร์เนสนั้นและจะล้มเหลวแบบปิดหากไม่พร้อมใช้งานหรือล้มเหลว
+- การเขียนทับด้วยสภาพแวดล้อม: `OPENCLAW_AGENT_RUNTIME=` จะเขียนทับ `id` สำหรับโปรเซสนั้น
+- สำหรับการติดตั้งที่ใช้เฉพาะ Codex ให้ตั้ง `model: "openai/gpt-5.5"` และ `agentRuntime.id: "codex"`
+- สำหรับการติดตั้ง Claude CLI ควรใช้ `model: "anthropic/claude-opus-4-7"` พร้อม `agentRuntime.id: "claude-cli"` การอ้างอิงโมเดลแบบเดิม `claude-cli/claude-opus-4-7` ยังทำงานเพื่อความเข้ากันได้ แต่คอนฟิกใหม่ควรคงการเลือกผู้ให้บริการ/โมเดลให้เป็นมาตรฐานและใส่แบ็กเอนด์การดำเนินการไว้ใน `agentRuntime.id`
+- คีย์นโยบายรันไทม์รุ่นเก่าจะถูกเขียนใหม่เป็น `agentRuntime` โดย `openclaw doctor --fix`
+- ตัวเลือกฮาร์เนสจะถูกตรึงตามไอดีเซสชันหลังการรันแบบฝังครั้งแรก การเปลี่ยนแปลงคอนฟิก/สภาพแวดล้อมมีผลกับเซสชันใหม่หรือเซสชันที่รีเซ็ต ไม่ใช่ทรานสคริปต์ที่มีอยู่ เซสชันแบบเดิมที่มีประวัติทรานสคริปต์แต่ไม่มีพินที่บันทึกไว้จะถือว่าถูกตรึงไว้กับ PI `/status` รายงานรันไทม์ที่มีผล เช่น `Runtime: OpenClaw Pi Default` หรือ `Runtime: OpenAI Codex`
+- สิ่งนี้ควบคุมเฉพาะการดำเนินการเทิร์นเอเจนต์แบบข้อความ การสร้างสื่อ, วิชัน, PDF, เพลง, วิดีโอ และ TTS ยังคงใช้การตั้งค่าผู้ให้บริการ/โมเดลของตน
-**ชอร์ตแฮนด์นามแฝงในตัว** (ใช้เฉพาะเมื่อโมเดลอยู่ใน `agents.defaults.models`):
+**ชื่อแฝงย่อในตัว** (ใช้เฉพาะเมื่อโมเดลอยู่ใน `agents.defaults.models`):
-| นามแฝง | โมเดล |
+| ชื่อแฝง | โมเดล |
| ------------------- | ------------------------------------------ |
| `opus` | `anthropic/claude-opus-4-6` |
| `sonnet` | `anthropic/claude-sonnet-4-6` |
-| `gpt` | `openai/gpt-5.5` or `openai-codex/gpt-5.5` |
+| `gpt` | `openai/gpt-5.5` หรือ `openai-codex/gpt-5.5` |
| `gpt-mini` | `openai/gpt-5.4-mini` |
| `gpt-nano` | `openai/gpt-5.4-nano` |
| `gemini` | `google/gemini-3.1-pro-preview` |
| `gemini-flash` | `google/gemini-3-flash-preview` |
| `gemini-flash-lite` | `google/gemini-3.1-flash-lite-preview` |
-นามแฝงที่คุณกำหนดค่าไว้จะชนะค่าเริ่มต้นเสมอ
+ชื่อแฝงที่คุณคอนฟิกไว้จะมีผลเหนือกว่าค่าเริ่มต้นเสมอ
-โมเดล Z.AI GLM-4.x จะเปิดใช้โหมด thinking โดยอัตโนมัติ เว้นแต่คุณจะตั้งค่า `--thinking off` หรือกำหนด `agents.defaults.models["zai/"].params.thinking` ด้วยตนเอง
-โมเดล Z.AI เปิดใช้ `tool_stream` ตามค่าเริ่มต้นสำหรับการสตรีมการเรียกใช้เครื่องมือ ตั้งค่า `agents.defaults.models["zai/"].params.tool_stream` เป็น `false` เพื่อปิดใช้
-โมเดล Anthropic Claude 4.6 ใช้ thinking แบบ `adaptive` เป็นค่าเริ่มต้นเมื่อไม่ได้ตั้งค่าระดับ thinking อย่างชัดเจน
+โมเดล Z.AI GLM-4.x จะเปิดใช้โหมด thinking โดยอัตโนมัติ เว้นแต่คุณตั้งค่า `--thinking off` หรือกำหนด `agents.defaults.models["zai/"].params.thinking` เอง
+โมเดล Z.AI เปิดใช้ `tool_stream` เป็นค่าเริ่มต้นสำหรับการสตรีมการเรียกใช้เครื่องมือ ตั้งค่า `agents.defaults.models["zai/"].params.tool_stream` เป็น `false` เพื่อปิดใช้
+โมเดล Anthropic Claude 4.6 ใช้ `adaptive` thinking เป็นค่าเริ่มต้นเมื่อไม่ได้ตั้งค่าระดับ thinking อย่างชัดเจน
### `agents.defaults.cliBackends`
-แบ็กเอนด์ CLI แบบไม่บังคับสำหรับการรันสำรองแบบข้อความเท่านั้น (ไม่มีการเรียกใช้เครื่องมือ) มีประโยชน์เป็นตัวสำรองเมื่อผู้ให้บริการ API ล้มเหลว
+แบ็กเอนด์ CLI เพิ่มเติมสำหรับการรันสำรองแบบข้อความเท่านั้น (ไม่มีการเรียกใช้เครื่องมือ) มีประโยชน์เป็นตัวสำรองเมื่อผู้ให้บริการ API ล้มเหลว
```json5
{
@@ -477,13 +483,13 @@ override ระดับเอเจนต์สำหรับงบประ
}
```
-- แบ็กเอนด์ CLI เน้นข้อความเป็นหลัก เครื่องมือจะถูกปิดใช้อยู่เสมอ
+- แบ็กเอนด์ CLI เน้นข้อความเป็นหลัก เครื่องมือจะถูกปิดใช้งานเสมอ
- รองรับเซสชันเมื่อตั้งค่า `sessionArg`
-- รองรับการส่งผ่านรูปภาพเมื่อ `imageArg` รับพาธไฟล์ได้
+- รองรับการส่งผ่านรูปภาพเมื่อ `imageArg` รับพาธไฟล์
### `agents.defaults.systemPromptOverride`
-แทนที่พรอมต์ระบบทั้งหมดที่ OpenClaw ประกอบขึ้นด้วยสตริงคงที่ ตั้งค่าที่ระดับค่าเริ่มต้น (`agents.defaults.systemPromptOverride`) หรือแยกตามตัวแทน (`agents.list[].systemPromptOverride`) ค่ารายตัวแทนมีลำดับความสำคัญเหนือกว่า ค่าว่างหรือค่าที่มีแต่ช่องว่างจะถูกละเว้น มีประโยชน์สำหรับการทดลองพรอมต์แบบควบคุม
+แทนที่ system prompt ทั้งหมดที่ OpenClaw ประกอบขึ้นด้วยสตริงคงที่ ตั้งค่าได้ที่ระดับค่าเริ่มต้น (`agents.defaults.systemPromptOverride`) หรือรายเอเจนต์ (`agents.list[].systemPromptOverride`) ค่ารายเอเจนต์มีลำดับความสำคัญสูงกว่า ค่าว่างหรือค่าที่มีแต่ช่องว่างจะถูกละเว้น มีประโยชน์สำหรับการทดลอง prompt แบบควบคุม
```json5
{
@@ -497,7 +503,7 @@ override ระดับเอเจนต์สำหรับงบประ
### `agents.defaults.promptOverlays`
-โอเวอร์เลย์พรอมต์ที่ไม่ขึ้นกับผู้ให้บริการ ซึ่งนำไปใช้ตามตระกูลโมเดล รหัสโมเดลในตระกูล GPT-5 จะได้รับสัญญาพฤติกรรมร่วมกันข้ามผู้ให้บริการ ส่วน `personality` ควบคุมเฉพาะเลเยอร์รูปแบบการโต้ตอบที่เป็นมิตรเท่านั้น
+prompt overlay ที่ไม่ขึ้นกับผู้ให้บริการ ใช้ตามตระกูลโมเดล ID โมเดลตระกูล GPT-5 จะได้รับสัญญาพฤติกรรมที่ใช้ร่วมกันข้ามผู้ให้บริการ ส่วน `personality` ควบคุมเฉพาะชั้นรูปแบบการโต้ตอบที่เป็นมิตร
```json5
{
@@ -513,9 +519,9 @@ override ระดับเอเจนต์สำหรับงบประ
}
```
-- `"friendly"` (ค่าเริ่มต้น) และ `"on"` เปิดใช้เลเยอร์รูปแบบการโต้ตอบที่เป็นมิตร
-- `"off"` ปิดใช้เฉพาะเลเยอร์ที่เป็นมิตร สัญญาพฤติกรรม GPT-5 ที่ติดแท็กไว้ยังคงเปิดใช้อยู่
-- ระบบยังอ่าน `plugins.entries.openai.config.personality` แบบเดิมเมื่อไม่ได้ตั้งค่าการตั้งค่าร่วมนี้
+- `"friendly"` (ค่าเริ่มต้น) และ `"on"` เปิดใช้ชั้นรูปแบบการโต้ตอบที่เป็นมิตร
+- `"off"` ปิดใช้เฉพาะชั้นที่เป็นมิตร สัญญาพฤติกรรม GPT-5 ที่ติดแท็กไว้ยังคงเปิดใช้งานอยู่
+- ระบบยังอ่าน `plugins.entries.openai.config.personality` แบบเดิมเมื่อยังไม่ได้ตั้งค่าการตั้งค่าร่วมนี้
### `agents.defaults.heartbeat`
@@ -548,15 +554,15 @@ override ระดับเอเจนต์สำหรับงบประ
```
- `every`: สตริงระยะเวลา (ms/s/m/h) ค่าเริ่มต้น: `30m` (การยืนยันตัวตนด้วยคีย์ API) หรือ `1h` (การยืนยันตัวตนด้วย OAuth) ตั้งค่าเป็น `0m` เพื่อปิดใช้
-- `includeSystemPromptSection`: เมื่อเป็น false จะละเว้นส่วน Heartbeat จากพรอมต์ระบบและข้ามการฉีด `HEARTBEAT.md` เข้าไปในบริบทบูตสแตรป ค่าเริ่มต้น: `true`
-- `suppressToolErrorWarnings`: เมื่อเป็น true จะระงับเพย์โหลดคำเตือนข้อผิดพลาดของเครื่องมือระหว่างการรัน Heartbeat
-- `timeoutSeconds`: เวลาสูงสุดเป็นวินาทีที่อนุญาตสำหรับเทิร์นของตัวแทน Heartbeat ก่อนถูกยกเลิก หากไม่ตั้งค่า จะใช้ `agents.defaults.timeoutSeconds`
-- `directPolicy`: นโยบายการส่งตรง/DM `allow` (ค่าเริ่มต้น) อนุญาตการส่งไปยังเป้าหมายโดยตรง `block` ระงับการส่งไปยังเป้าหมายโดยตรงและส่งออก `reason=dm-blocked`
-- `lightContext`: เมื่อเป็น true การรัน Heartbeat จะใช้บริบทบูตสแตรปแบบเบาและเก็บเฉพาะ `HEARTBEAT.md` จากไฟล์บูตสแตรปของเวิร์กสเปซ
-- `isolatedSession`: เมื่อเป็น true Heartbeat แต่ละครั้งจะรันในเซสชันใหม่โดยไม่มีประวัติการสนทนาก่อนหน้า ใช้รูปแบบการแยกเดียวกับ Cron `sessionTarget: "isolated"` ลดต้นทุนโทเคนต่อ Heartbeat จากประมาณ 100K เหลือประมาณ 2-5K โทเคน
-- `skipWhenBusy`: เมื่อเป็น true การรัน Heartbeat จะเลื่อนออกไปเมื่อมีเลนที่ยุ่งเพิ่มเติม ได้แก่ งาน subagent หรือคำสั่งแบบซ้อน เลน Cron จะเลื่อน Heartbeat ออกไปเสมอ แม้ไม่มีแฟล็กนี้
-- รายตัวแทน: ตั้งค่า `agents.list[].heartbeat` เมื่อมีตัวแทนใดก็ตามกำหนด `heartbeat` **เฉพาะตัวแทนเหล่านั้น** เท่านั้นที่จะรัน Heartbeat
-- Heartbeat รันเทิร์นตัวแทนเต็มรูปแบบ ช่วงเวลาที่สั้นลงจะใช้โทเคนมากขึ้น
+- `includeSystemPromptSection`: เมื่อเป็น false จะละเว้นส่วน Heartbeat จาก system prompt และข้ามการแทรก `HEARTBEAT.md` ลงในบริบท bootstrap ค่าเริ่มต้น: `true`
+- `suppressToolErrorWarnings`: เมื่อเป็น true จะระงับ payload คำเตือนข้อผิดพลาดของเครื่องมือระหว่างการรัน Heartbeat
+- `timeoutSeconds`: เวลาสูงสุดเป็นวินาทีที่อนุญาตสำหรับเทิร์นของเอเจนต์ Heartbeat ก่อนถูกยกเลิก ปล่อยว่างไว้เพื่อใช้ `agents.defaults.timeoutSeconds`
+- `directPolicy`: นโยบายการส่งตรง/DM `allow` (ค่าเริ่มต้น) อนุญาตการส่งไปยังเป้าหมายตรง `block` ระงับการส่งไปยังเป้าหมายตรงและปล่อย `reason=dm-blocked`
+- `lightContext`: เมื่อเป็น true การรัน Heartbeat จะใช้บริบท bootstrap แบบเบาและเก็บเฉพาะ `HEARTBEAT.md` จากไฟล์ bootstrap ของเวิร์กสเปซ
+- `isolatedSession`: เมื่อเป็น true แต่ละ Heartbeat จะรันในเซสชันใหม่โดยไม่มีประวัติการสนทนาก่อนหน้า รูปแบบการแยกเดียวกับ Cron `sessionTarget: "isolated"` ลดค่าใช้จ่ายโทเคนต่อ Heartbeat จากประมาณ 100K เหลือประมาณ 2-5K โทเคน
+- `skipWhenBusy`: เมื่อเป็น true การรัน Heartbeat จะเลื่อนออกไปบนเลนที่ยุ่งเพิ่มเติม: งาน subagent หรือคำสั่งซ้อน เลน Cron จะเลื่อน Heartbeat เสมอ แม้ไม่มีแฟล็กนี้
+- รายเอเจนต์: ตั้งค่า `agents.list[].heartbeat` เมื่อเอเจนต์ใดกำหนด `heartbeat` **เฉพาะเอเจนต์เหล่านั้น** เท่านั้นที่จะรัน Heartbeat
+- Heartbeat รันเทิร์นเอเจนต์เต็มรูปแบบ ช่วงเวลาที่สั้นลงใช้โทเคนมากขึ้น
### `agents.defaults.compaction`
@@ -592,23 +598,23 @@ override ระดับเอเจนต์สำหรับงบประ
}
```
-- `mode`: `default` หรือ `safeguard` (การสรุปแบบแบ่งชิ้นสำหรับประวัติยาว) ดู [Compaction](/th/concepts/compaction)
-- `provider`: รหัสของ Plugin ผู้ให้บริการ Compaction ที่ลงทะเบียนไว้ เมื่อตั้งค่าแล้ว จะเรียก `summarize()` ของผู้ให้บริการแทนการสรุปด้วย LLM ในตัว หากล้มเหลวจะย้อนกลับไปใช้แบบในตัว การตั้งค่าผู้ให้บริการจะบังคับ `mode: "safeguard"` ดู [Compaction](/th/concepts/compaction)
-- `timeoutSeconds`: จำนวนวินาทีสูงสุดที่อนุญาตสำหรับการดำเนินการ Compaction หนึ่งครั้งก่อนที่ OpenClaw จะยกเลิก ค่าเริ่มต้น: `900`
-- `keepRecentTokens`: งบประมาณจุดตัดของ Pi สำหรับเก็บส่วนท้ายทรานสคริปต์ล่าสุดแบบคงคำต่อคำ `/compact` แบบแมนนวลจะเคารพค่านี้เมื่อตั้งไว้อย่างชัดเจน มิฉะนั้น Compaction แบบแมนนวลจะเป็นเช็กพอยต์แบบแข็ง
-- `identifierPolicy`: `strict` (ค่าเริ่มต้น), `off` หรือ `custom` `strict` จะเติมคำแนะนำในตัวสำหรับการคงตัวระบุแบบทึบแสงไว้ด้านหน้าระหว่างการสรุป Compaction
-- `identifierInstructions`: ข้อความกำหนดเองแบบไม่บังคับสำหรับการรักษาตัวระบุ ใช้เมื่อ `identifierPolicy=custom`
-- `qualityGuard`: การตรวจสอบแบบลองใหม่เมื่อเอาต์พุตมีรูปแบบไม่ถูกต้องสำหรับสรุปแบบ safeguard เปิดใช้ตามค่าเริ่มต้นในโหมด safeguard ตั้งค่า `enabled: false` เพื่อข้ามการตรวจสอบ
-- `midTurnPrecheck`: การตรวจสอบแรงกดของลูปเครื่องมือ Pi แบบไม่บังคับ เมื่อ `enabled: true` OpenClaw จะตรวจสอบแรงกดของบริบทหลังจากผนวกผลลัพธ์เครื่องมือแล้วและก่อนการเรียกโมเดลครั้งถัดไป หากบริบทไม่พอดีอีกต่อไป ระบบจะยกเลิกความพยายามปัจจุบันก่อนส่งพรอมต์ และใช้เส้นทางกู้คืน precheck ที่มีอยู่ซ้ำเพื่อตัดผลลัพธ์เครื่องมือหรือทำ Compaction แล้วลองใหม่ ทำงานได้กับทั้งโหมด Compaction `default` และ `safeguard` ค่าเริ่มต้น: ปิดใช้
-- `postCompactionSections`: ชื่อส่วน H2/H3 ของ AGENTS.md แบบไม่บังคับที่จะฉีดกลับเข้าไปหลัง Compaction ค่าเริ่มต้นคือ `["Session Startup", "Red Lines"]`; ตั้งค่า `[]` เพื่อปิดการฉีดกลับ เมื่อไม่ได้ตั้งค่าหรือตั้งค่าอย่างชัดเจนเป็นคู่ค่าเริ่มต้นนั้น หัวข้อ `Every Session`/`Safety` รุ่นเก่าก็ยังถูกรับเป็นทางเลือกสำรองเพื่อความเข้ากันได้
-- `model`: การแทนที่ `provider/model-id` แบบไม่บังคับสำหรับการสรุป Compaction เท่านั้น ใช้เมื่อต้องการให้เซสชันหลักคงใช้โมเดลหนึ่ง แต่ให้สรุป Compaction รันบนอีกโมเดลหนึ่ง เมื่อไม่ได้ตั้งค่า Compaction จะใช้โมเดลหลักของเซสชัน
-- `maxActiveTranscriptBytes`: เกณฑ์จำนวนไบต์แบบไม่บังคับ (`number` หรือสตริงเช่น `"20mb"`) ที่จะทริกเกอร์ Compaction ภายในเครื่องแบบปกติก่อนการรัน เมื่อ JSONL ที่ใช้งานอยู่โตเกินเกณฑ์ ต้องใช้ `truncateAfterCompaction` เพื่อให้ Compaction ที่สำเร็จสามารถหมุนไปยังทรานสคริปต์ตัวถัดไปที่เล็กกว่าได้ ปิดใช้เมื่อไม่ได้ตั้งค่าหรือเป็น `0`
-- `notifyUser`: เมื่อเป็น `true` จะส่งการแจ้งเตือนสั้น ๆ ให้ผู้ใช้เมื่อ Compaction เริ่มและเมื่อเสร็จสิ้น (เช่น "Compacting context..." และ "Compaction complete") ปิดใช้ตามค่าเริ่มต้นเพื่อให้ Compaction เงียบ
-- `memoryFlush`: เทิร์น agentic แบบเงียบก่อน auto-compaction เพื่อเก็บความทรงจำที่คงทน ตั้งค่า `model` เป็น provider/model ที่แน่นอน เช่น `ollama/qwen3:8b` เมื่อเทิร์นดูแลระบบนี้ควรอยู่บนโมเดลภายในเครื่อง การแทนที่นี้ไม่สืบทอดเชน fallback ของเซสชันที่ใช้งานอยู่ ข้ามเมื่อเวิร์กสเปซเป็นแบบอ่านอย่างเดียว
+- `mode`: `default` หรือ `safeguard` (การสรุปแบบแบ่งส่วนสำหรับประวัติยาว) ดู [Compaction](/th/concepts/compaction)
+- `provider`: ID ของ Plugin ผู้ให้บริการ Compaction ที่ลงทะเบียนไว้ เมื่อตั้งค่า จะเรียก `summarize()` ของผู้ให้บริการแทนการสรุปด้วย LLM ในตัว หากล้มเหลวจะย้อนกลับไปใช้แบบในตัว การตั้งค่าผู้ให้บริการจะบังคับ `mode: "safeguard"` ดู [Compaction](/th/concepts/compaction)
+- `timeoutSeconds`: จำนวนวินาทีสูงสุดที่อนุญาตสำหรับการดำเนินการ Compaction เดี่ยวก่อนที่ OpenClaw จะยกเลิก ค่าเริ่มต้น: `900`
+- `keepRecentTokens`: งบประมาณจุดตัดของ Pi สำหรับเก็บท้าย transcript ล่าสุดแบบคำต่อคำ `/compact` แบบแมนนวลจะเคารพค่านี้เมื่อตั้งค่าไว้อย่างชัดเจน มิฉะนั้นการ Compaction แบบแมนนวลจะเป็น checkpoint แบบเข้มงวด
+- `identifierPolicy`: `strict` (ค่าเริ่มต้น), `off` หรือ `custom` `strict` จะเติมคำแนะนำในตัวสำหรับการคงตัวระบุทึบแสงไว้ระหว่างการสรุป Compaction
+- `identifierInstructions`: ข้อความกำหนดเองเพิ่มเติมสำหรับการรักษาตัวระบุ ใช้เมื่อ `identifierPolicy=custom`
+- `qualityGuard`: การตรวจสอบ retry-on-malformed-output สำหรับสรุป safeguard เปิดใช้เป็นค่าเริ่มต้นในโหมด safeguard ตั้งค่า `enabled: false` เพื่อข้ามการตรวจสอบ
+- `midTurnPrecheck`: การตรวจสอบแรงกดดัน tool-loop ของ Pi เพิ่มเติม เมื่อ `enabled: true` OpenClaw จะตรวจสอบแรงกดดันของบริบทหลังจากเพิ่มผลลัพธ์เครื่องมือและก่อนการเรียกโมเดลถัดไป หากบริบทไม่พอดีอีกต่อไป จะยกเลิกความพยายามปัจจุบันก่อนส่ง prompt และใช้เส้นทางกู้คืน precheck เดิมซ้ำเพื่อตัดผลลัพธ์เครื่องมือหรือทำ Compaction แล้วลองใหม่ ใช้ได้กับทั้งโหมด Compaction `default` และ `safeguard` ค่าเริ่มต้น: ปิดใช้
+- `postCompactionSections`: ชื่อส่วน H2/H3 ใน AGENTS.md เพิ่มเติมที่จะแทรกกลับหลัง Compaction ค่าเริ่มต้นคือ `["Session Startup", "Red Lines"]`; ตั้งค่า `[]` เพื่อปิดการแทรกกลับ เมื่อไม่ได้ตั้งค่าหรือตั้งค่าเป็นคู่ค่าเริ่มต้นนั้นอย่างชัดเจน หัวข้อเดิม `Every Session`/`Safety` จะยังยอมรับเป็น fallback แบบ legacy
+- `model`: การ override `provider/model-id` เพิ่มเติมสำหรับการสรุป Compaction เท่านั้น ใช้เมื่อเซสชันหลักควรคงโมเดลหนึ่งไว้ แต่สรุป Compaction ควรรันบนอีกโมเดลหนึ่ง เมื่อไม่ได้ตั้งค่า Compaction จะใช้โมเดลหลักของเซสชัน
+- `maxActiveTranscriptBytes`: เกณฑ์ไบต์เพิ่มเติม (`number` หรือสตริงเช่น `"20mb"`) ที่ทริกเกอร์ Compaction ภายในปกติก่อนการรันเมื่อ JSONL ที่ใช้งานอยู่โตเกินเกณฑ์ ต้องใช้ `truncateAfterCompaction` เพื่อให้ Compaction ที่สำเร็จสามารถหมุนไปยัง transcript สืบทอดที่เล็กลง ปิดใช้เมื่อไม่ได้ตั้งค่าหรือเป็น `0`
+- `notifyUser`: เมื่อเป็น `true` จะส่งการแจ้งเตือนสั้น ๆ ให้ผู้ใช้เมื่อ Compaction เริ่มต้นและเมื่อเสร็จสมบูรณ์ (เช่น "Compacting context..." และ "Compaction complete") ปิดใช้เป็นค่าเริ่มต้นเพื่อให้ Compaction ทำงานเงียบ
+- `memoryFlush`: เทิร์น agentic แบบเงียบก่อน auto-compaction เพื่อเก็บความทรงจำถาวร ตั้งค่า `model` เป็นผู้ให้บริการ/โมเดลที่แน่นอน เช่น `ollama/qwen3:8b` เมื่อเทิร์นงานดูแลนี้ควรคงอยู่บนโมเดลภายใน เครื่อง override นี้ไม่สืบทอด fallback chain ของเซสชันที่ใช้งานอยู่ ข้ามเมื่อเวิร์กสเปซเป็นแบบอ่านอย่างเดียว
### `agents.defaults.contextPruning`
-ตัด **ผลลัพธ์เครื่องมือเก่า** ออกจากบริบทในหน่วยความจำก่อนส่งไปยัง LLM **ไม่** แก้ไขประวัติเซสชันบนดิสก์
+ตัดแต่ง **ผลลัพธ์เครื่องมือเก่า** จากบริบทในหน่วยความจำก่อนส่งไปยัง LLM **ไม่** แก้ไขประวัติเซสชันบนดิสก์
```json5
{
@@ -630,25 +636,25 @@ override ระดับเอเจนต์สำหรับงบประ
}
```
-
+
-- `mode: "cache-ttl"` เปิดใช้รอบการตัด
-- `ttl` ควบคุมความถี่ที่การตัดจะรันซ้ำได้ (หลังจากการแตะแคชครั้งล่าสุด)
-- การตัดจะ soft-trim ผลลัพธ์เครื่องมือที่มีขนาดใหญ่เกินก่อน แล้วจึง hard-clear ผลลัพธ์เครื่องมือที่เก่ากว่าเมื่อจำเป็น
+- `mode: "cache-ttl"` เปิดใช้รอบการตัดแต่ง
+- `ttl` ควบคุมว่าการตัดแต่งจะรันซ้ำได้บ่อยเพียงใด (หลังจากการแตะแคชครั้งล่าสุด)
+- การตัดแต่งจะ soft-trim ผลลัพธ์เครื่องมือที่ใหญ่เกินก่อน จากนั้น hard-clear ผลลัพธ์เครื่องมือที่เก่ากว่าหากจำเป็น
-**Soft-trim** เก็บส่วนต้น + ส่วนท้าย และแทรก `...` ตรงกลาง
+**Soft-trim** เก็บส่วนต้น + ส่วนท้าย และแทรก `...` ไว้ตรงกลาง
-**Hard-clear** แทนที่ผลลัพธ์เครื่องมือทั้งหมดด้วยข้อความ placeholder
+**Hard-clear** แทนที่ผลลัพธ์เครื่องมือทั้งหมดด้วย placeholder
หมายเหตุ:
-- บล็อกรูปภาพจะไม่ถูกตัด/ล้าง
+- บล็อกรูปภาพจะไม่ถูก trim/clear
- อัตราส่วนอิงตามจำนวนอักขระ (โดยประมาณ) ไม่ใช่จำนวนโทเคนที่แน่นอน
-- หากมีข้อความ assistant น้อยกว่า `keepLastAssistants` ระบบจะข้ามการตัด
+- หากมีข้อความผู้ช่วยน้อยกว่า `keepLastAssistants` จะข้ามการตัดแต่ง
-ดู [การตัดเซสชัน](/th/concepts/session-pruning) สำหรับรายละเอียดพฤติกรรม
+ดู [การตัดแต่งเซสชัน](/th/concepts/session-pruning) สำหรับรายละเอียดพฤติกรรม
### การสตรีมแบบบล็อก
@@ -666,11 +672,11 @@ override ระดับเอเจนต์สำหรับงบประ
}
```
-- ช่องทางที่ไม่ใช่ Telegram ต้องตั้งค่า `*.blockStreaming: true` อย่างชัดเจนเพื่อเปิดใช้การตอบกลับแบบบล็อก
-- การแทนที่ตามช่องทาง: `channels..blockStreamingCoalesce` (และรูปแบบแยกตามบัญชี) Signal/Slack/Discord/Google Chat ใช้ค่าเริ่มต้น `minChars: 1500`
-- `humanDelay`: การหน่วงแบบสุ่มระหว่างการตอบกลับแบบบล็อก `natural` = 800–2500ms การแทนที่รายตัวแทน: `agents.list[].humanDelay`
+- ช่องทางที่ไม่ใช่ Telegram ต้องมี `*.blockStreaming: true` อย่างชัดเจนเพื่อเปิดใช้การตอบแบบบล็อก
+- การ override ระดับช่องทาง: `channels..blockStreamingCoalesce` (และตัวแปรรายบัญชี) Signal/Slack/Discord/Google Chat มีค่าเริ่มต้น `minChars: 1500`
+- `humanDelay`: การหยุดแบบสุ่มระหว่างการตอบแบบบล็อก `natural` = 800–2500ms การ override รายเอเจนต์: `agents.list[].humanDelay`
-ดู [การสตรีม](/th/concepts/streaming) สำหรับรายละเอียดพฤติกรรม + การแบ่งชิ้น
+ดู [Streaming](/th/concepts/streaming) สำหรับรายละเอียดพฤติกรรม + การแบ่ง chunk
### ตัวบ่งชี้การพิมพ์
@@ -685,7 +691,7 @@ override ระดับเอเจนต์สำหรับงบประ
}
```
-- ค่าเริ่มต้น: `instant` สำหรับแชตโดยตรง/การกล่าวถึง, `message` สำหรับแชตกลุ่มที่ไม่ได้กล่าวถึง
+- ค่าเริ่มต้น: `instant` สำหรับแชต/การกล่าวถึงโดยตรง, `message` สำหรับแชตกลุ่มที่ไม่ได้กล่าวถึง
- การแทนที่ต่อเซสชัน: `session.typingMode`, `session.typingIntervalSeconds`
ดู [ตัวบ่งชี้การพิมพ์](/th/concepts/typing-indicators)
@@ -694,7 +700,7 @@ override ระดับเอเจนต์สำหรับงบประ
### `agents.defaults.sandbox`
-การทำแซนด์บ็อกซ์แบบไม่บังคับสำหรับเอเจนต์แบบฝัง ดูคู่มือฉบับเต็มที่ [การทำแซนด์บ็อกซ์](/th/gateway/sandboxing)
+Sandboxing แบบไม่บังคับสำหรับตัวแทนแบบฝัง ดูคู่มือฉบับเต็มได้ที่ [Sandboxing](/th/gateway/sandboxing)
```json5
{
@@ -794,7 +800,7 @@ override ระดับเอเจนต์สำหรับงบประ
**แบ็กเอนด์:**
- `docker`: รันไทม์ Docker ภายในเครื่อง (ค่าเริ่มต้น)
-- `ssh`: รันไทม์ระยะไกลทั่วไปที่รองรับด้วย SSH
+- `ssh`: รันไทม์ระยะไกลทั่วไปที่ใช้ SSH
- `openshell`: รันไทม์ OpenShell
เมื่อเลือก `backend: "openshell"` การตั้งค่าเฉพาะรันไทม์จะย้ายไปที่
@@ -805,35 +811,35 @@ override ระดับเอเจนต์สำหรับงบประ
- `target`: เป้าหมาย SSH ในรูปแบบ `user@host[:port]`
- `command`: คำสั่งไคลเอนต์ SSH (ค่าเริ่มต้น: `ssh`)
- `workspaceRoot`: รูทระยะไกลแบบสัมบูรณ์ที่ใช้สำหรับเวิร์กสเปซต่อขอบเขต
-- `identityFile` / `certificateFile` / `knownHostsFile`: ไฟล์ภายในเครื่องที่มีอยู่ซึ่งส่งต่อให้ OpenSSH
-- `identityData` / `certificateData` / `knownHostsData`: เนื้อหาแบบอินไลน์หรือ SecretRefs ที่ OpenClaw สร้างเป็นไฟล์ชั่วคราวขณะรัน
-- `strictHostKeyChecking` / `updateHostKeys`: ปุ่มปรับนโยบายคีย์โฮสต์ของ OpenSSH
+- `identityFile` / `certificateFile` / `knownHostsFile`: ไฟล์ภายในเครื่องที่มีอยู่ซึ่งส่งต่อไปยัง OpenSSH
+- `identityData` / `certificateData` / `knownHostsData`: เนื้อหาอินไลน์หรือ SecretRefs ที่ OpenClaw สร้างเป็นไฟล์ชั่วคราวในขณะรันไทม์
+- `strictHostKeyChecking` / `updateHostKeys`: ปุ่มควบคุมนโยบายคีย์โฮสต์ของ OpenSSH
-**ลำดับความสำคัญของการยืนยันตัวตน SSH:**
+**ลำดับความสำคัญการยืนยันตัวตน SSH:**
-- `identityData` ชนะ `identityFile`
-- `certificateData` ชนะ `certificateFile`
-- `knownHostsData` ชนะ `knownHostsFile`
-- ค่า `*Data` ที่รองรับด้วย SecretRef จะถูกแก้ค่าจากสแนปช็อตรันไทม์ความลับที่ใช้งานอยู่ก่อนเซสชันแซนด์บ็อกซ์เริ่มต้น
+- `identityData` มีลำดับเหนือ `identityFile`
+- `certificateData` มีลำดับเหนือ `certificateFile`
+- `knownHostsData` มีลำดับเหนือ `knownHostsFile`
+- ค่า `*Data` ที่อิง SecretRef จะถูกแก้ค่าจากสแนปช็อตรันไทม์ secrets ที่ใช้งานอยู่ก่อนเริ่มเซสชัน sandbox
-**พฤติกรรมแบ็กเอนด์ SSH:**
+**พฤติกรรมของแบ็กเอนด์ SSH:**
- เติมข้อมูลเริ่มต้นให้เวิร์กสเปซระยะไกลหนึ่งครั้งหลังจากสร้างหรือสร้างใหม่
-- จากนั้นคงให้เวิร์กสเปซ SSH ระยะไกลเป็นแหล่งอ้างอิงหลัก
-- ส่งเส้นทาง `exec`, เครื่องมือไฟล์ และพาธสื่อผ่าน SSH
-- ไม่ซิงค์การเปลี่ยนแปลงระยะไกลกลับไปยังโฮสต์โดยอัตโนมัติ
-- ไม่รองรับคอนเทนเนอร์เบราว์เซอร์แซนด์บ็อกซ์
+- จากนั้นคงให้เวิร์กสเปซ SSH ระยะไกลเป็นแหล่งหลัก
+- ส่งต่อ `exec`, เครื่องมือไฟล์ และพาธสื่อผ่าน SSH
+- ไม่ซิงค์การเปลี่ยนแปลงระยะไกลกลับมายังโฮสต์โดยอัตโนมัติ
+- ไม่รองรับคอนเทนเนอร์เบราว์เซอร์ sandbox
**การเข้าถึงเวิร์กสเปซ:**
-- `none`: เวิร์กสเปซแซนด์บ็อกซ์ต่อขอบเขตภายใต้ `~/.openclaw/sandboxes`
-- `ro`: เวิร์กสเปซแซนด์บ็อกซ์ที่ `/workspace`, เมานต์เวิร์กสเปซของเอเจนต์แบบอ่านอย่างเดียวที่ `/agent`
-- `rw`: เมานต์เวิร์กสเปซของเอเจนต์แบบอ่าน/เขียนที่ `/workspace`
+- `none`: เวิร์กสเปซ sandbox ต่อขอบเขตภายใต้ `~/.openclaw/sandboxes`
+- `ro`: เวิร์กสเปซ sandbox ที่ `/workspace`, เวิร์กสเปซตัวแทนถูกเมานต์แบบอ่านอย่างเดียวที่ `/agent`
+- `rw`: เวิร์กสเปซตัวแทนถูกเมานต์แบบอ่าน/เขียนที่ `/workspace`
**ขอบเขต:**
- `session`: คอนเทนเนอร์ + เวิร์กสเปซต่อเซสชัน
-- `agent`: หนึ่งคอนเทนเนอร์ + เวิร์กสเปซต่อเอเจนต์ (ค่าเริ่มต้น)
+- `agent`: หนึ่งคอนเทนเนอร์ + เวิร์กสเปซต่อหนึ่งตัวแทน (ค่าเริ่มต้น)
- `shared`: คอนเทนเนอร์และเวิร์กสเปซที่ใช้ร่วมกัน (ไม่มีการแยกกันระหว่างเซสชัน)
**การกำหนดค่า Plugin OpenShell:**
@@ -864,29 +870,29 @@ override ระดับเอเจนต์สำหรับงบประ
**โหมด OpenShell:**
-- `mirror`: เติมข้อมูลเริ่มต้นไปยังระยะไกลจากภายในเครื่องก่อน exec, ซิงค์กลับหลัง exec; เวิร์กสเปซภายในเครื่องยังคงเป็นแหล่งอ้างอิงหลัก
-- `remote`: เติมข้อมูลเริ่มต้นไปยังระยะไกลหนึ่งครั้งเมื่อสร้างแซนด์บ็อกซ์ จากนั้นคงให้เวิร์กสเปซระยะไกลเป็นแหล่งอ้างอิงหลัก
+- `mirror`: เติมข้อมูลระยะไกลจากภายในเครื่องก่อน exec, ซิงค์กลับหลัง exec; เวิร์กสเปซภายในเครื่องยังคงเป็นแหล่งหลัก
+- `remote`: เติมข้อมูลระยะไกลหนึ่งครั้งเมื่อสร้าง sandbox แล้วคงให้เวิร์กสเปซระยะไกลเป็นแหล่งหลัก
-ในโหมด `remote` การแก้ไขภายในเครื่องของโฮสต์ที่ทำนอก OpenClaw จะไม่ถูกซิงค์เข้าไปในแซนด์บ็อกซ์โดยอัตโนมัติหลังขั้นตอนการเติมข้อมูลเริ่มต้น
-การขนส่งคือ SSH เข้าไปยังแซนด์บ็อกซ์ OpenShell แต่ Plugin เป็นเจ้าของวงจรชีวิตแซนด์บ็อกซ์และการซิงค์มิเรอร์แบบไม่บังคับ
+ในโหมด `remote` การแก้ไขภายในเครื่องของโฮสต์ที่ทำนอก OpenClaw จะไม่ถูกซิงค์เข้า sandbox โดยอัตโนมัติหลังขั้นตอนเติมข้อมูลเริ่มต้น
+การรับส่งข้อมูลคือ SSH เข้าไปยัง sandbox ของ OpenShell แต่ Plugin เป็นเจ้าของวงจรชีวิต sandbox และการซิงค์ mirror แบบไม่บังคับ
-**`setupCommand`** ทำงานหนึ่งครั้งหลังจากสร้างคอนเทนเนอร์ (ผ่าน `sh -lc`) ต้องมีทางออกเครือข่าย, รูทที่เขียนได้, ผู้ใช้ root
+**`setupCommand`** ทำงานหนึ่งครั้งหลังสร้างคอนเทนเนอร์ (ผ่าน `sh -lc`) ต้องมี network egress, รูทที่เขียนได้, ผู้ใช้ root
-**คอนเทนเนอร์มีค่าเริ่มต้นเป็น `network: "none"`** — ตั้งเป็น `"bridge"` (หรือเครือข่ายบริดจ์แบบกำหนดเอง) หากเอเจนต์ต้องการการเข้าถึงขาออก
-`"host"` ถูกบล็อก `"container:"` ถูกบล็อกโดยค่าเริ่มต้น เว้นแต่คุณตั้งค่า
-`sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true` อย่างชัดเจน (ทางเลือกฉุกเฉิน)
+**คอนเทนเนอร์มีค่าเริ่มต้นเป็น `network: "none"`** — ตั้งเป็น `"bridge"` (หรือเครือข่ายบริดจ์แบบกำหนดเอง) หากตัวแทนต้องการเข้าถึงขาออก
+`"host"` ถูกบล็อก `"container:"` ถูกบล็อกตามค่าเริ่มต้น เว้นแต่คุณจะตั้งค่า
+`sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true` อย่างชัดเจน (ใช้เมื่อจำเป็นเท่านั้น)
**ไฟล์แนบขาเข้า** จะถูกจัดเตรียมไว้ใน `media/inbound/*` ในเวิร์กสเปซที่ใช้งานอยู่
-**`docker.binds`** เมานต์ไดเรกทอรีโฮสต์เพิ่มเติม; การผูกระดับสากลและต่อเอเจนต์จะถูกรวมเข้าด้วยกัน
+**`docker.binds`** เมานต์ไดเรกทอรีโฮสต์เพิ่มเติม; binds แบบส่วนกลางและต่อหนึ่งตัวแทนจะถูกรวมเข้าด้วยกัน
-**เบราว์เซอร์แบบแซนด์บ็อกซ์** (`sandbox.browser.enabled`): Chromium + CDP ในคอนเทนเนอร์ URL noVNC ถูกแทรกเข้าไปในพรอมต์ระบบ ไม่ต้องมี `browser.enabled` ใน `openclaw.json`
-การเข้าถึงผู้สังเกตการณ์ noVNC ใช้การยืนยันตัวตน VNC โดยค่าเริ่มต้น และ OpenClaw จะปล่อย URL โทเค็นอายุสั้น (แทนการเปิดเผยรหัสผ่านใน URL ที่ใช้ร่วมกัน)
+**เบราว์เซอร์ sandbox** (`sandbox.browser.enabled`): Chromium + CDP ในคอนเทนเนอร์ URL noVNC ถูกฉีดเข้า system prompt ไม่ต้องใช้ `browser.enabled` ใน `openclaw.json`
+การเข้าถึงแบบผู้สังเกตการณ์ noVNC ใช้การยืนยันตัวตน VNC ตามค่าเริ่มต้น และ OpenClaw จะปล่อย URL โทเค็นอายุสั้น (แทนการเปิดเผยรหัสผ่านใน URL ที่แชร์)
-- `allowHostControl: false` (ค่าเริ่มต้น) บล็อกเซสชันแบบแซนด์บ็อกซ์ไม่ให้กำหนดเป้าหมายไปยังเบราว์เซอร์ของโฮสต์
-- `network` มีค่าเริ่มต้นเป็น `openclaw-sandbox-browser` (เครือข่ายบริดจ์เฉพาะ) ตั้งเป็น `bridge` เฉพาะเมื่อคุณต้องการการเชื่อมต่อบริดจ์ระดับสากลอย่างชัดเจน
-- `cdpSourceRange` จำกัดทางเข้า CDP ที่ขอบคอนเทนเนอร์เป็นช่วง CIDR ได้แบบไม่บังคับ (เช่น `172.21.0.1/32`)
-- `sandbox.browser.binds` เมานต์ไดเรกทอรีโฮสต์เพิ่มเติมเข้าไปในคอนเทนเนอร์เบราว์เซอร์แซนด์บ็อกซ์เท่านั้น เมื่อกำหนดค่า (รวมถึง `[]`) ค่านี้จะแทนที่ `docker.binds` สำหรับคอนเทนเนอร์เบราว์เซอร์
+- `allowHostControl: false` (ค่าเริ่มต้น) บล็อกเซสชัน sandbox ไม่ให้กำหนดเป้าหมายไปยังเบราว์เซอร์ของโฮสต์
+- `network` มีค่าเริ่มต้นเป็น `openclaw-sandbox-browser` (เครือข่ายบริดจ์เฉพาะ) ตั้งเป็น `bridge` เฉพาะเมื่อคุณต้องการการเชื่อมต่อบริดจ์ส่วนกลางอย่างชัดเจน
+- `cdpSourceRange` จำกัด CDP ingress ที่ขอบคอนเทนเนอร์ไปยังช่วง CIDR ได้แบบไม่บังคับ (เช่น `172.21.0.1/32`)
+- `sandbox.browser.binds` เมานต์ไดเรกทอรีโฮสต์เพิ่มเติมเข้าไปในคอนเทนเนอร์เบราว์เซอร์ sandbox เท่านั้น เมื่อตั้งค่า (รวมถึง `[]`) ค่านี้จะแทนที่ `docker.binds` สำหรับคอนเทนเนอร์เบราว์เซอร์
- ค่าเริ่มต้นการเปิดใช้งานกำหนดไว้ใน `scripts/sandbox-browser-entrypoint.sh` และปรับแต่งสำหรับโฮสต์คอนเทนเนอร์:
- `--remote-debugging-address=127.0.0.1`
- `--remote-debugging-port=`
@@ -904,41 +910,40 @@ override ระดับเอเจนต์สำหรับงบประ
- `--renderer-process-limit=2`
- `--no-zygote`
- `--metrics-recording-only`
- - `--disable-extensions` (เปิดใช้งานโดยค่าเริ่มต้น)
- - `--disable-3d-apis`, `--disable-software-rasterizer` และ `--disable-gpu` จะ
- เปิดใช้งานโดยค่าเริ่มต้น และสามารถปิดใช้งานได้ด้วย
+ - `--disable-extensions` (เปิดใช้ตามค่าเริ่มต้น)
+ - `--disable-3d-apis`, `--disable-software-rasterizer`, และ `--disable-gpu`
+ เปิดใช้ตามค่าเริ่มต้นและปิดใช้งานได้ด้วย
`OPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0` หากการใช้งาน WebGL/3D ต้องใช้
- - `OPENCLAW_BROWSER_DISABLE_EXTENSIONS=0` เปิดใช้งานส่วนขยายอีกครั้ง หากเวิร์กโฟลว์ของคุณ
- ขึ้นอยู่กับส่วนขยายเหล่านั้น
- - `--renderer-process-limit=2` สามารถเปลี่ยนได้ด้วย
- `OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=`; ตั้ง `0` เพื่อใช้ขีดจำกัดกระบวนการ
- เริ่มต้นของ Chromium
- - บวก `--no-sandbox` เมื่อเปิดใช้งาน `noSandbox`
- - ค่าเริ่มต้นเป็นบรรทัดฐานของอิมเมจคอนเทนเนอร์; ใช้อิมเมจเบราว์เซอร์แบบกำหนดเองพร้อม
- จุดเริ่มต้นแบบกำหนดเองเพื่อเปลี่ยนค่าเริ่มต้นของคอนเทนเนอร์
+ - `OPENCLAW_BROWSER_DISABLE_EXTENSIONS=0` เปิดใช้ส่วนขยายอีกครั้งหากเวิร์กโฟลว์ของคุณ
+ ต้องพึ่งพาส่วนขยายนั้น
+ - `--renderer-process-limit=2` เปลี่ยนได้ด้วย
+ `OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=`; ตั้ง `0` เพื่อใช้ขีดจำกัดโปรเซส
+ ค่าเริ่มต้นของ Chromium
+ - รวมถึง `--no-sandbox` เมื่อเปิดใช้ `noSandbox`
+ - ค่าเริ่มต้นคือฐานของอิมเมจคอนเทนเนอร์; ใช้อิมเมจเบราว์เซอร์แบบกำหนดเองพร้อม
+ entrypoint แบบกำหนดเองเพื่อเปลี่ยนค่าเริ่มต้นของคอนเทนเนอร์
-การทำแซนด์บ็อกซ์เบราว์เซอร์และ `sandbox.docker.binds` รองรับเฉพาะ Docker เท่านั้น
+Sandboxing เบราว์เซอร์และ `sandbox.docker.binds` ใช้ได้กับ Docker เท่านั้น
-สร้างอิมเมจ (จากเช็กเอาต์ซอร์ส):
+สร้างอิมเมจ (จาก source checkout):
```bash
scripts/sandbox-setup.sh # main sandbox image
scripts/sandbox-browser-setup.sh # optional browser image
```
-สำหรับการติดตั้ง npm โดยไม่มีเช็กเอาต์ซอร์ส ดู [การทำแซนด์บ็อกซ์ § อิมเมจและการตั้งค่า](/th/gateway/sandboxing#images-and-setup) สำหรับคำสั่ง `docker build` แบบอินไลน์
+สำหรับการติดตั้ง npm ที่ไม่มี source checkout โปรดดู [Sandboxing § อิมเมจและการตั้งค่า](/th/gateway/sandboxing#images-and-setup) สำหรับคำสั่ง `docker build` แบบอินไลน์
-### `agents.list` (การแทนที่ต่อเอเจนต์)
+### `agents.list` (การแทนที่ต่อหนึ่งตัวแทน)
-ใช้ `agents.list[].tts` เพื่อกำหนดผู้ให้บริการ TTS, เสียง, โมเดล,
-สไตล์ หรือโหมด auto-TTS ของเอเจนต์เอง บล็อกเอเจนต์จะผสานเชิงลึกทับ
-`messages.tts` ระดับสากล เพื่อให้ข้อมูลประจำตัวที่ใช้ร่วมกันอยู่ในที่เดียวได้ ขณะที่เอเจนต์แต่ละตัว
-แทนที่เฉพาะฟิลด์เสียงหรือผู้ให้บริการที่ต้องการ การแทนที่ของเอเจนต์ที่ใช้งานอยู่
-ใช้กับการตอบกลับเสียงอัตโนมัติ, `/tts audio`, `/tts status` และ
-เครื่องมือเอเจนต์ `tts` ดู [ข้อความเป็นเสียง](/th/tools/tts#per-agent-voice-overrides)
-สำหรับตัวอย่างผู้ให้บริการและลำดับความสำคัญ
+ใช้ `agents.list[].tts` เพื่อให้ตัวแทนมีผู้ให้บริการ TTS, เสียง, โมเดล,
+สไตล์ หรือโหมด TTS อัตโนมัติของตัวเอง บล็อกตัวแทนจะ deep-merge ทับ
+`messages.tts` ส่วนกลาง ดังนั้นข้อมูลประจำตัวที่ใช้ร่วมกันจึงอยู่ที่เดียวได้ ขณะที่ตัวแทนแต่ละตัว
+แทนที่เฉพาะฟิลด์เสียงหรือผู้ให้บริการที่ต้องใช้ การแทนที่ของตัวแทนที่ใช้งานอยู่
+มีผลกับการตอบกลับด้วยเสียงอัตโนมัติ, `/tts audio`, `/tts status`, และ
+เครื่องมือตัวแทน `tts` ดูตัวอย่างผู้ให้บริการและลำดับความสำคัญได้ที่ [การแปลงข้อความเป็นเสียง](/th/tools/tts#per-agent-voice-overrides)
```json5
{
@@ -992,28 +997,28 @@ scripts/sandbox-browser-setup.sh # optional browser image
}
```
-- `id`: id ของ agent ที่เสถียร (จำเป็น)
-- `default`: เมื่อตั้งไว้หลายรายการ รายการแรกจะมีผล (บันทึกคำเตือน) หากไม่ได้ตั้งไว้ รายการแรกในลิสต์จะเป็นค่าเริ่มต้น
-- `model`: รูปแบบสตริงจะตั้ง primary ต่อ agent แบบเข้มงวดโดยไม่มี model fallback; รูปแบบออบเจ็กต์ `{ primary }` ก็เข้มงวดเช่นกัน เว้นแต่คุณจะเพิ่ม `fallbacks` ใช้ `{ primary, fallbacks: [...] }` เพื่อเลือกให้ agent นั้นใช้ fallback หรือ `{ primary, fallbacks: [] }` เพื่อทำให้พฤติกรรมแบบเข้มงวดชัดเจน Cron jobs ที่ override เฉพาะ `primary` จะยังสืบทอด default fallbacks เว้นแต่คุณจะตั้ง `fallbacks: []`
-- `params`: พารามิเตอร์สตรีมต่อ agent ที่ merge ทับรายการ model ที่เลือกใน `agents.defaults.models` ใช้สิ่งนี้สำหรับ override เฉพาะ agent เช่น `cacheRetention`, `temperature` หรือ `maxTokens` โดยไม่ต้องทำซ้ำทั้ง model catalog
-- `tts`: override text-to-speech ต่อ agent แบบไม่บังคับ บล็อกนี้ deep-merge ทับ `messages.tts` ดังนั้นให้เก็บข้อมูลรับรอง provider ที่ใช้ร่วมกันและนโยบาย fallback ไว้ใน `messages.tts` และตั้งเฉพาะค่าที่เจาะจง persona เช่น provider, voice, model, style หรือ auto mode ที่นี่
-- `skills`: allowlist ของ skill ต่อ agent แบบไม่บังคับ หากละไว้ agent จะสืบทอด `agents.defaults.skills` เมื่อตั้งไว้; ลิสต์ที่ระบุชัดเจนจะแทนที่ค่าเริ่มต้นแทนการ merge และ `[]` หมายถึงไม่มี Skills
-- `thinkingDefault`: ระดับ thinking เริ่มต้นต่อ agent แบบไม่บังคับ (`off | minimal | low | medium | high | xhigh | adaptive | max`) override `agents.defaults.thinkingDefault` สำหรับ agent นี้เมื่อไม่ได้ตั้ง override ต่อข้อความหรือ session โปรไฟล์ provider/model ที่เลือกจะควบคุมว่าค่าใดใช้ได้; สำหรับ Google Gemini, `adaptive` จะคง dynamic thinking ที่ provider เป็นเจ้าของไว้ (`thinkingLevel` ถูกละไว้ใน Gemini 3/3.1, `thinkingBudget: -1` ใน Gemini 2.5)
-- `reasoningDefault`: การมองเห็น reasoning เริ่มต้นต่อ agent แบบไม่บังคับ (`on | off | stream`) override `agents.defaults.reasoningDefault` สำหรับ agent นี้เมื่อไม่ได้ตั้ง override reasoning ต่อข้อความหรือ session
-- `fastModeDefault`: ค่าเริ่มต้นต่อ agent แบบไม่บังคับสำหรับ fast mode (`true | false`) ใช้เมื่อไม่ได้ตั้ง override fast-mode ต่อข้อความหรือ session
-- `agentRuntime`: override นโยบาย runtime ระดับต่ำต่อ agent แบบไม่บังคับ ใช้ `{ id: "codex" }` เพื่อทำให้ agent หนึ่งเป็นแบบ Codex-only ขณะที่ agent อื่นยังคง fallback PI เริ่มต้นในโหมด `auto`
-- `runtime`: descriptor ของ runtime ต่อ agent แบบไม่บังคับ ใช้ `type: "acp"` กับค่าเริ่มต้น `runtime.acp` (`agent`, `backend`, `mode`, `cwd`) เมื่อ agent ควรใช้ session ของ ACP harness เป็นค่าเริ่มต้น
-- `identity.avatar`: path แบบสัมพันธ์กับ workspace, URL `http(s)` หรือ URI `data:`
-- `identity` สร้างค่าเริ่มต้น: `ackReaction` จาก `emoji`, `mentionPatterns` จาก `name`/`emoji`
-- `subagents.allowAgents`: allowlist ของ agent ids สำหรับ target `sessions_spawn.agentId` ที่ระบุชัดเจน (`["*"]` = ใดก็ได้; ค่าเริ่มต้น: agent เดียวกันเท่านั้น) รวม requester id เมื่อควรอนุญาตการเรียก `agentId` ที่ target ตัวเอง
-- ตัวป้องกันการสืบทอด sandbox: หาก session ของ requester อยู่ใน sandbox, `sessions_spawn` จะปฏิเสธ target ที่จะรันแบบไม่อยู่ใน sandbox
-- `subagents.requireAgentId`: เมื่อเป็น true จะบล็อกการเรียก `sessions_spawn` ที่ละ `agentId` (บังคับให้เลือกโปรไฟล์อย่างชัดเจน; ค่าเริ่มต้น: false)
+- `id`: id ของเอเจนต์ที่เสถียร (ต้องระบุ).
+- `default`: เมื่อกำหนดไว้หลายรายการ รายการแรกจะมีผล (มีการบันทึกคำเตือน). หากไม่ได้กำหนด รายการแรกในลิสต์จะเป็นค่าเริ่มต้น.
+- `model`: รูปแบบสตริงจะกำหนดโมเดลหลักต่อเอเจนต์แบบเข้มงวดโดยไม่มีโมเดลสำรอง; รูปแบบอ็อบเจ็กต์ `{ primary }` ก็เข้มงวดเช่นกัน เว้นแต่คุณจะเพิ่ม `fallbacks`. ใช้ `{ primary, fallbacks: [...] }` เพื่อเลือกให้เอเจนต์นั้นใช้โมเดลสำรองได้ หรือ `{ primary, fallbacks: [] }` เพื่อระบุพฤติกรรมแบบเข้มงวดให้ชัดเจน. งาน Cron ที่ override เฉพาะ `primary` ยังคงสืบทอดค่า fallback เริ่มต้น เว้นแต่คุณจะตั้งค่า `fallbacks: []`.
+- `params`: พารามิเตอร์สตรีมต่อเอเจนต์ที่ผสานทับรายการโมเดลที่เลือกใน `agents.defaults.models`. ใช้สิ่งนี้สำหรับค่า override เฉพาะเอเจนต์ เช่น `cacheRetention`, `temperature`, หรือ `maxTokens` โดยไม่ต้องทำซ้ำแค็ตตาล็อกโมเดลทั้งหมด.
+- `tts`: ค่า override text-to-speech ต่อเอเจนต์แบบไม่บังคับ. บล็อกนี้จะ deep-merge ทับ `messages.tts` ดังนั้นให้เก็บข้อมูลรับรองผู้ให้บริการที่ใช้ร่วมกันและนโยบาย fallback ไว้ใน `messages.tts` แล้วตั้งเฉพาะค่าที่เฉพาะต่อ persona เช่น provider, voice, model, style หรือ auto mode ที่นี่.
+- `skills`: รายการอนุญาต skill ต่อเอเจนต์แบบไม่บังคับ. หากละไว้ เอเจนต์จะสืบทอด `agents.defaults.skills` เมื่อมีการตั้งค่าไว้; ลิสต์ที่ระบุชัดเจนจะแทนที่ค่าเริ่มต้นแทนที่จะผสาน และ `[]` หมายถึงไม่มี Skills.
+- `thinkingDefault`: ระดับ thinking เริ่มต้นต่อเอเจนต์แบบไม่บังคับ (`off | minimal | low | medium | high | xhigh | adaptive | max`). Override `agents.defaults.thinkingDefault` สำหรับเอเจนต์นี้เมื่อไม่มีการตั้งค่า override ต่อข้อความหรือเซสชัน. โปรไฟล์ผู้ให้บริการ/โมเดลที่เลือกจะควบคุมว่าค่าใดใช้ได้; สำหรับ Google Gemini, `adaptive` จะคง dynamic thinking ที่ผู้ให้บริการเป็นเจ้าของไว้ (`thinkingLevel` ถูกละไว้ใน Gemini 3/3.1, `thinkingBudget: -1` ใน Gemini 2.5).
+- `reasoningDefault`: การมองเห็น reasoning เริ่มต้นต่อเอเจนต์แบบไม่บังคับ (`on | off | stream`). Override `agents.defaults.reasoningDefault` สำหรับเอเจนต์นี้เมื่อไม่มีการตั้งค่า reasoning override ต่อข้อความหรือเซสชัน.
+- `fastModeDefault`: ค่าเริ่มต้นต่อเอเจนต์สำหรับ fast mode แบบไม่บังคับ (`true | false`). ใช้เมื่อไม่มีการตั้งค่า override fast-mode ต่อข้อความหรือเซสชัน.
+- `agentRuntime`: ค่า override นโยบาย runtime ระดับต่ำต่อเอเจนต์แบบไม่บังคับ. ใช้ `{ id: "codex" }` เพื่อทำให้เอเจนต์หนึ่งเป็น Codex เท่านั้น ขณะที่เอเจนต์อื่นยังคงใช้ PI fallback เริ่มต้นในโหมด `auto`.
+- `runtime`: ตัวบรรยาย runtime ต่อเอเจนต์แบบไม่บังคับ. ใช้ `type: "acp"` ร่วมกับค่าเริ่มต้น `runtime.acp` (`agent`, `backend`, `mode`, `cwd`) เมื่อเอเจนต์ควรมีค่าเริ่มต้นเป็นเซสชัน ACP harness.
+- `identity.avatar`: พาธแบบสัมพัทธ์กับเวิร์กสเปซ, URL `http(s)`, หรือ URI `data:`.
+- `identity` สร้างค่าเริ่มต้น: `ackReaction` จาก `emoji`, `mentionPatterns` จาก `name`/`emoji`.
+- `subagents.allowAgents`: รายการอนุญาตของ id เอเจนต์สำหรับเป้าหมาย `sessions_spawn.agentId` ที่ระบุชัดเจน (`["*"]` = ใดก็ได้; ค่าเริ่มต้น: เฉพาะเอเจนต์เดียวกัน). รวม id ของผู้ร้องขอเมื่อควรอนุญาตให้เรียก `agentId` ที่ชี้มายังตัวเอง.
+- ตัวป้องกันการสืบทอด sandbox: หากเซสชันของผู้ร้องขออยู่ใน sandbox, `sessions_spawn` จะปฏิเสธเป้าหมายที่จะรันแบบไม่มี sandbox.
+- `subagents.requireAgentId`: เมื่อเป็น true จะบล็อกการเรียก `sessions_spawn` ที่ละ `agentId` (บังคับให้เลือกโปรไฟล์อย่างชัดเจน; ค่าเริ่มต้น: false).
---
-## การกำหนดเส้นทางหลาย agent
+## การกำหนดเส้นทางหลายเอเจนต์
-รัน agent ที่แยกกันหลายตัวภายใน Gateway เดียว ดู [Multi-Agent](/th/concepts/multi-agent)
+รันเอเจนต์ที่แยกจากกันหลายตัวภายใน Gateway เดียว. ดู [หลายเอเจนต์](/th/concepts/multi-agent).
```json5
{
@@ -1032,12 +1037,12 @@ scripts/sandbox-browser-setup.sh # optional browser image
### ฟิลด์การจับคู่ binding
-- `type` (ไม่บังคับ): `route` สำหรับการกำหนดเส้นทางปกติ (type ที่หายไปจะมีค่าเริ่มต้นเป็น route), `acp` สำหรับ binding ของการสนทนา ACP แบบถาวร
-- `match.channel` (จำเป็น)
-- `match.accountId` (ไม่บังคับ; `*` = บัญชีใดก็ได้; ละไว้ = บัญชีเริ่มต้น)
-- `match.peer` (ไม่บังคับ; `{ kind: direct|group|channel, id }`)
-- `match.guildId` / `match.teamId` (ไม่บังคับ; เฉพาะ channel)
-- `acp` (ไม่บังคับ; เฉพาะสำหรับ `type: "acp"`): `{ mode, label, cwd, backend }`
+- `type` (แบบไม่บังคับ): `route` สำหรับการกำหนดเส้นทางปกติ (หากไม่มี type จะใช้ค่าเริ่มต้นเป็น route), `acp` สำหรับ binding การสนทนา ACP แบบถาวร.
+- `match.channel` (ต้องระบุ)
+- `match.accountId` (แบบไม่บังคับ; `*` = บัญชีใดก็ได้; ละไว้ = บัญชีเริ่มต้น)
+- `match.peer` (แบบไม่บังคับ; `{ kind: direct|group|channel, id }`)
+- `match.guildId` / `match.teamId` (แบบไม่บังคับ; เฉพาะช่องทาง)
+- `acp` (แบบไม่บังคับ; สำหรับ `type: "acp"` เท่านั้น): `{ mode, label, cwd, backend }`
**ลำดับการจับคู่แบบกำหนดแน่นอน:**
@@ -1045,16 +1050,16 @@ scripts/sandbox-browser-setup.sh # optional browser image
2. `match.guildId`
3. `match.teamId`
4. `match.accountId` (ตรงกันแบบ exact, ไม่มี peer/guild/team)
-5. `match.accountId: "*"` (ทั้ง channel)
-6. agent เริ่มต้น
+5. `match.accountId: "*"` (ครอบคลุมทั้งช่องทาง)
+6. เอเจนต์เริ่มต้น
-ภายในแต่ละระดับ รายการ `bindings` แรกที่ตรงกันจะมีผล
+ภายในแต่ละระดับ รายการ `bindings` แรกที่ตรงกันจะมีผล.
-สำหรับรายการ `type: "acp"`, OpenClaw จะแก้ด้วย identity ของการสนทนาแบบ exact (`match.channel` + account + `match.peer.id`) และจะไม่ใช้ลำดับระดับ route binding ข้างต้น
+สำหรับรายการ `type: "acp"`, OpenClaw จะ resolve ตามตัวตนการสนทนาแบบ exact (`match.channel` + account + `match.peer.id`) และจะไม่ใช้ลำดับระดับ route binding ข้างต้น.
-### โปรไฟล์การเข้าถึงต่อ agent
+### โปรไฟล์การเข้าถึงต่อเอเจนต์
-
+
```json5
{
@@ -1072,7 +1077,7 @@ scripts/sandbox-browser-setup.sh # optional browser image
-
+
```json5
{
@@ -1101,7 +1106,7 @@ scripts/sandbox-browser-setup.sh # optional browser image
-
+
```json5
{
@@ -1147,7 +1152,7 @@ scripts/sandbox-browser-setup.sh # optional browser image
-ดู [แซนด์บ็อกซ์และเครื่องมือหลายเอเจนต์](/th/tools/multi-agent-sandbox-tools) สำหรับรายละเอียดลำดับความสำคัญ
+ดูรายละเอียดลำดับความสำคัญได้ที่ [แซนด์บ็อกซ์และเครื่องมือแบบหลาย Agent](/th/tools/multi-agent-sandbox-tools)
---
@@ -1199,33 +1204,33 @@ scripts/sandbox-browser-setup.sh # optional browser image
- **`scope`**: กลยุทธ์พื้นฐานสำหรับการจัดกลุ่มเซสชันในบริบทแชตกลุ่ม
- - `per-sender` (ค่าเริ่มต้น): ผู้ส่งแต่ละรายจะได้เซสชันที่แยกจากกันภายในบริบทช่องทางหนึ่ง
- - `global`: ผู้เข้าร่วมทั้งหมดในบริบทช่องทางหนึ่งใช้เซสชันเดียวร่วมกัน (ใช้เฉพาะเมื่อมีเจตนาให้ใช้บริบทร่วมกัน)
-- **`dmScope`**: วิธีจัดกลุ่มข้อความส่วนตัว
- - `main`: ข้อความส่วนตัวทั้งหมดใช้เซสชันหลักร่วมกัน
- - `per-peer`: แยกตามรหัสผู้ส่งข้ามช่องทาง
+ - `per-sender` (ค่าเริ่มต้น): ผู้ส่งแต่ละรายจะได้เซสชันที่แยกจากกันภายในบริบทช่องทาง
+ - `global`: ผู้เข้าร่วมทั้งหมดในบริบทช่องทางใช้เซสชันเดียวร่วมกัน (ใช้เฉพาะเมื่อต้องการบริบทร่วมกัน)
+- **`dmScope`**: วิธีจัดกลุ่ม DM
+ - `main`: DM ทั้งหมดใช้เซสชันหลักร่วมกัน
+ - `per-peer`: แยกตาม ID ผู้ส่งข้ามช่องทาง
- `per-channel-peer`: แยกตามช่องทาง + ผู้ส่ง (แนะนำสำหรับกล่องข้อความที่มีผู้ใช้หลายคน)
- `per-account-channel-peer`: แยกตามบัญชี + ช่องทาง + ผู้ส่ง (แนะนำสำหรับหลายบัญชี)
-- **`identityLinks`**: แมปรหัสมาตรฐานกับ peer ที่มีคำนำหน้าผู้ให้บริการ เพื่อแชร์เซสชันข้ามช่องทาง คำสั่ง Dock เช่น `/dock_discord` ใช้แมปเดียวกันเพื่อสลับเส้นทางตอบกลับของเซสชันที่ใช้งานอยู่ไปยัง peer ของช่องทางอื่นที่ลิงก์ไว้ ดู [การ Dock ช่องทาง](/th/concepts/channel-docking)
-- **`reset`**: นโยบายรีเซ็ตหลัก `daily` จะรีเซ็ตที่เวลาในเครื่องตาม `atHour`; `idle` จะรีเซ็ตหลังผ่าน `idleMinutes` เมื่อกำหนดค่าทั้งคู่ ค่าใดหมดอายุก่อนจะมีผลก่อน ความสดของการรีเซ็ตรายวันใช้ `sessionStartedAt` ของแถวเซสชัน; ความสดของการรีเซ็ตเมื่อไม่ได้ใช้งานใช้ `lastInteractionAt` การเขียนจากเหตุการณ์พื้นหลัง/ระบบ เช่น Heartbeat, การปลุก Cron, การแจ้งเตือน exec และการทำบัญชีของ Gateway สามารถอัปเดต `updatedAt` ได้ แต่จะไม่ทำให้เซสชันแบบรายวัน/ไม่ได้ใช้งานคงความสดไว้
-- **`resetByType`**: การแทนที่ตามประเภท (`direct`, `group`, `thread`) ค่าเดิม `dm` ยอมรับเป็นนามแฝงของ `direct`
-- **`mainKey`**: ฟิลด์เดิม รันไทม์จะใช้ `"main"` สำหรับบัคเก็ตแชตตรงหลักเสมอ
-- **`agentToAgent.maxPingPongTurns`**: จำนวนรอบตอบกลับไปมาสูงสุดระหว่างเอเจนต์ระหว่างการแลกเปลี่ยนแบบเอเจนต์ถึงเอเจนต์ (จำนวนเต็ม, ช่วง: `0`–`5`) `0` ปิดการต่อเนื่องของการตอบกลับไปมา
-- **`sendPolicy`**: จับคู่ด้วย `channel`, `chatType` (`direct|group|channel`, โดยมี `dm` เดิมเป็นนามแฝง), `keyPrefix` หรือ `rawKeyPrefix` กฎปฏิเสธแรกจะมีผล
-- **`maintenance`**: การล้างข้อมูลที่เก็บเซสชันและการควบคุมการเก็บรักษา
- - `mode`: `warn` ส่งคำเตือนเท่านั้น; `enforce` ใช้การล้างข้อมูล
- - `pruneAfter`: เกณฑ์อายุสำหรับรายการที่เก่า (ค่าเริ่มต้น `30d`)
- - `maxEntries`: จำนวนรายการสูงสุดใน `sessions.json` (ค่าเริ่มต้น `500`) รันไทม์จะเขียนการล้างข้อมูลแบบแบตช์พร้อมบัฟเฟอร์ high-water ขนาดเล็กสำหรับขีดจำกัดระดับโปรดักชัน; `openclaw sessions cleanup --enforce` ใช้ขีดจำกัดทันที
+- **`identityLinks`**: จับคู่ ID ตามบัญญัติกับเพียร์ที่มีคำนำหน้าผู้ให้บริการ เพื่อแชร์เซสชันข้ามช่องทาง คำสั่ง Dock เช่น `/dock_discord` ใช้แผนที่เดียวกันเพื่อสลับเส้นทางตอบกลับของเซสชันที่ใช้งานอยู่ไปยังเพียร์ช่องทางอื่นที่ลิงก์ไว้ ดู [การ Dock ช่องทาง](/th/concepts/channel-docking)
+- **`reset`**: นโยบายรีเซ็ตหลัก `daily` รีเซ็ตตามเวลาท้องถิ่นที่ `atHour`; `idle` รีเซ็ตหลังจาก `idleMinutes` เมื่อกำหนดทั้งคู่ ค่าใดหมดอายุก่อนจะมีผลก่อน ความใหม่ของการรีเซ็ตรายวันใช้ `sessionStartedAt` ของแถวเซสชัน ส่วนความใหม่ของการรีเซ็ตเมื่อไม่ได้ใช้งานใช้ `lastInteractionAt` การเขียนเบื้องหลัง/เหตุการณ์ระบบ เช่น Heartbeat, การปลุกของ Cron, การแจ้งเตือน exec และการทำบัญชีของ Gateway สามารถอัปเดต `updatedAt` ได้ แต่ไม่ได้ทำให้เซสชันรายวัน/ไม่ได้ใช้งานยังสดอยู่
+- **`resetByType`**: การแทนที่รายประเภท (`direct`, `group`, `thread`) ค่าเดิม `dm` ยอมรับเป็นนามแฝงของ `direct`
+- **`mainKey`**: ฟิลด์เดิม Runtime ใช้ `"main"` สำหรับบักเก็ตแชตตรงหลักเสมอ
+- **`agentToAgent.maxPingPongTurns`**: จำนวนรอบตอบกลับสูงสุดระหว่าง Agent ระหว่างการแลกเปลี่ยนแบบ Agent ต่อ Agent (จำนวนเต็ม ช่วง: `0`–`5`) `0` ปิดการเชื่อมลูกโซ่แบบ ping-pong
+- **`sendPolicy`**: จับคู่ตาม `channel`, `chatType` (`direct|group|channel` พร้อมนามแฝงเดิม `dm`), `keyPrefix` หรือ `rawKeyPrefix` การปฏิเสธครั้งแรกจะมีผล
+- **`maintenance`**: ตัวควบคุมการล้างและการเก็บรักษา session-store
+ - `mode`: `warn` แสดงเฉพาะคำเตือน; `enforce` ใช้การล้างข้อมูล
+ - `pruneAfter`: เกณฑ์อายุสำหรับรายการเก่า (ค่าเริ่มต้น `30d`)
+ - `maxEntries`: จำนวนรายการสูงสุดใน `sessions.json` (ค่าเริ่มต้น `500`) Runtime เขียนการล้างข้อมูลแบบแบตช์พร้อมบัฟเฟอร์ high-water ขนาดเล็กสำหรับขีดจำกัดระดับโปรดักชัน; `openclaw sessions cleanup --enforce` ใช้ขีดจำกัดทันที
- `rotateBytes`: เลิกใช้แล้วและถูกละเว้น; `openclaw doctor --fix` จะลบออกจากคอนฟิกเก่า
- - `resetArchiveRetention`: ระยะเวลาเก็บรักษาอาร์ไคฟ์ทรานสคริปต์ `*.reset.` ค่าเริ่มต้นคือ `pruneAfter`; ตั้งเป็น `false` เพื่อปิดใช้งาน
- - `maxDiskBytes`: งบประมาณดิสก์ของไดเรกทอรีเซสชันแบบไม่บังคับ ในโหมด `warn` จะบันทึกคำเตือน; ในโหมด `enforce` จะลบอาร์ติแฟกต์/เซสชันที่เก่าที่สุดก่อน
- - `highWaterBytes`: เป้าหมายแบบไม่บังคับหลังการล้างข้อมูลตามงบประมาณ ค่าเริ่มต้นคือ `80%` ของ `maxDiskBytes`
-- **`threadBindings`**: ค่าเริ่มต้นส่วนกลางสำหรับฟีเจอร์เซสชันที่ผูกกับเธรด
- - `enabled`: สวิตช์หลักค่าเริ่มต้น (ผู้ให้บริการสามารถแทนที่ได้; Discord ใช้ `channels.discord.threadBindings.enabled`)
- - `idleHours`: ค่าเริ่มต้นสำหรับการเลิกโฟกัสอัตโนมัติเมื่อไม่มีการใช้งาน หน่วยเป็นชั่วโมง (`0` ปิดใช้งาน; ผู้ให้บริการสามารถแทนที่ได้)
- - `maxAgeHours`: ค่าเริ่มต้นสำหรับอายุสูงสุดแบบบังคับ หน่วยเป็นชั่วโมง (`0` ปิดใช้งาน; ผู้ให้บริการสามารถแทนที่ได้)
- - `spawnSessions`: ประตูค่าเริ่มต้นสำหรับการสร้างเซสชันงานที่ผูกกับเธรดจาก `sessions_spawn` และการ spawn เธรด ACP ค่าเริ่มต้นเป็น `true` เมื่อเปิดใช้งานการผูกเธรด; ผู้ให้บริการ/บัญชีสามารถแทนที่ได้
- - `defaultSpawnContext`: บริบท subagent แบบเนทีฟค่าเริ่มต้นสำหรับการ spawn ที่ผูกกับเธรด (`"fork"` หรือ `"isolated"`) ค่าเริ่มต้นคือ `"fork"`
+ - `resetArchiveRetention`: ระยะเวลาการเก็บรักษาคลังบันทึก transcript แบบ `*.reset.` ค่าเริ่มต้นเป็น `pruneAfter`; ตั้งเป็น `false` เพื่อปิดใช้
+ - `maxDiskBytes`: งบประมาณดิสก์ของไดเรกทอรีเซสชันแบบไม่บังคับ ในโหมด `warn` จะบันทึกคำเตือน; ในโหมด `enforce` จะลบ artifact/เซสชันที่เก่าที่สุดก่อน
+ - `highWaterBytes`: เป้าหมายแบบไม่บังคับหลังการล้างตามงบประมาณ ค่าเริ่มต้นเป็น `80%` ของ `maxDiskBytes`
+- **`threadBindings`**: ค่าเริ่มต้นแบบรวมสำหรับฟีเจอร์เซสชันที่ผูกกับเธรด
+ - `enabled`: สวิตช์ค่าเริ่มต้นหลัก (ผู้ให้บริการสามารถแทนที่ได้; Discord ใช้ `channels.discord.threadBindings.enabled`)
+ - `idleHours`: ค่าเริ่มต้นสำหรับการเลิกโฟกัสอัตโนมัติเมื่อไม่มีกิจกรรม หน่วยเป็นชั่วโมง (`0` ปิดใช้; ผู้ให้บริการสามารถแทนที่ได้)
+ - `maxAgeHours`: อายุสูงสุดแบบแข็งเป็นค่าเริ่มต้น หน่วยเป็นชั่วโมง (`0` ปิดใช้; ผู้ให้บริการสามารถแทนที่ได้)
+ - `spawnSessions`: เกตค่าเริ่มต้นสำหรับสร้างเซสชันงานที่ผูกกับเธรดจาก `sessions_spawn` และการ spawn เธรด ACP ค่าเริ่มต้นเป็น `true` เมื่อเปิดใช้การผูกเธรด; ผู้ให้บริการ/บัญชีสามารถแทนที่ได้
+ - `defaultSpawnContext`: บริบท subagent แบบเนทีฟค่าเริ่มต้นสำหรับการ spawn ที่ผูกกับเธรด (`"fork"` หรือ `"isolated"`) ค่าเริ่มต้นเป็น `"fork"`
@@ -1263,38 +1268,38 @@ scripts/sandbox-browser-setup.sh # optional browser image
### คำนำหน้าการตอบกลับ
-การแทนที่ต่อช่อง/บัญชี: `channels..responsePrefix`, `channels..accounts..responsePrefix`.
+การแทนที่ระดับช่อง/บัญชี: `channels..responsePrefix`, `channels..accounts..responsePrefix`.
-การตัดสินค่า (ค่าที่เจาะจงที่สุดชนะ): บัญชี → ช่อง → ส่วนกลาง `""` ปิดใช้งานและหยุดการไล่ลำดับต่อ `"auto"` สร้างจาก `[{identity.name}]`
+การแก้ค่าที่ใช้ (ค่าที่เฉพาะเจาะจงที่สุดชนะ): บัญชี → ช่อง → ส่วนกลาง `""` ปิดใช้งานและหยุดการไล่ต่อ `"auto"` อนุมานจาก `[{identity.name}]`.
**ตัวแปรเทมเพลต:**
-| ตัวแปร | คำอธิบาย | ตัวอย่าง |
-| ----------------- | ---------------------- | --------------------------- |
-| `{model}` | ชื่อโมเดลแบบสั้น | `claude-opus-4-6` |
-| `{modelFull}` | ตัวระบุโมเดลแบบเต็ม | `anthropic/claude-opus-4-6` |
-| `{provider}` | ชื่อผู้ให้บริการ | `anthropic` |
-| `{thinkingLevel}` | ระดับการคิดปัจจุบัน | `high`, `low`, `off` |
-| `{identity.name}` | ชื่อข้อมูลประจำตัวของเอเจนต์ | (เหมือนกับ `"auto"`) |
+| ตัวแปร | คำอธิบาย | ตัวอย่าง |
+| ----------------- | ----------------------- | --------------------------- |
+| `{model}` | ชื่อโมเดลแบบสั้น | `claude-opus-4-6` |
+| `{modelFull}` | ตัวระบุโมเดลแบบเต็ม | `anthropic/claude-opus-4-6` |
+| `{provider}` | ชื่อผู้ให้บริการ | `anthropic` |
+| `{thinkingLevel}` | ระดับการคิดปัจจุบัน | `high`, `low`, `off` |
+| `{identity.name}` | ชื่อ identity ของ Agent | (เหมือนกับ `"auto"`) |
-ตัวแปรไม่แยกตัวพิมพ์ใหญ่เล็ก `{think}` เป็นนามแฝงของ `{thinkingLevel}`
+ตัวแปรไม่แยกตัวพิมพ์เล็กใหญ่ `{think}` เป็นนามแฝงของ `{thinkingLevel}`
-### รีแอ็กชันรับทราบ
+### รีแอ็กชันตอบรับ
-- ค่าเริ่มต้นคือ `identity.emoji` ของเอเจนต์ที่ใช้งานอยู่ มิฉะนั้นใช้ `"👀"` ตั้งเป็น `""` เพื่อปิดใช้งาน
-- การแทนที่ต่อช่อง: `channels..ackReaction`, `channels..accounts..ackReaction`
-- ลำดับการตัดสินค่า: บัญชี → ช่อง → `messages.ackReaction` → ค่าสำรองจากข้อมูลประจำตัว
+- ค่าเริ่มต้นเป็น `identity.emoji` ของ Agent ที่ใช้งานอยู่ มิฉะนั้นเป็น `"👀"` ตั้งค่าเป็น `""` เพื่อปิดใช้งาน
+- การแทนที่ระดับช่อง: `channels..ackReaction`, `channels..accounts..ackReaction`
+- ลำดับการแก้ค่าที่ใช้: บัญชี → ช่อง → `messages.ackReaction` → ค่าถอยกลับของ identity
- ขอบเขต: `group-mentions` (ค่าเริ่มต้น), `group-all`, `direct`, `all`
-- `removeAckAfterReply`: ลบการรับทราบหลังตอบกลับบนช่องที่รองรับรีแอ็กชัน เช่น Slack, Discord, Telegram, WhatsApp และ BlueBubbles
-- `messages.statusReactions.enabled`: เปิดใช้รีแอ็กชันสถานะวงจรชีวิตบน Slack, Discord และ Telegram
- บน Slack และ Discord หากไม่ได้ตั้งค่าไว้ จะคงรีแอ็กชันสถานะให้เปิดใช้งานเมื่อรีแอ็กชันรับทราบเปิดใช้งานอยู่
- บน Telegram ให้ตั้งค่านี้เป็น `true` อย่างชัดเจนเพื่อเปิดใช้รีแอ็กชันสถานะวงจรชีวิต
+- `removeAckAfterReply`: ลบการตอบรับหลังจากตอบกลับในช่องที่รองรับรีแอ็กชัน เช่น Slack, Discord, Telegram, WhatsApp และ BlueBubbles
+- `messages.statusReactions.enabled`: เปิดใช้งานรีแอ็กชันสถานะวงจรชีวิตบน Slack, Discord และ Telegram
+ บน Slack และ Discord หากไม่ได้ตั้งค่าไว้ จะยังเปิดใช้รีแอ็กชันสถานะเมื่อรีแอ็กชันตอบรับทำงานอยู่
+ บน Telegram ให้ตั้งค่าเป็น `true` อย่างชัดเจนเพื่อเปิดใช้งานรีแอ็กชันสถานะวงจรชีวิต
-### การหน่วงรวมข้อความขาเข้า
+### การหน่วงรวมขาเข้า
-รวมข้อความแบบข้อความล้วนที่เข้ามาอย่างรวดเร็วจากผู้ส่งเดียวกันเป็นเทิร์นเอเจนต์เดียว สื่อ/ไฟล์แนบจะส่งผ่านทันที คำสั่งควบคุมจะข้ามการหน่วงรวมข้อความ
+รวมข้อความแบบข้อความล้วนที่ส่งติดกันอย่างรวดเร็วจากผู้ส่งคนเดียวกันให้เป็นรอบ Agent เดียว สื่อ/ไฟล์แนบจะส่งออกทันที คำสั่งควบคุมจะข้ามการหน่วงรวม
-### TTS (การแปลงข้อความเป็นเสียงพูด)
+### TTS (ข้อความเป็นเสียงพูด)
```json5
{
@@ -1342,19 +1347,19 @@ scripts/sandbox-browser-setup.sh # optional browser image
}
```
-- `auto` ควบคุมโหมด auto-TTS ค่าเริ่มต้น: `off`, `always`, `inbound` หรือ `tagged` `/tts on|off` สามารถแทนที่ค่ากำหนดภายในเครื่องได้ และ `/tts status` แสดงสถานะที่มีผลจริง
+- `auto` ควบคุมโหมด auto-TTS เริ่มต้น: `off`, `always`, `inbound` หรือ `tagged` `/tts on|off` สามารถแทนที่ค่ากำหนดภายในเครื่องได้ และ `/tts status` แสดงสถานะที่มีผลจริง
- `summaryModel` แทนที่ `agents.defaults.model.primary` สำหรับสรุปอัตโนมัติ
-- `modelOverrides` เปิดใช้งานเป็นค่าเริ่มต้น; `modelOverrides.allowProvider` มีค่าเริ่มต้นเป็น `false` (ต้องเลือกเปิดใช้)
-- คีย์ API สำรองไปใช้ `ELEVENLABS_API_KEY`/`XI_API_KEY` และ `OPENAI_API_KEY`
-- ผู้ให้บริการเสียงพูดที่มาพร้อมระบบเป็นของ Plugin หากตั้งค่า `plugins.allow` ให้รวม Plugin ผู้ให้บริการ TTS แต่ละตัวที่ต้องการใช้ เช่น `microsoft` สำหรับ Edge TTS รองรับรหัสผู้ให้บริการเดิม `edge` เป็นนามแฝงของ `microsoft`
-- `providers.openai.baseUrl` แทนที่ปลายทาง OpenAI TTS ลำดับการตัดสินค่าคือการกำหนดค่า จากนั้น `OPENAI_TTS_BASE_URL` จากนั้น `https://api.openai.com/v1`
-- เมื่อ `providers.openai.baseUrl` ชี้ไปยังปลายทางที่ไม่ใช่ OpenAI, OpenClaw จะถือว่าเป็นเซิร์ฟเวอร์ TTS ที่เข้ากันได้กับ OpenAI และผ่อนปรนการตรวจสอบโมเดล/เสียง
+- `modelOverrides` เปิดใช้งานตามค่าเริ่มต้น; `modelOverrides.allowProvider` มีค่าเริ่มต้นเป็น `false` (เลือกเปิดใช้เอง)
+- คีย์ API ถอยกลับไปใช้ `ELEVENLABS_API_KEY`/`XI_API_KEY` และ `OPENAI_API_KEY`
+- ผู้ให้บริการเสียงพูดที่รวมมาเป็นของ Plugin หากตั้งค่า `plugins.allow` ให้รวม Plugin ผู้ให้บริการ TTS แต่ละตัวที่คุณต้องการใช้ เช่น `microsoft` สำหรับ Edge TTS รองรับรหัสผู้ให้บริการเดิม `edge` เป็นนามแฝงของ `microsoft`
+- `providers.openai.baseUrl` แทนที่ปลายทาง OpenAI TTS ลำดับการแก้ค่าคือ config แล้วจึงเป็น `OPENAI_TTS_BASE_URL` แล้วจึงเป็น `https://api.openai.com/v1`
+- เมื่อ `providers.openai.baseUrl` ชี้ไปยังปลายทางที่ไม่ใช่ OpenAI, OpenClaw จะถือว่าปลายทางนั้นเป็นเซิร์ฟเวอร์ TTS ที่เข้ากันได้กับ OpenAI และผ่อนปรนการตรวจสอบโมเดล/เสียง
---
-## พูดคุย
+## Talk
-ค่าเริ่มต้นสำหรับโหมดพูดคุย (macOS/iOS/Android)
+ค่าเริ่มต้นสำหรับโหมด Talk (macOS/iOS/Android)
```json5
{
@@ -1383,21 +1388,21 @@ scripts/sandbox-browser-setup.sh # optional browser image
}
```
-- `talk.provider` ต้องตรงกับคีย์ใน `talk.providers` เมื่อกำหนดค่าผู้ให้บริการพูดคุยหลายราย
-- คีย์พูดคุยแบบแบนเดิม (`talk.voiceId`, `talk.voiceAliases`, `talk.modelId`, `talk.outputFormat`, `talk.apiKey`) มีไว้เพื่อความเข้ากันได้เท่านั้น และจะย้ายอัตโนมัติไปยัง `talk.providers.`
-- รหัสเสียงสำรองไปใช้ `ELEVENLABS_VOICE_ID` หรือ `SAG_VOICE_ID`
-- `providers.*.apiKey` รับสตริงข้อความล้วนหรือออบเจ็กต์ SecretRef
-- ค่าสำรอง `ELEVENLABS_API_KEY` ใช้เฉพาะเมื่อไม่ได้กำหนดค่าคีย์ API สำหรับพูดคุย
-- `providers.*.voiceAliases` ช่วยให้คำสั่งพูดคุยใช้ชื่อที่จำง่ายได้
-- `providers.mlx.modelId` เลือกรีโป Hugging Face ที่ใช้โดยตัวช่วย MLX ภายในเครื่องบน macOS หากละไว้ macOS จะใช้ `mlx-community/Soprano-80M-bf16`
-- การเล่นเสียง MLX บน macOS ทำงานผ่านตัวช่วย `openclaw-mlx-tts` ที่มาพร้อมระบบเมื่อมีอยู่ หรือไฟล์ปฏิบัติการบน `PATH`; `OPENCLAW_MLX_TTS_BIN` แทนที่พาธตัวช่วยสำหรับการพัฒนา
-- `speechLocale` ตั้งค่ารหัสโลแคล BCP 47 ที่ใช้โดยการรู้จำเสียงพูดของโหมดพูดคุยบน iOS/macOS ปล่อยว่างไว้เพื่อใช้ค่าเริ่มต้นของอุปกรณ์
-- `silenceTimeoutMs` ควบคุมระยะเวลาที่โหมดพูดคุยรอหลังผู้ใช้เงียบ ก่อนส่งข้อความถอดเสียง หากไม่ตั้งค่าไว้ จะคงช่วงหยุดชั่วคราวค่าเริ่มต้นของแพลตฟอร์ม (`700 ms บน macOS และ Android, 900 ms บน iOS`)
+- `talk.provider` ต้องตรงกับคีย์ใน `talk.providers` เมื่อมีการกำหนดค่าผู้ให้บริการ Talk หลายตัว
+- คีย์ Talk แบบแบนเดิม (`talk.voiceId`, `talk.voiceAliases`, `talk.modelId`, `talk.outputFormat`, `talk.apiKey`) มีไว้เพื่อความเข้ากันได้เท่านั้น และจะถูกย้ายเข้าไปใน `talk.providers.` โดยอัตโนมัติ
+- รหัสเสียงถอยกลับไปใช้ `ELEVENLABS_VOICE_ID` หรือ `SAG_VOICE_ID`
+- `providers.*.apiKey` รองรับสตริงข้อความธรรมดาหรืออ็อบเจ็กต์ SecretRef
+- ค่าถอยกลับ `ELEVENLABS_API_KEY` ใช้เฉพาะเมื่อไม่ได้กำหนดค่าคีย์ API ของ Talk
+- `providers.*.voiceAliases` ช่วยให้คำสั่ง Talk ใช้ชื่อที่จำง่ายได้
+- `providers.mlx.modelId` เลือกรีโป Hugging Face ที่ใช้โดยตัวช่วย MLX ภายในเครื่องของ macOS หากละไว้ macOS จะใช้ `mlx-community/Soprano-80M-bf16`
+- การเล่นเสียง MLX บน macOS ทำงานผ่านตัวช่วย `openclaw-mlx-tts` ที่รวมมาเมื่อมีอยู่ หรือไฟล์ปฏิบัติการบน `PATH`; `OPENCLAW_MLX_TTS_BIN` แทนที่พาธของตัวช่วยสำหรับการพัฒนา
+- `speechLocale` ตั้งค่ารหัสโลแคล BCP 47 ที่ใช้โดยการรู้จำเสียงพูดของ Talk บน iOS/macOS ไม่ต้องตั้งค่าเพื่อใช้ค่าเริ่มต้นของอุปกรณ์
+- `silenceTimeoutMs` ควบคุมระยะเวลาที่โหมด Talk รอหลังจากผู้ใช้เงียบ ก่อนส่งข้อความถอดเสียง หากไม่ได้ตั้งค่าไว้ จะคงช่วงหยุดพักเริ่มต้นของแพลตฟอร์มไว้ (`700 ms on macOS and Android, 900 ms on iOS`)
---
## ที่เกี่ยวข้อง
-- [ข้อมูลอ้างอิงการกำหนดค่า](/th/gateway/configuration-reference) — คีย์การกำหนดค่าอื่นทั้งหมด
+- [ข้อมูลอ้างอิงการกำหนดค่า](/th/gateway/configuration-reference) — คีย์ config อื่นทั้งหมด
- [การกำหนดค่า](/th/gateway/configuration) — งานทั่วไปและการตั้งค่าอย่างรวดเร็ว
- [ตัวอย่างการกำหนดค่า](/th/gateway/configuration-examples)
diff --git a/docs/th/gateway/config-channels.md b/docs/th/gateway/config-channels.md
index 8faa82208..186761927 100644
--- a/docs/th/gateway/config-channels.md
+++ b/docs/th/gateway/config-channels.md
@@ -1,56 +1,56 @@
---
read_when:
- การกำหนดค่า Plugin ช่องทาง (การยืนยันตัวตน, การควบคุมการเข้าถึง, หลายบัญชี)
- - การแก้ไขปัญหาคีย์การกำหนดค่าตามช่องทาง
- - การตรวจสอบนโยบายข้อความส่วนตัว, นโยบายกลุ่ม หรือการควบคุมการกล่าวถึง
-summary: 'การกำหนดค่าช่องทาง: การควบคุมการเข้าถึง การจับคู่ และคีย์แยกตามช่องทางสำหรับ Slack, Discord, Telegram, WhatsApp, Matrix, iMessage และอื่นๆ'
+ - การแก้ไขปัญหาคีย์การกำหนดค่าต่อช่องทาง
+ - การตรวจสอบนโยบาย DM, นโยบายกลุ่ม หรือการควบคุมการเปิดใช้งานด้วยการกล่าวถึง
+summary: 'การกำหนดค่าช่องทาง: การควบคุมการเข้าถึง การจับคู่ และคีย์รายช่องทางใน Slack, Discord, Telegram, WhatsApp, Matrix, iMessage และอื่นๆ'
title: การกำหนดค่า — ช่องทาง
x-i18n:
- generated_at: "2026-05-03T21:31:35Z"
+ generated_at: "2026-05-04T02:24:50Z"
model: gpt-5.5
provider: openai
- source_hash: 366bcee632c649219bbf6cf44d64cc13d966ec813abc74d54088d89de640b47c
+ source_hash: 57dcc0b5148324ea6fdee51b7b6e97ec7bd7dc3ca89518ab0816fe4172feefbc
source_path: gateway/config-channels.md
workflow: 16
---
-คีย์การกำหนดค่าตามช่องทางภายใต้ `channels.*` ครอบคลุมการเข้าถึง DM และกลุ่ม,
-การตั้งค่าหลายบัญชี, การจำกัดด้วยการกล่าวถึง, และคีย์ตามช่องทางสำหรับ Slack, Discord,
-Telegram, WhatsApp, Matrix, iMessage และ Plugin ช่องทางที่มาพร้อมชุดอื่น ๆ
+คีย์การกำหนดค่าต่อช่องทางภายใต้ `channels.*` ครอบคลุมการเข้าถึง DM และกลุ่ม,
+การตั้งค่าหลายบัญชี, การควบคุมด้วยการ mention และคีย์ต่อช่องทางสำหรับ Slack, Discord,
+Telegram, WhatsApp, Matrix, iMessage และ Plugin ช่องทางที่มาพร้อมชุดอื่นๆ
-สำหรับเอเจนต์, เครื่องมือ, รันไทม์ของ Gateway และคีย์ระดับบนสุดอื่น ๆ โปรดดู
-[ข้อมูลอ้างอิงการกำหนดค่า](/th/gateway/configuration-reference).
+สำหรับเอเจนต์, เครื่องมือ, รันไทม์ Gateway และคีย์ระดับบนสุดอื่นๆ โปรดดู
+[เอกสารอ้างอิงการกำหนดค่า](/th/gateway/configuration-reference)
## ช่องทาง
-แต่ละช่องทางจะเริ่มทำงานอัตโนมัติเมื่อมีส่วนการกำหนดค่าของช่องทางนั้นอยู่ (ยกเว้น `enabled: false`)
+แต่ละช่องทางจะเริ่มทำงานโดยอัตโนมัติเมื่อมีส่วนการกำหนดค่าของช่องทางนั้นอยู่ (เว้นแต่ `enabled: false`)
### การเข้าถึง DM และกลุ่ม
ทุกช่องทางรองรับนโยบาย DM และนโยบายกลุ่ม:
-| นโยบาย DM | ลักษณะการทำงาน |
+| นโยบาย DM | ลักษณะการทำงาน |
| ------------------- | --------------------------------------------------------------- |
-| `pairing` (ค่าเริ่มต้น) | ผู้ส่งที่ไม่รู้จักจะได้รับรหัสจับคู่แบบใช้ครั้งเดียว เจ้าของต้องอนุมัติ |
-| `allowlist` | เฉพาะผู้ส่งใน `allowFrom` (หรือที่จัดเก็บอนุญาตที่จับคู่แล้ว) |
+| `pairing` (ค่าเริ่มต้น) | ผู้ส่งที่ไม่รู้จักจะได้รับรหัสจับคู่แบบใช้ครั้งเดียว; เจ้าของต้องอนุมัติ |
+| `allowlist` | เฉพาะผู้ส่งใน `allowFrom` (หรือที่เก็บรายการอนุญาตที่จับคู่แล้ว) |
| `open` | อนุญาต DM ขาเข้าทั้งหมด (ต้องใช้ `allowFrom: ["*"]`) |
-| `disabled` | ไม่สนใจ DM ขาเข้าทั้งหมด |
+| `disabled` | เพิกเฉยต่อ DM ขาเข้าทั้งหมด |
| นโยบายกลุ่ม | ลักษณะการทำงาน |
| --------------------- | ------------------------------------------------------ |
| `allowlist` (ค่าเริ่มต้น) | เฉพาะกลุ่มที่ตรงกับรายการอนุญาตที่กำหนดค่าไว้ |
-| `open` | ข้ามรายการอนุญาตของกลุ่ม (ยังคงใช้การจำกัดด้วยการกล่าวถึง) |
+| `open` | ข้ามรายการอนุญาตของกลุ่ม (ยังใช้การควบคุมด้วยการ mention อยู่) |
| `disabled` | บล็อกข้อความกลุ่ม/ห้องทั้งหมด |
`channels.defaults.groupPolicy` ตั้งค่าเริ่มต้นเมื่อไม่ได้ตั้งค่า `groupPolicy` ของผู้ให้บริการ
รหัสจับคู่หมดอายุหลังจาก 1 ชั่วโมง คำขอจับคู่ DM ที่รอดำเนินการถูกจำกัดไว้ที่ **3 รายการต่อช่องทาง**
-หากไม่มีบล็อกผู้ให้บริการทั้งหมด (`channels.` ไม่อยู่) นโยบายกลุ่มของรันไทม์จะย้อนกลับไปใช้ `allowlist` (ปิดไว้ก่อนเมื่อผิดพลาด) พร้อมคำเตือนตอนเริ่มต้น
+หากไม่มีบล็อกผู้ให้บริการอยู่เลย (`channels.` ไม่มีอยู่) นโยบายกลุ่มของรันไทม์จะย้อนกลับไปใช้ `allowlist` (ปิดโดยค่าเริ่มต้นเมื่อผิดพลาด) พร้อมคำเตือนตอนเริ่มทำงาน
-### การแทนที่โมเดลตามช่องทาง
+### การแทนที่โมเดลของช่องทาง
-ใช้ `channels.modelByChannel` เพื่อตรึง ID ช่องทางเฉพาะไว้กับโมเดล ค่ารองรับ `provider/model` หรือ alias ของโมเดลที่กำหนดค่าไว้ การแมปช่องทางจะมีผลเมื่อเซสชันยังไม่มีการแทนที่โมเดลอยู่แล้ว (เช่น ตั้งค่าผ่าน `/model`)
+ใช้ `channels.modelByChannel` เพื่อตรึง ID ช่องทางเฉพาะกับโมเดล ค่าใช้รูปแบบ `provider/model` หรือนามแฝงโมเดลที่กำหนดค่าไว้ได้ การแมปช่องทางจะมีผลเมื่อเซสชันยังไม่มีการแทนที่โมเดลอยู่แล้ว (ตัวอย่างเช่น ตั้งค่าผ่าน `/model`)
```json5
{
@@ -73,7 +73,7 @@ Telegram, WhatsApp, Matrix, iMessage และ Plugin ช่องทางท
### ค่าเริ่มต้นของช่องทางและ Heartbeat
-ใช้ `channels.defaults` สำหรับนโยบายกลุ่มและลักษณะการทำงานของ Heartbeat ที่ใช้ร่วมกันระหว่างผู้ให้บริการ:
+ใช้ `channels.defaults` สำหรับพฤติกรรมนโยบายกลุ่มและ Heartbeat ที่ใช้ร่วมกันระหว่างผู้ให้บริการ:
```json5
{
@@ -92,14 +92,14 @@ Telegram, WhatsApp, Matrix, iMessage และ Plugin ช่องทางท
```
- `channels.defaults.groupPolicy`: นโยบายกลุ่มสำรองเมื่อไม่ได้ตั้งค่า `groupPolicy` ระดับผู้ให้บริการ
-- `channels.defaults.contextVisibility`: โหมดการมองเห็นบริบทเสริมเริ่มต้นสำหรับทุกช่องทาง ค่า: `all` (ค่าเริ่มต้น, รวมบริบทที่อ้างอิง/เธรด/ประวัติทั้งหมด), `allowlist` (รวมเฉพาะบริบทจากผู้ส่งในรายการอนุญาต), `allowlist_quote` (เหมือน allowlist แต่เก็บบริบท quote/reply ที่ระบุชัดเจนไว้) การแทนที่ตามช่องทาง: `channels..contextVisibility`
-- `channels.defaults.heartbeat.showOk`: รวมสถานะช่องทางที่ปกติดีในเอาต์พุต Heartbeat
-- `channels.defaults.heartbeat.showAlerts`: รวมสถานะเสื่อมคุณภาพ/ข้อผิดพลาดในเอาต์พุต Heartbeat
-- `channels.defaults.heartbeat.useIndicator`: แสดงเอาต์พุต Heartbeat แบบตัวบ่งชี้ขนาดกะทัดรัด
+- `channels.defaults.contextVisibility`: โหมดการมองเห็นบริบทเสริมเริ่มต้นสำหรับทุกช่องทาง ค่า: `all` (ค่าเริ่มต้น, รวมบริบทที่อ้างอิง/เธรด/ประวัติทั้งหมด), `allowlist` (รวมเฉพาะบริบทจากผู้ส่งในรายการอนุญาต), `allowlist_quote` (เหมือน allowlist แต่คงบริบท quote/reply ที่ระบุชัดเจนไว้) การแทนที่ต่อช่องทาง: `channels..contextVisibility`
+- `channels.defaults.heartbeat.showOk`: รวมสถานะช่องทางที่ปกติในเอาต์พุต Heartbeat
+- `channels.defaults.heartbeat.showAlerts`: รวมสถานะเสื่อมประสิทธิภาพ/ข้อผิดพลาดในเอาต์พุต Heartbeat
+- `channels.defaults.heartbeat.useIndicator`: แสดงผลเอาต์พุต Heartbeat แบบตัวบ่งชี้กะทัดรัด
### WhatsApp
-WhatsApp ทำงานผ่านช่องทางเว็บของ Gateway (Baileys Web) โดยจะเริ่มทำงานอัตโนมัติเมื่อมีเซสชันที่เชื่อมโยงอยู่
+WhatsApp ทำงานผ่านช่องทางเว็บของ Gateway (Baileys Web) และจะเริ่มทำงานโดยอัตโนมัติเมื่อมีเซสชันที่ลิงก์อยู่
```json5
{
@@ -155,10 +155,10 @@ WhatsApp ทำงานผ่านช่องทางเว็บของ G
}
```
-- คำสั่งขาออกใช้บัญชี `default` เป็นค่าเริ่มต้นหากมีอยู่ มิฉะนั้นจะใช้ ID บัญชีแรกที่กำหนดค่าไว้ (เรียงลำดับแล้ว)
-- `channels.whatsapp.defaultAccount` ที่ไม่บังคับจะแทนที่การเลือกบัญชีเริ่มต้นสำรองนั้นเมื่อค่าตรงกับ ID บัญชีที่กำหนดค่าไว้
-- ไดเรกทอรี auth ของ Baileys แบบบัญชีเดียวรุ่นเก่าจะถูกย้ายโดย `openclaw doctor` ไปยัง `whatsapp/default`
-- การแทนที่ตามบัญชี: `channels.whatsapp.accounts..sendReadReceipts`, `channels.whatsapp.accounts..dmPolicy`, `channels.whatsapp.accounts..allowFrom`
+- คำสั่งขาออกใช้บัญชี `default` เป็นค่าเริ่มต้นหากมีอยู่; มิฉะนั้นจะใช้ ID บัญชีที่กำหนดค่าไว้รายการแรก (หลังจัดเรียง)
+- `channels.whatsapp.defaultAccount` ซึ่งเป็นตัวเลือกเสริมจะแทนที่การเลือกบัญชีเริ่มต้นสำรองนั้นเมื่อค่าตรงกับ ID บัญชีที่กำหนดค่าไว้
+- ไดเรกทอรีการยืนยันตัวตน Baileys แบบบัญชีเดียวเดิมจะถูกย้ายโดย `openclaw doctor` ไปยัง `whatsapp/default`
+- การแทนที่ต่อบัญชี: `channels.whatsapp.accounts..sendReadReceipts`, `channels.whatsapp.accounts..dmPolicy`, `channels.whatsapp.accounts..allowFrom`
@@ -217,13 +217,13 @@ WhatsApp ทำงานผ่านช่องทางเว็บของ G
}
```
-- โทเค็นบอต: `channels.telegram.botToken` หรือ `channels.telegram.tokenFile` (เฉพาะไฟล์ปกติเท่านั้น ปฏิเสธ symlink) โดยมี `TELEGRAM_BOT_TOKEN` เป็นค่าสำรองสำหรับบัญชีเริ่มต้น
-- `apiRoot` คือรากของ Telegram Bot API เท่านั้น ใช้ `https://api.telegram.org` หรือรากที่โฮสต์เอง/พร็อกซีของคุณ ไม่ใช่ `https://api.telegram.org/bot`; `openclaw doctor --fix` จะลบคำต่อท้าย `/bot` ที่เผลอใส่ไว้
-- `channels.telegram.defaultAccount` ที่ไม่บังคับจะแทนที่การเลือกบัญชีเริ่มต้นเมื่อค่าตรงกับ ID บัญชีที่กำหนดค่าไว้
+- โทเค็นบอท: `channels.telegram.botToken` หรือ `channels.telegram.tokenFile` (เฉพาะไฟล์ปกติ; ปฏิเสธ symlink) โดยใช้ `TELEGRAM_BOT_TOKEN` เป็นค่าสำรองสำหรับบัญชีเริ่มต้น
+- `apiRoot` คือรากของ Telegram Bot API เท่านั้น ใช้ `https://api.telegram.org` หรือรากที่โฮสต์เอง/พร็อกซีของคุณ ไม่ใช่ `https://api.telegram.org/bot`; `openclaw doctor --fix` จะลบส่วนต่อท้าย `/bot` ที่เผลอใส่ไว้
+- `channels.telegram.defaultAccount` ซึ่งเป็นตัวเลือกเสริมจะแทนที่การเลือกบัญชีเริ่มต้นเมื่อค่าตรงกับ ID บัญชีที่กำหนดค่าไว้
- ในการตั้งค่าหลายบัญชี (ID บัญชี 2 รายการขึ้นไป) ให้ตั้งค่าเริ่มต้นอย่างชัดเจน (`channels.telegram.defaultAccount` หรือ `channels.telegram.accounts.default`) เพื่อหลีกเลี่ยงการกำหนดเส้นทางสำรอง; `openclaw doctor` จะเตือนเมื่อค่านี้หายไปหรือไม่ถูกต้อง
- `configWrites: false` บล็อกการเขียนการกำหนดค่าที่เริ่มจาก Telegram (การย้าย ID supergroup, `/config set|unset`)
-- รายการ `bindings[]` ระดับบนสุดที่มี `type: "acp"` กำหนดค่าการผูก ACP แบบถาวรสำหรับหัวข้อฟอรัม (ใช้ `chatId:topic:topicId` แบบ canonical ใน `match.peer.id`) ความหมายของฟิลด์ใช้ร่วมกันใน [เอเจนต์ ACP](/th/tools/acp-agents#persistent-channel-bindings)
-- พรีวิวสตรีมของ Telegram ใช้ `sendMessage` + `editMessageText` (ทำงานในแชทโดยตรงและแชทกลุ่ม)
+- รายการ `bindings[]` ระดับบนสุดที่มี `type: "acp"` กำหนดค่าการผูก ACP แบบถาวรสำหรับหัวข้อฟอรัม (ใช้ `chatId:topic:topicId` แบบมาตรฐานใน `match.peer.id`) ความหมายของฟิลด์ใช้ร่วมกันใน [เอเจนต์ ACP](/th/tools/acp-agents#persistent-channel-bindings)
+- ตัวอย่างสตรีมของ Telegram ใช้ `sendMessage` + `editMessageText` (ทำงานได้ในแชตโดยตรงและแชตกลุ่ม)
- นโยบายการลองใหม่: ดู [นโยบายการลองใหม่](/th/concepts/retry)
### Discord
@@ -329,41 +329,41 @@ WhatsApp ทำงานผ่านช่องทางเว็บของ G
}
```
-- โทเค็น: `channels.discord.token` โดยมี `DISCORD_BOT_TOKEN` เป็น fallback สำหรับบัญชีเริ่มต้น
-- การเรียกขาออกโดยตรงที่ระบุ Discord `token` อย่างชัดเจนจะใช้โทเค็นนั้นสำหรับการเรียกนั้น ส่วนการลองใหม่/การตั้งค่านโยบายของบัญชียังคงมาจากบัญชีที่เลือกใน snapshot runtime ที่ใช้งานอยู่
-- `channels.discord.defaultAccount` ที่เป็นตัวเลือกเสริมจะ override การเลือกบัญชีเริ่มต้นเมื่อค่าตรงกับ id บัญชีที่กำหนดค่าไว้
-- ใช้ `user:` (DM) หรือ `channel:` (ช่อง guild) สำหรับเป้าหมายการส่ง; ID ตัวเลขล้วนจะถูกปฏิเสธ
-- slug ของ guild เป็นตัวพิมพ์เล็กและแทนที่ช่องว่างด้วย `-`; คีย์ของช่องใช้ชื่อแบบ slug (ไม่มี `#`) แนะนำให้ใช้ ID ของ guild
-- ข้อความที่บอทเป็นผู้เขียนจะถูกละเว้นโดยค่าเริ่มต้น `allowBots: true` จะเปิดใช้งานข้อความเหล่านั้น; ใช้ `allowBots: "mentions"` เพื่อรับเฉพาะข้อความจากบอทที่กล่าวถึงบอทเท่านั้น (ข้อความของตัวเองยังคงถูกกรอง)
-- `channels.discord.guilds..ignoreOtherMentions` (และ override ของช่อง) จะทิ้งข้อความที่กล่าวถึงผู้ใช้หรือบทบาทอื่นแต่ไม่ได้กล่าวถึงบอท (ยกเว้น @everyone/@here)
-- `channels.discord.mentionAliases` จะแมปข้อความ `@handle` ขาออกที่เสถียรไปยัง Discord user IDs ก่อนส่ง เพื่อให้กล่าวถึงเพื่อนร่วมทีมที่รู้จักได้อย่างกำหนดซ้ำได้แม้แคชไดเรกทอรีชั่วคราวจะว่างเปล่า override รายบัญชีอยู่ภายใต้ `channels.discord.accounts..mentionAliases`
-- `maxLinesPerMessage` (ค่าเริ่มต้น 17) จะแบ่งข้อความที่สูงแม้จะต่ำกว่า 2000 ตัวอักษร
-- `channels.discord.threadBindings` ควบคุมการกำหนดเส้นทาง Discord แบบผูกกับ thread:
- - `enabled`: override ของ Discord สำหรับฟีเจอร์ session แบบผูกกับ thread (`/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age` และการส่ง/การกำหนดเส้นทางที่ผูกไว้)
- - `idleHours`: override ของ Discord สำหรับการ auto-unfocus เมื่อไม่มีกิจกรรม หน่วยเป็นชั่วโมง (`0` ปิดใช้งาน)
- - `maxAgeHours`: override ของ Discord สำหรับอายุสูงสุดแบบบังคับ หน่วยเป็นชั่วโมง (`0` ปิดใช้งาน)
- - `spawnSessions`: สวิตช์สำหรับ `sessions_spawn({ thread: true })` และการสร้าง/ผูก thread อัตโนมัติของ ACP thread-spawn (ค่าเริ่มต้น: `true`)
- - `defaultSpawnContext`: บริบท subagent แบบเนทีฟสำหรับ spawn ที่ผูกกับ thread (ค่าเริ่มต้นคือ `"fork"`)
-- รายการ `bindings[]` ระดับบนสุดที่มี `type: "acp"` กำหนดค่าการผูก ACP แบบถาวรสำหรับช่องและ threads (ใช้ channel/thread id ใน `match.peer.id`) ความหมายของฟิลด์ใช้ร่วมกันใน [ACP Agents](/th/tools/acp-agents#persistent-channel-bindings)
+- Token: `channels.discord.token` โดยมี `DISCORD_BOT_TOKEN` เป็นค่าทดแทนสำหรับบัญชีเริ่มต้น
+- การเรียกออกโดยตรงที่ระบุ Discord `token` อย่างชัดเจนจะใช้โทเคนนั้นสำหรับการเรียกนั้น ส่วนการตั้งค่าการลองซ้ำ/นโยบายของบัญชียังคงมาจากบัญชีที่เลือกในสแนปช็อตรันไทม์ที่ใช้งานอยู่
+- `channels.discord.defaultAccount` แบบไม่บังคับจะแทนที่การเลือกบัญชีเริ่มต้นเมื่อค่าตรงกับ id ของบัญชีที่กำหนดค่าไว้
+- ใช้ `user:` (DM) หรือ `channel:` (ช่องกิลด์) สำหรับเป้าหมายการส่ง ปฏิเสธ ID ตัวเลขล้วน
+- slug ของกิลด์เป็นตัวพิมพ์เล็กและแทนที่ช่องว่างด้วย `-`; คีย์ช่องใช้ชื่อแบบ slug (ไม่มี `#`) แนะนำให้ใช้ ID ของกิลด์
+- ข้อความที่บอตเป็นผู้เขียนจะถูกละเว้นโดยค่าเริ่มต้น `allowBots: true` เปิดใช้งานข้อความเหล่านั้น ใช้ `allowBots: "mentions"` เพื่อรับเฉพาะข้อความจากบอตที่กล่าวถึงบอตเท่านั้น (ยังคงกรองข้อความของตัวเอง)
+- `channels.discord.guilds..ignoreOtherMentions` (และการแทนที่ระดับช่อง) จะทิ้งข้อความที่กล่าวถึงผู้ใช้หรือบทบาทอื่นแต่ไม่ได้กล่าวถึงบอต (ยกเว้น @everyone/@here)
+- `channels.discord.mentionAliases` แมปข้อความ `@handle` ขาออกที่เสถียรไปยัง ID ผู้ใช้ Discord ก่อนส่ง เพื่อให้กล่าวถึงเพื่อนร่วมทีมที่รู้จักได้อย่างกำหนดแน่นอนแม้แคชไดเรกทอรีชั่วคราวจะว่าง การแทนที่รายบัญชีอยู่ใต้ `channels.discord.accounts..mentionAliases`
+- `maxLinesPerMessage` (ค่าเริ่มต้น 17) แบ่งข้อความที่สูงออก แม้จะต่ำกว่า 2000 อักขระ
+- `channels.discord.threadBindings` ควบคุมการกำหนดเส้นทาง Discord แบบผูกกับเธรด:
+ - `enabled`: การแทนที่ Discord สำหรับฟีเจอร์เซสชันแบบผูกกับเธรด (`/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age` และการส่ง/การกำหนดเส้นทางที่ผูกไว้)
+ - `idleHours`: การแทนที่ Discord สำหรับการเลิกโฟกัสอัตโนมัติเมื่อไม่มีกิจกรรม หน่วยเป็นชั่วโมง (`0` ปิดใช้งาน)
+ - `maxAgeHours`: การแทนที่ Discord สำหรับอายุสูงสุดแบบบังคับ หน่วยเป็นชั่วโมง (`0` ปิดใช้งาน)
+ - `spawnSessions`: สวิตช์สำหรับ `sessions_spawn({ thread: true })` และการสร้าง/ผูกเธรดอัตโนมัติเมื่อ ACP spawn เธรด (ค่าเริ่มต้น: `true`)
+ - `defaultSpawnContext`: บริบท subagent แบบเนทีฟสำหรับการ spawn ที่ผูกกับเธรด (ค่าเริ่มต้นคือ `"fork"`)
+- รายการ `bindings[]` ระดับบนสุดที่มี `type: "acp"` กำหนดค่าการผูก ACP แบบถาวรสำหรับช่องและเธรด (ใช้ id ของช่อง/เธรดใน `match.peer.id`) ความหมายของฟิลด์ใช้ร่วมกันใน [ACP Agents](/th/tools/acp-agents#persistent-channel-bindings)
- `channels.discord.ui.components.accentColor` ตั้งค่าสีเน้นสำหรับคอนเทนเนอร์ Discord components v2
-- `channels.discord.voice` เปิดใช้งานการสนทนาในช่องเสียง Discord และการ auto-join + LLM + TTS override ที่เป็นตัวเลือกเสริม การตั้งค่า Discord แบบข้อความเท่านั้นจะปิดเสียงโดยค่าเริ่มต้น; ตั้งค่า `channels.discord.voice.enabled=true` เพื่อเลือกเปิดใช้งาน
-- `channels.discord.voice.model` override model LLM ที่ใช้สำหรับการตอบกลับช่องเสียง Discord ได้ตามต้องการ
-- `channels.discord.voice.daveEncryption` และ `channels.discord.voice.decryptionFailureTolerance` ส่งต่อไปยังตัวเลือก DAVE ของ `@discordjs/voice` (`true` และ `24` โดยค่าเริ่มต้น)
-- `channels.discord.voice.connectTimeoutMs` ควบคุมการรอ Ready เริ่มต้นของ `@discordjs/voice` สำหรับ `/vc join` และความพยายาม auto-join (`30000` โดยค่าเริ่มต้น)
-- `channels.discord.voice.reconnectGraceMs` ควบคุมระยะเวลาที่ session เสียงที่ถูกตัดการเชื่อมต่ออาจใช้เพื่อเข้าสู่สัญญาณ reconnect ก่อนที่ OpenClaw จะทำลาย session นั้น (`15000` โดยค่าเริ่มต้น)
-- นอกจากนี้ OpenClaw ยังพยายามกู้คืนการรับเสียงโดยออกจาก/เข้าร่วม session เสียงใหม่หลังจากการถอดรหัสล้มเหลวซ้ำๆ
-- `channels.discord.streaming` เป็นคีย์โหมด stream หลัก ค่า legacy `streamMode` และค่า boolean `streaming` จะถูก migrate โดยอัตโนมัติ
-- `channels.discord.autoPresence` จะแมปความพร้อมใช้งานของ runtime ไปยังสถานะบอท (healthy => online, degraded => idle, exhausted => dnd) และอนุญาตให้ override ข้อความสถานะได้ตามต้องการ
-- `channels.discord.dangerouslyAllowNameMatching` เปิดใช้งานการจับคู่ชื่อ/tag ที่เปลี่ยนแปลงได้อีกครั้ง (โหมดเข้ากันได้แบบ break-glass)
-- `channels.discord.execApprovals`: การส่งมอบการอนุมัติ exec แบบเนทีฟของ Discord และการอนุญาตผู้อนุมัติ
- - `enabled`: `true`, `false` หรือ `"auto"` (ค่าเริ่มต้น) ในโหมด auto การอนุมัติ exec จะเปิดใช้งานเมื่อสามารถ resolve ผู้อนุมัติจาก `approvers` หรือ `commands.ownerAllowFrom`
- - `approvers`: Discord user IDs ที่อนุญาตให้อนุมัติคำขอ exec fallback ไปที่ `commands.ownerAllowFrom` เมื่อละไว้
- - `agentFilter`: allowlist ของ agent ID ที่เป็นตัวเลือกเสริม ละไว้เพื่อส่งต่อการอนุมัติสำหรับ agents ทั้งหมด
- - `sessionFilter`: รูปแบบคีย์ session ที่เป็นตัวเลือกเสริม (substring หรือ regex)
- - `target`: ตำแหน่งที่จะส่ง prompt การอนุมัติ `"dm"` (ค่าเริ่มต้น) ส่งไปยัง DM ของผู้อนุมัติ, `"channel"` ส่งไปยังช่องต้นทาง, `"both"` ส่งไปทั้งสองที่ เมื่อ target รวม `"channel"` ปุ่มจะใช้งานได้เฉพาะโดยผู้อนุมัติที่ resolve ได้เท่านั้น
- - `cleanupAfterResolve`: เมื่อเป็น `true` จะลบ DM การอนุมัติหลังจากการอนุมัติ การปฏิเสธ หรือ timeout
+- `channels.discord.voice` เปิดใช้งานการสนทนาในช่องเสียง Discord และการแทนที่ auto-join + LLM + TTS แบบไม่บังคับ การกำหนดค่า Discord แบบข้อความเท่านั้นจะปิดเสียงโดยค่าเริ่มต้น ตั้งค่า `channels.discord.voice.enabled=true` เพื่อเลือกใช้
+- `channels.discord.voice.model` แทนที่โมเดล LLM ที่ใช้สำหรับการตอบกลับในช่องเสียง Discord แบบไม่บังคับ
+- `channels.discord.voice.daveEncryption` และ `channels.discord.voice.decryptionFailureTolerance` ส่งผ่านไปยังตัวเลือก DAVE ของ `@discordjs/voice` (ค่าเริ่มต้นคือ `true` และ `24`)
+- `channels.discord.voice.connectTimeoutMs` ควบคุมการรอ Ready เริ่มต้นของ `@discordjs/voice` สำหรับความพยายาม `/vc join` และ auto-join (ค่าเริ่มต้นคือ `30000`)
+- `channels.discord.voice.reconnectGraceMs` ควบคุมระยะเวลาที่เซสชันเสียงที่ตัดการเชื่อมต่ออาจใช้เพื่อเข้าสู่สัญญาณการเชื่อมต่อใหม่ก่อนที่ OpenClaw จะทำลายเซสชันนั้น (ค่าเริ่มต้นคือ `15000`)
+- OpenClaw ยังพยายามกู้คืนการรับเสียงโดยออกจาก/เข้าร่วมเซสชันเสียงใหม่หลังจากการถอดรหัสล้มเหลวซ้ำ ๆ
+- `channels.discord.streaming` คือคีย์โหมดสตรีมที่เป็นมาตรฐาน ค่าเดิม `streamMode` และค่า boolean `streaming` จะถูกย้ายโดยอัตโนมัติ
+- `channels.discord.autoPresence` แมปความพร้อมใช้งานของรันไทม์ไปยังสถานะบอต (healthy => online, degraded => idle, exhausted => dnd) และอนุญาตให้แทนที่ข้อความสถานะแบบไม่บังคับ
+- `channels.discord.dangerouslyAllowNameMatching` เปิดใช้การจับคู่ชื่อ/แท็กที่เปลี่ยนแปลงได้อีกครั้ง (โหมดความเข้ากันได้แบบ break-glass)
+- `channels.discord.execApprovals`: การส่งคำอนุมัติ exec แบบเนทีฟของ Discord และการอนุญาตผู้อนุมัติ
+ - `enabled`: `true`, `false` หรือ `"auto"` (ค่าเริ่มต้น) ในโหมด auto คำอนุมัติ exec จะเปิดใช้งานเมื่อสามารถระบุผู้อนุมัติจาก `approvers` หรือ `commands.ownerAllowFrom`
+ - `approvers`: ID ผู้ใช้ Discord ที่อนุญาตให้อนุมัติคำขอ exec หากละไว้จะถอยไปใช้ `commands.ownerAllowFrom`
+ - `agentFilter`: allowlist ID agent แบบไม่บังคับ ละไว้เพื่อส่งต่อคำอนุมัติสำหรับ agent ทั้งหมด
+ - `sessionFilter`: รูปแบบคีย์เซสชันแบบไม่บังคับ (substring หรือ regex)
+ - `target`: ตำแหน่งที่จะส่งพรอมป์อนุมัติ `"dm"` (ค่าเริ่มต้น) ส่งไปยัง DM ของผู้อนุมัติ, `"channel"` ส่งไปยังช่องต้นทาง, `"both"` ส่งไปทั้งสองที่ เมื่อ target รวม `"channel"` ปุ่มจะใช้งานได้เฉพาะโดยผู้อนุมัติที่ระบุได้เท่านั้น
+ - `cleanupAfterResolve`: เมื่อเป็น `true` จะลบ DM อนุมัติหลังจากอนุมัติ ปฏิเสธ หรือหมดเวลา
-**โหมดการแจ้งเตือน reaction:** `off` (ไม่มี), `own` (ข้อความของบอท, ค่าเริ่มต้น), `all` (ข้อความทั้งหมด), `allowlist` (จาก `guilds..users` บนข้อความทั้งหมด)
+**โหมดการแจ้งเตือน reaction:** `off` (ไม่มี), `own` (ข้อความของบอต, ค่าเริ่มต้น), `all` (ทุกข้อความ), `allowlist` (จาก `guilds..users` ในทุกข้อความ)
### Google Chat
@@ -394,11 +394,11 @@ WhatsApp ทำงานผ่านช่องทางเว็บของ G
}
```
-- JSON ของ service account: แบบ inline (`serviceAccount`) หรือแบบไฟล์ (`serviceAccountFile`)
-- รองรับ SecretRef ของ service account เช่นกัน (`serviceAccountRef`)
-- fallback ของ env: `GOOGLE_CHAT_SERVICE_ACCOUNT` หรือ `GOOGLE_CHAT_SERVICE_ACCOUNT_FILE`
+- JSON ของ service account: แบบ inline (`serviceAccount`) หรือแบบอิงไฟล์ (`serviceAccountFile`)
+- รองรับ SecretRef ของ service account ด้วย (`serviceAccountRef`)
+- ค่าทดแทนจาก env: `GOOGLE_CHAT_SERVICE_ACCOUNT` หรือ `GOOGLE_CHAT_SERVICE_ACCOUNT_FILE`
- ใช้ `spaces/` หรือ `users/` สำหรับเป้าหมายการส่ง
-- `channels.googlechat.dangerouslyAllowNameMatching` เปิดใช้งานการจับคู่ principal อีเมลที่เปลี่ยนแปลงได้อีกครั้ง (โหมดเข้ากันได้แบบ break-glass)
+- `channels.googlechat.dangerouslyAllowNameMatching` เปิดใช้การจับคู่ principal อีเมลที่เปลี่ยนแปลงได้อีกครั้ง (โหมดความเข้ากันได้แบบ break-glass)
### Slack
@@ -470,44 +470,44 @@ WhatsApp ทำงานผ่านช่องทางเว็บของ G
}
```
-- **Socket mode** ต้องใช้ทั้ง `botToken` และ `appToken` (`SLACK_BOT_TOKEN` + `SLACK_APP_TOKEN` สำหรับ fallback env ของบัญชีเริ่มต้น)
+- **Socket mode** ต้องใช้ทั้ง `botToken` และ `appToken` (`SLACK_BOT_TOKEN` + `SLACK_APP_TOKEN` สำหรับค่าทดแทน env ของบัญชีเริ่มต้น)
- **HTTP mode** ต้องใช้ `botToken` พร้อม `signingSecret` (ที่ root หรือรายบัญชี)
-- `socketMode` ส่งต่อการปรับแต่ง transport ของ Slack SDK Socket Mode ไปยัง API receiver สาธารณะของ Bolt ใช้เฉพาะเมื่อตรวจสอบ timeout ของ ping/pong หรือพฤติกรรม websocket ที่ค้าง
+- `socketMode` ส่งผ่านการปรับแต่ง transport ของ Slack SDK Socket Mode ไปยัง API ตัวรับ Bolt สาธารณะ ใช้เฉพาะเมื่อกำลังตรวจสอบ timeout ของ ping/pong หรือพฤติกรรม websocket ค้าง
- `botToken`, `appToken`, `signingSecret` และ `userToken` รับสตริง plaintext
- หรือออบเจกต์ SecretRef
-- snapshot ของบัญชี Slack แสดงฟิลด์ source/status ราย credential เช่น
+ หรือออบเจ็กต์ SecretRef
+- สแนปช็อตบัญชี Slack เปิดเผยฟิลด์ source/status ต่อ credential เช่น
`botTokenSource`, `botTokenStatus`, `appTokenStatus` และใน HTTP mode
`signingSecretStatus` `configured_unavailable` หมายความว่าบัญชีถูก
- กำหนดค่าผ่าน SecretRef แต่ path ของ command/runtime ปัจจุบันไม่สามารถ
- resolve ค่าลับได้
+ กำหนดค่าผ่าน SecretRef แต่ path คำสั่ง/รันไทม์ปัจจุบันไม่สามารถ
+ resolve ค่า secret ได้
- `configWrites: false` บล็อกการเขียน config ที่เริ่มจาก Slack
-- `channels.slack.defaultAccount` ที่เป็นตัวเลือกเสริมจะ override การเลือกบัญชีเริ่มต้นเมื่อค่าตรงกับ id บัญชีที่กำหนดค่าไว้
-- `channels.slack.streaming.mode` เป็นคีย์โหมด stream หลักของ Slack `channels.slack.streaming.nativeTransport` ควบคุม transport streaming แบบเนทีฟของ Slack ค่า legacy `streamMode`, boolean `streaming` และค่า `nativeStreaming` จะถูก migrate โดยอัตโนมัติ
+- `channels.slack.defaultAccount` แบบไม่บังคับจะแทนที่การเลือกบัญชีเริ่มต้นเมื่อค่าตรงกับ id ของบัญชีที่กำหนดค่าไว้
+- `channels.slack.streaming.mode` คือคีย์โหมดสตรีม Slack ที่เป็นมาตรฐาน `channels.slack.streaming.nativeTransport` ควบคุม transport การสตรีมแบบเนทีฟของ Slack ค่าเดิม `streamMode`, boolean `streaming` และค่า `nativeStreaming` จะถูกย้ายโดยอัตโนมัติ
- ใช้ `user:` (DM) หรือ `channel:` สำหรับเป้าหมายการส่ง
**โหมดการแจ้งเตือน reaction:** `off`, `own` (ค่าเริ่มต้น), `all`, `allowlist` (จาก `reactionAllowlist`)
-**การแยก session ของ thread:** `thread.historyScope` เป็นแบบต่อ thread (ค่าเริ่มต้น) หรือใช้ร่วมกันทั้งช่อง `thread.inheritParent` คัดลอก transcript ของช่อง parent ไปยัง thread ใหม่
+**การแยกเซสชันเธรด:** `thread.historyScope` เป็นแบบรายเธรด (ค่าเริ่มต้น) หรือใช้ร่วมกันทั้งช่อง `thread.inheritParent` คัดลอก transcript ของช่องหลักไปยังเธรดใหม่
-- การ streaming แบบเนทีฟของ Slack พร้อมสถานะ thread แบบผู้ช่วยของ Slack ที่ว่า "is typing..." ต้องมีเป้าหมาย thread สำหรับตอบกลับ DM ระดับบนสุดยังคงไม่อยู่ใน thread โดยค่าเริ่มต้น ดังนั้นยังสามารถ stream ผ่าน preview แบบโพสต์ draft แล้วแก้ไขของ Slack แทนการแสดง preview ของ stream/status แบบเนทีฟสไตล์ thread ได้
-- `typingReaction` เพิ่ม reaction ชั่วคราวให้กับข้อความ Slack ขาเข้าในขณะที่การตอบกลับกำลังทำงาน แล้วลบออกเมื่อเสร็จสิ้น ใช้ shortcode emoji ของ Slack เช่น `"hourglass_flowing_sand"`
-- `channels.slack.execApprovals`: การส่งมอบการอนุมัติ exec แบบเนทีฟของ Slack และการอนุญาตผู้อนุมัติ schema เดียวกับ Discord: `enabled` (`true`/`false`/`"auto"`), `approvers` (Slack user IDs), `agentFilter`, `sessionFilter` และ `target` (`"dm"`, `"channel"` หรือ `"both"`)
+- การสตรีมแบบเนทีฟของ Slack ร่วมกับสถานะเธรดสไตล์ผู้ช่วยของ Slack ที่ระบุว่า "is typing..." ต้องมีเป้าหมายเธรดตอบกลับ DM ระดับบนสุดจะอยู่นอกเธรดโดยค่าเริ่มต้น ดังนั้นยังสามารถสตรีมผ่านพรีวิวแบบโพสต์ร่างแล้วแก้ไขของ Slack แทนการแสดงพรีวิวสตรีม/สถานะแบบเนทีฟสไตล์เธรด
+- `typingReaction` เพิ่ม reaction ชั่วคราวไปยังข้อความ Slack ขาเข้าระหว่างที่กำลังตอบกลับ จากนั้นลบออกเมื่อเสร็จสิ้น ใช้ shortcode อีโมจิของ Slack เช่น `"hourglass_flowing_sand"`
+- `channels.slack.execApprovals`: การส่งคำอนุมัติ exec แบบเนทีฟของ Slack และการอนุญาตผู้อนุมัติ schema เดียวกับ Discord: `enabled` (`true`/`false`/`"auto"`), `approvers` (ID ผู้ใช้ Slack), `agentFilter`, `sessionFilter` และ `target` (`"dm"`, `"channel"` หรือ `"both"`)
-| กลุ่ม action | ค่าเริ่มต้น | หมายเหตุ |
+| กลุ่มการกระทำ | ค่าเริ่มต้น | หมายเหตุ |
| ------------ | ------- | ---------------------- |
| reactions | เปิดใช้งาน | React + แสดงรายการ reactions |
| messages | เปิดใช้งาน | อ่าน/ส่ง/แก้ไข/ลบ |
-| pins | เปิดใช้งาน | pin/unpin/แสดงรายการ |
+| pins | เปิดใช้งาน | ปักหมุด/เลิกปักหมุด/แสดงรายการ |
| memberInfo | เปิดใช้งาน | ข้อมูลสมาชิก |
-| emojiList | เปิดใช้งาน | รายการ emoji แบบกำหนดเอง |
+| emojiList | เปิดใช้งาน | รายการอีโมจิกำหนดเอง |
### Mattermost
-Mattermost จัดส่งเป็น Plugin ที่ bundled ใน OpenClaw รุ่นปัจจุบัน รุ่นเก่าหรือ
-build แบบกำหนดเองสามารถติดตั้งแพ็กเกจ npm ปัจจุบันด้วย
+Mattermost จัดส่งเป็น Plugin ที่รวมมาใน OpenClaw รุ่นปัจจุบัน บิลด์เก่าหรือ
+บิลด์แบบกำหนดเองสามารถติดตั้งแพ็กเกจ npm ปัจจุบันด้วย
`openclaw plugins install @openclaw/mattermost` ตรวจสอบ
[npmjs.com/package/@openclaw/mattermost](https://www.npmjs.com/package/@openclaw/mattermost)
-สำหรับ dist-tags ปัจจุบันก่อน pin เวอร์ชัน
+สำหรับ dist-tags ปัจจุบันก่อนตรึงเวอร์ชัน
```json5
{
@@ -537,23 +537,23 @@ build แบบกำหนดเองสามารถติดตั้ง
}
```
-โหมดแชต: `oncall` (ตอบสนองเมื่อมี @-mention, ค่าเริ่มต้น), `onmessage` (ทุกข้อความ), `onchar` (ข้อความที่ขึ้นต้นด้วย prefix trigger)
+โหมดแชต: `oncall` (ตอบสนองเมื่อมี @-mention, ค่าเริ่มต้น), `onmessage` (ทุกข้อความ), `onchar` (ข้อความที่ขึ้นต้นด้วย prefix ทริกเกอร์)
-เมื่อเปิดใช้งาน command แบบเนทีฟของ Mattermost:
+เมื่อเปิดใช้งานคำสั่งเนทีฟของ Mattermost:
-- `commands.callbackPath` ต้องเป็นพาธ (เช่น `/api/channels/mattermost/command`) ไม่ใช่ URL แบบเต็ม
-- `commands.callbackUrl` ต้อง resolve ไปยัง endpoint ของ OpenClaw Gateway และต้องเข้าถึงได้จากเซิร์ฟเวอร์ Mattermost
-- slash callback แบบ native จะ authenticate ด้วยโทเค็นต่อคำสั่งที่ Mattermost ส่งกลับมา
- ระหว่างการลงทะเบียน slash command หากการลงทะเบียนล้มเหลวหรือไม่มี
- คำสั่งใดถูกเปิดใช้งาน OpenClaw จะปฏิเสธ callback ด้วย
+- `commands.callbackPath` ต้องเป็น path (ตัวอย่างเช่น `/api/channels/mattermost/command`) ไม่ใช่ URL แบบเต็ม
+- `commands.callbackUrl` ต้อง resolve ไปยัง endpoint ของ OpenClaw gateway และต้องเข้าถึงได้จากเซิร์ฟเวอร์ Mattermost
+- คอลแบ็ก slash แบบ native จะยืนยันตัวตนด้วยโทเค็นต่อคำสั่งที่ส่งกลับ
+ โดย Mattermost ระหว่างการลงทะเบียน slash command หากการลงทะเบียนล้มเหลวหรือไม่มี
+ คำสั่งใดถูกเปิดใช้งาน OpenClaw จะปฏิเสธคอลแบ็กด้วย
`Unauthorized: invalid command token.`
-- สำหรับ callback host แบบ private/tailnet/internal, Mattermost อาจกำหนดให้
- `ServiceSettings.AllowedUntrustedInternalConnections` ต้องมี callback host/domain อยู่ด้วย
- ให้ใช้ค่า host/domain ไม่ใช่ URL แบบเต็ม
-- `channels.mattermost.configWrites`: อนุญาตหรือปฏิเสธการเขียน config ที่เริ่มจาก Mattermost
-- `channels.mattermost.requireMention`: กำหนดให้ต้องมี `@mention` ก่อนตอบกลับในช่อง
-- `channels.mattermost.groups..requireMention`: override การควบคุมด้วย mention รายช่อง (`"*"` สำหรับค่าเริ่มต้น)
-- `channels.mattermost.defaultAccount` แบบไม่บังคับจะ override การเลือกบัญชีเริ่มต้นเมื่อค่านั้นตรงกับ id ของบัญชีที่ตั้งค่าไว้
+- สำหรับโฮสต์คอลแบ็กแบบ private/tailnet/internal Mattermost อาจกำหนดให้
+ `ServiceSettings.AllowedUntrustedInternalConnections` รวมโฮสต์/โดเมนของคอลแบ็กไว้ด้วย
+ ใช้ค่าโฮสต์/โดเมน ไม่ใช่ URL แบบเต็ม
+- `channels.mattermost.configWrites`: อนุญาตหรือปฏิเสธการเขียน config ที่เริ่มต้นโดย Mattermost
+- `channels.mattermost.requireMention`: กำหนดให้ต้องมี `@mention` ก่อนตอบกลับในช่องทาง
+- `channels.mattermost.groups..requireMention`: การ override mention-gating ต่อช่องทาง (`"*"` สำหรับค่าเริ่มต้น)
+- `channels.mattermost.defaultAccount` แบบไม่บังคับจะ override การเลือกบัญชีเริ่มต้นเมื่อค่าตรงกับ id ของบัญชีที่ตั้งค่าไว้
### Signal
@@ -576,13 +576,13 @@ build แบบกำหนดเองสามารถติดตั้ง
**โหมดการแจ้งเตือน reaction:** `off`, `own` (ค่าเริ่มต้น), `all`, `allowlist` (จาก `reactionAllowlist`)
-- `channels.signal.account`: กำหนดให้การเริ่มต้นช่องผูกกับตัวตนบัญชี Signal ที่เจาะจง
-- `channels.signal.configWrites`: อนุญาตหรือปฏิเสธการเขียน config ที่เริ่มจาก Signal
-- `channels.signal.defaultAccount` แบบไม่บังคับจะ override การเลือกบัญชีเริ่มต้นเมื่อค่านั้นตรงกับ id ของบัญชีที่ตั้งค่าไว้
+- `channels.signal.account`: ตรึงการเริ่มทำงานของช่องทางกับตัวตนบัญชี Signal ที่ระบุ
+- `channels.signal.configWrites`: อนุญาตหรือปฏิเสธการเขียน config ที่เริ่มต้นโดย Signal
+- `channels.signal.defaultAccount` แบบไม่บังคับจะ override การเลือกบัญชีเริ่มต้นเมื่อค่าตรงกับ id ของบัญชีที่ตั้งค่าไว้
### BlueBubbles
-BlueBubbles คือเส้นทาง iMessage ที่แนะนำ (มี Plugin รองรับ และตั้งค่าใต้ `channels.bluebubbles`)
+BlueBubbles คือเส้นทาง iMessage ที่แนะนำ (รองรับด้วย Plugin และตั้งค่าใต้ `channels.bluebubbles`)
```json5
{
@@ -597,14 +597,14 @@ BlueBubbles คือเส้นทาง iMessage ที่แนะนำ (
}
```
-- พาธคีย์หลักที่ครอบคลุมที่นี่: `channels.bluebubbles`, `channels.bluebubbles.dmPolicy`
-- `channels.bluebubbles.defaultAccount` แบบไม่บังคับจะ override การเลือกบัญชีเริ่มต้นเมื่อค่านั้นตรงกับ id ของบัญชีที่ตั้งค่าไว้
-- รายการ `bindings[]` ระดับบนสุดที่มี `type: "acp"` สามารถผูกการสนทนา BlueBubbles กับเซสชัน ACP แบบถาวรได้ ใช้ handle ของ BlueBubbles หรือสตริงเป้าหมาย (`chat_id:*`, `chat_guid:*`, `chat_identifier:*`) ใน `match.peer.id` ความหมายของฟิลด์ที่ใช้ร่วมกัน: [ACP Agents](/th/tools/acp-agents#persistent-channel-bindings)
-- การตั้งค่าช่อง BlueBubbles ฉบับเต็มมีเอกสารอยู่ใน [BlueBubbles](/th/channels/bluebubbles)
+- key path หลักที่ครอบคลุมที่นี่: `channels.bluebubbles`, `channels.bluebubbles.dmPolicy`
+- `channels.bluebubbles.defaultAccount` แบบไม่บังคับจะ override การเลือกบัญชีเริ่มต้นเมื่อค่าตรงกับ id ของบัญชีที่ตั้งค่าไว้
+- รายการ `bindings[]` ระดับบนสุดที่มี `type: "acp"` สามารถผูกการสนทนา BlueBubbles กับ session ACP แบบถาวรได้ ใช้ handle ของ BlueBubbles หรือสตริงเป้าหมาย (`chat_id:*`, `chat_guid:*`, `chat_identifier:*`) ใน `match.peer.id` ความหมายของฟิลด์ที่ใช้ร่วมกัน: [ACP Agents](/th/tools/acp-agents#persistent-channel-bindings)
+- การตั้งค่าช่องทาง BlueBubbles แบบเต็มมีเอกสารอยู่ใน [BlueBubbles](/th/channels/bluebubbles)
### iMessage
-OpenClaw จะ spawn `imsg rpc` (JSON-RPC ผ่าน stdio) ไม่ต้องใช้ daemon หรือพอร์ต
+OpenClaw สร้าง `imsg rpc` (JSON-RPC ผ่าน stdio) ไม่ต้องใช้ daemon หรือ port
```json5
{
@@ -628,15 +628,15 @@ OpenClaw จะ spawn `imsg rpc` (JSON-RPC ผ่าน stdio) ไม่ต้
}
```
-- `channels.imessage.defaultAccount` แบบไม่บังคับจะ override การเลือกบัญชีเริ่มต้นเมื่อค่านั้นตรงกับ id ของบัญชีที่ตั้งค่าไว้
+- `channels.imessage.defaultAccount` แบบไม่บังคับจะ override การเลือกบัญชีเริ่มต้นเมื่อค่าตรงกับ id ของบัญชีที่ตั้งค่าไว้
- ต้องมี Full Disk Access ไปยัง DB ของ Messages
- แนะนำให้ใช้เป้าหมาย `chat_id:` ใช้ `imsg chats --limit 20` เพื่อแสดงรายการแชต
-- `cliPath` สามารถชี้ไปยัง SSH wrapper ได้ ให้ตั้งค่า `remoteHost` (`host` หรือ `user@host`) สำหรับการดึงไฟล์แนบผ่าน SCP
-- `attachmentRoots` และ `remoteAttachmentRoots` จำกัดพาธไฟล์แนบขาเข้า (ค่าเริ่มต้น: `/Users/*/Library/Messages/Attachments`)
-- SCP ใช้การตรวจสอบ host-key อย่างเข้มงวด ดังนั้นต้องแน่ใจว่าคีย์ของ relay host มีอยู่แล้วใน `~/.ssh/known_hosts`
-- `channels.imessage.configWrites`: อนุญาตหรือปฏิเสธการเขียน config ที่เริ่มจาก iMessage
-- รายการ `bindings[]` ระดับบนสุดที่มี `type: "acp"` สามารถผูกการสนทนา iMessage กับเซสชัน ACP แบบถาวรได้ ใช้ handle ที่ normalize แล้วหรือเป้าหมายแชตแบบชัดเจน (`chat_id:*`, `chat_guid:*`, `chat_identifier:*`) ใน `match.peer.id` ความหมายของฟิลด์ที่ใช้ร่วมกัน: [ACP Agents](/th/tools/acp-agents#persistent-channel-bindings)
+- `cliPath` สามารถชี้ไปยัง SSH wrapper ได้; ตั้งค่า `remoteHost` (`host` หรือ `user@host`) สำหรับการดึงไฟล์แนบด้วย SCP
+- `attachmentRoots` และ `remoteAttachmentRoots` จำกัด path ไฟล์แนบขาเข้า (ค่าเริ่มต้น: `/Users/*/Library/Messages/Attachments`)
+- SCP ใช้การตรวจสอบ host-key แบบ strict ดังนั้นตรวจสอบให้แน่ใจว่า key ของโฮสต์ relay มีอยู่แล้วใน `~/.ssh/known_hosts`
+- `channels.imessage.configWrites`: อนุญาตหรือปฏิเสธการเขียน config ที่เริ่มต้นโดย iMessage
+- รายการ `bindings[]` ระดับบนสุดที่มี `type: "acp"` สามารถผูกการสนทนา iMessage กับ session ACP แบบถาวรได้ ใช้ handle ที่ normalize แล้วหรือเป้าหมายแชตแบบชัดเจน (`chat_id:*`, `chat_guid:*`, `chat_identifier:*`) ใน `match.peer.id` ความหมายของฟิลด์ที่ใช้ร่วมกัน: [ACP Agents](/th/tools/acp-agents#persistent-channel-bindings)
@@ -649,7 +649,7 @@ exec ssh -T gateway-host imsg "$@"
### Matrix
-Matrix มี Plugin รองรับและตั้งค่าใต้ `channels.matrix`
+Matrix รองรับด้วย Plugin และตั้งค่าใต้ `channels.matrix`
```json5
{
@@ -679,25 +679,25 @@ Matrix มี Plugin รองรับและตั้งค่าใต้ `
}
```
-- การ auth ด้วยโทเค็นใช้ `accessToken`; การ auth ด้วยรหัสผ่านใช้ `userId` + `password`
-- `channels.matrix.proxy` route ทราฟฟิก HTTP ของ Matrix ผ่านพร็อกซี HTTP(S) ที่ระบุชัดเจน บัญชีที่มีชื่อสามารถ override ได้ด้วย `channels.matrix.accounts..proxy`
-- `channels.matrix.network.dangerouslyAllowPrivateNetwork` อนุญาต homeserver แบบ private/internal `proxy` และการ opt-in เครือข่ายนี้เป็นการควบคุมที่แยกจากกัน
-- `channels.matrix.defaultAccount` เลือกบัญชีที่ต้องการในชุดตั้งค่าหลายบัญชี
-- `channels.matrix.autoJoin` มีค่าเริ่มต้นเป็น `off` ดังนั้นห้องที่ได้รับเชิญและคำเชิญแบบ DM ใหม่จะถูกละเว้นจนกว่าคุณจะตั้งค่า `autoJoin: "allowlist"` พร้อม `autoJoinAllowlist` หรือ `autoJoin: "always"`
-- `channels.matrix.execApprovals`: การส่งการอนุมัติ exec แบบ native ของ Matrix และการ authorize ผู้อนุมัติ
+- การยืนยันตัวตนด้วยโทเค็นใช้ `accessToken`; การยืนยันตัวตนด้วยรหัสผ่านใช้ `userId` + `password`
+- `channels.matrix.proxy` ส่งทราฟฟิก HTTP ของ Matrix ผ่าน proxy HTTP(S) ที่ระบุอย่างชัดเจน บัญชีที่มีชื่อสามารถ override ได้ด้วย `channels.matrix.accounts..proxy`
+- `channels.matrix.network.dangerouslyAllowPrivateNetwork` อนุญาต homeserver แบบ private/internal `proxy` และการ opt-in เครือข่ายนี้เป็นตัวควบคุมที่แยกจากกัน
+- `channels.matrix.defaultAccount` เลือกบัญชีที่ต้องการในการตั้งค่าหลายบัญชี
+- `channels.matrix.autoJoin` มีค่าเริ่มต้นเป็น `off` ดังนั้นห้องที่เชิญและคำเชิญแบบ DM ใหม่จะถูกเพิกเฉยจนกว่าคุณจะตั้งค่า `autoJoin: "allowlist"` พร้อม `autoJoinAllowlist` หรือ `autoJoin: "always"`
+- `channels.matrix.execApprovals`: การส่งคำขออนุมัติ exec แบบ native ของ Matrix และการอนุญาตผู้อนุมัติ
- `enabled`: `true`, `false`, หรือ `"auto"` (ค่าเริ่มต้น) ในโหมด auto การอนุมัติ exec จะเปิดใช้งานเมื่อ resolve ผู้อนุมัติได้จาก `approvers` หรือ `commands.ownerAllowFrom`
- - `approvers`: ID ผู้ใช้ Matrix (เช่น `@owner:example.org`) ที่ได้รับอนุญาตให้อนุมัติคำขอ exec
- - `agentFilter`: allowlist ID agent แบบไม่บังคับ ละเว้นเพื่อส่งต่อการอนุมัติสำหรับ agent ทั้งหมด
- - `sessionFilter`: pattern คีย์เซสชันแบบไม่บังคับ (substring หรือ regex)
+ - `approvers`: Matrix user IDs (เช่น `@owner:example.org`) ที่อนุญาตให้อนุมัติคำขอ exec
+ - `agentFilter`: allowlist agent ID แบบไม่บังคับ ละไว้เพื่อส่งต่อการอนุมัติสำหรับ agents ทั้งหมด
+ - `sessionFilter`: รูปแบบ session key แบบไม่บังคับ (substring หรือ regex)
- `target`: ตำแหน่งที่จะส่ง prompt การอนุมัติ `"dm"` (ค่าเริ่มต้น), `"channel"` (ห้องต้นทาง), หรือ `"both"`
- - override รายบัญชี: `channels.matrix.accounts..execApprovals`
-- `channels.matrix.dm.sessionScope` ควบคุมวิธีจัดกลุ่ม Matrix DM เป็นเซสชัน: `per-user` (ค่าเริ่มต้น) ใช้ร่วมกันตาม peer ที่ถูก route ส่วน `per-room` จะแยกแต่ละห้อง DM ออกจากกัน
-- การ probe สถานะ Matrix และการ lookup ไดเรกทอรีแบบ live ใช้นโยบายพร็อกซีเดียวกับทราฟฟิก runtime
-- การตั้งค่า Matrix ฉบับเต็ม กฎการกำหนดเป้าหมาย และตัวอย่างการตั้งค่ามีเอกสารอยู่ใน [Matrix](/th/channels/matrix)
+ - การ override ต่อบัญชี: `channels.matrix.accounts..execApprovals`
+- `channels.matrix.dm.sessionScope` ควบคุมวิธีจัดกลุ่ม Matrix DM เป็น session: `per-user` (ค่าเริ่มต้น) ใช้ร่วมกันตาม peer ที่ route แล้ว ขณะที่ `per-room` แยกแต่ละห้อง DM
+- status probe ของ Matrix และการค้นหาไดเรกทอรีแบบ live ใช้นโยบาย proxy เดียวกับทราฟฟิก runtime
+- การตั้งค่า Matrix แบบเต็ม กฎการกำหนดเป้าหมาย และตัวอย่างการตั้งค่ามีเอกสารอยู่ใน [Matrix](/th/channels/matrix)
### Microsoft Teams
-Microsoft Teams มี Plugin รองรับและตั้งค่าใต้ `channels.msteams`
+Microsoft Teams รองรับด้วย Plugin และตั้งค่าใต้ `channels.msteams`
```json5
{
@@ -712,12 +712,12 @@ Microsoft Teams มี Plugin รองรับและตั้งค่า
}
```
-- พาธคีย์หลักที่ครอบคลุมที่นี่: `channels.msteams`, `channels.msteams.configWrites`
-- config ของ Teams ฉบับเต็ม (credentials, webhook, นโยบาย DM/group, override รายทีม/รายช่อง) มีเอกสารอยู่ใน [Microsoft Teams](/th/channels/msteams)
+- key path หลักที่ครอบคลุมที่นี่: `channels.msteams`, `channels.msteams.configWrites`
+- config Teams แบบเต็ม (ข้อมูลรับรอง, Webhook, นโยบาย DM/group, การ override ต่อทีม/ต่อช่องทาง) มีเอกสารอยู่ใน [Microsoft Teams](/th/channels/msteams)
### IRC
-IRC มี Plugin รองรับและตั้งค่าใต้ `channels.irc`
+IRC รองรับด้วย Plugin และตั้งค่าใต้ `channels.irc`
```json5
{
@@ -738,13 +738,13 @@ IRC มี Plugin รองรับและตั้งค่าใต้ `cha
}
```
-- พาธคีย์หลักที่ครอบคลุมที่นี่: `channels.irc`, `channels.irc.dmPolicy`, `channels.irc.configWrites`, `channels.irc.nickserv.*`
-- `channels.irc.defaultAccount` แบบไม่บังคับจะ override การเลือกบัญชีเริ่มต้นเมื่อค่านั้นตรงกับ id ของบัญชีที่ตั้งค่าไว้
-- การตั้งค่าช่อง IRC ฉบับเต็ม (host/port/TLS/channels/allowlists/การควบคุมด้วย mention) มีเอกสารอยู่ใน [IRC](/th/channels/irc)
+- key path หลักที่ครอบคลุมที่นี่: `channels.irc`, `channels.irc.dmPolicy`, `channels.irc.configWrites`, `channels.irc.nickserv.*`
+- `channels.irc.defaultAccount` แบบไม่บังคับจะ override การเลือกบัญชีเริ่มต้นเมื่อค่าตรงกับ id ของบัญชีที่ตั้งค่าไว้
+- การตั้งค่าช่องทาง IRC แบบเต็ม (host/port/TLS/channels/allowlists/mention gating) มีเอกสารอยู่ใน [IRC](/th/channels/irc)
-### หลายบัญชี (ทุกช่อง)
+### หลายบัญชี (ทุกช่องทาง)
-เรียกใช้หลายบัญชีต่อช่อง (แต่ละบัญชีมี `accountId` ของตนเอง):
+เรียกใช้หลายบัญชีต่อช่องทาง (แต่ละบัญชีมี `accountId` ของตัวเอง):
```json5
{
@@ -765,34 +765,40 @@ IRC มี Plugin รองรับและตั้งค่าใต้ `cha
}
```
-- `default` จะถูกใช้เมื่อไม่ได้ระบุ `accountId` (CLI + การ route)
-- โทเค็น env ใช้กับบัญชี **default** เท่านั้น
-- การตั้งค่าช่องพื้นฐานใช้กับทุกบัญชี เว้นแต่จะถูก override รายบัญชี
-- ใช้ `bindings[].match.accountId` เพื่อ route แต่ละบัญชีไปยัง agent อื่น
-- หากคุณเพิ่มบัญชีที่ไม่ใช่ค่าเริ่มต้นผ่าน `openclaw channels add` (หรือการ onboarding ช่อง) ขณะที่ยังใช้ config ช่องระดับบนสุดแบบบัญชีเดียว OpenClaw จะ promote ค่าระดับบนสุดแบบบัญชีเดียวที่อยู่ใน scope บัญชีเข้าไปในแผนที่บัญชีของช่องก่อน เพื่อให้บัญชีเดิมยังทำงานต่อได้ ช่องส่วนใหญ่จะย้ายค่าเหล่านั้นเข้าไปที่ `channels..accounts.default`; Matrix สามารถรักษาเป้าหมายที่มีชื่อ/ค่าเริ่มต้นซึ่งตรงกันอยู่แล้วไว้แทนได้
-- binding ที่มีอยู่ซึ่งระบุเฉพาะช่อง (ไม่มี `accountId`) จะยัง match กับบัญชี default; binding ที่อยู่ใน scope บัญชียังคงเป็นตัวเลือก
-- `openclaw doctor --fix` ยังซ่อมรูปแบบผสมด้วยการย้ายค่าระดับบนสุดแบบบัญชีเดียวที่อยู่ใน scope บัญชีเข้าไปในบัญชีที่ถูก promote สำหรับช่องนั้น ช่องส่วนใหญ่ใช้ `accounts.default`; Matrix สามารถรักษาเป้าหมายที่มีชื่อ/ค่าเริ่มต้นซึ่งตรงกันอยู่แล้วไว้แทนได้
+- `default` จะถูกใช้เมื่อไม่ได้ระบุ `accountId` (CLI + routing)
+- โทเค็น env มีผลกับบัญชี **default** เท่านั้น
+- การตั้งค่าช่องทางพื้นฐานมีผลกับทุกบัญชี เว้นแต่จะ override ต่อบัญชี
+- ใช้ `bindings[].match.accountId` เพื่อ route แต่ละบัญชีไปยัง agent คนละตัว
+- หากคุณเพิ่มบัญชีที่ไม่ใช่ default ผ่าน `openclaw channels add` (หรือการ onboarding ช่องทาง) ขณะที่ยังอยู่บน config ช่องทางระดับบนสุดแบบบัญชีเดียว OpenClaw จะ promote ค่าบัญชีเดียวระดับบนสุดที่มีขอบเขตตามบัญชีเข้าไปในแผนที่บัญชีของช่องทางก่อน เพื่อให้บัญชีเดิมยังทำงานได้ ช่องทางส่วนใหญ่จะย้ายค่าเหล่านี้ไปยัง `channels..accounts.default`; Matrix สามารถคงเป้าหมายที่มีชื่อ/default ที่ตรงกันอยู่แล้วไว้แทนได้
+- binding ที่มีอยู่แบบระบุเฉพาะช่องทาง (ไม่มี `accountId`) จะยังจับคู่กับบัญชี default; binding ที่มีขอบเขตตามบัญชียังคงเป็นแบบไม่บังคับ
+- `openclaw doctor --fix` ยังซ่อมแซม shape แบบผสมด้วยการย้ายค่าบัญชีเดียวระดับบนสุดที่มีขอบเขตตามบัญชีไปยังบัญชีที่ถูก promote ซึ่งเลือกไว้สำหรับช่องทางนั้น ช่องทางส่วนใหญ่ใช้ `accounts.default`; Matrix สามารถคงเป้าหมายที่มีชื่อ/default ที่ตรงกันอยู่แล้วไว้แทนได้
-### ช่อง Plugin อื่น
+### ช่องทาง Plugin อื่นๆ
-ช่อง Plugin จำนวนมากตั้งค่าเป็น `channels.` และมีเอกสารอยู่ในหน้าช่องเฉพาะของตน (เช่น Feishu, Matrix, LINE, Nostr, Zalo, Nextcloud Talk, Synology Chat และ Twitch)
-ดูดัชนีช่องฉบับเต็ม: [ช่อง](/th/channels)
+ช่องทาง Plugin จำนวนมากตั้งค่าเป็น `channels.` และมีเอกสารอยู่ในหน้าช่องทางเฉพาะของตนเอง (ตัวอย่างเช่น Feishu, Matrix, LINE, Nostr, Zalo, Nextcloud Talk, Synology Chat, และ Twitch)
+ดูดัชนีช่องทางฉบับเต็ม: [ช่องทาง](/th/channels)
-### การควบคุมด้วย mention ในแชตกลุ่ม
+### การกำหนดให้กล่าวถึงในแชตกลุ่ม
-ข้อความกลุ่มมีค่าเริ่มต้นเป็น **ต้องมี mention** (metadata mention หรือ pattern regex ที่ปลอดภัย) ใช้กับแชตกลุ่มของ WhatsApp, Telegram, Discord, Google Chat และ iMessage
+ข้อความกลุ่มมีค่าเริ่มต้นเป็น **ต้องกล่าวถึง** (metadata mention หรือรูปแบบ regex ที่ปลอดภัย) มีผลกับ WhatsApp, Telegram, Discord, Google Chat, และแชตกลุ่ม iMessage
-การตอบกลับที่มองเห็นได้ถูกควบคุมแยกต่างหาก ห้องแบบ group/channel มีค่าเริ่มต้นเป็น `messages.groupChat.visibleReplies: "message_tool"`: OpenClaw ยังคงประมวลผล turn แต่การตอบกลับสุดท้ายปกติจะยังเป็น private และเอาต์พุตในห้องที่มองเห็นได้ต้องใช้ `message(action=send)` ตั้งค่า `"automatic"` เฉพาะเมื่อคุณต้องการพฤติกรรม legacy ที่การตอบกลับปกติถูกโพสต์กลับไปยังห้อง หากต้องการใช้พฤติกรรม visible-reply แบบ tool-only เดียวกันกับแชตโดยตรงด้วย ให้ตั้งค่า `messages.visibleReplies: "message_tool"`; harness ของ Codex ยังใช้พฤติกรรม tool-only นั้นเป็นค่าเริ่มต้นของแชตโดยตรงเมื่อไม่ได้ตั้งค่าไว้ด้วย
+การตอบกลับที่มองเห็นได้ถูกควบคุมแยกต่างหาก ห้อง group/channel มีค่าเริ่มต้นเป็น `messages.groupChat.visibleReplies: "message_tool"`: OpenClaw ยังคงประมวลผล turn แต่การตอบกลับสุดท้ายแบบปกติจะยังเป็น private และเอาต์พุตห้องที่มองเห็นได้ต้องใช้ `message(action=send)` ตั้งค่า `"automatic"` เฉพาะเมื่อคุณต้องการพฤติกรรม legacy ที่โพสต์การตอบกลับปกติกลับไปยังห้อง หากต้องการใช้พฤติกรรมการตอบกลับที่มองเห็นได้แบบ tool-only เดียวกันกับแชตโดยตรงด้วย ให้ตั้งค่า `messages.visibleReplies: "message_tool"`; harness ของ Codex ยังใช้พฤติกรรม tool-only นั้นเป็นค่าเริ่มต้นของ direct-chat ที่ไม่ได้ตั้งค่า
-หากเครื่องมือ message ไม่พร้อมใช้งานภายใต้นโยบายเครื่องมือที่ใช้งานอยู่ OpenClaw จะ fallback ไปใช้การตอบกลับที่มองเห็นได้แบบ automatic แทนที่จะ suppress การตอบสนองอย่างเงียบๆ `openclaw doctor` จะเตือนเกี่ยวกับความไม่ตรงกันนี้
+การตอบกลับที่มองเห็นได้แบบ tool-only ต้องใช้ model/runtime ที่เรียกใช้ tools ได้อย่างเชื่อถือได้ หาก
+บันทึก session แสดงข้อความ assistant พร้อม `didSendViaMessagingTool: false`
+แสดงว่า model สร้างคำตอบสุดท้ายแบบ private แทนที่จะเรียก message tool
+เปลี่ยนไปใช้ model ที่เรียก tool ได้แข็งแรงกว่าสำหรับช่องทางนั้น หรือตั้งค่า
+`messages.groupChat.visibleReplies: "automatic"` เพื่อคืนค่าการตอบกลับสุดท้ายที่มองเห็นได้แบบ legacy
-Gateway จะ hot-reload config `messages` หลังจากบันทึกไฟล์ restart เฉพาะเมื่อ file watching หรือการ reload config ถูกปิดใช้งานในการ deploy
+หาก message tool ไม่พร้อมใช้งานภายใต้นโยบาย tool ที่ใช้งานอยู่ OpenClaw จะ fallback เป็นการตอบกลับที่มองเห็นได้แบบอัตโนมัติแทนการระงับ response อย่างเงียบๆ `openclaw doctor` จะเตือนเกี่ยวกับความไม่ตรงกันนี้
-**ประเภท mention:**
+Gateway จะ hot-reload config `messages` หลังจากบันทึกไฟล์ Restart เฉพาะเมื่อ file watching หรือ config reload ถูกปิดใช้งานในการ deploy
-- **Metadata mentions**: @-mention แบบ native ของแพลตฟอร์ม ถูกละเว้นในโหมด self-chat ของ WhatsApp
-- **Text patterns**: pattern regex ที่ปลอดภัยใน `agents.list[].groupChat.mentionPatterns` pattern ที่ไม่ถูกต้องและการทำซ้ำแบบ nested ที่ไม่ปลอดภัยจะถูกละเว้น
-- การควบคุมด้วย mention จะถูกบังคับใช้เฉพาะเมื่อการตรวจจับเป็นไปได้เท่านั้น (native mention หรืออย่างน้อยหนึ่ง pattern)
+**ประเภทการกล่าวถึง:**
+
+- **การกล่าวถึงในเมทาดาทา**: การ @-mention ของแพลตฟอร์มเนทีฟ ถูกละเว้นในโหมดแชตกับตัวเองของ WhatsApp
+- **รูปแบบข้อความ**: รูปแบบ regex ที่ปลอดภัยใน `agents.list[].groupChat.mentionPatterns` รูปแบบที่ไม่ถูกต้องและการทำซ้ำซ้อนแบบไม่ปลอดภัยจะถูกละเว้น
+- การควบคุมด้วยการกล่าวถึงจะถูกบังคับใช้เฉพาะเมื่อสามารถตรวจจับได้เท่านั้น (การกล่าวถึงแบบเนทีฟหรือมีรูปแบบอย่างน้อยหนึ่งรายการ)
```json5
{
@@ -809,9 +815,9 @@ Gateway จะ hot-reload config `messages` หลังจากบันทึ
}
```
-`messages.groupChat.historyLimit` ตั้งค่าเริ่มต้นส่วนกลาง ช่องทางสามารถเขียนทับได้ด้วย `channels..historyLimit` (หรือกำหนดต่อบัญชี) ตั้งค่าเป็น `0` เพื่อปิดใช้งาน
+`messages.groupChat.historyLimit` ตั้งค่าเริ่มต้นส่วนกลาง ช่องสามารถแทนที่ได้ด้วย `channels..historyLimit` (หรือกำหนดแยกตามบัญชี) ตั้งเป็น `0` เพื่อปิดใช้งาน
-`messages.visibleReplies` คือค่าเริ่มต้นส่วนกลางของ source-turn; `messages.groupChat.visibleReplies` เขียนทับค่านี้สำหรับ source turns ของกลุ่ม/ช่องทาง เมื่อไม่ได้ตั้งค่า `messages.visibleReplies` harness สามารถระบุค่าเริ่มต้น direct/source ของตัวเองได้; harness ของ Codex มีค่าเริ่มต้นเป็น `message_tool` รายการอนุญาตของช่องทางและการกำหนดให้กล่าวถึงยังคงเป็นตัวตัดสินว่า turn จะถูกประมวลผลหรือไม่
+`messages.visibleReplies` คือค่าเริ่มต้นส่วนกลางของ source-turn; `messages.groupChat.visibleReplies` จะแทนที่ค่านี้สำหรับ source turn ของกลุ่ม/ช่อง เมื่อไม่ได้ตั้งค่า `messages.visibleReplies` harness สามารถให้ค่าเริ่มต้น direct/source ของตัวเองได้; Codex harness มีค่าเริ่มต้นเป็น `message_tool` รายการอนุญาตของช่องและการควบคุมด้วยการกล่าวถึงยังคงตัดสินว่าจะประมวลผล turn หรือไม่
#### ขีดจำกัดประวัติ DM
@@ -828,13 +834,13 @@ Gateway จะ hot-reload config `messages` หลังจากบันทึ
}
```
-การแก้ค่า: การเขียนทับต่อ DM → ค่าเริ่มต้นของผู้ให้บริการ → ไม่มีขีดจำกัด (เก็บไว้ทั้งหมด)
+การแก้ค่า: การแทนที่ต่อ DM → ค่าเริ่มต้นของ provider → ไม่มีขีดจำกัด (เก็บทั้งหมดไว้)
รองรับ: `telegram`, `whatsapp`, `discord`, `slack`, `signal`, `imessage`, `msteams`
-#### โหมดแชตกับตนเอง
+#### โหมดแชตกับตัวเอง
-ใส่หมายเลขของคุณเองใน `allowFrom` เพื่อเปิดใช้งานโหมดแชตกับตนเอง (ไม่สนใจ @-mentions แบบเนทีฟ และตอบกลับเฉพาะรูปแบบข้อความเท่านั้น):
+ใส่หมายเลขของคุณเองใน `allowFrom` เพื่อเปิดใช้งานโหมดแชตกับตัวเอง (ละเว้นการ @-mention แบบเนทีฟ และตอบกลับเฉพาะรูปแบบข้อความเท่านั้น):
```json5
{
@@ -884,30 +890,30 @@ Gateway จะ hot-reload config `messages` หลังจากบันทึ
-- บล็อกนี้กำหนดค่าพื้นผิวคำสั่ง สำหรับแค็ตตาล็อกคำสั่ง built-in + bundled ปัจจุบัน โปรดดู [Slash Commands](/th/tools/slash-commands)
-- หน้านี้เป็น **ข้อมูลอ้างอิง config-key** ไม่ใช่แค็ตตาล็อกคำสั่งทั้งหมด คำสั่งที่ช่องทาง/Plugin เป็นเจ้าของ เช่น QQ Bot `/bot-ping` `/bot-help` `/bot-logs`, LINE `/card`, device-pair `/pair`, memory `/dreaming`, phone-control `/phone` และ Talk `/voice` มีเอกสารอยู่ในหน้าช่องทาง/Plugin ของคำสั่งนั้น ๆ รวมถึง [Slash Commands](/th/tools/slash-commands)
-- คำสั่งข้อความต้องเป็นข้อความแบบ **เดี่ยวล้วน** ที่ขึ้นต้นด้วย `/`
-- `native: "auto"` เปิดคำสั่งเนทีฟสำหรับ Discord/Telegram และปล่อยให้ Slack ปิดอยู่
-- `nativeSkills: "auto"` เปิดคำสั่ง Skills แบบเนทีฟสำหรับ Discord/Telegram และปล่อยให้ Slack ปิดอยู่
-- เขียนทับต่อช่องทาง: `channels.discord.commands.native` (บูลีนหรือ `"auto"`) สำหรับ Discord ค่า `false` จะข้ามการลงทะเบียนและการล้างคำสั่งเนทีฟระหว่างเริ่มต้น
-- เขียนทับการลงทะเบียน Skills แบบเนทีฟต่อช่องทางด้วย `channels..commands.nativeSkills`
+- บล็อกนี้กำหนดค่าพื้นผิวคำสั่ง สำหรับแค็ตตาล็อกคำสั่ง built-in + bundled ปัจจุบัน โปรดดู [คำสั่ง Slash](/th/tools/slash-commands)
+- หน้านี้เป็น **เอกสารอ้างอิง config-key** ไม่ใช่แค็ตตาล็อกคำสั่งฉบับเต็ม คำสั่งที่ช่อง/Plugin เป็นเจ้าของ เช่น QQ Bot `/bot-ping` `/bot-help` `/bot-logs`, LINE `/card`, device-pair `/pair`, memory `/dreaming`, phone-control `/phone`, และ Talk `/voice` มีเอกสารอยู่ในหน้าช่อง/Plugin ของตัวเอง รวมถึง [คำสั่ง Slash](/th/tools/slash-commands)
+- คำสั่งข้อความต้องเป็นข้อความแบบ **เดี่ยว** ที่ขึ้นต้นด้วย `/`
+- `native: "auto"` เปิดใช้คำสั่งเนทีฟสำหรับ Discord/Telegram และปิดไว้สำหรับ Slack
+- `nativeSkills: "auto"` เปิดใช้คำสั่ง Skills แบบเนทีฟสำหรับ Discord/Telegram และปิดไว้สำหรับ Slack
+- แทนที่แยกตามช่อง: `channels.discord.commands.native` (บูลีนหรือ `"auto"`) สำหรับ Discord ค่า `false` จะข้ามการลงทะเบียนและการล้างคำสั่งเนทีฟระหว่างเริ่มต้น
+- แทนที่การลงทะเบียน Skills แบบเนทีฟแยกตามช่องด้วย `channels..commands.nativeSkills`
- `channels.telegram.customCommands` เพิ่มรายการเมนูบอต Telegram เพิ่มเติม
-- `bash: true` เปิดใช้งาน `! ` สำหรับ shell ของโฮสต์ ต้องมี `tools.elevated.enabled` และผู้ส่งต้องอยู่ใน `tools.elevated.allowFrom.`
-- `config: true` เปิดใช้งาน `/config` (อ่าน/เขียน `openclaw.json`) สำหรับไคลเอนต์ `chat.send` ของ Gateway การเขียน `/config set|unset` แบบถาวรยังต้องมี `operator.admin`; `/config show` แบบอ่านอย่างเดียวยังคงพร้อมใช้งานสำหรับไคลเอนต์ operator ที่มีขอบเขตการเขียนปกติ
-- `mcp: true` เปิดใช้งาน `/mcp` สำหรับการกำหนดค่าเซิร์ฟเวอร์ MCP ที่ OpenClaw จัดการภายใต้ `mcp.servers`
-- `plugins: true` เปิดใช้งาน `/plugins` สำหรับการค้นพบ Plugin การติดตั้ง และการควบคุมเปิด/ปิด
-- `channels..configWrites` ควบคุมการเปลี่ยนแปลง config ต่อช่องทาง (ค่าเริ่มต้น: true)
-- สำหรับช่องทางหลายบัญชี `channels..accounts..configWrites` ยังควบคุมการเขียนที่เจาะจงบัญชีนั้นด้วย (เช่น `/allowlist --config --account ` หรือ `/config set channels..accounts....`)
-- `restart: false` ปิดใช้งาน `/restart` และการทำงานของเครื่องมือรีสตาร์ท Gateway ค่าเริ่มต้น: `true`
-- `ownerAllowFrom` คือรายการอนุญาตของเจ้าของแบบชัดเจนสำหรับคำสั่ง/เครื่องมือสำหรับเจ้าของเท่านั้น แยกจาก `allowFrom`
-- `ownerDisplay: "hash"` แฮช owner ids ใน system prompt ตั้งค่า `ownerDisplaySecret` เพื่อควบคุมการแฮช
-- `allowFrom` เป็นรายผู้ให้บริการ เมื่อตั้งค่าแล้ว ค่านี้จะเป็นแหล่งอนุญาต **เพียงแหล่งเดียว** (รายการอนุญาต/การจับคู่ของช่องทางและ `useAccessGroups` จะถูกละเว้น)
-- `useAccessGroups: false` อนุญาตให้คำสั่งข้ามนโยบาย access-group เมื่อไม่ได้ตั้งค่า `allowFrom`
-- แผนผังเอกสารคำสั่ง:
- - แค็ตตาล็อก built-in + bundled: [Slash Commands](/th/tools/slash-commands)
- - พื้นผิวคำสั่งเฉพาะช่องทาง: [Channels](/th/channels)
+- `bash: true` เปิดใช้ `! ` สำหรับเชลล์ของโฮสต์ ต้องมี `tools.elevated.enabled` และผู้ส่งต้องอยู่ใน `tools.elevated.allowFrom.`
+- `config: true` เปิดใช้ `/config` (อ่าน/เขียน `openclaw.json`) สำหรับไคลเอนต์ Gateway `chat.send` การเขียนถาวรด้วย `/config set|unset` ยังต้องมี `operator.admin`; `/config show` แบบอ่านอย่างเดียวยังคงพร้อมใช้งานสำหรับไคลเอนต์ operator ขอบเขตเขียนปกติ
+- `mcp: true` เปิดใช้ `/mcp` สำหรับการกำหนดค่าเซิร์ฟเวอร์ MCP ที่ OpenClaw จัดการภายใต้ `mcp.servers`
+- `plugins: true` เปิดใช้ `/plugins` สำหรับการค้นหา Plugin การติดตั้ง และการควบคุมเปิด/ปิดใช้งาน
+- `channels..configWrites` ควบคุมการเปลี่ยนแปลงการกำหนดค่าต่อช่อง (ค่าเริ่มต้น: true)
+- สำหรับช่องหลายบัญชี `channels..accounts..configWrites` ยังควบคุมการเขียนที่เจาะจงบัญชีนั้นด้วย (เช่น `/allowlist --config --account ` หรือ `/config set channels..accounts....`)
+- `restart: false` ปิดใช้งาน `/restart` และการกระทำของเครื่องมือรีสตาร์ต Gateway ค่าเริ่มต้น: `true`
+- `ownerAllowFrom` คือรายการอนุญาตเจ้าของแบบชัดเจนสำหรับคำสั่ง/เครื่องมือที่มีเฉพาะเจ้าของเท่านั้น แยกจาก `allowFrom`
+- `ownerDisplay: "hash"` แฮชรหัสเจ้าของในพรอมป์ระบบ ตั้งค่า `ownerDisplaySecret` เพื่อควบคุมการแฮช
+- `allowFrom` กำหนดแยกตาม provider เมื่อตั้งค่าแล้ว ค่านี้เป็นแหล่งการอนุญาต **เพียงแหล่งเดียว** (รายการอนุญาต/การจับคู่ของช่อง และ `useAccessGroups` จะถูกละเว้น)
+- `useAccessGroups: false` อนุญาตให้คำสั่งข้ามนโยบายกลุ่มการเข้าถึงได้เมื่อไม่ได้ตั้งค่า `allowFrom`
+- แผนที่เอกสารคำสั่ง:
+ - แค็ตตาล็อก built-in + bundled: [คำสั่ง Slash](/th/tools/slash-commands)
+ - พื้นผิวคำสั่งเฉพาะช่อง: [ช่อง](/th/channels)
- คำสั่ง QQ Bot: [QQ Bot](/th/channels/qqbot)
- - คำสั่งการจับคู่: [Pairing](/th/channels/pairing)
+ - คำสั่งการจับคู่: [การจับคู่](/th/channels/pairing)
- คำสั่งการ์ด LINE: [LINE](/th/channels/line)
- memory dreaming: [Dreaming](/th/concepts/dreaming)
@@ -917,6 +923,6 @@ Gateway จะ hot-reload config `messages` หลังจากบันทึ
## ที่เกี่ยวข้อง
-- [ข้อมูลอ้างอิงการกำหนดค่า](/th/gateway/configuration-reference) — คีย์ระดับบนสุด
+- [เอกสารอ้างอิงการกำหนดค่า](/th/gateway/configuration-reference) — คีย์ระดับบนสุด
- [การกำหนดค่า — agents](/th/gateway/config-agents)
-- [ภาพรวมช่องทาง](/th/channels)
+- [ภาพรวมช่อง](/th/channels)
diff --git a/docs/th/gateway/configuration-examples.md b/docs/th/gateway/configuration-examples.md
index 3aaf3b262..624c2eac8 100644
--- a/docs/th/gateway/configuration-examples.md
+++ b/docs/th/gateway/configuration-examples.md
@@ -1,15 +1,15 @@
---
read_when:
- เรียนรู้วิธีกำหนดค่า OpenClaw
- - กำลังค้นหาตัวอย่างการกำหนดค่า
+ - กำลังมองหาตัวอย่างการกำหนดค่า
- การตั้งค่า OpenClaw เป็นครั้งแรก
-summary: ตัวอย่างการกำหนดค่าที่ถูกต้องตามสคีมาสำหรับการตั้งค่า OpenClaw ทั่วไป
+summary: ตัวอย่างการกำหนดค่าที่ถูกต้องตามสคีมาสำหรับการตั้งค่า OpenClaw ที่พบบ่อย
title: ตัวอย่างการกำหนดค่า
x-i18n:
- generated_at: "2026-04-30T09:50:57Z"
+ generated_at: "2026-05-04T02:24:58Z"
model: gpt-5.5
provider: openai
- source_hash: 8bc1f8877bc635d6e3aafd911852d61e71fa08de9144751209542fd67c70f0ba
+ source_hash: 60c8c2d731f8dce93c4d14657041d72043bc36e3d71ab6cb13c02993ba90dbe3
source_path: gateway/configuration-examples.md
workflow: 16
---
@@ -27,7 +27,7 @@ x-i18n:
}
```
-บันทึกไปที่ `~/.openclaw/openclaw.json` แล้วคุณจะ DM บอตจากหมายเลขนั้นได้
+บันทึกไปที่ `~/.openclaw/openclaw.json` แล้วคุณจะสามารถ DM บอตจากหมายเลขนั้นได้
### ค่าเริ่มต้นที่แนะนำ
@@ -59,7 +59,7 @@ x-i18n:
## ตัวอย่างแบบขยาย (ตัวเลือกหลัก)
-> JSON5 ให้คุณใช้ความคิดเห็นและคอมมาท้ายรายการได้ JSON ปกติก็ใช้ได้เช่นกัน
+> JSON5 ช่วยให้คุณใช้คอมเมนต์และจุลภาคต่อท้ายได้ JSON ปกติก็ใช้ได้เช่นกัน
```json5
{
@@ -256,6 +256,7 @@ x-i18n:
skills: ["github", "weather"], // inherited by agents that omit list[].skills
thinkingDefault: "low",
verboseDefault: "off",
+ toolProgressDetail: "explain",
reasoningDefault: "off",
elevatedDefault: "on",
blockStreamingDefault: "off",
@@ -472,7 +473,7 @@ x-i18n:
## รูปแบบทั่วไป
-### ค่าเริ่มต้น Skills ที่ใช้ร่วมกันพร้อมการแทนที่หนึ่งรายการ
+### ค่าพื้นฐาน Skills ที่ใช้ร่วมกันพร้อมการแทนที่หนึ่งรายการ
```json5
{
@@ -490,8 +491,8 @@ x-i18n:
```
- `agents.defaults.skills` คือค่าพื้นฐานที่ใช้ร่วมกัน
-- `agents.list[].skills` จะแทนที่ค่าพื้นฐานนั้นสำหรับ agent หนึ่งตัว
-- ใช้ `skills: []` เมื่อ agent ไม่ควรเห็น skills ใดๆ
+- `agents.list[].skills` จะแทนที่ค่าพื้นฐานนั้นสำหรับเอเจนต์หนึ่งตัว
+- ใช้ `skills: []` เมื่อเอเจนต์ไม่ควรเห็น Skills ใดๆ
### การตั้งค่าหลายแพลตฟอร์ม
@@ -516,9 +517,7 @@ x-i18n:
### การอนุมัติอัตโนมัติสำหรับเครือข่าย Node ที่เชื่อถือได้
-ให้การจับคู่อุปกรณ์เป็นแบบแมนนวลไว้ เว้นแต่คุณจะควบคุมเส้นทางเครือข่าย สำหรับแล็บเฉพาะ
-หรือซับเน็ต tailnet คุณสามารถเลือกใช้การอนุมัติอัตโนมัติสำหรับอุปกรณ์ Node ครั้งแรก
-ด้วย CIDR หรือ IP ที่ระบุแน่นอนได้:
+ให้จับคู่อุปกรณ์ด้วยตนเองต่อไป เว้นแต่คุณจะควบคุมเส้นทางเครือข่ายนั้น สำหรับแล็บเฉพาะทางหรือซับเน็ต tailnet คุณสามารถเลือกใช้การอนุมัติอัตโนมัติสำหรับอุปกรณ์ Node ครั้งแรกด้วย CIDR หรือ IP ที่ระบุแบบตรงตัวได้:
```json5
{
@@ -532,13 +531,11 @@ x-i18n:
}
```
-ค่านี้จะยังปิดอยู่เมื่อไม่ได้ตั้งค่า ใช้กับการจับคู่ `role: node` ใหม่เท่านั้นเมื่อ
-ไม่มี scope ที่ร้องขอ ไคลเอ็นต์ operator/browser และการอัปเกรด role, scope, metadata หรือ
-public-key ยังคงต้องอนุมัติแบบแมนนวล
+ค่านี้ยังคงปิดอยู่เมื่อไม่ได้ตั้งค่า ใช้เฉพาะกับการจับคู่ `role: node` ใหม่ที่ไม่มีสโคปที่ร้องขอเท่านั้น ไคลเอนต์ operator/browser และการอัปเกรดบทบาท สโคป เมตาดาตา หรือ public key ยังคงต้องได้รับการอนุมัติด้วยตนเอง
-### โหมด DM ที่ปลอดภัย (กล่องข้อความที่ใช้ร่วมกัน / DM หลายผู้ใช้)
+### โหมด DM ที่ปลอดภัย (กล่องข้อความร่วม / DM แบบหลายผู้ใช้)
-หากมีมากกว่าหนึ่งคนที่สามารถส่ง DM ถึงบอตของคุณได้ (มีหลายรายการใน `allowFrom`, การอนุมัติการจับคู่สำหรับหลายคน หรือ `dmPolicy: "open"`) ให้เปิดใช้ **โหมด DM ที่ปลอดภัย** เพื่อไม่ให้ DM จากผู้ส่งต่างกันใช้บริบทเดียวกันร่วมกันโดยค่าเริ่มต้น:
+หากมีมากกว่าหนึ่งคนที่สามารถส่ง DM ถึงบอตของคุณได้ (หลายรายการใน `allowFrom`, การอนุมัติการจับคู่สำหรับหลายคน หรือ `dmPolicy: "open"`), ให้เปิดใช้ **โหมด DM ที่ปลอดภัย** เพื่อให้ DM จากผู้ส่งต่างกันไม่ใช้บริบทเดียวกันเป็นค่าเริ่มต้น:
```json5
{
@@ -563,9 +560,9 @@ public-key ยังคงต้องอนุมัติแบบแมนน
```
สำหรับ Discord/Slack/Google Chat/Microsoft Teams/Mattermost/IRC การอนุญาตผู้ส่งจะยึด ID เป็นหลักโดยค่าเริ่มต้น
-เปิดใช้การจับคู่ชื่อ/อีเมล/ชื่อเล่นที่เปลี่ยนแปลงได้โดยตรงด้วย `dangerouslyAllowNameMatching: true` ของแต่ละช่องทางเท่านั้น หากคุณยอมรับความเสี่ยงนั้นอย่างชัดเจน
+เปิดใช้การจับคู่ชื่อ/อีเมล/ชื่อเล่นแบบแก้ไขได้โดยตรงด้วย `dangerouslyAllowNameMatching: true` ของแต่ละช่องทางก็ต่อเมื่อคุณยอมรับความเสี่ยงนั้นอย่างชัดเจน
-### คีย์ Anthropic API + fallback ของ MiniMax
+### คีย์ API ของ Anthropic + MiniMax fallback
```json5
{
@@ -624,7 +621,7 @@ public-key ยังคงต้องอนุมัติแบบแมนน
}
```
-### เฉพาะโมเดลในเครื่องเท่านั้น
+### ใช้เฉพาะโมเดลภายในเครื่อง
```json5
{
@@ -660,8 +657,8 @@ public-key ยังคงต้องอนุมัติแบบแมนน
- หากคุณตั้งค่า `dmPolicy: "open"` รายการ `allowFrom` ที่ตรงกันต้องมี `"*"`
- ID ของผู้ให้บริการแตกต่างกัน (หมายเลขโทรศัพท์, ID ผู้ใช้, ID ช่องทาง) ใช้เอกสารของผู้ให้บริการเพื่อยืนยันรูปแบบ
-- ส่วนที่เลือกเพิ่มภายหลังได้: `web`, `browser`, `ui`, `discovery`, `canvasHost`, `talk`, `signal`, `imessage`
-- ดู [ผู้ให้บริการ](/th/providers) และ [การแก้ไขปัญหา](/th/gateway/troubleshooting) สำหรับบันทึกการตั้งค่าเชิงลึกเพิ่มเติม
+- ส่วนเสริมที่เพิ่มได้ภายหลัง: `web`, `browser`, `ui`, `discovery`, `canvasHost`, `talk`, `signal`, `imessage`
+- ดู [ผู้ให้บริการ](/th/providers) และ [การแก้ไขปัญหา](/th/gateway/troubleshooting) สำหรับบันทึกการตั้งค่าที่ละเอียดขึ้น
## ที่เกี่ยวข้อง
diff --git a/docs/th/gateway/opentelemetry.md b/docs/th/gateway/opentelemetry.md
index 70d3ac43d..ee882baff 100644
--- a/docs/th/gateway/opentelemetry.md
+++ b/docs/th/gateway/opentelemetry.md
@@ -1,36 +1,35 @@
---
read_when:
- - คุณต้องการส่งข้อมูลการใช้งานโมเดลของ OpenClaw, โฟลว์ข้อความ หรือเมตริกของเซสชันไปยังตัวรวบรวม OpenTelemetry
- - คุณกำลังเชื่อมต่อเทรซ เมตริก หรือล็อกเข้ากับ Grafana, Datadog, Honeycomb, New Relic, Tempo หรือแบ็กเอนด์ OTLP อื่น
- - คุณต้องทราบชื่อเมตริก ชื่อสแปน หรือรูปแบบแอตทริบิวต์ที่แน่นอน เพื่อสร้างแดชบอร์ดหรือการแจ้งเตือน
-summary: ส่งออกข้อมูลการวินิจฉัยของ OpenClaw ไปยังตัวรวบรวม OpenTelemetry ใด ๆ ผ่าน Plugin diagnostics-otel (OTLP/HTTP)
+ - คุณต้องการส่งข้อมูลการใช้งานโมเดลของ OpenClaw, โฟลว์ข้อความ หรือเมตริกเซสชันไปยังตัวรวบรวม OpenTelemetry
+ - คุณกำลังเชื่อมต่อเทรซ เมตริก หรือบันทึกเข้ากับ Grafana, Datadog, Honeycomb, New Relic, Tempo หรือแบ็กเอนด์ OTLP อื่น
+ - คุณต้องใช้ชื่อเมตริก ชื่อสแปน หรือรูปแบบแอตทริบิวต์ที่ถูกต้องแม่นยำเพื่อสร้างแดชบอร์ดหรือการแจ้งเตือน
+summary: ส่งออกข้อมูลวินิจฉัยของ OpenClaw ไปยังคอลเลกเตอร์ OpenTelemetry ใดก็ได้ผ่าน Plugin diagnostics-otel (OTLP/HTTP)
title: การส่งออก OpenTelemetry
x-i18n:
- generated_at: "2026-05-03T21:32:56Z"
+ generated_at: "2026-05-04T02:25:12Z"
model: gpt-5.5
provider: openai
- source_hash: c8091aa633a3e10593681f94913a858587a5dc69d9947e0c0d4132f6e897b00b
+ source_hash: d0b5be99b29fe5f13132b03cfeaf3ce978ee16f29e307aa76769bc414b5ca35f
source_path: gateway/opentelemetry.md
workflow: 16
---
-OpenClaw ส่งออกการวินิจฉัยผ่าน Plugin ทางการ `diagnostics-otel`
-โดยใช้ **OTLP/HTTP (protobuf)** collector หรือ backend ใดก็ตามที่รับ OTLP/HTTP
-จะทำงานได้โดยไม่ต้องเปลี่ยนโค้ด สำหรับล็อกไฟล์ภายในเครื่องและวิธีอ่าน โปรดดู
+OpenClaw ส่งออก diagnostics ผ่าน Plugin ทางการ `diagnostics-otel`
+โดยใช้ **OTLP/HTTP (protobuf)** ตัวเก็บรวบรวมหรือ backend ใดๆ ที่รองรับ OTLP/HTTP
+จะทำงานได้โดยไม่ต้องแก้โค้ด สำหรับล็อกไฟล์ภายในเครื่องและวิธีอ่าน โปรดดู
[การบันทึกล็อก](/th/logging)
-## การทำงานร่วมกัน
+## ส่วนต่างๆ ทำงานร่วมกันอย่างไร
-- **เหตุการณ์การวินิจฉัย** คือเรคคอร์ดแบบมีโครงสร้างภายในโปรเซสที่ส่งออกโดย
- Gateway และ Plugin ที่บันเดิลมา สำหรับการรันโมเดล การไหลของข้อความ เซสชัน คิว
+- **เหตุการณ์ diagnostics** คือเรคคอร์ดแบบมีโครงสร้างภายในโปรเซสที่ส่งออกโดย
+ Gateway และ Plugin ที่มาพร้อมกัน สำหรับการรันโมเดล, โฟลว์ข้อความ, เซสชัน, คิว,
และ exec
- **Plugin `diagnostics-otel`** สมัครรับเหตุการณ์เหล่านั้นและส่งออกเป็น
- OpenTelemetry **เมตริก**, **เทรซ** และ **ล็อก** ผ่าน OTLP/HTTP
-- **การเรียก provider** จะได้รับ header W3C `traceparent` จากบริบท span ของการเรียกโมเดลที่ OpenClaw
- เชื่อถือ เมื่อ transport ของ provider รับ header แบบกำหนดเองได้
- บริบทเทรซที่ส่งออกโดย Plugin จะไม่ถูกเผยแพร่ต่อ
-- exporter จะเชื่อมต่อเฉพาะเมื่อทั้งพื้นผิวการวินิจฉัยและ Plugin
- ถูกเปิดใช้งาน ดังนั้นค่าใช้จ่ายภายในโปรเซสจึงเกือบเป็นศูนย์โดยค่าเริ่มต้น
+ **เมตริก**, **เทรซ**, และ **ล็อก** ของ OpenTelemetry ผ่าน OTLP/HTTP
+- **การเรียก provider** จะได้รับส่วนหัว W3C `traceparent` จากบริบท span การเรียกโมเดลที่เชื่อถือได้ของ OpenClaw
+ เมื่อ transport ของ provider รองรับส่วนหัวแบบกำหนดเอง บริบทเทรซที่ Plugin ส่งออกจะไม่ถูกส่งต่อ
+- exporter จะผูกต่อเมื่อทั้งพื้นผิว diagnostics และ Plugin
+ เปิดใช้งานอยู่เท่านั้น ดังนั้นค่าใช้จ่ายภายในโปรเซสจึงอยู่ใกล้ศูนย์ตามค่าเริ่มต้น
## เริ่มต้นอย่างรวดเร็ว
@@ -65,28 +64,28 @@ openclaw plugins install clawhub:@openclaw/diagnostics-otel
}
```
-คุณยังสามารถเปิดใช้งาน Plugin จาก CLI ได้:
+คุณยังเปิดใช้งาน Plugin จาก CLI ได้ด้วย:
```bash
openclaw plugins enable diagnostics-otel
```
-ขณะนี้ `protocol` รองรับเฉพาะ `http/protobuf` เท่านั้น `grpc` จะถูกละเว้น
+ปัจจุบัน `protocol` รองรับเฉพาะ `http/protobuf` เท่านั้น `grpc` จะถูกละเว้น
## สัญญาณที่ส่งออก
| สัญญาณ | สิ่งที่อยู่ในนั้น |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
-| **เมตริก** | counter และ histogram สำหรับการใช้โทเค็น ต้นทุน ระยะเวลาการรัน การไหลของข้อความ เลนคิว สถานะเซสชัน exec และแรงกดดันหน่วยความจำ |
-| **เทรซ** | span สำหรับการใช้โมเดล การเรียกโมเดล วงจรชีวิตของ harness การเรียกใช้เครื่องมือ exec การประมวลผล webhook/ข้อความ การประกอบบริบท และลูปเครื่องมือ |
-| **ล็อก** | เรคคอร์ด `logging.file` แบบมีโครงสร้างที่ส่งออกผ่าน OTLP เมื่อเปิดใช้งาน `diagnostics.otel.logs` |
+| **เมตริก** | ตัวนับและฮิสโตแกรมสำหรับการใช้โทเค็น, ต้นทุน, ระยะเวลาการรัน, โฟลว์ข้อความ, เลนคิว, สถานะเซสชัน, exec, และแรงกดดันหน่วยความจำ |
+| **เทรซ** | Span สำหรับการใช้โมเดล, การเรียกโมเดล, วงจรชีวิต harness, การเรียกใช้เครื่องมือ, exec, การประมวลผล webhook/ข้อความ, การประกอบบริบท, และลูปเครื่องมือ |
+| **ล็อก** | เรคคอร์ด `logging.file` แบบมีโครงสร้างที่ส่งออกผ่าน OTLP เมื่อเปิดใช้ `diagnostics.otel.logs` |
-สลับเปิดปิด `traces`, `metrics` และ `logs` ได้อย่างอิสระ ทั้งสามอย่างเปิดไว้เป็นค่าเริ่มต้น
+สลับเปิดปิด `traces`, `metrics`, และ `logs` ได้อย่างอิสระ ทั้งสามอย่างเปิดไว้ตามค่าเริ่มต้น
เมื่อ `diagnostics.otel.enabled` เป็น true
-## ข้อมูลอ้างอิงการกำหนดค่า
+## อ้างอิงการกำหนดค่า
```json5
{
@@ -123,54 +122,54 @@ openclaw plugins enable diagnostics-otel
| ตัวแปร | วัตถุประสงค์ |
| ----------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| `OTEL_EXPORTER_OTLP_ENDPOINT` | แทนที่ `diagnostics.otel.endpoint` หากค่ามี `/v1/traces`, `/v1/metrics` หรือ `/v1/logs` อยู่แล้ว จะใช้ค่านั้นตามเดิม |
-| `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` / `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` / `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` | การแทนที่ endpoint เฉพาะสัญญาณที่ใช้เมื่อไม่ได้ตั้งค่าคีย์กำหนดค่า `diagnostics.otel.*Endpoint` ที่ตรงกัน การกำหนดค่าเฉพาะสัญญาณมีลำดับความสำคัญเหนือ env เฉพาะสัญญาณ ซึ่งมีลำดับความสำคัญเหนือ endpoint ที่ใช้ร่วมกัน |
+| `OTEL_EXPORTER_OTLP_ENDPOINT` | แทนที่ `diagnostics.otel.endpoint` หากค่านี้มี `/v1/traces`, `/v1/metrics`, หรือ `/v1/logs` อยู่แล้ว จะใช้ค่านั้นตามเดิม |
+| `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` / `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` / `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` | การแทนที่ endpoint เฉพาะสัญญาณที่ใช้เมื่อไม่ได้ตั้งค่าคีย์กำหนดค่า `diagnostics.otel.*Endpoint` ที่ตรงกัน การกำหนดค่าเฉพาะสัญญาณมีสิทธิเหนือ env เฉพาะสัญญาณ ซึ่งมีสิทธิเหนือ endpoint ที่ใช้ร่วมกัน |
| `OTEL_SERVICE_NAME` | แทนที่ `diagnostics.otel.serviceName` |
-| `OTEL_EXPORTER_OTLP_PROTOCOL` | แทนที่โปรโตคอลบนสายสื่อสาร (ปัจจุบันใช้เฉพาะ `http/protobuf` เท่านั้น) |
-| `OTEL_SEMCONV_STABILITY_OPT_IN` | ตั้งเป็น `gen_ai_latest_experimental` เพื่อส่งออกแอตทริบิวต์ span GenAI เชิงทดลองล่าสุด (`gen_ai.provider.name`) แทน `gen_ai.system` แบบเดิม เมตริก GenAI ใช้แอตทริบิวต์เชิงความหมายที่มีขอบเขตและ cardinality ต่ำเสมอ |
-| `OPENCLAW_OTEL_PRELOADED` | ตั้งเป็น `1` เมื่อ preload หรือโปรเซส host อื่นลงทะเบียน OpenTelemetry SDK แบบ global ไว้แล้ว จากนั้น Plugin จะข้ามวงจรชีวิต NodeSDK ของตัวเอง แต่ยังคงเชื่อม listener การวินิจฉัยและเคารพ `traces`/`metrics`/`logs` |
+| `OTEL_EXPORTER_OTLP_PROTOCOL` | แทนที่โปรโตคอลบนสายสัญญาณ (ปัจจุบันรองรับเฉพาะ `http/protobuf`) |
+| `OTEL_SEMCONV_STABILITY_OPT_IN` | ตั้งเป็น `gen_ai_latest_experimental` เพื่อส่งออกแอตทริบิวต์ span ของ GenAI รุ่นทดลองล่าสุด (`gen_ai.provider.name`) แทน `gen_ai.system` แบบเดิม เมตริก GenAI จะใช้แอตทริบิวต์เชิงความหมายที่มีขอบเขตและมีคาร์ดินาลิตีต่ำเสมอ |
+| `OPENCLAW_OTEL_PRELOADED` | ตั้งเป็น `1` เมื่อ preload หรือโปรเซสโฮสต์อื่นได้ลงทะเบียน OpenTelemetry SDK ส่วนกลางไว้แล้ว จากนั้น Plugin จะข้ามวงจรชีวิต NodeSDK ของตัวเอง แต่ยังคงเชื่อม listener diagnostics และเคารพ `traces`/`metrics`/`logs` |
## ความเป็นส่วนตัวและการจับเนื้อหา
-เนื้อหาดิบของโมเดล/เครื่องมือจะ **ไม่** ถูกส่งออกโดยค่าเริ่มต้น span มีเฉพาะ
-ตัวระบุที่มีขอบเขต (ช่องทาง, provider, โมเดล, หมวดหมู่ข้อผิดพลาด, request id แบบ hash เท่านั้น)
-และจะไม่รวมข้อความ prompt, ข้อความตอบกลับ, อินพุตเครื่องมือ, เอาต์พุตเครื่องมือ หรือ
+เนื้อหาดิบของโมเดล/เครื่องมือจะ **ไม่** ถูกส่งออกตามค่าเริ่มต้น Span จะมีตัวระบุ
+แบบมีขอบเขต (ช่องทาง, provider, โมเดล, หมวดหมู่ข้อผิดพลาด, id คำขอแบบ hash-only)
+และจะไม่รวมข้อความ prompt, ข้อความตอบกลับ, อินพุตเครื่องมือ, เอาต์พุตเครื่องมือ, หรือ
คีย์เซสชัน
-คำขอโมเดลขาออกอาจมี header W3C `traceparent` header นี้
-สร้างจากบริบทเทรซการวินิจฉัยที่ OpenClaw เป็นเจ้าของสำหรับการเรียกโมเดลที่ทำงานอยู่เท่านั้น
-header `traceparent` ที่ผู้เรียกส่งมาเดิมจะถูกแทนที่ ดังนั้น Plugin หรือ
-ตัวเลือก provider แบบกำหนดเองจึงไม่สามารถปลอม ancestry ของเทรซข้ามบริการได้
+คำขอโมเดลขาออกอาจมีส่วนหัว W3C `traceparent` ส่วนหัวนั้นจะถูกสร้างจาก
+บริบทเทรซ diagnostics ที่ OpenClaw เป็นเจ้าของสำหรับการเรียกโมเดลที่ใช้งานอยู่เท่านั้น
+ส่วนหัว `traceparent` ที่ผู้เรียกส่งมาเดิมจะถูกแทนที่ ดังนั้น Plugin หรือ
+ตัวเลือก provider แบบกำหนดเองจะปลอมแปลงสายบรรพบุรุษเทรซข้ามบริการไม่ได้
ตั้งค่า `diagnostics.otel.captureContent.*` เป็น `true` เฉพาะเมื่อ collector และ
-นโยบายการเก็บรักษาของคุณได้รับอนุมัติสำหรับข้อความ prompt, คำตอบ, เครื่องมือ หรือ system-prompt
-แต่ละคีย์ย่อยต้องเลือกเปิดแยกกัน:
+นโยบายการเก็บรักษาของคุณได้รับอนุมัติสำหรับข้อความ prompt, คำตอบ, เครื่องมือ, หรือ system-prompt
+แต่ละคีย์ย่อยเป็นแบบ opt-in แยกกัน:
- `inputMessages` — เนื้อหา prompt ของผู้ใช้
- `outputMessages` — เนื้อหาคำตอบของโมเดล
-- `toolInputs` — payload อาร์กิวเมนต์เครื่องมือ
-- `toolOutputs` — payload ผลลัพธ์เครื่องมือ
-- `systemPrompt` — prompt ระบบ/ผู้พัฒนาที่ประกอบแล้ว
+- `toolInputs` — payload อาร์กิวเมนต์ของเครื่องมือ
+- `toolOutputs` — payload ผลลัพธ์ของเครื่องมือ
+- `systemPrompt` — prompt ระบบ/นักพัฒนาที่ประกอบแล้ว
-เมื่อเปิดใช้งานคีย์ย่อยใดก็ตาม span ของโมเดลและเครื่องมือจะได้รับแอตทริบิวต์
-`openclaw.content.*` ที่มีขอบเขตและถูก redacted สำหรับคลาสนั้นเท่านั้น
+เมื่อเปิดใช้งานคีย์ย่อยใดๆ Span ของโมเดลและเครื่องมือจะได้รับแอตทริบิวต์
+`openclaw.content.*` แบบมีขอบเขตและผ่านการปกปิด สำหรับคลาสนั้นเท่านั้น
## การสุ่มตัวอย่างและการ flush
- **เทรซ:** `diagnostics.otel.sampleRate` (เฉพาะ root-span, `0.0` ทิ้งทั้งหมด,
`1.0` เก็บทั้งหมด)
- **เมตริก:** `diagnostics.otel.flushIntervalMs` (ขั้นต่ำ `1000`)
-- **ล็อก:** ล็อก OTLP เคารพ `logging.level` (ระดับล็อกไฟล์) โดยใช้
- เส้นทาง redaction ของเรคคอร์ดล็อกการวินิจฉัย ไม่ใช่การจัดรูปแบบคอนโซล การติดตั้งที่มีปริมาณสูง
- ควรใช้การสุ่มตัวอย่าง/การกรองของ OTLP collector แทนการสุ่มตัวอย่างภายในเครื่อง
-- **การเชื่อมโยงล็อกไฟล์:** ล็อกไฟล์ JSONL จะมี `traceId`,
- `spanId`, `parentSpanId` และ `traceFlags` ระดับบนสุด เมื่อการเรียกล็อกมี
- บริบทเทรซการวินิจฉัยที่ถูกต้อง ซึ่งช่วยให้ตัวประมวลผลล็อกเชื่อมบรรทัดล็อกภายในเครื่องกับ
- span ที่ส่งออกได้
+- **ล็อก:** ล็อก OTLP เคารพ `logging.level` (ระดับล็อกไฟล์) โดยใช้เส้นทางปกปิดเรคคอร์ดล็อก
+ diagnostics ไม่ใช่การจัดรูปแบบคอนโซล การติดตั้งที่มีปริมาณสูง
+ ควรใช้การสุ่มตัวอย่าง/กรองที่ OTLP collector มากกว่าการสุ่มตัวอย่างในเครื่อง
+- **การเชื่อมโยงกับ file-log:** ล็อกไฟล์ JSONL จะมี `traceId`,
+ `spanId`, `parentSpanId`, และ `traceFlags` ระดับบนสุดเมื่อการเรียกล็อกมี
+ บริบทเทรซ diagnostics ที่ถูกต้อง ทำให้ตัวประมวลผลล็อกเชื่อมบรรทัดล็อกในเครื่องกับ
+ Span ที่ส่งออกได้
- **การเชื่อมโยงคำขอ:** คำขอ HTTP ของ Gateway และเฟรม WebSocket จะสร้าง
- scope เทรซคำขอภายใน ล็อกและเหตุการณ์การวินิจฉัยภายใน scope นั้น
- จะสืบทอดเทรซคำขอโดยค่าเริ่มต้น ขณะที่ span ของการรัน agent และการเรียกโมเดล
- จะถูกสร้างเป็นลูก เพื่อให้ header `traceparent` ของ provider อยู่บนเทรซเดียวกัน
+ ขอบเขตเทรซคำขอภายใน ล็อกและเหตุการณ์ diagnostics ภายในขอบเขตนั้น
+ จะสืบทอดเทรซคำขอตามค่าเริ่มต้น ขณะที่ Span การรันเอเจนต์และการเรียกโมเดล
+ จะถูกสร้างเป็นลูก เพื่อให้ส่วนหัว `traceparent` ของ provider อยู่ในเทรซเดียวกัน
## เมตริกที่ส่งออก
@@ -180,14 +179,14 @@ header `traceparent` ที่ผู้เรียกส่งมาเดิ
- `openclaw.cost.usd` (counter, attrs: `openclaw.channel`, `openclaw.provider`, `openclaw.model`)
- `openclaw.run.duration_ms` (histogram, attrs: `openclaw.channel`, `openclaw.provider`, `openclaw.model`)
- `openclaw.context.tokens` (histogram, attrs: `openclaw.context`, `openclaw.channel`, `openclaw.provider`, `openclaw.model`)
-- `gen_ai.client.token.usage` (histogram, เมตริกตามข้อตกลงเชิงความหมายของ GenAI, attrs: `gen_ai.token.type` = `input`/`output`, `gen_ai.provider.name`, `gen_ai.operation.name`, `gen_ai.request.model`)
-- `gen_ai.client.operation.duration` (histogram, วินาที, เมตริกตามข้อตกลงเชิงความหมายของ GenAI, attrs: `gen_ai.provider.name`, `gen_ai.operation.name`, `gen_ai.request.model`, `error.type` แบบไม่บังคับ)
-- `openclaw.model_call.duration_ms` (histogram, attrs: `openclaw.provider`, `openclaw.model`, `openclaw.api`, `openclaw.transport`, รวมถึง `openclaw.errorCategory` และ `openclaw.failureKind` บนข้อผิดพลาดที่จัดประเภทแล้ว)
-- `openclaw.model_call.request_bytes` (histogram, ขนาด byte UTF-8 ของ payload คำขอโมเดลสุดท้าย; ไม่มีเนื้อหา payload ดิบ)
-- `openclaw.model_call.response_bytes` (histogram, ขนาด byte UTF-8 ของเหตุการณ์คำตอบโมเดลแบบ streamed; ไม่มีเนื้อหาคำตอบดิบ)
-- `openclaw.model_call.time_to_first_byte_ms` (histogram, เวลาที่ผ่านไปก่อนเหตุการณ์คำตอบแบบ streamed แรก)
+- `gen_ai.client.token.usage` (histogram, เมตริก GenAI semantic-conventions, attrs: `gen_ai.token.type` = `input`/`output`, `gen_ai.provider.name`, `gen_ai.operation.name`, `gen_ai.request.model`)
+- `gen_ai.client.operation.duration` (histogram, วินาที, เมตริก GenAI semantic-conventions, attrs: `gen_ai.provider.name`, `gen_ai.operation.name`, `gen_ai.request.model`, `error.type` แบบไม่บังคับ)
+- `openclaw.model_call.duration_ms` (histogram, attrs: `openclaw.provider`, `openclaw.model`, `openclaw.api`, `openclaw.transport`, รวมถึง `openclaw.errorCategory` และ `openclaw.failureKind` เมื่อเป็นข้อผิดพลาดที่จัดประเภทแล้ว)
+- `openclaw.model_call.request_bytes` (histogram, ขนาดไบต์ UTF-8 ของ payload คำขอโมเดลสุดท้าย; ไม่มีเนื้อหา payload ดิบ)
+- `openclaw.model_call.response_bytes` (histogram, ขนาดไบต์ UTF-8 ของเหตุการณ์คำตอบโมเดลแบบสตรีม; ไม่มีเนื้อหาคำตอบดิบ)
+- `openclaw.model_call.time_to_first_byte_ms` (histogram, เวลาที่ผ่านไปก่อนเหตุการณ์คำตอบแบบสตรีมแรก)
-### การไหลของข้อความ
+### โฟลว์ข้อความ
- `openclaw.webhook.received` (counter, attrs: `openclaw.channel`, `openclaw.webhook`)
- `openclaw.webhook.error` (counter, attrs: `openclaw.channel`, `openclaw.webhook`)
@@ -205,107 +204,107 @@ header `traceparent` ที่ผู้เรียกส่งมาเดิ
- `openclaw.queue.depth` (histogram, attrs: `openclaw.lane` หรือ `openclaw.channel=heartbeat`)
- `openclaw.queue.wait_ms` (histogram, attrs: `openclaw.lane`)
- `openclaw.session.state` (counter, attrs: `openclaw.state`, `openclaw.reason`)
-- `openclaw.session.stuck` (counter, attrs: `openclaw.state`; ส่งออกเฉพาะสำหรับการทำบัญชีเซสชันค้างที่ไม่มีงานทำงานอยู่)
-- `openclaw.session.stuck_age_ms` (histogram, attrs: `openclaw.state`; ส่งออกเฉพาะสำหรับการทำบัญชีเซสชันค้างที่ไม่มีงานทำงานอยู่)
+- `openclaw.session.stuck` (counter, attrs: `openclaw.state`; ส่งออกเฉพาะสำหรับการบันทึกสถานะเซสชันค้างที่ไม่มีงานทำงานอยู่)
+- `openclaw.session.stuck_age_ms` (histogram, attrs: `openclaw.state`; ส่งออกเฉพาะสำหรับการบันทึกสถานะเซสชันค้างที่ไม่มีงานทำงานอยู่)
- `openclaw.run.attempt` (counter, attrs: `openclaw.attempt`)
-### เทเลเมทรีความมีชีวิตของเซสชัน
+### Telemetry ความมีชีวิตของเซสชัน
-`diagnostics.stuckSessionWarnMs` คือเกณฑ์อายุที่ไม่มีความคืบหน้าสำหรับการวินิจฉัย
-ความมีชีวิตของเซสชัน เซสชัน `processing` จะไม่นับอายุไปสู่เกณฑ์นี้
-ขณะที่ OpenClaw สังเกตเห็นความคืบหน้าของ reply, tool, status, block หรือ ACP runtime
-typing keepalive จะไม่นับเป็นความคืบหน้า ดังนั้นโมเดลหรือ harness ที่เงียบอยู่
-ยังคงถูกตรวจพบได้
+`diagnostics.stuckSessionWarnMs` คือเกณฑ์อายุที่ไม่มีความคืบหน้าสำหรับ diagnostics
+ความมีชีวิตของเซสชัน เซสชัน `processing` จะไม่นับอายุเข้าสู่เกณฑ์นี้
+ขณะที่ OpenClaw สังเกตเห็นความคืบหน้า runtime ของการตอบกลับ, เครื่องมือ, สถานะ, บล็อก, หรือ ACP
+การส่ง keepalive ขณะพิมพ์จะไม่นับเป็นความคืบหน้า ดังนั้นโมเดลหรือ harness ที่เงียบ
+ยังคงถูกตรวจจับได้
OpenClaw จัดประเภทเซสชันตามงานที่ยังสังเกตเห็นได้:
-- `session.long_running`: งานแบบฝังตัวที่ทำงานอยู่ การเรียกโมเดล หรือการเรียกเครื่องมือ
- ยังมีความคืบหน้าอยู่.
-- `session.stalled`: มีงานที่ทำงานอยู่ แต่การรันที่ทำงานอยู่นั้นไม่ได้รายงาน
- ความคืบหน้าล่าสุด. การรันแบบฝังตัวที่หยุดชะงักจะอยู่ในโหมดสังเกตการณ์เท่านั้นก่อน จากนั้น
- จะทำ abort-drain หลังผ่านไปอย่างน้อย 10 นาทีและ 5 เท่าของ `diagnostics.stuckSessionWarnMs`
- โดยไม่มีความคืบหน้า เพื่อให้เทิร์นที่อยู่ในคิวด้านหลังเลนนั้นกลับมาทำงานต่อได้.
-- `session.stuck`: การบันทึกสถานะเซสชันที่ค้างและไม่มีงานที่ทำงานอยู่. สิ่งนี้จะปล่อย
- เลนเซสชันที่ได้รับผลกระทบทันที.
+- `session.long_running`: งานฝังตัวที่ยังทำงานอยู่ การเรียกโมเดล หรือการเรียกเครื่องมือยังคง
+ มีความคืบหน้า
+- `session.stalled`: มีงานที่ยังทำงานอยู่ แต่รันที่ทำงานอยู่ไม่ได้รายงาน
+ ความคืบหน้าล่าสุด รันฝังตัวที่ชะงักจะยังอยู่ในโหมดสังเกตการณ์เท่านั้นในตอนแรก จากนั้น
+ จะยกเลิกและระบายคิวหลังผ่านไปอย่างน้อย 10 นาทีและ 5 เท่าของ `diagnostics.stuckSessionWarnMs`
+ โดยไม่มีความคืบหน้า เพื่อให้เทิร์นที่เข้าคิวอยู่หลังเลนนั้นกลับมาทำงานต่อได้
+- `session.stuck`: บัญชีสถานะเซสชันที่ค้างเก่าโดยไม่มีงานที่ทำงานอยู่ กรณีนี้จะปล่อย
+ เลนเซสชันที่ได้รับผลกระทบทันที
-มีเพียง `session.stuck` เท่านั้นที่ปล่อยตัวนับ `openclaw.session.stuck`,
-ฮิสโตแกรม `openclaw.session.stuck_age_ms` และสแปน `openclaw.session.stuck`.
-การวินิจฉัย `session.stuck` ซ้ำจะถอยช่วงเวลาระหว่างการรายงานขณะที่เซสชันยังคง
-ไม่เปลี่ยนแปลง ดังนั้นแดชบอร์ดควรแจ้งเตือนเมื่อมีการเพิ่มขึ้นต่อเนื่อง แทนที่จะเตือนทุก
-จังหวะ Heartbeat. สำหรับปุ่มปรับแต่งการกำหนดค่าและค่าเริ่มต้น โปรดดู
-[ข้อมูลอ้างอิงการกำหนดค่า](/th/gateway/configuration-reference#diagnostics).
+เฉพาะ `session.stuck` เท่านั้นที่ส่งออกตัวนับ `openclaw.session.stuck`,
+ฮิสโตแกรม `openclaw.session.stuck_age_ms` และ
+สแปน `openclaw.session.stuck` การวินิจฉัย `session.stuck` ที่เกิดซ้ำจะเว้นระยะถอยหลังขณะที่เซสชันยังคง
+ไม่เปลี่ยนแปลง ดังนั้นแดชบอร์ดควรแจ้งเตือนเมื่อมีการเพิ่มขึ้นอย่างต่อเนื่อง แทนที่จะเตือนทุก
+จังหวะ Heartbeat สำหรับปุ่มปรับการกำหนดค่าและค่าเริ่มต้น โปรดดู
+[ข้อมูลอ้างอิงการกำหนดค่า](/th/gateway/configuration-reference#diagnostics)
### วงจรชีวิตของฮาร์เนส
-- `openclaw.harness.duration_ms` (ฮิสโตแกรม, attrs: `openclaw.harness.id`, `openclaw.harness.plugin`, `openclaw.outcome`, `openclaw.harness.phase` เมื่อเกิดข้อผิดพลาด)
+- `openclaw.harness.duration_ms` (ฮิสโตแกรม, แอตทริบิวต์: `openclaw.harness.id`, `openclaw.harness.plugin`, `openclaw.outcome`, `openclaw.harness.phase` เมื่อเกิดข้อผิดพลาด)
-### การดำเนินการคำสั่ง
+### Exec
-- `openclaw.exec.duration_ms` (ฮิสโตแกรม, attrs: `openclaw.exec.target`, `openclaw.exec.mode`, `openclaw.outcome`, `openclaw.failureKind`)
+- `openclaw.exec.duration_ms` (ฮิสโตแกรม, แอตทริบิวต์: `openclaw.exec.target`, `openclaw.exec.mode`, `openclaw.outcome`, `openclaw.failureKind`)
-### กลไกภายในของการวินิจฉัย (หน่วยความจำและลูปเครื่องมือ)
+### ภายในของการวินิจฉัย (หน่วยความจำและลูปเครื่องมือ)
-- `openclaw.memory.heap_used_bytes` (ฮิสโตแกรม, attrs: `openclaw.memory.kind`)
+- `openclaw.memory.heap_used_bytes` (ฮิสโตแกรม, แอตทริบิวต์: `openclaw.memory.kind`)
- `openclaw.memory.rss_bytes` (ฮิสโตแกรม)
-- `openclaw.memory.pressure` (ตัวนับ, attrs: `openclaw.memory.level`)
-- `openclaw.tool.loop.iterations` (ตัวนับ, attrs: `openclaw.toolName`, `openclaw.outcome`)
-- `openclaw.tool.loop.duration_ms` (ฮิสโตแกรม, attrs: `openclaw.toolName`, `openclaw.outcome`)
+- `openclaw.memory.pressure` (ตัวนับ, แอตทริบิวต์: `openclaw.memory.level`)
+- `openclaw.tool.loop.iterations` (ตัวนับ, แอตทริบิวต์: `openclaw.toolName`, `openclaw.outcome`)
+- `openclaw.tool.loop.duration_ms` (ฮิสโตแกรม, แอตทริบิวต์: `openclaw.toolName`, `openclaw.outcome`)
## สแปนที่ส่งออก
- `openclaw.model.usage`
- `openclaw.channel`, `openclaw.provider`, `openclaw.model`
- `openclaw.tokens.*` (input/output/cache_read/cache_write/total)
- - `gen_ai.system` โดยค่าเริ่มต้น หรือ `gen_ai.provider.name` เมื่อเลือกใช้ข้อตกลงเชิงความหมาย GenAI ล่าสุด
+ - `gen_ai.system` เป็นค่าเริ่มต้น หรือ `gen_ai.provider.name` เมื่อเลือกใช้ข้อตกลงเชิงความหมาย GenAI ล่าสุด
- `gen_ai.request.model`, `gen_ai.operation.name`, `gen_ai.usage.*`
- `openclaw.run`
- `openclaw.outcome`, `openclaw.channel`, `openclaw.provider`, `openclaw.model`, `openclaw.errorCategory`
- `openclaw.model.call`
- - `gen_ai.system` โดยค่าเริ่มต้น หรือ `gen_ai.provider.name` เมื่อเลือกใช้ข้อตกลงเชิงความหมาย GenAI ล่าสุด
+ - `gen_ai.system` เป็นค่าเริ่มต้น หรือ `gen_ai.provider.name` เมื่อเลือกใช้ข้อตกลงเชิงความหมาย GenAI ล่าสุด
- `gen_ai.request.model`, `gen_ai.operation.name`, `openclaw.provider`, `openclaw.model`, `openclaw.api`, `openclaw.transport`
- - `openclaw.errorCategory` และ `openclaw.failureKind` ที่ไม่บังคับ เมื่อเกิดข้อผิดพลาด
+ - `openclaw.errorCategory` และ `openclaw.failureKind` ที่เป็นตัวเลือกเมื่อเกิดข้อผิดพลาด
- `openclaw.model_call.request_bytes`, `openclaw.model_call.response_bytes`, `openclaw.model_call.time_to_first_byte_ms`
- - `openclaw.provider.request_id_hash` (แฮชแบบจำกัดขอบเขตที่ใช้ SHA ของรหัสคำขอผู้ให้บริการต้นทาง; จะไม่ส่งออกรหัสดิบ)
+ - `openclaw.provider.request_id_hash` (แฮชที่มีขอบเขตและอิงตาม SHA ของรหัสคำขอผู้ให้บริการต้นทาง; ไม่มีการส่งออกรหัสดิบ)
- `openclaw.harness.run`
- `openclaw.harness.id`, `openclaw.harness.plugin`, `openclaw.outcome`, `openclaw.provider`, `openclaw.model`, `openclaw.channel`
- - เมื่อเสร็จสิ้น: `openclaw.harness.result_classification`, `openclaw.harness.yield_detected`, `openclaw.harness.items.started`, `openclaw.harness.items.completed`, `openclaw.harness.items.active`
- - เมื่อเกิดข้อผิดพลาด: `openclaw.harness.phase`, `openclaw.errorCategory`, `openclaw.harness.cleanup_failed` ที่ไม่บังคับ
+ - เมื่อเสร็จสมบูรณ์: `openclaw.harness.result_classification`, `openclaw.harness.yield_detected`, `openclaw.harness.items.started`, `openclaw.harness.items.completed`, `openclaw.harness.items.active`
+ - เมื่อเกิดข้อผิดพลาด: `openclaw.harness.phase`, `openclaw.errorCategory`, `openclaw.harness.cleanup_failed` ที่เป็นตัวเลือก
- `openclaw.tool.execution`
- `gen_ai.tool.name`, `openclaw.toolName`, `openclaw.errorCategory`, `openclaw.tool.params.*`
- `openclaw.exec`
- `openclaw.exec.target`, `openclaw.exec.mode`, `openclaw.outcome`, `openclaw.failureKind`, `openclaw.exec.command_length`, `openclaw.exec.exit_code`, `openclaw.exec.timed_out`
- `openclaw.webhook.processed`
- - `openclaw.channel`, `openclaw.webhook`, `openclaw.chatId`
+ - `openclaw.channel`, `openclaw.webhook`
- `openclaw.webhook.error`
- - `openclaw.channel`, `openclaw.webhook`, `openclaw.chatId`, `openclaw.error`
+ - `openclaw.channel`, `openclaw.webhook`, `openclaw.error`
- `openclaw.message.processed`
- - `openclaw.channel`, `openclaw.outcome`, `openclaw.chatId`, `openclaw.messageId`, `openclaw.reason`
+ - `openclaw.channel`, `openclaw.outcome`, `openclaw.reason`
- `openclaw.message.delivery`
- `openclaw.channel`, `openclaw.delivery.kind`, `openclaw.outcome`, `openclaw.errorCategory`, `openclaw.delivery.result_count`
- `openclaw.session.stuck`
- `openclaw.state`, `openclaw.ageMs`, `openclaw.queueDepth`
- `openclaw.context.assembled`
- - `openclaw.prompt.size`, `openclaw.history.size`, `openclaw.context.tokens`, `openclaw.errorCategory` (ไม่มีเนื้อหาพรอมต์ ประวัติ การตอบกลับ หรือคีย์เซสชัน)
+ - `openclaw.prompt.size`, `openclaw.history.size`, `openclaw.context.tokens`, `openclaw.errorCategory` (ไม่มีเนื้อหาพรอมป์ ประวัติ การตอบกลับ หรือคีย์เซสชัน)
- `openclaw.tool.loop`
- `openclaw.toolName`, `openclaw.outcome`, `openclaw.iterations`, `openclaw.errorCategory` (ไม่มีข้อความลูป พารามิเตอร์ หรือเอาต์พุตเครื่องมือ)
- `openclaw.memory.pressure`
- `openclaw.memory.level`, `openclaw.memory.heap_used_bytes`, `openclaw.memory.rss_bytes`
-เมื่อเปิดใช้งานการจับเนื้อหาอย่างชัดเจน สแปนของโมเดลและเครื่องมือยังสามารถ
-รวมแอตทริบิวต์ `openclaw.content.*` ที่จำกัดขอบเขตและปกปิดข้อมูลแล้ว สำหรับคลาส
-เนื้อหาเฉพาะที่คุณเลือกใช้.
+เมื่อเปิดใช้การจับเนื้อหาอย่างชัดเจน สแปนของโมเดลและเครื่องมือยังสามารถ
+รวมแอตทริบิวต์ `openclaw.content.*` ที่มีขอบเขตและผ่านการปกปิดข้อมูล สำหรับ
+คลาสเนื้อหาเฉพาะที่คุณเลือกใช้
-## แค็ตตาล็อกเหตุการณ์การวินิจฉัย
+## แค็ตตาล็อกเหตุการณ์วินิจฉัย
-เหตุการณ์ด้านล่างรองรับเมตริกและสแปนข้างต้น. Plugin ยังสามารถสมัครรับ
-เหตุการณ์เหล่านี้โดยตรงได้โดยไม่ต้องส่งออก OTLP.
+เหตุการณ์ด้านล่างรองรับเมตริกและสแปนข้างต้น Plugin ยังสามารถสมัครรับ
+เหตุการณ์เหล่านี้โดยตรงได้โดยไม่ต้องส่งออก OTLP
**การใช้งานโมเดล**
-- `model.usage` — โทเค็น ต้นทุน ระยะเวลา บริบท ผู้ให้บริการ/โมเดล/ช่องทาง
- รหัสเซสชัน. `usage` คือการบัญชีระดับผู้ให้บริการ/เทิร์นสำหรับต้นทุนและเทเลเมทรี;
- `context.used` คือสแนปช็อตพรอมต์/บริบทปัจจุบัน และอาจต่ำกว่า
- `usage.total` ของผู้ให้บริการเมื่อมีอินพุตที่แคชไว้หรือการเรียกลูปเครื่องมือเข้ามาเกี่ยวข้อง.
+- `model.usage` — โทเค็น ค่าใช้จ่าย ระยะเวลา บริบท ผู้ให้บริการ/โมเดล/ช่องทาง
+ รหัสเซสชัน `usage` คือบัญชีระดับผู้ให้บริการ/เทิร์นสำหรับค่าใช้จ่ายและเทเลเมทรี;
+ `context.used` คือสแนปช็อตพรอมป์/บริบทปัจจุบัน และอาจต่ำกว่า
+ `usage.total` ของผู้ให้บริการเมื่อมีอินพุตที่แคชไว้หรือการเรียกลูปเครื่องมือเข้ามาเกี่ยวข้อง
**โฟลว์ข้อความ**
@@ -318,26 +317,26 @@ OpenClaw จัดประเภทเซสชันตามงานที
- `queue.lane.enqueue` / `queue.lane.dequeue`
- `session.state` / `session.long_running` / `session.stalled` / `session.stuck`
- `run.attempt` / `run.progress`
-- `diagnostic.heartbeat` (ตัวนับรวม: webhooks/queue/session)
+- `diagnostic.heartbeat` (ตัวนับรวม: Webhook/คิว/เซสชัน)
**วงจรชีวิตของฮาร์เนส**
- `harness.run.started` / `harness.run.completed` / `harness.run.error` —
- วงจรชีวิตต่อการรันสำหรับฮาร์เนสของเอเจนต์. รวม `harnessId`, `pluginId`
- ที่ไม่บังคับ ผู้ให้บริการ/โมเดล/ช่องทาง และรหัสการรัน. เมื่อเสร็จสิ้นจะเพิ่ม
- `durationMs`, `outcome`, `resultClassification` ที่ไม่บังคับ, `yieldDetected`,
- และจำนวน `itemLifecycle`. ข้อผิดพลาดจะเพิ่ม `phase`
+ วงจรชีวิตต่อรันสำหรับฮาร์เนสของเอเจนต์ รวม `harnessId`, `pluginId` ที่เป็นตัวเลือก
+ ผู้ให้บริการ/โมเดล/ช่องทาง และรหัสรัน การเสร็จสมบูรณ์จะเพิ่ม
+ `durationMs`, `outcome`, `resultClassification` ที่เป็นตัวเลือก, `yieldDetected`,
+ และจำนวน `itemLifecycle` ข้อผิดพลาดจะเพิ่ม `phase`
(`prepare`/`start`/`send`/`resolve`/`cleanup`), `errorCategory` และ
- `cleanupFailed` ที่ไม่บังคับ.
+ `cleanupFailed` ที่เป็นตัวเลือก
-**การดำเนินการคำสั่ง**
+**Exec**
- `exec.process.completed` — ผลลัพธ์ปลายทาง ระยะเวลา เป้าหมาย โหมด รหัสออก
- และชนิดความล้มเหลว. จะไม่รวมข้อความคำสั่งและไดเรกทอรีทำงาน.
+ และชนิดความล้มเหลว ไม่รวมข้อความคำสั่งและไดเรกทอรีทำงาน
-## เมื่อไม่มีตัวส่งออก
+## ไม่มีตัวส่งออก
-คุณสามารถทำให้เหตุการณ์การวินิจฉัยพร้อมใช้งานสำหรับ Plugin หรือ sink แบบกำหนดเองได้โดยไม่ต้อง
+คุณสามารถทำให้เหตุการณ์วินิจฉัยพร้อมใช้งานสำหรับ Plugin หรือปลายทางแบบกำหนดเองได้โดยไม่ต้อง
รัน `diagnostics-otel`:
```json5
@@ -346,8 +345,8 @@ OpenClaw จัดประเภทเซสชันตามงานที
}
```
-สำหรับเอาต์พุตดีบักแบบเจาะจงโดยไม่ต้องเพิ่ม `logging.level` ให้ใช้แฟล็กการวินิจฉัย.
-แฟล็กไม่สนใจตัวพิมพ์เล็กใหญ่และรองรับไวลด์การ์ด (เช่น `telegram.*` หรือ
+สำหรับเอาต์พุตดีบักแบบเจาะจงโดยไม่เพิ่ม `logging.level` ให้ใช้แฟล็กการวินิจฉัย
+แฟล็กไม่คำนึงถึงตัวพิมพ์เล็กใหญ่และรองรับไวลด์การ์ด (เช่น `telegram.*` หรือ
`*`):
```json5
@@ -356,15 +355,15 @@ OpenClaw จัดประเภทเซสชันตามงานที
}
```
-หรือใช้เป็นการ override ผ่าน env แบบครั้งเดียว:
+หรือใช้เป็นการ override env แบบครั้งเดียว:
```bash
OPENCLAW_DIAGNOSTICS=telegram.http,telegram.payload openclaw gateway
```
-เอาต์พุตของแฟล็กจะไปที่ไฟล์บันทึกมาตรฐาน (`logging.file`) และยังคงถูก
-ปกปิดข้อมูลโดย `logging.redactSensitive`. คู่มือฉบับเต็ม:
-[แฟล็กการวินิจฉัย](/th/diagnostics/flags).
+เอาต์พุตแฟล็กจะไปยังไฟล์บันทึกมาตรฐาน (`logging.file`) และยังคง
+ถูกปกปิดข้อมูลโดย `logging.redactSensitive` คู่มือฉบับเต็ม:
+[แฟล็กการวินิจฉัย](/th/diagnostics/flags)
## ปิดใช้งาน
@@ -374,13 +373,13 @@ OPENCLAW_DIAGNOSTICS=telegram.http,telegram.payload openclaw gateway
}
```
-คุณยังสามารถไม่นำ `diagnostics-otel` ใส่ใน `plugins.allow` หรือรัน
-`openclaw plugins disable diagnostics-otel`.
+คุณยังสามารถไม่ใส่ `diagnostics-otel` ไว้ใน `plugins.allow` หรือรัน
+`openclaw plugins disable diagnostics-otel` ได้
## ที่เกี่ยวข้อง
-- [การบันทึก](/th/logging) — บันทึกไฟล์ เอาต์พุตคอนโซล การ tail ผ่าน CLI และแท็บบันทึกของ Control UI
-- [กลไกภายในของการบันทึก Gateway](/th/gateway/logging) — รูปแบบบันทึก WS คำนำหน้าระบบย่อย และการจับคอนโซล
+- [การบันทึก](/th/logging) — บันทึกไฟล์ เอาต์พุตคอนโซล การ tail จาก CLI และแท็บ Logs ของ Control UI
+- [ภายในของการบันทึก Gateway](/th/gateway/logging) — รูปแบบบันทึก WS คำนำหน้าระบบย่อย และการจับคอนโซล
- [แฟล็กการวินิจฉัย](/th/diagnostics/flags) — แฟล็กบันทึกดีบักแบบเจาะจง
-- [การส่งออกการวินิจฉัย](/th/gateway/diagnostics) — เครื่องมือ support-bundle สำหรับผู้ปฏิบัติการ (แยกจากการส่งออก OTEL)
-- [ข้อมูลอ้างอิงการกำหนดค่า](/th/gateway/configuration-reference#diagnostics) — ข้อมูลอ้างอิงฟิลด์ `diagnostics.*` แบบครบถ้วน
+- [การส่งออกการวินิจฉัย](/th/gateway/diagnostics) — เครื่องมือบันเดิลสนับสนุนสำหรับผู้ปฏิบัติงาน (แยกจากการส่งออก OTEL)
+- [ข้อมูลอ้างอิงการกำหนดค่า](/th/gateway/configuration-reference#diagnostics) — ข้อมูลอ้างอิงฟิลด์ `diagnostics.*` ฉบับเต็ม
diff --git a/docs/th/gateway/operator-scopes.md b/docs/th/gateway/operator-scopes.md
index 1e9262a64..72e5fbf01 100644
--- a/docs/th/gateway/operator-scopes.md
+++ b/docs/th/gateway/operator-scopes.md
@@ -1,116 +1,118 @@
---
read_when:
- - การดีบักข้อผิดพลาดเกี่ยวกับขอบเขตของผู้ปฏิบัติการที่ขาดหายไป
+ - การดีบักข้อผิดพลาดขอบเขตของโอเปอเรเตอร์ที่ขาดหายไป
- การตรวจสอบการอนุมัติการจับคู่อุปกรณ์หรือ Node
- - การเพิ่มหรือจำแนกประเภทเมธอด RPC ของ Gateway
-summary: บทบาทผู้ปฏิบัติการ ขอบเขต และการตรวจสอบเมื่ออนุมัติสำหรับไคลเอนต์ Gateway
+ - การเพิ่มหรือจัดประเภทเมธอด RPC ของ Gateway
+summary: บทบาทของผู้ปฏิบัติการ ขอบเขต และการตรวจสอบขณะอนุมัติสำหรับไคลเอนต์ Gateway
title: ขอบเขตของผู้ปฏิบัติการ
x-i18n:
- generated_at: "2026-05-03T10:11:45Z"
+ generated_at: "2026-05-04T02:25:17Z"
model: gpt-5.5
provider: openai
- source_hash: 48f59f96b41333af9124ad4083ac5442eedb2d6cebdfff74e3ba256f06d36add
+ source_hash: f05d6bdbf9bdad2aef1c9664bb7ebb4b6241334b8aefac7993104e9977e40450
source_path: gateway/operator-scopes.md
workflow: 16
---
-ขอบเขตของ operator กำหนดว่าไคลเอนต์ Gateway สามารถทำอะไรได้บ้างหลังจากยืนยันตัวตนแล้ว
-ขอบเขตเหล่านี้เป็นมาตรการกำกับใน control plane ภายในโดเมนผู้ดูแล Gateway ที่เชื่อถือได้โดเมนเดียว
-ไม่ใช่การแยกแบบหลายผู้เช่าที่ป้องกันผู้ไม่หวังดี หากคุณต้องการการแยกที่เข้มแข็งระหว่าง
+ขอบเขตของ operator กำหนดว่าไคลเอนต์ Gateway ทำอะไรได้บ้างหลังจากยืนยันตัวตนแล้ว
+ขอบเขตเหล่านี้เป็นราวกันตกของระนาบควบคุมภายในโดเมนผู้ปฏิบัติการ Gateway ที่เชื่อถือได้หนึ่งโดเมน
+ไม่ใช่การแยกแบบหลายผู้เช่าที่ต้านทานผู้ไม่ประสงค์ดี หากคุณต้องการการแยกที่เข้มแข็งระหว่าง
บุคคล ทีม หรือเครื่อง ให้รัน Gateway แยกกันภายใต้ผู้ใช้ OS หรือ
-โฮสต์ที่แยกจากกัน
+โฮสต์ที่แยกกัน
ที่เกี่ยวข้อง: [ความปลอดภัย](/th/gateway/security), [โปรโตคอล Gateway](/th/gateway/protocol),
-[การจับคู่ Gateway](/th/gateway/pairing), [CLI อุปกรณ์](/th/cli/devices).
+[การจับคู่ Gateway](/th/gateway/pairing), [CLI สำหรับอุปกรณ์](/th/cli/devices).
## บทบาท
-ไคลเอนต์ Gateway WebSocket เชื่อมต่อด้วยบทบาทหนึ่งบทบาท:
+ไคลเอนต์ WebSocket ของ Gateway เชื่อมต่อด้วยหนึ่งบทบาท:
-- `operator`: ไคลเอนต์ control plane เช่น CLI, Control UI, ระบบอัตโนมัติ และ
- โปรเซสช่วยเหลือที่เชื่อถือได้
-- `node`: โฮสต์ความสามารถ เช่น macOS, iOS, Android หรือ Node แบบ headless ที่
- เปิดเผยคำสั่งผ่าน `node.invoke`
+- `operator`: ไคลเอนต์ระนาบควบคุม เช่น CLI, Control UI, ระบบอัตโนมัติ และ
+ โพรเซสตัวช่วยที่เชื่อถือได้
+- `node`: โฮสต์ความสามารถ เช่น macOS, iOS, Android หรือโหนดแบบไม่มีส่วนติดต่อผู้ใช้ที่
+ เปิดคำสั่งผ่าน `node.invoke`
-เมธอด RPC ของ operator ต้องใช้บทบาท `operator` เมธอดที่เริ่มจาก Node
+เมธอด RPC ของ operator ต้องใช้บทบาท `operator` เมธอดที่มีต้นทางจาก Node
ต้องใช้บทบาท `node`
## ระดับขอบเขต
| ขอบเขต | ความหมาย |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `operator.read` | สถานะแบบอ่านอย่างเดียว รายการ แค็ตตาล็อก บันทึก การอ่านเซสชัน และการเรียก control plane อื่น ๆ ที่ไม่เปลี่ยนแปลงข้อมูล |
-| `operator.write` | การกระทำของ operator ที่เปลี่ยนแปลงข้อมูลตามปกติ เช่น การส่งข้อความ การเรียกใช้เครื่องมือ การอัปเดตการตั้งค่า talk/voice และการส่งต่อคำสั่ง Node และยังครอบคลุม `operator.read` ด้วย |
-| `operator.admin` | การเข้าถึง control plane ระดับผู้ดูแล ครอบคลุมทุกขอบเขต `operator.*` จำเป็นสำหรับการเปลี่ยนแปลงการกำหนดค่า การอัปเดต native hooks เนมสเปซที่สงวนไว้ซึ่งละเอียดอ่อน และการอนุมัติที่มีความเสี่ยงสูง |
-| `operator.pairing` | การจัดการการจับคู่อุปกรณ์และ Node รวมถึงการแสดงรายการ การอนุมัติ การปฏิเสธ การลบ การหมุนเวียน และการเพิกถอนระเบียนการจับคู่หรือโทเค็นอุปกรณ์ |
+| `operator.read` | สถานะ รายการ แค็ตตาล็อก บันทึก การอ่านเซสชัน และการเรียกระนาบควบคุมอื่นๆ ที่ไม่เปลี่ยนแปลงข้อมูลแบบอ่านอย่างเดียว |
+| `operator.write` | การกระทำของ operator ที่เปลี่ยนแปลงข้อมูลตามปกติ เช่น การส่งข้อความ การเรียกใช้เครื่องมือ การอัปเดตการตั้งค่าการพูดคุย/เสียง และการส่งต่อคำสั่งของ Node รวมถึงผ่านเงื่อนไข `operator.read` ด้วย |
+| `operator.admin` | การเข้าถึงระนาบควบคุมเชิงดูแลระบบ ผ่านเงื่อนไขทุกขอบเขต `operator.*` จำเป็นสำหรับการเปลี่ยนแปลง config, การอัปเดต, native hooks, namespace ที่สงวนไว้และอ่อนไหว และการอนุมัติที่มีความเสี่ยงสูง |
+| `operator.pairing` | การจัดการการจับคู่อุปกรณ์และ Node รวมถึงการแสดงรายการ การอนุมัติ การปฏิเสธ การลบ การหมุนเวียน และการเพิกถอนระเบียนการจับคู่หรือโทเคนอุปกรณ์ |
| `operator.approvals` | API การอนุมัติ exec และ Plugin |
-| `operator.talk.secrets` | การอ่านการกำหนดค่า Talk โดยรวมความลับด้วย |
+| `operator.talk.secrets` | การอ่านการกำหนดค่า Talk โดยรวม secrets |
-ขอบเขต `operator.*` ในอนาคตที่ไม่รู้จักต้องตรงกันทุกประการ เว้นแต่ผู้เรียกมี
+ขอบเขต `operator.*` ที่ไม่รู้จักในอนาคตต้องตรงกันทุกประการ เว้นแต่ผู้เรียกจะมี
`operator.admin`
-## ขอบเขตของเมธอดเป็นเพียงด่านแรกเท่านั้น
+## ขอบเขตของเมธอดเป็นเพียงด่านแรก
-RPC ของ Gateway แต่ละรายการมีขอบเขตเมธอดแบบสิทธิ์น้อยที่สุด ขอบเขตเมธอดนั้นตัดสินว่า
-คำขอสามารถไปถึง handler ได้หรือไม่ จากนั้น handler บางตัวจะใช้การตรวจสอบที่เข้มงวดกว่า
-ในเวลาการอนุมัติ โดยอิงจากสิ่งที่กำลังถูกอนุมัติหรือเปลี่ยนแปลงจริง
+RPC แต่ละรายการของ Gateway มีขอบเขตเมธอดแบบสิทธิ์น้อยที่สุด ขอบเขตเมธอดนั้นตัดสินว่า
+คำขอจะไปถึง handler ได้หรือไม่ จากนั้น handler บางรายการจะใช้การตรวจสอบที่เข้มงวดยิ่งขึ้น
+ในเวลาที่อนุมัติ โดยอิงจากสิ่งที่กำลังถูกอนุมัติหรือเปลี่ยนแปลงจริง
ตัวอย่าง:
- `device.pair.approve` เข้าถึงได้ด้วย `operator.pairing` แต่การอนุมัติ
- อุปกรณ์ operator สามารถออกหรือคงไว้ได้เฉพาะขอบเขตที่ผู้เรียกมีอยู่แล้ว
-- `node.pair.approve` เข้าถึงได้ด้วย `operator.pairing` จากนั้นจะอนุมาน
+ อุปกรณ์ operator สามารถ mint หรือคงไว้เฉพาะขอบเขตที่ผู้เรียกมีอยู่แล้วเท่านั้น
+- `node.pair.approve` เข้าถึงได้ด้วย `operator.pairing` จากนั้นอนุมาน
ขอบเขตการอนุมัติเพิ่มเติมจากรายการคำสั่ง Node ที่รอดำเนินการ
-- โดยปกติ `chat.send` เป็นเมธอดที่มีขอบเขต write แต่ `/config set`
+- `chat.send` โดยปกติเป็นเมธอดในขอบเขตเขียน แต่ `/config set`
และ `/config unset` แบบถาวรต้องใช้ `operator.admin` ที่ระดับคำสั่ง
-สิ่งนี้ทำให้ operator ที่มีขอบเขตต่ำกว่าสามารถทำการจับคู่ที่มีความเสี่ยงต่ำได้
-โดยไม่ต้องทำให้การอนุมัติการจับคู่ทั้งหมดเป็นของผู้ดูแลเท่านั้น
+สิ่งนี้ทำให้ operator ที่มีขอบเขตต่ำกว่าสามารถทำการจับคู่ที่มีความเสี่ยงต่ำได้โดยไม่ต้องทำให้
+การอนุมัติการจับคู่ทั้งหมดเป็นเฉพาะผู้ดูแลระบบเท่านั้น
## การอนุมัติการจับคู่อุปกรณ์
ระเบียนการจับคู่อุปกรณ์เป็นแหล่งข้อมูลถาวรของบทบาทและขอบเขตที่ได้รับอนุมัติ
-อุปกรณ์ที่จับคู่แล้วจะไม่ได้รับสิทธิ์เข้าถึงที่กว้างขึ้นอย่างเงียบ ๆ: การเชื่อมต่อใหม่ที่ขอ
+อุปกรณ์ที่จับคู่แล้วจะไม่ได้รับการเข้าถึงที่กว้างขึ้นอย่างเงียบๆ: การเชื่อมต่อซ้ำที่ขอ
บทบาทที่กว้างขึ้นหรือขอบเขตที่กว้างขึ้นจะสร้างคำขออัปเกรดใหม่ที่รอดำเนินการ
เมื่ออนุมัติคำขออุปกรณ์:
-- คำขอที่ไม่มีบทบาท operator ไม่ต้องการการอนุมัติขอบเขตโทเค็นของ operator
+- คำขอที่ไม่มีบทบาท operator ไม่จำเป็นต้องมีการอนุมัติขอบเขตโทเคนของ operator
- คำขอสำหรับ `operator.read`, `operator.write`, `operator.approvals`,
- `operator.pairing` หรือ `operator.talk.secrets` ต้องให้ผู้เรียกมี
- ขอบเขตเหล่านั้น หรือมี `operator.admin`
+ `operator.pairing` หรือ `operator.talk.secrets` ต้องให้ผู้เรียกถือ
+ ขอบเขตเหล่านั้น หรือ `operator.admin`
- คำขอสำหรับ `operator.admin` ต้องใช้ `operator.admin`
-- คำขอซ่อมแซมที่ไม่มีขอบเขตระบุชัดเจนสามารถสืบทอดขอบเขตโทเค็น operator
- ที่มีอยู่ได้ หากโทเค็นที่มีอยู่นั้นมีขอบเขต admin การอนุมัติยังคงต้องใช้
+- คำขอซ่อมแซมที่ไม่มีขอบเขตชัดเจนสามารถสืบทอดขอบเขตโทเคน operator
+ ที่มีอยู่ได้ หากโทเคนที่มีอยู่นั้นมีขอบเขต admin การอนุมัติยังคงต้องใช้
`operator.admin`
-สำหรับเซสชันโทเค็นของอุปกรณ์ที่จับคู่แล้ว การจัดการจะจำกัดอยู่กับตัวเอง เว้นแต่ผู้เรียก
-มี `operator.admin` ด้วย: ผู้เรียกที่ไม่ใช่ admin สามารถหมุนเวียน เพิกถอน หรือลบได้เฉพาะ
-รายการอุปกรณ์ของตนเองเท่านั้น
+สำหรับเซสชันโทเคนอุปกรณ์ที่จับคู่แล้ว การจัดการจะจำกัดอยู่กับตัวเอง เว้นแต่ผู้เรียก
+จะมี `operator.admin` ด้วย: ผู้เรียกที่ไม่ใช่ admin จะเห็นเฉพาะรายการการจับคู่ของตนเอง
+สามารถอนุมัติหรือปฏิเสธได้เฉพาะคำขอที่รอดำเนินการของตนเอง และสามารถหมุนเวียน เพิกถอน หรือ
+ลบได้เฉพาะรายการอุปกรณ์ของตนเอง
## การอนุมัติการจับคู่ Node
-`node.pair.*` แบบเดิมใช้พื้นที่เก็บการจับคู่ Node แยกต่างหากที่ Gateway เป็นเจ้าของ Node ผ่าน WS
-ใช้การจับคู่อุปกรณ์ด้วย `role: node` แต่ใช้ชุดคำศัพท์ระดับการอนุมัติเดียวกัน
+`node.pair.*` แบบเดิมใช้คลังการจับคู่ Node ที่ Gateway เป็นเจ้าของแยกต่างหาก โหนด WS
+ใช้การจับคู่อุปกรณ์ด้วย `role: node` แต่คำศัพท์ระดับการอนุมัติเดียวกัน
+ยังคงใช้ได้
`node.pair.approve` ใช้รายการคำสั่งของคำขอที่รอดำเนินการเพื่ออนุมาน
-ขอบเขตที่ต้องใช้เพิ่มเติม:
+ขอบเขตเพิ่มเติมที่จำเป็น:
- คำขอที่ไม่มีคำสั่ง: `operator.pairing`
- คำสั่ง Node ที่ไม่ใช่ exec: `operator.pairing` + `operator.write`
- `system.run`, `system.run.prepare` หรือ `system.which`:
`operator.pairing` + `operator.admin`
-การจับคู่ Node สร้างอัตลักษณ์และความเชื่อถือ แต่ไม่ได้แทนที่นโยบายการอนุมัติ
-exec ของ `system.run` ที่เป็นของ Node เอง
+การจับคู่ Node สร้างตัวตนและความเชื่อถือ ไม่ได้แทนที่นโยบายการอนุมัติ exec
+`system.run` ของ Node เอง
-## การยืนยันตัวตนด้วยความลับที่ใช้ร่วมกัน
+## การยืนยันตัวตนด้วย shared-secret
-การยืนยันตัวตนด้วยโทเค็น/รหัสผ่าน Gateway ที่ใช้ร่วมกันถือเป็นการเข้าถึง operator ที่เชื่อถือได้สำหรับ
+การยืนยันตัวตนด้วยโทเคน/รหัสผ่าน Gateway แบบ shared gateway ถือเป็นการเข้าถึง operator ที่เชื่อถือได้สำหรับ
Gateway นั้น พื้นผิว HTTP ที่เข้ากันได้กับ OpenAI และ `/tools/invoke` จะคืนค่า
-ชุดขอบเขตค่าเริ่มต้นของ operator เต็มรูปแบบตามปกติสำหรับการยืนยันตัวตนด้วย shared-secret bearer แม้ว่า
-ผู้เรียกจะส่งขอบเขตที่ประกาศไว้แคบกว่าก็ตาม
+ชุดขอบเขตเริ่มต้นของ operator แบบเต็มตามปกติสำหรับการยืนยันตัวตน shared-secret bearer แม้ว่าผู้เรียก
+จะส่งขอบเขตที่ประกาศไว้แคบกว่าก็ตาม
-โหมดที่มีอัตลักษณ์ เช่น trusted proxy auth หรือ private-ingress `none`
-ยังคงสามารถเคารพขอบเขตที่ประกาศไว้อย่างชัดเจนได้ ใช้ Gateway แยกกันสำหรับการแยก
+โหมดที่มีตัวตน เช่น การยืนยันตัวตนผ่านพร็อกซีที่เชื่อถือได้ หรือ private-ingress `none`
+ยังสามารถเคารพขอบเขตที่ประกาศไว้อย่างชัดเจนได้ ใช้ Gateway แยกกันสำหรับการแยก
ขอบเขตความเชื่อถือจริง
diff --git a/docs/th/plugins/building-plugins.md b/docs/th/plugins/building-plugins.md
index e89436718..6ced1c370 100644
--- a/docs/th/plugins/building-plugins.md
+++ b/docs/th/plugins/building-plugins.md
@@ -1,63 +1,65 @@
---
read_when:
- คุณต้องการสร้าง OpenClaw Plugin ใหม่
- - คุณต้องการคู่มือเริ่มต้นใช้งานอย่างรวดเร็วสำหรับการพัฒนา Plugin
+ - คุณต้องการคู่มือเริ่มต้นอย่างรวดเร็วสำหรับการพัฒนา Plugin
- คุณกำลังเพิ่มช่องทาง ผู้ให้บริการ เครื่องมือ หรือความสามารถอื่นใหม่ให้กับ OpenClaw
sidebarTitle: Getting Started
summary: สร้าง Plugin OpenClaw ตัวแรกของคุณได้ในไม่กี่นาที
title: การสร้าง Plugin
x-i18n:
- generated_at: "2026-05-02T20:46:59Z"
+ generated_at: "2026-05-04T02:25:22Z"
model: gpt-5.5
provider: openai
- source_hash: b42170b40094f89a63b1497c08ec31e397931dd536bd6faeeb8bc3c123ae45d1
+ source_hash: 3e6c55c551629da54b3f150ce6299694186fe4434cfd7978a2d43d175d33a5d9
source_path: plugins/building-plugins.md
workflow: 16
---
-Plugin ขยาย OpenClaw ด้วยความสามารถใหม่: ช่องทาง, ผู้ให้บริการโมเดล,
-เสียงพูด, การถอดเสียงแบบเรียลไทม์, เสียงพูดแบบเรียลไทม์, การทำความเข้าใจสื่อ, การสร้างภาพ,
-การสร้างวิดีโอ, การดึงข้อมูลเว็บ, การค้นหาเว็บ, เครื่องมือ agent หรือการผสมผสานใด ๆ
+Plugin ขยาย OpenClaw ด้วยความสามารถใหม่ ๆ: ช่องทาง, ผู้ให้บริการโมเดล,
+เสียงพูด, การถอดเสียงแบบเรียลไทม์, เสียงแบบเรียลไทม์, การทำความเข้าใจสื่อ,
+การสร้างภาพ, การสร้างวิดีโอ, การดึงข้อมูลเว็บ, การค้นหาเว็บ, เครื่องมือของเอเจนต์ หรือการผสมผสาน
+รูปแบบใดก็ได้
-คุณไม่จำเป็นต้องเพิ่ม plugin ของคุณลงใน repository ของ OpenClaw เผยแพร่ไปยัง
+คุณไม่จำเป็นต้องเพิ่ม Plugin ของคุณลงในคลังเก็บ OpenClaw เผยแพร่ไปยัง
[ClawHub](/th/tools/clawhub) แล้วผู้ใช้ติดตั้งด้วย
-`openclaw plugins install clawhub:` สเปกแพ็กเกจแบบเปล่ายังคง
-ติดตั้งจาก npm ระหว่างช่วงเปลี่ยนผ่านของการเปิดตัว
+`openclaw plugins install clawhub:` สเป็กแพ็กเกจที่ไม่มีคำนำหน้ายังคง
+ติดตั้งจาก npm ระหว่างช่วงตัดระบบของการเปิดตัว
## ข้อกำหนดเบื้องต้น
- Node >= 22 และตัวจัดการแพ็กเกจ (npm หรือ pnpm)
- คุ้นเคยกับ TypeScript (ESM)
-- สำหรับ plugin ใน repo: clone repository แล้วและรัน `pnpm install` เรียบร้อย การพัฒนา plugin
- จาก checkout ซอร์สโค้ดรองรับเฉพาะ pnpm เพราะ OpenClaw โหลด plugin ที่ bundle มา
- จากแพ็กเกจ workspace `extensions/*`
+- สำหรับ Plugin ภายในคลังเก็บ: โคลนคลังเก็บและรัน `pnpm install` แล้ว การพัฒนา
+ Plugin จากชุดซอร์สที่เช็กเอาต์ใช้ได้เฉพาะ pnpm เพราะ OpenClaw โหลด Plugin ที่บันเดิลมา
+ จากแพ็กเกจเวิร์กสเปซ `extensions/*`
## Plugin ประเภทใด?
-
+
เชื่อมต่อ OpenClaw กับแพลตฟอร์มรับส่งข้อความ (Discord, IRC ฯลฯ)
-
- เพิ่มผู้ให้บริการโมเดล (LLM, proxy หรือ endpoint แบบกำหนดเอง)
+
+ เพิ่มผู้ให้บริการโมเดล (LLM, พร็อกซี หรือปลายทางกำหนดเอง)
-
- ลงทะเบียนเครื่องมือ agent, event hook หรือ service — อ่านต่อด้านล่าง
+
+ ลงทะเบียนเครื่องมือของเอเจนต์, ฮุกเหตุการณ์ หรือบริการ — อ่านต่อด้านล่าง
-สำหรับ channel plugin ที่ไม่รับประกันว่าจะติดตั้งอยู่เมื่อ onboarding/setup
+สำหรับ Plugin ช่องทางที่ไม่รับประกันว่าจะถูกติดตั้งเมื่อการเริ่มต้นใช้งาน/การตั้งค่า
ทำงาน ให้ใช้ `createOptionalChannelSetupSurface(...)` จาก
-`openclaw/plugin-sdk/channel-setup` ซึ่งสร้างคู่ setup adapter + wizard
-ที่ประกาศข้อกำหนดการติดตั้ง และปิดกั้นการเขียน config จริงจนกว่า plugin จะถูกติดตั้ง
+`openclaw/plugin-sdk/channel-setup` ฟังก์ชันนี้สร้างคู่อะแดปเตอร์การตั้งค่า + วิซาร์ด
+ที่ประกาศข้อกำหนดการติดตั้งและปิดกั้นการเขียนค่ากำหนดจริงอย่างปลอดภัย
+จนกว่า Plugin จะถูกติดตั้ง
-## เริ่มต้นอย่างรวดเร็ว: tool plugin
+## เริ่มต้นอย่างรวดเร็ว: Plugin เครื่องมือ
-คำแนะนำนี้สร้าง plugin ขั้นต่ำที่ลงทะเบียนเครื่องมือ agent สำหรับ channel
-และ provider plugin มีคู่มือเฉพาะที่ลิงก์ไว้ด้านบน
+คำแนะนำทีละขั้นตอนนี้สร้าง Plugin ขั้นต่ำที่ลงทะเบียนเครื่องมือของเอเจนต์ Plugin ช่องทาง
+และ Plugin ผู้ให้บริการมีคู่มือเฉพาะที่ลิงก์ไว้ด้านบน
-
+
```json package.json
{
@@ -97,16 +99,16 @@ Plugin ขยาย OpenClaw ด้วยความสามารถใหม
```
- ทุก plugin ต้องมี manifest แม้จะไม่มี config เครื่องมือที่ลงทะเบียนตอน runtime
- ต้องระบุใน `contracts.tools` เพื่อให้ OpenClaw ค้นพบ plugin เจ้าของ
- ได้โดยไม่ต้องโหลด runtime ของทุก plugin นอกจากนี้ plugin ควรประกาศ
- `activation.onStartup` อย่างตั้งใจ ตัวอย่างนี้ตั้งค่าเป็น `true` ดู
- [Manifest](/th/plugins/manifest) สำหรับ schema เต็ม snippet สำหรับเผยแพร่ ClawHub
- ที่เป็นแหล่งอ้างอิงหลักอยู่ใน `docs/snippets/plugin-publish/`
+ Plugin ทุกตัวต้องมีแมนิเฟสต์ แม้จะไม่มีการกำหนดค่า เครื่องมือที่ลงทะเบียนขณะรันไทม์
+ ต้องอยู่ในรายการ `contracts.tools` เพื่อให้ OpenClaw ค้นพบ Plugin เจ้าของ
+ ได้โดยไม่ต้องโหลดรันไทม์ของ Plugin ทุกตัว Plugin ควรประกาศ
+ `activation.onStartup` อย่างตั้งใจด้วย ตัวอย่างนี้ตั้งค่าเป็น `true` ดู
+ [แมนิเฟสต์](/th/plugins/manifest) สำหรับสคีมาฉบับเต็ม ตัวอย่างการเผยแพร่ ClawHub
+ แบบมาตรฐานอยู่ใน `docs/snippets/plugin-publish/`
-
+
```typescript
// index.ts
@@ -130,15 +132,15 @@ Plugin ขยาย OpenClaw ด้วยความสามารถใหม
});
```
- `definePluginEntry` ใช้สำหรับ plugin ที่ไม่ใช่ channel สำหรับ channel ให้ใช้
- `defineChannelPluginEntry` — ดู [Channel Plugins](/th/plugins/sdk-channel-plugins)
- สำหรับตัวเลือก entry point ทั้งหมด ดู [Entry Points](/th/plugins/sdk-entrypoints)
+ `definePluginEntry` ใช้สำหรับ Plugin ที่ไม่ใช่ช่องทาง สำหรับช่องทาง ให้ใช้
+ `defineChannelPluginEntry` — ดู [Plugin ช่องทาง](/th/plugins/sdk-channel-plugins)
+ สำหรับตัวเลือกจุดเข้าใช้งานทั้งหมด ดู [จุดเข้าใช้งาน](/th/plugins/sdk-entrypoints)
- **Plugin ภายนอก:** ตรวจสอบความถูกต้องและเผยแพร่ด้วย ClawHub จากนั้นติดตั้ง:
+ **Plugin ภายนอก:** ตรวจสอบและเผยแพร่ด้วย ClawHub แล้วติดตั้ง:
```bash
clawhub package publish your-org/your-plugin --dry-run
@@ -146,10 +148,10 @@ Plugin ขยาย OpenClaw ด้วยความสามารถใหม
openclaw plugins install clawhub:@myorg/openclaw-my-plugin
```
- สเปกแพ็กเกจแบบเปล่า เช่น `@myorg/openclaw-my-plugin` ติดตั้งจาก npm ระหว่าง
- ช่วงเปลี่ยนผ่านของการเปิดตัว ใช้ `clawhub:` เมื่อต้องการให้ resolve ผ่าน ClawHub
+ สเป็กแพ็กเกจที่ไม่มีคำนำหน้าอย่าง `@myorg/openclaw-my-plugin` จะติดตั้งจาก npm ระหว่าง
+ ช่วงตัดระบบของการเปิดตัว ใช้ `clawhub:` เมื่อต้องการใช้การค้นหาแพ็กเกจผ่าน ClawHub
- **Plugin ใน repo:** วางไว้ใต้ tree workspace ของ bundled plugin — จะถูกค้นพบโดยอัตโนมัติ
+ **Plugin ภายในคลังเก็บ:** วางไว้ใต้แผนผังเวิร์กสเปซของ Plugin ที่บันเดิลมา — ระบบจะค้นพบโดยอัตโนมัติ
```bash
pnpm test -- /my-plugin/
@@ -160,68 +162,68 @@ Plugin ขยาย OpenClaw ด้วยความสามารถใหม
## ความสามารถของ Plugin
-plugin เดียวสามารถลงทะเบียนความสามารถได้จำนวนเท่าใดก็ได้ผ่านอ็อบเจกต์ `api`:
+Plugin ตัวเดียวสามารถลงทะเบียนความสามารถได้กี่อย่างก็ได้ผ่านอ็อบเจ็กต์ `api`:
| ความสามารถ | วิธีลงทะเบียน | คู่มือโดยละเอียด |
| ---------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------- |
-| การอนุมานข้อความ (LLM) | `api.registerProvider(...)` | [Provider Plugins](/th/plugins/sdk-provider-plugins) |
-| backend การอนุมาน CLI | `api.registerCliBackend(...)` | [CLI Backends](/th/gateway/cli-backends) |
-| ช่องทาง / การรับส่งข้อความ | `api.registerChannel(...)` | [Channel Plugins](/th/plugins/sdk-channel-plugins) |
-| เสียงพูด (TTS/STT) | `api.registerSpeechProvider(...)` | [Provider Plugins](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
-| การถอดเสียงแบบเรียลไทม์ | `api.registerRealtimeTranscriptionProvider(...)` | [Provider Plugins](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
-| เสียงพูดแบบเรียลไทม์ | `api.registerRealtimeVoiceProvider(...)` | [Provider Plugins](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
-| การทำความเข้าใจสื่อ | `api.registerMediaUnderstandingProvider(...)` | [Provider Plugins](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
-| การสร้างภาพ | `api.registerImageGenerationProvider(...)` | [Provider Plugins](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
-| การสร้างเพลง | `api.registerMusicGenerationProvider(...)` | [Provider Plugins](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
-| การสร้างวิดีโอ | `api.registerVideoGenerationProvider(...)` | [Provider Plugins](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
-| การดึงข้อมูลเว็บ | `api.registerWebFetchProvider(...)` | [Provider Plugins](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
-| การค้นหาเว็บ | `api.registerWebSearchProvider(...)` | [Provider Plugins](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
-| middleware ผลลัพธ์เครื่องมือ | `api.registerAgentToolResultMiddleware(...)` | [SDK Overview](/th/plugins/sdk-overview#registration-api) |
-| เครื่องมือ agent | `api.registerTool(...)` | ด้านล่าง |
-| คำสั่งแบบกำหนดเอง | `api.registerCommand(...)` | [Entry Points](/th/plugins/sdk-entrypoints) |
-| hook ของ Plugin | `api.on(...)` | [Plugin hooks](/th/plugins/hooks) |
-| hook เหตุการณ์ภายใน | `api.registerHook(...)` | [Entry Points](/th/plugins/sdk-entrypoints) |
-| เส้นทาง HTTP | `api.registerHttpRoute(...)` | [Internals](/th/plugins/architecture-internals#gateway-http-routes) |
-| คำสั่งย่อย CLI | `api.registerCli(...)` | [Entry Points](/th/plugins/sdk-entrypoints) |
+| การอนุมานข้อความ (LLM) | `api.registerProvider(...)` | [Plugin ผู้ให้บริการ](/th/plugins/sdk-provider-plugins) |
+| แบ็กเอนด์การอนุมาน CLI | `api.registerCliBackend(...)` | [แบ็กเอนด์ CLI](/th/gateway/cli-backends) |
+| ช่องทาง / การรับส่งข้อความ | `api.registerChannel(...)` | [Plugin ช่องทาง](/th/plugins/sdk-channel-plugins) |
+| เสียงพูด (TTS/STT) | `api.registerSpeechProvider(...)` | [Plugin ผู้ให้บริการ](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
+| การถอดเสียงแบบเรียลไทม์ | `api.registerRealtimeTranscriptionProvider(...)` | [Plugin ผู้ให้บริการ](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
+| เสียงแบบเรียลไทม์ | `api.registerRealtimeVoiceProvider(...)` | [Plugin ผู้ให้บริการ](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
+| การทำความเข้าใจสื่อ | `api.registerMediaUnderstandingProvider(...)` | [Plugin ผู้ให้บริการ](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
+| การสร้างภาพ | `api.registerImageGenerationProvider(...)` | [Plugin ผู้ให้บริการ](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
+| การสร้างเพลง | `api.registerMusicGenerationProvider(...)` | [Plugin ผู้ให้บริการ](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
+| การสร้างวิดีโอ | `api.registerVideoGenerationProvider(...)` | [Plugin ผู้ให้บริการ](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
+| การดึงข้อมูลเว็บ | `api.registerWebFetchProvider(...)` | [Plugin ผู้ให้บริการ](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
+| การค้นหาเว็บ | `api.registerWebSearchProvider(...)` | [Plugin ผู้ให้บริการ](/th/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
+| มิดเดิลแวร์ผลลัพธ์เครื่องมือ | `api.registerAgentToolResultMiddleware(...)` | [ภาพรวม SDK](/th/plugins/sdk-overview#registration-api) |
+| เครื่องมือของเอเจนต์ | `api.registerTool(...)` | ด้านล่าง |
+| คำสั่งกำหนดเอง | `api.registerCommand(...)` | [จุดเข้าใช้งาน](/th/plugins/sdk-entrypoints) |
+| ฮุกของ Plugin | `api.on(...)` | [ฮุกของ Plugin](/th/plugins/hooks) |
+| ฮุกเหตุการณ์ภายใน | `api.registerHook(...)` | [จุดเข้าใช้งาน](/th/plugins/sdk-entrypoints) |
+| เส้นทาง HTTP | `api.registerHttpRoute(...)` | [ส่วนภายใน](/th/plugins/architecture-internals#gateway-http-routes) |
+| คำสั่งย่อย CLI | `api.registerCli(...)` | [จุดเข้าใช้งาน](/th/plugins/sdk-entrypoints) |
-สำหรับ API การลงทะเบียนทั้งหมด ดู [SDK Overview](/th/plugins/sdk-overview#registration-api)
+สำหรับ API การลงทะเบียนฉบับเต็ม ดู [ภาพรวม SDK](/th/plugins/sdk-overview#registration-api)
-bundled plugin สามารถใช้ `api.registerAgentToolResultMiddleware(...)` เมื่อ
-ต้องการเขียนผลลัพธ์เครื่องมือแบบ async ใหม่ก่อนที่โมเดลจะเห็น output ประกาศ
-runtime เป้าหมายใน `contracts.agentToolResultMiddleware` เช่น
-`["pi", "codex"]` นี่คือ seam ของ bundled-plugin ที่เชื่อถือได้ ส่วน plugin ภายนอก
-ควรใช้ hook ของ OpenClaw plugin แบบปกติ เว้นแต่ OpenClaw จะเพิ่ม
-นโยบายความเชื่อถืออย่างชัดเจนสำหรับความสามารถนี้
+Plugin ที่บันเดิลมาสามารถใช้ `api.registerAgentToolResultMiddleware(...)` เมื่อจำเป็นต้อง
+เขียนผลลัพธ์เครื่องมือใหม่แบบอะซิงโครนัสก่อนที่โมเดลจะเห็นเอาต์พุต ประกาศ
+รันไทม์เป้าหมายใน `contracts.agentToolResultMiddleware` เช่น
+`["pi", "codex"]` นี่เป็นจุดเชื่อมต่อที่เชื่อถือได้สำหรับ Plugin ที่บันเดิลมา; Plugin ภายนอก
+ควรใช้ฮุกของ Plugin OpenClaw ตามปกติ เว้นแต่ OpenClaw จะเพิ่ม
+นโยบายความเชื่อถือที่ชัดเจนสำหรับความสามารถนี้
-หาก plugin ของคุณลงทะเบียนเมธอด Gateway RPC แบบกำหนดเอง ให้เก็บไว้ใน
-prefix เฉพาะของ plugin namespace ของผู้ดูแลระบบหลัก (`config.*`,
-`exec.approvals.*`, `wizard.*`, `update.*`) ยังคงสงวนไว้และ resolve เป็น
-`operator.admin` เสมอ แม้ว่า plugin จะขอ scope ที่แคบกว่าก็ตาม
+หาก Plugin ของคุณลงทะเบียนเมธอด RPC ของ Gateway แบบกำหนดเอง ให้ใช้
+คำนำหน้าเฉพาะ Plugin สำหรับเมธอดเหล่านั้น เนมสเปซผู้ดูแลของแกนหลัก (`config.*`,
+`exec.approvals.*`, `wizard.*`, `update.*`) ยังคงถูกสงวนไว้และจะผูกกับ
+`operator.admin` เสมอ แม้ว่า Plugin จะขอขอบเขตที่แคบกว่า
-หลัก semantics ของ hook guard ที่ควรจำ:
+ความหมายของเงื่อนไขป้องกันของฮุกที่ควรจำไว้:
-- `before_tool_call`: `{ block: true }` เป็น terminal และหยุด handler ที่มี priority ต่ำกว่า
+- `before_tool_call`: `{ block: true }` เป็นผลสิ้นสุดและหยุดตัวจัดการที่มีลำดับความสำคัญต่ำกว่า
- `before_tool_call`: `{ block: false }` ถือว่าไม่มีการตัดสินใจ
-- `before_tool_call`: `{ requireApproval: true }` หยุดการทำงานของ agent ชั่วคราวและขออนุมัติจากผู้ใช้ผ่าน exec approval overlay, ปุ่ม Telegram, interaction ของ Discord หรือคำสั่ง `/approve` บนช่องทางใดก็ได้
-- `before_install`: `{ block: true }` เป็น terminal และหยุด handler ที่มี priority ต่ำกว่า
+- `before_tool_call`: `{ requireApproval: true }` หยุดการทำงานของเอเจนต์ชั่วคราวและแจ้งให้ผู้ใช้อนุมัติผ่านโอเวอร์เลย์การอนุมัติการดำเนินการ, ปุ่ม Telegram, การโต้ตอบ Discord หรือคำสั่ง `/approve` บนช่องทางใดก็ได้
+- `before_install`: `{ block: true }` เป็นผลสิ้นสุดและหยุดตัวจัดการที่มีลำดับความสำคัญต่ำกว่า
- `before_install`: `{ block: false }` ถือว่าไม่มีการตัดสินใจ
-- `message_sending`: `{ cancel: true }` เป็น terminal และหยุด handler ที่มี priority ต่ำกว่า
+- `message_sending`: `{ cancel: true }` เป็นผลสิ้นสุดและหยุดตัวจัดการที่มีลำดับความสำคัญต่ำกว่า
- `message_sending`: `{ cancel: false }` ถือว่าไม่มีการตัดสินใจ
-- `message_received`: แนะนำให้ใช้ฟิลด์ typed `threadId` เมื่อคุณต้องการ route thread/topic ขาเข้า เก็บ `metadata` ไว้สำหรับข้อมูลเพิ่มเติมเฉพาะช่องทาง
-- `message_sending`: แนะนำให้ใช้ฟิลด์ routing แบบ typed `replyToId` / `threadId` แทนคีย์ metadata เฉพาะช่องทาง
+- `message_received`: ให้ใช้ฟิลด์ `threadId` ที่มีชนิดกำกับเมื่อต้องการการกำหนดเส้นทางเธรด/หัวข้อขาเข้า เก็บ `metadata` ไว้สำหรับข้อมูลเพิ่มเติมเฉพาะช่องทาง
+- `message_sending`: ให้ใช้ฟิลด์กำหนดเส้นทาง `replyToId` / `threadId` ที่มีชนิดกำกับแทนคีย์ข้อมูลเมตาเฉพาะช่องทาง
-คำสั่ง `/approve` จัดการทั้ง exec approval และ plugin approval พร้อม fallback แบบมีขอบเขต: เมื่อไม่พบ exec approval id OpenClaw จะลอง id เดิมซ้ำผ่าน plugin approval การ forward plugin approval สามารถกำหนดค่าแยกต่างหากได้ผ่าน `approvals.plugin` ใน config
+คำสั่ง `/approve` จัดการทั้งการอนุมัติการดำเนินการและการอนุมัติของ Plugin ด้วยกลไกสำรองที่มีขอบเขต: เมื่อไม่พบรหัสการอนุมัติการดำเนินการ OpenClaw จะลองใช้รหัสเดียวกันผ่านการอนุมัติของ Plugin การส่งต่อการอนุมัติของ Plugin สามารถกำหนดค่าแยกต่างหากได้ผ่าน `approvals.plugin` ในการกำหนดค่า
-หาก plumbing การอนุมัติแบบกำหนดเองต้องตรวจจับกรณี fallback แบบมีขอบเขตเดียวกันนี้
-แนะนำให้ใช้ `isApprovalNotFoundError` จาก `openclaw/plugin-sdk/error-runtime`
-แทนการจับคู่สตริง approval-expiry ด้วยตนเอง
+หากระบบเชื่อมต่อการอนุมัติแบบกำหนดเองต้องตรวจจับกรณีกลไกสำรองที่มีขอบเขตเดียวกันนั้น
+ให้เลือกใช้ `isApprovalNotFoundError` จาก `openclaw/plugin-sdk/error-runtime`
+แทนการจับคู่สตริงการหมดอายุของการอนุมัติด้วยตนเอง
-ดูตัวอย่างและ reference ของ hook ได้ที่ [Plugin hooks](/th/plugins/hooks)
+ดู [ฮุกของ Plugin](/th/plugins/hooks) สำหรับตัวอย่างและเอกสารอ้างอิงของฮุก
-## การลงทะเบียนเครื่องมือ agent
+## การลงทะเบียนเครื่องมือของเอเจนต์
-เครื่องมือคือฟังก์ชันแบบ typed ที่ LLM สามารถเรียกได้ อาจเป็นแบบจำเป็น (พร้อมใช้งานเสมอ)
-หรือแบบ optional (ผู้ใช้เลือกเปิดใช้):
+เครื่องมือคือฟังก์ชันที่มีชนิดกำกับซึ่ง LLM สามารถเรียกใช้ได้ เครื่องมืออาจเป็นแบบบังคับ (พร้อมใช้งานเสมอ)
+หรือแบบไม่บังคับ (ผู้ใช้เลือกเปิดใช้):
```typescript
register(api) {
@@ -250,23 +252,31 @@ register(api) {
}
```
-ทุกเครื่องมือที่ลงทะเบียนด้วย `api.registerTool(...)` ต้องประกาศใน
-manifest ของ plugin ด้วย:
+เครื่องมือทุกตัวที่ลงทะเบียนด้วย `api.registerTool(...)` ต้องประกาศไว้ใน
+แมนิเฟสต์ของ Plugin ด้วย:
```json
{
"contracts": {
"tools": ["my_tool", "workflow_tool"]
+ },
+ "toolMetadata": {
+ "workflow_tool": {
+ "optional": true
+ }
}
}
```
-OpenClaw จับและ cache descriptor ที่ตรวจสอบแล้วจากเครื่องมือที่ลงทะเบียน
-ดังนั้น plugin ไม่ต้อง duplicate `description` หรือข้อมูล schema ใน manifest
-manifest contract ประกาศเฉพาะ ownership และ discovery เท่านั้น ส่วนการ execute ยังเรียก
-implementation ของเครื่องมือที่ลงทะเบียนจริง
+OpenClaw จับและแคช descriptor ที่ผ่านการตรวจสอบแล้วจากเครื่องมือที่ลงทะเบียนไว้
+ดังนั้น Plugin จึงไม่ทำซ้ำข้อมูล `description` หรือ schema ใน manifest สัญญาของ
+manifest ประกาศเฉพาะความเป็นเจ้าของและการค้นพบเท่านั้น ส่วนการดำเนินการยังคงเรียก
+implementation ของเครื่องมือที่ลงทะเบียนจริงอยู่
+ตั้งค่า `toolMetadata..optional: true` สำหรับเครื่องมือที่ลงทะเบียนด้วย
+`api.registerTool(..., { optional: true })` เพื่อให้ OpenClaw สามารถหลีกเลี่ยงการโหลด
+runtime ของ Plugin นั้นจนกว่าเครื่องมือจะถูกเพิ่มใน allowlist อย่างชัดเจน
-ผู้ใช้เปิดใช้เครื่องมือ optional ใน config:
+ผู้ใช้เปิดใช้เครื่องมือแบบ optional ใน config:
```json5
{
@@ -274,16 +284,16 @@ implementation ของเครื่องมือที่ลงทะเ
}
```
-- ชื่อเครื่องมือต้องไม่ชนกับเครื่องมือหลัก (รายการที่ขัดแย้งจะถูกข้าม)
-- เครื่องมือที่มีอ็อบเจ็กต์การลงทะเบียนผิดรูปแบบ รวมถึงไม่มี `parameters` จะถูกข้ามและรายงานใน diagnostics ของ plugin แทนที่จะทำให้การรัน agent ล้มเหลว
-- ใช้ `optional: true` สำหรับเครื่องมือที่มีผลข้างเคียงหรือต้องการไบนารีเพิ่มเติม
-- ผู้ใช้สามารถเปิดใช้เครื่องมือทั้งหมดจาก plugin ได้โดยเพิ่ม plugin id ลงใน `tools.allow`
+- ชื่อเครื่องมือต้องไม่ชนกับเครื่องมือหลัก (conflicts จะถูกข้าม)
+- เครื่องมือที่มีออบเจ็กต์การลงทะเบียนผิดรูปแบบ รวมถึงไม่มี `parameters` จะถูกข้ามและรายงานใน diagnostics ของ Plugin แทนที่จะทำให้การรัน agent ล้มเหลว
+- ใช้ `optional: true` สำหรับเครื่องมือที่มีผลข้างเคียงหรือต้องการ binary เพิ่มเติม
+- ผู้ใช้สามารถเปิดใช้เครื่องมือทั้งหมดจาก Plugin ได้โดยเพิ่ม plugin id ลงใน `tools.allow`
## การลงทะเบียนคำสั่ง CLI
-Plugins สามารถเพิ่มกลุ่มคำสั่งราก `openclaw` ด้วย `api.registerCli` ได้ ระบุ
-`descriptors` สำหรับรากคำสั่งระดับบนสุดทุกคำสั่ง เพื่อให้ OpenClaw แสดงและกำหนดเส้นทาง
-คำสั่งได้โดยไม่ต้องโหลด runtime ของ plugin ทุกตัวล่วงหน้า
+Plugin สามารถเพิ่มกลุ่มคำสั่งราก `openclaw` ด้วย `api.registerCli` ได้ ระบุ
+`descriptors` สำหรับรากคำสั่งระดับบนสุดทุกคำสั่ง เพื่อให้ OpenClaw สามารถแสดงและจัดเส้นทาง
+คำสั่งได้โดยไม่ต้องโหลด runtime ของทุก Plugin ล่วงหน้า
```typescript
register(api) {
@@ -313,16 +323,16 @@ register(api) {
}
```
-หลังติดตั้ง ให้ตรวจสอบการลงทะเบียน runtime และเรียกใช้คำสั่ง:
+หลังติดตั้ง ให้ตรวจสอบการลงทะเบียน runtime และดำเนินการคำสั่ง:
```bash
openclaw plugins inspect demo-plugin --runtime --json
openclaw demo-plugin ping
```
-## ข้อตกลงการ import
+## แนวทางการ import
-ให้ import จากพาธ `openclaw/plugin-sdk/` ที่เจาะจงเสมอ:
+import จากพาธ `openclaw/plugin-sdk/` ที่เจาะจงเสมอ:
```typescript
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
@@ -334,69 +344,69 @@ import { ... } from "openclaw/plugin-sdk";
สำหรับอ้างอิง subpath ทั้งหมด โปรดดู [ภาพรวม SDK](/th/plugins/sdk-overview)
-ภายใน plugin ของคุณ ให้ใช้ไฟล์ barrel ภายในเครื่อง (`api.ts`, `runtime-api.ts`) สำหรับ
-การ import ภายใน อย่า import plugin ของคุณเองผ่านพาธ SDK ของมัน
+ภายใน Plugin ของคุณ ให้ใช้ไฟล์ barrel ภายในเครื่อง (`api.ts`, `runtime-api.ts`) สำหรับ
+การ import ภายใน ห้าม import Plugin ของคุณเองผ่านพาธ SDK
-สำหรับ provider plugins ให้เก็บตัวช่วยเฉพาะผู้ให้บริการไว้ใน barrel ที่รากแพ็กเกจ
-เหล่านั้น เว้นแต่ว่า seam นั้นจะเป็นแบบทั่วไปจริงๆ ตัวอย่าง bundled ปัจจุบัน:
+สำหรับ provider plugins ให้เก็บ helper เฉพาะ provider ไว้ใน barrel ที่รากของ package
+เหล่านั้น เว้นแต่ seam นั้นจะเป็นแบบทั่วไปจริง ๆ ตัวอย่างที่ bundled อยู่ในปัจจุบัน:
-- Anthropic: wrapper สำหรับสตรีม Claude และตัวช่วย `service_tier` / beta
-- OpenAI: builder ของผู้ให้บริการ, ตัวช่วยโมเดลเริ่มต้น, ผู้ให้บริการแบบเรียลไทม์
-- OpenRouter: builder ของผู้ให้บริการ รวมถึงตัวช่วย onboarding/config
+- Anthropic: wrapper ของสตรีม Claude และ helper สำหรับ `service_tier` / beta
+- OpenAI: provider builders, default-model helpers, realtime providers
+- OpenRouter: provider builder พร้อม helper สำหรับ onboarding/config
-หากตัวช่วยมีประโยชน์เฉพาะภายในแพ็กเกจผู้ให้บริการ bundled เพียงตัวเดียว ให้เก็บไว้บน
-seam รากแพ็กเกจนั้น แทนที่จะยกระดับเข้าไปใน `openclaw/plugin-sdk/*`
+หาก helper มีประโยชน์เฉพาะภายใน package ของ provider ที่ bundled ไว้เพียงตัวเดียว ให้เก็บไว้ที่
+seam รากของ package นั้นแทนการโปรโมตเข้าไปใน `openclaw/plugin-sdk/*`
-seam ตัวช่วย `openclaw/plugin-sdk/` ที่สร้างขึ้นบางรายการยังคงมีอยู่สำหรับ
-การบำรุงรักษา bundled-plugin เมื่อมีการติดตามการใช้งานของเจ้าของ ให้ถือว่าสิ่งเหล่านี้เป็น
-พื้นผิวที่สงวนไว้ ไม่ใช่รูปแบบเริ่มต้นสำหรับ plugin ภายนอกใหม่
+seam helper `openclaw/plugin-sdk/` บางรายการที่สร้างขึ้นยังคงมีอยู่สำหรับ
+การบำรุงรักษา bundled-plugin เมื่อมีการติดตามการใช้งานของ owner ให้ถือว่าสิ่งเหล่านี้เป็น
+พื้นผิวที่สงวนไว้ ไม่ใช่รูปแบบเริ่มต้นสำหรับ Plugin ของบุคคลที่สามตัวใหม่
-## เช็กลิสต์ก่อนส่ง
+## รายการตรวจสอบก่อนส่ง
**package.json** มี metadata `openclaw` ที่ถูกต้อง
-manifest **openclaw.plugin.json** มีอยู่และถูกต้อง
-จุดเข้าใช้ `defineChannelPluginEntry` หรือ `definePluginEntry`
+มี manifest **openclaw.plugin.json** และถูกต้อง
+entry point ใช้ `defineChannelPluginEntry` หรือ `definePluginEntry`
การ import ทั้งหมดใช้พาธ `plugin-sdk/` ที่เจาะจง
-การ import ภายในใช้โมดูลภายในเครื่อง ไม่ใช่ SDK self-import
+การ import ภายในใช้โมดูลในเครื่อง ไม่ใช่ SDK self-imports
การทดสอบผ่าน (`pnpm test -- /my-plugin/`)
-`pnpm check` ผ่าน (plugins ภายใน repo)
+`pnpm check` ผ่าน (Plugin ใน repo)
## การทดสอบรุ่น beta
-1. เฝ้าดูแท็ก GitHub release บน [openclaw/openclaw](https://github.com/openclaw/openclaw/releases) และสมัครรับข้อมูลผ่าน `Watch` > `Releases` แท็ก beta มีรูปแบบคล้าย `v2026.3.N-beta.1` คุณยังสามารถเปิดการแจ้งเตือนสำหรับบัญชี X ทางการของ OpenClaw [@openclaw](https://x.com/openclaw) เพื่อรับประกาศ release ได้ด้วย
-2. ทดสอบ plugin ของคุณกับแท็ก beta ทันทีที่ปรากฏ ช่วงเวลาก่อน stable โดยทั่วไปมีเพียงไม่กี่ชั่วโมง
-3. โพสต์ในเธรดของ plugin ของคุณในช่อง Discord `plugin-forum` หลังทดสอบ โดยใช้ `all good` หรือระบุสิ่งที่เสีย หากยังไม่มีเธรด ให้สร้างขึ้นมา
-4. หากมีบางอย่างเสีย ให้เปิดหรืออัปเดต issue ชื่อ `Beta blocker: - ` และใส่ label `beta-blocker` วางลิงก์ issue ในเธรดของคุณ
-5. เปิด PR ไปยัง `main` ชื่อ `fix(): beta blocker - ` และลิงก์ issue ทั้งใน PR และเธรด Discord ของคุณ Contributors ใส่ label ให้ PR ไม่ได้ ดังนั้นชื่อจึงเป็นสัญญาณฝั่ง PR สำหรับ maintainer และ automation blocker ที่มี PR จะถูก merge ส่วน blocker ที่ไม่มี PR อาจถูกปล่อยไปพร้อม release อยู่ดี Maintainers จะเฝ้าดูเธรดเหล่านี้ระหว่างการทดสอบ beta
-6. ความเงียบหมายถึงผ่าน หากคุณพลาดช่วงเวลานี้ fix ของคุณมีแนวโน้มจะเข้าในรอบถัดไป
+1. ติดตาม release tags ของ GitHub บน [openclaw/openclaw](https://github.com/openclaw/openclaw/releases) และ subscribe ผ่าน `Watch` > `Releases` tag ของ beta จะมีรูปแบบเช่น `v2026.3.N-beta.1` คุณยังสามารถเปิด notifications สำหรับบัญชี X อย่างเป็นทางการของ OpenClaw [@openclaw](https://x.com/openclaw) เพื่อรับประกาศ release ได้ด้วย
+2. ทดสอบ Plugin ของคุณกับ beta tag ทันทีที่ปรากฏ โดยปกติช่วงเวลาก่อน stable จะมีเพียงไม่กี่ชั่วโมง
+3. โพสต์ใน thread ของ Plugin คุณในช่อง Discord `plugin-forum` หลังทดสอบ โดยระบุ `all good` หรือสิ่งที่เสีย หากคุณยังไม่มี thread ให้สร้างขึ้นมา
+4. หากมีสิ่งใดเสีย ให้เปิดหรืออัปเดต issue ชื่อ `Beta blocker: - ` และใส่ label `beta-blocker` วางลิงก์ issue ไว้ใน thread ของคุณ
+5. เปิด PR ไปยัง `main` ชื่อ `fix(): beta blocker - ` และลิงก์ issue ทั้งใน PR และ thread Discord ของคุณ contributors ไม่สามารถติด label ให้ PR ได้ ดังนั้น title จึงเป็นสัญญาณฝั่ง PR สำหรับ maintainers และระบบอัตโนมัติ blocker ที่มี PR จะถูก merge ส่วน blocker ที่ไม่มี PR อาจถูกปล่อยออกไปอยู่ดี maintainers จะเฝ้าดู thread เหล่านี้ระหว่างการทดสอบ beta
+6. ความเงียบหมายถึงผ่าน หากคุณพลาดช่วงเวลาดังกล่าว fix ของคุณน่าจะไปลงในรอบถัดไป
## ขั้นตอนถัดไป
-
- สร้าง plugin ช่องทางการส่งข้อความ
+
+ สร้าง Plugin ช่องทางส่งข้อความ
- สร้าง plugin ผู้ให้บริการโมเดล
+ สร้าง Plugin ผู้ให้บริการโมเดล
- อ้างอิง import map และ API การลงทะเบียน
+ ข้อมูลอ้างอิง import map และ registration API
-
- TTS, การค้นหา, subagent ผ่าน api.runtime
+
+ TTS, search, subagent ผ่าน api.runtime
ยูทิลิตีและรูปแบบการทดสอบ
- อ้างอิงสคีมา manifest ฉบับเต็ม
+ ข้อมูลอ้างอิง schema ของ manifest ฉบับเต็ม
## ที่เกี่ยวข้อง
- [สถาปัตยกรรม Plugin](/th/plugins/architecture) — เจาะลึกสถาปัตยกรรมภายใน
-- [ภาพรวม SDK](/th/plugins/sdk-overview) — อ้างอิง Plugin SDK
-- [Manifest](/th/plugins/manifest) — รูปแบบ manifest ของ plugin
-- [Plugin ช่องทาง](/th/plugins/sdk-channel-plugins) — การสร้าง plugin ช่องทาง
-- [Provider Plugins](/th/plugins/sdk-provider-plugins) — การสร้าง plugin ผู้ให้บริการ
+- [ภาพรวม SDK](/th/plugins/sdk-overview) — ข้อมูลอ้างอิง Plugin SDK
+- [Manifest](/th/plugins/manifest) — รูปแบบ manifest ของ Plugin
+- [Channel Plugins](/th/plugins/sdk-channel-plugins) — การสร้าง channel plugins
+- [Provider Plugins](/th/plugins/sdk-provider-plugins) — การสร้าง provider plugins
diff --git a/docs/th/plugins/google-meet.md b/docs/th/plugins/google-meet.md
index b024d95d0..fa7b1c209 100644
--- a/docs/th/plugins/google-meet.md
+++ b/docs/th/plugins/google-meet.md
@@ -1,36 +1,37 @@
---
read_when:
- คุณต้องการให้เอเจนต์ OpenClaw เข้าร่วมการประชุม Google Meet
- - คุณต้องการให้เอเจนต์ OpenClaw สร้างการโทร Google Meet ใหม่
- - คุณกำลังกำหนดค่า Chrome, โหนด Chrome หรือ Twilio เป็นทรานสปอร์ตของ Google Meet
-summary: 'Google Meet Plugin: เข้าร่วม URL ของ Meet ที่ระบุอย่างชัดเจนผ่าน Chrome หรือ Twilio พร้อมค่าเริ่มต้นสำหรับเสียงแบบเรียลไทม์'
-title: Plugin Google Meet
+ - คุณต้องการให้เอเจนต์ OpenClaw สร้างการประชุม Google Meet ใหม่
+ - คุณกำลังกำหนดค่า Chrome, Chrome node หรือ Twilio เป็นการรับส่งของ Google Meet
+summary: 'Plugin Google Meet: เข้าร่วม URL ของ Meet ที่ระบุชัดเจนผ่าน Chrome หรือ Twilio พร้อมค่าเริ่มต้นเสียงแบบเรียลไทม์'
+title: Plugin สำหรับ Google Meet
x-i18n:
- generated_at: "2026-05-02T10:23:40Z"
+ generated_at: "2026-05-04T02:25:36Z"
model: gpt-5.5
provider: openai
- source_hash: 0dc515382d2cc7beacaf18a50b75cb0f4eda3038cfd8efe73ea3ce7b5007bc43
+ source_hash: 77ab70d27d47bcc037144c7c6cfad6f93f307355b6ebcf3ee75c85b96a24af2f
source_path: plugins/google-meet.md
workflow: 16
---
-การรองรับผู้เข้าร่วม Google Meet สำหรับ OpenClaw — Plugin ออกแบบมาให้ชัดเจนโดยตั้งใจ:
+การรองรับผู้เข้าร่วม Google Meet สำหรับ OpenClaw — Plugin จงใจออกแบบให้ชัดเจน:
-- จะเข้าร่วมเฉพาะ URL `https://meet.google.com/...` ที่ระบุอย่างชัดเจนเท่านั้น
-- สามารถสร้างพื้นที่ Meet ใหม่ผ่าน Google Meet API แล้วเข้าร่วม URL ที่ส่งคืนมา
+- เข้าร่วมเฉพาะ URL `https://meet.google.com/...` ที่ระบุอย่างชัดเจนเท่านั้น
+- สามารถสร้างพื้นที่ Meet ใหม่ผ่าน Google Meet API แล้วเข้าร่วม URL ที่ส่งกลับมา
- `realtime` voice เป็นโหมดเริ่มต้น
-- Realtime voice สามารถเรียกกลับเข้าไปยังเอเจนต์ OpenClaw เต็มรูปแบบเมื่อจำเป็นต้องใช้การให้เหตุผลที่ลึกขึ้นหรือเครื่องมือ
-- เอเจนต์เลือกพฤติกรรมการเข้าร่วมด้วย `mode`: ใช้ `realtime` สำหรับการฟัง/พูดตอบกลับแบบสด หรือ `transcribe` เพื่อเข้าร่วม/ควบคุมเบราว์เซอร์โดยไม่มีสะพานเสียง realtime
-- การยืนยันตัวตนเริ่มจาก Google OAuth ส่วนบุคคลหรือโปรไฟล์ Chrome ที่ลงชื่อเข้าใช้อยู่แล้ว
+- Realtime voice สามารถเรียกกลับเข้าสู่ agent OpenClaw แบบเต็มได้เมื่อต้องใช้การให้เหตุผลที่ลึกขึ้นหรือเครื่องมือ
+- Agents เลือกพฤติกรรมการเข้าร่วมด้วย `mode`: ใช้ `realtime` สำหรับการฟัง/พูดตอบกลับแบบสด หรือ `transcribe` เพื่อเข้าร่วม/ควบคุมเบราว์เซอร์โดยไม่มีสะพาน realtime voice
+- การยืนยันตัวตนเริ่มต้นเป็น Google OAuth ส่วนบุคคลหรือโปรไฟล์ Chrome ที่ลงชื่อเข้าใช้อยู่แล้ว
- ไม่มีการประกาศความยินยอมอัตโนมัติ
-- แบ็กเอนด์เสียงเริ่มต้นของ Chrome คือ `BlackHole 2ch`
-- Chrome สามารถรันในเครื่องหรือบนโฮสต์ node ที่จับคู่ไว้
-- Twilio รับหมายเลขโทรเข้า พร้อม PIN หรือชุดลำดับ DTMF ที่ไม่บังคับ; ไม่สามารถโทรไปยัง URL ของ Meet โดยตรงได้
-- คำสั่ง CLI คือ `googlemeet`; `meet` ถูกสงวนไว้สำหรับเวิร์กโฟลว์การประชุมทางไกลของเอเจนต์ที่กว้างกว่า
+- แบ็กเอนด์เสียง Chrome เริ่มต้นคือ `BlackHole 2ch`
+- Chrome สามารถทำงานในเครื่องหรือบนโฮสต์ Node ที่จับคู่ไว้
+- Twilio รับหมายเลขโทรเข้า พร้อม PIN หรือชุด DTMF ที่เป็นตัวเลือกได้ แต่ไม่สามารถโทรไปยัง URL Meet ได้โดยตรง
+- คำสั่ง CLI คือ `googlemeet`; `meet` สงวนไว้สำหรับเวิร์กโฟลว์การประชุมทางไกลของ agent ที่กว้างกว่า
## เริ่มต้นอย่างรวดเร็ว
-ติดตั้ง dependency เสียงในเครื่องและกำหนดค่าผู้ให้บริการ realtime voice แบ็กเอนด์ OpenAI เป็นค่าเริ่มต้น; Google Gemini Live ก็ใช้ได้กับ `realtime.provider: "google"`:
+ติดตั้ง dependency เสียงในเครื่องและกำหนดค่า provider realtime voice แบ็กเอนด์ OpenAI เป็นค่าเริ่มต้น; Google Gemini Live ก็ใช้งานได้กับ
+`realtime.provider: "google"`:
```bash
brew install blackhole-2ch sox
@@ -39,7 +40,8 @@ export OPENAI_API_KEY=sk-...
export GEMINI_API_KEY=...
```
-`blackhole-2ch` ติดตั้งอุปกรณ์เสียงเสมือน `BlackHole 2ch` ตัวติดตั้งของ Homebrew ต้องรีบูตก่อนที่ macOS จะแสดงอุปกรณ์:
+`blackhole-2ch` ติดตั้งอุปกรณ์เสียงเสมือน `BlackHole 2ch` ตัวติดตั้งของ Homebrew
+ต้องรีบูตก่อนที่ macOS จะเปิดเผยอุปกรณ์:
```bash
sudo reboot
@@ -52,7 +54,7 @@ system_profiler SPAudioDataType | grep -i BlackHole
command -v sox
```
-เปิดใช้ Plugin:
+เปิดใช้งาน Plugin:
```json5
{
@@ -73,21 +75,32 @@ command -v sox
openclaw googlemeet setup
```
-เอาต์พุตการตั้งค่าถูกออกแบบให้อ่านได้โดยเอเจนต์และรับรู้โหมด โดยรายงานโปรไฟล์ Chrome, การตรึง node และสำหรับการเข้าร่วม Chrome แบบ realtime จะรายงานสะพานเสียง BlackHole/SoX และการตรวจสอบ intro realtime แบบหน่วงเวลา สำหรับการเข้าร่วมแบบสังเกตการณ์เท่านั้น ให้ตรวจสอบ transport เดียวกันด้วย `--mode transcribe`; โหมดนั้นจะข้ามข้อกำหนดเบื้องต้นของเสียง realtime เพราะไม่ได้ฟังผ่านหรือพูดผ่านสะพาน:
+เอาต์พุตการตั้งค่ามีไว้ให้อ่านได้โดย agent และรับรู้โหมด รายงานโปรไฟล์ Chrome,
+การปักหมุด Node และสำหรับการเข้าร่วม Chrome แบบ realtime จะรายงานสะพานเสียง
+BlackHole/SoX และการตรวจ intro realtime ที่หน่วงเวลาไว้ สำหรับการเข้าร่วมแบบดูอย่างเดียว ให้ตรวจ transport เดียวกันด้วย `--mode transcribe`; โหมดนั้นข้ามข้อกำหนดเบื้องต้นของเสียง realtime
+เพราะไม่ได้ฟังผ่านหรือพูดผ่านสะพาน:
```bash
openclaw googlemeet setup --transport chrome-node --mode transcribe
```
-เมื่อกำหนดค่าการมอบหมายให้ Twilio แล้ว การตั้งค่าจะรายงานด้วยว่า Plugin `voice-call`, ข้อมูลประจำตัว Twilio และการเปิดเผย Webhook สาธารณะพร้อมหรือไม่ ให้ถือการตรวจสอบใดๆ ที่เป็น `ok: false` เป็นตัวขวางสำหรับ transport และโหมดที่ถูกตรวจสอบ ก่อนขอให้เอเจนต์เข้าร่วม ใช้ `openclaw googlemeet setup --json` สำหรับสคริปต์หรือเอาต์พุตที่อ่านได้โดยเครื่อง ใช้ `--transport chrome`, `--transport chrome-node` หรือ `--transport twilio` เพื่อตรวจสอบ transport เฉพาะล่วงหน้าก่อนที่เอเจนต์จะลองใช้
+เมื่อกำหนดค่า delegation ของ Twilio แล้ว การตั้งค่ายังรายงานด้วยว่า Plugin
+`voice-call`, credential ของ Twilio และการเปิดเผย Webhook สาธารณะพร้อมหรือไม่
+ให้ถือว่าเช็กใดๆ ที่เป็น `ok: false` เป็นตัวบล็อกสำหรับ transport และโหมดที่ตรวจ
+ก่อนขอให้ agent เข้าร่วม ใช้ `openclaw googlemeet setup --json` สำหรับ
+สคริปต์หรือเอาต์พุตที่เครื่องอ่านได้ ใช้ `--transport chrome`,
+`--transport chrome-node` หรือ `--transport twilio` เพื่อ preflight transport เฉพาะ
+ก่อนที่ agent จะลองใช้
-สำหรับ Twilio ให้ตรวจสอบ transport ล่วงหน้าอย่างชัดเจนเสมอเมื่อ transport เริ่มต้นคือ Chrome:
+สำหรับ Twilio ให้ preflight transport อย่างชัดเจนเสมอเมื่อ transport เริ่มต้น
+เป็น Chrome:
```bash
openclaw googlemeet setup --transport twilio
```
-วิธีนี้จะจับการเชื่อมต่อ `voice-call` ที่ขาดหาย ข้อมูลประจำตัว Twilio หรือการเปิดเผย Webhook ที่เข้าถึงไม่ได้ ก่อนที่เอเจนต์จะพยายามโทรเข้าการประชุม
+การทำเช่นนั้นจะจับ wiring ของ `voice-call` ที่หายไป, credential ของ Twilio หรือ
+การเปิดเผย Webhook ที่เข้าถึงไม่ได้ ก่อนที่ agent จะพยายามโทรเข้าการประชุม
เข้าร่วมการประชุม:
@@ -95,18 +108,22 @@ openclaw googlemeet setup --transport twilio
openclaw googlemeet join https://meet.google.com/abc-defg-hij
```
-หรือให้เอเจนต์เข้าร่วมผ่านเครื่องมือ `google_meet`:
+หรือให้ agent เข้าร่วมผ่านเครื่องมือ `google_meet`:
```json
{
"action": "join",
"url": "https://meet.google.com/abc-defg-hij",
"transport": "chrome-node",
- "mode": "realtime"
+ "mode": "agent"
}
```
-เครื่องมือ `google_meet` สำหรับเอเจนต์ยังคงพร้อมใช้งานบนโฮสต์ที่ไม่ใช่ macOS สำหรับโฟลว์ artifact, calendar, setup, transcribe, Twilio และ `chrome-node` การดำเนินการ realtime ของ Chrome ในเครื่องจะถูกบล็อกบนโฮสต์เหล่านั้น เพราะเส้นทางเสียง Chrome realtime ที่รวมมาด้วยปัจจุบันขึ้นกับ `BlackHole 2ch` บน macOS บน Linux ให้ใช้ `mode: "transcribe"`, การโทรเข้า Twilio หรือโฮสต์ `chrome-node` บน macOS สำหรับการเข้าร่วม Chrome แบบ realtime
+เครื่องมือ `google_meet` สำหรับ agent ยังคงพร้อมใช้งานบนโฮสต์ที่ไม่ใช่ macOS สำหรับ
+โฟลว์ artifact, calendar, setup, transcribe, Twilio และ `chrome-node` การกระทำ
+พูดตอบกลับด้วย Chrome ในเครื่องจะถูกบล็อกบนโฮสต์เหล่านั้น เพราะเส้นทางเสียง Chrome ที่บันเดิลอยู่
+ตอนนี้ขึ้นกับ `BlackHole 2ch` ของ macOS บน Linux ให้ใช้ `mode: "transcribe"`,
+การโทรเข้า Twilio หรือโฮสต์ `chrome-node` บน macOS สำหรับการเข้าร่วม Chrome แบบพูดตอบกลับ
สร้างการประชุมใหม่และเข้าร่วม:
@@ -114,15 +131,22 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij
openclaw googlemeet create --transport chrome-node --mode realtime
```
-สำหรับห้องที่สร้างผ่าน API ให้ใช้ Google Meet `SpaceConfig.accessType` เมื่อคุณต้องการให้นโยบายไม่ต้องเคาะเข้าห้องชัดเจน แทนที่จะสืบทอดจากค่าเริ่มต้นของบัญชี Google:
+สำหรับห้องที่สร้างด้วย API ให้ใช้ Google Meet `SpaceConfig.accessType` เมื่อต้องการ
+ให้นโยบายไม่ต้องเคาะของห้องชัดเจน แทนที่จะสืบทอดจากค่าเริ่มต้นของบัญชี Google:
```bash
openclaw googlemeet create --access-type OPEN --transport chrome-node --mode realtime
```
-`OPEN` อนุญาตให้ทุกคนที่มี URL ของ Meet เข้าร่วมได้โดยไม่ต้องเคาะ `TRUSTED` อนุญาตให้ผู้ใช้ที่เชื่อถือได้ขององค์กรโฮสต์ ผู้ใช้ภายนอกที่ได้รับเชิญ และผู้ใช้ที่โทรเข้าเข้าร่วมได้โดยไม่ต้องเคาะ `RESTRICTED` จำกัดการเข้าห้องโดยไม่ต้องเคาะไว้เฉพาะผู้ได้รับเชิญ การตั้งค่าเหล่านี้ใช้กับเส้นทางการสร้างอย่างเป็นทางการของ Google Meet API เท่านั้น ดังนั้นต้องกำหนดค่าข้อมูลประจำตัว OAuth
+`OPEN` อนุญาตให้ทุกคนที่มี URL Meet เข้าร่วมได้โดยไม่ต้องเคาะ `TRUSTED` อนุญาตให้
+ผู้ใช้ที่เชื่อถือได้ขององค์กรโฮสต์ ผู้ใช้ภายนอกที่ได้รับเชิญ และผู้ใช้ที่โทรเข้า
+เข้าร่วมได้โดยไม่ต้องเคาะ `RESTRICTED` จำกัดการเข้าที่ไม่ต้องเคาะไว้เฉพาะผู้ได้รับเชิญ การตั้งค่าเหล่านี้
+ใช้กับเส้นทางการสร้างผ่าน Google Meet API อย่างเป็นทางการเท่านั้น ดังนั้นต้องกำหนดค่า
+credential OAuth
-หากคุณยืนยันตัวตน Google Meet ก่อนที่ตัวเลือกนี้จะพร้อมใช้งาน ให้รัน `openclaw googlemeet auth login --json` อีกครั้งหลังจากเพิ่ม scope `meetings.space.settings` ในหน้าจอความยินยอม Google OAuth ของคุณ
+หากคุณยืนยันตัวตน Google Meet ก่อนที่ตัวเลือกนี้จะพร้อมใช้งาน ให้รัน
+`openclaw googlemeet auth login --json` อีกครั้งหลังเพิ่ม scope
+`meetings.space.settings` ลงในหน้าจอความยินยอม Google OAuth ของคุณ
สร้างเฉพาะ URL โดยไม่เข้าร่วม:
@@ -132,13 +156,26 @@ openclaw googlemeet create --no-join
`googlemeet create` มีสองเส้นทาง:
-- การสร้างผ่าน API: ใช้เมื่อกำหนดค่าข้อมูลประจำตัว Google Meet OAuth ไว้ เส้นทางนี้กำหนดผลได้แน่นอนที่สุดและไม่ขึ้นกับสถานะ UI ของเบราว์เซอร์
-- ทางเลือกสำรองผ่านเบราว์เซอร์: ใช้เมื่อไม่มีข้อมูลประจำตัว OAuth OpenClaw ใช้ node Chrome ที่ตรึงไว้ เปิด `https://meet.google.com/new` รอให้ Google เปลี่ยนเส้นทางไปยัง URL รหัสการประชุมจริง แล้วส่งคืน URL นั้น เส้นทางนี้ต้องการให้โปรไฟล์ Chrome ของ OpenClaw บน node ลงชื่อเข้าใช้ Google อยู่แล้ว ระบบอัตโนมัติของเบราว์เซอร์จัดการพรอมป์ไมโครโฟนครั้งแรกของ Meet เอง พรอมป์นั้นไม่ถือเป็นความล้มเหลวในการเข้าสู่ระบบ Google
- โฟลว์เข้าร่วมและสร้างยังพยายามใช้แท็บ Meet ที่มีอยู่แล้วก่อนเปิดแท็บใหม่ การจับคู่จะไม่สนใจ query string ของ URL ที่ไม่เป็นอันตราย เช่น `authuser` ดังนั้นการลองใหม่ของเอเจนต์ควรโฟกัสการประชุมที่เปิดอยู่แล้วแทนที่จะสร้างแท็บ Chrome ที่สอง
+- สร้างด้วย API: ใช้เมื่อมีการกำหนดค่า credential Google Meet OAuth นี่คือ
+ เส้นทางที่กำหนดผลได้แน่นอนที่สุดและไม่ขึ้นกับสถานะ UI ของเบราว์เซอร์
+- fallback ของเบราว์เซอร์: ใช้เมื่อไม่มี credential OAuth OpenClaw ใช้ Node Chrome
+ ที่ปักหมุดไว้ เปิด `https://meet.google.com/new` รอให้ Google
+ redirect ไปยัง URL โค้ดการประชุมจริง แล้วส่ง URL นั้นกลับ เส้นทางนี้ต้องการ
+ ให้โปรไฟล์ Chrome ของ OpenClaw บน Node ลงชื่อเข้าใช้ Google อยู่แล้ว
+ ระบบอัตโนมัติของเบราว์เซอร์จัดการพรอมป์ไมโครโฟนครั้งแรกของ Meet เอง; พรอมป์นั้น
+ ไม่ถือเป็นความล้มเหลวในการเข้าสู่ระบบ Google
+ โฟลว์ join และ create ยังพยายามใช้แท็บ Meet ที่มีอยู่ซ้ำก่อนเปิดแท็บใหม่ด้วย
+ การจับคู่จะไม่สนใจ query string ของ URL ที่ไม่เป็นอันตราย เช่น `authuser` ดังนั้น
+ การลองใหม่ของ agent ควรโฟกัสการประชุมที่เปิดอยู่แล้ว แทนที่จะสร้างแท็บ Chrome ที่สอง
-เอาต์พุตของคำสั่ง/เครื่องมือมีฟิลด์ `source` (`api` หรือ `browser`) เพื่อให้เอเจนต์อธิบายได้ว่าใช้เส้นทางใด `create` จะเข้าร่วมการประชุมใหม่ตามค่าเริ่มต้นและส่งคืน `joined: true` พร้อมเซสชันการเข้าร่วม หากต้องการออกเพียง URL ให้ใช้ `create --no-join` บน CLI หรือส่ง `"join": false` ให้เครื่องมือ
+เอาต์พุตของคำสั่ง/เครื่องมือมีฟิลด์ `source` (`api` หรือ `browser`) เพื่อให้ agents
+อธิบายได้ว่าใช้เส้นทางใด `create` จะเข้าร่วมการประชุมใหม่โดยค่าเริ่มต้นและ
+ส่งกลับ `joined: true` พร้อม session การเข้าร่วม หากต้องการสร้างเฉพาะ URL ให้ใช้
+`create --no-join` ใน CLI หรือส่ง `"join": false` ไปยังเครื่องมือ
-หรือบอกเอเจนต์ว่า: "สร้าง Google Meet เข้าร่วมด้วย realtime voice และส่งลิงก์ให้ฉัน" เอเจนต์ควรเรียก `google_meet` ด้วย `action: "create"` แล้วแชร์ `meetingUri` ที่ส่งคืนมา
+หรือบอก agent ว่า: "Create a Google Meet, join it with realtime voice, and send
+me the link." agent ควรเรียก `google_meet` ด้วย `action: "create"` แล้ว
+แชร์ `meetingUri` ที่ส่งกลับมา
```json
{
@@ -148,22 +185,54 @@ openclaw googlemeet create --no-join
}
```
-สำหรับการเข้าร่วมแบบสังเกตการณ์เท่านั้น/ควบคุมเบราว์เซอร์ ให้ตั้ง `"mode": "transcribe"` โหมดนี้จะไม่เริ่มสะพานโมเดล realtime แบบสองทาง ไม่ต้องใช้ BlackHole หรือ SoX และจะไม่พูดตอบกลับเข้าไปในการประชุม การเข้าร่วม Chrome ในโหมดนี้ยังหลีกเลี่ยงการให้สิทธิ์ไมโครโฟน/กล้องของ OpenClaw และหลีกเลี่ยงเส้นทาง Meet **ใช้ไมโครโฟน** หาก Meet แสดงหน้าคั่นสำหรับเลือกเสียง ระบบอัตโนมัติจะลองเส้นทางที่ไม่ใช้ไมโครโฟน และมิฉะนั้นจะรายงานการดำเนินการแบบแมนนวลแทนการเปิดไมโครโฟนในเครื่อง ในโหมด transcribe, transport Chrome ที่จัดการแล้วยังติดตั้งตัวสังเกต caption ของ Meet แบบ best-effort ด้วย `googlemeet status --json` และ `googlemeet doctor` แสดง `captioning`, `captionsEnabledAttempted`, `transcriptLines`, `lastCaptionAt`, `lastCaptionSpeaker`, `lastCaptionText` และส่วนท้าย `recentTranscript` สั้นๆ เพื่อให้ผู้ปฏิบัติงานบอกได้ว่าเบราว์เซอร์เข้าร่วมสายแล้วหรือไม่ และ caption ของ Meet กำลังสร้างข้อความหรือไม่
-ใช้ `openclaw googlemeet test-listen --transport chrome-node` เมื่อคุณต้องการโพรบแบบใช่/ไม่ใช่: คำสั่งนี้เข้าร่วมในโหมด transcribe รอการเคลื่อนไหวของ caption หรือ transcript ใหม่ แล้วส่งคืน `listenVerified`, `listenTimedOut`, ฟิลด์การดำเนินการแบบแมนนวล และสถานะ caption ล่าสุด
+สำหรับการเข้าร่วมแบบดูอย่างเดียว/ควบคุมเบราว์เซอร์ ให้ตั้งค่า `"mode": "transcribe"` โหมดนั้น
+จะไม่เริ่มสะพาน realtime voice แบบสองทาง ไม่ต้องใช้ BlackHole หรือ SoX
+และจะไม่พูดตอบกลับเข้าไปในการประชุม การเข้าร่วม Chrome ในโหมดนี้ยังหลีกเลี่ยง
+การให้สิทธิ์ไมโครโฟน/กล้องของ OpenClaw และหลีกเลี่ยงเส้นทาง **Use
+microphone** ของ Meet หาก Meet แสดง interstitial สำหรับเลือกเสียง ระบบอัตโนมัติจะพยายาม
+ใช้เส้นทางไม่มีไมโครโฟน และมิฉะนั้นจะรายงานการกระทำด้วยตนเองแทนการเปิด
+ไมโครโฟนในเครื่อง ในโหมด transcribe, transport Chrome ที่จัดการแล้วยังติดตั้ง
+ตัวสังเกตคำบรรยาย Meet แบบ best-effort ด้วย `googlemeet status --json` และ
+`googlemeet doctor` แสดง `captioning`, `captionsEnabledAttempted`,
+`transcriptLines`, `lastCaptionAt`, `lastCaptionSpeaker`, `lastCaptionText`,
+และ tail `recentTranscript` แบบสั้น เพื่อให้ operators ทราบได้ว่าเบราว์เซอร์
+เข้าร่วมสายแล้วหรือไม่ และคำบรรยาย Meet กำลังสร้างข้อความหรือไม่
+ใช้ `openclaw googlemeet test-listen --transport chrome-node` เมื่อ
+คุณต้องการ probe แบบใช่/ไม่ใช่: คำสั่งนี้เข้าร่วมในโหมด transcribe รอการเคลื่อนไหวของคำบรรยายหรือ
+transcript ใหม่ และส่งกลับ `listenVerified`, `listenTimedOut`, ฟิลด์การกระทำด้วยตนเอง
+และสถานะคำบรรยายล่าสุด
-ระหว่างเซสชัน realtime, สถานะ `google_meet` จะรวมสถานะสุขภาพของเบราว์เซอร์และสะพานเสียง เช่น `inCall`, `manualActionRequired`, `providerConnected`, `realtimeReady`, `audioInputActive`, `audioOutputActive`, timestamp อินพุต/เอาต์พุตล่าสุด ตัวนับ byte และสถานะปิดของสะพาน หากมีพรอมป์หน้า Meet ที่ปลอดภัยปรากฏขึ้น ระบบอัตโนมัติของเบราว์เซอร์จะจัดการเมื่อทำได้ การเข้าสู่ระบบ การรับเข้าของโฮสต์ และพรอมป์สิทธิ์ของเบราว์เซอร์/OS จะถูกรายงานเป็นการดำเนินการแบบแมนนวลพร้อมเหตุผลและข้อความเพื่อให้เอเจนต์ถ่ายทอดต่อ เซสชัน Chrome ที่จัดการแล้วจะปล่อย intro หรือวลีทดสอบเฉพาะหลังจากสถานะสุขภาพของเบราว์เซอร์รายงาน `inCall: true`; มิฉะนั้นสถานะจะรายงาน `speechReady: false` และความพยายามพูดจะถูกบล็อกแทนการแสร้งว่าเอเจนต์พูดเข้าไปในการประชุมแล้ว
+ระหว่าง session realtime, สถานะ `google_meet` มีสุขภาพของเบราว์เซอร์และสะพานเสียง
+เช่น `inCall`, `manualActionRequired`, `providerConnected`,
+`realtimeReady`, `audioInputActive`, `audioOutputActive`, timestamp อินพุต/เอาต์พุตล่าสุด,
+ตัวนับไบต์ และสถานะสะพานปิด หากพรอมป์หน้า Meet ที่ปลอดภัย
+ปรากฏขึ้น ระบบอัตโนมัติของเบราว์เซอร์จะจัดการเมื่อทำได้ การเข้าสู่ระบบ การอนุญาตจากโฮสต์ และ
+พรอมป์สิทธิ์ของเบราว์เซอร์/OS จะถูกรายงานเป็นการกระทำด้วยตนเองพร้อมเหตุผลและ
+ข้อความให้ agent ถ่ายทอด Managed Chrome sessions จะปล่อย intro หรือ
+วลีทดสอบหลังจากสุขภาพของเบราว์เซอร์รายงาน `inCall: true` เท่านั้น; มิฉะนั้นสถานะจะรายงาน
+`speechReady: false` และความพยายามพูดจะถูกบล็อก แทนที่จะแกล้งว่า
+agent พูดเข้าไปในการประชุมแล้ว
-การเข้าร่วม Chrome ในเครื่องใช้โปรไฟล์เบราว์เซอร์ OpenClaw ที่ลงชื่อเข้าใช้แล้ว โหมด realtime ต้องใช้ `BlackHole 2ch` สำหรับเส้นทางไมโครโฟน/ลำโพงที่ OpenClaw ใช้ สำหรับเสียงสองทางที่สะอาด ให้ใช้อุปกรณ์เสมือนแยกกันหรือกราฟแบบ Loopback; อุปกรณ์ BlackHole เดี่ยวเพียงพอสำหรับ smoke test แรก แต่อาจเกิด echo ได้
+การเข้าร่วม Chrome ในเครื่องใช้โปรไฟล์เบราว์เซอร์ OpenClaw ที่ลงชื่อเข้าใช้แล้ว โหมด Realtime
+ต้องใช้ `BlackHole 2ch` สำหรับเส้นทางไมโครโฟน/ลำโพงที่ OpenClaw ใช้ สำหรับ
+เสียงสองทางที่สะอาด ให้ใช้อุปกรณ์เสมือนแยกกันหรือกราฟแบบ Loopback; อุปกรณ์
+BlackHole เดียวเพียงพอสำหรับ smoke test แรก แต่อาจเกิดเสียงสะท้อน
-### Gateway ในเครื่อง + Chrome บน Parallels
+### Gateway ในเครื่อง + Parallels Chrome
-คุณ **ไม่** ต้องมี OpenClaw Gateway เต็มรูปแบบหรือคีย์ model API ภายใน VM macOS เพียงเพื่อให้ VM เป็นเจ้าของ Chrome รัน Gateway และเอเจนต์ในเครื่อง แล้วรันโฮสต์ node ใน VM เปิดใช้ Plugin ที่รวมมาบน VM หนึ่งครั้งเพื่อให้ node โฆษณาคำสั่ง Chrome:
+คุณ **ไม่** จำเป็นต้องมี OpenClaw Gateway เต็มรูปแบบหรือคีย์ model API ภายใน macOS VM
+เพียงเพื่อให้ VM เป็นเจ้าของ Chrome ให้รัน Gateway และ agent ในเครื่อง แล้วรัน
+โฮสต์ Node ใน VM เปิดใช้งาน Plugin ที่บันเดิลมากับ VM หนึ่งครั้ง เพื่อให้ Node
+ประกาศคำสั่ง Chrome:
-สิ่งที่รันในแต่ละที่:
+สิ่งที่รันอยู่ที่ไหน:
-- โฮสต์ Gateway: OpenClaw Gateway, พื้นที่ทำงานเอเจนต์, คีย์ model/API, ผู้ให้บริการ realtime และการกำหนดค่า Plugin Google Meet
-- VM macOS ของ Parallels: OpenClaw CLI/โฮสต์ node, Google Chrome, SoX, BlackHole 2ch และโปรไฟล์ Chrome ที่ลงชื่อเข้าใช้ Google
-- ไม่จำเป็นใน VM: บริการ Gateway, การกำหนดค่าเอเจนต์, คีย์ OpenAI/GPT หรือการตั้งค่าผู้ให้บริการ model
+- โฮสต์ Gateway: OpenClaw Gateway, workspace ของ agent, คีย์ model/API, provider realtime
+ และ config ของ Plugin Google Meet
+- Parallels macOS VM: OpenClaw CLI/โฮสต์ Node, Google Chrome, SoX, BlackHole 2ch,
+ และโปรไฟล์ Chrome ที่ลงชื่อเข้าใช้ Google
+- ไม่จำเป็นใน VM: บริการ Gateway, config ของ agent, คีย์ OpenAI/GPT หรือการตั้งค่า
+ provider model
ติดตั้ง dependency ของ VM:
@@ -171,39 +240,40 @@ openclaw googlemeet create --no-join
brew install blackhole-2ch sox
```
-รีบูต VM หลังติดตั้ง BlackHole เพื่อให้ macOS แสดง `BlackHole 2ch`:
+รีบูต VM หลังติดตั้ง BlackHole เพื่อให้ macOS เปิดเผย `BlackHole 2ch`:
```bash
sudo reboot
```
-หลังรีบูต ตรวจสอบว่า VM มองเห็นอุปกรณ์เสียงและคำสั่ง SoX:
+หลังรีบูต ให้ตรวจสอบว่า VM เห็นอุปกรณ์เสียงและคำสั่ง SoX ได้:
```bash
system_profiler SPAudioDataType | grep -i BlackHole
command -v sox
```
-ติดตั้งหรืออัปเดต OpenClaw ใน VM แล้วเปิดใช้ Plugin ที่รวมมาไว้ที่นั่น:
+ติดตั้งหรืออัปเดต OpenClaw ใน VM แล้วเปิดใช้งาน Plugin ที่บันเดิลไว้ที่นั่น:
```bash
openclaw plugins enable google-meet
```
-เริ่มโฮสต์ node ใน VM:
+เริ่มโฮสต์ Node ใน VM:
```bash
openclaw node run --host --port 18789 --display-name parallels-macos
```
-หาก `` เป็น IP ของ LAN และคุณไม่ได้ใช้ TLS, node จะปฏิเสธ WebSocket แบบ plaintext เว้นแต่คุณจะเลือกใช้สำหรับเครือข่ายส่วนตัวที่เชื่อถือได้นั้น:
+หาก `` เป็น IP บน LAN และคุณไม่ได้ใช้ TLS, Node จะปฏิเสธ
+WebSocket plaintext เว้นแต่คุณจะ opt in สำหรับเครือข่ายส่วนตัวที่เชื่อถือได้นั้น:
```bash
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
openclaw node run --host --port 18789 --display-name parallels-macos
```
-ใช้ตัวแปรสภาพแวดล้อมเดียวกันเมื่อติดตั้ง node เป็น LaunchAgent:
+ใช้ environment variable เดียวกันเมื่อติดตั้ง Node เป็น LaunchAgent:
```bash
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
@@ -211,22 +281,25 @@ OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
openclaw node restart
```
-`OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` เป็นสภาพแวดล้อมของ process ไม่ใช่การตั้งค่า `openclaw.json` `openclaw node install` จะเก็บไว้ในสภาพแวดล้อม LaunchAgent เมื่อมีอยู่ในคำสั่งติดตั้ง
+`OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` เป็น process environment ไม่ใช่การตั้งค่า
+`openclaw.json` `openclaw node install` จะจัดเก็บไว้ใน environment ของ LaunchAgent
+เมื่อมีอยู่ในคำสั่งติดตั้ง
-อนุมัติ node จากโฮสต์ Gateway:
+อนุมัติ Node จากโฮสต์ Gateway:
```bash
openclaw devices list
openclaw devices approve
```
-ยืนยันว่า Gateway เห็น node และ node โฆษณาทั้ง `googlemeet.chrome` และความสามารถของเบราว์เซอร์/`browser.proxy`:
+ยืนยันว่า Gateway เห็น Node และ Node ประกาศทั้ง `googlemeet.chrome`
+และ capability ของเบราว์เซอร์/`browser.proxy`:
```bash
openclaw nodes status
```
-กำหนดเส้นทาง Meet ผ่าน node นั้นบนโฮสต์ Gateway:
+กำหนดเส้นทาง Meet ผ่าน Node นั้นบนโฮสต์ Gateway:
```json5
{
@@ -262,85 +335,86 @@ openclaw nodes status
openclaw googlemeet join https://meet.google.com/abc-defg-hij
```
-หรือขอให้เอเจนต์ใช้เครื่องมือ `google_meet` ด้วย `transport: "chrome-node"`
+หรือขอให้ agent ใช้เครื่องมือ `google_meet` พร้อม `transport: "chrome-node"`
-สำหรับ smoke test แบบคำสั่งเดียวที่สร้างหรือใช้เซสชันซ้ำ พูดวลีที่รู้ล่วงหน้า และพิมพ์สถานะสุขภาพของเซสชัน:
+สำหรับ smoke test แบบคำสั่งเดียวที่สร้างหรือใช้ session ซ้ำ พูดวลีที่รู้ล่วงหน้า
+และพิมพ์สุขภาพ session:
```bash
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij
```
-ระหว่างการเข้าร่วมแบบเรียลไทม์ ระบบอัตโนมัติของเบราว์เซอร์ OpenClaw จะกรอกชื่อผู้เข้าร่วม คลิก
-เข้าร่วม/ขอเข้าร่วม และยอมรับตัวเลือก "Use microphone" ครั้งแรกของ Meet เมื่อพรอมต์นั้น
-ปรากฏขึ้น ระหว่างการเข้าร่วมแบบสังเกตการณ์เท่านั้นหรือการสร้างการประชุมเฉพาะเบราว์เซอร์ ระบบจะ
-ดำเนินต่อผ่านพรอมต์เดียวกันโดยไม่ใช้ไมโครโฟนเมื่อตัวเลือกนั้นพร้อมใช้งาน
-หากโปรไฟล์เบราว์เซอร์ไม่ได้ลงชื่อเข้าใช้, Meet กำลังรอการอนุมัติจากผู้จัด,
+ระหว่างการเข้าร่วมแบบเรียลไทม์ ระบบอัตโนมัติของเบราว์เซอร์ OpenClaw จะกรอกชื่อผู้เข้าร่วม กด
+เข้าร่วม/ขอเข้าร่วม และยอมรับตัวเลือก "ใช้ไมโครโฟน" เมื่อใช้งาน Meet ครั้งแรก หาก
+พรอมป์นั้นปรากฏขึ้น ระหว่างการเข้าร่วมแบบสังเกตการณ์อย่างเดียวหรือการสร้างการประชุมผ่านเบราว์เซอร์เท่านั้น ระบบจะ
+ดำเนินการผ่านพรอมป์เดียวกันต่อไปโดยไม่ใช้ไมโครโฟน เมื่อมีตัวเลือกนั้นให้ใช้
+หากโปรไฟล์เบราว์เซอร์ยังไม่ได้ลงชื่อเข้าใช้, Meet กำลังรอการอนุมัติจากโฮสต์,
Chrome ต้องการสิทธิ์ไมโครโฟน/กล้องสำหรับการเข้าร่วมแบบเรียลไทม์ หรือ Meet ค้างอยู่
-ที่พรอมต์ที่ระบบอัตโนมัติแก้ไม่ได้ ผลลัพธ์ join/test-speech จะรายงาน
+ที่พรอมป์ซึ่งระบบอัตโนมัติแก้ไขไม่ได้ ผลลัพธ์ join/test-speech จะรายงาน
`manualActionRequired: true` พร้อม `manualActionReason` และ
-`manualActionMessage` Agents ควรหยุดลองเข้าร่วมซ้ำ รายงานข้อความนั้นแบบตรงตัว
+`manualActionMessage` เอเจนต์ควรหยุดลองเข้าร่วมซ้ำ รายงานข้อความที่ตรงนั้น
พร้อม `browserUrl`/`browserTitle` ปัจจุบัน และลองใหม่เฉพาะหลังจาก
-การดำเนินการด้วยตนเองในเบราว์เซอร์เสร็จสมบูรณ์แล้ว
+ดำเนินการด้วยตนเองในเบราว์เซอร์เสร็จแล้วเท่านั้น
หากละเว้น `chromeNode.node` OpenClaw จะเลือกอัตโนมัติเฉพาะเมื่อมี Node ที่เชื่อมต่ออยู่
-เพียงหนึ่งรายการที่ประกาศทั้ง `googlemeet.chrome` และการควบคุมเบราว์เซอร์ หากมี Node
-ที่รองรับหลายรายการเชื่อมต่ออยู่ ให้ตั้ง `chromeNode.node` เป็น id ของ Node,
+เพียงหนึ่ง Node ที่ประกาศทั้ง `googlemeet.chrome` และการควบคุมเบราว์เซอร์ หาก
+มี Node ที่รองรับหลาย Node เชื่อมต่ออยู่ ให้ตั้งค่า `chromeNode.node` เป็นรหัส Node,
ชื่อที่แสดง หรือ IP ระยะไกล
การตรวจสอบความล้มเหลวที่พบบ่อย:
-- `Configured Google Meet node ... is not usable: offline`: Node ที่ปักหมุดไว้
- เป็นที่รู้จักของ Gateway แต่ไม่พร้อมใช้งาน Agents ควรมอง Node นั้นเป็น
- สถานะสำหรับวินิจฉัย ไม่ใช่เป็นโฮสต์ Chrome ที่ใช้งานได้ และรายงานตัวบล็อกการตั้งค่า
- แทนที่จะถอยกลับไปใช้การขนส่งอื่น เว้นแต่ผู้ใช้จะขอเช่นนั้น
+- `Configured Google Meet node ... is not usable: offline`: Node ที่ปักหมุดไว้เป็น
+ ที่รู้จักของ Gateway แต่ไม่พร้อมใช้งาน เอเจนต์ควรถือว่า Node นั้นเป็น
+ สถานะวินิจฉัย ไม่ใช่โฮสต์ Chrome ที่ใช้ได้ และรายงานตัวบล็อกการตั้งค่า
+ แทนที่จะถอยกลับไปใช้ทรานสปอร์ตอื่น เว้นแต่ผู้ใช้จะขอให้ทำเช่นนั้น
- `No connected Google Meet-capable node`: เริ่ม `openclaw node run` ใน VM,
อนุมัติการจับคู่ และตรวจสอบให้แน่ใจว่าได้รัน `openclaw plugins enable google-meet` และ
- `openclaw plugins enable browser` ใน VM แล้ว นอกจากนี้ให้ยืนยันว่า
+ `openclaw plugins enable browser` ใน VM แล้ว ยืนยันด้วยว่า
โฮสต์ Gateway อนุญาตคำสั่ง Node ทั้งสองรายการด้วย
`gateway.nodes.allowCommands: ["googlemeet.chrome", "browser.proxy"]`
- `BlackHole 2ch audio device not found`: ติดตั้ง `blackhole-2ch` บนโฮสต์
- ที่กำลังตรวจสอบ และรีบูตก่อนใช้เสียง Chrome แบบโลคัล
+ ที่กำลังตรวจสอบและรีบูตก่อนใช้เสียง Chrome ภายในเครื่อง
- `BlackHole 2ch audio device not found on the node`: ติดตั้ง `blackhole-2ch`
ใน VM และรีบูต VM
- Chrome เปิดขึ้นแต่เข้าร่วมไม่ได้: ลงชื่อเข้าใช้โปรไฟล์เบราว์เซอร์ภายใน VM หรือ
- ตั้งค่า `chrome.guestName` ไว้สำหรับการเข้าร่วมแบบผู้เข้าร่วม Guest auto-join ใช้ระบบอัตโนมัติของ
- เบราว์เซอร์ OpenClaw ผ่านพร็อกซีเบราว์เซอร์ของ Node; ตรวจสอบให้แน่ใจว่าคอนฟิกเบราว์เซอร์ของ Node
- ชี้ไปที่โปรไฟล์ที่คุณต้องการ เช่น
- `browser.defaultProfile: "user"` หรือโปรไฟล์ named existing-session
+ คงค่า `chrome.guestName` ไว้สำหรับการเข้าร่วมแบบแขก การเข้าร่วมอัตโนมัติแบบแขกใช้ระบบอัตโนมัติ
+ ของเบราว์เซอร์ OpenClaw ผ่านพร็อกซีเบราว์เซอร์ของ Node ตรวจสอบให้แน่ใจว่าคอนฟิกเบราว์เซอร์
+ ของ Node ชี้ไปยังโปรไฟล์ที่คุณต้องการ เช่น
+ `browser.defaultProfile: "user"` หรือโปรไฟล์เซสชันที่มีอยู่และตั้งชื่อไว้
- แท็บ Meet ซ้ำ: เปิดใช้ `chrome.reuseExistingTab: true` ไว้ OpenClaw
จะเปิดใช้งานแท็บที่มีอยู่สำหรับ URL Meet เดียวกันก่อนเปิดแท็บใหม่ และ
การสร้างการประชุมผ่านเบราว์เซอร์จะใช้แท็บ `https://meet.google.com/new`
- หรือแท็บพรอมต์บัญชี Google ที่กำลังดำเนินอยู่ซ้ำก่อนเปิดอีกแท็บหนึ่ง
+ ที่กำลังดำเนินอยู่หรือแท็บพรอมป์บัญชี Google ก่อนเปิดอีกแท็บหนึ่ง
- ไม่มีเสียง: ใน Meet ให้กำหนดเส้นทางเสียงไมโครโฟน/ลำโพงผ่านเส้นทางอุปกรณ์เสียงเสมือน
- ที่ OpenClaw ใช้; ใช้อุปกรณ์เสมือนแยกกันหรือการกำหนดเส้นทางแบบ Loopback
- เพื่อเสียงดูเพล็กซ์ที่สะอาด
+ ที่ OpenClaw ใช้ ใช้อุปกรณ์เสมือนแยกกันหรือการกำหนดเส้นทางแบบ Loopback
+ เพื่อเสียงสองทิศทางที่สะอาด
## หมายเหตุการติดตั้ง
-ค่าเริ่มต้น Chrome แบบเรียลไทม์ใช้เครื่องมือภายนอกสองรายการ:
+ค่าเริ่มต้นของการตอบกลับเสียง Chrome ใช้เครื่องมือภายนอกสองรายการ:
- `sox`: ยูทิลิตีเสียงแบบบรรทัดคำสั่ง Plugin ใช้คำสั่งอุปกรณ์ CoreAudio
- แบบชัดเจนสำหรับบริดจ์เสียง PCM16 24 kHz ค่าเริ่มต้น
-- `blackhole-2ch`: ไดรเวอร์เสียงเสมือน macOS สร้างอุปกรณ์เสียง `BlackHole 2ch`
+ อย่างชัดเจนสำหรับบริดจ์เสียง PCM16 24 kHz เริ่มต้น
+- `blackhole-2ch`: ไดรเวอร์เสียงเสมือนของ macOS สร้างอุปกรณ์เสียง `BlackHole 2ch`
ที่ Chrome/Meet สามารถกำหนดเส้นทางผ่านได้
-OpenClaw ไม่ได้รวมแพ็กเกจหรือแจกจ่ายแพ็กเกจใดแพ็กเกจหนึ่ง เอกสารขอให้ผู้ใช้
+OpenClaw ไม่ได้รวมแพ็กเกจใดแพ็กเกจหนึ่งไว้หรือแจกจ่ายต่อ เอกสารขอให้ผู้ใช้
ติดตั้งเป็น dependency ของโฮสต์ผ่าน Homebrew SoX อยู่ภายใต้สัญญาอนุญาต
`LGPL-2.0-only AND GPL-2.0-only`; BlackHole เป็น GPL-3.0 หากคุณสร้าง
-ตัวติดตั้งหรือแอปพลายแอนซ์ที่รวม BlackHole กับ OpenClaw ให้ตรวจสอบเงื่อนไขสัญญาอนุญาต
+ตัวติดตั้งหรือแอปพลายแอนซ์ที่รวม BlackHole กับ OpenClaw ให้ตรวจสอบข้อกำหนดสัญญาอนุญาต
ต้นทางของ BlackHole หรือขอใบอนุญาตแยกต่างหากจาก Existential Audio
-## การขนส่ง
+## ทรานสปอร์ต
### Chrome
-การขนส่ง Chrome เปิด URL Meet ผ่านการควบคุมเบราว์เซอร์ OpenClaw และเข้าร่วม
-ด้วยโปรไฟล์เบราว์เซอร์ OpenClaw ที่ลงชื่อเข้าใช้อยู่ บน macOS Plugin จะตรวจสอบ
-`BlackHole 2ch` ก่อนเริ่มทำงาน หากกำหนดค่าไว้ ระบบจะรันคำสั่งตรวจสุขภาพบริดจ์เสียง
+ทรานสปอร์ต Chrome เปิด URL Meet ผ่านการควบคุมเบราว์เซอร์ของ OpenClaw และเข้าร่วม
+ในฐานะโปรไฟล์เบราว์เซอร์ OpenClaw ที่ลงชื่อเข้าใช้แล้ว บน macOS, Plugin จะตรวจสอบ
+`BlackHole 2ch` ก่อนเปิดใช้งาน หากมีการคอนฟิกไว้ ระบบจะรันคำสั่งตรวจสุขภาพบริดจ์เสียง
และคำสั่งเริ่มต้นก่อนเปิด Chrome ด้วย ใช้ `chrome` เมื่อ
Chrome/เสียงอยู่บนโฮสต์ Gateway; ใช้ `chrome-node` เมื่อ Chrome/เสียงอยู่
-บน Node ที่จับคู่แล้ว เช่น Parallels macOS VM สำหรับ Chrome แบบโลคัล ให้เลือก
-โปรไฟล์ด้วย `browser.defaultProfile`; `chrome.browserProfile` จะถูกส่งต่อไปยัง
+บน Node ที่จับคู่ไว้ เช่น Parallels macOS VM สำหรับ Chrome ภายในเครื่อง ให้เลือก
+โปรไฟล์ด้วย `browser.defaultProfile`; `chrome.browserProfile` จะถูกส่งไปยัง
โฮสต์ `chrome-node`
```bash
@@ -348,18 +422,18 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome-node
```
-กำหนดเส้นทางเสียงไมโครโฟนและลำโพง Chrome ผ่านบริดจ์เสียง OpenClaw แบบโลคัล
-หากไม่ได้ติดตั้ง `BlackHole 2ch` การเข้าร่วมจะล้มเหลวด้วยข้อผิดพลาดการตั้งค่า
+กำหนดเส้นทางเสียงไมโครโฟนและลำโพงของ Chrome ผ่านบริดจ์เสียง OpenClaw ภายในเครื่อง
+หากไม่ได้ติดตั้ง `BlackHole 2ch` การเข้าร่วมจะล้มเหลวพร้อมข้อผิดพลาดการตั้งค่า
แทนที่จะเข้าร่วมแบบเงียบ ๆ โดยไม่มีเส้นทางเสียง
### Twilio
-การขนส่ง Twilio เป็นแผนการโทรแบบเข้มงวดที่มอบหมายให้ Voice Call Plugin
-ระบบจะไม่แยกวิเคราะห์หน้า Meet เพื่อหาเบอร์โทรศัพท์
+ทรานสปอร์ต Twilio เป็นแผนการโทรที่เข้มงวดซึ่งมอบหมายให้ Voice Call Plugin
+ไม่ได้แยกวิเคราะห์หน้า Meet เพื่อหาหมายเลขโทรศัพท์
-ใช้ตัวเลือกนี้เมื่อไม่สามารถเข้าร่วมผ่าน Chrome ได้ หรือคุณต้องการทางเลือกสำรอง
-แบบโทรเข้า Google Meet ต้องแสดงหมายเลขโทรเข้าและ PIN สำหรับ
-การประชุม; OpenClaw จะไม่ค้นหาข้อมูลเหล่านั้นจากหน้า Meet
+ใช้ตัวเลือกนี้เมื่อไม่สามารถเข้าร่วมผ่าน Chrome ได้ หรือคุณต้องการตัวเลือกสำรอง
+แบบโทรเข้า Google Meet ต้องเปิดเผยหมายเลขโทรเข้าและ PIN สำหรับ
+การประชุม OpenClaw จะไม่ค้นพบข้อมูลเหล่านั้นจากหน้า Meet
เปิดใช้ Voice Call Plugin บนโฮสต์ Gateway ไม่ใช่บน Node Chrome:
@@ -386,8 +460,8 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome
}
```
-ระบุข้อมูลประจำตัว Twilio ผ่านสภาพแวดล้อมหรือคอนฟิก สภาพแวดล้อมช่วยเก็บ
-ความลับออกจาก `openclaw.json`:
+ให้ข้อมูลรับรอง Twilio ผ่านสภาพแวดล้อมหรือคอนฟิก สภาพแวดล้อมช่วยเก็บความลับ
+ไม่ให้ไปอยู่ใน `openclaw.json`:
```bash
export TWILIO_ACCOUNT_SID=AC...
@@ -395,8 +469,8 @@ export TWILIO_AUTH_TOKEN=...
export TWILIO_FROM_NUMBER=+15550001234
```
-รีสตาร์ตหรือโหลด Gateway ใหม่หลังจากเปิดใช้ `voice-call`; การเปลี่ยนแปลงคอนฟิก Plugin
-จะไม่ปรากฏในกระบวนการ Gateway ที่กำลังทำงานอยู่จนกว่าจะโหลดใหม่
+รีสตาร์ทหรือโหลด Gateway ใหม่หลังเปิดใช้ `voice-call`; การเปลี่ยนแปลงคอนฟิก Plugin
+จะไม่ปรากฏในกระบวนการ Gateway ที่กำลังรันอยู่จนกว่าจะโหลดใหม่
จากนั้นตรวจสอบ:
@@ -406,7 +480,7 @@ openclaw plugins list | grep -E 'google-meet|voice-call'
openclaw googlemeet setup
```
-เมื่อเชื่อมต่อการมอบหมาย Twilio แล้ว `googlemeet setup` จะรวมการตรวจสอบ
+เมื่อเชื่อมต่อการมอบหมาย Twilio แล้ว `googlemeet setup` จะมีการตรวจสอบ
`twilio-voice-call-plugin`, `twilio-voice-call-credentials` และ
`twilio-voice-call-webhook` ที่สำเร็จ
@@ -428,31 +502,31 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \
## OAuth และ preflight
-OAuth เป็นทางเลือกสำหรับการสร้างลิงก์ Meet เพราะ `googlemeet create` สามารถถอยกลับไปใช้
-ระบบอัตโนมัติของเบราว์เซอร์ได้ กำหนดค่า OAuth เมื่อคุณต้องการการสร้างผ่าน API อย่างเป็นทางการ,
-การแปลง space หรือการตรวจสอบ preflight ของ Meet Media API
+OAuth เป็นทางเลือกสำหรับการสร้างลิงก์ Meet เพราะ `googlemeet create` สามารถถอยกลับ
+ไปใช้ระบบอัตโนมัติของเบราว์เซอร์ได้ คอนฟิก OAuth เมื่อคุณต้องการการสร้างผ่าน API ทางการ,
+การระบุพื้นที่ หรือการตรวจ preflight ของ Meet Media API
-การเข้าถึง Google Meet API ใช้ OAuth ของผู้ใช้: สร้างไคลเอ็นต์ OAuth ของ Google Cloud,
-ขอ scope ที่จำเป็น, อนุญาตบัญชี Google จากนั้นจัดเก็บ
-refresh token ที่ได้ในคอนฟิก Google Meet Plugin หรือระบุ
+การเข้าถึง Google Meet API ใช้ OAuth ของผู้ใช้: สร้างไคลเอนต์ Google Cloud OAuth,
+ขอ scope ที่จำเป็น อนุญาตบัญชี Google จากนั้นเก็บ
+refresh token ที่ได้ไว้ในคอนฟิก Google Meet Plugin หรือระบุ
ตัวแปรสภาพแวดล้อม `OPENCLAW_GOOGLE_MEET_*`
-OAuth ไม่ได้แทนที่เส้นทางการเข้าร่วมผ่าน Chrome การขนส่ง Chrome และ Chrome-node
-ยังคงเข้าร่วมผ่านโปรไฟล์ Chrome ที่ลงชื่อเข้าใช้อยู่, BlackHole/SoX และ Node
-ที่เชื่อมต่อเมื่อคุณใช้การเข้าร่วมผ่านเบราว์เซอร์ OAuth ใช้เฉพาะสำหรับเส้นทาง
-Google Meet API อย่างเป็นทางการ: สร้าง meeting spaces, แปลง spaces และรัน
-การตรวจสอบ preflight ของ Meet Media API
+OAuth ไม่ได้แทนที่เส้นทางเข้าร่วมผ่าน Chrome ทรานสปอร์ต Chrome และ Chrome-node
+ยังคงเข้าร่วมผ่านโปรไฟล์ Chrome ที่ลงชื่อเข้าใช้แล้ว, BlackHole/SoX และ Node ที่เชื่อมต่อ
+เมื่อคุณใช้การเข้าร่วมผ่านเบราว์เซอร์ OAuth ใช้เฉพาะกับเส้นทาง Google
+Meet API ทางการ: สร้างพื้นที่การประชุม, ระบุพื้นที่ และรันการตรวจ preflight
+ของ Meet Media API
-### สร้างข้อมูลประจำตัว Google
+### สร้างข้อมูลรับรอง Google
ใน Google Cloud Console:
1. สร้างหรือเลือกโปรเจกต์ Google Cloud
2. เปิดใช้ **Google Meet REST API** สำหรับโปรเจกต์นั้น
-3. กำหนดค่าหน้าจอคำยินยอม OAuth
+3. คอนฟิกหน้าจอความยินยอม OAuth
- **Internal** ง่ายที่สุดสำหรับองค์กร Google Workspace
- - **External** ใช้ได้กับการตั้งค่าส่วนตัว/ทดสอบ; ขณะที่แอปอยู่ใน Testing
- ให้เพิ่มบัญชี Google แต่ละบัญชีที่จะอนุญาตแอปเป็น test user
+ - **External** ใช้ได้กับการตั้งค่าส่วนตัว/ทดสอบ ขณะที่แอปอยู่ในสถานะ Testing
+ ให้เพิ่มบัญชี Google แต่ละบัญชีที่จะอนุญาตแอปเป็นผู้ใช้ทดสอบ
4. เพิ่ม scope ที่ OpenClaw ขอ:
- `https://www.googleapis.com/auth/meetings.space.created`
- `https://www.googleapis.com/auth/meetings.space.readonly`
@@ -460,7 +534,7 @@ Google Meet API อย่างเป็นทางการ: สร้าง m
- `https://www.googleapis.com/auth/meetings.conference.media.readonly`
5. สร้าง OAuth client ID
- ประเภทแอปพลิเคชัน: **Web application**
- - URI เปลี่ยนเส้นทางที่ได้รับอนุญาต:
+ - URI เปลี่ยนเส้นทางที่อนุญาต:
```text
http://localhost:8085/oauth2callback
@@ -469,16 +543,16 @@ Google Meet API อย่างเป็นทางการ: สร้าง m
6. คัดลอก client ID และ client secret
`meetings.space.created` จำเป็นสำหรับ Google Meet `spaces.create`
-`meetings.space.readonly` ช่วยให้ OpenClaw แปลง URL/โค้ด Meet เป็น spaces ได้
+`meetings.space.readonly` ช่วยให้ OpenClaw ระบุ URL/รหัส Meet ไปยังพื้นที่ได้
`meetings.space.settings` ช่วยให้ OpenClaw ส่งการตั้งค่า `SpaceConfig` เช่น
`accessType` ระหว่างการสร้างห้องผ่าน API
-`meetings.conference.media.readonly` ใช้สำหรับ preflight ของ Meet Media API และงานสื่อ;
-Google อาจต้องให้ลงทะเบียน Developer Preview สำหรับการใช้ Media API จริง
-หากคุณต้องการแค่การเข้าร่วมผ่าน Chrome ที่ใช้เบราว์เซอร์ ให้ข้าม OAuth ไปทั้งหมด
+`meetings.conference.media.readonly` ใช้สำหรับ preflight ของ Meet Media API และงานสื่อ
+Google อาจต้องการการลงทะเบียน Developer Preview สำหรับการใช้งาน Media API จริง
+หากคุณต้องการเพียงการเข้าร่วมผ่าน Chrome บนเบราว์เซอร์ ให้ข้าม OAuth ทั้งหมด
### ออก refresh token
-กำหนดค่า `oauth.clientId` และเลือกกำหนด `oauth.clientSecret` หรือส่งผ่านเป็น
+คอนฟิก `oauth.clientId` และเลือกคอนฟิก `oauth.clientSecret` หรือส่งผ่านเป็น
ตัวแปรสภาพแวดล้อม จากนั้นรัน:
```bash
@@ -486,8 +560,8 @@ openclaw googlemeet auth login --json
```
คำสั่งจะพิมพ์บล็อกคอนฟิก `oauth` พร้อม refresh token โดยใช้ PKCE,
-callback localhost ที่ `http://localhost:8085/oauth2callback` และขั้นตอน
-คัดลอก/วางด้วยตนเองผ่าน `--manual`
+คอลแบ็ก localhost ที่ `http://localhost:8085/oauth2callback` และโฟลว์
+คัดลอก/วางด้วยตนเองเมื่อใช้ `--manual`
ตัวอย่าง:
@@ -497,7 +571,7 @@ OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \
openclaw googlemeet auth login --json
```
-ใช้โหมด manual เมื่อเบราว์เซอร์เข้าถึง callback แบบโลคัลไม่ได้:
+ใช้โหมดด้วยตนเองเมื่อเบราว์เซอร์เข้าถึงคอลแบ็กภายในเครื่องไม่ได้:
```bash
OPENCLAW_GOOGLE_MEET_CLIENT_ID="your-client-id" \
@@ -520,7 +594,7 @@ openclaw googlemeet auth login --json --manual
}
```
-จัดเก็บอ็อบเจ็กต์ `oauth` ใต้คอนฟิก Google Meet Plugin:
+เก็บอ็อบเจ็กต์ `oauth` ไว้ใต้คอนฟิก Google Meet Plugin:
```json5
{
@@ -542,60 +616,60 @@ openclaw googlemeet auth login --json --manual
```
ควรใช้ตัวแปรสภาพแวดล้อมเมื่อคุณไม่ต้องการให้ refresh token อยู่ในคอนฟิก
-หากมีทั้งค่าคอนฟิกและค่าสภาพแวดล้อม Plugin จะ resolve คอนฟิก
-ก่อน แล้วจึงใช้สภาพแวดล้อมเป็น fallback
+หากมีทั้งค่าคอนฟิกและค่าสภาพแวดล้อม Plugin จะใช้คอนฟิกก่อน
+แล้วจึงใช้ค่าสภาพแวดล้อมเป็น fallback
-คำยินยอม OAuth รวมการสร้าง Meet space, สิทธิ์อ่าน Meet space และสิทธิ์อ่าน
-สื่อการประชุม Meet หากคุณยืนยันตัวตนก่อนมีการรองรับการสร้างการประชุม
-ให้รัน `openclaw googlemeet auth login --json` อีกครั้งเพื่อให้ refresh
-token มี scope `meetings.space.created`
+ความยินยอม OAuth รวมการสร้างพื้นที่ Meet, สิทธิ์อ่านพื้นที่ Meet และสิทธิ์อ่านสื่อ
+การประชุม Meet หากคุณยืนยันตัวตนก่อนที่การรองรับการสร้างการประชุมจะมีอยู่
+ให้รัน `openclaw googlemeet auth login --json` ใหม่ เพื่อให้ refresh token
+มี scope `meetings.space.created`
### ตรวจสอบ OAuth ด้วย doctor
-รัน OAuth doctor เมื่อคุณต้องการตรวจสุขภาพแบบรวดเร็วที่ไม่เปิดเผยความลับ:
+รัน OAuth doctor เมื่อคุณต้องการตรวจสุขภาพที่รวดเร็วและไม่เปิดเผยความลับ:
```bash
openclaw googlemeet doctor --oauth --json
```
-คำสั่งนี้จะไม่โหลด runtime ของ Chrome หรือจำเป็นต้องมี Node Chrome ที่เชื่อมต่ออยู่
-คำสั่งตรวจสอบว่ามีคอนฟิก OAuth และ refresh token สามารถออก access
-token ได้ รายงาน JSON จะมีเฉพาะฟิลด์สถานะ เช่น `ok`, `configured`,
+คำสั่งนี้จะไม่โหลดรันไทม์ Chrome หรือจำเป็นต้องมี Node Chrome ที่เชื่อมต่ออยู่
+จะตรวจว่ามีคอนฟิก OAuth และ refresh token สามารถออก access
+token ได้ รายงาน JSON มีเฉพาะฟิลด์สถานะ เช่น `ok`, `configured`,
`tokenSource`, `expiresAt` และข้อความตรวจสอบ; จะไม่พิมพ์ access
token, refresh token หรือ client secret
ผลลัพธ์ที่พบบ่อย:
-| การตรวจสอบ | ความหมาย |
+| การตรวจสอบ | ความหมาย |
| -------------------- | --------------------------------------------------------------------------------------- |
-| `oauth-config` | มี `oauth.clientId` พร้อม `oauth.refreshToken` หรือ access token ที่แคชไว้ |
-| `oauth-token` | access token ที่แคชไว้ยังใช้ได้ หรือ refresh token ออก access token ใหม่แล้ว |
-| `meet-spaces-get` | การตรวจสอบ `--meeting` ทางเลือกแปลง Meet space ที่มีอยู่แล้วได้ |
-| `meet-spaces-create` | การตรวจสอบ `--create-space` ทางเลือกสร้าง Meet space ใหม่แล้ว |
+| `oauth-config` | มี `oauth.clientId` พร้อม `oauth.refreshToken` หรือ access token ที่แคชไว้ |
+| `oauth-token` | access token ที่แคชไว้ยังใช้ได้ หรือ refresh token ออก access token ใหม่ |
+| `meet-spaces-get` | การตรวจสอบ `--meeting` ที่เป็นทางเลือกระบุพื้นที่ Meet ที่มีอยู่ได้ |
+| `meet-spaces-create` | การตรวจสอบ `--create-space` ที่เป็นทางเลือกสร้างพื้นที่ Meet ใหม่ |
-หากต้องการพิสูจน์การเปิดใช้ Google Meet API และ scope `spaces.create` ด้วย ให้รัน
-การตรวจสอบสร้างที่มีผลข้างเคียง:
+เพื่อพิสูจน์การเปิดใช้ Google Meet API และ scope `spaces.create` ด้วย ให้รัน
+การตรวจสร้างที่มีผลข้างเคียง:
```bash
openclaw googlemeet doctor --oauth --create-space --json
openclaw googlemeet create --no-join --json
```
-`--create-space` สร้าง Meet URL แบบใช้แล้วทิ้ง ใช้เมื่อต้องการยืนยันว่าโปรเจกต์ Google Cloud เปิดใช้ Meet API แล้ว และบัญชีที่ได้รับอนุญาตมี scope `meetings.space.created`
+`--create-space` จะสร้าง URL Meet ชั่วคราวที่ทิ้งได้ ใช้เมื่อต้องการยืนยันว่าโปรเจกต์ Google Cloud เปิดใช้ Meet API แล้ว และบัญชีที่ได้รับอนุญาตมี scope `meetings.space.created`
-เพื่อพิสูจน์สิทธิ์อ่านสำหรับ meeting space ที่มีอยู่:
+เพื่อพิสูจน์สิทธิ์อ่านสำหรับพื้นที่การประชุมที่มีอยู่:
```bash
openclaw googlemeet doctor --oauth --meeting https://meet.google.com/abc-defg-hij --json
openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij
```
-`doctor --oauth --meeting` และ `resolve-space` พิสูจน์สิทธิ์อ่านสำหรับ space ที่มีอยู่ซึ่งบัญชี Google ที่ได้รับอนุญาตสามารถเข้าถึงได้ `403` จากการตรวจสอบเหล่านี้มักหมายความว่า Google Meet REST API ถูกปิดใช้งาน, โทเค็นรีเฟรชที่ให้ความยินยอมแล้วไม่มี scope ที่จำเป็น, หรือบัญชี Google ไม่สามารถเข้าถึง Meet space นั้นได้ ข้อผิดพลาดเกี่ยวกับ refresh token หมายความว่าให้เรียก `openclaw googlemeet auth login
---json` อีกครั้ง แล้วจัดเก็บบล็อก `oauth` ใหม่
+`doctor --oauth --meeting` และ `resolve-space` พิสูจน์สิทธิ์อ่านพื้นที่ที่มีอยู่ซึ่งบัญชี Google ที่ได้รับอนุญาตเข้าถึงได้ `403` จากการตรวจสอบเหล่านี้มักหมายความว่า Google Meet REST API ถูกปิดใช้งาน, refresh token ที่ยินยอมไว้ไม่มี scope ที่จำเป็น, หรือบัญชี Google ไม่สามารถเข้าถึงพื้นที่ Meet นั้นได้ ข้อผิดพลาด refresh-token หมายความว่าให้รัน `openclaw googlemeet auth login
+--json` อีกครั้งแล้วเก็บบล็อก `oauth` ใหม่
-ไม่จำเป็นต้องใช้ข้อมูลรับรอง OAuth สำหรับ browser fallback ในโหมดนั้น การยืนยันตัวตนของ Google มาจากโปรไฟล์ Chrome ที่ลงชื่อเข้าใช้อยู่บน Node ที่เลือก ไม่ได้มาจากการกำหนดค่า OpenClaw
+ไม่จำเป็นต้องมีข้อมูลรับรอง OAuth สำหรับทางเลือกสำรองของเบราว์เซอร์ ในโหมดนั้น การยืนยันตัวตน Google มาจากโปรไฟล์ Chrome ที่ลงชื่อเข้าใช้บนโหนดที่เลือก ไม่ใช่จากการกำหนดค่า OpenClaw
-ตัวแปรสภาพแวดล้อมเหล่านี้รองรับเป็น fallback:
+ตัวแปรสภาพแวดล้อมเหล่านี้รองรับเป็นค่าทางเลือกสำรอง:
- `OPENCLAW_GOOGLE_MEET_CLIENT_ID` หรือ `GOOGLE_MEET_CLIENT_ID`
- `OPENCLAW_GOOGLE_MEET_CLIENT_SECRET` หรือ `GOOGLE_MEET_CLIENT_SECRET`
@@ -606,19 +680,19 @@ openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij
- `OPENCLAW_GOOGLE_MEET_DEFAULT_MEETING` หรือ `GOOGLE_MEET_DEFAULT_MEETING`
- `OPENCLAW_GOOGLE_MEET_PREVIEW_ACK` หรือ `GOOGLE_MEET_PREVIEW_ACK`
-แก้ URL, รหัส, หรือ `spaces/{id}` ของ Meet ผ่าน `spaces.get`:
+แปลง URL Meet, รหัส, หรือ `spaces/{id}` ผ่าน `spaces.get`:
```bash
openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij
```
-เรียก preflight ก่อนทำงานกับสื่อ:
+รันการตรวจสอบล่วงหน้าก่อนงานสื่อ:
```bash
openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij
```
-แสดงรายการอาร์ติแฟกต์การประชุมและข้อมูลการเข้าร่วมหลังจาก Meet สร้างบันทึกการประชุมแล้ว:
+แสดงรายการอาร์ติแฟกต์การประชุมและการเข้าร่วมหลังจาก Meet สร้างระเบียนการประชุมแล้ว:
```bash
openclaw googlemeet artifacts --meeting https://meet.google.com/abc-defg-hij
@@ -626,9 +700,9 @@ openclaw googlemeet attendance --meeting https://meet.google.com/abc-defg-hij
openclaw googlemeet export --meeting https://meet.google.com/abc-defg-hij --output ./meet-export
```
-เมื่อใช้ `--meeting`, `artifacts` และ `attendance` จะใช้บันทึกการประชุมล่าสุดเป็นค่าเริ่มต้น ส่ง `--all-conference-records` เมื่อคุณต้องการทุกบันทึกที่ยังเก็บไว้สำหรับการประชุมนั้น
+เมื่อใช้ `--meeting` ค่า `artifacts` และ `attendance` จะใช้ระเบียนการประชุมล่าสุดตามค่าเริ่มต้น ส่ง `--all-conference-records` เมื่อต้องการทุกระเบียนที่ยังถูกเก็บไว้สำหรับการประชุมนั้น
-การค้นหา Calendar สามารถแก้ meeting URL จาก Google Calendar ก่อนอ่านอาร์ติแฟกต์ Meet ได้:
+การค้นหา Calendar สามารถแปลง URL การประชุมจาก Google Calendar ก่อนอ่านอาร์ติแฟกต์ Meet:
```bash
openclaw googlemeet latest --today
@@ -637,10 +711,10 @@ openclaw googlemeet artifacts --event "Weekly sync"
openclaw googlemeet attendance --today --format csv --output attendance.csv
```
-`--today` ค้นหา Calendar `primary` ของวันนี้เพื่อหาเหตุการณ์ Calendar ที่มีลิงก์ Google Meet ใช้ `--event ` เพื่อค้นหาข้อความเหตุการณ์ที่ตรงกัน และ `--calendar ` สำหรับ Calendar ที่ไม่ใช่ primary การค้นหา Calendar ต้องการการเข้าสู่ระบบ OAuth ใหม่ที่รวม scope แบบอ่านอย่างเดียวสำหรับเหตุการณ์ Calendar
+`--today` ค้นหาปฏิทิน `primary` ของวันนี้เพื่อหาเหตุการณ์ Calendar ที่มีลิงก์ Google Meet ใช้ `--event ` เพื่อค้นหาข้อความเหตุการณ์ที่ตรงกัน และ `--calendar ` สำหรับปฏิทินที่ไม่ใช่ปฏิทินหลัก การค้นหา Calendar ต้องมีการเข้าสู่ระบบ OAuth ใหม่ที่รวม scope อ่านอย่างเดียวสำหรับเหตุการณ์ Calendar
`calendar-events` แสดงตัวอย่างเหตุการณ์ Meet ที่ตรงกันและทำเครื่องหมายเหตุการณ์ที่ `latest`, `artifacts`, `attendance`, หรือ `export` จะเลือก
-หากคุณรู้ conference record id อยู่แล้ว ให้ระบุโดยตรง:
+หากคุณทราบ id ระเบียนการประชุมอยู่แล้ว ให้ระบุโดยตรง:
```bash
openclaw googlemeet latest --meeting https://meet.google.com/abc-defg-hij
@@ -648,14 +722,15 @@ openclaw googlemeet artifacts --conference-record conferenceRecords/abc123 --jso
openclaw googlemeet attendance --conference-record conferenceRecords/abc123 --json
```
-จบการประชุมที่ใช้งานอยู่สำหรับ space ที่สร้างด้วย API เมื่อคุณต้องการปิดห้องหลังการโทร:
+จบการประชุมที่ใช้งานอยู่สำหรับพื้นที่ที่สร้างด้วย API เมื่อต้องการปิดห้องหลังการโทร:
```bash
openclaw googlemeet end-active-conference https://meet.google.com/abc-defg-hij
```
-คำสั่งนี้เรียก Google Meet `spaces.endActiveConference` และต้องใช้ OAuth พร้อม scope `meetings.space.created` สำหรับ space ที่บัญชีที่ได้รับอนุญาตสามารถจัดการได้ OpenClaw รับอินพุตเป็น Meet URL, meeting code, หรือ `spaces/{id}` แล้วแก้เป็นทรัพยากร space ของ API ก่อนจบการประชุมที่ใช้งานอยู่
-คำสั่งนี้แยกจาก `googlemeet leave`: `leave` หยุดการเข้าร่วมแบบ local/session ของ OpenClaw ขณะที่ `end-active-conference` ขอให้ Google Meet จบการประชุมที่ใช้งานอยู่สำหรับ space นั้น
+คำสั่งนี้เรียก Google Meet `spaces.endActiveConference` และต้องใช้ OAuth พร้อม scope `meetings.space.created` สำหรับพื้นที่ที่บัญชีที่ได้รับอนุญาตจัดการได้
+OpenClaw รองรับอินพุตเป็น URL Meet, รหัสการประชุม, หรือ `spaces/{id}` และแปลงเป็นทรัพยากรพื้นที่ของ API ก่อนจบการประชุมที่ใช้งานอยู่
+คำสั่งนี้แยกจาก `googlemeet leave`: `leave` หยุดการเข้าร่วมแบบ local/session ของ OpenClaw ส่วน `end-active-conference` ขอให้ Google Meet จบการประชุมที่ใช้งานอยู่สำหรับพื้นที่นั้น
เขียนรายงานที่อ่านง่าย:
@@ -672,13 +747,13 @@ openclaw googlemeet export --conference-record conferenceRecords/abc123 \
--include-doc-bodies --dry-run
```
-`artifacts` ส่งคืนเมทาดาทาของบันทึกการประชุมพร้อมเมทาดาทาทรัพยากรของผู้เข้าร่วม, การบันทึก, transcript, รายการ transcript แบบมีโครงสร้าง, และ smart-note เมื่อ Google เปิดเผยให้กับการประชุมนั้น ใช้ `--no-transcript-entries` เพื่อข้ามการค้นหารายการสำหรับการประชุมขนาดใหญ่ `attendance` ขยายผู้เข้าร่วมเป็นแถว participant-session พร้อมเวลา first/last seen, ระยะเวลารวมของ session, แฟล็กมาสาย/ออกก่อน, และรวมทรัพยากรผู้เข้าร่วมที่ซ้ำกันตามผู้ใช้ที่ลงชื่อเข้าใช้หรือชื่อที่แสดง ส่ง `--no-merge-duplicates` เพื่อแยกทรัพยากรผู้เข้าร่วมดิบไว้ต่างหาก, `--late-after-minutes` เพื่อปรับการตรวจจับการมาสาย, และ `--early-before-minutes` เพื่อปรับการตรวจจับการออกก่อน
+`artifacts` ส่งคืนเมทาดาทาระเบียนการประชุมพร้อมเมทาดาทาทรัพยากรผู้เข้าร่วม, การบันทึก, ทรานสคริปต์, รายการทรานสคริปต์แบบมีโครงสร้าง, และบันทึกอัจฉริยะ เมื่อ Google เปิดเผยข้อมูลเหล่านี้สำหรับการประชุม ใช้ `--no-transcript-entries` เพื่อข้ามการค้นหารายการสำหรับการประชุมขนาดใหญ่ `attendance` ขยายผู้เข้าร่วมเป็นแถวเซสชันผู้เข้าร่วมพร้อมเวลาเห็นครั้งแรก/ครั้งล่าสุด, ระยะเวลาเซสชันรวม, แฟล็กมาสาย/ออกก่อน, และทรัพยากรผู้เข้าร่วมที่ซ้ำกันซึ่งผสานตามผู้ใช้ที่ลงชื่อเข้าใช้หรือชื่อที่แสดง ส่ง `--no-merge-duplicates` เพื่อเก็บทรัพยากรผู้เข้าร่วมดิบแยกกัน, `--late-after-minutes` เพื่อปรับการตรวจจับการมาสาย, และ `--early-before-minutes` เพื่อปรับการตรวจจับการออกก่อน
-`export` เขียนโฟลเดอร์ที่มี `summary.md`, `attendance.csv`, `transcript.md`, `artifacts.json`, `attendance.json`, และ `manifest.json`
-`manifest.json` บันทึกอินพุตที่เลือก, ตัวเลือกการ export, บันทึกการประชุม, ไฟล์เอาต์พุต, จำนวน, แหล่งที่มาของโทเค็น, เหตุการณ์ Calendar เมื่อมีการใช้, และคำเตือนการดึงข้อมูลบางส่วน ส่ง `--zip` เพื่อเขียนอาร์ไคฟ์พกพาไว้ข้างโฟลเดอร์ด้วย ส่ง `--include-doc-bodies` เพื่อ export ข้อความ Google Docs ของ transcript และ smart-note ที่ลิงก์ผ่าน Google Drive `files.export`; ซึ่งต้องมีการเข้าสู่ระบบ OAuth ใหม่ที่รวม scope แบบอ่านอย่างเดียวของ Drive Meet หากไม่มี `--include-doc-bodies`, การ export จะรวมเฉพาะเมทาดาทาของ Meet และรายการ transcript แบบมีโครงสร้าง หาก Google ส่งคืนความล้มเหลวบางส่วนของอาร์ติแฟกต์ เช่น ข้อผิดพลาดในการแสดงรายการ smart-note, รายการ transcript, หรือเนื้อหาเอกสาร Drive, summary และ manifest จะเก็บคำเตือนไว้แทนที่จะทำให้การ export ทั้งหมดล้มเหลว
-ใช้ `--dry-run` เพื่อดึงข้อมูลอาร์ติแฟกต์/การเข้าร่วมชุดเดียวกันและพิมพ์ manifest JSON โดยไม่สร้างโฟลเดอร์หรือ ZIP ซึ่งมีประโยชน์ก่อนเขียนการ export ขนาดใหญ่ หรือเมื่อเอเจนต์ต้องการเฉพาะจำนวน, บันทึกที่เลือก, และคำเตือน
+`export` เขียนโฟลเดอร์ที่ประกอบด้วย `summary.md`, `attendance.csv`, `transcript.md`, `artifacts.json`, `attendance.json`, และ `manifest.json`
+`manifest.json` บันทึกอินพุตที่เลือก, ตัวเลือกการส่งออก, ระเบียนการประชุม, ไฟล์เอาต์พุต, จำนวน, แหล่งที่มาของโทเค็น, เหตุการณ์ Calendar เมื่อมีการใช้, และคำเตือนการดึงข้อมูลบางส่วน ส่ง `--zip` เพื่อเขียนไฟล์เก็บถาวรแบบพกพาไว้ข้างโฟลเดอร์ด้วย ส่ง `--include-doc-bodies` เพื่อส่งออกข้อความ Google Docs ของทรานสคริปต์และบันทึกอัจฉริยะที่ลิงก์ผ่าน Google Drive `files.export`; สิ่งนี้ต้องใช้การเข้าสู่ระบบ OAuth ใหม่ที่รวม scope อ่านอย่างเดียวของ Drive Meet หากไม่ใช้ `--include-doc-bodies` การส่งออกจะรวมเฉพาะเมทาดาทา Meet และรายการทรานสคริปต์แบบมีโครงสร้างเท่านั้น หาก Google ส่งคืนความล้มเหลวของอาร์ติแฟกต์บางส่วน เช่น ข้อผิดพลาดการแสดงรายการบันทึกอัจฉริยะ, รายการทรานสคริปต์, หรือเนื้อหาเอกสาร Drive สรุปและ manifest จะเก็บคำเตือนไว้แทนที่จะทำให้การส่งออกทั้งหมดล้มเหลว
+ใช้ `--dry-run` เพื่อดึงข้อมูลอาร์ติแฟกต์/การเข้าร่วมเดียวกันและพิมพ์ JSON ของ manifest โดยไม่สร้างโฟลเดอร์หรือ ZIP สิ่งนี้มีประโยชน์ก่อนเขียนการส่งออกขนาดใหญ่ หรือเมื่อเอเจนต์ต้องการเพียงจำนวน, ระเบียนที่เลือก, และคำเตือน
-เอเจนต์ยังสามารถสร้าง bundle เดียวกันผ่านเครื่องมือ `google_meet` ได้:
+เอเจนต์ยังสามารถสร้างบันเดิลเดียวกันผ่านเครื่องมือ `google_meet` ได้:
```json
{
@@ -690,9 +765,9 @@ openclaw googlemeet export --conference-record conferenceRecords/abc123 \
}
```
-ตั้งค่า `"dryRun": true` เพื่อส่งคืนเฉพาะ export manifest และข้ามการเขียนไฟล์
+ตั้งค่า `"dryRun": true` เพื่อส่งคืนเฉพาะ manifest การส่งออกและข้ามการเขียนไฟล์
-เอเจนต์ยังสามารถสร้างห้องที่รองรับด้วย API พร้อมนโยบายการเข้าถึงที่ชัดเจนได้:
+เอเจนต์ยังสามารถสร้างห้องที่รองรับด้วย API พร้อมนโยบายการเข้าถึงที่ระบุชัดเจน:
```json
{
@@ -703,7 +778,7 @@ openclaw googlemeet export --conference-record conferenceRecords/abc123 \
}
```
-และสามารถจบการประชุมที่ใช้งานอยู่สำหรับห้องที่รู้จักได้:
+และสามารถจบการประชุมที่ใช้งานอยู่สำหรับห้องที่ทราบได้:
```json
{
@@ -723,7 +798,7 @@ openclaw googlemeet export --conference-record conferenceRecords/abc123 \
}
```
-เรียก live smoke ที่มีการป้องกันกับการประชุมจริงที่ยังเก็บไว้:
+รัน live smoke แบบมีการป้องกันกับการประชุมจริงที่ยังถูกเก็บไว้:
```bash
OPENCLAW_LIVE_TEST=1 \
@@ -731,7 +806,7 @@ OPENCLAW_GOOGLE_MEET_LIVE_MEETING=https://meet.google.com/abc-defg-hij \
pnpm test:live -- extensions/google-meet/google-meet.live.test.ts
```
-เรียกการตรวจสอบเบราว์เซอร์แบบ listen-first แบบ live กับการประชุมที่มีคนจะพูดและมีคำบรรยาย Meet พร้อมใช้งาน:
+รันโพรบเบราว์เซอร์แบบสดที่ฟังก่อนกับการประชุมซึ่งจะมีคนพูดและมีคำบรรยาย Meet พร้อมใช้งาน:
```bash
openclaw googlemeet setup --transport chrome-node --mode transcribe
@@ -740,32 +815,29 @@ openclaw googlemeet test-listen https://meet.google.com/abc-defg-hij --transport
สภาพแวดล้อม live smoke:
-- `OPENCLAW_LIVE_TEST=1` เปิดใช้การทดสอบ live ที่มีการป้องกัน
-- `OPENCLAW_GOOGLE_MEET_LIVE_MEETING` ชี้ไปยัง Meet URL, รหัส, หรือ
- `spaces/{id}` ที่ยังเก็บไว้
-- `OPENCLAW_GOOGLE_MEET_CLIENT_ID` หรือ `GOOGLE_MEET_CLIENT_ID` ระบุ OAuth
- client id
-- `OPENCLAW_GOOGLE_MEET_REFRESH_TOKEN` หรือ `GOOGLE_MEET_REFRESH_TOKEN` ระบุ
- refresh token
-- ไม่บังคับ: `OPENCLAW_GOOGLE_MEET_CLIENT_SECRET`,
+- `OPENCLAW_LIVE_TEST=1` เปิดใช้การทดสอบสดแบบมีการป้องกัน
+- `OPENCLAW_GOOGLE_MEET_LIVE_MEETING` ชี้ไปยัง URL Meet, รหัส, หรือ
+ `spaces/{id}` ที่ยังถูกเก็บไว้
+- `OPENCLAW_GOOGLE_MEET_CLIENT_ID` หรือ `GOOGLE_MEET_CLIENT_ID` ให้ id ไคลเอนต์ OAuth
+- `OPENCLAW_GOOGLE_MEET_REFRESH_TOKEN` หรือ `GOOGLE_MEET_REFRESH_TOKEN` ให้ refresh token
+- ตัวเลือกเสริม: `OPENCLAW_GOOGLE_MEET_CLIENT_SECRET`,
`OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN`, และ
- `OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT` ใช้ชื่อ fallback เดียวกัน
- โดยไม่มีคำนำหน้า `OPENCLAW_`
+ `OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT` ใช้ชื่อทางเลือกสำรองเดียวกันโดยไม่มีคำนำหน้า `OPENCLAW_`
live smoke พื้นฐานสำหรับอาร์ติแฟกต์/การเข้าร่วมต้องใช้
`https://www.googleapis.com/auth/meetings.space.readonly` และ
-`https://www.googleapis.com/auth/meetings.conference.media.readonly` การค้นหา Calendar ต้องใช้ `https://www.googleapis.com/auth/calendar.events.readonly` การ export เนื้อหาเอกสาร Drive ต้องใช้
+`https://www.googleapis.com/auth/meetings.conference.media.readonly` การค้นหา Calendar ต้องใช้ `https://www.googleapis.com/auth/calendar.events.readonly` การส่งออกเนื้อหาเอกสาร Drive ต้องใช้
`https://www.googleapis.com/auth/drive.meet.readonly`
-สร้าง Meet space ใหม่:
+สร้างพื้นที่ Meet ใหม่:
```bash
openclaw googlemeet create
```
-คำสั่งนี้พิมพ์ `meeting uri`, แหล่งที่มา, และ join session ใหม่ เมื่อมีข้อมูลรับรอง OAuth จะใช้ Google Meet API อย่างเป็นทางการ หากไม่มีข้อมูลรับรอง OAuth จะใช้โปรไฟล์เบราว์เซอร์ที่ลงชื่อเข้าใช้ของ Node Chrome ที่ปักหมุดเป็น fallback เอเจนต์สามารถใช้เครื่องมือ `google_meet` พร้อม `action: "create"` เพื่อสร้างและเข้าร่วมในขั้นตอนเดียว สำหรับการสร้างเฉพาะ URL ให้ส่ง `"join": false`
+คำสั่งจะพิมพ์ `meeting uri` ใหม่, แหล่งที่มา, และเซสชันเข้าร่วม เมื่อมีข้อมูลรับรอง OAuth จะใช้ Google Meet API อย่างเป็นทางการ หากไม่มีข้อมูลรับรอง OAuth จะใช้โปรไฟล์เบราว์เซอร์ที่ลงชื่อเข้าใช้ของโหนด Chrome ที่ปักหมุดไว้เป็นทางเลือกสำรอง เอเจนต์สามารถใช้เครื่องมือ `google_meet` พร้อม `action: "create"` เพื่อสร้างและเข้าร่วมในขั้นตอนเดียว สำหรับการสร้างเฉพาะ URL ให้ส่ง `"join": false`
-ตัวอย่างเอาต์พุต JSON จาก browser fallback:
+ตัวอย่างเอาต์พุต JSON จากทางเลือกสำรองของเบราว์เซอร์:
```json
{
@@ -785,7 +857,7 @@ openclaw googlemeet create
}
```
-หาก browser fallback พบการเข้าสู่ระบบ Google หรือบล็อกเกอร์สิทธิ์ของ Meet ก่อนที่จะสร้าง URL ได้ เมธอด Gateway จะส่งคืนการตอบสนองที่ล้มเหลว และเครื่องมือ `google_meet` จะส่งคืนรายละเอียดแบบมีโครงสร้างแทนสตริงธรรมดา:
+หากทางเลือกสำรองของเบราว์เซอร์พบตัวกั้นการเข้าสู่ระบบ Google หรือสิทธิ์ Meet ก่อนที่จะสร้าง URL ได้ เมธอด Gateway จะส่งคืนการตอบกลับที่ล้มเหลว และเครื่องมือ `google_meet` จะส่งคืนรายละเอียดแบบมีโครงสร้างแทนสตริงธรรมดา:
```json
{
@@ -803,9 +875,9 @@ openclaw googlemeet create
}
```
-เมื่อเอเจนต์เห็น `manualActionRequired: true` ควรรายงาน `manualActionMessage` พร้อมบริบท Node/แท็บของเบราว์เซอร์ แล้วหยุดเปิดแท็บ Meet ใหม่จนกว่าผู้ปฏิบัติงานจะทำขั้นตอนในเบราว์เซอร์เสร็จ
+เมื่อเอเจนต์เห็น `manualActionRequired: true` ควรรายงาน `manualActionMessage` พร้อมบริบทโหนด/แท็บของเบราว์เซอร์ และหยุดเปิดแท็บ Meet ใหม่จนกว่าผู้ปฏิบัติการจะทำขั้นตอนในเบราว์เซอร์เสร็จ
-ตัวอย่างเอาต์พุต JSON จากการสร้างผ่าน API:
+ตัวอย่างเอาต์พุต JSON จากการสร้างด้วย API:
```json
{
@@ -826,13 +898,14 @@ openclaw googlemeet create
}
```
-การสร้าง Meet จะเข้าร่วมเป็นค่าเริ่มต้น การขนส่งแบบ Chrome หรือ Chrome-node ยังต้องใช้โปรไฟล์ Google Chrome ที่ลงชื่อเข้าใช้อยู่เพื่อเข้าร่วมผ่านเบราว์เซอร์ หากโปรไฟล์ลงชื่อออกอยู่ OpenClaw จะรายงาน `manualActionRequired: true` หรือข้อผิดพลาด browser fallback และขอให้ผู้ปฏิบัติงานทำการเข้าสู่ระบบ Google ให้เสร็จก่อนลองใหม่
+การสร้าง Meet จะเข้าร่วมตามค่าเริ่มต้น transport แบบ Chrome หรือ Chrome-node ยังต้องใช้โปรไฟล์ Google Chrome ที่ลงชื่อเข้าใช้เพื่อเข้าร่วมผ่านเบราว์เซอร์ หากโปรไฟล์ออกจากระบบอยู่ OpenClaw จะรายงาน `manualActionRequired: true` หรือข้อผิดพลาดทางเลือกสำรองของเบราว์เซอร์ และขอให้ผู้ปฏิบัติการทำการเข้าสู่ระบบ Google ให้เสร็จก่อนลองใหม่
-ตั้งค่า `preview.enrollmentAcknowledged: true` เฉพาะหลังจากยืนยันว่าโปรเจกต์ Cloud, OAuth principal, และผู้เข้าร่วมการประชุมของคุณลงทะเบียนใน Google Workspace Developer Preview Program สำหรับ Meet media APIs แล้ว
+ตั้งค่า `preview.enrollmentAcknowledged: true` เฉพาะหลังจากยืนยันว่าโปรเจกต์ Cloud, principal ของ OAuth, และผู้เข้าร่วมการประชุมของคุณได้ลงทะเบียนใน Google Workspace Developer Preview Program สำหรับ Meet media APIs แล้ว
## การกำหนดค่า
-เส้นทาง Chrome realtime ทั่วไปต้องการเพียงเปิดใช้ Plugin, BlackHole, SoX, และคีย์ผู้ให้บริการเสียง realtime ฝั่ง backend OpenAI เป็นค่าเริ่มต้น; ตั้งค่า `realtime.provider: "google"` เพื่อใช้ Google Gemini Live:
+เส้นทางเอเจนต์ Chrome ทั่วไปต้องการเพียงการเปิดใช้ Plugin, BlackHole, SoX, คีย์ผู้ให้บริการถอดเสียงแบบเรียลไทม์, และผู้ให้บริการ OpenClaw TTS ที่กำหนดค่าแล้ว
+OpenAI เป็นผู้ให้บริการถอดเสียงตามค่าเริ่มต้น; ตั้งค่า `realtime.provider: "google"` เพื่อใช้ Google Gemini Live สำหรับโหมด `bidi`:
```bash
brew install blackhole-2ch sox
@@ -841,7 +914,7 @@ export OPENAI_API_KEY=sk-...
export GEMINI_API_KEY=...
```
-ตั้งค่า Plugin config ใต้ `plugins.entries.google-meet.config`:
+ตั้งค่าการกำหนดค่า Plugin ใต้ `plugins.entries.google-meet.config`:
```json5
{
@@ -859,42 +932,48 @@ export GEMINI_API_KEY=...
ค่าเริ่มต้น:
- `defaultTransport: "chrome"`
-- `defaultMode: "realtime"`
-- `chromeNode.node`: id/ชื่อ/IP ของ Node แบบไม่บังคับสำหรับ `chrome-node`
+- `defaultMode: "agent"` (`"realtime"` ยอมรับเป็นนามแฝงเพื่อความเข้ากันได้สำหรับ
+ `"agent"`)
+- `chromeNode.node`: รหัส/ชื่อ/IP ของ Node ที่ไม่บังคับสำหรับ `chrome-node`
- `chrome.audioBackend: "blackhole-2ch"`
-- `chrome.guestName: "OpenClaw Agent"`: ชื่อที่ใช้บนหน้าจอผู้เข้าร่วม Meet แบบ
- ยังไม่ได้ลงชื่อเข้าใช้
-- `chrome.autoJoin: true`: เติมชื่อผู้เข้าร่วมและคลิกเข้าร่วมทันทีแบบพยายามเต็มที่
+- `chrome.guestName: "OpenClaw Agent"`: ชื่อที่ใช้บนหน้าจอผู้เยี่ยมชม Meet ที่ยังไม่ได้ลงชื่อเข้าใช้
+- `chrome.autoJoin: true`: พยายามกรอกชื่อผู้เยี่ยมชมและคลิก Join Now ให้ดีที่สุด
ผ่านระบบอัตโนมัติของเบราว์เซอร์ OpenClaw บน `chrome-node`
- `chrome.reuseExistingTab: true`: เปิดใช้งานแท็บ Meet ที่มีอยู่แทนการเปิดซ้ำ
-- `chrome.waitForInCallMs: 20000`: รอให้แท็บ Meet รายงานว่าอยู่ในสาย
- ก่อนทริกเกอร์คำแนะนำเริ่มต้นแบบเรียลไทม์
+- `chrome.waitForInCallMs: 20000`: รอให้แท็บ Meet รายงานว่าอยู่ในการโทร
+ ก่อนทริกเกอร์ข้อความแนะนำของเรียลไทม์
- `chrome.audioFormat: "pcm16-24khz"`: รูปแบบเสียงของคู่คำสั่ง ใช้
- `"g711-ulaw-8khz"` เฉพาะกับคู่คำสั่งรุ่นเก่า/แบบกำหนดเองที่ยังส่งออก
- เสียงโทรศัพท์อยู่
+ `"g711-ulaw-8khz"` เฉพาะสำหรับคู่คำสั่งรุ่นเก่า/กำหนดเองที่ยังคงส่งเสียงโทรศัพท์
- `chrome.audioInputCommand`: คำสั่ง SoX ที่อ่านจาก CoreAudio `BlackHole 2ch`
และเขียนเสียงใน `chrome.audioFormat`
- `chrome.audioOutputCommand`: คำสั่ง SoX ที่อ่านเสียงใน `chrome.audioFormat`
และเขียนไปยัง CoreAudio `BlackHole 2ch`
-- `chrome.bargeInInputCommand`: คำสั่งไมโครโฟนในเครื่องแบบไม่บังคับที่เขียน
- signed 16-bit little-endian mono PCM สำหรับตรวจจับการแทรกพูดของมนุษย์
- ขณะที่การเล่นเสียงของผู้ช่วยทำงานอยู่ ขณะนี้ใช้กับบริดจ์คู่คำสั่ง `chrome`
- ที่โฮสต์โดย Gateway
-- `chrome.bargeInRmsThreshold: 650`: ระดับ RMS ที่นับเป็นการขัดจังหวะโดยมนุษย์
+- `chrome.bargeInInputCommand`: คำสั่งไมโครโฟนในเครื่องที่ไม่บังคับ ซึ่งเขียน PCM โมโน signed 16-bit little-endian สำหรับการตรวจจับการพูดแทรกของมนุษย์ขณะ
+ การเล่นเสียงของผู้ช่วยทำงานอยู่ ขณะนี้ใช้กับบริดจ์คู่คำสั่ง `chrome` ที่โฮสต์โดย Gateway
+- `chrome.bargeInRmsThreshold: 650`: ระดับ RMS ที่นับเป็นการขัดจังหวะจากมนุษย์
บน `chrome.bargeInInputCommand`
-- `chrome.bargeInPeakThreshold: 2500`: ระดับพีคที่นับเป็นการขัดจังหวะโดยมนุษย์
+- `chrome.bargeInPeakThreshold: 2500`: ระดับพีคที่นับเป็นการขัดจังหวะจากมนุษย์
บน `chrome.bargeInInputCommand`
-- `chrome.bargeInCooldownMs: 900`: หน่วงเวลาขั้นต่ำระหว่างการล้างการขัดจังหวะโดยมนุษย์ซ้ำ
-- `realtime.provider: "openai"`
+- `chrome.bargeInCooldownMs: 900`: หน่วงเวลาขั้นต่ำระหว่างการล้างสถานะการขัดจังหวะจากมนุษย์ซ้ำ
+- `mode: "agent"`: โหมดตอบกลับเริ่มต้น คำพูดของผู้เข้าร่วมจะถูกถอดเสียงโดย
+ ผู้ให้บริการถอดเสียงเรียลไทม์ที่กำหนดค่าไว้ ส่งไปยัง
+ เอเจนต์ OpenClaw ที่กำหนดค่าไว้ในเซสชันเอเจนต์ย่อยต่อการประชุม และพูดตอบกลับผ่าน
+ รันไทม์ TTS ปกติของ OpenClaw
+- `mode: "bidi"`: โหมดสำรองของโมเดลเรียลไทม์แบบสองทิศทางโดยตรง
+ ผู้ให้บริการเสียงเรียลไทม์จะตอบคำพูดของผู้เข้าร่วมโดยตรง และอาจเรียก
+ `openclaw_agent_consult` เพื่อคำตอบที่ลึกขึ้น/มีเครื่องมือสนับสนุน
+- `mode: "transcribe"`: โหมดสังเกตการณ์อย่างเดียวโดยไม่มีบริดจ์ตอบกลับ
+- `realtime.provider: "openai"`: รหัสผู้ให้บริการที่โหมด `agent` ใช้สำหรับ
+ การถอดเสียงเรียลไทม์ และโหมด `bidi` ใช้สำหรับเสียงเรียลไทม์
- `realtime.toolPolicy: "safe-read-only"`
-- `realtime.instructions`: คำตอบพูดแบบสั้น พร้อม
- `openclaw_agent_consult` สำหรับคำตอบเชิงลึก
-- `realtime.introMessage`: การตรวจสอบความพร้อมด้วยเสียงแบบสั้นเมื่อบริดจ์เรียลไทม์
- เชื่อมต่อ ตั้งค่าเป็น `""` เพื่อเข้าร่วมแบบเงียบ
-- `realtime.agentId`: id ของ OpenClaw agent แบบไม่บังคับสำหรับ
+- `realtime.instructions`: คำตอบพูดสั้น ๆ พร้อม
+ `openclaw_agent_consult` สำหรับคำตอบที่ลึกขึ้น
+- `realtime.introMessage`: การตรวจสอบความพร้อมแบบพูดสั้น ๆ เมื่อบริดจ์เรียลไทม์
+ เชื่อมต่อ ตั้งเป็น `""` เพื่อเข้าร่วมแบบเงียบ
+- `realtime.agentId`: รหัสเอเจนต์ OpenClaw ที่ไม่บังคับสำหรับ
`openclaw_agent_consult`; ค่าเริ่มต้นคือ `main`
-การแทนที่แบบไม่บังคับ:
+การแทนที่ที่ไม่บังคับ:
```json5
{
@@ -929,6 +1008,7 @@ export GEMINI_API_KEY=...
chromeNode: {
node: "parallels-macos",
},
+ defaultMode: "agent",
realtime: {
provider: "google",
agentId: "jay",
@@ -944,7 +1024,7 @@ export GEMINI_API_KEY=...
}
```
-การกำหนดค่าเฉพาะ Twilio:
+การกำหนดค่าสำหรับ Twilio เท่านั้น:
```json5
{
@@ -959,55 +1039,61 @@ export GEMINI_API_KEY=...
}
```
-`voiceCall.enabled` มีค่าเริ่มต้นเป็น `true`; เมื่อใช้การขนส่ง Twilio จะมอบหมาย
-การโทร PSTN จริง, DTMF, และคำทักทายเริ่มต้นให้กับ Voice Call Plugin Voice Call
-จะเล่นลำดับ DTMF ก่อนเปิดสตรีมสื่อแบบเรียลไทม์ จากนั้นใช้ข้อความเริ่มต้นที่บันทึกไว้
-เป็นคำทักทายเรียลไทม์แรก หากไม่ได้เปิดใช้งาน `voice-call` Google Meet ยังสามารถ
-ตรวจสอบและบันทึกแผนการโทรได้ แต่ไม่สามารถวางสาย Twilio ได้
+ค่าเริ่มต้นของ `voiceCall.enabled` คือ `true`; เมื่อใช้การขนส่ง Twilio จะมอบหมาย
+การโทร PSTN จริง, DTMF และคำทักทายเริ่มต้นให้กับ Plugin Voice Call โดย Voice Call
+จะเล่นลำดับ DTMF ก่อนเปิดสตรีมสื่อเรียลไทม์ จากนั้นใช้ข้อความแนะนำที่บันทึกไว้
+เป็นคำทักทายเรียลไทม์เริ่มต้น หากไม่ได้เปิดใช้ `voice-call`
+Google Meet ยังคงตรวจสอบและบันทึกแผนการโทรได้ แต่ไม่สามารถวางสาย Twilio ได้
## เครื่องมือ
-Agents สามารถใช้เครื่องมือ `google_meet` ได้:
+เอเจนต์สามารถใช้เครื่องมือ `google_meet` ได้:
```json
{
"action": "join",
"url": "https://meet.google.com/abc-defg-hij",
"transport": "chrome-node",
- "mode": "realtime"
+ "mode": "agent"
}
```
ใช้ `transport: "chrome"` เมื่อ Chrome ทำงานบนโฮสต์ Gateway ใช้
-`transport: "chrome-node"` เมื่อ Chrome ทำงานบน Node ที่จับคู่ไว้ เช่น Parallels
-VM ในทั้งสองกรณี โมเดลเรียลไทม์และ `openclaw_agent_consult` ทำงานบนโฮสต์
-Gateway ดังนั้นข้อมูลรับรองของโมเดลจึงยังอยู่ที่นั่น
+`transport: "chrome-node"` เมื่อ Chrome ทำงานบน Node ที่จับคู่ เช่น VM Parallels
+ในทั้งสองกรณี ผู้ให้บริการโมเดลและ `openclaw_agent_consult` จะทำงานบนโฮสต์
+Gateway ดังนั้นข้อมูลประจำตัวของโมเดลจึงอยู่ที่นั่น ด้วยค่าเริ่มต้น `mode: "agent"`
+ผู้ให้บริการถอดเสียงเรียลไทม์จะจัดการการฟัง เอเจนต์ OpenClaw ที่กำหนดค่าไว้จะสร้างคำตอบ
+และ TTS ปกติของ OpenClaw จะพูดคำนั้นเข้า Meet ใช้ `mode: "bidi"` เมื่อคุณต้องการให้
+โมเดลเสียงเรียลไทม์ตอบโดยตรง `mode: "realtime"` ยังคงยอมรับเป็นนามแฝงเพื่อความเข้ากันได้สำหรับ
+`mode: "agent"`
-ใช้ `action: "status"` เพื่อแสดงรายการเซสชันที่ใช้งานอยู่หรือตรวจสอบ session ID
-ใช้ `action: "speak"` พร้อม `sessionId` และ `message` เพื่อให้ agent เรียลไทม์
-พูดทันที ใช้ `action: "test_speech"` เพื่อสร้างหรือนำเซสชันกลับมาใช้ใหม่
-ทริกเกอร์วลีที่ทราบ และคืนค่าสุขภาพ `inCall` เมื่อโฮสต์ Chrome รายงานได้
-`test_speech` จะบังคับ `mode: "realtime"` เสมอ และจะล้มเหลวหากถูกขอให้ทำงานใน
-`mode: "transcribe"` เพราะเซสชันแบบสังเกตเท่านั้นตั้งใจไม่ให้ส่งเสียงพูดออกมา
-ผลลัพธ์ `speechOutputVerified` อิงจากจำนวนไบต์เอาต์พุตเสียงเรียลไทม์ที่เพิ่มขึ้น
-ระหว่างการเรียกทดสอบนี้ ดังนั้นเซสชันที่นำกลับมาใช้ใหม่ซึ่งมีเสียงเก่าอยู่แล้ว
-จะไม่นับเป็นการตรวจสอบเสียงพูดที่สำเร็จใหม่ ใช้ `action: "leave"` เพื่อทำเครื่องหมายว่า
+ใช้ `action: "status"` เพื่อแสดงรายการเซสชันที่ใช้งานอยู่หรือตรวจสอบรหัสเซสชัน ใช้
+`action: "speak"` พร้อม `sessionId` และ `message` เพื่อให้เอเจนต์เรียลไทม์
+พูดทันที ใช้ `action: "test_speech"` เพื่อสร้างหรือใช้เซสชันซ้ำ
+ทริกเกอร์วลีที่รู้จัก และส่งคืนสุขภาพ `inCall` เมื่อโฮสต์ Chrome สามารถ
+รายงานได้ `test_speech` จะบังคับใช้ `mode: "agent"` เสมอ และจะล้มเหลวหากถูกขอให้
+ทำงานใน `mode: "transcribe"` เพราะเซสชันแบบสังเกตการณ์อย่างเดียวตั้งใจให้
+ไม่สามารถส่งเสียงพูดได้ ผลลัพธ์ `speechOutputVerified` อิงจากจำนวนไบต์เอาต์พุตเสียงเรียลไทม์
+ที่เพิ่มขึ้นระหว่างการทดสอบครั้งนี้ ดังนั้นเซสชันที่ใช้ซ้ำซึ่งมีเสียงเก่ากว่า
+จะไม่นับเป็นการตรวจสอบเสียงพูดใหม่ที่สำเร็จ ใช้ `action: "leave"` เพื่อทำเครื่องหมายว่า
เซสชันสิ้นสุดแล้ว
-`status` รวมสุขภาพ Chrome เมื่อพร้อมใช้งาน:
+`status` รวมสุขภาพของ Chrome เมื่อมีข้อมูล:
- `inCall`: Chrome ดูเหมือนอยู่ภายในสาย Meet
-- `micMuted`: สถานะไมโครโฟน Meet แบบพยายามเต็มที่
+- `micMuted`: สถานะไมโครโฟน Meet แบบพยายามให้ดีที่สุด
- `manualActionRequired` / `manualActionReason` / `manualActionMessage`: โปรไฟล์
- เบราว์เซอร์ต้องการการเข้าสู่ระบบด้วยตนเอง การอนุญาตจากโฮสต์ Meet สิทธิ์อนุญาต
- หรือการซ่อมแซมการควบคุมเบราว์เซอร์ก่อนเสียงพูดจะทำงานได้
-- `speechReady` / `speechBlockedReason` / `speechBlockedMessage`: อนุญาตให้ใช้
- เสียงพูด Chrome ที่มีการจัดการตอนนี้หรือไม่ `speechReady: false` หมายความว่า OpenClaw
- ไม่ได้ส่งวลีเริ่มต้น/ทดสอบเข้าไปในบริดจ์เสียง
+ เบราว์เซอร์ต้องการการเข้าสู่ระบบด้วยตนเอง การอนุญาตจากโฮสต์ Meet สิทธิ์อนุญาต หรือ
+ การซ่อมการควบคุมเบราว์เซอร์ก่อนที่เสียงพูดจะทำงานได้
+- `speechReady` / `speechBlockedReason` / `speechBlockedMessage`: ระบุว่า
+ อนุญาตให้ใช้เสียงพูดของ Chrome ที่จัดการอยู่ในตอนนี้หรือไม่ `speechReady: false` หมายความว่า OpenClaw
+ ไม่ได้ส่งวลีแนะนำ/ทดสอบเข้าไปในบริดจ์เสียง
- `providerConnected` / `realtimeReady`: สถานะบริดจ์เสียงเรียลไทม์
-- `lastInputAt` / `lastOutputAt`: เสียงล่าสุดที่เห็นจากหรือส่งไปยังบริดจ์
-- `lastSuppressedInputAt` / `suppressedInputBytes`: อินพุต local loopback ที่ถูกละเว้น
- ขณะที่การเล่นเสียงของผู้ช่วยทำงานอยู่
+- `lastInputAt` / `lastOutputAt`: เสียงล่าสุดที่เห็นจากบริดจ์หรือส่งไปยังบริดจ์
+- `audioOutputRouted` / `audioOutputDeviceLabel`: ระบุว่าเอาต์พุตสื่อของแท็บ Meet
+ ถูกกำหนดเส้นทางอย่างใช้งานไปยังอุปกรณ์ BlackHole ที่บริดจ์ใช้หรือไม่
+- `lastSuppressedInputAt` / `suppressedInputBytes`: อินพุต loopback ที่ถูกละเว้นขณะ
+ การเล่นเสียงของผู้ช่วยทำงานอยู่
```json
{
@@ -1017,40 +1103,59 @@ Gateway ดังนั้นข้อมูลรับรองของโม
}
```
-## การ consult agent เรียลไทม์
+## โหมดเอเจนต์และสองทิศทาง
-โหมดเรียลไทม์ของ Chrome ถูกปรับให้เหมาะกับลูปเสียงสด ผู้ให้บริการเสียงเรียลไทม์
-ได้ยินเสียงการประชุมและพูดผ่านบริดจ์เสียงที่กำหนดค่าไว้ เมื่อโมเดลเรียลไทม์ต้องการ
-การให้เหตุผลเชิงลึก ข้อมูลปัจจุบัน หรือเครื่องมือ OpenClaw ปกติ ก็สามารถเรียก
-`openclaw_agent_consult` ได้
+โหมด `agent` ของ Chrome ถูกปรับให้เหมาะกับพฤติกรรม "เอเจนต์ของฉันอยู่ในการประชุม"
+ผู้ให้บริการถอดเสียงเรียลไทม์ได้ยินเสียงการประชุม ทรานสคริปต์สุดท้ายของผู้เข้าร่วม
+ถูกส่งผ่านเอเจนต์ OpenClaw ที่กำหนดค่าไว้ และคำตอบถูกพูดผ่านรันไทม์ TTS ปกติของ OpenClaw
+ตั้งค่า `mode: "bidi"` เมื่อคุณต้องการให้โมเดลเสียงเรียลไทม์ตอบโดยตรง
+เศษทรานสคริปต์สุดท้ายที่อยู่ใกล้กันจะถูกรวมเข้าด้วยกันก่อนการ consult เพื่อให้การพูดหนึ่งรอบ
+ไม่สร้างคำตอบบางส่วนเก่าหลายรายการ อินพุตเรียลไทม์จะถูกระงับด้วย
+ขณะที่เสียงผู้ช่วยที่จัดคิวยังเล่นอยู่
+และเสียงสะท้อนทรานสคริปต์ที่คล้ายผู้ช่วยเมื่อเร็ว ๆ นี้จะถูกละเว้นก่อนการ consult ของเอเจนต์
+เพื่อไม่ให้ loopback ของ BlackHole ทำให้เอเจนต์ตอบคำพูดของตัวเอง
-เครื่องมือ consult จะเรียกใช้ agent OpenClaw ปกติเบื้องหลังพร้อมบริบทถอดเสียงการประชุมล่าสุด
-และคืนคำตอบแบบพูดที่กระชับให้กับเซสชันเสียงเรียลไทม์ จากนั้นโมเดลเสียงสามารถพูดคำตอบนั้น
-กลับเข้าไปในการประชุมได้ โดยใช้เครื่องมือ consult เรียลไทม์แบบแชร์เดียวกันกับ Voice Call
+| โหมด | ผู้ตัดสินคำตอบ | เส้นทางเอาต์พุตเสียงพูด | ใช้เมื่อ |
+| ------- | ----------------------------- | -------------------------------------- | ----------------------------------------------------- |
+| `agent` | เอเจนต์ OpenClaw ที่กำหนดค่าไว้ | รันไทม์ TTS ปกติของ OpenClaw | คุณต้องการพฤติกรรม "เอเจนต์ของฉันอยู่ในการประชุม" |
+| `bidi` | โมเดลเสียงเรียลไทม์ | การตอบกลับเสียงของผู้ให้บริการเสียงเรียลไทม์ | คุณต้องการลูปเสียงสนทนาที่มีความหน่วงต่ำที่สุด |
-ตามค่าเริ่มต้น consult จะทำงานกับ agent `main` ตั้งค่า `realtime.agentId` เมื่อช่อง Meet
-ควร consult พื้นที่ทำงาน agent OpenClaw เฉพาะ ค่าเริ่มต้นของโมเดล นโยบายเครื่องมือ
-หน่วยความจำ และประวัติเซสชัน
+ในโหมด `bidi` เมื่อโมเดลเรียลไทม์ต้องการการให้เหตุผลที่ลึกขึ้น
+ข้อมูลปัจจุบัน หรือเครื่องมือ OpenClaw ปกติ ก็สามารถเรียก `openclaw_agent_consult` ได้
-`realtime.toolPolicy` ควบคุมการทำงานของ consult:
+เครื่องมือ consult จะเรียกใช้เอเจนต์ OpenClaw ปกติอยู่เบื้องหลัง พร้อมบริบท
+ทรานสคริปต์การประชุมล่าสุด และส่งคืนคำตอบพูดที่กระชับ ในโหมด `agent`
+OpenClaw จะส่งคำตอบนั้นตรงไปยังรันไทม์ TTS; ในโหมด `bidi`
+โมเดลเสียงเรียลไทม์สามารถพูดผลลัพธ์ consult กลับเข้าไปในการประชุมได้ โดยใช้
+กลไก consult ที่ใช้ร่วมกันเดียวกับ Voice Call
-- `safe-read-only`: เปิดเผยเครื่องมือ consult และจำกัด agent ปกติให้ใช้
- `read`, `web_search`, `web_fetch`, `x_search`, `memory_search`, และ
+โดยค่าเริ่มต้น consult จะทำงานกับเอเจนต์ `main` ตั้งค่า `realtime.agentId` เมื่อ
+เลน Meet ควร consult เวิร์กสเปซเอเจนต์ OpenClaw เฉพาะ ค่าเริ่มต้นของโมเดล
+นโยบายเครื่องมือ หน่วยความจำ และประวัติเซสชัน
+
+consult ในโหมดเอเจนต์ใช้คีย์เซสชัน `agent::subagent:google-meet:`
+แบบต่อการประชุม เพื่อให้คำถามติดตามผลรักษาบริบทการประชุมไว้ขณะสืบทอดนโยบาย
+เอเจนต์ปกติจากเอเจนต์ที่กำหนดค่าไว้
+
+`realtime.toolPolicy` ควบคุมการรัน consult:
+
+- `safe-read-only`: เปิดเผยเครื่องมือ consult และจำกัดเอเจนต์ปกติให้ใช้
+ `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` และ
`memory_get`
-- `owner`: เปิดเผยเครื่องมือ consult และให้ agent ปกติใช้นโยบายเครื่องมือของ
- agent ตามปกติ
+- `owner`: เปิดเผยเครื่องมือ consult และให้เอเจนต์ปกติใช้นโยบายเครื่องมือ
+ เอเจนต์ปกติ
- `none`: ไม่เปิดเผยเครื่องมือ consult ให้โมเดลเสียงเรียลไทม์
-คีย์เซสชัน consult ถูกกำหนดขอบเขตต่อเซสชัน Meet ดังนั้นการเรียก consult ต่อเนื่อง
-สามารถนำบริบท consult ก่อนหน้ากลับมาใช้ใหม่ได้ระหว่างการประชุมเดียวกัน
+คีย์เซสชัน consult ถูกกำหนดขอบเขตต่อเซสชัน Meet ดังนั้นการเรียก consult ติดตามผล
+จึงสามารถใช้บริบท consult ก่อนหน้าในระหว่างการประชุมเดียวกันได้
-เพื่อบังคับการตรวจสอบความพร้อมด้วยเสียงหลังจาก Chrome เข้าร่วมสายอย่างสมบูรณ์แล้ว:
+เพื่อบังคับการตรวจสอบความพร้อมแบบพูดหลังจาก Chrome เข้าร่วมสายเรียบร้อยแล้ว:
```bash
openclaw googlemeet speak meet_... "Say exactly: I'm here and listening."
```
-สำหรับ smoke แบบเข้าร่วมและพูดครบถ้วน:
+สำหรับ smoke การเข้าร่วมและพูดแบบเต็ม:
```bash
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \
@@ -1060,7 +1165,7 @@ openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \
## รายการตรวจสอบการทดสอบสด
-ใช้ลำดับนี้ก่อนส่งต่อการประชุมให้ agent ที่ไม่มีผู้ดูแล:
+ใช้ลำดับนี้ก่อนส่งมอบการประชุมให้เอเจนต์ที่ไม่มีผู้ดูแล:
```bash
openclaw googlemeet setup
@@ -1075,12 +1180,12 @@ openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \
- `googlemeet setup` เป็นสีเขียวทั้งหมด
- `googlemeet setup` รวม `chrome-node-connected` เมื่อ Chrome-node เป็น
การขนส่งเริ่มต้นหรือมีการปักหมุด Node
-- `nodes status` แสดงว่า Node ที่เลือกเชื่อมต่อแล้ว
+- `nodes status` แสดงว่า Node ที่เลือกเชื่อมต่ออยู่
- Node ที่เลือกประกาศทั้ง `googlemeet.chrome` และ `browser.proxy`
-- แท็บ Meet เข้าร่วมสายและ `test-speech` คืนค่าสุขภาพ Chrome พร้อม
+- แท็บ Meet เข้าร่วมสาย และ `test-speech` ส่งคืนสุขภาพ Chrome พร้อม
`inCall: true`
-สำหรับโฮสต์ Chrome ระยะไกล เช่น Parallels macOS VM นี่คือการตรวจสอบที่สั้นที่สุด
+สำหรับโฮสต์ Chrome ระยะไกล เช่น VM Parallels macOS นี่คือการตรวจสอบที่สั้นที่สุด
และปลอดภัยหลังอัปเดต Gateway หรือ VM:
```bash
@@ -1092,10 +1197,11 @@ openclaw nodes invoke \
--params '{"action":"setup"}'
```
-สิ่งนี้พิสูจน์ว่า Gateway Plugin ถูกโหลดแล้ว, VM Node เชื่อมต่อด้วยโทเค็นปัจจุบัน,
-และบริดจ์เสียง Meet พร้อมใช้งานก่อนที่ agent จะเปิดแท็บการประชุมจริง
+สิ่งนี้พิสูจน์ว่า Plugin Gateway ถูกโหลดแล้ว, Node VM เชื่อมต่อด้วย
+โทเค็นปัจจุบัน และบริดจ์เสียง Meet พร้อมใช้งานก่อนที่เอเจนต์จะเปิด
+แท็บการประชุมจริง
-สำหรับ smoke ของ Twilio ให้ใช้การประชุมที่เปิดเผยรายละเอียดการโทรเข้า:
+สำหรับ smoke ของ Twilio ให้ใช้การประชุมที่แสดงรายละเอียดการโทรเข้าทางโทรศัพท์:
```bash
openclaw googlemeet setup
@@ -1107,34 +1213,34 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \
สถานะ Twilio ที่คาดหวัง:
-- `googlemeet setup` รวมการตรวจสอบสีเขียว `twilio-voice-call-plugin`,
- `twilio-voice-call-credentials`, และ `twilio-voice-call-webhook`
-- `voicecall` พร้อมใช้งานใน CLI หลังโหลด Gateway ใหม่
-- เซสชันที่คืนมามี `transport: "twilio"` และ `twilio.voiceCallId`
-- `openclaw logs --follow` แสดง DTMF TwiML ที่ถูกให้บริการก่อน realtime TwiML
- แล้วตามด้วยบริดจ์เรียลไทม์ที่มีคำทักทายเริ่มต้นเข้าคิวไว้
-- `googlemeet leave ` วางสายเสียงที่มอบหมายไว้
+- `googlemeet setup` มีการตรวจสอบ `twilio-voice-call-plugin`,
+ `twilio-voice-call-credentials` และ `twilio-voice-call-webhook` เป็นสีเขียว
+- `voicecall` พร้อมใช้งานใน CLI หลังจากโหลด Gateway ใหม่
+- เซสชันที่ส่งคืนมี `transport: "twilio"` และ `twilio.voiceCallId`
+- `openclaw logs --follow` แสดง DTMF TwiML ที่ถูกให้บริการก่อน realtime TwiML จากนั้นเป็น
+ บริดจ์ realtime พร้อมคำทักทายเริ่มต้นที่เข้าคิวไว้
+- `googlemeet leave ` วางสายการโทรเสียงที่มอบหมายไว้
## การแก้ไขปัญหา
-### Agent มองไม่เห็นเครื่องมือ Google Meet
+### เอเจนต์มองไม่เห็นเครื่องมือ Google Meet
-ยืนยันว่า Plugin เปิดใช้งานอยู่ในการกำหนดค่า Gateway และโหลด Gateway ใหม่:
+ยืนยันว่า Plugin ถูกเปิดใช้งานในการกำหนดค่า Gateway และโหลด Gateway ใหม่:
```bash
openclaw plugins list | grep google-meet
openclaw googlemeet setup
```
-หากคุณเพิ่งแก้ไข `plugins.entries.google-meet` ให้รีสตาร์ทหรือโหลด Gateway ใหม่
-agent ที่กำลังทำงานอยู่จะเห็นเฉพาะเครื่องมือ Plugin ที่ลงทะเบียนโดยกระบวนการ Gateway
+หากคุณเพิ่งแก้ไข `plugins.entries.google-meet` ให้รีสตาร์ตหรือโหลด Gateway ใหม่
+เอเจนต์ที่กำลังทำงานจะเห็นเฉพาะเครื่องมือ Plugin ที่ลงทะเบียนโดยกระบวนการ Gateway
ปัจจุบันเท่านั้น
-บนโฮสต์ Gateway ที่ไม่ใช่ macOS เครื่องมือ `google_meet` สำหรับ agent ยังคงมองเห็นได้
-แต่การกระทำเรียลไทม์ของ Chrome ในเครื่องจะถูกบล็อกก่อนถึงบริดจ์เสียง เสียงเรียลไทม์
-ของ Chrome ในเครื่องขณะนี้ขึ้นกับ macOS `BlackHole 2ch` ดังนั้น agent บน Linux ควรใช้
-`mode: "transcribe"` การโทรเข้า Twilio หรือโฮสต์ `chrome-node` บน macOS แทนเส้นทาง
-เรียลไทม์ของ Chrome ในเครื่องที่เป็นค่าเริ่มต้น
+บนโฮสต์ Gateway ที่ไม่ใช่ macOS เครื่องมือ `google_meet` สำหรับเอเจนต์จะยังมองเห็นได้
+แต่การทำงาน Chrome talk-back ในเครื่องจะถูกบล็อกก่อนถึงบริดจ์เสียง
+เสียง Chrome talk-back ในเครื่องขณะนี้ขึ้นกับ `BlackHole 2ch` ของ macOS ดังนั้น
+เอเจนต์ Linux ควรใช้ `mode: "transcribe"` การโทรเข้า Twilio หรือโฮสต์
+`chrome-node` ของ macOS แทนเส้นทางเอเจนต์ Chrome ในเครื่องเริ่มต้น
### ไม่มี Node ที่รองรับ Google Meet เชื่อมต่ออยู่
@@ -1155,7 +1261,7 @@ openclaw devices approve
openclaw nodes status
```
-Node ต้องเชื่อมต่ออยู่และแสดงรายการ `googlemeet.chrome` รวมถึง `browser.proxy`
+Node ต้องเชื่อมต่ออยู่และแสดงรายการ `googlemeet.chrome` พร้อมกับ `browser.proxy`
การกำหนดค่า Gateway ต้องอนุญาตคำสั่ง Node เหล่านั้น:
```json5
@@ -1168,9 +1274,9 @@ Node ต้องเชื่อมต่ออยู่และแสดงร
}
```
-หาก `googlemeet setup` ล้มเหลวที่ `chrome-node-connected` หรือบันทึก Gateway รายงานว่า
-`gateway token mismatch` ให้ติดตั้งใหม่หรือรีสตาร์ท Node ด้วยโทเค็น Gateway ปัจจุบัน
-สำหรับ Gateway บน LAN โดยทั่วไปหมายถึง:
+หาก `googlemeet setup` ล้มเหลวที่ `chrome-node-connected` หรือบันทึก Gateway รายงาน
+`gateway token mismatch` ให้ติดตั้งใหม่หรือรีสตาร์ต Node ด้วยโทเค็น Gateway ปัจจุบัน
+สำหรับ Gateway บน LAN โดยปกติหมายถึง:
```bash
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
@@ -1188,107 +1294,121 @@ openclaw googlemeet setup
openclaw nodes status --connected
```
-### เบราว์เซอร์เปิดแต่ agent เข้าร่วมไม่ได้
+### เบราว์เซอร์เปิดขึ้นแต่เอเจนต์เข้าร่วมไม่ได้
-รัน `googlemeet test-listen` สำหรับการเข้าร่วมแบบสังเกตเท่านั้น หรือ `googlemeet test-speech`
-สำหรับการเข้าร่วมแบบเรียลไทม์ จากนั้นตรวจสอบสุขภาพ Chrome ที่คืนมา หากโพรบใดรายงาน
+รัน `googlemeet test-listen` สำหรับการเข้าร่วมแบบสังเกตการณ์เท่านั้น หรือ `googlemeet test-speech`
+สำหรับการเข้าร่วมแบบ realtime แล้วตรวจสอบสถานะสุขภาพ Chrome ที่ส่งคืน หากโพรบใดรายงาน
`manualActionRequired: true` ให้แสดง `manualActionMessage` ต่อผู้ปฏิบัติงาน
-และหยุดลองซ้ำจนกว่าการกระทำในเบราว์เซอร์จะเสร็จสิ้น
+และหยุดลองซ้ำจนกว่าการทำงานในเบราว์เซอร์จะเสร็จสมบูรณ์
-การกระทำด้วยตนเองที่พบบ่อย:
+การทำงานด้วยตนเองที่พบบ่อย:
- ลงชื่อเข้าใช้โปรไฟล์ Chrome
- อนุญาตผู้เข้าร่วมจากบัญชีโฮสต์ Meet
-- ให้สิทธิ์ไมโครโฟน/กล้องแก่ Chrome เมื่อพรอมป์สิทธิ์ดั้งเดิมของ Chrome ปรากฏ
-- ปิดหรือซ่อมแซมกล่องโต้ตอบสิทธิ์ Meet ที่ค้างอยู่
+- ให้สิทธิ์ไมโครโฟน/กล้องแก่ Chrome เมื่อพรอมป์สิทธิ์แบบเนทีฟของ Chrome ปรากฏ
+- ปิดหรือซ่อมกล่องโต้ตอบสิทธิ์ Meet ที่ค้างอยู่
-อย่ารายงานว่า "ไม่ได้ลงชื่อเข้าใช้" เพียงเพราะ Meet แสดงว่า "คุณต้องการให้ผู้อื่นได้ยินเสียงคุณในการประชุมหรือไม่" นั่นคือหน้าคั่นสำหรับเลือกเสียงของ Meet; OpenClaw
-คลิก **ใช้ไมโครโฟน** ผ่านระบบอัตโนมัติของเบราว์เซอร์เมื่อมีให้ใช้ และรอต่อไปจนกว่าจะพบสถานะการประชุมจริง สำหรับการสำรองผ่านเบราว์เซอร์แบบสร้างอย่างเดียว OpenClaw
-อาจคลิก **ดำเนินการต่อโดยไม่มีไมโครโฟน** เพราะการสร้าง URL ไม่จำเป็นต้องใช้เส้นทางเสียงแบบเรียลไทม์
+อย่ารายงานว่า "not signed in" เพียงเพราะ Meet แสดง "Do you want people to
+hear you in the meeting?" นั่นคือหน้าคั่นการเลือกเสียงของ Meet; OpenClaw
+คลิก **Use microphone** ผ่านการทำงานอัตโนมัติของเบราว์เซอร์เมื่อพร้อมใช้งาน และยังคง
+รอสถานะการประชุมจริงต่อไป สำหรับ browser fallback แบบสร้างอย่างเดียว OpenClaw
+อาจคลิก **Continue without microphone** เพราะการสร้าง URL ไม่ต้องใช้
+เส้นทางเสียง realtime
### การสร้างการประชุมล้มเหลว
-`googlemeet create` ใช้ endpoint
-`spaces.create` ของ Google Meet API ก่อนเมื่อมีการกำหนดค่าข้อมูลรับรอง OAuth หากไม่มีข้อมูลรับรอง OAuth ระบบจะถอยกลับไปใช้เบราว์เซอร์โหนด Chrome ที่ปักหมุดไว้ ตรวจสอบว่า:
+`googlemeet create` ใช้เอนด์พอยต์ Google Meet API `spaces.create` ก่อน
+เมื่อมีการกำหนดค่าข้อมูลรับรอง OAuth หากไม่มีข้อมูลรับรอง OAuth จะ fallback
+ไปยังเบราว์เซอร์ Chrome Node ที่ปักหมุดไว้ ยืนยันว่า:
- สำหรับการสร้างผ่าน API: มีการกำหนดค่า `oauth.clientId` และ `oauth.refreshToken`
หรือมีตัวแปรสภาพแวดล้อม `OPENCLAW_GOOGLE_MEET_*` ที่ตรงกัน
-- สำหรับการสร้างผ่าน API: refresh token ถูกสร้างขึ้นหลังจากเพิ่มการรองรับการสร้างแล้ว
- โทเคนเก่าอาจไม่มี scope `meetings.space.created`; เรียกใช้
+- สำหรับการสร้างผ่าน API: โทเค็นรีเฟรชถูกออกหลังจากเพิ่มการรองรับการสร้างแล้ว
+ โทเค็นรุ่นเก่าอาจไม่มี scope `meetings.space.created`; ให้รัน
`openclaw googlemeet auth login --json` อีกครั้งและอัปเดตการกำหนดค่า Plugin
-- สำหรับการสำรองผ่านเบราว์เซอร์: `defaultTransport: "chrome-node"` และ
- `chromeNode.node` ชี้ไปยังโหนดที่เชื่อมต่อแล้วซึ่งมี `browser.proxy` และ
+- สำหรับ browser fallback: `defaultTransport: "chrome-node"` และ
+ `chromeNode.node` ชี้ไปยัง Node ที่เชื่อมต่ออยู่พร้อม `browser.proxy` และ
`googlemeet.chrome`
-- สำหรับการสำรองผ่านเบราว์เซอร์: โปรไฟล์ OpenClaw Chrome บนโหนดนั้นลงชื่อเข้าใช้
- Google แล้วและเปิด `https://meet.google.com/new` ได้
-- สำหรับการสำรองผ่านเบราว์เซอร์: การลองซ้ำจะนำแท็บ
- `https://meet.google.com/new` ที่มีอยู่หรือแท็บพร้อมต์บัญชี Google มาใช้ซ้ำก่อนเปิดแท็บใหม่ หากเอเจนต์หมดเวลา
- ให้ลองเรียกเครื่องมือซ้ำแทนการเปิดแท็บ Meet อื่นด้วยตนเอง
-- สำหรับการสำรองผ่านเบราว์เซอร์: หากเครื่องมือส่งคืน `manualActionRequired: true` ให้ใช้
+- สำหรับ browser fallback: โปรไฟล์ Chrome ของ OpenClaw บน Node นั้นลงชื่อเข้าใช้
+ Google แล้วและสามารถเปิด `https://meet.google.com/new`
+- สำหรับ browser fallback: การลองซ้ำใช้แท็บ `https://meet.google.com/new`
+ หรือแท็บพรอมป์บัญชี Google ที่มีอยู่ก่อนเปิดแท็บใหม่ หากเอเจนต์หมดเวลา
+ ให้ลองเรียกเครื่องมือซ้ำแทนการเปิดแท็บ Meet อีกแท็บด้วยตนเอง
+- สำหรับ browser fallback: หากเครื่องมือส่งคืน `manualActionRequired: true` ให้ใช้
`browser.nodeId`, `browser.targetId`, `browserUrl` และ
- `manualActionMessage` ที่ส่งคืนมาเพื่อแนะนำผู้ปฏิบัติงาน อย่าลองซ้ำเป็นลูปจนกว่าการดำเนินการนั้นจะเสร็จสมบูรณ์
-- สำหรับการสำรองผ่านเบราว์เซอร์: หาก Meet แสดงว่า "คุณต้องการให้ผู้อื่นได้ยินเสียงคุณในการประชุมหรือไม่"
- ให้เปิดแท็บนั้นทิ้งไว้ OpenClaw ควรคลิก **ใช้ไมโครโฟน** หรือสำหรับการสำรองแบบสร้างอย่างเดียว
- **ดำเนินการต่อโดยไม่มีไมโครโฟน** ผ่านระบบอัตโนมัติของเบราว์เซอร์ และรอต่อไปจนกว่าจะได้ URL ของ Meet ที่สร้างขึ้น หากทำไม่ได้
- ข้อผิดพลาดควรกล่าวถึง `meet-audio-choice-required` ไม่ใช่ `google-login-required`
+ `manualActionMessage` ที่ส่งคืนมาเพื่อแนะนำผู้ปฏิบัติงาน อย่าลองซ้ำวนไปมาจนกว่า
+ การทำงานนั้นจะเสร็จสมบูรณ์
+- สำหรับ browser fallback: หาก Meet แสดง "Do you want people to hear you in the
+ meeting?" ให้เปิดแท็บทิ้งไว้ OpenClaw ควรคลิก **Use microphone** หรือสำหรับ
+ fallback แบบสร้างอย่างเดียว คลิก **Continue without microphone** ผ่านการทำงานอัตโนมัติ
+ ของเบราว์เซอร์และรอ URL Meet ที่สร้างต่อไป หากทำไม่ได้ ข้อผิดพลาดควรกล่าวถึง
+ `meet-audio-choice-required` ไม่ใช่ `google-login-required`
-### เอเจนต์เข้าร่วมแต่ไม่พูด
+### เอเจนต์เข้าร่วมแล้วแต่ไม่พูด
-ตรวจสอบเส้นทางเรียลไทม์:
+ตรวจสอบเส้นทาง realtime:
```bash
openclaw googlemeet setup
openclaw googlemeet doctor
```
-ใช้ `mode: "realtime"` สำหรับการฟัง/ตอบกลับด้วยเสียง `mode: "transcribe"` ตั้งใจ
-ไม่เริ่มสะพานเสียงเรียลไทม์แบบสองทาง สำหรับการดีบักแบบสังเกตอย่างเดียว
-ให้เรียกใช้ `openclaw googlemeet status --json ` หลังจากผู้เข้าร่วมพูด
+ใช้ `mode: "agent"` สำหรับเส้นทาง talk-back ปกติ STT -> เอเจนต์ OpenClaw -> TTS
+หรือ `mode: "bidi"` สำหรับ fallback เสียง realtime โดยตรง `mode: "transcribe"`
+ตั้งใจไม่เริ่มบริดจ์ talk-back สำหรับการดีบักแบบสังเกตการณ์เท่านั้น
+ให้รัน `openclaw googlemeet status --json ` หลังจากผู้เข้าร่วมพูด
และตรวจสอบ `captioning`, `transcriptLines` และ `lastCaptionText` หาก `inCall` เป็น
-true แต่ `transcriptLines` ยังคงเป็น `0` คำบรรยายของ Meet อาจถูกปิดใช้งาน ไม่มีใคร
-พูดหลังจากติดตั้งตัวสังเกตแล้ว UI ของ Meet เปลี่ยนไป หรือคำบรรยายสดไม่พร้อมใช้งานสำหรับภาษาหรือบัญชีของการประชุม
+true แต่ `transcriptLines` ยังคงเป็น `0` อาจเป็นเพราะคำบรรยาย Meet ถูกปิดใช้งาน
+ยังไม่มีใครพูดตั้งแต่ติดตั้งตัวสังเกตการณ์ UI ของ Meet เปลี่ยนไป หรือ live
+captions ไม่พร้อมใช้งานสำหรับภาษา/บัญชีของการประชุม
-`googlemeet test-speech` ตรวจสอบเส้นทางเรียลไทม์เสมอและรายงานว่า
-พบไบต์เอาต์พุตของสะพานสำหรับการเรียกใช้นั้นหรือไม่ หาก `speechOutputVerified` เป็น false และ
-`speechOutputTimedOut` เป็น true ผู้ให้บริการเรียลไทม์อาจยอมรับ
-ถ้อยคำแล้ว แต่ OpenClaw ไม่พบไบต์เอาต์พุตใหม่ไปถึงสะพานเสียง Chrome
+`googlemeet test-speech` ตรวจสอบเส้นทาง realtime เสมอและรายงานว่า
+พบไบต์เอาต์พุตบริดจ์สำหรับการเรียกใช้นั้นหรือไม่ หาก `speechOutputVerified` เป็น false และ
+`speechOutputTimedOut` เป็น true ผู้ให้บริการ realtime อาจยอมรับถ้อยคำแล้ว
+แต่ OpenClaw ไม่เห็นไบต์เอาต์พุตใหม่ไปถึงบริดจ์เสียง Chrome
ตรวจสอบเพิ่มเติมว่า:
-- มีคีย์ผู้ให้บริการเรียลไทม์บนโฮสต์ Gateway เช่น
+- มีคีย์ผู้ให้บริการ realtime บนโฮสต์ Gateway เช่น
`OPENAI_API_KEY` หรือ `GEMINI_API_KEY`
- `BlackHole 2ch` มองเห็นได้บนโฮสต์ Chrome
-- มี `sox` อยู่บนโฮสต์ Chrome
-- ไมโครโฟนและลำโพงของ Meet ถูกกำหนดเส้นทางผ่านเส้นทางเสียงเสมือนที่ OpenClaw ใช้
+- `sox` มีอยู่บนโฮสต์ Chrome
+- ไมโครโฟนและลำโพง Meet ถูกกำหนดเส้นทางผ่านเส้นทางเสียงเสมือนที่ OpenClaw ใช้
+ `doctor` ควรแสดง `meet output routed: yes` สำหรับการเข้าร่วม Chrome realtime
+ ในเครื่อง
-`googlemeet doctor [session-id]` พิมพ์เซสชัน โหนด สถานะในสาย
-เหตุผลที่ต้องดำเนินการด้วยตนเอง การเชื่อมต่อผู้ให้บริการเรียลไทม์ `realtimeReady` กิจกรรมอินพุต/เอาต์พุตเสียง
-เวลาประทับเสียงล่าสุด ตัวนับไบต์ และ URL เบราว์เซอร์
-ใช้ `googlemeet status [session-id] --json` เมื่อต้องการ JSON ดิบ ใช้
-`googlemeet doctor --oauth` เมื่อต้องการตรวจสอบ refresh ของ Google Meet OAuth
-โดยไม่เปิดเผยโทเคน; เพิ่ม `--meeting` หรือ `--create-space` เมื่อต้องการ
+`googlemeet doctor [session-id]` พิมพ์เซสชัน, Node, สถานะอยู่ในสาย,
+เหตุผลของการทำงานด้วยตนเอง, การเชื่อมต่อผู้ให้บริการ realtime, `realtimeReady`,
+กิจกรรมอินพุต/เอาต์พุตเสียง, timestamp เสียงล่าสุด, ตัวนับไบต์ และ URL เบราว์เซอร์
+ใช้ `googlemeet status [session-id] --json` เมื่อคุณต้องการ JSON ดิบ ใช้
+`googlemeet doctor --oauth` เมื่อคุณต้องการตรวจสอบการรีเฟรช OAuth ของ Google Meet
+โดยไม่เปิดเผยโทเค็น; เพิ่ม `--meeting` หรือ `--create-space` เมื่อคุณต้องการ
หลักฐาน Google Meet API ด้วย
หากเอเจนต์หมดเวลาและคุณเห็นแท็บ Meet เปิดอยู่แล้ว ให้ตรวจสอบแท็บนั้น
-โดยไม่เปิดแท็บอื่น:
+โดยไม่ต้องเปิดอีกแท็บ:
```bash
openclaw googlemeet recover-tab
openclaw googlemeet recover-tab https://meet.google.com/abc-defg-hij
```
-การดำเนินการของเครื่องมือที่เทียบเท่าคือ `recover_current_tab` มันโฟกัสและตรวจสอบ
-แท็บ Meet ที่มีอยู่สำหรับ transport ที่เลือก เมื่อใช้ `chrome` จะใช้การควบคุมเบราว์เซอร์ภายในผ่าน Gateway; เมื่อใช้ `chrome-node` จะใช้โหนด Chrome ที่กำหนดค่าไว้
-มันไม่เปิดแท็บใหม่หรือสร้างเซสชันใหม่; มันรายงานตัวบล็อกปัจจุบัน เช่น สถานะการเข้าสู่ระบบ การอนุญาตเข้าร่วม สิทธิ์ หรือการเลือกเสียง
+การทำงานของเครื่องมือที่เทียบเท่าคือ `recover_current_tab` เครื่องมือนี้โฟกัสและตรวจสอบ
+แท็บ Meet ที่มีอยู่สำหรับ transport ที่เลือก เมื่อใช้ `chrome` จะใช้การควบคุมเบราว์เซอร์
+ในเครื่องผ่าน Gateway; เมื่อใช้ `chrome-node` จะใช้ Chrome Node ที่กำหนดค่าไว้
+เครื่องมือนี้ไม่เปิดแท็บใหม่หรือสร้างเซสชันใหม่; แต่รายงานตัวบล็อกปัจจุบัน
+เช่น สถานะการเข้าสู่ระบบ การอนุญาตเข้า การให้สิทธิ์ หรือการเลือกเสียง
คำสั่ง CLI คุยกับ Gateway ที่กำหนดค่าไว้ ดังนั้น Gateway ต้องทำงานอยู่;
-`chrome-node` ยังต้องให้โหนด Chrome เชื่อมต่ออยู่ด้วย
+`chrome-node` ยังต้องมี Chrome Node เชื่อมต่ออยู่ด้วย
### การตรวจสอบการตั้งค่า Twilio ล้มเหลว
`twilio-voice-call-plugin` ล้มเหลวเมื่อ `voice-call` ไม่ได้รับอนุญาตหรือไม่ได้เปิดใช้งาน
-เพิ่มเข้าไปใน `plugins.allow`, เปิดใช้งาน `plugins.entries.voice-call` และโหลด Gateway ใหม่
+เพิ่มลงใน `plugins.allow` เปิดใช้งาน `plugins.entries.voice-call` และโหลด
+Gateway ใหม่
-`twilio-voice-call-credentials` ล้มเหลวเมื่อ backend ของ Twilio ไม่มี SID บัญชี โทเคน auth หรือหมายเลขผู้โทร ตั้งค่าสิ่งเหล่านี้บนโฮสต์ Gateway:
+`twilio-voice-call-credentials` ล้มเหลวเมื่อแบ็กเอนด์ Twilio ไม่มี account
+SID, auth token หรือหมายเลขผู้โทร ตั้งค่าเหล่านี้บนโฮสต์ Gateway:
```bash
export TWILIO_ACCOUNT_SID=AC...
@@ -1296,12 +1416,12 @@ export TWILIO_AUTH_TOKEN=...
export TWILIO_FROM_NUMBER=+15550001234
```
-`twilio-voice-call-webhook` ล้มเหลวเมื่อ `voice-call` ไม่มีการเปิดเผย Webhook สาธารณะ
-หรือเมื่อ `publicUrl` ชี้ไปยัง local loopback หรือพื้นที่เครือข่ายส่วนตัว
+`twilio-voice-call-webhook` ล้มเหลวเมื่อ `voice-call` ไม่มีการเปิดเผย Webhook
+สาธารณะ หรือเมื่อ `publicUrl` ชี้ไปยัง local loopback หรือพื้นที่เครือข่ายส่วนตัว
ตั้งค่า `plugins.entries.voice-call.config.publicUrl` เป็น URL ผู้ให้บริการสาธารณะ หรือ
-กำหนดค่าการเปิดเผย `voice-call` ผ่าน tunnel/Tailscale
+กำหนดค่า tunnel/Tailscale exposure สำหรับ `voice-call`
-URL แบบ loopback และ URL ส่วนตัวใช้ไม่ได้สำหรับ callback ของผู้ให้บริการโทรศัพท์ อย่าใช้
+URL แบบ loopback และส่วนตัวไม่ถูกต้องสำหรับ callback ของผู้ให้บริการโทรศัพท์ อย่าใช้
`localhost`, `127.0.0.1`, `0.0.0.0`, `10.x`, `172.16.x`-`172.31.x`,
`192.168.x`, `169.254.x`, `fc00::/7` หรือ `fd00::/8` เป็น `publicUrl`
@@ -1324,7 +1444,8 @@ URL แบบ loopback และ URL ส่วนตัวใช้ไม่ไ
}
```
-สำหรับการพัฒนาในเครื่อง ให้ใช้ tunnel หรือการเปิดเผยผ่าน Tailscale แทน URL โฮสต์ส่วนตัว:
+สำหรับการพัฒนาในเครื่อง ให้ใช้ tunnel หรือ Tailscale exposure แทน URL โฮสต์
+ส่วนตัว:
```json5
{
@@ -1342,7 +1463,7 @@ URL แบบ loopback และ URL ส่วนตัวใช้ไม่ไ
}
```
-จากนั้นรีสตาร์ตหรือโหลด Gateway ใหม่ แล้วเรียกใช้:
+จากนั้นรีสตาร์ตหรือโหลด Gateway ใหม่และรัน:
```bash
openclaw googlemeet setup --transport twilio
@@ -1350,22 +1471,23 @@ openclaw voicecall setup
openclaw voicecall smoke
```
-`voicecall smoke` เป็นการตรวจสอบความพร้อมเท่านั้นโดยค่าเริ่มต้น หากต้องการ dry-run หมายเลขที่เฉพาะเจาะจง:
+`voicecall smoke` เป็นการตรวจสอบความพร้อมเท่านั้นโดยค่าเริ่มต้น หากต้องการ dry-run
+หมายเลขเฉพาะ:
```bash
openclaw voicecall smoke --to "+15555550123"
```
-เพิ่ม `--yes` เฉพาะเมื่อคุณตั้งใจจะโทรแจ้งเตือนขาออกจริง:
+เพิ่ม `--yes` เฉพาะเมื่อคุณตั้งใจจะโทรแจ้งเตือนขาออกแบบสด:
```bash
openclaw voicecall smoke --to "+15555550123" --yes
```
-### การโทร Twilio เริ่มขึ้นแต่ไม่เคยเข้าสู่การประชุม
+### สาย Twilio เริ่มแล้วแต่ไม่เคยเข้าสู่การประชุม
-ยืนยันว่าเหตุการณ์ Meet แสดงรายละเอียดการโทรเข้า ส่งหมายเลขโทรเข้าและ PIN ที่ตรงเป๊ะ
-หรือลำดับ DTMF แบบกำหนดเอง:
+ยืนยันว่าอีเวนต์ Meet เปิดเผยรายละเอียดการโทรเข้าโทรศัพท์ ส่งหมายเลขโทรเข้า
+และ PIN ที่ถูกต้อง หรือกำหนดลำดับ DTMF แบบกำหนดเอง:
```bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
@@ -1374,71 +1496,70 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \
--dtmf-sequence ww123456#
```
-ใช้ `w` นำหน้าหรือเครื่องหมายจุลภาคใน `--dtmf-sequence` หากผู้ให้บริการต้องการหยุดพัก
+ใช้ `w` นำหน้าหรือจุลภาคใน `--dtmf-sequence` หากผู้ให้บริการต้องการการหยุดพัก
ก่อนป้อน PIN
-หากมีการสร้างสายโทรศัพท์แล้ว แต่รายชื่อผู้เข้าร่วมของ Meet ยังไม่แสดงผู้เข้าร่วมแบบโทรเข้า:
+หากสร้างสายโทรศัพท์แล้วแต่รายชื่อผู้เข้าร่วม Meet ไม่เคยแสดงผู้เข้าร่วมแบบโทรเข้า:
-- เรียกใช้ `openclaw googlemeet doctor ` เพื่อยืนยัน ID สาย Twilio
- ที่ถูกมอบหมาย ว่า DTMF ถูกเข้าคิวไว้หรือไม่ และมีการร้องขอคำทักทายเปิดตัวหรือไม่
-- เรียกใช้ `openclaw voicecall status --call-id ` และยืนยันว่าสายยังคง
- ทำงานอยู่
-- เรียกใช้ `openclaw voicecall tail` และตรวจสอบว่า Webhook ของ Twilio มาถึง
- Gateway
-- เรียกใช้ `openclaw logs --follow` และมองหาลำดับ Twilio Meet: Google
- Meet มอบหมายการเข้าร่วม, Voice Call เริ่มสายโทรศัพท์, Google Meet รอ
+- รัน `openclaw googlemeet doctor ` เพื่อยืนยัน ID สาย Twilio
+ ที่มอบหมายไว้ ตรวจว่า DTMF เข้าคิวแล้วหรือไม่ และตรวจว่ามีการร้องขอคำทักทายแนะนำตัวหรือไม่
+- รัน `openclaw voicecall status --call-id ` และยืนยันว่าสายยังคงใช้งานอยู่
+- รัน `openclaw voicecall tail` และตรวจว่า Webhook ของ Twilio มาถึง Gateway
+- รัน `openclaw logs --follow` และมองหาลำดับ Twilio Meet: Google
+ Meet มอบหมายการเข้าร่วม, Voice Call เริ่มขาโทรศัพท์, Google Meet รอ
`voiceCall.dtmfDelayMs`, ส่ง DTMF ด้วย `voicecall.dtmf`, รอ
- `voiceCall.postDtmfSpeechDelayMs` แล้วขอเสียงทักทายเปิดตัวด้วย
+ `voiceCall.postDtmfSpeechDelayMs` จากนั้นร้องขอคำพูดแนะนำตัวด้วย
`voicecall.speak`
-- เรียกใช้ `openclaw googlemeet setup --transport twilio` อีกครั้ง; การตรวจสอบการตั้งค่าสีเขียว
- จำเป็น แต่ไม่ได้พิสูจน์ว่าลำดับ PIN ของการประชุมถูกต้อง
-- ยืนยันว่าหมายเลขโทรเข้าเป็นของคำเชิญ Meet และภูมิภาคเดียวกับ
- PIN
-- เพิ่ม `voiceCall.dtmfDelayMs` หาก Meet รับสายช้าหรือ transcript ของสาย
- ยังแสดงพร้อมต์ให้ป้อน PIN หลังจากส่ง DTMF แล้ว
-- หากผู้เข้าร่วมเข้าร่วมแล้วแต่คุณไม่ได้ยินคำทักทาย ให้ตรวจสอบ
- `openclaw logs --follow` สำหรับคำขอ `voicecall.speak` หลัง DTMF และ
- การเล่น TTS ผ่าน media-stream หรือ fallback `` ของ Twilio หาก transcript ของสาย
- ยังมีคำว่า "ป้อน PIN การประชุม" แสดงว่าสายโทรศัพท์ยังไม่ได้เข้าห้อง Meet
- ดังนั้นผู้เข้าร่วมการประชุมจะไม่ได้ยินเสียงพูด
+- รัน `openclaw googlemeet setup --transport twilio` อีกครั้ง; ต้องมีการตรวจสอบการตั้งค่า
+ เป็นสีเขียว แต่ไม่ได้พิสูจน์ว่าลำดับ PIN การประชุมถูกต้อง
+- ยืนยันว่าหมายเลขโทรเข้าเป็นของคำเชิญและภูมิภาค Meet เดียวกันกับ PIN
+- เพิ่ม `voiceCall.dtmfDelayMs` หาก Meet รับสายช้า หรือบันทึกถอดเสียงของสาย
+ ยังแสดงพรอมป์ให้ป้อน PIN หลังจากส่ง DTMF แล้ว
+- หากผู้เข้าร่วมเข้าร่วมแล้วแต่คุณไม่ได้ยินคำทักทาย ให้ตรวจ
+ `openclaw logs --follow` เพื่อดูคำขอ `voicecall.speak` หลัง DTMF และ
+ การเล่น TTS แบบ media-stream หรือ fallback `` ของ Twilio หากบันทึกถอดเสียงของสาย
+ ยังมี "enter the meeting PIN" แสดงว่าขาโทรศัพท์ยังไม่ได้เข้าห้อง Meet
+ ดังนั้นผู้เข้าร่วมการประชุมจะยังไม่ได้ยินเสียงพูด
หาก Webhook ไม่มาถึง ให้ดีบัก Voice Call Plugin ก่อน: ผู้ให้บริการต้อง
-เข้าถึง `plugins.entries.voice-call.config.publicUrl` หรือ tunnel ที่กำหนดค่าไว้
-ดู [การแก้ไขปัญหาการโทรด้วยเสียง](/th/plugins/voice-call#troubleshooting)
+เข้าถึง `plugins.entries.voice-call.config.publicUrl` หรือ tunnel ที่กำหนดค่าไว้ได้
+ดู [การแก้ปัญหาการโทรด้วยเสียง](/th/plugins/voice-call#troubleshooting)
## หมายเหตุ
-media API อย่างเป็นทางการของ Google Meet เป็นแบบเน้นรับสื่อ ดังนั้นการพูดเข้าไปในสาย Meet
-ยังต้องมีเส้นทางผู้เข้าร่วม Plugin นี้ทำให้ขอบเขตนั้นมองเห็นได้:
+API สื่ออย่างเป็นทางการของ Google Meet เน้นการรับสื่อ ดังนั้นการพูดเข้าไปในสาย Meet
+ยังคงต้องมีเส้นทางของผู้เข้าร่วม Plugin นี้ทำให้ขอบเขตนั้นมองเห็นได้ชัดเจน:
Chrome จัดการการเข้าร่วมผ่านเบราว์เซอร์และการกำหนดเส้นทางเสียงภายในเครื่อง; Twilio จัดการ
-การเข้าร่วมผ่านการโทรเข้า
+การเข้าร่วมด้วยการโทรเข้า
-โหมดเรียลไทม์ของ Chrome ต้องใช้ `BlackHole 2ch` พร้อมกับอย่างใดอย่างหนึ่งต่อไปนี้:
+โหมดตอบกลับด้วยเสียงของ Chrome ต้องใช้ `BlackHole 2ch` พร้อมอย่างใดอย่างหนึ่งต่อไปนี้:
-- `chrome.audioInputCommand` และ `chrome.audioOutputCommand`: OpenClaw เป็นเจ้าของ
- สะพานโมเดลเรียลไทม์และส่งเสียงในรูปแบบ `chrome.audioFormat` ระหว่างคำสั่งเหล่านั้น
- กับผู้ให้บริการเสียงเรียลไทม์ที่เลือก เส้นทาง Chrome เริ่มต้นคือ
- PCM16 24 kHz; G.711 mu-law 8 kHz ยังคงพร้อมใช้งานสำหรับคู่คำสั่งรุ่นเก่า
-- `chrome.audioBridgeCommand`: คำสั่งสะพานภายนอกเป็นเจ้าของเส้นทางเสียงภายในเครื่องทั้งหมด
- และต้องออกหลังจากเริ่มหรือยืนยัน daemon แล้ว
+- `chrome.audioInputCommand` พร้อม `chrome.audioOutputCommand`: OpenClaw เป็นเจ้าของ
+ bridge และ pipe เสียงใน `chrome.audioFormat` ระหว่างคำสั่งเหล่านั้นกับ
+ ผู้ให้บริการที่เลือก โหมด agent ใช้การถอดเสียงแบบเรียลไทม์ร่วมกับ TTS ปกติ;
+ โหมด bidi ใช้ผู้ให้บริการเสียงแบบเรียลไทม์ เส้นทาง Chrome เริ่มต้นคือ 24 kHz
+ PCM16; 8 kHz G.711 mu-law ยังคงพร้อมใช้งานสำหรับคู่คำสั่งรุ่นเดิม
+- `chrome.audioBridgeCommand`: คำสั่ง bridge ภายนอกเป็นเจ้าของเส้นทางเสียงภายในเครื่อง
+ ทั้งหมด และต้องออกหลังจากเริ่มหรือยืนยัน daemon ของตัวเองแล้ว รายการนี้ใช้ได้เฉพาะกับ
+ `bidi` เพราะโหมด `agent` ต้องเข้าถึงคู่คำสั่งโดยตรงสำหรับ TTS
-สำหรับเสียงสองทางที่สะอาด ให้กำหนดเส้นทางเอาต์พุต Meet และไมโครโฟน Meet ผ่านอุปกรณ์เสมือนแยกกัน
-หรือกราฟอุปกรณ์เสมือนแบบ Loopback-style อุปกรณ์ BlackHole เดียวที่ใช้ร่วมกัน
-อาจสะท้อนเสียงผู้เข้าร่วมคนอื่นกลับเข้าไปในสาย
+เพื่อให้ได้เสียง duplex ที่สะอาด ให้กำหนดเส้นทางเอาต์พุต Meet และไมโครโฟน Meet ผ่าน
+อุปกรณ์เสมือนแยกกัน หรือกราฟอุปกรณ์เสมือนแบบ Loopback-style อุปกรณ์ BlackHole เดียวที่ใช้ร่วมกัน
+อาจสะท้อนเสียงผู้เข้าร่วมคนอื่นกลับเข้าไปในสายได้
-เมื่อใช้สะพาน Chrome แบบคู่คำสั่ง `chrome.bargeInInputCommand` สามารถฟัง
-ไมโครโฟนภายในเครื่องแยกต่างหากและล้างการเล่นเสียงของผู้ช่วยเมื่อมนุษย์เริ่มพูด
-สิ่งนี้ทำให้เสียงมนุษย์มาก่อนเอาต์พุตของผู้ช่วย แม้เมื่ออินพุต loopback ของ BlackHole ที่ใช้ร่วมกัน
-ถูกระงับชั่วคราวระหว่างการเล่นเสียงของผู้ช่วยก็ตาม
-เช่นเดียวกับ `chrome.audioInputCommand` และ `chrome.audioOutputCommand` มันเป็น
+เมื่อใช้ bridge Chrome แบบคู่คำสั่ง `chrome.bargeInInputCommand` สามารถฟัง
+ไมโครโฟนภายในเครื่องแยกต่างหากและล้างเสียงเล่นกลับของผู้ช่วยเมื่อมนุษย์เริ่ม
+พูด วิธีนี้ทำให้เสียงพูดของมนุษย์มาก่อนเอาต์พุตของผู้ช่วย แม้เมื่ออินพุต
+BlackHole loopback ที่ใช้ร่วมกันถูกระงับชั่วคราวระหว่างการเล่นกลับของผู้ช่วย
+เช่นเดียวกับ `chrome.audioInputCommand` และ `chrome.audioOutputCommand` รายการนี้เป็น
คำสั่งภายในเครื่องที่ผู้ปฏิบัติงานกำหนดค่า ใช้เส้นทางคำสั่งที่เชื่อถือได้อย่างชัดเจนหรือ
รายการอาร์กิวเมนต์ และอย่าชี้ไปยังสคริปต์จากตำแหน่งที่ไม่น่าเชื่อถือ
-`googlemeet speak` กระตุ้นสะพานเสียงเรียลไทม์ที่ใช้งานอยู่สำหรับเซสชัน Chrome
-`googlemeet leave` หยุดสะพานนั้น สำหรับเซสชัน Twilio ที่มอบหมายผ่าน Voice Call Plugin
-`leave` จะวางสายเสียงพื้นฐานด้วย
-ใช้ `googlemeet end-active-conference` เมื่อคุณต้องการปิดการประชุม
-Google Meet ที่ใช้งานอยู่สำหรับพื้นที่ที่จัดการผ่าน API ด้วย
+`googlemeet speak` จะทริกเกอร์ bridge เสียงตอบกลับที่ใช้งานอยู่สำหรับเซสชัน Chrome
+`googlemeet leave` จะหยุด bridge นั้น สำหรับเซสชัน Twilio ที่มอบหมายผ่าน Voice Call Plugin,
+`leave` จะวางสายการโทรด้วยเสียงเบื้องหลังด้วย
+ใช้ `googlemeet end-active-conference` เมื่อคุณต้องการปิด
+การประชุม Google Meet ที่ใช้งานอยู่สำหรับพื้นที่ที่จัดการด้วย API ด้วย
## ที่เกี่ยวข้อง
diff --git a/docs/th/plugins/memory-wiki.md b/docs/th/plugins/memory-wiki.md
index 190f1596f..5e1990e06 100644
--- a/docs/th/plugins/memory-wiki.md
+++ b/docs/th/plugins/memory-wiki.md
@@ -1,81 +1,81 @@
---
read_when:
- - คุณต้องการความรู้ที่คงอยู่ถาวรมากกว่าบันทึก MEMORY.md แบบธรรมดา
+ - คุณต้องการความรู้ที่คงอยู่ถาวรนอกเหนือจากบันทึก MEMORY.md แบบธรรมดา
- คุณกำลังกำหนดค่า Plugin memory-wiki ที่รวมมาให้
- คุณต้องการทำความเข้าใจ wiki_search, wiki_get หรือโหมดบริดจ์
-summary: 'memory-wiki: คลังความรู้ที่รวบรวมแล้วพร้อมที่มา ข้อกล่าวอ้าง แดชบอร์ด และโหมดบริดจ์'
-title: วิกิความจำ
+summary: 'memory-wiki: คลังความรู้ที่รวบรวมไว้พร้อมที่มาของข้อมูล คำกล่าวอ้าง แดชบอร์ด และโหมดบริดจ์'
+title: วิกิหน่วยความจำ
x-i18n:
- generated_at: "2026-04-30T10:06:53Z"
+ generated_at: "2026-05-04T02:26:09Z"
model: gpt-5.5
provider: openai
- source_hash: 744d569f8b0c9b668ea54dc057f808544359eaae87d5557de2e6acd1b31acd89
+ source_hash: b070177b7c1217e9102bc57680b4009265e3584ede7ad6dc3ba7b6393260fefe
source_path: plugins/memory-wiki.md
workflow: 16
---
-`memory-wiki` เป็น Plugin ที่มาพร้อมชุด OpenClaw ซึ่งเปลี่ยนหน่วยความจำถาวรให้เป็นคลังความรู้ที่คอมไพล์แล้ว
+`memory-wiki` เป็น Plugin ที่มาพร้อมชุด ซึ่งเปลี่ยนหน่วยความจำถาวรให้เป็นคลังความรู้ที่คอมไพล์แล้ว
-มัน **ไม่** แทนที่ Plugin Active Memory Plugin Active Memory ยังคง
-รับผิดชอบการเรียกคืน การโปรโมต การทำดัชนี และ Dreaming อยู่ `memory-wiki` ทำงานอยู่ข้าง ๆ
-และคอมไพล์ความรู้ถาวรให้เป็นวิกิที่นำทางได้ พร้อมหน้าที่กำหนดแน่นอน
-ข้อกล่าวอ้างแบบมีโครงสร้าง แหล่งที่มา แดชบอร์ด และไดเจสต์ที่เครื่องอ่านได้
+มัน **ไม่ได้** แทนที่ Plugin หน่วยความจำที่ทำงานอยู่ Plugin หน่วยความจำที่ทำงานอยู่ยังคง
+เป็นเจ้าของการเรียกคืน การโปรโมต การจัดทำดัชนี และ Dreaming `memory-wiki` อยู่เคียงข้าง
+และคอมไพล์ความรู้ถาวรให้เป็นวิกิที่นำทางได้ พร้อมหน้าที่กำหนดได้แน่นอน
+claim แบบมีโครงสร้าง แหล่งที่มา แดชบอร์ด และ digest ที่เครื่องอ่านได้
-ใช้มันเมื่อคุณต้องการให้หน่วยความจำทำงานคล้ายเลเยอร์ความรู้ที่ได้รับการดูแล
-มากกว่ากองไฟล์ Markdown
+ใช้เมื่อคุณต้องการให้หน่วยความจำทำงานเหมือนชั้นความรู้ที่ดูแลรักษาอยู่มากขึ้น และ
+เหมือนกองไฟล์ Markdown น้อยลง
## สิ่งที่เพิ่มเข้ามา
-- คลังวิกิเฉพาะพร้อมเลย์เอาต์หน้าที่กำหนดแน่นอน
-- เมทาดาทาข้อกล่าวอ้างและหลักฐานแบบมีโครงสร้าง ไม่ใช่แค่ข้อความร้อยแก้ว
-- แหล่งที่มา ความมั่นใจ ข้อขัดแย้ง และคำถามเปิดในระดับหน้า
-- ไดเจสต์ที่คอมไพล์แล้วสำหรับผู้บริโภคฝั่งเอเจนต์/รันไทม์
-- เครื่องมือค้นหา/ดึงข้อมูล/นำไปใช้/ตรวจสอบของวิกิโดยตรง
-- โหมดบริดจ์เสริมที่นำเข้าอาร์ติแฟกต์สาธารณะจาก Plugin Active Memory
-- โหมดเรนเดอร์ที่เป็นมิตรกับ Obsidian และการผสานรวม CLI แบบเสริม
+- คลังวิกิเฉพาะพร้อมเลย์เอาต์หน้าที่กำหนดได้แน่นอน
+- เมทาดาทา claim และหลักฐานแบบมีโครงสร้าง ไม่ใช่แค่ข้อความร้อยแก้ว
+- แหล่งที่มา ความมั่นใจ ความขัดแย้ง และคำถามเปิดในระดับหน้า
+- digest ที่คอมไพล์แล้วสำหรับผู้บริโภคฝั่งเอเจนต์/รันไทม์
+- เครื่องมือค้นหา/get/apply/lint แบบเนทีฟของวิกิ
+- โหมด bridge แบบเลือกได้ ซึ่งนำเข้า artifact สาธารณะจาก Plugin หน่วยความจำที่ทำงานอยู่
+- โหมด render ที่เป็นมิตรกับ Obsidian และการผสานกับ CLI แบบเลือกได้
-## ความสัมพันธ์กับหน่วยความจำ
+## ทำงานร่วมกับหน่วยความจำอย่างไร
-ให้คิดถึงการแบ่งหน้าที่แบบนี้:
+ให้คิดถึงการแบ่งชั้นแบบนี้:
-| เลเยอร์ | รับผิดชอบ |
+| ชั้น | เป็นเจ้าของ |
| ------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
-| Plugin Active Memory (`memory-core`, QMD, Honcho ฯลฯ) | การเรียกคืน การค้นหาเชิงความหมาย การโปรโมต Dreaming รันไทม์หน่วยความจำ |
-| `memory-wiki` | หน้าวิกิที่คอมไพล์แล้ว การสังเคราะห์ที่อุดมด้วยแหล่งที่มา แดชบอร์ด การค้นหา/ดึงข้อมูล/นำไปใช้เฉพาะวิกิ |
+| Plugin หน่วยความจำที่ทำงานอยู่ (`memory-core`, QMD, Honcho ฯลฯ) | การเรียกคืน การค้นหาเชิงความหมาย การโปรโมต Dreaming รันไทม์หน่วยความจำ |
+| `memory-wiki` | หน้าวิกิที่คอมไพล์แล้ว การสังเคราะห์ที่มีแหล่งที่มาแน่นหนา แดชบอร์ด การค้นหา/get/apply เฉพาะวิกิ |
-หาก Plugin Active Memory เปิดเผยอาร์ติแฟกต์การเรียกคืนที่ใช้ร่วมกัน OpenClaw จะค้นหา
-ทั้งสองเลเยอร์ได้ในรอบเดียวด้วย `memory_search corpus=all`
+หาก Plugin หน่วยความจำที่ทำงานอยู่เปิดเผย artifact การเรียกคืนร่วม OpenClaw สามารถค้นหา
+ทั้งสองชั้นได้ในรอบเดียวด้วย `memory_search corpus=all`
เมื่อคุณต้องการการจัดอันดับเฉพาะวิกิ แหล่งที่มา หรือการเข้าถึงหน้าโดยตรง ให้ใช้
-เครื่องมือของวิกิโดยตรงแทน
+เครื่องมือเนทีฟของวิกิแทน
## รูปแบบไฮบริดที่แนะนำ
-ค่าเริ่มต้นที่แข็งแรงสำหรับการตั้งค่าแบบ local-first คือ:
+ค่าเริ่มต้นที่ดีสำหรับการตั้งค่าแบบ local-first คือ:
-- QMD เป็นแบ็กเอนด์ Active Memory สำหรับการเรียกคืนและการค้นหาเชิงความหมายแบบกว้าง
+- QMD เป็นแบ็กเอนด์หน่วยความจำที่ทำงานอยู่สำหรับการเรียกคืนและการค้นหาเชิงความหมายแบบกว้าง
- `memory-wiki` ในโหมด `bridge` สำหรับหน้าความรู้ถาวรที่สังเคราะห์แล้ว
-การแบ่งแบบนั้นทำงานได้ดีเพราะแต่ละเลเยอร์ยังคงมีจุดโฟกัสของตัวเอง:
+การแบ่งแบบนั้นทำงานได้ดีเพราะแต่ละชั้นยังคงมีจุดโฟกัสของตัวเอง:
- QMD ทำให้โน้ตดิบ การส่งออกเซสชัน และคอลเลกชันเพิ่มเติมค้นหาได้
-- `memory-wiki` คอมไพล์เอนทิตี ข้อกล่าวอ้าง แดชบอร์ด และหน้าต้นทางที่เสถียร
+- `memory-wiki` คอมไพล์เอนทิตี claim แดชบอร์ด และหน้าต้นทางที่เสถียร
กฎใช้งานจริง:
-- ใช้ `memory_search` เมื่อคุณต้องการการเรียกคืนแบบกว้างครั้งเดียวทั่วหน่วยความจำ
+- ใช้ `memory_search` เมื่อคุณต้องการการเรียกคืนแบบกว้างหนึ่งรอบทั่วทั้งหน่วยความจำ
- ใช้ `wiki_search` และ `wiki_get` เมื่อคุณต้องการผลลัพธ์วิกิที่รับรู้แหล่งที่มา
-- ใช้ `memory_search corpus=all` เมื่อคุณต้องการให้การค้นหาที่ใช้ร่วมกันครอบคลุมทั้งสองเลเยอร์
+- ใช้ `memory_search corpus=all` เมื่อคุณต้องการให้การค้นหาร่วมครอบคลุมทั้งสองชั้น
-หากโหมดบริดจ์รายงานว่าอาร์ติแฟกต์ที่ส่งออกเป็นศูนย์ แปลว่า Plugin Active Memory
-ยังไม่ได้เปิดเผยอินพุตบริดจ์สาธารณะในขณะนี้ ให้รัน `openclaw wiki doctor` ก่อน
-แล้วจึงยืนยันว่า Plugin Active Memory รองรับอาร์ติแฟกต์สาธารณะ
+หากโหมด bridge รายงานว่ามี artifact ที่ส่งออกเป็นศูนย์ แสดงว่า Plugin หน่วยความจำที่ทำงานอยู่ยัง
+ไม่ได้เปิดเผยอินพุต bridge สาธารณะในขณะนี้ ให้รัน `openclaw wiki doctor` ก่อน
+จากนั้นยืนยันว่า Plugin หน่วยความจำที่ทำงานอยู่รองรับ artifact สาธารณะ
-เมื่อโหมดบริดจ์ทำงานอยู่และเปิดใช้งาน `bridge.readMemoryArtifacts`
-`openclaw wiki status`, `openclaw wiki doctor`, และ `openclaw wiki bridge
-import` จะอ่านผ่าน Gateway ที่กำลังทำงานอยู่ ซึ่งทำให้การตรวจบริดจ์ของ CLI สอดคล้อง
-กับบริบทของ Plugin หน่วยความจำในรันไทม์ หากปิดบริดจ์หรือปิดการอ่านอาร์ติแฟกต์
-คำสั่งเหล่านั้นจะยังคงพฤติกรรมแบบโลคัล/ออฟไลน์ไว้
+เมื่อโหมด bridge ทำงานอยู่และเปิดใช้ `bridge.readMemoryArtifacts`
+`openclaw wiki status`, `openclaw wiki doctor` และ `openclaw wiki bridge
+import` จะอ่านผ่าน Gateway ที่กำลังรันอยู่ วิธีนี้ทำให้การตรวจ bridge ผ่าน CLI สอดคล้อง
+กับบริบท Plugin หน่วยความจำของรันไทม์ หากปิด bridge หรือปิดการอ่าน artifact
+คำสั่งเหล่านั้นจะคงพฤติกรรมแบบ local/offline ไว้
## โหมดคลัง
@@ -85,35 +85,35 @@ import` จะอ่านผ่าน Gateway ที่กำลังทำง
คลังของตัวเอง แหล่งข้อมูลของตัวเอง ไม่มีการพึ่งพา `memory-core`
-ใช้โหมดนี้เมื่อคุณต้องการให้วิกิเป็นคลังความรู้ที่คัดสรรเอง
+ใช้เมื่อคุณต้องการให้วิกิเป็นคลังความรู้ที่คัดสรรเอง
### `bridge`
-อ่านอาร์ติแฟกต์หน่วยความจำสาธารณะและเหตุการณ์หน่วยความจำจาก Plugin Active Memory
-ผ่านส่วนเชื่อมต่อ Plugin SDK สาธารณะ
+อ่าน artifact หน่วยความจำสาธารณะและเหตุการณ์หน่วยความจำจาก Plugin หน่วยความจำที่ทำงานอยู่
+ผ่าน seam สาธารณะของ Plugin SDK
-ใช้โหมดนี้เมื่อคุณต้องการให้วิกิคอมไพล์และจัดระเบียบอาร์ติแฟกต์ที่ Plugin หน่วยความจำ
-ส่งออก โดยไม่เข้าถึงภายในส่วน Plugin ที่เป็นส่วนตัว
+ใช้เมื่อคุณต้องการให้วิกิคอมไพล์และจัดระเบียบ artifact ที่ส่งออกจาก Plugin หน่วยความจำ
+โดยไม่เข้าถึงภายในส่วนตัวของ Plugin
-โหมดบริดจ์สามารถทำดัชนี:
+โหมด bridge สามารถจัดทำดัชนี:
-- อาร์ติแฟกต์หน่วยความจำที่ส่งออก
-- รายงานความฝัน
+- artifact หน่วยความจำที่ส่งออก
+- รายงาน dream
- โน้ตรายวัน
- ไฟล์รากของหน่วยความจำ
- บันทึกเหตุการณ์หน่วยความจำ
### `unsafe-local`
-ช่องทางหลุดออกอย่างชัดเจนสำหรับพาธส่วนตัวบนเครื่องเดียวกัน
+ช่องทางหลบออกบนเครื่องเดียวกันแบบชัดเจนสำหรับพาธส่วนตัวในเครื่อง
-โหมดนี้ตั้งใจให้เป็นแบบทดลองและไม่สามารถพกพาได้ ใช้เฉพาะเมื่อคุณ
-เข้าใจขอบเขตความเชื่อถือและต้องการการเข้าถึงระบบไฟล์โลคัลที่
-โหมดบริดจ์ให้ไม่ได้โดยเฉพาะ
+โหมดนี้ตั้งใจให้เป็นเชิงทดลองและไม่พกพา ใช้เฉพาะเมื่อคุณ
+เข้าใจขอบเขตความไว้วางใจและจำเป็นต้องใช้การเข้าถึงระบบไฟล์ในเครื่องที่
+โหมด bridge ให้ไม่ได้จริง ๆ
## เลย์เอาต์คลัง
-Plugin จะเริ่มต้นคลังแบบนี้:
+Plugin เริ่มต้นคลังแบบนี้:
```text
/
@@ -131,21 +131,21 @@ Plugin จะเริ่มต้นคลังแบบนี้:
.openclaw-wiki/
```
-เนื้อหาที่จัดการแล้วจะอยู่ภายในบล็อกที่สร้างขึ้น บล็อกโน้ตของมนุษย์จะถูกเก็บรักษาไว้
+เนื้อหาที่จัดการจะอยู่ภายในบล็อกที่สร้างขึ้น บล็อกโน้ตของมนุษย์จะถูกรักษาไว้
กลุ่มหน้าหลักคือ:
-- `sources/` สำหรับวัตถุดิบนำเข้าและหน้าที่มีบริดจ์หนุนหลัง
-- `entities/` สำหรับสิ่งที่คงทน บุคคล ระบบ โปรเจกต์ และวัตถุ
+- `sources/` สำหรับวัตถุดิบที่นำเข้าและหน้าที่อิง bridge
+- `entities/` สำหรับสิ่ง บุคคล ระบบ โครงการ และวัตถุที่คงทน
- `concepts/` สำหรับแนวคิด นามธรรม รูปแบบ และนโยบาย
-- `syntheses/` สำหรับสรุปที่คอมไพล์แล้วและรายงานรวบยอดที่ดูแลไว้
+- `syntheses/` สำหรับสรุปที่คอมไพล์แล้วและ rollup ที่ดูแลรักษา
- `reports/` สำหรับแดชบอร์ดที่สร้างขึ้น
-## ข้อกล่าวอ้างและหลักฐานแบบมีโครงสร้าง
+## claim และหลักฐานแบบมีโครงสร้าง
-หน้าสามารถมี frontmatter `claims` แบบมีโครงสร้างได้ ไม่ใช่แค่ข้อความรูปแบบอิสระ
+หน้าสามารถมี frontmatter `claims` แบบมีโครงสร้างได้ ไม่ใช่แค่ข้อความอิสระ
-ข้อกล่าวอ้างแต่ละรายการสามารถรวม:
+claim แต่ละรายการสามารถมี:
- `id`
- `text`
@@ -154,7 +154,7 @@ Plugin จะเริ่มต้นคลังแบบนี้:
- `evidence[]`
- `updatedAt`
-รายการหลักฐานสามารถรวม:
+รายการหลักฐานสามารถมี:
- `kind`
- `sourceId`
@@ -166,30 +166,31 @@ Plugin จะเริ่มต้นคลังแบบนี้:
- `note`
- `updatedAt`
-นี่คือสิ่งที่ทำให้วิกิทำหน้าที่คล้ายเลเยอร์ความเชื่อมากกว่าที่ทิ้งโน้ตแบบนิ่ง ๆ
-ข้อกล่าวอ้างสามารถติดตาม ให้คะแนน โต้แย้ง และย้อนกลับไปยังแหล่งที่มาได้
+นี่คือสิ่งที่ทำให้วิกิทำงานเหมือนชั้นความเชื่อมากกว่ากองโน้ตแบบรับอย่างเดียว
+claim สามารถถูกติดตาม ให้คะแนน โต้แย้ง และโยงกลับไปยังแหล่งข้อมูลได้
## เมทาดาทาเอนทิตีสำหรับเอเจนต์
-หน้าเอนทิตียังสามารถมีเมทาดาทาการกำหนดเส้นทางสำหรับให้เอเจนต์ใช้ได้ด้วย นี่เป็น
-frontmatter ทั่วไป จึงใช้ได้กับบุคคล ทีม ระบบ โปรเจกต์ หรือเอนทิตีชนิดอื่นใด
+หน้าเอนทิตียังสามารถมีเมทาดาทาการกำหนดเส้นทางสำหรับการใช้งานของเอเจนต์ได้ สิ่งนี้เป็น
+frontmatter ทั่วไป จึงใช้ได้กับบุคคล ทีม ระบบ โครงการ หรือ
+เอนทิตีชนิดอื่นใด
ฟิลด์ทั่วไปได้แก่:
-- `entityType`: ตัวอย่างเช่น `person`, `team`, `system`, หรือ `project`
+- `entityType`: ตัวอย่างเช่น `person`, `team`, `system` หรือ `project`
- `canonicalId`: คีย์ตัวตนที่เสถียรซึ่งใช้ข้ามนามแฝงและการนำเข้า
-- `aliases`: ชื่อ แฮนเดิล หรือป้ายกำกับที่ควรชี้ไปยังหน้าเดียวกัน
-- `privacyTier`: `public`, `local-private`, `sensitive`, หรือ `confirm-before-use`
+- `aliases`: ชื่อ handle หรือป้ายกำกับที่ควร resolve ไปยังหน้าเดียวกัน
+- `privacyTier`: `public`, `local-private`, `sensitive` หรือ `confirm-before-use`
- `bestUsedFor` / `notEnoughFor`: คำใบ้การกำหนดเส้นทางแบบกะทัดรัด
-- `lastRefreshedAt`: เวลาประทับการรีเฟรชแหล่งข้อมูลที่แยกจากเวลาแก้ไขหน้า
-- `personCard`: การ์ดกำหนดเส้นทางเฉพาะบุคคลแบบเสริม พร้อมแฮนเดิล โซเชียล
- อีเมล เขตเวลา เลน สิ่งที่ควรถาม สิ่งที่ควรหลีกเลี่ยงการถาม ความมั่นใจ และความเป็นส่วนตัว
-- `relationships`: ขอบแบบมีชนิดไปยังหน้าที่เกี่ยวข้อง พร้อมเป้าหมาย ชนิด น้ำหนัก
+- `lastRefreshedAt`: timestamp การรีเฟรชแหล่งข้อมูลที่แยกจากเวลาแก้ไขหน้า
+- `personCard`: การ์ดกำหนดเส้นทางเฉพาะบุคคลแบบเลือกได้ พร้อม handle, socials,
+ อีเมล เขตเวลา lane, ask-for, avoid-asking-for, ความมั่นใจ และความเป็นส่วนตัว
+- `relationships`: edge แบบมีชนิดไปยังหน้าที่เกี่ยวข้อง พร้อมเป้าหมาย ชนิด น้ำหนัก
ความมั่นใจ ชนิดหลักฐาน ระดับความเป็นส่วนตัว และโน้ต
-สำหรับวิกิบุคคล โดยปกติเอเจนต์ควรเริ่มจาก
-`reports/person-agent-directory.md` แล้วเปิดหน้าบุคคลด้วย `wiki_get`
-ก่อนใช้รายละเอียดติดต่อหรือข้อเท็จจริงที่อนุมาน
+สำหรับวิกิบุคคล โดยปกติเอเจนต์ควรเริ่มที่
+`reports/person-agent-directory.md` จากนั้นเปิดหน้าบุคคลด้วย `wiki_get`
+ก่อนใช้รายละเอียดติดต่อหรือข้อเท็จจริงที่อนุมานมา
ตัวอย่าง:
@@ -241,24 +242,24 @@ claims:
## ไปป์ไลน์การคอมไพล์
-ขั้นตอนคอมไพล์จะอ่านหน้าวิกิ ทำให้สรุปอยู่ในรูปแบบปกติ และปล่อยอาร์ติแฟกต์
-สำหรับเครื่องที่เสถียรไว้ภายใต้:
+ขั้นตอนคอมไพล์จะอ่านหน้าวิกิ ปรับสรุปให้เป็นมาตรฐาน และปล่อย
+artifact ที่เสถียรสำหรับเครื่องภายใต้:
- `.openclaw-wiki/cache/agent-digest.json`
- `.openclaw-wiki/cache/claims.jsonl`
-ไดเจสต์เหล่านี้มีอยู่เพื่อให้เอเจนต์และโค้ดรันไทม์ไม่ต้องสแกนหน้า Markdown
+digest เหล่านี้มีอยู่เพื่อให้เอเจนต์และโค้ดรันไทม์ไม่ต้อง scrape หน้า Markdown
-เอาต์พุตที่คอมไพล์แล้วยังขับเคลื่อน:
+เอาต์พุตที่คอมไพล์แล้วยังใช้ขับเคลื่อน:
-- การทำดัชนีวิกิรอบแรกสำหรับโฟลว์ค้นหา/ดึงข้อมูล
-- การค้นหา claim-id ย้อนกลับไปยังหน้าที่เป็นเจ้าของ
-- ส่วนเสริมพรอมป์แบบกะทัดรัด
+- การจัดทำดัชนีวิกิรอบแรกสำหรับ flow การค้นหา/get
+- การค้นหา claim-id กลับไปยังหน้าที่เป็นเจ้าของ
+- ส่วนเสริม prompt แบบกะทัดรัด
- การสร้างรายงาน/แดชบอร์ด
## แดชบอร์ดและรายงานสุขภาพ
-เมื่อเปิดใช้งาน `render.createDashboards` การคอมไพล์จะดูแลแดชบอร์ดภายใต้
+เมื่อเปิดใช้ `render.createDashboards` การคอมไพล์จะดูแลแดชบอร์ดภายใต้
`reports/`
รายงานในตัวประกอบด้วย:
@@ -275,25 +276,25 @@ claims:
รายงานเหล่านี้ติดตามสิ่งต่าง ๆ เช่น:
-- กลุ่มโน้ตข้อขัดแย้ง
-- กลุ่มข้อกล่าวอ้างที่แข่งขันกัน
-- ข้อกล่าวอ้างที่ขาดหลักฐานแบบมีโครงสร้าง
-- หน้าและข้อกล่าวอ้างที่มีความมั่นใจต่ำ
-- ความสดใหม่ที่เก่าหรือไม่ทราบ
-- หน้าที่มีคำถามที่ยังไม่คลี่คลาย
+- กลุ่มโน้ตความขัดแย้ง
+- กลุ่ม claim ที่แข่งขันกัน
+- claim ที่ขาดหลักฐานแบบมีโครงสร้าง
+- หน้าและ claim ที่มีความมั่นใจต่ำ
+- ความสดใหม่ที่ล้าสมัยหรือไม่ทราบ
+- หน้าที่มีคำถามค้างอยู่
- การ์ดกำหนดเส้นทางบุคคล/เอนทิตี
-- ขอบความสัมพันธ์แบบมีโครงสร้าง
+- edge ความสัมพันธ์แบบมีโครงสร้าง
- ความครอบคลุมของคลาสหลักฐาน
- ระดับความเป็นส่วนตัวที่ไม่ใช่สาธารณะซึ่งต้องตรวจทานก่อนใช้
-## การค้นหาและการดึงข้อมูล
+## การค้นหาและการเรียกคืน
`memory-wiki` รองรับแบ็กเอนด์การค้นหาสองแบบ:
-- `shared`: ใช้โฟลว์ค้นหาหน่วยความจำที่ใช้ร่วมกันเมื่อพร้อมใช้งาน
-- `local`: ค้นหาวิกิแบบโลคัล
+- `shared`: ใช้ flow การค้นหาหน่วยความจำร่วมเมื่อพร้อมใช้งาน
+- `local`: ค้นหาวิกิในเครื่อง
-มันยังรองรับคลังข้อมูลสามแบบ:
+ยังรองรับ corpus สามแบบ:
- `wiki`
- `memory`
@@ -301,34 +302,34 @@ claims:
พฤติกรรมสำคัญ:
-- `wiki_search` และ `wiki_get` ใช้ไดเจสต์ที่คอมไพล์แล้วเป็นรอบแรกเมื่อเป็นไปได้
-- id ของข้อกล่าวอ้างสามารถชี้กลับไปยังหน้าที่เป็นเจ้าของได้
-- ข้อกล่าวอ้างที่ถูกโต้แย้ง/เก่า/สดใหม่มีผลต่อการจัดอันดับ
-- ป้ายแหล่งที่มาสามารถคงอยู่ในผลลัพธ์
-- โหมดค้นหาสามารถเอนการจัดอันดับไปทางการค้นหาบุคคล การกำหนดเส้นทางคำถาม
- หลักฐานจากแหล่งที่มา หรือข้อกล่าวอ้างดิบ
+- `wiki_search` และ `wiki_get` ใช้ digest ที่คอมไพล์แล้วเป็นรอบแรกเมื่อเป็นไปได้
+- claim id สามารถ resolve กลับไปยังหน้าที่เป็นเจ้าของได้
+- claim ที่ถูกโต้แย้ง/ล้าสมัย/สดใหม่มีผลต่อการจัดอันดับ
+- ป้ายกำกับแหล่งที่มาสามารถคงอยู่ไปถึงผลลัพธ์
+- โหมดค้นหาสามารถถ่วงน้ำหนักการจัดอันดับสำหรับการค้นหาบุคคล การกำหนดเส้นทางคำถาม หลักฐาน
+ แหล่งข้อมูล หรือ claim ดิบ
กฎใช้งานจริง:
-- ใช้ `memory_search corpus=all` สำหรับการเรียกคืนแบบกว้างครั้งเดียว
-- ใช้ `wiki_search` + `wiki_get` เมื่อคุณสนใจการจัดอันดับเฉพาะวิกิ
+- ใช้ `memory_search corpus=all` สำหรับการเรียกคืนแบบกว้างหนึ่งรอบ
+- ใช้ `wiki_search` + `wiki_get` เมื่อคุณให้ความสำคัญกับการจัดอันดับเฉพาะวิกิ
แหล่งที่มา หรือโครงสร้างความเชื่อระดับหน้า
โหมดค้นหา:
-- `auto`: ค่าเริ่มต้นที่สมดุล
-- `find-person`: เพิ่มน้ำหนักเอนทิตีที่คล้ายบุคคล นามแฝง แฮนเดิล โซเชียล และ
- ID แบบ canonical
-- `route-question`: เพิ่มน้ำหนักการ์ดเอเจนต์ คำใบ้สิ่งที่ควรถาม คำใบ้สิ่งที่เหมาะจะใช้ และ
+- `auto`: ค่าเริ่มต้นแบบสมดุล
+- `find-person`: เพิ่มน้ำหนักเอนทิตีที่เหมือนบุคคล นามแฝง handle, socials และ
+ canonical ID
+- `route-question`: เพิ่มน้ำหนักการ์ดเอเจนต์ คำใบ้ ask-for คำใบ้ best-used-for และ
บริบทความสัมพันธ์
- `source-evidence`: เพิ่มน้ำหนักหน้าต้นทางและเมทาดาทาหลักฐานแบบมีโครงสร้าง
-- `raw-claim`: เพิ่มน้ำหนักข้อกล่าวอ้างแบบมีโครงสร้างที่ตรงกัน และคืนเมทาดาทา
- ข้อกล่าวอ้าง/หลักฐานในผลลัพธ์
+- `raw-claim`: เพิ่มน้ำหนัก claim แบบมีโครงสร้างที่ตรงกัน และส่งคืนเมทาดาทา claim/หลักฐาน
+ ในผลลัพธ์
-เมื่อผลลัพธ์ตรงกับข้อกล่าวอ้างแบบมีโครงสร้าง `wiki_search` สามารถคืน
+เมื่อผลลัพธ์ตรงกับ claim แบบมีโครงสร้าง `wiki_search` สามารถส่งคืน
`matchedClaimId`, `matchedClaimStatus`, `matchedClaimConfidence`,
-`evidenceKinds`, และ `evidenceSourceIds` ในเพย์โหลดรายละเอียดได้ เอาต์พุตข้อความ
-ยังมีบรรทัด `Claim:` และ `Evidence:` แบบกะทัดรัดเมื่อพร้อมใช้งาน
+`evidenceKinds` และ `evidenceSourceIds` ใน payload รายละเอียด เอาต์พุตข้อความ
+ยังรวมบรรทัด `Claim:` และ `Evidence:` แบบกะทัดรัดเมื่อมี
## เครื่องมือเอเจนต์
@@ -342,37 +343,37 @@ Plugin ลงทะเบียนเครื่องมือเหล่า
สิ่งที่ทำ:
-- `wiki_status`: โหมดคลังปัจจุบัน สุขภาพ ความพร้อมใช้งานของ CLI Obsidian
-- `wiki_search`: ค้นหาหน้าวิกิ และเมื่อกำหนดค่าไว้ ค้นหาคลังหน่วยความจำที่ใช้ร่วมกัน;
- รับ `mode` สำหรับการค้นหาบุคคล การกำหนดเส้นทางคำถาม หลักฐานจากแหล่งที่มา หรือการเจาะลึก
- ข้อกล่าวอ้างดิบ
-- `wiki_get`: อ่านหน้าวิกิตาม id/path หรือถอยกลับไปใช้คลังหน่วยความจำที่ใช้ร่วมกัน
-- `wiki_apply`: การกลายพันธุ์ด้านการสังเคราะห์/เมทาดาทาแบบแคบ โดยไม่ผ่าตัดหน้าแบบรูปแบบอิสระ
-- `wiki_lint`: การตรวจโครงสร้าง ช่องว่างแหล่งที่มา ข้อขัดแย้ง คำถามเปิด
+- `wiki_status`: โหมดคลังปัจจุบัน สุขภาพ ความพร้อมใช้งานของ Obsidian CLI
+- `wiki_search`: ค้นหาหน้าวิกิ และเมื่อกำหนดค่าไว้ ค้นหา corpus หน่วยความจำร่วม;
+ รับ `mode` สำหรับการค้นหาบุคคล การกำหนดเส้นทางคำถาม หลักฐานแหล่งข้อมูล หรือการเจาะลึก
+ claim ดิบ
+- `wiki_get`: อ่านหน้าวิกิตาม id/path หรือ fallback ไปยัง corpus หน่วยความจำร่วม
+- `wiki_apply`: การกลายพันธุ์ synthesis/เมทาดาทาแบบแคบโดยไม่ผ่าตัดหน้าแบบอิสระ
+- `wiki_lint`: การตรวจโครงสร้าง ช่องว่างของแหล่งที่มา ความขัดแย้ง คำถามเปิด
-Plugin ยังลงทะเบียนส่วนเสริมคลังหน่วยความจำแบบไม่ผูกขาด ดังนั้น
-`memory_search` และ `memory_get` ที่ใช้ร่วมกันจึงเข้าถึงวิกิได้เมื่อ Plugin Active Memory
-รองรับการเลือกคลังข้อมูล
+Plugin ยังลงทะเบียนส่วนเสริม corpus หน่วยความจำแบบไม่ผูกขาด เพื่อให้
+`memory_search` และ `memory_get` แบบร่วมเข้าถึงวิกิได้เมื่อ Plugin หน่วยความจำที่ทำงานอยู่
+รองรับการเลือก corpus
-## พฤติกรรมพรอมป์และบริบท
+## พฤติกรรม prompt และบริบท
-เมื่อเปิดใช้งาน `context.includeCompiledDigestPrompt` ส่วนพรอมป์หน่วยความจำ
-จะต่อท้ายสแนปชอตที่คอมไพล์แบบกะทัดรัดจาก `agent-digest.json`
+เมื่อเปิดใช้ `context.includeCompiledDigestPrompt` ส่วน prompt หน่วยความจำจะ
+ต่อท้าย snapshot ที่คอมไพล์แล้วแบบกะทัดรัดจาก `agent-digest.json`
-สแนปชอตนั้นตั้งใจให้เล็กและมีสัญญาณสูง:
+snapshot นั้นตั้งใจให้เล็กและมีสัญญาณสูง:
-- เฉพาะหน้าสำคัญอันดับต้น ๆ
-- เฉพาะข้อกล่าวอ้างสำคัญอันดับต้น ๆ
-- จำนวนข้อขัดแย้ง
+- เฉพาะหน้ายอดนิยม
+- เฉพาะ claim ยอดนิยม
+- จำนวนความขัดแย้ง
- จำนวนคำถาม
-- ตัวกำหนดคุณสมบัติความมั่นใจ/ความสดใหม่
+- ตัวระบุความมั่นใจ/ความสดใหม่
-นี่เป็นแบบเลือกเปิด เพราะมันเปลี่ยนรูปทรงพรอมป์และมีประโยชน์หลักสำหรับเอนจินบริบท
-หรือการประกอบพรอมป์แบบเดิมที่บริโภคส่วนเสริมหน่วยความจำอย่างชัดเจน
+นี่เป็นแบบ opt-in เพราะเปลี่ยนรูปทรงของ prompt และมีประโยชน์หลักสำหรับเอนจินบริบท
+หรือการประกอบ prompt แบบเดิมที่บริโภคส่วนเสริมหน่วยความจำอย่างชัดเจน
## การกำหนดค่า
-ใส่การกำหนดค่าไว้ภายใต้ `plugins.entries.memory-wiki.config`:
+วาง config ใต้ `plugins.entries.memory-wiki.config`:
```json5
{
@@ -424,26 +425,29 @@ Plugin ยังลงทะเบียนส่วนเสริมคลั
}
```
-ตัวสลับสำคัญ:
+สวิตช์สำคัญ:
- `vaultMode`: `isolated`, `bridge`, `unsafe-local`
- `vault.renderMode`: `native` หรือ `obsidian`
-- `bridge.readMemoryArtifacts`: นำเข้าอาร์ติแฟกต์สาธารณะของ Plugin Active Memory
+- `bridge.readMemoryArtifacts`: นำเข้าอาร์ติแฟกต์สาธารณะของ Active Memory Plugin
- `bridge.followMemoryEvents`: รวมบันทึกเหตุการณ์ในโหมด bridge
- `search.backend`: `shared` หรือ `local`
-- `search.corpus`: `wiki`, `memory`, หรือ `all`
-- `context.includeCompiledDigestPrompt`: ผนวกสแนปช็อตไดเจสต์แบบย่อเข้ากับส่วนพรอมต์หน่วยความจำ
-- `render.createBacklinks`: สร้างบล็อกที่เกี่ยวข้องแบบกำหนดผลลัพธ์ซ้ำได้
+- `search.corpus`: `wiki`, `memory` หรือ `all`
+- `context.includeCompiledDigestPrompt`: ผนวกสแนปช็อตไดเจสต์แบบกะทัดรัดเข้ากับส่วนพรอมต์หน่วยความจำ
+- `render.createBacklinks`: สร้างบล็อกที่เกี่ยวข้องแบบกำหนดแน่นอน
- `render.createDashboards`: สร้างหน้าแดชบอร์ด
-### ตัวอย่าง: QMD + โหมด bridge
+### ตัวอย่าง: โหมด QMD + bridge
-ใช้ค่านี้เมื่อคุณต้องการ QMD สำหรับการเรียกคืน และ `memory-wiki` สำหรับเลเยอร์ความรู้ที่ดูแลรักษาไว้:
+ใช้สิ่งนี้เมื่อคุณต้องการ QMD สำหรับการเรียกคืน และ `memory-wiki` สำหรับชั้นความรู้ที่ได้รับการดูแลรักษา:
```json5
{
memory: {
backend: "qmd",
+ },
+ plugins: {
+ entries: {
"memory-wiki": {
enabled: true,
config: {
@@ -470,15 +474,15 @@ Plugin ยังลงทะเบียนส่วนเสริมคลั
}
```
-การตั้งค่านี้คงไว้ซึ่ง:
+สิ่งนี้จะคงไว้:
-- QMD รับผิดชอบการเรียกคืน Active Memory
-- `memory-wiki` มุ่งเน้นหน้าที่คอมไพล์แล้วและแดชบอร์ด
-- รูปแบบพรอมต์ไม่เปลี่ยนแปลงจนกว่าคุณจะเปิดใช้พรอมต์ไดเจสต์ที่คอมไพล์แล้วโดยตั้งใจ
+- ให้ QMD รับผิดชอบการเรียกคืน Active Memory
+- ให้ `memory-wiki` มุ่งเน้นไปที่หน้าที่คอมไพล์แล้วและแดชบอร์ด
+- รูปทรงของพรอมต์ไม่เปลี่ยนแปลงจนกว่าคุณจะตั้งใจเปิดใช้พรอมต์ไดเจสต์ที่คอมไพล์แล้ว
## CLI
-`memory-wiki` ยังเปิดเผยพื้นผิว CLI ระดับบนสุดด้วย:
+`memory-wiki` ยังเปิดเผยพื้นผิว CLI ระดับบนด้วย:
```bash
openclaw wiki status
@@ -494,13 +498,13 @@ openclaw wiki bridge import
openclaw wiki obsidian status
```
-ดู [CLI: wiki](/th/cli/wiki) สำหรับข้อมูลอ้างอิงคำสั่งฉบับเต็ม
+ดู [CLI: wiki](/th/cli/wiki) สำหรับเอกสารอ้างอิงคำสั่งทั้งหมด
## การรองรับ Obsidian
-เมื่อ `vault.renderMode` เป็น `obsidian` Plugin จะเขียน Markdown ที่เป็นมิตรกับ Obsidian และสามารถเลือกใช้ CLI ทางการของ `obsidian` ได้
+เมื่อ `vault.renderMode` เป็น `obsidian` Plugin จะเขียน Markdown ที่เป็นมิตรกับ Obsidian และสามารถเลือกใช้ CLI `obsidian` อย่างเป็นทางการได้
-เวิร์กโฟลว์ที่รองรับประกอบด้วย:
+เวิร์กโฟลว์ที่รองรับรวมถึง:
- การตรวจสอบสถานะ
- การค้นหา vault
@@ -508,17 +512,17 @@ openclaw wiki obsidian status
- การเรียกใช้คำสั่ง Obsidian
- การข้ามไปยังบันทึกประจำวัน
-ส่วนนี้เป็นตัวเลือก wiki ยังคงทำงานในโหมด native ได้โดยไม่ต้องใช้ Obsidian
+สิ่งนี้เป็นทางเลือก wiki ยังคงทำงานได้ในโหมด native โดยไม่มี Obsidian
## เวิร์กโฟลว์ที่แนะนำ
-1. คง Plugin Active Memory ของคุณไว้สำหรับการเรียกคืน/การโปรโมต/Dreaming
+1. เก็บ Active Memory Plugin ของคุณไว้สำหรับการเรียกคืน/การเลื่อนระดับ/Dreaming
2. เปิดใช้ `memory-wiki`
3. เริ่มด้วยโหมด `isolated` เว้นแต่คุณต้องการโหมด bridge อย่างชัดเจน
-4. ใช้ `wiki_search` / `wiki_get` เมื่อแหล่งที่มาสำคัญ
-5. ใช้ `wiki_apply` สำหรับการสังเคราะห์แบบจำกัดขอบเขตหรือการอัปเดตเมทาดาทา
-6. เรียกใช้ `wiki_lint` หลังจากมีการเปลี่ยนแปลงสำคัญ
-7. เปิดแดชบอร์ดหากคุณต้องการมองเห็นเนื้อหาที่ล้าสมัย/ขัดแย้งกัน
+4. ใช้ `wiki_search` / `wiki_get` เมื่อแหล่งที่มามีความสำคัญ
+5. ใช้ `wiki_apply` สำหรับการสังเคราะห์แบบแคบหรือการอัปเดตเมตาดาตา
+6. รัน `wiki_lint` หลังจากมีการเปลี่ยนแปลงที่มีนัยสำคัญ
+7. เปิดใช้แดชบอร์ดหากคุณต้องการมองเห็นรายการล้าสมัย/ข้อขัดแย้ง
## เอกสารที่เกี่ยวข้อง
diff --git a/docs/th/providers/openrouter.md b/docs/th/providers/openrouter.md
index 12347bab7..5ad33207c 100644
--- a/docs/th/providers/openrouter.md
+++ b/docs/th/providers/openrouter.md
@@ -1,36 +1,36 @@
---
read_when:
- - คุณต้องการคีย์ API เดียวสำหรับ LLM หลายตัว
+ - คุณต้องการคีย์ API เดียวสำหรับโมเดลภาษาขนาดใหญ่หลายตัว
- คุณต้องการเรียกใช้โมเดลผ่าน OpenRouter ใน OpenClaw
- คุณต้องการใช้ OpenRouter สำหรับการสร้างภาพ
- คุณต้องการใช้ OpenRouter สำหรับการสร้างวิดีโอ
-summary: ใช้ API แบบรวมศูนย์ของ OpenRouter เพื่อเข้าถึงโมเดลจำนวนมากใน OpenClaw
+summary: ใช้ API แบบรวมของ OpenRouter เพื่อเข้าถึงโมเดลจำนวนมากใน OpenClaw
title: OpenRouter
x-i18n:
- generated_at: "2026-05-02T10:27:41Z"
+ generated_at: "2026-05-04T02:26:16Z"
model: gpt-5.5
provider: openai
- source_hash: e98b8b540265b6d11681390c02cb68312f33625bf223823a2dbca17e877c0422
+ source_hash: f6b7299408aa0de7530e2248c7fa5dae8c09095e2d20a0e9d12a64cab83966fc
source_path: providers/openrouter.md
workflow: 16
---
-OpenRouter มอบ **API แบบรวมศูนย์** ที่กำหนดเส้นทางคำขอไปยังหลายโมเดลผ่าน
-endpoint และ API key เดียว โดยเข้ากันได้กับ OpenAI ดังนั้น OpenAI SDK ส่วนใหญ่จึงทำงานได้ด้วยการเปลี่ยน base URL
+OpenRouter มอบ **API แบบรวมศูนย์** ที่กำหนดเส้นทางคำขอไปยังหลายโมเดลภายใต้
+endpoint และคีย์ API เดียว รองรับการใช้งานร่วมกับ OpenAI ดังนั้น OpenAI SDK ส่วนใหญ่จึงทำงานได้ด้วยการเปลี่ยน base URL
## เริ่มต้นใช้งาน
-
- สร้าง API key ที่ [openrouter.ai/keys](https://openrouter.ai/keys)
+
+ สร้างคีย์ API ที่ [openrouter.ai/keys](https://openrouter.ai/keys)
-
+
```bash
openclaw onboard --auth-choice openrouter-api-key
```
-
- ออนบอร์ดิงตั้งค่าเริ่มต้นเป็น `openrouter/auto` เลือกโมเดลที่เจาะจงได้ภายหลัง:
+
+ การเริ่มต้นใช้งานตั้งค่าเริ่มต้นเป็น `openrouter/auto` เลือกโมเดลแบบเจาะจงภายหลังได้:
```bash
openclaw models set openrouter//
@@ -56,19 +56,19 @@ endpoint และ API key เดียว โดยเข้ากันได
การอ้างอิงโมเดลใช้รูปแบบ `openrouter//` สำหรับรายการทั้งหมดของ
-ผู้ให้บริการและโมเดลที่พร้อมใช้งาน โปรดดู [/concepts/model-providers](/th/concepts/model-providers)
+ผู้ให้บริการและโมเดลที่มีให้ใช้งาน โปรดดู [/concepts/model-providers](/th/concepts/model-providers)
ตัวอย่าง fallback ที่รวมมาให้:
-| การอ้างอิงโมเดล | หมายเหตุ |
+| การอ้างอิงโมเดล | หมายเหตุ |
| --------------------------------- | ---------------------------- |
| `openrouter/auto` | การกำหนดเส้นทางอัตโนมัติของ OpenRouter |
-| `openrouter/moonshotai/kimi-k2.6` | Kimi K2.6 ผ่าน MoonshotAI |
+| `openrouter/moonshotai/kimi-k2.6` | Kimi K2.6 ผ่าน MoonshotAI |
-## การสร้างภาพ
+## การสร้างรูปภาพ
-OpenRouter ยังสามารถรองรับเครื่องมือ `image_generate` ได้ ใช้โมเดลภาพของ OpenRouter ภายใต้ `agents.defaults.imageGenerationModel`:
+OpenRouter ยังสามารถรองรับเครื่องมือ `image_generate` ได้ด้วย ใช้โมเดลรูปภาพของ OpenRouter ภายใต้ `agents.defaults.imageGenerationModel`:
```json5
{
@@ -84,11 +84,11 @@ OpenRouter ยังสามารถรองรับเครื่องม
}
```
-OpenClaw ส่งคำขอภาพไปยัง chat completions image API ของ OpenRouter พร้อม `modalities: ["image", "text"]` โมเดลภาพ Gemini จะได้รับคำแนะนำ `aspectRatio` และ `resolution` ที่รองรับผ่าน `image_config` ของ OpenRouter ใช้ `agents.defaults.imageGenerationModel.timeoutMs` สำหรับโมเดลภาพของ OpenRouter ที่ทำงานช้ากว่า ส่วนพารามิเตอร์ `timeoutMs` รายการเรียกของเครื่องมือ `image_generate` ยังคงมีผลเหนือกว่า
+OpenClaw ส่งคำขอรูปภาพไปยัง API รูปภาพของ chat completions ของ OpenRouter ด้วย `modalities: ["image", "text"]` โมเดลรูปภาพ Gemini จะได้รับคำใบ้ `aspectRatio` และ `resolution` ที่รองรับผ่าน `image_config` ของ OpenRouter ใช้ `agents.defaults.imageGenerationModel.timeoutMs` สำหรับโมเดลรูปภาพ OpenRouter ที่ช้ากว่า; พารามิเตอร์ `timeoutMs` ต่อการเรียกของเครื่องมือ `image_generate` ยังมีลำดับความสำคัญสูงกว่า
## การสร้างวิดีโอ
-OpenRouter ยังสามารถรองรับเครื่องมือ `video_generate` ผ่าน API `/videos` แบบอะซิงโครนัสของตนได้ ใช้โมเดลวิดีโอของ OpenRouter ภายใต้ `agents.defaults.videoGenerationModel`:
+OpenRouter ยังสามารถรองรับเครื่องมือ `video_generate` ผ่าน API แบบอะซิงโครนัส `/videos` ได้ด้วย ใช้โมเดลวิดีโอของ OpenRouter ภายใต้ `agents.defaults.videoGenerationModel`:
```json5
{
@@ -103,20 +103,20 @@ OpenRouter ยังสามารถรองรับเครื่องม
}
```
-OpenClaw ส่งงาน text-to-video และ image-to-video ไปยัง OpenRouter, โพล
+OpenClaw ส่งงานแปลงข้อความเป็นวิดีโอและรูปภาพเป็นวิดีโอไปยัง OpenRouter, polling
`polling_url` ที่ส่งกลับมา และดาวน์โหลดวิดีโอที่เสร็จสมบูรณ์จาก
-`unsigned_urls` ของ OpenRouter หรือ endpoint เนื้อหางานตามเอกสาร
-รูปภาพอ้างอิงจะถูกส่งเป็นภาพเฟรมแรก/สุดท้ายโดยค่าเริ่มต้น รูปภาพ
-ที่ติดแท็กด้วย `reference_image` จะถูกส่งเป็นข้อมูลอ้างอิงอินพุตของ OpenRouter ค่าเริ่มต้น
+`unsigned_urls` ของ OpenRouter หรือ endpoint เนื้อหางานที่ระบุไว้ในเอกสาร
+รูปภาพอ้างอิงจะถูกส่งเป็นรูปภาพเฟรมแรก/สุดท้ายตามค่าเริ่มต้น; รูปภาพ
+ที่แท็กด้วย `reference_image` จะถูกส่งเป็นข้อมูลอ้างอิงอินพุตของ OpenRouter ค่าเริ่มต้น
`google/veo-3.1-fast` ที่รวมมาให้ประกาศระยะเวลา 4/6/8
-วินาทีที่รองรับอยู่ในปัจจุบัน ความละเอียด `720P`/`1080P` และอัตราส่วนภาพ
-`16:9`/`9:16` ไม่ได้ลงทะเบียน video-to-video สำหรับ OpenRouter เพราะ API
-การสร้างวิดีโอ upstream ปัจจุบันรับข้อความและรูปภาพอ้างอิง
+วินาทีที่รองรับในปัจจุบัน, ความละเอียด `720P`/`1080P` และอัตราส่วนภาพ
+`16:9`/`9:16` ระบบไม่ได้ลงทะเบียนวิดีโอเป็นวิดีโอสำหรับ OpenRouter เพราะ API
+การสร้างวิดีโอต้นทางในปัจจุบันรับข้อความและรูปภาพอ้างอิง
-## Text-to-speech
+## ข้อความเป็นเสียงพูด
OpenRouter ยังสามารถใช้เป็นผู้ให้บริการ TTS ผ่าน endpoint
-`/audio/speech` ที่เข้ากันได้กับ OpenAI
+`/audio/speech` ที่รองรับการใช้งานร่วมกับ OpenAI ได้ด้วย
```json5
{
@@ -136,83 +136,115 @@ OpenRouter ยังสามารถใช้เป็นผู้ให้บ
}
```
-หากละเว้น `messages.tts.providers.openrouter.apiKey` TTS จะใช้
-`models.providers.openrouter.apiKey` ซ้ำ จากนั้นจึงใช้ `OPENROUTER_API_KEY`
+หากละเว้น `messages.tts.providers.openrouter.apiKey` ไว้ TTS จะใช้
+`models.providers.openrouter.apiKey` ซ้ำก่อน จากนั้นจึงใช้ `OPENROUTER_API_KEY`
-## การตรวจสอบสิทธิ์และ headers
+## การยืนยันตัวตนและส่วนหัว
-OpenRouter ใช้ Bearer token พร้อม API key ของคุณภายใน
+OpenRouter ใช้โทเค็น Bearer กับคีย์ API ของคุณภายในระบบ
-สำหรับคำขอ OpenRouter จริง (`https://openrouter.ai/api/v1`) OpenClaw ยังเพิ่ม
-headers ระบุแหล่งที่มาของแอปตามเอกสารของ OpenRouter:
+บนคำขอ OpenRouter จริง (`https://openrouter.ai/api/v1`) OpenClaw ยังเพิ่ม
+ส่วนหัวการระบุแอปตามเอกสารของ OpenRouter:
-| Header | ค่า |
-| ------------------------- | --------------------- |
-| `HTTP-Referer` | `https://openclaw.ai` |
-| `X-OpenRouter-Title` | `OpenClaw` |
-| `X-OpenRouter-Categories` | `cli-agent` |
+| ส่วนหัว | ค่า |
+| ------------------------- | ------------------------------------------------------------------------------------------------------ |
+| `HTTP-Referer` | `https://openclaw.ai` |
+| `X-OpenRouter-Title` | `OpenClaw` |
+| `X-OpenRouter-Categories` | `cli-agent,cloud-agent,programming-app,creative-writing,writing-assistant,general-chat,personal-agent` |
หากคุณชี้ผู้ให้บริการ OpenRouter ไปยังพร็อกซีหรือ base URL อื่น OpenClaw
-จะ **ไม่** แทรก headers เฉพาะของ OpenRouter เหล่านั้นหรือมาร์กเกอร์แคชของ Anthropic
+จะ **ไม่** แทรกส่วนหัวเฉพาะของ OpenRouter เหล่านั้นหรือเครื่องหมายแคช Anthropic
## การกำหนดค่าขั้นสูง
-
+
+ การแคชการตอบกลับของ OpenRouter เป็นแบบเลือกใช้ เปิดใช้งานต่อโมเดล OpenRouter ด้วย
+ พารามิเตอร์โมเดล:
+
+ ```json5
+ {
+ agents: {
+ defaults: {
+ models: {
+ "openrouter/auto": {
+ params: {
+ responseCache: true,
+ responseCacheTtlSeconds: 300,
+ },
+ },
+ },
+ },
+ },
+ }
+ ```
+
+ OpenClaw ส่ง `X-OpenRouter-Cache: true` และเมื่อกำหนดค่าไว้
+ จะส่ง `X-OpenRouter-Cache-TTL` `responseCacheClear: true` บังคับให้รีเฟรชสำหรับ
+ คำขอปัจจุบันและจัดเก็บการตอบกลับทดแทน นอกจากนี้ยังยอมรับ alias แบบ snake_case
+ (`response_cache`, `response_cache_ttl_seconds` และ
+ `response_cache_clear`) ด้วย
+
+ สิ่งนี้แยกจากการแคชพรอมป์ของผู้ให้บริการและจากเครื่องหมาย
+ Anthropic `cache_control` ของ OpenRouter โดยจะถูกใช้เฉพาะบนเส้นทาง
+ `openrouter.ai` ที่ตรวจสอบแล้ว ไม่ใช่ base URL พร็อกซีแบบกำหนดเอง
+
+
+
+
บนเส้นทาง OpenRouter ที่ตรวจสอบแล้ว การอ้างอิงโมเดล Anthropic จะคง
- มาร์กเกอร์ `cache_control` ของ Anthropic เฉพาะ OpenRouter ที่ OpenClaw ใช้เพื่อ
- ให้ใช้ prompt-cache ซ้ำได้ดีขึ้นบนบล็อกพรอมป์ system/developer
+ เครื่องหมาย Anthropic `cache_control` เฉพาะของ OpenRouter ที่ OpenClaw ใช้เพื่อ
+ ให้ใช้แคชพรอมป์ซ้ำได้ดีขึ้นบนบล็อกพรอมป์ระบบ/นักพัฒนา
-
- บนเส้นทาง OpenRouter ที่ตรวจสอบแล้ว การอ้างอิงโมเดล Anthropic ที่เปิดใช้เหตุผล
- จะลบ assistant prefill turns ท้ายสุดก่อนที่คำขอจะไปถึง OpenRouter
- ให้ตรงกับข้อกำหนดของ Anthropic ที่การสนทนาแบบ reasoning ต้องจบด้วย user
- turn
+
+ บนเส้นทาง OpenRouter ที่ตรวจสอบแล้ว การอ้างอิงโมเดล Anthropic ที่เปิดใช้ reasoning
+ จะทิ้งเทิร์น prefill ของ assistant ที่ต่อท้ายก่อนที่คำขอจะถึง OpenRouter
+ เพื่อให้ตรงกับข้อกำหนดของ Anthropic ที่การสนทนา reasoning ต้องจบด้วยเทิร์นของผู้ใช้
-
- บนเส้นทาง non-`auto` ที่รองรับ OpenClaw จะแมประดับการคิดที่เลือกไปยัง
- reasoning payloads ของพร็อกซี OpenRouter คำแนะนำโมเดลที่ไม่รองรับและ
- `openrouter/auto` จะข้ามการแทรก reasoning นั้น Hunter Alpha ยังข้าม
+
+ บนเส้นทาง non-`auto` ที่รองรับ OpenClaw จะแมประดับ thinking ที่เลือกไปยัง
+ payload reasoning ของพร็อกซี OpenRouter คำใบ้โมเดลที่ไม่รองรับและ
+ `openrouter/auto` จะข้ามการฉีด reasoning นั้น Hunter Alpha ยังข้าม
proxy reasoning สำหรับการอ้างอิงโมเดลที่กำหนดค่าไว้แต่ล้าสมัย เพราะ OpenRouter อาจ
ส่งข้อความคำตอบสุดท้ายกลับมาในฟิลด์ reasoning สำหรับเส้นทางที่เลิกใช้แล้วนั้น
-
+
บนเส้นทาง OpenRouter ที่ตรวจสอบแล้ว `openrouter/deepseek/deepseek-v4-flash` และ
- `openrouter/deepseek/deepseek-v4-pro` เติม `reasoning_content` ที่ขาดหายใน
- assistant turns ที่เล่นซ้ำ เพื่อให้การสนทนาแบบคิด/เครื่องมือคงรูปแบบการติดตามผลที่
- DeepSeek V4 ต้องการ
+ `openrouter/deepseek/deepseek-v4-pro` จะเติม `reasoning_content` ที่ขาดหายไปบน
+ เทิร์น assistant ที่ replay เพื่อให้การสนทนา thinking/tool คงรูปแบบการติดตามผล
+ ที่ DeepSeek V4 ต้องการ
-
- OpenRouter ยังคงทำงานผ่านเส้นทางที่เข้ากันได้กับ OpenAI แบบพร็อกซี ดังนั้น
- การจัดรูปคำขอเฉพาะ OpenAI แบบ native เช่น `serviceTier`, Responses `store`,
- payloads ที่เข้ากันได้กับ OpenAI reasoning และคำแนะนำ prompt-cache จะไม่ถูกส่งต่อ
+
+ OpenRouter ยังคงทำงานผ่านเส้นทางที่รองรับ OpenAI แบบพร็อกซี ดังนั้น
+ การจัดรูปคำขอเฉพาะ native OpenAI เช่น `serviceTier`, Responses `store`,
+ payload ที่รองรับ reasoning ของ OpenAI และคำใบ้แคชพรอมป์จะไม่ถูกส่งต่อ
-
- การอ้างอิง OpenRouter ที่รองรับด้วย Gemini จะยังอยู่บนเส้นทาง proxy-Gemini: OpenClaw คง
- การทำความสะอาด thought-signature ของ Gemini ไว้ที่นั่น แต่ไม่เปิดใช้การตรวจสอบการเล่นซ้ำของ Gemini
- แบบ native หรือการเขียน bootstrap ใหม่
+
+ การอ้างอิง OpenRouter ที่รองรับโดย Gemini จะอยู่บนเส้นทาง proxy-Gemini: OpenClaw คง
+ การทำความสะอาด thought-signature ของ Gemini ไว้ที่นั่น แต่จะไม่เปิดใช้การตรวจสอบ replay
+ ของ native Gemini หรือการเขียน bootstrap ใหม่
-
+
หากคุณส่งการกำหนดเส้นทางผู้ให้บริการ OpenRouter ภายใต้พารามิเตอร์โมเดล OpenClaw จะส่งต่อ
- เป็นข้อมูลเมตาการกำหนดเส้นทางของ OpenRouter ก่อนที่ shared stream wrappers จะทำงาน
+ เป็นเมทาดาทาการกำหนดเส้นทาง OpenRouter ก่อนที่ wrapper สตรีมที่ใช้ร่วมกันจะทำงาน
## ที่เกี่ยวข้อง
-
+
การเลือกผู้ให้บริการ การอ้างอิงโมเดล และพฤติกรรม failover
-
- ข้อมูลอ้างอิงการกำหนดค่าฉบับเต็มสำหรับ agents, models และ providers
+
+ การอ้างอิงการกำหนดค่าฉบับเต็มสำหรับ agents, models และ providers
diff --git a/docs/th/security/network-proxy.md b/docs/th/security/network-proxy.md
index 712b9440e..9ed209a2b 100644
--- a/docs/th/security/network-proxy.md
+++ b/docs/th/security/network-proxy.md
@@ -1,40 +1,40 @@
---
read_when:
- - คุณต้องการการป้องกันเชิงลึกต่อการโจมตีแบบ SSRF และ DNS rebinding
- - การกำหนดค่าพร็อกซีส่งต่อภายนอกสำหรับทราฟฟิกขณะรันไทม์ของ OpenClaw
-summary: วิธีกำหนดเส้นทางทราฟฟิก HTTP และ WebSocket ของรันไทม์ OpenClaw ผ่านพร็อกซีกรองที่ผู้ปฏิบัติการจัดการ
+ - คุณต้องการการป้องกันเชิงลึกจากการโจมตีแบบ SSRF และการผูก DNS ใหม่
+ - การกำหนดค่าพร็อกซีส่งต่อภายนอกสำหรับทราฟฟิกระหว่างการทำงานของ OpenClaw
+summary: วิธีส่งต่อทราฟฟิก HTTP และ WebSocket ขณะรันไทม์ของ OpenClaw ผ่านพร็อกซีกรองที่ผู้ปฏิบัติงานจัดการ
title: พร็อกซีเครือข่าย
x-i18n:
- generated_at: "2026-05-01T10:21:40Z"
+ generated_at: "2026-05-04T02:26:06Z"
model: gpt-5.5
provider: openai
- source_hash: 9207d349e4410e38631ae7665be19b536e4a4128a4e80dd095e802804dfd66a3
+ source_hash: cd5594324e8c6b7da51d903e98fda0feacb8970e0b15d980f7a249d6641461c9
source_path: security/network-proxy.md
workflow: 16
---
# พร็อกซีเครือข่าย
-OpenClaw สามารถกำหนดเส้นทางทราฟฟิก HTTP และ WebSocket ขณะรันผ่านพร็อกซีส่งต่อที่ผู้ปฏิบัติการจัดการได้ นี่เป็นการป้องกันเชิงลึกแบบไม่บังคับสำหรับการปรับใช้ที่ต้องการควบคุมอีเกรสจากศูนย์กลาง การป้องกัน SSRF ที่แข็งแรงขึ้น และการตรวจสอบเครือข่ายที่ดีขึ้น
+OpenClaw สามารถกำหนดเส้นทางทราฟฟิก HTTP และ WebSocket ของรันไทม์ผ่านพร็อกซีแบบส่งต่อที่ผู้ปฏิบัติการจัดการได้ นี่เป็นการป้องกันเชิงลึกแบบไม่บังคับสำหรับการปรับใช้ที่ต้องการควบคุมทราฟฟิกขาออกจากศูนย์กลาง เพิ่มการป้องกัน SSRF ให้แข็งแรงขึ้น และตรวจสอบเครือข่ายได้ดียิ่งขึ้น
-OpenClaw ไม่ได้จัดส่ง ดาวน์โหลด เริ่มต้น กำหนดค่า หรือรับรองพร็อกซี คุณเป็นผู้รันเทคโนโลยีพร็อกซีที่เหมาะกับสภาพแวดล้อมของคุณ และ OpenClaw จะกำหนดเส้นทางไคลเอนต์ HTTP และ WebSocket ภายในโปรเซสตามปกติผ่านพร็อกซีนั้น
+OpenClaw ไม่ได้จัดส่ง ดาวน์โหลด เริ่มต้น กำหนดค่า หรือรับรองพร็อกซี คุณเป็นผู้รันเทคโนโลยีพร็อกซีที่เหมาะกับสภาพแวดล้อมของคุณ และ OpenClaw จะกำหนดเส้นทางไคลเอนต์ HTTP และ WebSocket แบบปกติภายในโปรเซสผ่านพร็อกซีนั้น
## ทำไมต้องใช้พร็อกซี?
-พร็อกซีช่วยให้ผู้ปฏิบัติการมีจุดควบคุมเครือข่ายเดียวสำหรับทราฟฟิก HTTP และ WebSocket ขาออก สิ่งนี้มีประโยชน์ได้แม้นอกเหนือจากการเสริมความแข็งแกร่งให้ SSRF:
+พร็อกซีให้จุดควบคุมเครือข่ายจุดเดียวแก่ผู้ปฏิบัติการสำหรับทราฟฟิก HTTP และ WebSocket ขาออก ซึ่งมีประโยชน์ได้แม้นอกเหนือจากการเสริมความแข็งแรงด้าน SSRF:
-- นโยบายส่วนกลาง: ดูแลนโยบายอีเกรสเพียงชุดเดียว แทนที่จะต้องพึ่งพาให้ทุกจุดเรียก HTTP ของแอปพลิเคชันตั้งกฎเครือข่ายได้ถูกต้อง
-- การตรวจสอบขณะเชื่อมต่อ: ประเมินปลายทางหลังการแก้ DNS และทันทีก่อนที่พร็อกซีจะเปิดการเชื่อมต่ออัปสตรีม
-- การป้องกัน DNS rebinding: ลดช่องว่างระหว่างการตรวจ DNS ระดับแอปพลิเคชันกับการเชื่อมต่อขาออกจริง
-- ความครอบคลุม JavaScript ที่กว้างขึ้น: กำหนดเส้นทาง `fetch`, `node:http`, `node:https`, WebSocket, axios, got, node-fetch และไคลเอนต์ที่คล้ายกันผ่านเส้นทางเดียวกัน
-- ความสามารถในการตรวจสอบ: บันทึกปลายทางที่อนุญาตและถูกปฏิเสธที่ขอบเขตอีเกรส
+- นโยบายจากศูนย์กลาง: ดูแลนโยบายขาออกเพียงชุดเดียว แทนการพึ่งพาให้ทุกจุดเรียก HTTP ของแอปพลิเคชันกำหนดกฎเครือข่ายให้ถูกต้อง
+- การตรวจสอบ ณ เวลาที่เชื่อมต่อ: ประเมินปลายทางหลังจากการแก้ชื่อ DNS และทันทีก่อนที่พร็อกซีจะเปิดการเชื่อมต่อต้นทาง
+- การป้องกัน DNS rebinding: ลดช่องว่างระหว่างการตรวจสอบ DNS ระดับแอปพลิเคชันกับการเชื่อมต่อขาออกจริง
+- ครอบคลุม JavaScript ได้กว้างขึ้น: กำหนดเส้นทาง `fetch`, `node:http`, `node:https`, WebSocket, axios, got, node-fetch และไคลเอนต์ที่คล้ายกันผ่านเส้นทางเดียวกัน
+- ตรวจสอบย้อนหลังได้: บันทึกปลายทางที่อนุญาตและถูกปฏิเสธที่ขอบเขตขาออก
- การควบคุมเชิงปฏิบัติการ: บังคับใช้กฎปลายทาง การแบ่งส่วนเครือข่าย ขีดจำกัดอัตรา หรือรายการอนุญาตขาออกโดยไม่ต้องสร้าง OpenClaw ใหม่
-การกำหนดเส้นทางพร็อกซีเป็นราวกั้นระดับโปรเซสสำหรับอีเกรส HTTP และ WebSocket ปกติ ช่วยให้ผู้ปฏิบัติการมีเส้นทางแบบปิดเมื่อเกิดข้อผิดพลาดสำหรับกำหนดเส้นทางไคลเอนต์ HTTP ของ JavaScript ที่รองรับผ่านพร็อกซีกรองของตนเอง แต่ไม่ใช่แซนด์บ็อกซ์เครือข่ายระดับ OS และไม่ได้ทำให้ OpenClaw รับรองนโยบายปลายทางของพร็อกซี
+การกำหนดเส้นทางผ่านพร็อกซีเป็นแนวป้องกันระดับโปรเซสสำหรับทราฟฟิก HTTP และ WebSocket ขาออกแบบปกติ ช่วยให้ผู้ปฏิบัติการมีเส้นทางแบบล้มเหลวแล้วปิดกั้นสำหรับการกำหนดเส้นทางไคลเอนต์ HTTP ของ JavaScript ที่รองรับผ่านพร็อกซีกรองของตนเอง แต่ไม่ใช่แซนด์บ็อกซ์เครือข่ายระดับ OS และไม่ได้ทำให้ OpenClaw รับรองนโยบายปลายทางของพร็อกซี
## OpenClaw กำหนดเส้นทางทราฟฟิกอย่างไร
-เมื่อ `proxy.enabled=true` และมีการกำหนดค่า URL พร็อกซี โปรเซสรันไทม์ที่ได้รับการป้องกัน เช่น `openclaw gateway run`, `openclaw node run` และ `openclaw agent --local` จะกำหนดเส้นทางอีเกรส HTTP และ WebSocket ปกติผ่านพร็อกซีที่กำหนดค่าไว้:
+เมื่อกำหนดค่า `proxy.enabled=true` และตั้งค่า URL ของพร็อกซีแล้ว โปรเซสรันไทม์ที่ได้รับการป้องกัน เช่น `openclaw gateway run`, `openclaw node run` และ `openclaw agent --local` จะกำหนดเส้นทางทราฟฟิก HTTP และ WebSocket ขาออกแบบปกติผ่านพร็อกซีที่กำหนดค่าไว้:
```text
OpenClaw process
@@ -43,27 +43,27 @@ OpenClaw process
WebSocket clients -> operator-managed filtering proxy -> public internet
```
-สัญญาสาธารณะคือพฤติกรรมการกำหนดเส้นทาง ไม่ใช่ hook ภายในของ Node ที่ใช้ติดตั้งใช้งาน OpenClaw Gateway ไคลเอนต์ WebSocket ระนาบควบคุมใช้เส้นทางตรงแบบแคบสำหรับทราฟฟิก RPC ของ Gateway แบบ local loopback เมื่อ URL ของ Gateway ใช้ `localhost` หรือ IP loopback แบบตัวอักษร เช่น `127.0.0.1` หรือ `[::1]` เส้นทางระนาบควบคุมนั้นต้องสามารถเข้าถึง Gateway แบบ loopback ได้ แม้เมื่อพร็อกซีของผู้ปฏิบัติการบล็อกปลายทาง loopback คำขอ HTTP และ WebSocket รันไทม์ปกติยังคงใช้พร็อกซีที่กำหนดค่าไว้
+สัญญาสาธารณะคือพฤติกรรมการกำหนดเส้นทาง ไม่ใช่ฮุกภายในของ Node ที่ใช้ติดตั้งใช้งาน OpenClaw Gateway control-plane WebSocket clients ใช้เส้นทางตรงแบบแคบสำหรับทราฟฟิก local loopback Gateway RPC เมื่อ URL ของ Gateway ใช้ `localhost` หรือ IP ลูปแบ็กแบบลิเทอรัล เช่น `127.0.0.1` หรือ `[::1]` เส้นทาง control-plane นั้นต้องสามารถเข้าถึง Gateway แบบลูปแบ็กได้ แม้พร็อกซีของผู้ปฏิบัติการจะบล็อกปลายทางลูปแบ็กก็ตาม คำขอ HTTP และ WebSocket ของรันไทม์แบบปกติยังคงใช้พร็อกซีที่กำหนดค่าไว้
-ภายใน OpenClaw ใช้ hook การกำหนดเส้นทางระดับโปรเซสสองแบบสำหรับฟีเจอร์นี้:
+ภายใน OpenClaw ใช้ฮุกกำหนดเส้นทางระดับโปรเซสสองรายการสำหรับฟีเจอร์นี้:
-- การกำหนดเส้นทาง dispatcher ของ Undici ครอบคลุม `fetch`, ไคลเอนต์ที่มี undici เป็นเบื้องหลัง และทรานสปอร์ตที่ให้ dispatcher ของ undici ของตนเอง
-- การกำหนดเส้นทาง `global-agent` ครอบคลุมผู้เรียก Node core `node:http` และ `node:https` รวมถึงไลบรารีจำนวนมากที่วางซ้อนบน `http.request`, `https.request`, `http.get` และ `https.get` โหมดพร็อกซีที่จัดการแล้วจะบังคับใช้ global agent นั้น เพื่อให้ agent ของ Node HTTP ที่ระบุชัดเจนไม่ข้ามพร็อกซีของผู้ปฏิบัติการโดยไม่ตั้งใจ
+- การกำหนดเส้นทางด้วย Undici dispatcher ครอบคลุม `fetch`, ไคลเอนต์ที่มี undici เป็นแบ็กเอนด์ และทรานสปอร์ตที่จัดเตรียม undici dispatcher ของตนเอง
+- การกำหนดเส้นทางด้วย `global-agent` ครอบคลุมผู้เรียก Node core `node:http` และ `node:https` รวมถึงไลบรารีจำนวนมากที่ต่อยอดบน `http.request`, `https.request`, `http.get` และ `https.get` โหมดพร็อกซีที่จัดการจะบังคับใช้ global agent นั้น เพื่อไม่ให้ Node HTTP agents ที่ระบุอย่างชัดเจนเลี่ยงพร็อกซีของผู้ปฏิบัติการโดยไม่ตั้งใจ
-Plugin บางตัวเป็นเจ้าของทรานสปอร์ตแบบกำหนดเองที่ต้องเดินสายพร็อกซีอย่างชัดเจน แม้จะมีการกำหนดเส้นทางระดับโปรเซสอยู่แล้ว ตัวอย่างเช่น ทรานสปอร์ต Bot API ของ Telegram ใช้ dispatcher ของ HTTP/1 undici ของตนเอง จึงเคารพ env พร็อกซีของโปรเซสพร้อม fallback `OPENCLAW_PROXY_URL` ที่จัดการแล้วในเส้นทางทรานสปอร์ตเฉพาะเจ้าของนั้น
+Plugin บางตัวเป็นเจ้าของทรานสปอร์ตแบบกำหนดเองที่ต้องต่อสายพร็อกซีอย่างชัดเจน แม้จะมีการกำหนดเส้นทางระดับโปรเซสอยู่แล้ว ตัวอย่างเช่น ทรานสปอร์ต Bot API ของ Telegram ใช้ HTTP/1 undici dispatcher ของตนเอง จึงเคารพ env พร็อกซีของโปรเซส รวมถึง fallback `OPENCLAW_PROXY_URL` ที่จัดการในเส้นทางทรานสปอร์ตเฉพาะเจ้าของนั้น
-URL พร็อกซีเองต้องใช้ `http://` ปลายทาง HTTPS ยังคงรองรับผ่านพร็อกซีด้วย HTTP `CONNECT`; สิ่งนี้หมายความเพียงว่า OpenClaw คาดหวัง listener ของพร็อกซีส่งต่อ HTTP ธรรมดา เช่น `http://127.0.0.1:3128`
+URL ของพร็อกซีเองต้องใช้ `http://` ปลายทาง HTTPS ยังคงรองรับผ่านพร็อกซีด้วย HTTP `CONNECT`; ความหมายมีเพียงว่า OpenClaw คาดหวัง listener ของพร็อกซีแบบส่งต่อ HTTP ธรรมดา เช่น `http://127.0.0.1:3128`
-ขณะที่พร็อกซีทำงานอยู่ OpenClaw จะล้าง `no_proxy`, `NO_PROXY` และ `GLOBAL_AGENT_NO_PROXY` รายการข้ามเหล่านั้นอิงตามปลายทาง ดังนั้นการปล่อย `localhost` หรือ `127.0.0.1` ไว้ในนั้นจะทำให้เป้าหมาย SSRF ที่มีความเสี่ยงสูงข้ามพร็อกซีกรองได้
+ขณะที่พร็อกซีทำงานอยู่ OpenClaw จะล้าง `no_proxy`, `NO_PROXY` และ `GLOBAL_AGENT_NO_PROXY` รายการ bypass เหล่านั้นอิงตามปลายทาง ดังนั้นหากปล่อย `localhost` หรือ `127.0.0.1` ไว้ในนั้น จะทำให้เป้าหมาย SSRF ที่มีความเสี่ยงสูงข้ามพร็อกซีกรองได้
-เมื่อปิดระบบ OpenClaw จะกู้คืนสภาพแวดล้อมพร็อกซีก่อนหน้าและรีเซ็ตสถานะการกำหนดเส้นทางโปรเซสที่แคชไว้
+เมื่อปิดการทำงาน OpenClaw จะกู้คืนสภาพแวดล้อมพร็อกซีก่อนหน้าและรีเซ็ตสถานะการกำหนดเส้นทางของโปรเซสที่แคชไว้
## คำศัพท์ที่เกี่ยวข้องกับพร็อกซี
-- `proxy.enabled` / `proxy.proxyUrl`: การกำหนดเส้นทางพร็อกซีส่งต่อขาออกสำหรับอีเกรสรันไทม์ของ OpenClaw หน้านี้อธิบายฟีเจอร์นั้น
-- `gateway.auth.mode: "trusted-proxy"`: การยืนยันตัวตนผ่านพร็อกซีย้อนกลับที่รับรู้ตัวตนขาเข้าสำหรับการเข้าถึง Gateway ดู [การยืนยันตัวตนพร็อกซีที่เชื่อถือได้](/th/gateway/trusted-proxy-auth)
-- `openclaw proxy`: พร็อกซีดีบักในเครื่องและตัวตรวจสอบการจับข้อมูลสำหรับการพัฒนาและการสนับสนุน ดู [openclaw proxy](/th/cli/proxy)
-- การตั้งค่าพร็อกซีเฉพาะช่องทางหรือผู้ให้บริการ: การแทนที่เฉพาะเจ้าของสำหรับทรานสปอร์ตใดทรานสปอร์ตหนึ่ง ควรใช้พร็อกซีเครือข่ายที่จัดการแล้วเมื่อเป้าหมายคือการควบคุมอีเกรสจากศูนย์กลางทั่วทั้งรันไทม์
+- `proxy.enabled` / `proxy.proxyUrl`: การกำหนดเส้นทางขาออกผ่านพร็อกซีแบบส่งต่อสำหรับทราฟฟิกขาออกของรันไทม์ OpenClaw หน้านี้จัดทำเอกสารฟีเจอร์ดังกล่าว
+- `gateway.auth.mode: "trusted-proxy"`: การยืนยันตัวตนขาเข้าแบบ reverse-proxy ที่รับรู้ตัวตนสำหรับการเข้าถึง Gateway ดู [การยืนยันตัวตนพร็อกซีที่เชื่อถือได้](/th/gateway/trusted-proxy-auth)
+- `openclaw proxy`: พร็อกซีดีบักภายในเครื่องและตัวตรวจสอบการจับข้อมูลสำหรับการพัฒนาและการสนับสนุน ดู [openclaw proxy](/th/cli/proxy)
+- การตั้งค่าพร็อกซีเฉพาะ channel หรือ provider: การแทนที่เฉพาะเจ้าของสำหรับทรานสปอร์ตหนึ่งรายการ ควรใช้พร็อกซีเครือข่ายที่จัดการเมื่อเป้าหมายคือการควบคุมทราฟฟิกขาออกจากศูนย์กลางทั่วทั้งรันไทม์
## การกำหนดค่า
@@ -73,7 +73,7 @@ proxy:
proxyUrl: http://127.0.0.1:3128
```
-คุณยังสามารถระบุ URL ผ่านสภาพแวดล้อมได้ โดยยังคงตั้ง `proxy.enabled=true` ใน config:
+คุณยังสามารถระบุ URL ผ่านสภาพแวดล้อมได้ โดยคง `proxy.enabled=true` ไว้ในการกำหนดค่า:
```bash
OPENCLAW_PROXY_URL=http://127.0.0.1:3128 openclaw gateway run
@@ -81,9 +81,9 @@ OPENCLAW_PROXY_URL=http://127.0.0.1:3128 openclaw gateway run
`proxy.proxyUrl` มีลำดับความสำคัญเหนือ `OPENCLAW_PROXY_URL`
-หาก `enabled=true` แต่ไม่ได้กำหนดค่า URL พร็อกซีที่ถูกต้อง คำสั่งที่ได้รับการป้องกันจะล้มเหลวตอนเริ่มต้นแทนที่จะ fallback ไปยังการเข้าถึงเครือข่ายโดยตรง
+หาก `enabled=true` แต่ไม่มี URL พร็อกซีที่ถูกต้องได้รับการกำหนดค่า คำสั่งที่ได้รับการป้องกันจะเริ่มต้นไม่สำเร็จ แทนที่จะ fallback ไปใช้การเข้าถึงเครือข่ายโดยตรง
-สำหรับบริการ Gateway ที่จัดการแล้วซึ่งเริ่มด้วย `openclaw gateway start` ควรเก็บ URL ไว้ใน config:
+สำหรับบริการ Gateway ที่จัดการซึ่งเริ่มด้วย `openclaw gateway start` ควรจัดเก็บ URL ไว้ในการกำหนดค่า:
```bash
openclaw config set proxy.enabled true
@@ -92,9 +92,9 @@ openclaw gateway install --force
openclaw gateway start
```
-fallback ผ่านสภาพแวดล้อมเหมาะที่สุดสำหรับการรันแบบ foreground หากคุณใช้กับบริการที่ติดตั้งแล้ว ให้ใส่ `OPENCLAW_PROXY_URL` ในสภาพแวดล้อมถาวรของบริการ เช่น `$OPENCLAW_STATE_DIR/.env` หรือ `~/.openclaw/.env` แล้วติดตั้งบริการใหม่เพื่อให้ launchd, systemd หรือ Scheduled Tasks เริ่ม gateway ด้วยค่านั้น
+fallback ผ่านสภาพแวดล้อมเหมาะที่สุดสำหรับการรันแบบ foreground หากคุณใช้กับบริการที่ติดตั้งแล้ว ให้ใส่ `OPENCLAW_PROXY_URL` ในสภาพแวดล้อมถาวรของบริการ เช่น `$OPENCLAW_STATE_DIR/.env` หรือ `~/.openclaw/.env` จากนั้นติดตั้งบริการใหม่เพื่อให้ launchd, systemd หรือ Scheduled Tasks เริ่ม Gateway พร้อมค่านั้น
-สำหรับคำสั่ง `openclaw --container ...` OpenClaw จะส่งต่อ `OPENCLAW_PROXY_URL` เข้าไปยัง CLI ลูกที่กำหนดเป้าหมายคอนเทนเนอร์เมื่อมีการตั้งค่าไว้ URL ต้องเข้าถึงได้จากภายในคอนเทนเนอร์; `127.0.0.1` หมายถึงตัวคอนเทนเนอร์เอง ไม่ใช่โฮสต์ OpenClaw จะปฏิเสธ URL พร็อกซีแบบ loopback สำหรับคำสั่งที่กำหนดเป้าหมายคอนเทนเนอร์ เว้นแต่คุณจะแทนที่การตรวจสอบความปลอดภัยนั้นอย่างชัดเจน
+สำหรับคำสั่ง `openclaw --container ...` OpenClaw จะส่งต่อ `OPENCLAW_PROXY_URL` ไปยัง CLI ลูกที่มุ่งเป้าไปยังคอนเทนเนอร์เมื่อมีการตั้งค่า URL ต้องเข้าถึงได้จากภายในคอนเทนเนอร์; `127.0.0.1` หมายถึงตัวคอนเทนเนอร์เอง ไม่ใช่โฮสต์ OpenClaw จะปฏิเสธ URL พร็อกซีลูปแบ็กสำหรับคำสั่งที่มุ่งเป้าไปยังคอนเทนเนอร์ เว้นแต่คุณจะแทนที่การตรวจสอบความปลอดภัยนั้นอย่างชัดเจน
## ข้อกำหนดของพร็อกซี
@@ -102,53 +102,53 @@ fallback ผ่านสภาพแวดล้อมเหมาะที่
กำหนดค่าพร็อกซีให้:
-- ผูกกับ loopback หรืออินเทอร์เฟซส่วนตัวที่เชื่อถือได้เท่านั้น
-- จำกัดการเข้าถึงเพื่อให้เฉพาะโปรเซส โฮสต์ คอนเทนเนอร์ หรือบัญชีบริการของ OpenClaw ใช้งานได้
-- แก้ปลายทางด้วยตัวเองและบล็อก IP ปลายทางหลังการแก้ DNS
-- ใช้นโยบายขณะเชื่อมต่อสำหรับทั้งคำขอ HTTP ธรรมดาและ tunnel HTTPS `CONNECT`
-- ปฏิเสธการข้ามที่อิงตามปลายทางสำหรับช่วง loopback, private, link-local, metadata, multicast, reserved หรือ documentation
-- หลีกเลี่ยงรายการอนุญาตชื่อโฮสต์ เว้นแต่คุณจะเชื่อถือเส้นทางการแก้ DNS อย่างสมบูรณ์
-- บันทึกปลายทาง การตัดสินใจ สถานะ และเหตุผล โดยไม่บันทึกเนื้อหาคำขอ authorization headers, cookies หรือความลับอื่นๆ
-- เก็บนโยบายพร็อกซีไว้ภายใต้ version control และทบทวนการเปลี่ยนแปลงเหมือนการกำหนดค่าที่ไวต่อความปลอดภัย
+- ผูกกับลูปแบ็กหรืออินเทอร์เฟซส่วนตัวที่เชื่อถือได้เท่านั้น
+- จำกัดการเข้าถึงเพื่อให้เฉพาะโปรเซส OpenClaw, โฮสต์, คอนเทนเนอร์ หรือบัญชีบริการเท่านั้นที่ใช้งานได้
+- แก้ชื่อปลายทางเองและบล็อก IP ปลายทางหลังจากการแก้ชื่อ DNS
+- ใช้นโยบาย ณ เวลาที่เชื่อมต่อสำหรับทั้งคำขอ HTTP ธรรมดาและทันเนล HTTPS `CONNECT`
+- ปฏิเสธ bypass ที่อิงตามปลายทางสำหรับช่วงลูปแบ็ก ส่วนตัว link-local เมทาดาทา multicast สงวนไว้ หรือเอกสารประกอบ
+- หลีกเลี่ยงรายการอนุญาตตามชื่อโฮสต์ เว้นแต่คุณจะเชื่อถือเส้นทางการแก้ชื่อ DNS อย่างเต็มที่
+- บันทึกปลายทาง การตัดสินใจ สถานะ และเหตุผล โดยไม่บันทึกเนื้อหาคำขอ เฮดเดอร์ authorization คุกกี้ หรือความลับอื่น
+- เก็บนโยบายพร็อกซีไว้ภายใต้การควบคุมเวอร์ชัน และตรวจสอบการเปลี่ยนแปลงเหมือนการกำหนดค่าที่อ่อนไหวด้านความปลอดภัย
## ปลายทางที่แนะนำให้บล็อก
-ใช้ denylist นี้เป็นจุดเริ่มต้นสำหรับพร็อกซีส่งต่อ ไฟร์วอลล์ หรือนโยบายอีเกรสใดๆ
+ใช้รายการ denylist นี้เป็นจุดเริ่มต้นสำหรับพร็อกซีแบบส่งต่อ ไฟร์วอลล์ หรือนโยบายขาออกใดๆ
-ตรรกะ classifier ระดับแอปพลิเคชันของ OpenClaw อยู่ใน `src/infra/net/ssrf.ts` และ `src/shared/net/ip.ts` hook ความสอดคล้องที่เกี่ยวข้องคือ `BLOCKED_HOSTNAMES`, `BLOCKED_IPV4_SPECIAL_USE_RANGES`, `BLOCKED_IPV6_SPECIAL_USE_RANGES`, `RFC2544_BENCHMARK_PREFIX` และการจัดการ sentinel ของ IPv4 ที่ฝังไว้สำหรับ NAT64, 6to4, Teredo, ISATAP และรูปแบบ IPv4-mapped ไฟล์เหล่านั้นเป็นข้อมูลอ้างอิงที่มีประโยชน์เมื่อดูแลนโยบายพร็อกซีภายนอก แต่ OpenClaw ไม่ได้ส่งออกหรือบังคับใช้กฎเหล่านั้นในพร็อกซีของคุณโดยอัตโนมัติ
+ตรรกะ classifier ระดับแอปพลิเคชันของ OpenClaw อยู่ใน `src/infra/net/ssrf.ts` และ `src/shared/net/ip.ts` parity hooks ที่เกี่ยวข้องคือ `BLOCKED_HOSTNAMES`, `BLOCKED_IPV4_SPECIAL_USE_RANGES`, `BLOCKED_IPV6_SPECIAL_USE_RANGES`, `RFC2544_BENCHMARK_PREFIX` และการจัดการ sentinel ของ IPv4 แบบฝังสำหรับ NAT64, 6to4, Teredo, ISATAP และรูปแบบ IPv4-mapped ไฟล์เหล่านี้เป็นข้อมูลอ้างอิงที่มีประโยชน์เมื่อดูแลนโยบายพร็อกซีภายนอก แต่ OpenClaw ไม่ได้ส่งออกหรือบังคับใช้กฎเหล่านั้นในพร็อกซีของคุณโดยอัตโนมัติ
-| ช่วงหรือโฮสต์ | เหตุผลที่ควรบล็อก |
+| ช่วงหรือโฮสต์ | เหตุผลที่ต้องบล็อก |
| ------------------------------------------------------------------------------------ | ---------------------------------------------------- |
-| `127.0.0.0/8`, `localhost`, `localhost.localdomain` | IPv4 loopback |
-| `::1/128` | IPv6 loopback |
-| `0.0.0.0/8`, `::/128` | ที่อยู่ unspecified และ this-network |
+| `127.0.0.0/8`, `localhost`, `localhost.localdomain` | ลูปแบ็ก IPv4 |
+| `::1/128` | ลูปแบ็ก IPv6 |
+| `0.0.0.0/8`, `::/128` | ที่อยู่แบบไม่ระบุและที่อยู่ this-network |
| `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16` | เครือข่ายส่วนตัว RFC1918 |
-| `169.254.0.0/16`, `fe80::/10` | ที่อยู่ link-local และเส้นทาง metadata คลาวด์ทั่วไป |
-| `169.254.169.254`, `metadata.google.internal` | บริการ metadata คลาวด์ |
-| `100.64.0.0/10` | พื้นที่ที่อยู่ร่วมกันของ carrier-grade NAT |
-| `198.18.0.0/15`, `2001:2::/48` | ช่วง benchmarking |
-| `192.0.0.0/24`, `192.0.2.0/24`, `198.51.100.0/24`, `203.0.113.0/24`, `2001:db8::/32` | ช่วง special-use และ documentation |
+| `169.254.0.0/16`, `fe80::/10` | ที่อยู่ link-local และเส้นทางเมทาดาทาคลาวด์ทั่วไป |
+| `169.254.169.254`, `metadata.google.internal` | บริการเมทาดาทาคลาวด์ |
+| `100.64.0.0/10` | พื้นที่ที่อยู่ร่วมของ NAT ระดับผู้ให้บริการ |
+| `198.18.0.0/15`, `2001:2::/48` | ช่วงสำหรับ benchmarking |
+| `192.0.0.0/24`, `192.0.2.0/24`, `198.51.100.0/24`, `203.0.113.0/24`, `2001:db8::/32` | ช่วง special-use และเอกสารประกอบ |
| `224.0.0.0/4`, `ff00::/8` | Multicast |
| `240.0.0.0/4` | IPv4 ที่สงวนไว้ |
-| `fc00::/7`, `fec0::/10` | ช่วง local/private ของ IPv6 |
-| `100::/64`, `2001:20::/28` | ช่วง discard และ ORCHIDv2 ของ IPv6 |
+| `fc00::/7`, `fec0::/10` | ช่วง IPv6 ภายใน/ส่วนตัว |
+| `100::/64`, `2001:20::/28` | ช่วง IPv6 discard และ ORCHIDv2 |
| `64:ff9b::/96`, `64:ff9b:1::/48` | คำนำหน้า NAT64 ที่มี IPv4 ฝังอยู่ |
| `2002::/16`, `2001::/32` | 6to4 และ Teredo ที่มี IPv4 ฝังอยู่ |
-| `::/96`, `::ffff:0:0/96` | IPv6 แบบ IPv4-compatible และ IPv4-mapped |
+| `::/96`, `::ffff:0:0/96` | IPv6 แบบเข้ากันได้กับ IPv4 และ IPv6 แบบ IPv4-mapped |
-หากผู้ให้บริการคลาวด์หรือแพลตฟอร์มเครือข่ายของคุณมีเอกสารโฮสต์ metadata หรือช่วงที่สงวนไว้เพิ่มเติม ให้เพิ่มรายการเหล่านั้นด้วย
+หากผู้ให้บริการคลาวด์หรือแพลตฟอร์มเครือข่ายของคุณจัดทำเอกสารโฮสต์เมทาดาทาหรือช่วงที่สงวนไว้เพิ่มเติม ให้เพิ่มรายการเหล่านั้นด้วย
-## การตรวจสอบ
+## การตรวจสอบความถูกต้อง
-ตรวจสอบพร็อกซีจากโฮสต์ คอนเทนเนอร์ หรือบัญชีบริการเดียวกันที่รัน OpenClaw:
+ตรวจสอบพร็อกซีจากโฮสต์ คอนเทนเนอร์ หรือบัญชีบริการเดียวกับที่รัน OpenClaw:
```bash
openclaw proxy validate --proxy-url http://127.0.0.1:3128
```
-โดยค่าเริ่มต้น เมื่อไม่ได้ระบุปลายทางแบบกำหนดเอง คำสั่งจะตรวจว่า `https://example.com/` สำเร็จ และเริ่ม canary แบบ loopback ชั่วคราวที่พร็อกซีต้องไม่เข้าถึง การตรวจปฏิเสธเริ่มต้นจะผ่านเมื่อพร็อกซีส่งคืนการตอบกลับปฏิเสธที่ไม่ใช่ 2xx หรือบล็อก canary ด้วยความล้มเหลวของทรานสปอร์ต; จะล้มเหลวหากการตอบกลับที่สำเร็จเข้าถึง canary หากไม่มีการเปิดใช้และกำหนดค่าพร็อกซี การตรวจสอบจะรายงานปัญหา config; ใช้ `--proxy-url` สำหรับ preflight แบบครั้งเดียวก่อนเปลี่ยน config ใช้ `--allowed-url` และ `--denied-url` เพื่อทดสอบความคาดหวังเฉพาะการปรับใช้ ปลายทางที่ถูกปฏิเสธแบบกำหนดเองเป็นแบบปิดเมื่อเกิดข้อผิดพลาด: การตอบกลับ HTTP ใดๆ หมายความว่าปลายทางนั้นเข้าถึงได้ผ่านพร็อกซี และข้อผิดพลาดของทรานสปอร์ตใดๆ จะถูกรายงานว่าไม่สามารถสรุปได้ เพราะ OpenClaw ไม่สามารถพิสูจน์ได้ว่าพร็อกซีบล็อก origin ที่เข้าถึงได้ เมื่อการตรวจสอบล้มเหลว คำสั่งจะออกด้วยรหัส 1
+โดยค่าเริ่มต้น เมื่อไม่ได้ระบุปลายทางแบบกำหนดเอง คำสั่งจะตรวจสอบว่า `https://example.com/` สำเร็จ และเริ่ม canary ลูปแบ็กชั่วคราวที่พร็อกซีต้องเข้าถึงไม่ได้ การตรวจสอบการปฏิเสธเริ่มต้นจะผ่านเมื่อพร็อกซีส่งคืนการตอบกลับปฏิเสธที่ไม่ใช่ 2xx หรือบล็อก canary ด้วยความล้มเหลวของทรานสปอร์ต; จะล้มเหลวหากการตอบกลับที่สำเร็จเข้าถึง canary หากไม่มีพร็อกซีที่เปิดใช้และกำหนดค่าไว้ การตรวจสอบความถูกต้องจะรายงานปัญหาการกำหนดค่า; ใช้ `--proxy-url` สำหรับ preflight แบบครั้งเดียวก่อนเปลี่ยนการกำหนดค่า ใช้ `--allowed-url` และ `--denied-url` เพื่อทดสอบความคาดหวังเฉพาะการปรับใช้ ปลายทางที่ถูกปฏิเสธแบบกำหนดเองจะล้มเหลวแบบปิดกั้น: การตอบกลับ HTTP ใดๆ หมายถึงปลายทางเข้าถึงได้ผ่านพร็อกซี และข้อผิดพลาดของทรานสปอร์ตใดๆ จะถูกรายงานว่าไม่สามารถสรุปได้ เพราะ OpenClaw ไม่สามารถพิสูจน์ได้ว่าพร็อกซีบล็อก origin ที่เข้าถึงได้ เมื่อการตรวจสอบความถูกต้องล้มเหลว คำสั่งจะออกด้วยรหัส 1
-ใช้ `--json` สำหรับ automation เอาต์พุต JSON มีผลลัพธ์รวม แหล่ง config พร็อกซีที่มีผล ข้อผิดพลาด config ใดๆ และการตรวจปลายทางแต่ละรายการ ข้อมูล credentials ของ URL พร็อกซีจะถูกปกปิดในเอาต์พุตข้อความและ JSON:
+ใช้ `--json` สำหรับระบบอัตโนมัติ เอาต์พุต JSON ประกอบด้วยผลลัพธ์โดยรวม แหล่งที่มาของการกำหนดค่าพร็อกซีที่มีผล ข้อผิดพลาดการกำหนดค่าใดๆ และการตรวจสอบปลายทางแต่ละรายการ ข้อมูลประจำตัวของ URL พร็อกซีจะถูกปกปิดในเอาต์พุตแบบข้อความและ JSON:
```json
{
@@ -178,7 +178,7 @@ curl -x http://127.0.0.1:3128 http://127.0.0.1/
curl -x http://127.0.0.1:3128 http://169.254.169.254/
```
-คำขอไปยังปลายทางสาธารณะควรสำเร็จ คำขอลูปแบ็กและคำขอเมทาดาทาควรถูกบล็อกโดยพร็อกซี สำหรับ `openclaw proxy validate` คานารีลูปแบ็กในตัวสามารถแยกการปฏิเสธจากพร็อกซีออกจากต้นทางที่เข้าถึงได้ การตรวจสอบ `--denied-url` แบบกำหนดเองไม่มีคานารีดังกล่าว ดังนั้นให้ถือว่าทั้งการตอบกลับ HTTP และความล้มเหลวด้านการขนส่งที่กำกวมเป็นความล้มเหลวในการตรวจสอบ เว้นแต่พร็อกซีของคุณจะเปิดเผยสัญญาณการปฏิเสธเฉพาะการปรับใช้ที่คุณสามารถตรวจสอบแยกต่างหากได้
+คำขอสาธารณะควรสำเร็จ คำขอ loopback และ metadata ควรถูกบล็อกโดยพร็อกซี สำหรับ `openclaw proxy validate` ตัวตรวจสอบ loopback canary ในตัวสามารถแยกการปฏิเสธจากพร็อกซีกับ origin ที่เข้าถึงได้ การตรวจสอบ `--denied-url` แบบกำหนดเองไม่มี canary ดังกล่าว ดังนั้นให้ถือว่าทั้งการตอบกลับ HTTP และความล้มเหลวด้านการขนส่งที่กำกวมเป็นความล้มเหลวในการตรวจสอบ เว้นแต่พร็อกซีของคุณจะเปิดเผยสัญญาณการปฏิเสธเฉพาะการปรับใช้ที่คุณสามารถตรวจสอบแยกต่างหากได้
จากนั้นเปิดใช้การกำหนดเส้นทางพร็อกซีของ OpenClaw:
@@ -188,7 +188,7 @@ openclaw config set proxy.proxyUrl http://127.0.0.1:3128
openclaw gateway run
```
-หรือตั้งค่า:
+หรือกำหนด:
```yaml
proxy:
@@ -196,11 +196,12 @@ proxy:
proxyUrl: http://127.0.0.1:3128
```
-## ข้อจำกัด
+## ขีดจำกัด
-- พร็อกซีช่วยเพิ่มความครอบคลุมสำหรับไคลเอนต์ JavaScript HTTP และ WebSocket ภายในกระบวนการ แต่ไม่ใช่แซนด์บ็อกซ์เครือข่ายระดับ OS
-- ซ็อกเก็ต `net`, `tls` และ `http2` แบบดิบ, native addons และกระบวนการลูกอาจข้ามการกำหนดเส้นทางพร็อกซีระดับ Node ได้ เว้นแต่จะสืบทอดและปฏิบัติตามตัวแปรสภาพแวดล้อมของพร็อกซี
-- ควรเพิ่ม WebUI ภายในของผู้ใช้และเซิร์ฟเวอร์โมเดลภายในเข้า allowlist ในนโยบายพร็อกซีของผู้ปฏิบัติงานเมื่อจำเป็น OpenClaw ไม่ได้เปิดช่องทางข้ามเครือข่ายภายในแบบทั่วไปสำหรับสิ่งเหล่านี้
-- การข้ามพร็อกซีของ control plane ของ Gateway ถูกจำกัดไว้ที่ `localhost` และ URL IP ลูปแบ็กแบบตรงตัวโดยตั้งใจ ใช้ `ws://127.0.0.1:18789`, `ws://[::1]:18789` หรือ `ws://localhost:18789` สำหรับการเชื่อมต่อ control plane ของ Gateway โดยตรงภายในเครื่อง ชื่อโฮสต์อื่นจะถูกกำหนดเส้นทางเหมือนทราฟฟิกตามชื่อโฮสต์ทั่วไป
+- พร็อกซีช่วยเพิ่มการครอบคลุมสำหรับไคลเอนต์ HTTP และ WebSocket ของ JavaScript ที่อยู่ภายในโปรเซส แต่ไม่ใช่ sandbox เครือข่ายระดับระบบปฏิบัติการ
+- ซ็อกเก็ต `net`, `tls` และ `http2` แบบดิบ, native addons และโปรเซสลูก อาจเลี่ยงการกำหนดเส้นทางพร็อกซีระดับ Node ได้ เว้นแต่จะสืบทอดและเคารพตัวแปรสภาพแวดล้อมของพร็อกซี
+- IRC เป็นช่องทาง TCP/TLS แบบดิบที่อยู่นอกการกำหนดเส้นทาง forward proxy ที่ผู้ปฏิบัติงานจัดการ ในการปรับใช้ที่กำหนดให้ egress ทั้งหมดผ่าน forward proxy นั้น ให้ตั้งค่า `channels.irc.enabled=false` เว้นแต่ egress ของ IRC โดยตรงจะได้รับอนุมัติอย่างชัดเจน
+- WebUI ภายในเครื่องของผู้ใช้และเซิร์ฟเวอร์โมเดลภายในเครื่องควรถูกเพิ่มใน allowlist ในนโยบายพร็อกซีของผู้ปฏิบัติงานเมื่อจำเป็น OpenClaw ไม่ได้เปิดเผยการข้ามเครือข่ายภายในเครื่องแบบทั่วไปสำหรับสิ่งเหล่านี้
+- การข้ามพร็อกซีของ control-plane ของ Gateway ถูกจำกัดไว้ที่ `localhost` และ URL IP loopback แบบระบุโดยตรงโดยเจตนา ใช้ `ws://127.0.0.1:18789`, `ws://[::1]:18789` หรือ `ws://localhost:18789` สำหรับการเชื่อมต่อ control-plane ของ Gateway โดยตรงภายในเครื่อง ชื่อโฮสต์อื่นจะถูกกำหนดเส้นทางเหมือนทราฟฟิกที่อิงตามชื่อโฮสต์ทั่วไป
- OpenClaw ไม่ตรวจสอบ ทดสอบ หรือรับรองนโยบายพร็อกซีของคุณ
-- ให้ถือว่าการเปลี่ยนแปลงนโยบายพร็อกซีเป็นการเปลี่ยนแปลงการดำเนินงานที่มีความอ่อนไหวด้านความปลอดภัย
+- ให้ถือว่าการเปลี่ยนแปลงนโยบายพร็อกซีเป็นการเปลี่ยนแปลงการดำเนินงานที่อ่อนไหวด้านความปลอดภัย
diff --git a/docs/th/tools/llm-task.md b/docs/th/tools/llm-task.md
index 62dd60001..b760f9d66 100644
--- a/docs/th/tools/llm-task.md
+++ b/docs/th/tools/llm-task.md
@@ -1,22 +1,23 @@
---
read_when:
- - คุณต้องการขั้นตอน LLM แบบ JSON-only ภายในเวิร์กโฟลว์
- - คุณต้องการเอาต์พุต LLM ที่ตรวจสอบกับ schema แล้วสำหรับระบบอัตโนมัติ
-summary: งาน LLM แบบ JSON-only สำหรับเวิร์กโฟลว์ (เครื่องมือ Plugin เสริม)
+ - คุณต้องการขั้นตอน LLM แบบ JSON เท่านั้นภายในเวิร์กโฟลว์
+ - คุณต้องมีเอาต์พุตจาก LLM ที่ผ่านการตรวจสอบด้วยสคีมาสำหรับการทำงานอัตโนมัติ
+summary: งาน LLM แบบ JSON เท่านั้นสำหรับเวิร์กโฟลว์ (เครื่องมือ Plugin ที่เลือกใช้ได้)
title: งาน LLM
x-i18n:
- generated_at: "2026-04-24T09:37:14Z"
- model: gpt-5.4
+ generated_at: "2026-05-04T02:26:46Z"
+ model: gpt-5.5
provider: openai
- source_hash: 613aefd1bac5b9675821a118c11130c8bfaefb1673d0266f14ff4e91b47fed8b
+ source_hash: 9cdc5d4feef17fb6d6d90d819d4c92d26a4ec43e4f5364c6acbaad1934a89269
source_path: tools/llm-task.md
- workflow: 15
+ workflow: 16
---
-`llm-task` เป็น **เครื่องมือ Plugin เสริม** ที่รันงาน LLM แบบ JSON-only และส่งคืนเอาต์พุตแบบมีโครงสร้าง (โดยเลือกตรวจสอบกับ JSON Schema ได้)
+`llm-task` เป็น **เครื่องมือ Plugin แบบไม่บังคับ** ที่เรียกใช้งาน LLM task แบบ JSON-only และ
+คืนค่าเอาต์พุตที่มีโครงสร้าง (เลือกตรวจสอบกับ JSON Schema ได้)
-สิ่งนี้เหมาะอย่างยิ่งสำหรับเอนจินเวิร์กโฟลว์อย่าง Lobster: คุณสามารถเพิ่มขั้นตอน LLM เดียวได้
-โดยไม่ต้องเขียนโค้ด OpenClaw แบบกำหนดเองสำหรับแต่ละเวิร์กโฟลว์
+เหมาะสำหรับเครื่องมือ workflow เช่น Lobster: คุณสามารถเพิ่มขั้นตอน LLM เพียงขั้นตอนเดียว
+โดยไม่ต้องเขียนโค้ด OpenClaw แบบกำหนดเองสำหรับแต่ละ workflow
## เปิดใช้งาน Plugin
@@ -32,22 +33,19 @@ x-i18n:
}
```
-2. เพิ่มเครื่องมือลงใน allowlist (เครื่องมือนี้ถูกลงทะเบียนด้วย `optional: true`):
+2. อนุญาตเครื่องมือแบบไม่บังคับ:
```json
{
- "agents": {
- "list": [
- {
- "id": "main",
- "tools": { "allow": ["llm-task"] }
- }
- ]
+ "tools": {
+ "alsoAllow": ["llm-task"]
}
}
```
-## Config (ไม่บังคับ)
+ใช้ `tools.allow` เฉพาะเมื่อคุณต้องการโหมด allowlist แบบจำกัดเท่านั้น
+
+## การกำหนดค่า (ไม่บังคับ)
```json
{
@@ -70,13 +68,13 @@ x-i18n:
```
`allowedModels` คือ allowlist ของสตริง `provider/model` หากตั้งค่าไว้ คำขอใดๆ
-ที่อยู่นอกเหนือจากรายการนี้จะถูกปฏิเสธ
+ที่อยู่นอกรายการจะถูกปฏิเสธ
## พารามิเตอร์ของเครื่องมือ
-- `prompt` (string, ต้องระบุ)
+- `prompt` (string, จำเป็น)
- `input` (any, ไม่บังคับ)
-- `schema` (object, JSON Schema แบบไม่บังคับ)
+- `schema` (object, JSON Schema ไม่บังคับ)
- `provider` (string, ไม่บังคับ)
- `model` (string, ไม่บังคับ)
- `thinking` (string, ไม่บังคับ)
@@ -85,14 +83,14 @@ x-i18n:
- `maxTokens` (number, ไม่บังคับ)
- `timeoutMs` (number, ไม่บังคับ)
-`thinking` รองรับ preset การให้เหตุผลมาตรฐานของ OpenClaw เช่น `low` หรือ `medium`
+`thinking` รองรับค่าที่ตั้งไว้ล่วงหน้าสำหรับการให้เหตุผลมาตรฐานของ OpenClaw เช่น `low` หรือ `medium`
## เอาต์พุต
-ส่งคืน `details.json` ที่มี JSON ที่แยกวิเคราะห์แล้ว (และตรวจสอบกับ
-`schema` เมื่อมีการระบุ)
+คืนค่า `details.json` ที่มี JSON ที่แยกวิเคราะห์แล้ว (และตรวจสอบกับ
+`schema` เมื่อระบุไว้)
-## ตัวอย่าง: ขั้นตอนเวิร์กโฟลว์ Lobster
+## ตัวอย่าง: ขั้นตอน workflow ของ Lobster
```lobster
openclaw.invoke --tool llm-task --action json --args-json '{
@@ -116,14 +114,14 @@ openclaw.invoke --tool llm-task --action json --args-json '{
## หมายเหตุด้านความปลอดภัย
-- เครื่องมือนี้เป็นแบบ **JSON-only** และสั่งให้โมเดลส่งออกเป็น JSON เท่านั้น (ไม่มี
- code fence, ไม่มีคำอธิบายเพิ่มเติม)
-- จะไม่มีการเปิดเผยเครื่องมือใดๆ ให้โมเดลสำหรับการรันนี้
-- ให้ถือว่าเอาต์พุตยังไม่น่าเชื่อถือจนกว่าคุณจะตรวจสอบด้วย `schema`
-- ใส่การอนุมัติก่อนขั้นตอนใดๆ ที่มีผลข้างเคียง (send, post, exec)
+- เครื่องมือนี้เป็น **JSON-only** และสั่งให้โมเดลส่งออกเฉพาะ JSON เท่านั้น (ไม่มี
+ code fences ไม่มีคำอธิบายประกอบ)
+- ไม่มีการเปิดเผยเครื่องมือใดๆ ให้โมเดลสำหรับการรันนี้
+- ถือว่าเอาต์พุตไม่น่าเชื่อถือ เว้นแต่คุณจะตรวจสอบด้วย `schema`
+- วางการอนุมัติไว้ก่อนขั้นตอนที่ก่อให้เกิดผลข้างเคียงใดๆ (ส่ง, โพสต์, exec)
## ที่เกี่ยวข้อง
- [ระดับ Thinking](/th/tools/thinking)
- [Sub-agents](/th/tools/subagents)
-- [คำสั่ง Slash](/th/tools/slash-commands)
+- [Slash commands](/th/tools/slash-commands)
diff --git a/docs/th/tools/lobster.md b/docs/th/tools/lobster.md
index 7982c6660..9f633591f 100644
--- a/docs/th/tools/lobster.md
+++ b/docs/th/tools/lobster.md
@@ -1,52 +1,52 @@
---
read_when:
- - คุณต้องการเวิร์กโฟลว์หลายขั้นตอนที่ให้ผลลัพธ์แน่นอนพร้อมการอนุมัติที่ชัดเจน
+ - คุณต้องการกระบวนการทำงานหลายขั้นตอนที่กำหนดผลลัพธ์ได้แน่นอนพร้อมการอนุมัติอย่างชัดเจน
- คุณต้องดำเนินเวิร์กโฟลว์ต่อโดยไม่เรียกใช้ขั้นตอนก่อนหน้านี้ซ้ำ
-summary: รันไทม์เวิร์กโฟลว์แบบมีชนิดสำหรับ OpenClaw พร้อมเกตการอนุมัติที่สามารถกลับมาทำงานต่อได้.
-title: ล็อบสเตอร์
+summary: รันไทม์เวิร์กโฟลว์แบบกำหนดชนิดข้อมูลสำหรับ OpenClaw พร้อมเกตการอนุมัติที่กลับมาทำงานต่อได้
+title: กุ้งมังกร
x-i18n:
- generated_at: "2026-04-30T10:21:05Z"
+ generated_at: "2026-05-04T02:27:08Z"
model: gpt-5.5
provider: openai
- source_hash: 1700bcfdbcf4558cb908935834e9059221d0d26ad78ed6f9e2158f7e0b83edbd
+ source_hash: 67f5145b11f2d6e07e9d78a44a389ae5f236c85ec8c287ab0f217a18b622ece0
source_path: tools/lobster.md
workflow: 16
---
-Lobster คือ workflow shell ที่ให้ OpenClaw รันลำดับเครื่องมือหลายขั้นตอนเป็นการดำเนินการเดียวที่กำหนดผลได้แน่นอน พร้อมจุดตรวจการอนุมัติที่ชัดเจน
+Lobster เป็นเชลล์เวิร์กโฟลว์ที่ให้ OpenClaw เรียกใช้ลำดับเครื่องมือหลายขั้นตอนเป็นการดำเนินการเดียวที่กำหนดแน่นอน พร้อมจุดตรวจสอบการอนุมัติอย่างชัดเจน
-Lobster เป็นเลเยอร์สำหรับเขียนงานหนึ่งชั้นเหนือการทำงานเบื้องหลังแบบแยกตัว สำหรับการจัด orchestration ของ flow ที่อยู่เหนือ task รายตัว โปรดดู [TaskFlow](/th/automation/taskflow) (`openclaw tasks flow`) สำหรับ ledger กิจกรรมของ task โปรดดู [`openclaw tasks`](/th/automation/tasks)
+Lobster เป็นเลเยอร์การเขียนหนึ่งระดับเหนือกว่างานเบื้องหลังแบบแยกตัว สำหรับการจัดการลำดับโฟลว์เหนือกว่างานรายตัว โปรดดู [Task Flow](/th/automation/taskflow) (`openclaw tasks flow`) สำหรับบัญชีแยกประเภทกิจกรรมของงาน โปรดดู [`openclaw tasks`](/th/automation/tasks)
## Hook
-ผู้ช่วยของคุณสามารถสร้างเครื่องมือที่ใช้จัดการตัวเองได้ ขอ workflow แล้วอีก 30 นาทีต่อมาคุณจะได้ CLI พร้อม pipelines ที่รันได้ในคำสั่งเดียว Lobster คือชิ้นส่วนที่ขาดไป: pipelines ที่กำหนดผลได้แน่นอน การอนุมัติที่ชัดเจน และสถานะที่กลับมาทำต่อได้
+ผู้ช่วยของคุณสามารถสร้างเครื่องมือที่จัดการตัวมันเองได้ ขอเวิร์กโฟลว์ แล้ว 30 นาทีต่อมาคุณจะมี CLI พร้อมไปป์ไลน์ที่รันเป็นการเรียกครั้งเดียว Lobster คือชิ้นส่วนที่ขาดไป: ไปป์ไลน์ที่กำหนดแน่นอน การอนุมัติที่ชัดเจน และสถานะที่กลับมาทำต่อได้
## ทำไม
-ปัจจุบัน workflows ที่ซับซ้อนต้องใช้การเรียกเครื่องมือโต้ตอบไปมาหลายครั้ง แต่ละครั้งใช้ tokens และ LLM ต้องจัด orchestration ทุกขั้นตอน Lobster ย้าย orchestration นั้นไปไว้ใน runtime แบบมีชนิด:
+ปัจจุบัน เวิร์กโฟลว์ที่ซับซ้อนต้องใช้การเรียกเครื่องมือโต้ตอบกลับไปกลับมาหลายครั้ง แต่ละครั้งมีค่าใช้จ่ายเป็นโทเค็น และ LLM ต้องจัดลำดับทุกขั้นตอน Lobster ย้ายการจัดลำดับนั้นเข้าไปในรันไทม์ที่มีชนิดข้อมูล:
-- **เรียกครั้งเดียวแทนหลายครั้ง**: OpenClaw รันการเรียกเครื่องมือ Lobster เพียงครั้งเดียวและได้ผลลัพธ์แบบมีโครงสร้าง
-- **มีการอนุมัติในตัว**: side effects (ส่งอีเมล โพสต์คอมเมนต์) จะหยุด workflow จนกว่าจะได้รับการอนุมัติอย่างชัดเจน
-- **กลับมาทำต่อได้**: workflows ที่หยุดไว้จะคืน token; อนุมัติแล้วทำต่อได้โดยไม่ต้องรันทุกอย่างใหม่
+- **เรียกครั้งเดียวแทนหลายครั้ง**: OpenClaw เรียกเครื่องมือ Lobster หนึ่งครั้งและได้ผลลัพธ์แบบมีโครงสร้าง
+- **มีการอนุมัติในตัว**: ผลข้างเคียง (ส่งอีเมล โพสต์ความคิดเห็น) จะหยุดเวิร์กโฟลว์จนกว่าจะได้รับการอนุมัติอย่างชัดเจน
+- **กลับมาทำต่อได้**: เวิร์กโฟลว์ที่หยุดจะคืนโทเค็น อนุมัติแล้วทำต่อได้โดยไม่ต้องรันทุกอย่างใหม่
-## ทำไมใช้ DSL แทนโปรแกรมธรรมดา?
+## ทำไมต้องใช้ DSL แทนโปรแกรมธรรมดา?
-Lobster ถูกตั้งใจให้เล็ก เป้าหมายไม่ใช่ "ภาษาใหม่" แต่เป็น spec ของ pipeline ที่คาดการณ์ได้และเป็นมิตรกับ AI พร้อมการอนุมัติและ resume tokens เป็นความสามารถหลัก
+Lobster ตั้งใจให้มีขนาดเล็ก เป้าหมายไม่ใช่ "ภาษาใหม่" แต่เป็นสเปกไปป์ไลน์ที่คาดการณ์ได้ เป็นมิตรกับ AI พร้อมการอนุมัติและโทเค็นสำหรับกลับมาทำต่อเป็นฟีเจอร์หลัก
-- **approve/resume มีในตัว**: โปรแกรมปกติสามารถถามมนุษย์ได้ แต่ไม่สามารถ _หยุดชั่วคราวแล้วกลับมาทำต่อ_ ด้วย token ที่คงทนได้โดยที่คุณไม่สร้าง runtime นั้นเอง
-- **ความกำหนดผลได้แน่นอน + การตรวจสอบย้อนหลัง**: Pipelines เป็นข้อมูล จึงง่ายต่อการ log, diff, replay และ review
-- **พื้นผิวที่จำกัดสำหรับ AI**: grammar ขนาดเล็ก + JSON piping ลดเส้นทางโค้ดที่ “สร้างสรรค์” เกินไป และทำให้การตรวจสอบเป็นไปได้จริง
-- **มีนโยบายความปลอดภัยในตัว**: timeouts, output caps, sandbox checks และ allowlists ถูกบังคับใช้โดย runtime ไม่ใช่แต่ละ script
-- **ยังเขียนโปรแกรมได้**: แต่ละ step สามารถเรียก CLI หรือ script ใดก็ได้ หากคุณต้องการ JS/TS ให้ generate ไฟล์ `.lobster` จากโค้ด
+- **การอนุมัติ/กลับมาทำต่อมีในตัว**: โปรแกรมปกติสามารถขอให้มนุษย์ยืนยันได้ แต่ไม่สามารถ _หยุดชั่วคราวและกลับมาทำต่อ_ ด้วยโทเค็นที่คงทนโดยที่คุณไม่ต้องสร้างรันไทม์นั้นเอง
+- **ความกำหนดแน่นอน + ตรวจสอบย้อนหลังได้**: ไปป์ไลน์เป็นข้อมูล จึงบันทึก diff เล่นซ้ำ และตรวจทานได้ง่าย
+- **พื้นผิวที่จำกัดสำหรับ AI**: ไวยากรณ์ขนาดเล็ก + การส่งผ่าน JSON ลดเส้นทางโค้ดที่ “สร้างสรรค์” และทำให้การตรวจสอบความถูกต้องเป็นไปได้จริง
+- **มีนโยบายความปลอดภัยในตัว**: ไทม์เอาต์ เพดานเอาต์พุต การตรวจสอบ sandbox และ allowlist ถูกบังคับใช้โดยรันไทม์ ไม่ใช่โดยแต่ละสคริปต์
+- **ยังเขียนโปรแกรมได้**: แต่ละขั้นตอนสามารถเรียก CLI หรือสคริปต์ใดก็ได้ หากต้องการ JS/TS ให้สร้างไฟล์ `.lobster` จากโค้ด
-## ทำงานอย่างไร
+## วิธีทำงาน
-OpenClaw รัน Lobster workflows **ใน process** โดยใช้ runner แบบฝังตัว ไม่มีการ spawn subprocess ของ CLI ภายนอก; workflow engine ทำงานภายใน gateway process และคืน JSON envelope โดยตรง
-หาก pipeline หยุดเพื่อรออนุมัติ เครื่องมือจะคืน `resumeToken` เพื่อให้คุณทำต่อภายหลังได้
+OpenClaw รันเวิร์กโฟลว์ Lobster **ในโปรเซส** โดยใช้รันเนอร์แบบฝัง ไม่มีการ spawn ซับโปรเซส CLI ภายนอก เครื่องยนต์เวิร์กโฟลว์ทำงานภายในโปรเซส Gateway และคืนซอง JSON โดยตรง
+หากไปป์ไลน์หยุดเพื่อรออนุมัติ เครื่องมือจะคืน `resumeToken` เพื่อให้คุณทำต่อภายหลังได้
-## รูปแบบ: CLI ขนาดเล็ก + JSON pipes + การอนุมัติ
+## รูปแบบ: CLI ขนาดเล็ก + ท่อ JSON + การอนุมัติ
-สร้างคำสั่งเล็ก ๆ ที่สื่อสารด้วย JSON แล้วเชื่อมต่อเข้าด้วยกันเป็นการเรียก Lobster ครั้งเดียว (ชื่อตัวอย่างคำสั่งด้านล่าง — เปลี่ยนเป็นของคุณเองได้)
+สร้างคำสั่งขนาดเล็กที่สื่อสารด้วย JSON แล้วเชื่อมต่อเป็นการเรียก Lobster ครั้งเดียว (ชื่อตัวอย่างคำสั่งด้านล่าง — เปลี่ยนเป็นของคุณเอง)
```bash
inbox list --json
@@ -62,7 +62,7 @@ inbox apply --json
}
```
-หาก pipeline ขอการอนุมัติ ให้ resume ด้วย token:
+หากไปป์ไลน์ขอการอนุมัติ ให้ทำต่อด้วยโทเค็น:
```json
{
@@ -72,20 +72,20 @@ inbox apply --json
}
```
-AI กระตุ้น workflow; Lobster ดำเนินการตาม steps ประตูอนุมัติช่วยให้ side effects ชัดเจนและตรวจสอบย้อนหลังได้
+AI เริ่มเวิร์กโฟลว์; Lobster ดำเนินการตามขั้นตอน ประตูการอนุมัติทำให้ผลข้างเคียงชัดเจนและตรวจสอบย้อนหลังได้
-ตัวอย่าง: map input items เป็น tool calls:
+ตัวอย่าง: แมปรายการอินพุตเป็นการเรียกเครื่องมือ:
```bash
gog.gmail.search --query 'newer_than:1d' \
| openclaw.invoke --tool message --action send --each --item-key message --args-json '{"provider":"telegram","to":"..."}'
```
-## ขั้นตอน LLM แบบ JSON เท่านั้น (llm-task)
+## ขั้นตอน LLM เฉพาะ JSON (llm-task)
-สำหรับ workflows ที่ต้องมี **ขั้นตอน LLM แบบมีโครงสร้าง** ให้เปิดใช้เครื่องมือ Plugin เสริม
-`llm-task` แล้วเรียกจาก Lobster วิธีนี้ช่วยให้ workflow
-ยังคงกำหนดผลได้แน่นอน ในขณะที่ยังสามารถจำแนก/สรุป/ร่างข้อความด้วยโมเดลได้
+สำหรับเวิร์กโฟลว์ที่ต้องใช้ **ขั้นตอน LLM แบบมีโครงสร้าง** ให้เปิดใช้เครื่องมือ Plugin
+`llm-task` ที่เป็นทางเลือก และเรียกจาก Lobster วิธีนี้ทำให้เวิร์กโฟลว์
+ยังคงกำหนดแน่นอน ขณะยังให้คุณจัดประเภท/สรุป/ร่างด้วยโมเดลได้
เปิดใช้เครื่องมือ:
@@ -100,14 +100,14 @@ gog.gmail.search --query 'newer_than:1d' \
"list": [
{
"id": "main",
- "tools": { "allow": ["llm-task"] }
+ "tools": { "alsoAllow": ["llm-task"] }
}
]
}
}
```
-ใช้ใน pipeline:
+ใช้ในไปป์ไลน์:
```lobster
openclaw.invoke --tool llm-task --action json --args-json '{
@@ -128,9 +128,9 @@ openclaw.invoke --tool llm-task --action json --args-json '{
ดูรายละเอียดและตัวเลือกการกำหนดค่าได้ที่ [LLM Task](/th/tools/llm-task)
-## ไฟล์ Workflow (.lobster)
+## ไฟล์เวิร์กโฟลว์ (.lobster)
-Lobster สามารถรันไฟล์ workflow แบบ YAML/JSON ที่มีฟิลด์ `name`, `args`, `steps`, `env`, `condition` และ `approval` ในการเรียกเครื่องมือ OpenClaw ให้ตั้ง `pipeline` เป็น path ของไฟล์
+Lobster สามารถรันไฟล์เวิร์กโฟลว์ YAML/JSON ที่มีฟิลด์ `name`, `args`, `steps`, `env`, `condition` และ `approval` ได้ ในการเรียกเครื่องมือ OpenClaw ให้ตั้ง `pipeline` เป็นพาธไฟล์
```yaml
name: inbox-triage
@@ -155,20 +155,20 @@ steps:
หมายเหตุ:
-- `stdin: $step.stdout` และ `stdin: $step.json` ส่ง output ของ step ก่อนหน้า
-- `condition` (หรือ `when`) สามารถใช้ gate steps ตาม `$step.approved`
+- `stdin: $step.stdout` และ `stdin: $step.json` ส่งต่อเอาต์พุตของขั้นตอนก่อนหน้า
+- `condition` (หรือ `when`) สามารถกั้นขั้นตอนตาม `$step.approved`
## ติดตั้ง Lobster
-Lobster workflows ที่ bundled มาจะรันใน process; ไม่จำเป็นต้องมี binary `lobster` แยกต่างหาก runner แบบฝังตัวมาพร้อมกับ Plugin Lobster
+เวิร์กโฟลว์ Lobster ที่ bundled จะรันในโปรเซส ไม่จำเป็นต้องมีไบนารี `lobster` แยกต่างหาก รันเนอร์แบบฝังมาพร้อมกับ Plugin Lobster
-หากคุณต้องการ standalone Lobster CLI สำหรับการพัฒนาหรือ pipelines ภายนอก ให้ติดตั้งจาก [Lobster repo](https://github.com/openclaw/lobster) และตรวจสอบให้แน่ใจว่า `lobster` อยู่บน `PATH`
+หากคุณต้องการ CLI Lobster แบบ standalone สำหรับการพัฒนาหรือไปป์ไลน์ภายนอก ให้ติดตั้งจาก [Lobster repo](https://github.com/openclaw/lobster) และตรวจสอบให้แน่ใจว่า `lobster` อยู่บน `PATH`
## เปิดใช้เครื่องมือ
-Lobster เป็นเครื่องมือ Plugin แบบ **เสริม** (ไม่ได้เปิดใช้เป็นค่าเริ่มต้น)
+Lobster เป็นเครื่องมือ Plugin **ทางเลือก** (ไม่ได้เปิดใช้โดยค่าเริ่มต้น)
-แนะนำ (เพิ่มแบบ additive, ปลอดภัย):
+แนะนำ (แบบเพิ่มเข้าไป ปลอดภัย):
```json
{
@@ -198,12 +198,12 @@ Lobster เป็นเครื่องมือ Plugin แบบ **เสร
หลีกเลี่ยงการใช้ `tools.allow: ["lobster"]` เว้นแต่คุณตั้งใจจะรันในโหมด allowlist แบบจำกัด
-Allowlists เป็นแบบ opt-in สำหรับ Plugins เสริม หาก allowlist ของคุณระบุเฉพาะเครื่องมือ Plugin (เช่น `lobster`) OpenClaw จะยังเปิดใช้เครื่องมือ core ต่อไป หากต้องการจำกัดเครื่องมือ core ด้วย ให้ใส่เครื่องมือ core หรือ groups ที่คุณต้องการไว้ใน allowlist ด้วย
+allowlist เป็นแบบ opt-in สำหรับ Plugin ทางเลือก `alsoAllow` เปิดใช้เฉพาะเครื่องมือ Plugin ทางเลือกที่ระบุชื่อไว้ ขณะยังคงชุดเครื่องมือ core ปกติไว้ หากต้องการจำกัดเครื่องมือ core ให้ใช้ `tools.allow` กับเครื่องมือหรือกลุ่ม core ที่คุณต้องการ
## ตัวอย่าง: การคัดแยกอีเมล
-ไม่มี Lobster:
+เมื่อไม่มี Lobster:
```
User: "Check my email and draft replies"
@@ -216,7 +216,7 @@ User: "Check my email and draft replies"
(repeat daily, no memory of what was triaged)
```
-มี Lobster:
+เมื่อมี Lobster:
```json
{
@@ -226,7 +226,7 @@ User: "Check my email and draft replies"
}
```
-คืน JSON envelope (ตัดทอน):
+คืนซอง JSON (ตัดทอน):
```json
{
@@ -242,7 +242,7 @@ User: "Check my email and draft replies"
}
```
-ผู้ใช้อนุมัติ → resume:
+ผู้ใช้อนุมัติ → ทำต่อ:
```json
{
@@ -252,13 +252,13 @@ User: "Check my email and draft replies"
}
```
-หนึ่ง workflow กำหนดผลได้แน่นอน ปลอดภัย
+เวิร์กโฟลว์เดียว กำหนดแน่นอน ปลอดภัย
-## พารามิเตอร์ของเครื่องมือ
+## พารามิเตอร์เครื่องมือ
### `run`
-รัน pipeline ในโหมดเครื่องมือ
+รันไปป์ไลน์ในโหมดเครื่องมือ
```json
{
@@ -270,7 +270,7 @@ User: "Check my email and draft replies"
}
```
-รันไฟล์ workflow พร้อม args:
+รันไฟล์เวิร์กโฟลว์พร้อมอาร์กิวเมนต์:
```json
{
@@ -282,7 +282,7 @@ User: "Check my email and draft replies"
### `resume`
-ทำ workflow ที่หยุดไว้ต่อหลังการอนุมัติ
+ทำต่อเวิร์กโฟลว์ที่หยุดหลังการอนุมัติ
```json
{
@@ -292,64 +292,64 @@ User: "Check my email and draft replies"
}
```
-### อินพุตเสริม
+### อินพุตทางเลือก
-- `cwd`: working directory แบบ relative สำหรับ pipeline (ต้องอยู่ภายใน gateway working directory)
-- `timeoutMs`: ยกเลิก workflow หากเกินระยะเวลานี้ (ค่าเริ่มต้น: 20000)
-- `maxStdoutBytes`: ยกเลิก workflow หาก output เกินขนาดนี้ (ค่าเริ่มต้น: 512000)
-- `argsJson`: สตริง JSON ที่ส่งให้ `lobster run --args-json` (เฉพาะไฟล์ workflow)
+- `cwd`: ไดเรกทอรีทำงานแบบสัมพัทธ์สำหรับไปป์ไลน์ (ต้องอยู่ภายในไดเรกทอรีทำงานของ gateway)
+- `timeoutMs`: ยกเลิกเวิร์กโฟลว์หากใช้เวลาเกินระยะเวลานี้ (ค่าเริ่มต้น: 20000)
+- `maxStdoutBytes`: ยกเลิกเวิร์กโฟลว์หากเอาต์พุตเกินขนาดนี้ (ค่าเริ่มต้น: 512000)
+- `argsJson`: สตริง JSON ที่ส่งให้ `lobster run --args-json` (เฉพาะไฟล์เวิร์กโฟลว์)
-## Output envelope
+## ซองเอาต์พุต
-Lobster คืน JSON envelope พร้อมหนึ่งในสามสถานะ:
+Lobster คืนซอง JSON ที่มีหนึ่งในสามสถานะ:
- `ok` → เสร็จสมบูรณ์สำเร็จ
-- `needs_approval` → หยุดชั่วคราว; ต้องใช้ `requiresApproval.resumeToken` เพื่อ resume
+- `needs_approval` → หยุดชั่วคราว; ต้องใช้ `requiresApproval.resumeToken` เพื่อทำต่อ
- `cancelled` → ถูกปฏิเสธหรือยกเลิกอย่างชัดเจน
-เครื่องมือแสดง envelope ทั้งใน `content` (JSON ที่จัดรูปแบบให้อ่านง่าย) และ `details` (object ดิบ)
+เครื่องมือแสดงซองทั้งใน `content` (JSON ที่จัดรูปแบบแล้ว) และ `details` (ออบเจ็กต์ดิบ)
## การอนุมัติ
-หากมี `requiresApproval` ให้ตรวจ prompt แล้วตัดสินใจ:
+หากมี `requiresApproval` ให้ตรวจ prompt และตัดสินใจ:
-- `approve: true` → resume และดำเนิน side effects ต่อ
-- `approve: false` → ยกเลิกและ finalize workflow
+- `approve: true` → ทำต่อและดำเนินผลข้างเคียงต่อ
+- `approve: false` → ยกเลิกและจบเวิร์กโฟลว์
-ใช้ `approve --preview-from-stdin --limit N` เพื่อแนบ JSON preview กับคำขออนุมัติโดยไม่ต้องใช้ jq/heredoc glue แบบกำหนดเอง Resume tokens ตอนนี้มีขนาดกะทัดรัด: Lobster เก็บสถานะ resume ของ workflow ไว้ใต้ state dir ของตัวเองและส่งคืน token key ขนาดเล็ก
+ใช้ `approve --preview-from-stdin --limit N` เพื่อแนบตัวอย่าง JSON ไปกับคำขออนุมัติโดยไม่ต้องใช้ jq/heredoc glue แบบกำหนดเอง ตอนนี้โทเค็นสำหรับกลับมาทำต่อมีขนาดกะทัดรัด: Lobster เก็บสถานะการกลับมาทำต่อของเวิร์กโฟลว์ไว้ใต้ไดเรกทอรีสถานะของตนและคืนคีย์โทเค็นขนาดเล็ก
## OpenProse
-OpenProse ทำงานร่วมกับ Lobster ได้ดี: ใช้ `/prose` เพื่อจัด orchestration การเตรียมงานหลาย agent แล้วรัน Lobster pipeline สำหรับการอนุมัติที่กำหนดผลได้แน่นอน หากโปรแกรม Prose ต้องใช้ Lobster ให้ allow เครื่องมือ `lobster` สำหรับ sub-agents ผ่าน `tools.subagents.tools` ดู [OpenProse](/th/prose)
+OpenProse ทำงานร่วมกับ Lobster ได้ดี: ใช้ `/prose` เพื่อจัดลำดับการเตรียมงานแบบหลาย agent แล้วรันไปป์ไลน์ Lobster สำหรับการอนุมัติที่กำหนดแน่นอน หากโปรแกรม Prose ต้องใช้ Lobster ให้อนุญาตเครื่องมือ `lobster` สำหรับ sub-agents ผ่าน `tools.subagents.tools` ดู [OpenProse](/th/prose)
## ความปลอดภัย
-- **เฉพาะ local ใน process เท่านั้น** — workflows ดำเนินการภายใน gateway process; ไม่มี network calls จากตัว Plugin เอง
-- **ไม่มี secrets** — Lobster ไม่จัดการ OAuth; แต่เรียกเครื่องมือ OpenClaw ที่จัดการสิ่งนั้น
-- **รับรู้ sandbox** — ปิดใช้งานเมื่อ context ของเครื่องมืออยู่ใน sandbox
-- **เสริมความแข็งแรงแล้ว** — timeouts และ output caps ถูกบังคับใช้โดย runner แบบฝังตัว
+- **เฉพาะในโปรเซสภายในเครื่อง** — เวิร์กโฟลว์ทำงานภายในโปรเซส gateway; ไม่มีการเรียกเครือข่ายจาก Plugin เอง
+- **ไม่มี secret** — Lobster ไม่จัดการ OAuth; มันเรียกเครื่องมือ OpenClaw ที่จัดการสิ่งนั้น
+- **รับรู้ sandbox** — ปิดใช้งานเมื่อบริบทเครื่องมืออยู่ใน sandbox
+- **เสริมความแข็งแรงแล้ว** — ไทม์เอาต์และเพดานเอาต์พุตถูกบังคับใช้โดยรันเนอร์แบบฝัง
## การแก้ไขปัญหา
-- **`lobster timed out`** → เพิ่ม `timeoutMs` หรือแยก pipeline ที่ยาวออก
-- **`lobster output exceeded maxStdoutBytes`** → เพิ่ม `maxStdoutBytes` หรือลดขนาด output
-- **`lobster returned invalid JSON`** → ตรวจสอบให้แน่ใจว่า pipeline รันในโหมดเครื่องมือและพิมพ์เฉพาะ JSON
-- **`lobster failed`** → ตรวจ gateway logs สำหรับรายละเอียดข้อผิดพลาดของ runner แบบฝังตัว
+- **`lobster timed out`** → เพิ่ม `timeoutMs` หรือแยกไปป์ไลน์ยาวออกเป็นส่วน
+- **`lobster output exceeded maxStdoutBytes`** → เพิ่ม `maxStdoutBytes` หรือลดขนาดเอาต์พุต
+- **`lobster returned invalid JSON`** → ตรวจสอบให้แน่ใจว่าไปป์ไลน์รันในโหมดเครื่องมือและพิมพ์เฉพาะ JSON
+- **`lobster failed`** → ตรวจสอบบันทึก gateway สำหรับรายละเอียดข้อผิดพลาดของรันเนอร์แบบฝัง
## เรียนรู้เพิ่มเติม
- [Plugins](/th/tools/plugin)
-- [การสร้างเครื่องมือ Plugin](/th/plugins/building-plugins#registering-agent-tools)
+- [การเขียนเครื่องมือ Plugin](/th/plugins/building-plugins#registering-agent-tools)
-## กรณีศึกษา: workflows ของชุมชน
+## กรณีศึกษา: เวิร์กโฟลว์ชุมชน
-ตัวอย่างสาธารณะหนึ่งรายการ: CLI แบบ “second brain” + Lobster pipelines ที่จัดการ Markdown vaults สามชุด (ส่วนตัว, คู่ชีวิต, แชร์ร่วมกัน) CLI ส่งออก JSON สำหรับสถิติ รายการ inbox และ stale scans; Lobster เชื่อมคำสั่งเหล่านั้นเป็น workflows เช่น `weekly-review`, `inbox-triage`, `memory-consolidation` และ `shared-task-sync` โดยแต่ละ workflow มีประตูอนุมัติ AI จัดการการใช้วิจารณญาณ (การจัดหมวดหมู่) เมื่อพร้อมใช้งาน และ fallback เป็นกฎที่กำหนดผลได้แน่นอนเมื่อไม่พร้อม
+ตัวอย่างสาธารณะหนึ่งรายการ: CLI “สมองที่สอง” + ไปป์ไลน์ Lobster ที่จัดการ vault Markdown สามชุด (ส่วนตัว คู่ชีวิต แชร์ร่วมกัน) CLI ส่งออก JSON สำหรับสถิติ รายการ inbox และการสแกนรายการค้างเก่า; Lobster เชื่อมคำสั่งเหล่านั้นเป็นเวิร์กโฟลว์ เช่น `weekly-review`, `inbox-triage`, `memory-consolidation` และ `shared-task-sync` โดยแต่ละรายการมีประตูการอนุมัติ AI รับหน้าที่ตัดสิน (การจัดประเภท) เมื่อพร้อมใช้งาน และถอยกลับไปใช้กฎที่กำหนดแน่นอนเมื่อไม่พร้อม
-- Thread: [https://x.com/plattenschieber/status/2014508656335770033](https://x.com/plattenschieber/status/2014508656335770033)
+- เธรด: [https://x.com/plattenschieber/status/2014508656335770033](https://x.com/plattenschieber/status/2014508656335770033)
- Repo: [https://github.com/bloomedai/brain-cli](https://github.com/bloomedai/brain-cli)
## ที่เกี่ยวข้อง
-- [Automation และ Tasks](/th/automation) — การตั้งเวลา Lobster workflows
-- [ภาพรวม Automation](/th/automation) — กลไก automation ทั้งหมด
+- [Automation & Tasks](/th/automation) — การกำหนดเวลารันเวิร์กโฟลว์ Lobster
+- [ภาพรวม Automation](/th/automation) — กลไก Automation ทั้งหมด
- [ภาพรวม Tools](/th/tools) — เครื่องมือ agent ทั้งหมดที่พร้อมใช้งาน
diff --git a/docs/th/tools/slash-commands.md b/docs/th/tools/slash-commands.md
index bf50b78ec..890bb9c61 100644
--- a/docs/th/tools/slash-commands.md
+++ b/docs/th/tools/slash-commands.md
@@ -3,20 +3,20 @@ read_when:
- การใช้หรือกำหนดค่าคำสั่งแชต
- การดีบักการกำหนดเส้นทางคำสั่งหรือสิทธิ์
sidebarTitle: Slash commands
-summary: 'คำสั่ง Slash: ข้อความเทียบกับเนทีฟ การกำหนดค่า และคำสั่งที่รองรับ'
-title: คำสั่งสแลช
+summary: 'คำสั่งสแลช: ข้อความเทียบกับแบบเนทีฟ, การกำหนดค่า และคำสั่งที่รองรับ'
+title: คำสั่งแบบสแลช
x-i18n:
- generated_at: "2026-05-03T21:39:24Z"
+ generated_at: "2026-05-04T02:27:16Z"
model: gpt-5.5
provider: openai
- source_hash: 9fbdd76ccd43159cabfbc3f15f7bddd2a7ada07fcd6eea2e169d2d88df18f28c
+ source_hash: 49eb41674c8d0a01dbd28a2df783eb9aba3dde18d8425951a266cede825e9a84
source_path: tools/slash-commands.md
workflow: 16
---
-คำสั่งจะถูกจัดการโดย Gateway คำสั่งส่วนใหญ่ต้องส่งเป็นข้อความแบบ **เดี่ยว** ที่ขึ้นต้นด้วย `/` คำสั่งแชต bash เฉพาะโฮสต์ใช้ `! ` (โดยมี `/bash ` เป็น alias)
+คำสั่งจะถูกจัดการโดย Gateway คำสั่งส่วนใหญ่ต้องส่งเป็นข้อความแบบ **เดี่ยว** ที่ขึ้นต้นด้วย `/` คำสั่งแชต bash เฉพาะโฮสต์ใช้ `! ` (โดยมี `/bash ` เป็นนามแฝง)
-เมื่อการสนทนาหรือเธรดถูกผูกกับเซสชัน ACP ข้อความติดตามผลปกติจะถูกส่งต่อไปยัง ACP harness นั้น คำสั่งจัดการ Gateway ยังคงอยู่ในเครื่อง: `/acp ...` จะไปถึงตัวจัดการคำสั่ง OpenClaw ACP เสมอ และ `/status` รวมถึง `/unfocus` จะยังคงอยู่ในเครื่องเมื่อมีการเปิดใช้งานการจัดการคำสั่งสำหรับพื้นผิวนั้น
+เมื่อบทสนทนาหรือเธรดถูกผูกกับเซสชัน ACP ข้อความติดตามผลตามปกติจะถูกส่งไปยัง ACP harness นั้น คำสั่งจัดการ Gateway ยังคงอยู่ภายในเครื่อง: `/acp ...` จะไปถึงตัวจัดการคำสั่ง ACP ของ OpenClaw เสมอ และ `/status` กับ `/unfocus` จะยังอยู่ภายในเครื่องเมื่อเปิดใช้การจัดการคำสั่งสำหรับพื้นผิวนั้น
มีระบบที่เกี่ยวข้องกันสองระบบ:
@@ -24,19 +24,19 @@ x-i18n:
ข้อความ `/...` แบบเดี่ยว
-
+
`/think`, `/fast`, `/verbose`, `/trace`, `/reasoning`, `/elevated`, `/exec`, `/model`, `/queue`.
- - Directive จะถูกตัดออกจากข้อความก่อนที่โมเดลจะเห็น
- - ในข้อความแชตปกติ (ไม่ใช่ข้อความที่มีแต่ directive) ระบบจะถือว่าเป็น “คำใบ้แบบ inline” และจะ **ไม่** คงค่าการตั้งค่าเซสชันไว้
- - ในข้อความที่มีแต่ directive (ข้อความมีเฉพาะ directive) ระบบจะคงค่าไว้กับเซสชันและตอบกลับด้วยการยืนยัน
- - Directive จะถูกใช้กับ **ผู้ส่งที่ได้รับอนุญาต** เท่านั้น หากตั้งค่า `commands.allowFrom` ไว้ ค่านี้จะเป็น allowlist เดียวที่ใช้ มิฉะนั้นการอนุญาตจะมาจาก allowlist/การจับคู่ของช่องทางร่วมกับ `commands.useAccessGroups` ผู้ส่งที่ไม่ได้รับอนุญาตจะเห็น directive ถูกปฏิบัติเป็นข้อความธรรมดา
+ - คำสั่งกำกับจะถูกตัดออกจากข้อความก่อนที่โมเดลจะเห็น
+ - ในข้อความแชตปกติ (ไม่ใช่ข้อความที่มีแต่คำสั่งกำกับ) คำสั่งเหล่านี้จะถือเป็น "คำแนะนำแบบอินไลน์" และจะ **ไม่** คงการตั้งค่าเซสชันไว้
+ - ในข้อความที่มีแต่คำสั่งกำกับ (ข้อความมีเฉพาะคำสั่งกำกับ) คำสั่งเหล่านี้จะคงอยู่ในเซสชันและตอบกลับด้วยการยืนยัน
+ - คำสั่งกำกับจะใช้กับ **ผู้ส่งที่ได้รับอนุญาต** เท่านั้น ถ้าตั้งค่า `commands.allowFrom` ไว้ จะใช้รายการอนุญาตนี้เพียงรายการเดียว มิฉะนั้นการอนุญาตจะมาจากรายการอนุญาต/การจับคู่ของช่องทางร่วมกับ `commands.useAccessGroups` ผู้ส่งที่ไม่ได้รับอนุญาตจะเห็นคำสั่งกำกับถูกปฏิบัติเป็นข้อความธรรมดา
-
- เฉพาะผู้ส่งที่อยู่ใน allowlist/ได้รับอนุญาตเท่านั้น: `/help`, `/commands`, `/status`, `/whoami` (`/id`)
+
+ เฉพาะผู้ส่งที่อยู่ในรายการอนุญาต/ได้รับอนุญาตเท่านั้น: `/help`, `/commands`, `/status`, `/whoami` (`/id`).
- คำสั่งเหล่านี้จะทำงานทันที ถูกตัดออกก่อนที่โมเดลจะเห็นข้อความ และข้อความที่เหลือจะดำเนินต่อผ่านโฟลว์ปกติ
+ คำสั่งเหล่านี้จะทำงานทันที ถูกตัดออกก่อนที่โมเดลจะเห็นข้อความ และข้อความที่เหลือจะดำเนินต่อไปตามโฟลว์ปกติ
]
@@ -69,20 +69,20 @@ x-i18n:
```
- เปิดใช้การแยกวิเคราะห์ `/...` ในข้อความแชต บนพื้นผิวที่ไม่มีคำสั่ง native (WhatsApp/WebChat/Signal/iMessage/Google Chat/Microsoft Teams) คำสั่งข้อความยังทำงานได้แม้คุณตั้งค่านี้เป็น `false`
+ เปิดใช้การแยกวิเคราะห์ `/...` ในข้อความแชต บนพื้นผิวที่ไม่มีคำสั่งเนทีฟ (WhatsApp/WebChat/Signal/iMessage/Google Chat/Microsoft Teams) คำสั่งข้อความยังคงทำงานแม้คุณตั้งค่านี้เป็น `false`
- ลงทะเบียนคำสั่ง native อัตโนมัติ: เปิดสำหรับ Discord/Telegram; ปิดสำหรับ Slack (จนกว่าคุณจะเพิ่มคำสั่ง slash); ถูกละเว้นสำหรับผู้ให้บริการที่ไม่รองรับ native ตั้งค่า `channels.discord.commands.native`, `channels.telegram.commands.native` หรือ `channels.slack.commands.native` เพื่อ override รายผู้ให้บริการ (bool หรือ `"auto"`) บน Discord ค่า `false` จะข้ามการลงทะเบียนและการล้างคำสั่ง slash ระหว่างเริ่มต้นระบบ คำสั่งที่เคยลงทะเบียนไว้อาจยังแสดงอยู่จนกว่าคุณจะลบออกจากแอป Discord คำสั่ง Slack ถูกจัดการในแอป Slack และจะไม่ถูกลบโดยอัตโนมัติ
+ ลงทะเบียนคำสั่งเนทีฟ อัตโนมัติ: เปิดสำหรับ Discord/Telegram; ปิดสำหรับ Slack (จนกว่าคุณจะเพิ่มคำสั่ง slash); ถูกละเว้นสำหรับผู้ให้บริการที่ไม่รองรับเนทีฟ ตั้งค่า `channels.discord.commands.native`, `channels.telegram.commands.native` หรือ `channels.slack.commands.native` เพื่อแทนที่เป็นรายผู้ให้บริการ (bool หรือ `"auto"`) บน Discord ค่า `false` จะข้ามการลงทะเบียนและการล้างคำสั่ง slash ระหว่างเริ่มต้นระบบ คำสั่งที่เคยลงทะเบียนไว้อาจยังมองเห็นได้จนกว่าคุณจะลบออกจากแอป Discord คำสั่ง Slack จัดการในแอป Slack และจะไม่ถูกลบโดยอัตโนมัติ
-บน Discord สเปกคำสั่ง native อาจรวม `descriptionLocalizations` ซึ่ง OpenClaw จะเผยแพร่เป็น Discord `description_localizations` และรวมไว้ในการเปรียบเทียบ reconcile
+บน Discord ข้อกำหนดคำสั่งเนทีฟอาจมี `descriptionLocalizations` ซึ่ง OpenClaw เผยแพร่เป็น Discord `description_localizations` และรวมไว้ในการเปรียบเทียบการกระทบยอด
- ลงทะเบียนคำสั่ง **skill** แบบ native เมื่อรองรับ อัตโนมัติ: เปิดสำหรับ Discord/Telegram; ปิดสำหรับ Slack (Slack ต้องสร้างคำสั่ง slash แยกสำหรับแต่ละ skill) ตั้งค่า `channels.discord.commands.nativeSkills`, `channels.telegram.commands.nativeSkills` หรือ `channels.slack.commands.nativeSkills` เพื่อ override รายผู้ให้บริการ (bool หรือ `"auto"`)
+ ลงทะเบียนคำสั่ง **skill** แบบเนทีฟเมื่อรองรับ อัตโนมัติ: เปิดสำหรับ Discord/Telegram; ปิดสำหรับ Slack (Slack ต้องสร้างคำสั่ง slash ต่อหนึ่ง skill) ตั้งค่า `channels.discord.commands.nativeSkills`, `channels.telegram.commands.nativeSkills` หรือ `channels.slack.commands.nativeSkills` เพื่อแทนที่เป็นรายผู้ให้บริการ (bool หรือ `"auto"`)
- เปิดใช้ `! ` เพื่อรันคำสั่งเชลล์ของโฮสต์ (`/bash ` เป็น alias; ต้องใช้ allowlist ของ `tools.elevated`)
+ เปิดใช้ `! ` เพื่อเรียกใช้คำสั่งเชลล์ของโฮสต์ (`/bash ` เป็นนามแฝง; ต้องมีรายการอนุญาต `tools.elevated`)
- ควบคุมระยะเวลาที่ bash รอก่อนสลับไปโหมดเบื้องหลัง (`0` จะส่งไปเบื้องหลังทันที)
+ ควบคุมระยะเวลาที่ bash รอก่อนสลับเป็นโหมดเบื้องหลัง (`0` ส่งไปเบื้องหลังทันที)
เปิดใช้ `/config` (อ่าน/เขียน `openclaw.json`)
@@ -91,112 +91,113 @@ x-i18n:
เปิดใช้ `/mcp` (อ่าน/เขียนการกำหนดค่า MCP ที่ OpenClaw จัดการภายใต้ `mcp.servers`)
- เปิดใช้ `/plugins` (การค้นพบ/สถานะของ plugin รวมถึงการติดตั้ง + ควบคุมเปิด/ปิดใช้งาน)
+ เปิดใช้ `/plugins` (การค้นพบ/สถานะ Plugin รวมถึงการติดตั้งและตัวควบคุมเปิดใช้/ปิดใช้)
- เปิดใช้ `/debug` (override เฉพาะ runtime)
+ เปิดใช้ `/debug` (การแทนที่เฉพาะรันไทม์)
- เปิดใช้ `/restart` รวมถึงการดำเนินการเครื่องมือเพื่อรีสตาร์ต gateway
+ เปิดใช้ `/restart` รวมถึงการกระทำของเครื่องมือสำหรับรีสตาร์ต Gateway
- ตั้งค่า allowlist เจ้าของแบบชัดเจนสำหรับพื้นผิวคำสั่ง/เครื่องมือที่ใช้ได้เฉพาะเจ้าของ นี่คือบัญชีผู้ปฏิบัติงานมนุษย์ที่สามารถอนุมัติการดำเนินการอันตรายและรันคำสั่ง เช่น `/diagnostics`, `/export-trajectory` และ `/config` ค่านี้แยกจาก `commands.allowFrom` และจากการเข้าถึงด้วยการจับคู่ DM
+ ตั้งค่ารายการอนุญาตเจ้าของอย่างชัดเจนสำหรับพื้นผิวคำสั่ง/เครื่องมือที่จำกัดเฉพาะเจ้าของ นี่คือบัญชีผู้ปฏิบัติงานที่เป็นมนุษย์ซึ่งสามารถอนุมัติการกระทำอันตรายและเรียกใช้คำสั่ง เช่น `/diagnostics`, `/export-trajectory` และ `/config` ได้ โดยแยกจาก `commands.allowFrom` และจากสิทธิ์เข้าถึงการจับคู่ DM
- รายช่องทาง: ทำให้คำสั่งเฉพาะเจ้าของต้องใช้ **ตัวตนเจ้าของ** เพื่อรันบนพื้นผิวนั้น เมื่อเป็น `true` ผู้ส่งต้องตรงกับผู้สมัครเจ้าของที่ resolve แล้ว (เช่นรายการใน `commands.ownerAllowFrom` หรือ metadata เจ้าของแบบ native ของผู้ให้บริการ) หรือมี scope `operator.admin` ภายในบนช่องทางข้อความภายใน รายการ wildcard ใน `allowFrom` ของช่องทาง หรือรายการผู้สมัครเจ้าของที่ว่าง/resolve ไม่ได้ **ไม่** เพียงพอ คำสั่งเฉพาะเจ้าของจะล้มเหลวแบบปิดบนช่องทางนั้น ปล่อยค่านี้ปิดไว้หากคุณต้องการให้คำสั่งเฉพาะเจ้าของถูกควบคุมเฉพาะโดย `ownerAllowFrom` และ allowlist คำสั่งมาตรฐาน
+ รายช่องทาง: ทำให้คำสั่งที่จำกัดเฉพาะเจ้าของต้องใช้ **ตัวตนเจ้าของ** เพื่อทำงานบนพื้นผิวนั้น เมื่อเป็น `true` ผู้ส่งต้องตรงกับผู้สมัครเจ้าของที่แปลงค่าแล้ว (เช่น รายการใน `commands.ownerAllowFrom` หรือเมทาดาทาเจ้าของเนทีฟของผู้ให้บริการ) หรือมีขอบเขต `operator.admin` ภายในบนช่องทางข้อความภายใน รายการไวลด์การ์ดในช่องทาง `allowFrom` หรือรายการผู้สมัครเจ้าของที่ว่างเปล่า/แปลงค่าไม่ได้ **ไม่** เพียงพอ คำสั่งที่จำกัดเฉพาะเจ้าของจะล้มเหลวแบบปิดบนช่องทางนั้น ปิดค่านี้ไว้ถ้าคุณต้องการให้คำสั่งที่จำกัดเฉพาะเจ้าของถูกควบคุมเฉพาะด้วย `ownerAllowFrom` และรายการอนุญาตคำสั่งมาตรฐาน
- ควบคุมวิธีที่ owner id ปรากฏใน system prompt
+ ควบคุมวิธีที่รหัสเจ้าของปรากฏในพรอมป์ระบบ
- ตั้งค่า secret ของ HMAC ที่ใช้เมื่อ `commands.ownerDisplay="hash"` แบบไม่บังคับ
+ ตั้งค่าความลับ HMAC ที่ใช้เมื่อ `commands.ownerDisplay="hash"` ได้ตามต้องการ
- allowlist รายผู้ให้บริการสำหรับการอนุญาตคำสั่ง เมื่อกำหนดค่าไว้ ค่านี้จะเป็นแหล่งการอนุญาตเดียวสำหรับคำสั่งและ directive (allowlist/การจับคู่ของช่องทางและ `commands.useAccessGroups` จะถูกละเว้น) ใช้ `"*"` สำหรับค่าเริ่มต้นทั่วโลก; คีย์เฉพาะผู้ให้บริการจะ override ค่านี้
+ รายการอนุญาตรายผู้ให้บริการสำหรับการอนุญาตคำสั่ง เมื่อตั้งค่าแล้ว จะเป็นแหล่งอนุญาตเดียวสำหรับคำสั่งและคำสั่งกำกับ (รายการอนุญาต/การจับคู่ของช่องทางและ `commands.useAccessGroups` จะถูกละเว้น) ใช้ `"*"` เป็นค่าเริ่มต้นทั่วโลก; คีย์เฉพาะผู้ให้บริการจะแทนที่ค่านั้น
- บังคับใช้ allowlist/นโยบายสำหรับคำสั่งเมื่อไม่ได้ตั้งค่า `commands.allowFrom`
+ บังคับใช้รายการอนุญาต/นโยบายสำหรับคำสั่งเมื่อไม่ได้ตั้งค่า `commands.allowFrom`
## รายการคำสั่ง
-แหล่งข้อมูลจริงปัจจุบัน:
+แหล่งความจริงปัจจุบัน:
-- built-in หลักมาจาก `src/auto-reply/commands-registry.shared.ts`
+- คำสั่งในตัวของแกนหลักมาจาก `src/auto-reply/commands-registry.shared.ts`
- คำสั่ง dock ที่สร้างขึ้นมาจาก `src/auto-reply/commands-registry.data.ts`
-- คำสั่ง plugin มาจากการเรียก `registerCommand()` ของ plugin
-- ความพร้อมใช้งานจริงบน gateway ของคุณยังขึ้นอยู่กับ flag การกำหนดค่า พื้นผิวช่องทาง และ plugin ที่ติดตั้ง/เปิดใช้งาน
+- คำสั่ง Plugin มาจากการเรียก `registerCommand()` ของ Plugin
+- ความพร้อมใช้งานจริงบน Gateway ของคุณยังขึ้นอยู่กับแฟล็กการกำหนดค่า พื้นผิวช่องทาง และ Plugin ที่ติดตั้ง/เปิดใช้
-### คำสั่ง built-in หลัก
+### คำสั่งในตัวของแกนหลัก
-
- - `/new [model]` เริ่มเซสชันใหม่; `/reset` คือ alias สำหรับรีเซ็ต
- - Control UI จะดักจับ `/new` ที่พิมพ์เพื่อสร้างและสลับไปยังเซสชันแดชบอร์ดใหม่; `/reset` ที่พิมพ์ยังคงรันการรีเซ็ตแบบอยู่ที่เดิมของ Gateway
- - `/reset soft [message]` เก็บ transcript ปัจจุบันไว้ ทิ้ง id เซสชัน CLI backend ที่นำกลับมาใช้ซ้ำ และรันการโหลด startup/system-prompt ใหม่ในที่เดิม
- - `/compact [instructions]` ทำ compact บริบทของเซสชัน ดู [Compaction](/th/concepts/compaction)
- - `/stop` ยกเลิกการรันปัจจุบัน
+
+ - `/new [model]` เริ่มเซสชันใหม่; `/reset` เป็นนามแฝงสำหรับรีเซ็ต
+ - Control UI จะดักจับ `/new` ที่พิมพ์เข้ามาเพื่อสร้างและสลับไปยังเซสชันแดชบอร์ดใหม่; `/reset` ที่พิมพ์เข้ามายังคงเรียกใช้การรีเซ็ตในที่เดิมของ Gateway
+ - `/reset soft [message]` เก็บทรานสคริปต์ปัจจุบันไว้ ทิ้งรหัสเซสชันแบ็กเอนด์ CLI ที่ใช้ซ้ำ และเรียกโหลด startup/system-prompt ใหม่ในที่เดิม
+ - `/compact [instructions]` ทำ Compaction บริบทเซสชัน ดู [Compaction](/th/concepts/compaction)
+ - `/stop` ยกเลิกการเรียกใช้ปัจจุบัน
- `/session idle ` และ `/session max-age ` จัดการการหมดอายุของการผูกเธรด
- - `/export-session [path]` ส่งออกเซสชันปัจจุบันเป็น HTML Alias: `/export`
- - `/export-trajectory [path]` ขออนุมัติ exec แล้วส่งออก [trajectory bundle](/th/tools/trajectory) แบบ JSONL สำหรับเซสชันปัจจุบัน ใช้เมื่อคุณต้องการไทม์ไลน์ของ prompt, tool และ transcript สำหรับเซสชัน OpenClaw หนึ่งเซสชัน ในแชตกลุ่ม prompt ขออนุมัติและผลลัพธ์การส่งออกจะถูกส่งไปยังเจ้าของแบบส่วนตัว Alias: `/trajectory`
+ - `/export-session [path]` ส่งออกเซสชันปัจจุบันเป็น HTML นามแฝง: `/export`
+ - `/export-trajectory [path]` ขอการอนุมัติ exec แล้วส่งออก [ชุด trajectory](/th/tools/trajectory) แบบ JSONL สำหรับเซสชันปัจจุบัน ใช้เมื่อคุณต้องการลำดับเวลาของพรอมป์ เครื่องมือ และทรานสคริปต์สำหรับเซสชัน OpenClaw หนึ่งรายการ ในแชตกลุ่ม พรอมป์อนุมัติและผลการส่งออกจะส่งถึงเจ้าของเป็นการส่วนตัว นามแฝง: `/trajectory`
-
- - `/think ` ตั้งค่าระดับการคิด ตัวเลือกมาจากโปรไฟล์ผู้ให้บริการของโมเดลที่ใช้งานอยู่; ระดับทั่วไปคือ `off`, `minimal`, `low`, `medium` และ `high` โดยมีระดับกำหนดเอง เช่น `xhigh`, `adaptive`, `max` หรือแบบไบนารี `on` เฉพาะเมื่อรองรับ Alias: `/thinking`, `/t`
- - `/verbose on|off|full` สลับเอาต์พุตแบบละเอียด Alias: `/v`
- - `/trace on|off` สลับเอาต์พุต trace ของ plugin สำหรับเซสชันปัจจุบัน
- - `/fast [status|on|off]` แสดงหรือตั้งค่า fast mode
- - `/reasoning [on|off|stream]` สลับการมองเห็น reasoning Alias: `/reason`
- - `/elevated [on|off|ask|full]` สลับ elevated mode Alias: `/elev`
- - `/exec host= security= ask= node=` แสดงหรือตั้งค่า default ของ exec
+
+ - `/think ` ตั้งค่าระดับการคิด ตัวเลือกมาจากโปรไฟล์ผู้ให้บริการของโมเดลที่ใช้งานอยู่; ระดับทั่วไปคือ `off`, `minimal`, `low`, `medium` และ `high` โดยมีระดับกำหนดเอง เช่น `xhigh`, `adaptive`, `max` หรือแบบไบนารี `on` เฉพาะที่รองรับเท่านั้น นามแฝง: `/thinking`, `/t`
+ - `/verbose on|off|full` สลับเอาต์พุตแบบละเอียด นามแฝง: `/v`
+ - `/trace on|off` สลับเอาต์พุตการติดตาม Plugin สำหรับเซสชันปัจจุบัน
+ - `/fast [status|on|off]` แสดงหรือตั้งค่าโหมดเร็ว
+ - `/reasoning [on|off|stream]` สลับการมองเห็นเหตุผล นามแฝง: `/reason`
+ - `/elevated [on|off|ask|full]` สลับโหมดยกระดับ นามแฝง: `/elev`
+ - `/exec host= security= ask= node=` แสดงหรือตั้งค่า exec เริ่มต้น
- `/model [name|#|status]` แสดงหรือตั้งค่าโมเดล
- - `/models [provider] [page] [limit=|size=|all]` แสดงรายการผู้ให้บริการที่กำหนดค่าไว้/พร้อมใช้งานด้วย auth หรือโมเดลของผู้ให้บริการ; เพิ่ม `all` เพื่อเรียกดู catalog แบบเต็มของผู้ให้บริการนั้น
- - `/queue ` จัดการพฤติกรรมคิว (`steer`, `queue` เดิม, `followup`, `collect`, `steer-backlog`, `interrupt`) พร้อมตัวเลือก เช่น `debounce:0.5s cap:25 drop:summarize`; `/queue default` หรือ `/queue reset` จะล้าง override ของเซสชัน ดู [Command queue](/th/concepts/queue) และ [Steering queue](/th/concepts/queue-steering)
+ - `/models [provider] [page] [limit=|size=|all]` แสดงรายการผู้ให้บริการที่กำหนดค่าไว้/มีการยืนยันตัวตนพร้อมใช้งาน หรือโมเดลสำหรับผู้ให้บริการหนึ่งราย; เพิ่ม `all` เพื่อเรียกดูแค็ตตาล็อกทั้งหมดของผู้ให้บริการนั้น
+ - `/queue ` จัดการพฤติกรรมคิว (`steer`, `queue` แบบเดิม, `followup`, `collect`, `steer-backlog`, `interrupt`) รวมถึงตัวเลือก เช่น `debounce:0.5s cap:25 drop:summarize`; `/queue default` หรือ `/queue reset` ล้างการแทนที่ของเซสชัน ดู [คิวคำสั่ง](/th/concepts/queue) และ [คิวการชี้นำ](/th/concepts/queue-steering)
+ - `/steer ` แทรกคำแนะนำลงในการเรียกใช้ที่ใช้งานอยู่สำหรับเซสชันปัจจุบัน โดยไม่ขึ้นกับโหมด `/queue` คำสั่งนี้จะไม่เริ่มการเรียกใช้ใหม่เมื่อเซสชันว่างอยู่ นามแฝง: `/tell` ดู [ชี้นำ](/th/tools/steer)
- `/help` แสดงสรุปความช่วยเหลือแบบสั้น
- - `/commands` แสดง catalog คำสั่งที่สร้างขึ้น
- - `/tools [compact|verbose]` แสดงสิ่งที่ agent ปัจจุบันสามารถใช้ได้ตอนนี้
- - `/status` แสดงสถานะการดำเนินการ/runtime รวมถึงป้าย `Execution`/`Runtime` และการใช้งาน/โควตาของผู้ให้บริการเมื่อมี
- - `/diagnostics [note]` คือโฟลว์รายงานสนับสนุนเฉพาะเจ้าของสำหรับบั๊กของ Gateway และการรัน Codex harness โดยจะขออนุมัติ exec อย่างชัดเจนทุกครั้งก่อนรัน `openclaw gateway diagnostics export --json`; อย่าอนุมัติ diagnostics ด้วยกฎ allow-all หลังอนุมัติแล้ว จะส่งรายงานที่วางต่อได้พร้อม path ของ bundle ในเครื่อง สรุป manifest หมายเหตุความเป็นส่วนตัว และ id เซสชันที่เกี่ยวข้อง ในแชตกลุ่ม prompt ขออนุมัติและรายงานจะถูกส่งไปยังเจ้าของแบบส่วนตัว เมื่อเซสชันที่ใช้งานอยู่ใช้ OpenAI Codex harness การอนุมัติเดียวกันจะส่ง feedback ของ Codex ที่เกี่ยวข้องไปยังเซิร์ฟเวอร์ OpenAI ด้วย และคำตอบที่เสร็จแล้วจะแสดง id เซสชัน OpenClaw, id เธรด Codex และคำสั่ง `codex resume ` ดู [Diagnostics Export](/th/gateway/diagnostics)
- - `/crestodian ` รันตัวช่วยตั้งค่าและซ่อมแซม Crestodian จาก DM ของเจ้าของ
+ - `/commands` แสดงแค็ตตาล็อกคำสั่งที่สร้างขึ้น
+ - `/tools [compact|verbose]` แสดงสิ่งที่เอเจนต์ปัจจุบันใช้ได้ในตอนนี้
+ - `/status` แสดงสถานะการประมวลผล/รันไทม์ รวมถึงป้ายกำกับ `Execution`/`Runtime` และการใช้งาน/โควตาของผู้ให้บริการเมื่อมีข้อมูล
+ - `/diagnostics [note]` คือโฟลว์รายงานการสนับสนุนที่จำกัดเฉพาะเจ้าของสำหรับบั๊ก Gateway และการเรียกใช้ Codex harness โดยจะขอการอนุมัติ exec อย่างชัดเจนทุกครั้งก่อนเรียกใช้ `openclaw gateway diagnostics export --json`; อย่าอนุมัติการวินิจฉัยด้วยกฎ allow-all หลังอนุมัติแล้ว จะส่งรายงานที่วางต่อได้พร้อมพาธบันเดิลภายในเครื่อง สรุปแมนิเฟสต์ หมายเหตุความเป็นส่วนตัว และรหัสเซสชันที่เกี่ยวข้อง ในแชตกลุ่ม พรอมป์อนุมัติและรายงานจะส่งถึงเจ้าของเป็นการส่วนตัว เมื่อเซสชันที่ใช้งานอยู่ใช้ OpenAI Codex harness การอนุมัติเดียวกันนี้จะส่งข้อเสนอแนะ Codex ที่เกี่ยวข้องไปยังเซิร์ฟเวอร์ OpenAI ด้วย และคำตอบที่เสร็จสมบูรณ์จะแสดงรหัสเซสชัน OpenClaw รหัสเธรด Codex และคำสั่ง `codex resume ` ดู [การส่งออกการวินิจฉัย](/th/gateway/diagnostics)
+ - `/crestodian ` เรียกใช้ตัวช่วยตั้งค่าและซ่อมแซม Crestodian จาก DM ของเจ้าของ
- `/tasks` แสดงรายการงานเบื้องหลังที่ใช้งานอยู่/ล่าสุดสำหรับเซสชันปัจจุบัน
- `/context [list|detail|json]` อธิบายวิธีประกอบบริบท
- - `/whoami` แสดง sender id ของคุณ Alias: `/id`
- - `/usage off|tokens|full|cost` ควบคุม footer การใช้งานรายคำตอบ หรือพิมพ์สรุปค่าใช้จ่ายในเครื่อง
+ - `/whoami` แสดงรหัสผู้ส่งของคุณ นามแฝง: `/id`
+ - `/usage off|tokens|full|cost` ควบคุมส่วนท้ายการใช้งานต่อคำตอบ หรือพิมพ์สรุปต้นทุนภายในเครื่อง
-
- - `/skill [input]` รัน skill ตามชื่อ
- - `/allowlist [list|add|remove] ...` จัดการรายการ allowlist เฉพาะข้อความ
- - `/approve ` จัดการ prompt ขออนุมัติ exec ให้เสร็จสิ้น
- - `/btw ` ถามคำถามเสริมโดยไม่เปลี่ยนบริบทเซสชันในอนาคต Alias: `/side` ดู [BTW](/th/tools/btw)
+
+ - `/skill [input]` เรียกใช้ skill ตามชื่อ
+ - `/allowlist [list|add|remove] ...` จัดการรายการอนุญาต เฉพาะข้อความ
+ - `/approve ` แก้ไขพรอมป์อนุมัติ exec
+ - `/btw ` ถามคำถามข้างเคียงโดยไม่เปลี่ยนบริบทเซสชันในอนาคต นามแฝง: `/side` ดู [BTW](/th/tools/btw)
-
+
- `/subagents list|kill|log|info|send|steer|spawn` จัดการการรันตัวแทนย่อยสำหรับเซสชันปัจจุบัน
- - `/acp spawn|cancel|steer|close|sessions|status|set-mode|set|cwd|permissions|timeout|model|reset-options|doctor|install|help` จัดการเซสชัน ACP และตัวเลือก runtime
- - `/focus ` ผูกเธรด Discord หรือหัวข้อ/การสนทนา Telegram ปัจจุบันกับเป้าหมายเซสชัน
- - `/unfocus` นำการผูกปัจจุบันออก
+ - `/acp spawn|cancel|steer|close|sessions|status|set-mode|set|cwd|permissions|timeout|model|reset-options|doctor|install|help` จัดการเซสชัน ACP และตัวเลือกรันไทม์
+ - `/focus ` ผูกเธรด Discord หรือหัวข้อ/บทสนทนา Telegram ปัจจุบันเข้ากับเป้าหมายเซสชัน
+ - `/unfocus` ลบการผูกปัจจุบัน
- `/agents` แสดงรายการตัวแทนที่ผูกกับเธรดสำหรับเซสชันปัจจุบัน
- - `/kill ` ยกเลิกตัวแทนย่อยที่กำลังรันอยู่หนึ่งตัวหรือทั้งหมด
- - `/steer ` ส่งคำชี้นำไปยังตัวแทนย่อยที่กำลังรันอยู่ ชื่อแฝง: `/tell`
+ - `/kill ` ยกเลิกตัวแทนย่อยที่กำลังรันอยู่หนึ่งรายการหรือทั้งหมด
+ - `/subagents steer ` ส่งการกำกับไปยังตัวแทนย่อยที่กำลังรันอยู่ ดู [Steer](/th/tools/steer)
-
- - `/config show|get|set|unset` อ่านหรือเขียน `openclaw.json` เฉพาะเจ้าของ ต้องใช้ `commands.config: true`
- - `/mcp show|get|set|unset` อ่านหรือเขียนการกำหนดค่าเซิร์ฟเวอร์ MCP ที่ OpenClaw จัดการภายใต้ `mcp.servers` เฉพาะเจ้าของ ต้องใช้ `commands.mcp: true`
- - `/plugins list|inspect|show|get|install|enable|disable` ตรวจสอบหรือเปลี่ยนสถานะ plugin `/plugin` เป็นชื่อแฝง การเขียนทำได้เฉพาะเจ้าของ ต้องใช้ `commands.plugins: true`
- - `/debug show|set|unset|reset` จัดการการ override การกำหนดค่าเฉพาะ runtime เฉพาะเจ้าของ ต้องใช้ `commands.debug: true`
- - `/restart` รีสตาร์ท OpenClaw เมื่อเปิดใช้ ค่าเริ่มต้น: เปิดใช้; ตั้งค่า `commands.restart: false` เพื่อปิดใช้
- - `/send on|off|inherit` ตั้งค่านโยบายการส่ง เฉพาะเจ้าของ
+
+ - `/config show|get|set|unset` อ่านหรือเขียน `openclaw.json` เฉพาะเจ้าของเท่านั้น ต้องมี `commands.config: true`
+ - `/mcp show|get|set|unset` อ่านหรือเขียนการกำหนดค่าเซิร์ฟเวอร์ MCP ที่ OpenClaw จัดการภายใต้ `mcp.servers` เฉพาะเจ้าของเท่านั้น ต้องมี `commands.mcp: true`
+ - `/plugins list|inspect|show|get|install|enable|disable` ตรวจสอบหรือเปลี่ยนสถานะ Plugin `/plugin` เป็นนามแฝง การเขียนทำได้เฉพาะเจ้าของเท่านั้น ต้องมี `commands.plugins: true`
+ - `/debug show|set|unset|reset` จัดการการเขียนทับการกำหนดค่าที่ใช้เฉพาะรันไทม์ เฉพาะเจ้าของเท่านั้น ต้องมี `commands.debug: true`
+ - `/restart` รีสตาร์ต OpenClaw เมื่อเปิดใช้งาน ค่าเริ่มต้น: เปิดใช้งาน; ตั้ง `commands.restart: false` เพื่อปิดใช้งาน
+ - `/send on|off|inherit` ตั้งค่านโยบายการส่ง เฉพาะเจ้าของเท่านั้น
-
+
- `/tts on|off|status|chat|latest|provider|limit|summary|audio|help` ควบคุม TTS ดู [TTS](/th/tools/tts)
- - `/activation mention|always` ตั้งค่าโหมดการเปิดใช้งานแบบกลุ่ม
- - `/bash ` รันคำสั่งเชลล์ของโฮสต์ เฉพาะข้อความ ชื่อแฝง: `! ` ต้องใช้ `commands.bash: true` พร้อม allowlist ของ `tools.elevated`
+ - `/activation mention|always` ตั้งค่าโหมดการเปิดใช้งานกลุ่ม
+ - `/bash ` รันคำสั่งเชลล์ของโฮสต์ แบบข้อความเท่านั้น นามแฝง: `! ` ต้องมี `commands.bash: true` พร้อม allowlists ของ `tools.elevated`
- `!poll [sessionId]` ตรวจสอบงาน bash เบื้องหลัง
- `!stop [sessionId]` หยุดงาน bash เบื้องหลัง
@@ -205,31 +206,33 @@ x-i18n:
### คำสั่ง dock ที่สร้างขึ้น
-คำสั่ง dock จะสลับเส้นทางตอบกลับของเซสชันปัจจุบันไปยังช่องทางที่เชื่อมโยงไว้อีกช่องทางหนึ่ง ดู [การ dock ช่องทาง](/th/concepts/channel-docking) สำหรับการตั้งค่า ตัวอย่าง และการแก้ไขปัญหา
+คำสั่ง dock จะสลับเส้นทางการตอบกลับของเซสชันปัจจุบันไปยังช่องทางอื่นที่ลิงก์ไว้
+ดู [Channel docking](/th/concepts/channel-docking) สำหรับการตั้งค่า
+ตัวอย่าง และการแก้ไขปัญหา
-คำสั่ง dock สร้างจาก plugin ช่องทางที่รองรับ native-command ชุดที่ bundled อยู่ในปัจจุบัน:
+คำสั่ง dock สร้างจาก Plugin ของช่องทางที่รองรับคำสั่งเนทีฟ ชุดที่บันเดิลอยู่ในปัจจุบัน:
-- `/dock-discord` (ชื่อแฝง: `/dock_discord`)
-- `/dock-mattermost` (ชื่อแฝง: `/dock_mattermost`)
-- `/dock-slack` (ชื่อแฝง: `/dock_slack`)
-- `/dock-telegram` (ชื่อแฝง: `/dock_telegram`)
+- `/dock-discord` (นามแฝง: `/dock_discord`)
+- `/dock-mattermost` (นามแฝง: `/dock_mattermost`)
+- `/dock-slack` (นามแฝง: `/dock_slack`)
+- `/dock-telegram` (นามแฝง: `/dock_telegram`)
-ใช้คำสั่ง dock จากแชตส่วนตัวเพื่อสลับเส้นทางตอบกลับของเซสชันปัจจุบันไปยังช่องทางที่เชื่อมโยงไว้อีกช่องทางหนึ่ง ตัวแทนจะคงบริบทเซสชันเดิมไว้ แต่การตอบกลับในอนาคตของเซสชันนั้นจะถูกส่งไปยัง peer ของช่องทางที่เลือก
+ใช้คำสั่ง dock จากแชทโดยตรงเพื่อสลับเส้นทางการตอบกลับของเซสชันปัจจุบันไปยังช่องทางอื่นที่ลิงก์ไว้ ตัวแทนจะคงบริบทเซสชันเดิมไว้ แต่การตอบกลับในอนาคตสำหรับเซสชันนั้นจะถูกส่งไปยัง peer ของช่องทางที่เลือก
-คำสั่ง dock ต้องใช้ `session.identityLinks` ผู้ส่งต้นทางและ peer เป้าหมายต้องอยู่ในกลุ่มตัวตนเดียวกัน เช่น `["telegram:123", "discord:456"]` หากผู้ใช้ Telegram ที่มี id `123` ส่ง `/dock_discord` OpenClaw จะเก็บ `lastChannel: "discord"` และ `lastTo: "456"` ไว้บนเซสชันที่ใช้งานอยู่ หากผู้ส่งไม่ได้เชื่อมโยงกับ peer ของ Discord คำสั่งจะตอบกลับด้วยคำแนะนำการตั้งค่าแทนที่จะปล่อยให้ผ่านไปยังแชตปกติ
+คำสั่ง dock ต้องใช้ `session.identityLinks` ผู้ส่งต้นทางและ peer เป้าหมายต้องอยู่ในกลุ่มข้อมูลประจำตัวเดียวกัน เช่น `["telegram:123", "discord:456"]` หากผู้ใช้ Telegram ที่มี id `123` ส่ง `/dock_discord` OpenClaw จะเก็บ `lastChannel: "discord"` และ `lastTo: "456"` ไว้ในเซสชันที่ใช้งานอยู่ หากผู้ส่งไม่ได้ลิงก์กับ peer ของ Discord คำสั่งจะตอบกลับด้วยคำแนะนำการตั้งค่าแทนที่จะส่งต่อไปยังแชทปกติ
-การ dock เปลี่ยนเฉพาะเส้นทางเซสชันที่ใช้งานอยู่เท่านั้น ไม่ได้สร้างบัญชีช่องทาง ไม่ได้ให้สิทธิ์เข้าถึง ไม่ได้ข้าม allowlist ของช่องทาง และไม่ได้ย้ายประวัติ transcript ไปยังเซสชันอื่น ใช้ `/dock-telegram`, `/dock-slack`, `/dock-mattermost` หรือคำสั่ง dock ที่สร้างขึ้นคำสั่งอื่นเพื่อสลับเส้นทางอีกครั้ง
+การ dock เปลี่ยนเฉพาะเส้นทางเซสชันที่ใช้งานอยู่เท่านั้น ไม่สร้างบัญชีช่องทาง ไม่ให้สิทธิ์เข้าถึง ไม่ข้าม allowlists ของช่องทาง และไม่ย้ายประวัติ transcript ไปยังเซสชันอื่น ใช้ `/dock-telegram`, `/dock-slack`, `/dock-mattermost` หรือคำสั่ง dock ที่สร้างขึ้นอื่นเพื่อสลับเส้นทางอีกครั้ง
-### คำสั่ง bundled plugin
+### คำสั่ง Plugin ที่บันเดิลมา
-Bundled plugins สามารถเพิ่มคำสั่ง slash ได้อีก คำสั่ง bundled ปัจจุบันใน repo นี้:
+Plugin ที่บันเดิลมาสามารถเพิ่มคำสั่ง slash ได้อีก คำสั่งที่บันเดิลอยู่ใน repo นี้ในปัจจุบัน:
-- `/dreaming [on|off|status|help]` เปิด/ปิด memory dreaming ดู [Dreaming](/th/concepts/dreaming)
-- `/pair [qr|status|pending|approve|cleanup|notify]` จัดการ flow การจับคู่/ตั้งค่าอุปกรณ์ ดู [การจับคู่](/th/channels/pairing)
-- `/phone status|arm [duration]|disarm` arm คำสั่ง phone node ที่มีความเสี่ยงสูงชั่วคราว
-- `/voice status|list [limit]|set ` จัดการการกำหนดค่าเสียง Talk บน Discord ชื่อ native command คือ `/talkvoice`
-- `/card ...` ส่งพรีเซ็ต rich card ของ LINE ดู [LINE](/th/channels/line)
-- `/codex status|models|threads|resume|compact|review|diagnostics|account|mcp|skills` ตรวจสอบและควบคุม app-server harness ของ Codex ที่ bundled อยู่ ดู [Codex harness](/th/plugins/codex-harness)
+- `/dreaming [on|off|status|help]` เปิดหรือปิด memory dreaming ดู [Dreaming](/th/concepts/dreaming)
+- `/pair [qr|status|pending|approve|cleanup|notify]` จัดการโฟลว์การจับคู่/ตั้งค่าอุปกรณ์ ดู [Pairing](/th/channels/pairing)
+- `/phone status|arm [duration]|disarm` ติดอาวุธคำสั่ง node โทรศัพท์ที่มีความเสี่ยงสูงชั่วคราว
+- `/voice status|list [limit]|set ` จัดการการกำหนดค่าเสียง Talk บน Discord ชื่อคำสั่งเนทีฟคือ `/talkvoice`
+- `/card ...` ส่งพรีเซ็ต LINE rich card ดู [LINE](/th/channels/line)
+- `/codex status|models|threads|resume|compact|review|diagnostics|account|mcp|skills` ตรวจสอบและควบคุม harness ของ app-server Codex ที่บันเดิลมา ดู [Codex harness](/th/plugins/codex-harness)
- คำสั่งเฉพาะ QQBot:
- `/bot-ping`
- `/bot-version`
@@ -237,94 +240,94 @@ Bundled plugins สามารถเพิ่มคำสั่ง slash ได
- `/bot-upgrade`
- `/bot-logs`
-### คำสั่ง skill แบบไดนามิก
+### คำสั่ง Skills แบบไดนามิก
-Skill ที่ผู้ใช้เรียกได้จะแสดงเป็นคำสั่ง slash ด้วย:
+Skills ที่ผู้ใช้เรียกใช้ได้ยังถูกเปิดเผยเป็นคำสั่ง slash ด้วย:
-- `/skill [input]` ใช้งานได้เสมอในฐานะ entrypoint ทั่วไป
-- skills อาจปรากฏเป็นคำสั่งโดยตรงอย่าง `/prose` เมื่อ skill/plugin ลงทะเบียนไว้
-- การลงทะเบียน native skill-command ควบคุมโดย `commands.nativeSkills` และ `channels..commands.nativeSkills`
-- สเปกคำสั่งสามารถระบุ `descriptionLocalizations` สำหรับ native surfaces ที่รองรับคำอธิบายแบบ localized รวมถึง Discord
+- `/skill [input]` ใช้งานได้เสมอในฐานะจุดเข้าใช้งานทั่วไป
+- Skills อาจปรากฏเป็นคำสั่งโดยตรง เช่น `/prose` เมื่อ skill/Plugin ลงทะเบียนไว้
+- การลงทะเบียนคำสั่ง skill แบบเนทีฟควบคุมโดย `commands.nativeSkills` และ `channels..commands.nativeSkills`
+- สเปกคำสั่งสามารถระบุ `descriptionLocalizations` สำหรับพื้นผิวเนทีฟที่รองรับคำอธิบายที่แปลแล้ว รวมถึง Discord
-
- - คำสั่งยอมรับ `:` แบบไม่บังคับระหว่างคำสั่งและ args (เช่น `/think: high`, `/send: on`, `/help:`)
- - `/new ` ยอมรับ alias ของ model, `provider/model` หรือชื่อ provider (fuzzy match); หากไม่พบรายการที่ตรงกัน ข้อความจะถูกถือเป็นเนื้อหาข้อความ
- - สำหรับรายละเอียดการใช้งาน provider แบบครบถ้วน ใช้ `openclaw status --usage`
- - `/allowlist add|remove` ต้องใช้ `commands.config=true` และเคารพ `configWrites` ของช่องทาง
- - ในช่องทางแบบหลายบัญชี `/allowlist --account ` ที่กำหนดเป้าหมาย config และ `/config set channels..accounts....` จะเคารพ `configWrites` ของบัญชีเป้าหมายด้วย
- - `/usage` ควบคุม footer การใช้งานต่อการตอบกลับ; `/usage cost` พิมพ์สรุปค่าใช้จ่ายภายในเครื่องจาก log เซสชันของ OpenClaw
- - `/restart` เปิดใช้ตามค่าเริ่มต้น; ตั้งค่า `commands.restart: false` เพื่อปิดใช้
- - `/plugins install ` ยอมรับสเปก plugin เดียวกับ `openclaw plugins install`: path/archive ภายในเครื่อง, package npm, `git:` หรือ `clawhub:` จากนั้นร้องขอการรีสตาร์ท Gateway เพราะโมดูลซอร์สของ plugin เปลี่ยนไป
- - `/plugins enable|disable` อัปเดตการกำหนดค่า plugin และเรียกการโหลด plugin ของ Gateway ใหม่สำหรับ agent turn ใหม่
+
+ - คำสั่งยอมรับ `:` แบบไม่บังคับระหว่างคำสั่งและอาร์กิวเมนต์ (เช่น `/think: high`, `/send: on`, `/help:`)
+ - `/new ` ยอมรับนามแฝงโมเดล, `provider/model` หรือชื่อผู้ให้บริการ (จับคู่แบบ fuzzy); หากไม่พบการจับคู่ ข้อความจะถูกถือเป็นเนื้อหาข้อความ
+ - สำหรับรายละเอียดการใช้งานผู้ให้บริการแบบเต็ม ให้ใช้ `openclaw status --usage`
+ - `/allowlist add|remove` ต้องมี `commands.config=true` และเคารพ `configWrites` ของช่องทาง
+ - ในช่องทางหลายบัญชี `/allowlist --account ` ที่เจาะจงเป้าหมายการกำหนดค่า และ `/config set channels..accounts....` จะเคารพ `configWrites` ของบัญชีเป้าหมายด้วย
+ - `/usage` ควบคุม footer การใช้งานต่อการตอบกลับ; `/usage cost` พิมพ์สรุปค่าใช้จ่ายภายในเครื่องจากบันทึกเซสชัน OpenClaw
+ - `/restart` เปิดใช้งานตามค่าเริ่มต้น; ตั้ง `commands.restart: false` เพื่อปิดใช้งาน
+ - `/plugins install ` ยอมรับสเปก Plugin เดียวกับ `openclaw plugins install`: พาธ/ไฟล์เก็บถาวรในเครื่อง, แพ็กเกจ npm, `git:` หรือ `clawhub:` จากนั้นร้องขอให้รีสตาร์ต Gateway เพราะโมดูลซอร์สของ Plugin เปลี่ยนไป
+ - `/plugins enable|disable` อัปเดตการกำหนดค่า Plugin และทริกเกอร์การโหลด Plugin ของ Gateway ใหม่สำหรับเทิร์นตัวแทนใหม่
-
- - native command เฉพาะ Discord: `/vc join|leave|status` ควบคุมช่องเสียง (ใช้เป็นข้อความไม่ได้) `join` ต้องมี guild และช่องเสียง/stage ที่เลือก ต้องใช้ `channels.discord.voice` และ native commands
+
+ - คำสั่งเนทีฟเฉพาะ Discord: `/vc join|leave|status` ควบคุมช่องเสียง (ใช้เป็นข้อความไม่ได้) `join` ต้องมี guild และช่อง voice/stage ที่เลือกไว้ ต้องมี `channels.discord.voice` และคำสั่งเนทีฟ
- คำสั่งผูกเธรดของ Discord (`/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age`) ต้องเปิดใช้การผูกเธรดที่มีผล (`session.threadBindings.enabled` และ/หรือ `channels.discord.threadBindings.enabled`)
- - เอกสารอ้างอิงคำสั่ง ACP และพฤติกรรม runtime: [ตัวแทน ACP](/th/tools/acp-agents)
+ - อ้างอิงคำสั่ง ACP และพฤติกรรมรันไทม์: [ACP agents](/th/tools/acp-agents)
-
- - `/verbose` มีไว้สำหรับการดีบักและการมองเห็นเพิ่มเติม; ให้ **ปิด** ไว้ในการใช้งานปกติ
- - `/trace` แคบกว่า `/verbose`: จะแสดงเฉพาะบรรทัด trace/debug ที่ plugin เป็นเจ้าของ และปิดข้อความเครื่องมือ verbose ปกติไว้
- - `/fast on|off` คงค่า override ของเซสชันไว้ ใช้ตัวเลือก `inherit` ใน UI Sessions เพื่อล้างค่าและกลับไปใช้ค่าเริ่มต้นจาก config
- - `/fast` ขึ้นกับ provider: OpenAI/OpenAI Codex map ไปเป็น `service_tier=priority` บน native Responses endpoints ขณะที่คำขอ Anthropic สาธารณะโดยตรง รวมถึง traffic ที่ตรวจสอบสิทธิ์ด้วย OAuth ที่ส่งไปยัง `api.anthropic.com` map ไปเป็น `service_tier=auto` หรือ `standard_only` ดู [OpenAI](/th/providers/openai) และ [Anthropic](/th/providers/anthropic)
- - สรุปความล้มเหลวของเครื่องมือยังแสดงเมื่อเกี่ยวข้อง แต่ข้อความความล้มเหลวแบบละเอียดจะรวมไว้เฉพาะเมื่อ `/verbose` เป็น `on` หรือ `full`
- - `/reasoning`, `/verbose` และ `/trace` มีความเสี่ยงในสภาพแวดล้อมกลุ่ม: อาจเปิดเผย reasoning ภายใน output ของเครื่องมือ หรือ diagnostics ของ plugin ที่คุณไม่ได้ตั้งใจเปิดเผย ควรปล่อยให้ปิดไว้ โดยเฉพาะในแชตกลุ่ม
+
+ - `/verbose` มีไว้สำหรับการดีบักและการมองเห็นเพิ่มเติม; ให้ปิดไว้ (**off**) ในการใช้งานปกติ
+ - `/trace` แคบกว่า `/verbose`: จะแสดงเฉพาะบรรทัด trace/debug ที่ Plugin เป็นเจ้าของ และปิดข้อความเครื่องมือ verbose ปกติไว้
+ - `/fast on|off` คงการเขียนทับของเซสชันไว้ ใช้ตัวเลือก `inherit` ใน UI เซสชันเพื่อล้างและย้อนกลับไปใช้ค่าเริ่มต้นจากการกำหนดค่า
+ - `/fast` ขึ้นกับผู้ให้บริการ: OpenAI/OpenAI Codex แมปไปยัง `service_tier=priority` บน endpoint Responses แบบเนทีฟ ขณะที่คำขอ Anthropic สาธารณะโดยตรง รวมถึงทราฟฟิกที่ยืนยันตัวตนด้วย OAuth และส่งไปยัง `api.anthropic.com` จะแมปไปยัง `service_tier=auto` หรือ `standard_only` ดู [OpenAI](/th/providers/openai) และ [Anthropic](/th/providers/anthropic)
+ - สรุปความล้มเหลวของเครื่องมือยังคงแสดงเมื่อเกี่ยวข้อง แต่ข้อความความล้มเหลวแบบละเอียดจะถูกรวมไว้เฉพาะเมื่อ `/verbose` เป็น `on` หรือ `full`
+ - `/reasoning`, `/verbose` และ `/trace` มีความเสี่ยงในการตั้งค่ากลุ่ม: อาจเปิดเผยการให้เหตุผลภายใน ผลลัพธ์เครื่องมือ หรือการวินิจฉัยของ Plugin ที่คุณไม่ได้ตั้งใจเปิดเผย ควรปิดไว้ โดยเฉพาะในแชทกลุ่ม
-
- - `/model` คงค่า model ใหม่ของเซสชันทันที
- - หาก agent ว่าง การรันครั้งถัดไปจะใช้ทันที
- - หากมีการรันที่ใช้งานอยู่แล้ว OpenClaw จะทำเครื่องหมาย live switch เป็น pending และจะรีสตาร์ทเข้าสู่ model ใหม่เฉพาะที่จุด retry ที่สะอาด
- - หากกิจกรรมเครื่องมือหรือ output การตอบกลับเริ่มไปแล้ว การสลับที่ pending อาจค้างอยู่ในคิวจนกว่าจะมีโอกาส retry ภายหลังหรือ user turn ถัดไป
- - ใน TUI ภายในเครื่อง `/crestodian [request]` จะกลับจาก TUI ของ agent ปกติไปยัง Crestodian สิ่งนี้แยกจากโหมด rescue ของช่องทางข้อความ และไม่ได้ให้สิทธิ์ config ระยะไกล
+
+ - `/model` คงโมเดลเซสชันใหม่ไว้ทันที
+ - หากตัวแทนว่าง การรันถัดไปจะใช้ทันที
+ - หากมีการรันที่ใช้งานอยู่แล้ว OpenClaw จะทำเครื่องหมายการสลับแบบสดเป็นรายการรอดำเนินการ และจะรีสตาร์ตเข้าสู่โมเดลใหม่เฉพาะที่จุด retry ที่สะอาดเท่านั้น
+ - หากกิจกรรมเครื่องมือหรือผลลัพธ์การตอบกลับเริ่มไปแล้ว การสลับที่รอดำเนินการอาจยังคงอยู่ในคิวจนกว่าจะมีโอกาส retry ภายหลังหรือเทิร์นผู้ใช้ถัดไป
+ - ใน TUI ภายในเครื่อง `/crestodian [request]` จะกลับจาก TUI ตัวแทนปกติไปยัง Crestodian ส่วนนี้แยกจากโหมดกู้คืนของช่องทางข้อความ และไม่ได้ให้สิทธิ์การกำหนดค่าระยะไกล
-
- - **Fast path:** ข้อความที่เป็นคำสั่งอย่างเดียวจากผู้ส่งใน allowlist จะถูกจัดการทันที (ข้ามคิว + model)
- - **การกั้นด้วย mention ในกลุ่ม:** ข้อความที่เป็นคำสั่งอย่างเดียวจากผู้ส่งใน allowlist จะข้ามข้อกำหนด mention
- - **Shortcut แบบ inline (เฉพาะผู้ส่งใน allowlist):** คำสั่งบางคำสั่งยังทำงานได้เมื่อฝังอยู่ในข้อความปกติ และจะถูกตัดออกก่อนที่ model จะเห็นข้อความที่เหลือ
- - ตัวอย่าง: `hey /status` เรียกการตอบกลับสถานะ และข้อความที่เหลือจะดำเนินต่อผ่าน flow ปกติ
+
+ - **เส้นทางด่วน:** ข้อความที่มีเฉพาะคำสั่งจากผู้ส่งที่อยู่ใน allowlist จะถูกจัดการทันที (ข้ามคิว + โมเดล)
+ - **การกั้นด้วยการกล่าวถึงในกลุ่ม:** ข้อความที่มีเฉพาะคำสั่งจากผู้ส่งที่อยู่ใน allowlist จะข้ามข้อกำหนดการกล่าวถึง
+ - **ทางลัดแบบ inline (เฉพาะผู้ส่งที่อยู่ใน allowlist):** บางคำสั่งยังใช้งานได้เมื่อฝังอยู่ในข้อความปกติ และจะถูกตัดออกก่อนที่โมเดลจะเห็นข้อความที่เหลือ
+ - ตัวอย่าง: `hey /status` ทริกเกอร์การตอบกลับสถานะ และข้อความที่เหลือจะดำเนินต่อผ่านโฟลว์ปกติ
- ปัจจุบัน: `/help`, `/commands`, `/status`, `/whoami` (`/id`)
- - ข้อความที่เป็นคำสั่งอย่างเดียวจากผู้ที่ไม่ได้รับอนุญาตจะถูกละเว้นอย่างเงียบ ๆ และ token `/...` แบบ inline จะถูกถือเป็นข้อความธรรมดา
+ - ข้อความที่มีเฉพาะคำสั่งแต่ไม่ได้รับอนุญาตจะถูกละเว้นอย่างเงียบ ๆ และโทเค็น `/...` แบบ inline จะถูกถือเป็นข้อความธรรมดา
-
- - **คำสั่ง Skill:** skills แบบ `user-invocable` จะแสดงเป็นคำสั่ง slash ชื่อจะถูก sanitize เป็น `a-z0-9_` (สูงสุด 32 chars); ชื่อที่ชนกันจะได้ suffix เป็นตัวเลข (เช่น `_2`)
- - `/skill [input]` รัน skill ตามชื่อ (มีประโยชน์เมื่อข้อจำกัด native command ทำให้มีคำสั่งต่อ skill ไม่ได้)
- - ตามค่าเริ่มต้น คำสั่ง skill จะถูกส่งต่อไปยัง model เป็นคำขอปกติ
- - Skills อาจประกาศ `command-dispatch: tool` เป็นทางเลือก เพื่อ route คำสั่งไปยังเครื่องมือโดยตรง (กำหนดผลแน่นอน, ไม่ใช้ model)
- - ตัวอย่าง: `/prose` (OpenProse plugin) — ดู [OpenProse](/th/prose)
- - **อาร์กิวเมนต์ native command:** Discord ใช้ autocomplete สำหรับตัวเลือกแบบไดนามิก (และเมนูปุ่มเมื่อคุณละเว้น args ที่จำเป็น) Telegram และ Slack แสดงเมนูปุ่มเมื่อคำสั่งรองรับตัวเลือกและคุณละเว้น arg ตัวเลือกแบบไดนามิกจะถูก resolve เทียบกับ model ของเซสชันเป้าหมาย ดังนั้นตัวเลือกเฉพาะ model เช่นระดับ `/think` จะตาม override `/model` ของเซสชันนั้น
+
+ - **คำสั่ง Skills:** Skills แบบ `user-invocable` ถูกเปิดเผยเป็นคำสั่ง slash ชื่อจะถูกทำให้ปลอดภัยเป็น `a-z0-9_` (สูงสุด 32 อักขระ); หากชนกันจะได้รับ suffix ตัวเลข (เช่น `_2`)
+ - `/skill [input]` รัน skill ตามชื่อ (มีประโยชน์เมื่อข้อจำกัดของคำสั่งเนทีฟทำให้สร้างคำสั่งต่อ skill ไม่ได้)
+ - โดยค่าเริ่มต้น คำสั่ง skill จะถูกส่งต่อไปยังโมเดลเป็นคำขอปกติ
+ - Skills อาจประกาศ `command-dispatch: tool` เป็นตัวเลือกเพื่อกำหนดเส้นทางคำสั่งไปยังเครื่องมือโดยตรง (กำหนดผลลัพธ์ได้แน่นอน ไม่มีโมเดล)
+ - ตัวอย่าง: `/prose` (Plugin OpenProse) — ดู [OpenProse](/th/prose)
+ - **อาร์กิวเมนต์คำสั่งเนทีฟ:** Discord ใช้ autocomplete สำหรับตัวเลือกแบบไดนามิก (และเมนูปุ่มเมื่อคุณละเว้นอาร์กิวเมนต์ที่จำเป็น) Telegram และ Slack แสดงเมนูปุ่มเมื่อคำสั่งรองรับตัวเลือกและคุณละเว้นอาร์กิวเมนต์ ตัวเลือกแบบไดนามิกจะถูก resolve เทียบกับโมเดลของเซสชันเป้าหมาย ดังนั้นตัวเลือกเฉพาะโมเดล เช่น ระดับ `/think` จะตามการเขียนทับ `/model` ของเซสชันนั้น
## `/tools`
-`/tools` ตอบคำถาม runtime ไม่ใช่คำถาม config: **agent นี้ใช้อะไรได้ในตอนนี้ในบทสนทนานี้**
+`/tools` ตอบคำถามรันไทม์ ไม่ใช่คำถามการกำหนดค่า: **ตัวแทนนี้ใช้อะไรได้ในตอนนี้ในการสนทนานี้**
-- `/tools` ค่าเริ่มต้นกระชับและปรับให้เหมาะกับการสแกนอย่างรวดเร็ว
+- `/tools` ค่าเริ่มต้นมีขนาดกะทัดรัดและปรับให้เหมาะกับการสแกนอย่างรวดเร็ว
- `/tools verbose` เพิ่มคำอธิบายสั้น ๆ
-- native-command surfaces ที่รองรับอาร์กิวเมนต์จะแสดง mode switch เดียวกันเป็น `compact|verbose`
-- ผลลัพธ์เป็นแบบ scoped ตามเซสชัน ดังนั้นการเปลี่ยน agent, ช่องทาง, เธรด, การอนุญาตผู้ส่ง หรือ model อาจเปลี่ยน output ได้
-- `/tools` รวมเครื่องมือที่เข้าถึงได้จริงใน runtime รวมถึง core tools, เครื่องมือ plugin ที่เชื่อมต่อ และเครื่องมือที่ช่องทางเป็นเจ้าของ
+- พื้นผิวคำสั่งเนทีฟที่รองรับอาร์กิวเมนต์จะเปิดเผยสวิตช์โหมดเดียวกันเป็น `compact|verbose`
+- ผลลัพธ์มีขอบเขตตามเซสชัน ดังนั้นการเปลี่ยนตัวแทน ช่องทาง เธรด การอนุญาตผู้ส่ง หรือโมเดลอาจเปลี่ยนผลลัพธ์ได้
+- `/tools` รวมเครื่องมือที่เข้าถึงได้จริงในรันไทม์ รวมถึงเครื่องมือ core, เครื่องมือ Plugin ที่เชื่อมต่ออยู่ และเครื่องมือที่ช่องทางเป็นเจ้าของ
-สำหรับการแก้ไข profile และ override ให้ใช้แผง Control UI Tools หรือพื้นผิว config/catalog แทนการถือว่า `/tools` เป็น catalog แบบคงที่
+สำหรับการแก้ไขโปรไฟล์และการเขียนทับ ให้ใช้แผง Control UI Tools หรือพื้นผิว config/catalog แทนการถือว่า `/tools` เป็นแค็ตตาล็อกแบบคงที่
-## พื้นผิวการใช้งาน (สิ่งที่แสดงที่ไหน)
+## พื้นผิวการใช้งาน (สิ่งที่แสดงที่ใด)
-- **การใช้งาน/โควตาของ provider** (ตัวอย่าง: "Claude 80% left") แสดงใน `/status` สำหรับ model provider ปัจจุบันเมื่อเปิดใช้การติดตามการใช้งาน OpenClaw ปรับหน้าต่างเวลาของ provider ให้เป็น `% left`; สำหรับ MiniMax ฟิลด์เปอร์เซ็นต์ที่มีเฉพาะค่าคงเหลือจะถูกกลับค่าก่อนแสดงผล และการตอบกลับ `model_remains` จะให้ความสำคัญกับรายการ chat-model พร้อมป้ายกำกับแผนที่ติดแท็ก model
-- **บรรทัด token/cache** ใน `/status` สามารถ fallback ไปยังรายการการใช้งาน transcript ล่าสุดเมื่อ snapshot ของเซสชันสดมีข้อมูลไม่ครบถ้วน ค่าสดที่ไม่เป็นศูนย์ซึ่งมีอยู่ยังคงมีสิทธิ์เหนือกว่า และ transcript fallback ยังสามารถกู้คืนป้ายกำกับ runtime model ที่ใช้งานอยู่พร้อมยอดรวมแบบเน้น prompt ที่ใหญ่กว่าเมื่อยอดรวมที่เก็บไว้หายไปหรือเล็กกว่า
-- **Execution เทียบกับ runtime:** `/status` รายงาน `Execution` สำหรับเส้นทาง sandbox ที่มีผล และ `Runtime` สำหรับผู้ที่กำลังรันเซสชันจริง: `OpenClaw Pi Default`, `OpenAI Codex`, backend ของ CLI หรือ backend ของ ACP
-- **Token/ค่าใช้จ่ายต่อการตอบกลับ** ควบคุมด้วย `/usage off|tokens|full` (ต่อท้ายการตอบกลับปกติ)
-- `/model status` เกี่ยวกับ **models/auth/endpoints** ไม่ใช่การใช้งาน
+- **การใช้งาน/โควตาของผู้ให้บริการ** (ตัวอย่าง: "Claude เหลือ 80%") จะแสดงใน `/status` สำหรับผู้ให้บริการโมเดลปัจจุบันเมื่อเปิดใช้การติดตามการใช้งาน OpenClaw ปรับหน้าต่างของผู้ให้บริการให้เป็น `% left`; สำหรับ MiniMax ฟิลด์เปอร์เซ็นต์ที่มีเฉพาะค่าคงเหลือจะถูกกลับค่าก่อนแสดงผล และการตอบกลับ `model_remains` จะเลือกใช้รายการโมเดลแชตพร้อมป้ายกำกับแผนที่ติดแท็กโมเดล
+- **บรรทัดโทเค็น/แคช** ใน `/status` สามารถถอยกลับไปใช้รายการการใช้งานทรานสคริปต์ล่าสุดเมื่อสแนปช็อตเซสชันสดมีข้อมูลน้อย ค่าสดที่ไม่เป็นศูนย์ที่มีอยู่ยังคงมีลำดับความสำคัญ และการถอยกลับไปใช้ทรานสคริปต์ยังสามารถกู้คืนป้ายกำกับโมเดลรันไทม์ที่ใช้งานอยู่ พร้อมยอดรวมเชิงพรอมป์ที่ใหญ่กว่าเมื่อยอดรวมที่จัดเก็บไว้หายไปหรือเล็กกว่า
+- **การดำเนินการเทียบกับรันไทม์:** `/status` รายงาน `Execution` สำหรับพาธแซนด์บ็อกซ์ที่มีผล และ `Runtime` สำหรับผู้ที่กำลังรันเซสชันจริง: `OpenClaw Pi Default`, `OpenAI Codex`, แบ็กเอนด์ CLI หรือแบ็กเอนด์ ACP
+- **โทเค็น/ค่าใช้จ่ายต่อการตอบกลับ** ควบคุมด้วย `/usage off|tokens|full` (ต่อท้ายการตอบกลับปกติ)
+- `/model status` เกี่ยวกับ **โมเดล/การยืนยันตัวตน/เอนด์พอยต์** ไม่ใช่การใช้งาน
-## การเลือก model (`/model`)
+## การเลือกโมเดล (`/model`)
-`/model` ถูก implement เป็น directive
+`/model` ถูกใช้งานเป็น directive
ตัวอย่าง:
@@ -339,14 +342,14 @@ Skill ที่ผู้ใช้เรียกได้จะแสดงเ
หมายเหตุ:
-- `/model` และ `/model list` แสดงตัวเลือกแบบย่อที่มีหมายเลข (ตระกูล model + provider ที่พร้อมใช้งาน)
-- บน Discord, `/model` และ `/models` จะเปิดตัวเลือกแบบโต้ตอบพร้อม dropdown ของ provider และ model รวมถึงขั้นตอน Submit
-- `/model <#>` เลือกจากตัวเลือกนั้น (และให้ความสำคัญกับ provider ปัจจุบันเมื่อเป็นไปได้)
-- `/model status` แสดงมุมมองแบบละเอียด รวมถึง endpoint ของ provider ที่กำหนดค่าไว้ (`baseUrl`) และโหมด API (`api`) เมื่อมี
+- `/model` และ `/model list` แสดงตัวเลือกแบบกะทัดรัดที่มีหมายเลขกำกับ (ตระกูลโมเดล + ผู้ให้บริการที่พร้อมใช้งาน)
+- บน Discord, `/model` และ `/models` เปิดตัวเลือกแบบโต้ตอบที่มีดรอปดาวน์ผู้ให้บริการและโมเดล พร้อมขั้นตอน Submit
+- `/model <#>` เลือกจากตัวเลือกนั้น (และเลือกผู้ให้บริการปัจจุบันก่อนเมื่อเป็นไปได้)
+- `/model status` แสดงมุมมองแบบละเอียด รวมถึงเอนด์พอยต์ผู้ให้บริการที่กำหนดค่าไว้ (`baseUrl`) และโหมด API (`api`) เมื่อมีให้ใช้งาน
-## การ override เพื่อ debug
+## การแทนที่เพื่อดีบัก
-`/debug` ให้คุณตั้งค่า override config แบบ **runtime-only** (ในหน่วยความจำ ไม่ใช่บนดิสก์) เฉพาะ owner เท่านั้น ปิดไว้โดยค่าเริ่มต้น; เปิดใช้ด้วย `commands.debug: true`
+`/debug` ให้คุณตั้งค่าการแทนที่ config แบบ **เฉพาะรันไทม์** (หน่วยความจำ ไม่ใช่ดิสก์) เฉพาะเจ้าของเท่านั้น ปิดใช้งานตามค่าเริ่มต้น; เปิดใช้ด้วย `commands.debug: true`
ตัวอย่าง:
@@ -359,12 +362,12 @@ Skill ที่ผู้ใช้เรียกได้จะแสดงเ
```
-Override จะมีผลทันทีกับการอ่าน config ใหม่ แต่จะ **ไม่** เขียนลง `openclaw.json` ใช้ `/debug reset` เพื่อล้าง override ทั้งหมดและกลับไปใช้ config บนดิสก์
+การแทนที่มีผลทันทีกับการอ่าน config ใหม่ แต่จะ **ไม่** เขียนไปยัง `openclaw.json` ใช้ `/debug reset` เพื่อล้างการแทนที่ทั้งหมดและกลับไปใช้ config บนดิสก์
## เอาต์พุต trace ของ Plugin
-`/trace` ให้คุณสลับ **บรรทัด trace/debug ของ Plugin ตามขอบเขตเซสชัน** โดยไม่ต้องเปิดโหมด verbose เต็มรูปแบบ
+`/trace` ให้คุณสลับ **บรรทัด trace/debug ของ Plugin ที่อยู่ในขอบเขตเซสชัน** โดยไม่ต้องเปิดโหมด verbose เต็มรูปแบบ
ตัวอย่าง:
@@ -376,16 +379,16 @@ Override จะมีผลทันทีกับการอ่าน config
หมายเหตุ:
-- `/trace` ที่ไม่มี argument จะแสดงสถานะ trace ของเซสชันปัจจุบัน
+- `/trace` ที่ไม่มีอาร์กิวเมนต์จะแสดงสถานะ trace ของเซสชันปัจจุบัน
- `/trace on` เปิดใช้บรรทัด trace ของ Plugin สำหรับเซสชันปัจจุบัน
-- `/trace off` ปิดใช้อีกครั้ง
+- `/trace off` ปิดใช้งานอีกครั้ง
- บรรทัด trace ของ Plugin สามารถปรากฏใน `/status` และเป็นข้อความวินิจฉัยติดตามผลหลังการตอบกลับปกติของผู้ช่วย
-- `/trace` ไม่ได้แทนที่ `/debug`; `/debug` ยังคงจัดการ override config แบบ runtime-only
-- `/trace` ไม่ได้แทนที่ `/verbose`; เอาต์พุต verbose ปกติของ tool/status ยังคงเป็นของ `/verbose`
+- `/trace` ไม่ได้แทนที่ `/debug`; `/debug` ยังคงจัดการการแทนที่ config แบบเฉพาะรันไทม์
+- `/trace` ไม่ได้แทนที่ `/verbose`; เอาต์พุตเครื่องมือ/สถานะแบบ verbose ปกติยังคงเป็นหน้าที่ของ `/verbose`
## การอัปเดต config
-`/config` เขียนไปยัง config บนดิสก์ของคุณ (`openclaw.json`) เฉพาะ owner เท่านั้น ปิดไว้โดยค่าเริ่มต้น; เปิดใช้ด้วย `commands.config: true`
+`/config` เขียนไปยัง config บนดิสก์ของคุณ (`openclaw.json`) เฉพาะเจ้าของเท่านั้น ปิดใช้งานตามค่าเริ่มต้น; เปิดใช้ด้วย `commands.config: true`
ตัวอย่าง:
@@ -398,12 +401,12 @@ Override จะมีผลทันทีกับการอ่าน config
```
-Config จะถูกตรวจสอบความถูกต้องก่อนเขียน; การเปลี่ยนแปลงที่ไม่ถูกต้องจะถูกปฏิเสธ การอัปเดต `/config` จะคงอยู่ข้ามการรีสตาร์ท
+config จะถูกตรวจสอบความถูกต้องก่อนเขียน; การเปลี่ยนแปลงที่ไม่ถูกต้องจะถูกปฏิเสธ การอัปเดต `/config` จะคงอยู่ข้ามการรีสตาร์ต
## การอัปเดต MCP
-`/mcp` เขียนคำจำกัดความของ MCP server ที่ OpenClaw จัดการภายใต้ `mcp.servers` เฉพาะ owner เท่านั้น ปิดไว้โดยค่าเริ่มต้น; เปิดใช้ด้วย `commands.mcp: true`
+`/mcp` เขียนนิยามเซิร์ฟเวอร์ MCP ที่ OpenClaw จัดการไว้ใต้ `mcp.servers` เฉพาะเจ้าของเท่านั้น ปิดใช้งานตามค่าเริ่มต้น; เปิดใช้ด้วย `commands.mcp: true`
ตัวอย่าง:
@@ -415,12 +418,12 @@ Config จะถูกตรวจสอบความถูกต้องก
```
-`/mcp` เก็บ config ใน OpenClaw config ไม่ใช่การตั้งค่าโปรเจกต์ที่ Pi เป็นเจ้าของ Runtime adapters จะตัดสินใจว่า transport ใดสามารถ execute ได้จริง
+`/mcp` เก็บ config ไว้ใน config ของ OpenClaw ไม่ใช่การตั้งค่าโปรเจกต์ที่ Pi เป็นเจ้าของ อะแดปเตอร์รันไทม์จะตัดสินใจว่า transport ใดที่เรียกใช้ได้จริง
## การอัปเดต Plugin
-`/plugins` ให้ operator ตรวจสอบ plugin ที่ค้นพบและสลับการเปิดใช้ใน config ได้ flow แบบอ่านอย่างเดียวสามารถใช้ `/plugin` เป็น alias ได้ ปิดไว้โดยค่าเริ่มต้น; เปิดใช้ด้วย `commands.plugins: true`
+`/plugins` ให้ผู้ปฏิบัติงานตรวจสอบ Plugin ที่ค้นพบและสลับการเปิดใช้ใน config โฟลว์แบบอ่านอย่างเดียวสามารถใช้ `/plugin` เป็น alias ได้ ปิดใช้งานตามค่าเริ่มต้น; เปิดใช้ด้วย `commands.plugins: true`
ตัวอย่าง:
@@ -433,19 +436,19 @@ Config จะถูกตรวจสอบความถูกต้องก
```
-- `/plugins list` และ `/plugins show` ใช้การค้นพบ plugin จริงกับ workspace ปัจจุบันพร้อม config บนดิสก์
-- `/plugins install` ติดตั้งจาก ClawHub, npm, git, ไดเรกทอรี local และ archive
-- `/plugins enable|disable` อัปเดตเฉพาะ config ของ plugin; ไม่ได้ติดตั้งหรือถอนการติดตั้ง plugin
-- การเปลี่ยนแปลง enable และ disable จะ hot-reload พื้นผิว runtime ของ Gateway plugin สำหรับ agent turn ใหม่; install จะขอให้รีสตาร์ท Gateway เพราะโมดูลซอร์สของ plugin เปลี่ยนไป
+- `/plugins list` และ `/plugins show` ใช้การค้นพบ Plugin จริงกับ workspace ปัจจุบันพร้อม config บนดิสก์
+- `/plugins install` ติดตั้งจาก ClawHub, npm, git, ไดเรกทอรีภายในเครื่อง และไฟล์เก็บถาวร
+- `/plugins enable|disable` อัปเดตเฉพาะ config ของ Plugin; ไม่ได้ติดตั้งหรือถอนการติดตั้ง Plugin
+- การเปลี่ยนแปลงการเปิดใช้และปิดใช้จะโหลดพื้นผิวรันไทม์ Plugin ของ Gateway ใหม่แบบ hot-reload สำหรับรอบ agent ใหม่; การติดตั้งจะขอให้รีสตาร์ต Gateway เพราะโมดูลซอร์สของ Plugin เปลี่ยนแปลง
-## หมายเหตุเกี่ยวกับพื้นผิว
+## หมายเหตุพื้นผิว
- - **คำสั่งข้อความ** รันในเซสชันแชตปกติ (DM แชร์ `main`, กลุ่มมีเซสชันของตนเอง)
- - **คำสั่ง native** ใช้เซสชันที่แยกออกมา:
+ - **คำสั่งข้อความ** รันในเซสชันแชตปกติ (DM ใช้ `main` ร่วมกัน กลุ่มมีเซสชันของตนเอง)
+ - **คำสั่งเนทีฟ** ใช้เซสชันแบบแยก:
- Discord: `agent::discord:slash:`
- Slack: `agent::slack:slash:` (กำหนด prefix ได้ผ่าน `channels.slack.slashCommand.sessionPrefix`)
- Telegram: `telegram:slash:` (กำหนดเป้าหมายไปยังเซสชันแชตผ่าน `CommandTargetSessionKey`)
@@ -453,26 +456,26 @@ Config จะถูกตรวจสอบความถูกต้องก
- `channels.slack.slashCommand` ยังคงรองรับสำหรับคำสั่งสไตล์ `/openclaw` เดี่ยว หากคุณเปิดใช้ `commands.native` คุณต้องสร้าง Slack slash command หนึ่งรายการต่อคำสั่งในตัวแต่ละคำสั่ง (ชื่อเดียวกับ `/help`) เมนู argument ของคำสั่งสำหรับ Slack จะถูกส่งเป็นปุ่ม Block Kit แบบ ephemeral
+ `channels.slack.slashCommand` ยังคงรองรับสำหรับคำสั่งสไตล์ `/openclaw` เดียว หากคุณเปิดใช้ `commands.native` คุณต้องสร้างคำสั่ง slash ของ Slack หนึ่งคำสั่งต่อคำสั่งในตัวแต่ละรายการ (ชื่อเดียวกับ `/help`) เมนูอาร์กิวเมนต์ของคำสั่งสำหรับ Slack จะถูกส่งเป็นปุ่ม Block Kit แบบ ephemeral
- ข้อยกเว้น native ของ Slack: ลงทะเบียน `/agentstatus` (ไม่ใช่ `/status`) เพราะ Slack สงวน `/status` ไว้ ข้อความ `/status` ยังคงใช้งานได้ในข้อความ Slack
+ ข้อยกเว้นเนทีฟของ Slack: ลงทะเบียน `/agentstatus` (ไม่ใช่ `/status`) เพราะ Slack สงวน `/status` ไว้ ข้อความ `/status` ยังคงใช้งานได้ในข้อความ Slack
-## คำถามเสริม BTW
+## คำถามแทรก BTW
-`/btw` เป็น **คำถามเสริม** แบบรวดเร็วเกี่ยวกับเซสชันปัจจุบัน `/side` เป็น alias
+`/btw` เป็น **คำถามแทรก** แบบเร็วเกี่ยวกับเซสชันปัจจุบัน `/side` เป็น alias
ต่างจากแชตปกติ:
- ใช้เซสชันปัจจุบันเป็นบริบทพื้นหลัง
-- รันเป็นการเรียกแบบครั้งเดียวที่ **ไม่มี tool** แยกต่างหาก
-- ไม่เปลี่ยนบริบทของเซสชันในอนาคต
-- ไม่ถูกเขียนลงประวัติ transcript
-- ถูกส่งเป็นผลลัพธ์เสริมแบบสดแทนข้อความผู้ช่วยปกติ
+- รันเป็นการเรียกแบบ one-shot **ไม่มีเครื่องมือ** แยกต่างหาก
+- ไม่เปลี่ยนบริบทเซสชันในอนาคต
+- ไม่ถูกเขียนลงประวัติทรานสคริปต์
+- ส่งเป็นผลลัพธ์แทรกแบบสดแทนข้อความผู้ช่วยปกติ
-สิ่งนี้ทำให้ `/btw` มีประโยชน์เมื่อคุณต้องการคำชี้แจงชั่วคราวในขณะที่งานหลักยังดำเนินต่อไป
+สิ่งนี้ทำให้ `/btw` มีประโยชน์เมื่อคุณต้องการคำชี้แจงชั่วคราวขณะที่งานหลักยังดำเนินต่อไป
ตัวอย่าง:
@@ -481,7 +484,7 @@ Config จะถูกตรวจสอบความถูกต้องก
/side what changed while the main run continued?
```
-ดู [คำถามเสริม BTW](/th/tools/btw) สำหรับรายละเอียดพฤติกรรมและ UX ของ client ฉบับเต็ม
+ดู [คำถามแทรก BTW](/th/tools/btw) สำหรับพฤติกรรมเต็มรูปแบบและรายละเอียด UX ของไคลเอนต์
## ที่เกี่ยวข้อง
diff --git a/docs/th/tools/steer.md b/docs/th/tools/steer.md
new file mode 100644
index 000000000..f02883ee5
--- /dev/null
+++ b/docs/th/tools/steer.md
@@ -0,0 +1,85 @@
+---
+read_when:
+ - การใช้ /steer หรือ /tell ขณะที่เอเจนต์กำลังทำงานอยู่แล้ว
+ - เปรียบเทียบ /steer กับ /queue steer
+ - การตัดสินใจว่าจะกำกับทิศทางการรันปัจจุบัน เอเจนต์ย่อย หรือเซสชัน ACP
+sidebarTitle: Steer
+summary: ควบคุมการรันที่กำลังทำงานอยู่โดยไม่เปลี่ยนโหมดคิว
+title: กำหนดทิศทาง
+x-i18n:
+ generated_at: "2026-05-04T02:27:29Z"
+ model: gpt-5.5
+ provider: openai
+ source_hash: 71e1c80c0eea86d5c3c29513d3ed0675c04779fc9c6ee3b8a76c4bedaa264d22
+ source_path: tools/steer.md
+ workflow: 16
+---
+
+`/steer` ส่งคำแนะนำไปยังการรันที่ทำงานอยู่แล้ว ใช้สำหรับช่วงเวลาที่ต้องการ "ปรับการรันนี้
+ระหว่างที่ยังทำงานอยู่" ไม่ใช่สำหรับเริ่มเทิร์นใหม่
+
+## เซสชันปัจจุบัน
+
+ใช้ `/steer` ระดับบนสุดเพื่อกำหนดเป้าหมายไปยังการรันที่ทำงานอยู่ของเซสชันปัจจุบัน:
+
+```text
+/steer prefer the smaller patch and keep the tests focused
+/tell summarize before making the next tool call
+```
+
+พฤติกรรม:
+
+- กำหนดเป้าหมายเฉพาะการรันที่ทำงานอยู่ของเซสชันปัจจุบันเท่านั้น
+- ทำงานแยกจากโหมด `/queue` ของเซสชัน
+- ไม่เริ่มการรันใหม่เมื่อเซสชันว่างอยู่
+- ตอบกลับพร้อมคำเตือนเมื่อไม่มีการรันที่ทำงานอยู่ให้ชี้นำ
+- ใช้เส้นทางการชี้นำของรันไทม์ที่ทำงานอยู่ ดังนั้นโมเดลจะเห็นคำแนะนำที่
+ ขอบเขตรันไทม์ถัดไปที่รองรับ
+
+## การชี้นำเทียบกับคิว
+
+`/queue steer` เปลี่ยนวิธีที่ข้อความขาเข้าปกติทำงานเมื่อข้อความมาถึง
+ขณะที่มีการรันทำงานอยู่ `/steer ` เป็นคำสั่งแบบชัดเจนที่พยายาม
+แทรกข้อความของคำสั่งนั้นเข้าไปในการรันที่ทำงานอยู่ ณ ขอบเขตรันไทม์ถัดไป
+ที่รองรับ โดยไม่ขึ้นกับการตั้งค่า `/queue` ที่จัดเก็บไว้
+
+ใช้:
+
+- `/steer ` เมื่อคุณต้องการชี้นำการรันที่ทำงานอยู่ตอนนี้
+- `/queue steer` เมื่อคุณต้องการให้ข้อความปกติในอนาคตชี้นำการรันที่ทำงานอยู่
+ เป็นค่าเริ่มต้น
+- `/queue collect` หรือ `/queue followup` เมื่อข้อความใหม่ควรรอเทิร์น
+ ภายหลังแทนการชี้นำการรันที่ทำงานอยู่
+
+สำหรับโหมดคิวและพฤติกรรมสำรอง โปรดดู [คิวคำสั่ง](/th/concepts/queue) และ
+[คิวการชี้นำ](/th/concepts/queue-steering)
+
+## ซับเอเจนต์
+
+ใช้ `/subagents steer` เมื่อเป้าหมายคือการรันลูก:
+
+```text
+/subagents steer 2 focus only on the API surface
+```
+
+`/steer` ระดับบนสุดจะไม่เลือกซับเอเจนต์ด้วย id หรือดัชนีรายการ แต่จะ
+กำหนดเป้าหมายไปยังการรันที่ทำงานอยู่ของเซสชันปัจจุบันเสมอ โปรดดู
+[ซับเอเจนต์](/th/tools/subagents) สำหรับ id ป้ายกำกับ และคำสั่งควบคุมของซับเอเจนต์
+
+## เซสชัน ACP
+
+ใช้ `/acp steer` เมื่อเป้าหมายคือเซสชันฮาร์เนส ACP:
+
+```text
+/acp steer --session agent:main:acp:codex tighten the repro
+```
+
+โปรดดู [เอเจนต์ ACP](/th/tools/acp-agents) สำหรับการเลือกเซสชัน ACP และ
+พฤติกรรมรันไทม์
+
+## ที่เกี่ยวข้อง
+
+- [คำสั่ง Slash](/th/tools/slash-commands)
+- [คิวคำสั่ง](/th/concepts/queue)
+- [คิวการชี้นำ](/th/concepts/queue-steering)
+- [ซับเอเจนต์](/th/tools/subagents)
diff --git a/docs/th/tools/subagents.md b/docs/th/tools/subagents.md
index d503bc4a8..9e2f42658 100644
--- a/docs/th/tools/subagents.md
+++ b/docs/th/tools/subagents.md
@@ -1,44 +1,38 @@
---
read_when:
- - คุณต้องการให้งานทำงานเบื้องหลังหรือทำงานแบบขนานผ่านเอเจนต์
- - คุณกำลังเปลี่ยนแปลงนโยบายเครื่องมือ sessions_spawn หรือเอเจนต์ย่อย
- - คุณกำลังใช้งานหรือแก้ไขปัญหาเซสชันเอเจนต์ย่อยที่ผูกกับเธรด
+ - คุณต้องการทำงานเบื้องหลังหรือทำงานแบบขนานผ่านเอเจนต์
+ - คุณกำลังเปลี่ยนแปลง sessions_spawn หรือนโยบายของเครื่องมือตัวแทนย่อย
+ - คุณกำลังนำเซสชันเอเจนต์ย่อยที่ผูกกับเธรดไปใช้ หรือกำลังแก้ไขปัญหาเซสชันดังกล่าว
sidebarTitle: Sub-agents
-summary: สร้างการรันเอเจนต์เบื้องหลังแบบแยกอิสระที่แจ้งผลลัพธ์กลับไปยังแชตของผู้ร้องขอ
+summary: สร้างการรันเอเจนต์พื้นหลังแบบแยกอิสระ ซึ่งประกาศผลลัพธ์กลับไปยังแชตของผู้ร้องขอ
title: เอเจนต์ย่อย
x-i18n:
- generated_at: "2026-05-02T10:32:16Z"
+ generated_at: "2026-05-04T02:27:42Z"
model: gpt-5.5
provider: openai
- source_hash: 0e964df543bd19435daf94f2c85a34b9d32e07662405d2eac7635935f1e7bf64
+ source_hash: d0df39e06b952def3eb0b296f36c7dc8c0b0a115785d865236a970c5d453fc37
source_path: tools/subagents.md
workflow: 16
---
เอเจนต์ย่อยคือการรันเอเจนต์เบื้องหลังที่ถูกสร้างจากการรันเอเจนต์ที่มีอยู่
-เอเจนต์ย่อยจะรันในเซสชันของตัวเอง (`agent::subagent:`) และ
+เอเจนต์เหล่านี้รันในเซสชันของตัวเอง (`agent::subagent:`) และ
เมื่อเสร็จสิ้น จะ**ประกาศ**ผลลัพธ์กลับไปยังช่องแชตของผู้ร้องขอ
การรันเอเจนต์ย่อยแต่ละครั้งจะถูกติดตามเป็น
-[งานเบื้องหลัง](/th/automation/tasks).
+[งานเบื้องหลัง](/th/automation/tasks)
เป้าหมายหลัก:
-- ทำให้งาน "ค้นคว้า / งานยาว / เครื่องมือช้า" ทำงานแบบขนานได้โดยไม่บล็อกการรันหลัก
-- แยกเอเจนต์ย่อยออกจากกันตามค่าเริ่มต้น (แยกเซสชัน + การทำ sandboxing ที่เลือกได้)
-- ทำให้พื้นผิวเครื่องมือใช้งานผิดได้ยาก: เอเจนต์ย่อยจะ **ไม่ได้** รับเครื่องมือของเซสชันตามค่าเริ่มต้น
-- รองรับความลึกของการซ้อนที่กำหนดค่าได้สำหรับรูปแบบตัวประสานงาน
+- ทำให้งาน "วิจัย / งานยาว / เครื่องมือที่ช้า" รันแบบขนานได้โดยไม่บล็อกการรันหลัก
+- แยกเอเจนต์ย่อยออกจากกันตามค่าเริ่มต้น (การแยกเซสชัน + sandboxing แบบเลือกได้)
+- ทำให้พื้นผิวเครื่องมือใช้งานผิดได้ยาก: เอเจนต์ย่อยจะ**ไม่ได้**รับเครื่องมือเซสชันตามค่าเริ่มต้น
+- รองรับความลึกของการซ้อนที่กำหนดค่าได้สำหรับรูปแบบ orchestrator
-**หมายเหตุด้านค่าใช้จ่าย:** เอเจนต์ย่อยแต่ละตัวมีบริบทและการใช้โทเค็นของตัวเอง
-ตามค่าเริ่มต้น สำหรับงานหนักหรืองานที่ทำซ้ำ ให้ตั้งค่าโมเดลที่ถูกกว่าสำหรับเอเจนต์ย่อย
-และคงเอเจนต์หลักไว้บนโมเดลคุณภาพสูงกว่า กำหนดค่าผ่าน
-`agents.defaults.subagents.model` หรือการแทนที่รายเอเจนต์ เมื่อเอเจนต์ลูก
- จำเป็นต้องใช้ทรานสคริปต์ปัจจุบันของผู้ร้องขอจริง ๆ เอเจนต์สามารถร้องขอ
- `context: "fork"` ในการสร้างครั้งนั้นได้ เซสชันเอเจนต์ย่อยที่ผูกกับเธรดมีค่าเริ่มต้น
- เป็น `context: "fork"` เพราะจะแตกแขนงบทสนทนาปัจจุบันไปยังเธรดติดตามผล
+**หมายเหตุด้านต้นทุน:** เอเจนต์ย่อยแต่ละตัวมีบริบทและการใช้โทเค็นของตัวเองตามค่าเริ่มต้น สำหรับงานหนักหรืองานซ้ำ ให้ตั้งโมเดลที่ถูกกว่าสำหรับเอเจนต์ย่อยและคงเอเจนต์หลักไว้บนโมเดลคุณภาพสูงกว่า กำหนดค่าผ่าน `agents.defaults.subagents.model` หรือการ override รายเอเจนต์ เมื่อลูกต้องการ transcript ปัจจุบันของผู้ร้องขอจริง ๆ เอเจนต์สามารถขอ `context: "fork"` สำหรับการ spawn ครั้งนั้นได้ เซสชัน subagent ที่ผูกกับเธรดมีค่าเริ่มต้นเป็น `context: "fork"` เพราะจะแตกกิ่งบทสนทนาปัจจุบันไปยังเธรดติดตามผล
-## คำสั่งสแลช
+## คำสั่ง slash
ใช้ `/subagents` เพื่อตรวจสอบหรือควบคุมการรันเอเจนต์ย่อยสำหรับ**เซสชันปัจจุบัน**:
@@ -52,14 +46,14 @@ x-i18n:
/subagents spawn [--model ] [--thinking ]
```
-`/subagents info` แสดงเมทาดาทาการรัน (สถานะ, ไทม์สแตมป์, รหัสเซสชัน,
-พาธทรานสคริปต์, การล้างข้อมูล) ใช้ `sessions_history` สำหรับมุมมองเรียกคืนที่มีขอบเขต
-และผ่านการกรองด้านความปลอดภัยแล้ว ตรวจสอบพาธทรานสคริปต์บนดิสก์เมื่อคุณ
-ต้องการทรานสคริปต์เต็มแบบดิบ
+ใช้ [`/steer `](/th/tools/steer) ระดับบนสุดเพื่อ steer การรันที่ใช้งานอยู่ของเซสชันผู้ร้องขอปัจจุบัน ใช้ `/subagents steer ` เมื่อเป้าหมายเป็นการรันลูก
+
+`/subagents info` แสดงข้อมูลเมตาของการรัน (สถานะ, timestamp, id เซสชัน,
+พาธ transcript, cleanup) ใช้ `sessions_history` สำหรับมุมมองการเรียกดูย้อนหลังที่มีขอบเขตและผ่านการกรองความปลอดภัยแล้ว; ตรวจสอบพาธ transcript บนดิสก์เมื่อคุณต้องการ transcript ฉบับเต็มแบบดิบ
### การควบคุมการผูกเธรด
-คำสั่งเหล่านี้ทำงานบนช่องที่รองรับการผูกเธรดแบบถาวร
+คำสั่งเหล่านี้ทำงานบนช่องที่รองรับการผูกเธรดแบบคงอยู่
ดู [ช่องที่รองรับเธรด](#thread-supporting-channels) ด้านล่าง
```text
@@ -70,78 +64,74 @@ x-i18n:
/session max-age
```
-### พฤติกรรมการสร้าง
+### พฤติกรรมการ spawn
-`/subagents spawn` เริ่มเอเจนต์ย่อยเบื้องหลังในฐานะคำสั่งของผู้ใช้ (ไม่ใช่
-การรีเลย์ภายใน) และส่งการอัปเดตเสร็จสิ้นครั้งสุดท้ายกลับไปยัง
-แชตของผู้ร้องขอเมื่อการรันเสร็จสิ้น
+`/subagents spawn` เริ่มเอเจนต์ย่อยเบื้องหลังในฐานะคำสั่งของผู้ใช้ (ไม่ใช่ relay ภายใน) และส่งการอัปเดตการเสร็จสิ้นขั้นสุดท้ายหนึ่งครั้งกลับไปยังแชตของผู้ร้องขอเมื่อการรันเสร็จสิ้น
-
- - คำสั่งสร้างไม่บล็อก โดยจะคืนรหัสการรันทันที
+
+ - คำสั่ง spawn ไม่บล็อก; จะคืน id การรันทันที
- เมื่อเสร็จสิ้น เอเจนต์ย่อยจะประกาศข้อความสรุป/ผลลัพธ์กลับไปยังช่องแชตของผู้ร้องขอ
- - การเสร็จสิ้นเป็นแบบพุช หลังจากสร้างแล้ว อย่าวนลูปโพล `/subagents list`, `sessions_list` หรือ `sessions_history` เพียงเพื่อรอให้เสร็จ ตรวจสอบสถานะเฉพาะเมื่อต้องการสำหรับการดีบักหรือการแทรกแซง
- - เมื่อเสร็จสิ้น OpenClaw จะพยายามปิดแท็บเบราว์เซอร์/โปรเซสที่ติดตามไว้ซึ่งเปิดโดยเซสชันเอเจนต์ย่อยนั้น ก่อนที่โฟลว์ล้างข้อมูลการประกาศจะดำเนินต่อ
+ - การเสร็จสิ้นเป็นแบบ push-based หลังจาก spawn แล้ว อย่า poll `/subagents list`, `sessions_list`, หรือ `sessions_history` เป็นลูปเพียงเพื่อรอให้เสร็จ; ตรวจสอบสถานะเฉพาะเมื่อจำเป็นสำหรับการดีบักหรือการแทรกแซง
+ - เมื่อเสร็จสิ้น OpenClaw จะพยายามปิดแท็บ/โปรเซสเบราว์เซอร์ที่ติดตามไว้ซึ่งเปิดโดยเซสชันเอเจนต์ย่อยนั้นก่อนที่โฟลว์ cleanup ของการประกาศจะดำเนินต่อ
-
- - OpenClaw จะลองส่งตรงด้วย `agent` ก่อน โดยใช้คีย์ idempotency ที่เสถียร
- - หากการส่งตรงล้มเหลว จะถอยกลับไปใช้การกำหนดเส้นทางผ่านคิว
- - หากการกำหนดเส้นทางผ่านคิวยังไม่พร้อมใช้งาน การประกาศจะถูกลองใหม่ด้วย exponential backoff สั้น ๆ ก่อนยอมแพ้สุดท้าย
- - การส่งมอบเมื่อเสร็จสิ้นจะคงเส้นทางผู้ร้องขอที่ resolve แล้วไว้: เส้นทางเสร็จสิ้นที่ผูกกับเธรดหรือผูกกับบทสนทนาจะชนะเมื่อพร้อมใช้งาน หากต้นทางการเสร็จสิ้นให้มาเฉพาะช่อง OpenClaw จะเติมเป้าหมาย/บัญชีที่ขาดจากเส้นทางที่ resolve แล้วของเซสชันผู้ร้องขอ (`lastChannel` / `lastTo` / `lastAccountId`) เพื่อให้การส่งตรงยังทำงานได้
+
+ - OpenClaw ลองส่งมอบ `agent` โดยตรงก่อนด้วย idempotency key ที่เสถียร
+ - หากการส่งมอบโดยตรงล้มเหลว จะ fallback ไปใช้การ routing ผ่านคิว
+ - หากการ routing ผ่านคิวยังใช้ไม่ได้ การประกาศจะถูก retry ด้วย exponential backoff สั้น ๆ ก่อนยอมแพ้ขั้นสุดท้าย
+ - การส่งมอบเมื่อเสร็จสิ้นจะคง route ของผู้ร้องขอที่ resolve แล้ว: route การเสร็จสิ้นที่ผูกกับเธรดหรือผูกกับบทสนทนาจะชนะเมื่อมีให้ใช้; หากต้นทางการเสร็จสิ้นให้มาเพียง channel, OpenClaw จะเติม target/account ที่หายไปจาก route ที่ resolve แล้วของเซสชันผู้ร้องขอ (`lastChannel` / `lastTo` / `lastAccountId`) เพื่อให้การส่งมอบโดยตรงยังทำงานได้
-
- การส่งต่อเมื่อเสร็จสิ้นไปยังเซสชันผู้ร้องขอเป็นบริบทภายในที่สร้างโดยรันไทม์
- (ไม่ใช่ข้อความที่ผู้ใช้เขียน) และประกอบด้วย:
+
+ การ handoff การเสร็จสิ้นไปยังเซสชันผู้ร้องขอเป็นบริบทภายในที่สร้างโดย runtime (ไม่ใช่ข้อความที่ผู้ใช้เขียน) และประกอบด้วย:
- - `Result` — ข้อความตอบกลับ `assistant` ล่าสุดที่มองเห็นได้ มิฉะนั้นเป็นข้อความเครื่องมือ/toolResult ล่าสุดที่ผ่านการทำให้ปลอดภัยแล้ว การรันที่ล้มเหลวแบบสิ้นสุดจะไม่นำข้อความตอบกลับที่จับไว้มาใช้ซ้ำ
- - `Status` — `completed successfully` / `failed` / `timed out` / `unknown`.
- - สถิติรันไทม์/โทเค็นแบบย่อ
- - คำสั่งการส่งมอบที่บอกเอเจนต์ผู้ร้องขอให้เขียนใหม่ด้วยน้ำเสียงผู้ช่วยตามปกติ (ไม่ส่งต่อเมทาดาทาภายในแบบดิบ)
+ - `Result` — ข้อความตอบกลับ `assistant` ที่มองเห็นล่าสุด มิฉะนั้นเป็นข้อความ tool/toolResult ล่าสุดที่ sanitize แล้ว การรันที่ล้มเหลวแบบสิ้นสุดจะไม่นำข้อความตอบกลับที่จับไว้กลับมาใช้ซ้ำ
+ - `Status` — `completed successfully` / `failed` / `timed out` / `unknown`
+ - สถิติ runtime/token แบบย่อ
+ - คำสั่งการส่งมอบที่บอกเอเจนต์ผู้ร้องขอให้เขียนใหม่ด้วยเสียง assistant ปกติ (ไม่ส่งต่อ metadata ภายในแบบดิบ)
-
- - `--model` และ `--thinking` แทนที่ค่าเริ่มต้นสำหรับการรันเฉพาะครั้งนั้น
+
+ - `--model` และ `--thinking` override ค่าเริ่มต้นสำหรับการรันนั้นโดยเฉพาะ
- ใช้ `info`/`log` เพื่อตรวจสอบรายละเอียดและเอาต์พุตหลังเสร็จสิ้น
- - `/subagents spawn` เป็นโหมดครั้งเดียว (`mode: "run"`) สำหรับเซสชันแบบถาวรที่ผูกกับเธรด ให้ใช้ `sessions_spawn` พร้อม `thread: true` และ `mode: "session"`
- - สำหรับเซสชัน harness ของ ACP (Claude Code, Gemini CLI, OpenCode หรือ Codex ACP/acpx ที่ระบุชัดเจน) ให้ใช้ `sessions_spawn` พร้อม `runtime: "acp"` เมื่อเครื่องมือโฆษณาว่ารองรับรันไทม์นั้น ดู [โมเดลการส่งมอบ ACP](/th/tools/acp-agents#delivery-model) เมื่อดีบักการเสร็จสิ้นหรือลูปเอเจนต์ถึงเอเจนต์ เมื่อเปิดใช้ Plugin `codex` แล้ว การควบคุมแชต/เธรดของ Codex ควรเลือกใช้ `/codex ...` แทน ACP เว้นแต่ผู้ใช้จะขอ ACP/acpx อย่างชัดเจน
- - OpenClaw ซ่อน `runtime: "acp"` จนกว่าจะเปิดใช้ ACP, ผู้ร้องขอไม่ได้อยู่ใน sandbox, และมีการโหลด Plugin แบ็กเอนด์ เช่น `acpx` แล้ว `runtime: "acp"` คาดหวังรหัส harness ACP ภายนอก หรือรายการ `agents.list[]` ที่มี `runtime.type="acp"`; ใช้รันไทม์เอเจนต์ย่อยค่าเริ่มต้นสำหรับเอเจนต์การกำหนดค่า OpenClaw ปกติจาก `agents_list`
+ - `/subagents spawn` เป็นโหมด one-shot (`mode: "run"`) สำหรับเซสชันแบบคงอยู่ที่ผูกกับเธรด ให้ใช้ `sessions_spawn` พร้อม `thread: true` และ `mode: "session"`
+ - สำหรับเซสชัน harness ของ ACP (Claude Code, Gemini CLI, OpenCode, หรือ Codex ACP/acpx ที่ระบุชัดเจน) ให้ใช้ `sessions_spawn` พร้อม `runtime: "acp"` เมื่อเครื่องมือประกาศ runtime นั้น ดู [โมเดลการส่งมอบของ ACP](/th/tools/acp-agents#delivery-model) เมื่อดีบักการเสร็จสิ้นหรือลูป agent-to-agent เมื่อเปิดใช้งาน Plugin `codex` การควบคุมแชต/เธรดของ Codex ควรเลือกใช้ `/codex ...` แทน ACP เว้นแต่ผู้ใช้จะขอ ACP/acpx อย่างชัดเจน
+ - OpenClaw ซ่อน `runtime: "acp"` จนกว่า ACP จะเปิดใช้งาน ผู้ร้องขอไม่ได้อยู่ใน sandbox และมีการโหลด Plugin backend เช่น `acpx` แล้ว `runtime: "acp"` คาดหวัง id harness ACP ภายนอก หรือรายการ `agents.list[]` ที่มี `runtime.type="acp"`; ใช้ runtime เอเจนต์ย่อยค่าเริ่มต้นสำหรับเอเจนต์ config ของ OpenClaw ปกติจาก `agents_list`
## โหมดบริบท
-เอเจนต์ย่อยแบบเนทีฟจะเริ่มแบบแยกเดี่ยว เว้นแต่ผู้เรียกจะร้องขออย่างชัดเจนให้ fork
-ทรานสคริปต์ปัจจุบัน
+เอเจนต์ย่อยแบบ native จะเริ่มแบบแยกเดี่ยว เว้นแต่ผู้เรียกจะขอ fork
+transcript ปัจจุบันอย่างชัดเจน
| โหมด | ควรใช้เมื่อใด | พฤติกรรม |
| ---------- | -------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
-| `isolated` | การค้นคว้าใหม่, การนำไปใช้ที่เป็นอิสระ, งานเครื่องมือที่ช้า, หรือสิ่งใดก็ตามที่สรุปในข้อความงานได้ | สร้างทรานสคริปต์ลูกที่สะอาด นี่คือค่าเริ่มต้นและช่วยให้ใช้โทเค็นน้อยลง |
-| `fork` | งานที่ขึ้นกับบทสนทนาปัจจุบัน, ผลลัพธ์เครื่องมือก่อนหน้า, หรือคำสั่งที่ละเอียดอ่อนซึ่งมีอยู่แล้วในทรานสคริปต์ของผู้ร้องขอ | แตกแขนงทรานสคริปต์ของผู้ร้องขอไปยังเซสชันลูกก่อนที่เอเจนต์ลูกจะเริ่ม |
+| `isolated` | การวิจัยใหม่, การ implementation อิสระ, งานเครื่องมือที่ช้า, หรือสิ่งใดก็ตามที่สามารถสรุปในข้อความงานได้ | สร้าง transcript ลูกที่สะอาด นี่คือค่าเริ่มต้นและช่วยลดการใช้โทเค็น |
+| `fork` | งานที่ขึ้นกับบทสนทนาปัจจุบัน, ผลลัพธ์เครื่องมือก่อนหน้า, หรือคำสั่งที่ละเอียดอ่อนซึ่งมีอยู่แล้วใน transcript ของผู้ร้องขอ | แตกกิ่ง transcript ของผู้ร้องขอไปยังเซสชันลูกก่อนที่ลูกจะเริ่ม |
-ใช้ `fork` อย่างประหยัด โหมดนี้มีไว้สำหรับการมอบหมายที่ไวต่อบริบท ไม่ใช่
-การแทนที่การเขียนพรอมต์งานที่ชัดเจน
+ใช้ `fork` อย่างประหยัด มีไว้สำหรับการมอบหมายงานที่อ่อนไหวต่อบริบท ไม่ใช่
+สิ่งทดแทนการเขียน prompt งานที่ชัดเจน
## เครื่องมือ: `sessions_spawn`
-เริ่มการรันเอเจนต์ย่อยด้วย `deliver: false` บนเลน `subagent` ส่วนกลาง
-จากนั้นรันขั้นตอนประกาศและโพสต์การตอบกลับประกาศไปยังช่องแชตของผู้ร้องขอ
+เริ่มการรันเอเจนต์ย่อยด้วย `deliver: false` บน lane `subagent` ระดับ global
+จากนั้นรันขั้นตอนประกาศและโพสต์คำตอบประกาศไปยังช่องแชตของผู้ร้องขอ
-ความพร้อมใช้งานขึ้นกับนโยบายเครื่องมือที่มีผลของผู้เรียก โปรไฟล์ `coding` และ
+ความพร้อมใช้งานขึ้นอยู่กับนโยบายเครื่องมือที่มีผลของผู้เรียก โปรไฟล์ `coding` และ
`full` เปิดเผย `sessions_spawn` ตามค่าเริ่มต้น โปรไฟล์ `messaging`
-ไม่เปิดเผย ให้เพิ่ม `tools.alsoAllow: ["sessions_spawn", "sessions_yield",
-"subagents"]` หรือใช้ `tools.profile: "coding"` สำหรับเอเจนต์ที่ควรมอบหมาย
-งานได้ นโยบายอนุญาต/ปฏิเสธของช่อง/กลุ่ม, ผู้ให้บริการ, sandbox และรายเอเจนต์
-ยังสามารถนำเครื่องมือออกหลังขั้นตอนโปรไฟล์ได้ ใช้ `/tools` จาก
-เซสชันเดียวกันเพื่อยืนยันรายการเครื่องมือที่มีผล
+ไม่เปิดเผย; เพิ่ม `tools.alsoAllow: ["sessions_spawn", "sessions_yield",
+"subagents"]` หรือใช้ `tools.profile: "coding"` สำหรับเอเจนต์ที่ควรมอบหมายงานได้
+นโยบาย allow/deny ของ channel/group, provider, sandbox และรายเอเจนต์ยังสามารถ
+ลบเครื่องมือนี้หลังขั้นตอนโปรไฟล์ได้ ใช้ `/tools` จากเซสชันเดียวกันเพื่อยืนยันรายการเครื่องมือที่มีผล
**ค่าเริ่มต้น:**
-- **โมเดล:** สืบทอดจากผู้เรียก เว้นแต่คุณตั้งค่า `agents.defaults.subagents.model` (หรือ `agents.list[].subagents.model` รายเอเจนต์); ค่า `sessions_spawn.model` ที่ระบุชัดเจนยังชนะอยู่
-- **Thinking:** สืบทอดจากผู้เรียก เว้นแต่คุณตั้งค่า `agents.defaults.subagents.thinking` (หรือ `agents.list[].subagents.thinking` รายเอเจนต์); ค่า `sessions_spawn.thinking` ที่ระบุชัดเจนยังชนะอยู่
-- **ระยะหมดเวลาการรัน:** หากละเว้น `sessions_spawn.runTimeoutSeconds` OpenClaw จะใช้ `agents.defaults.subagents.runTimeoutSeconds` เมื่อตั้งค่าไว้ มิฉะนั้นจะถอยกลับเป็น `0` (ไม่มีระยะหมดเวลา)
+- **โมเดล:** สืบทอดจากผู้เรียก เว้นแต่คุณตั้ง `agents.defaults.subagents.model` (หรือ `agents.list[].subagents.model` รายเอเจนต์); `sessions_spawn.model` ที่ระบุชัดเจนยังคงชนะ
+- **Thinking:** สืบทอดจากผู้เรียก เว้นแต่คุณตั้ง `agents.defaults.subagents.thinking` (หรือ `agents.list[].subagents.thinking` รายเอเจนต์); `sessions_spawn.thinking` ที่ระบุชัดเจนยังคงชนะ
+- **ระยะหมดเวลาการรัน:** หากละ `sessions_spawn.runTimeoutSeconds`, OpenClaw จะใช้ `agents.defaults.subagents.runTimeoutSeconds` เมื่อมีการตั้งค่าไว้; มิฉะนั้นจะ fallback เป็น `0` (ไม่มี timeout)
### พารามิเตอร์เครื่องมือ
@@ -152,83 +142,82 @@ x-i18n:
ป้ายกำกับที่มนุษย์อ่านได้แบบเลือกได้
- สร้างภายใต้รหัสเอเจนต์อื่นเมื่อ `subagents.allowAgents` อนุญาต
+ Spawn ภายใต้ id เอเจนต์อื่นเมื่อ `subagents.allowAgents` อนุญาต
- `acp` มีไว้เฉพาะสำหรับ harness ACP ภายนอก (`claude`, `droid`, `gemini`, `opencode` หรือ Codex ACP/acpx ที่ร้องขออย่างชัดเจน) และสำหรับรายการ `agents.list[]` ที่ `runtime.type` เป็น `acp`
+ `acp` ใช้เฉพาะสำหรับ harness ACP ภายนอก (`claude`, `droid`, `gemini`, `opencode`, หรือ Codex ACP/acpx ที่ร้องขออย่างชัดเจน) และสำหรับรายการ `agents.list[]` ที่ `runtime.type` เป็น `acp`
- สำหรับ ACP เท่านั้น ดำเนินเซสชัน harness ACP ที่มีอยู่ต่อเมื่อ `runtime: "acp"`; ถูกละเว้นสำหรับการสร้างเอเจนต์ย่อยแบบเนทีฟ
+ เฉพาะ ACP Resume เซสชัน harness ACP ที่มีอยู่เมื่อ `runtime: "acp"`; ถูกละเว้นสำหรับการ spawn เอเจนต์ย่อยแบบ native
- สำหรับ ACP เท่านั้น สตรีมเอาต์พุตการรัน ACP ไปยังเซสชันแม่เมื่อ `runtime: "acp"`; ละเว้นสำหรับการสร้างเอเจนต์ย่อยแบบเนทีฟ
+ เฉพาะ ACP สตรีมเอาต์พุตการรัน ACP ไปยังเซสชันแม่เมื่อ `runtime: "acp"`; ละเว้นสำหรับการ spawn เอเจนต์ย่อยแบบ native
- แทนที่โมเดลเอเจนต์ย่อย ค่าที่ไม่ถูกต้องจะถูกข้าม และเอเจนต์ย่อยจะรันบนโมเดลค่าเริ่มต้นพร้อมคำเตือนในผลลัพธ์เครื่องมือ
+ Override โมเดลเอเจนต์ย่อย ค่าที่ไม่ถูกต้องจะถูกข้ามและเอเจนต์ย่อยจะรันบนโมเดลค่าเริ่มต้นพร้อมคำเตือนในผลลัพธ์เครื่องมือ
- แทนที่ระดับ thinking สำหรับการรันเอเจนต์ย่อย
+ Override ระดับ thinking สำหรับการรันเอเจนต์ย่อย
- มีค่าเริ่มต้นเป็น `agents.defaults.subagents.runTimeoutSeconds` เมื่อตั้งค่าไว้ มิฉะนั้นเป็น `0` เมื่อตั้งค่าแล้ว การรันเอเจนต์ย่อยจะถูกยกเลิกหลังจาก N วินาที
+ ค่าเริ่มต้นเป็น `agents.defaults.subagents.runTimeoutSeconds` เมื่อมีการตั้งค่า มิฉะนั้นเป็น `0` เมื่อมีการตั้งค่า การรันเอเจนต์ย่อยจะถูก abort หลัง N วินาที
- เมื่อเป็น `true` จะร้องขอการผูกเธรดของช่องสำหรับเซสชันเอเจนต์ย่อยนี้
+ เมื่อเป็น `true` จะขอการผูกเธรดของช่องสำหรับเซสชันเอเจนต์ย่อยนี้
- หาก `thread: true` และละเว้น `mode` ค่าเริ่มต้นจะกลายเป็น `session` `mode: "session"` ต้องใช้ `thread: true`
+ หากละ `thread: true` และ `mode` ค่าเริ่มต้นจะกลายเป็น `session` `mode: "session"` ต้องใช้ `thread: true`
- `"delete"` จะเก็บถาวรทันทีหลังประกาศ (ยังคงเก็บทรานสคริปต์ผ่านการเปลี่ยนชื่อ)
+ `"delete"` archive ทันทีหลังประกาศ (ยังคงเก็บ transcript ไว้ผ่านการเปลี่ยนชื่อ)
- `require` ปฏิเสธการสร้าง เว้นแต่รันไทม์ลูกเป้าหมายจะอยู่ใน sandbox
+ `require` ปฏิเสธการ spawn เว้นแต่ runtime ลูกเป้าหมายอยู่ใน sandbox
- `fork` แตกแขนงทรานสคริปต์ปัจจุบันของผู้ร้องขอไปยังเซสชันลูก สำหรับเอเจนต์ย่อยแบบเนทีฟเท่านั้น การสร้างที่ผูกกับเธรดมีค่าเริ่มต้นเป็น `fork`; การสร้างที่ไม่ใช่เธรดมีค่าเริ่มต้นเป็น `isolated`
+ `fork` แตกกิ่ง transcript ปัจจุบันของผู้ร้องขอไปยังเซสชันลูก เอเจนต์ย่อยแบบ native เท่านั้น การ spawn ที่ผูกกับเธรดมีค่าเริ่มต้นเป็น `fork`; การ spawn ที่ไม่ใช่เธรดมีค่าเริ่มต้นเป็น `isolated`
`sessions_spawn` ไม่รับพารามิเตอร์การส่งมอบผ่านช่อง (`target`,
`channel`, `to`, `threadId`, `replyTo`, `transport`) สำหรับการส่งมอบ ให้ใช้
-`message`/`sessions_send` จากการรันที่สร้างขึ้น
+`message`/`sessions_send` จากการรันที่ spawn แล้ว
## เซสชันที่ผูกกับเธรด
-เมื่อเปิดใช้การผูกเธรดสำหรับช่อง เอเจนต์ย่อยสามารถคงการผูก
-กับเธรดไว้ เพื่อให้ข้อความติดตามผลของผู้ใช้ในเธรดนั้นถูกส่งต่อไปยัง
-เซสชันเอเจนต์ย่อยเดียวกัน
+เมื่อเปิดใช้งานการผูกเธรดสำหรับช่อง เอเจนต์ย่อยสามารถคงการผูกกับเธรดไว้ได้
+เพื่อให้ข้อความผู้ใช้ติดตามผลในเธรดนั้นยัง route ไปยังเซสชันเอเจนต์ย่อยเดียวกัน
### ช่องที่รองรับเธรด
-**Discord** เป็นช่องเดียวที่รองรับอยู่ในขณะนี้ รองรับ
-เซสชันเอเจนต์ย่อยแบบถาวรที่ผูกกับเธรด (`sessions_spawn` พร้อม
+**Discord** เป็นช่องเดียวที่รองรับอยู่ในปัจจุบัน รองรับ
+เซสชัน subagent แบบคงอยู่ที่ผูกกับเธรด (`sessions_spawn` พร้อม
`thread: true`), การควบคุมเธรดด้วยตนเอง (`/focus`, `/unfocus`, `/agents`,
-`/session idle`, `/session max-age`) และคีย์ของอะแดปเตอร์
+`/session idle`, `/session max-age`) และคีย์ adapter
`channels.discord.threadBindings.enabled`,
`channels.discord.threadBindings.idleHours`,
-`channels.discord.threadBindings.maxAgeHours` และ
+`channels.discord.threadBindings.maxAgeHours`, และ
`channels.discord.threadBindings.spawnSessions`
### โฟลว์ด่วน
-
- `sessions_spawn` พร้อม `thread: true` (และเลือกใส่ `mode: "session"` ได้)
+
+ `sessions_spawn` พร้อม `thread: true` (และ `mode: "session"` แบบเลือกได้)
-
- OpenClaw สร้างหรือผูกเธรดกับเป้าหมายเซสชันนั้นในช่องที่ใช้งานอยู่
+
+ OpenClaw สร้างหรือผูกเธรดกับ target ของเซสชันนั้นในช่องที่ใช้งานอยู่
-
- การตอบกลับและข้อความติดตามผลในเธรดนั้นจะถูกส่งต่อไปยังเซสชันที่ผูกไว้
+
+ การตอบกลับและข้อความติดตามผลในเธรดนั้น route ไปยังเซสชันที่ผูกไว้
-
- ใช้ `/session idle` เพื่อตรวจสอบ/อัปเดตการยกเลิกโฟกัสอัตโนมัติเมื่อไม่มีกิจกรรม และ
- `/session max-age` เพื่อควบคุมขีดจำกัดสูงสุดแบบตายตัว
+
+ ใช้ `/session idle` เพื่อตรวจสอบ/อัปเดต auto-unfocus เมื่อไม่มีความเคลื่อนไหว และ
+ `/session max-age` เพื่อควบคุม hard cap
-
- ใช้ `/unfocus` เพื่อแยกออกด้วยตนเอง
+
+ ใช้ `/unfocus` เพื่อ detach ด้วยตนเอง
@@ -236,58 +225,58 @@ x-i18n:
| คำสั่ง | ผลลัพธ์ |
| ------------------ | --------------------------------------------------------------------- |
-| `/focus ` | ผูกเธรดปัจจุบัน (หรือสร้างใหม่) กับเป้าหมายตัวแทนย่อย/เซสชัน |
-| `/unfocus` | ลบการผูกสำหรับเธรดที่ถูกผูกปัจจุบัน |
-| `/agents` | แสดงรายการการทำงานที่ใช้งานอยู่และสถานะการผูก (`thread:` หรือ `unbound`) |
-| `/session idle` | ตรวจสอบ/อัปเดตการเลิกโฟกัสอัตโนมัติเมื่อไม่ได้ใช้งาน (เฉพาะเธรดที่ถูกผูกและถูกโฟกัส) |
-| `/session max-age` | ตรวจสอบ/อัปเดตเพดานเวลาสูงสุดแบบบังคับ (เฉพาะเธรดที่ถูกผูกและถูกโฟกัส) |
+| `/focus ` | ผูกเธรดปัจจุบัน (หรือสร้างเธรดใหม่) เข้ากับเป้าหมายเอเจนต์ย่อย/เซสชัน |
+| `/unfocus` | ลบการผูกสำหรับเธรดที่ถูกผูกอยู่ในปัจจุบัน |
+| `/agents` | แสดงรายการงานที่ทำงานอยู่และสถานะการผูก (`thread:` หรือ `unbound`) |
+| `/session idle` | ตรวจสอบ/อัปเดตการยกเลิกโฟกัสอัตโนมัติเมื่อไม่ได้ใช้งาน (เฉพาะเธรดที่ถูกผูกและโฟกัสอยู่) |
+| `/session max-age` | ตรวจสอบ/อัปเดตขีดจำกัดสูงสุดแบบบังคับ (เฉพาะเธรดที่ถูกผูกและโฟกัสอยู่) |
### สวิตช์การกำหนดค่า
-- **ค่าเริ่มต้นส่วนกลาง:** `session.threadBindings.enabled`, `session.threadBindings.idleHours`, `session.threadBindings.maxAgeHours`.
-- **คีย์การแทนที่ของช่องทางและการผูกอัตโนมัติเมื่อ spawn** ขึ้นอยู่กับอะแดปเตอร์ ดู [ช่องทางที่รองรับเธรด](#thread-supporting-channels) ด้านบน
+- **ค่าเริ่มต้นทั่วระบบ:** `session.threadBindings.enabled`, `session.threadBindings.idleHours`, `session.threadBindings.maxAgeHours`.
+- **คีย์แทนที่ระดับช่องทางและคีย์ผูกอัตโนมัติเมื่อสร้าง** ขึ้นอยู่กับอะแดปเตอร์ ดู [ช่องทางที่รองรับเธรด](#thread-supporting-channels) ด้านบน
-ดู [อ้างอิงการกำหนดค่า](/th/gateway/configuration-reference) และ
+ดู [ข้อมูลอ้างอิงการกำหนดค่า](/th/gateway/configuration-reference) และ
[คำสั่ง Slash](/th/tools/slash-commands) สำหรับรายละเอียดอะแดปเตอร์ปัจจุบัน
-### รายการอนุญาต
+### รายการที่อนุญาต
- รายการ id ของเอเจนต์ที่สามารถกำหนดเป้าหมายผ่าน `agentId` แบบชัดเจน (`["*"]` อนุญาตทั้งหมด) ค่าเริ่มต้น: เฉพาะเอเจนต์ผู้ร้องขอเท่านั้น หากคุณตั้งค่ารายการและยังต้องการให้ผู้ร้องขอ spawn ตัวเองด้วย `agentId` ให้รวม id ของผู้ร้องขอไว้ในรายการ
+ รายการ ID เอเจนต์ที่สามารถกำหนดเป็นเป้าหมายผ่าน `agentId` แบบชัดเจน (`["*"]` อนุญาตทุกรายการ) ค่าเริ่มต้น: เฉพาะเอเจนต์ผู้ร้องขอ หากคุณตั้งค่ารายการและยังต้องการให้ผู้ร้องขอสร้างตัวเองด้วย `agentId` ให้ใส่ ID ของผู้ร้องขอไว้ในรายการ
- รายการอนุญาตเอเจนต์เป้าหมายเริ่มต้นที่ใช้เมื่อเอเจนต์ผู้ร้องขอไม่ได้ตั้งค่า `subagents.allowAgents` ของตัวเอง
+ รายการเอเจนต์เป้าหมายเริ่มต้นที่อนุญาต ซึ่งใช้เมื่อเอเจนต์ผู้ร้องขอไม่ได้ตั้งค่า `subagents.allowAgents` ของตัวเอง
- บล็อกการเรียก `sessions_spawn` ที่ละเว้น `agentId` (บังคับให้เลือกโปรไฟล์อย่างชัดเจน) การแทนที่รายเอเจนต์: `agents.list[].subagents.requireAgentId`
+ บล็อกการเรียก `sessions_spawn` ที่ละ `agentId` (บังคับให้เลือกโปรไฟล์อย่างชัดเจน) การแทนที่รายเอเจนต์: `agents.list[].subagents.requireAgentId`
-หากเซสชันผู้ร้องขออยู่ในแซนด์บ็อกซ์ `sessions_spawn` จะปฏิเสธเป้าหมาย
-ที่จะทำงานแบบไม่อยู่ในแซนด์บ็อกซ์
+หากเซสชันของผู้ร้องขออยู่ใน sandbox, `sessions_spawn` จะปฏิเสธเป้าหมาย
+ที่จะทำงานแบบไม่อยู่ใน sandbox
-### การค้นพบ
+### การค้นหา
-ใช้ `agents_list` เพื่อดูว่า id เอเจนต์ใดได้รับอนุญาตสำหรับ
-`sessions_spawn` ในปัจจุบัน คำตอบมี model ที่มีผลจริงของเอเจนต์แต่ละตัวในรายการ
-และข้อมูลเมตารันไทม์ที่ฝังไว้ เพื่อให้ผู้เรียกแยกความแตกต่างระหว่าง PI, เซิร์ฟเวอร์แอป Codex
+ใช้ `agents_list` เพื่อดูว่า ID เอเจนต์ใดได้รับอนุญาตสำหรับ
+`sessions_spawn` อยู่ในขณะนี้ การตอบกลับมีโมเดลที่มีผลจริงของเอเจนต์แต่ละรายการ
+และเมทาดาทารันไทม์ที่ฝังอยู่ เพื่อให้ผู้เรียกแยกแยะ PI, เซิร์ฟเวอร์แอป Codex
และรันไทม์เนทีฟอื่นที่กำหนดค่าไว้ได้
### การเก็บถาวรอัตโนมัติ
-- เซสชันตัวแทนย่อยจะถูกเก็บถาวรโดยอัตโนมัติหลัง `agents.defaults.subagents.archiveAfterMinutes` (ค่าเริ่มต้น `60`)
+- เซสชันเอเจนต์ย่อยจะถูกเก็บถาวรโดยอัตโนมัติหลังจาก `agents.defaults.subagents.archiveAfterMinutes` (ค่าเริ่มต้น `60`)
- การเก็บถาวรใช้ `sessions.delete` และเปลี่ยนชื่อทรานสคริปต์เป็น `*.deleted.` (โฟลเดอร์เดียวกัน)
-- `cleanup: "delete"` เก็บถาวรทันทีหลังประกาศ (ยังคงเก็บทรานสคริปต์ไว้ผ่านการเปลี่ยนชื่อ)
-- การเก็บถาวรอัตโนมัติเป็นแบบพยายามให้ดีที่สุด ตัวจับเวลาที่ค้างอยู่จะหายไปหาก gateway รีสตาร์ต
-- `runTimeoutSeconds` จะไม่เก็บถาวรอัตโนมัติ แต่จะหยุดเฉพาะการทำงานเท่านั้น เซสชันยังคงอยู่จนกว่าจะเก็บถาวรอัตโนมัติ
-- การเก็บถาวรอัตโนมัติใช้กับเซสชันระดับความลึก 1 และระดับความลึก 2 เท่า ๆ กัน
-- การล้างข้อมูลเบราว์เซอร์แยกจากการล้างข้อมูลเก็บถาวร: แท็บ/กระบวนการเบราว์เซอร์ที่ติดตามจะถูกปิดแบบพยายามให้ดีที่สุดเมื่อการทำงานเสร็จสิ้น แม้ว่าทรานสคริปต์/ระเบียนเซสชันจะถูกเก็บไว้ก็ตาม
+- `cleanup: "delete"` จะเก็บถาวรทันทีหลังประกาศ (ยังคงเก็บทรานสคริปต์ไว้ผ่านการเปลี่ยนชื่อ)
+- การเก็บถาวรอัตโนมัติเป็นแบบ best-effort; ตัวจับเวลาที่ค้างอยู่จะหายไปหาก Gateway รีสตาร์ท
+- `runTimeoutSeconds` จะไม่เก็บถาวรอัตโนมัติ; จะหยุดเฉพาะงานที่ทำงานอยู่เท่านั้น เซสชันยังคงอยู่จนกว่าจะเก็บถาวรอัตโนมัติ
+- การเก็บถาวรอัตโนมัติใช้กับเซสชันระดับความลึก 1 และระดับความลึก 2 เท่ากัน
+- การล้างเบราว์เซอร์แยกจากการล้างการเก็บถาวร: แท็บ/โปรเซสของเบราว์เซอร์ที่ติดตามไว้จะถูกปิดแบบ best-effort เมื่องานทำงานเสร็จ แม้จะเก็บระเบียนทรานสคริปต์/เซสชันไว้ก็ตาม
-## ตัวแทนย่อยแบบซ้อน
+## เอเจนต์ย่อยแบบซ้อนกัน
-โดยค่าเริ่มต้น ตัวแทนย่อยไม่สามารถ spawn ตัวแทนย่อยของตัวเองได้
+ตามค่าเริ่มต้น เอเจนต์ย่อยไม่สามารถสร้างเอเจนต์ย่อยของตัวเองได้
(`maxSpawnDepth: 1`) ตั้งค่า `maxSpawnDepth: 2` เพื่อเปิดใช้การซ้อนหนึ่งระดับ
-ซึ่งคือ **รูปแบบ orchestrator**: หลัก → ตัวแทนย่อย orchestrator →
-ตัวแทนย่อยของตัวแทนย่อยที่เป็น worker
+นั่นคือ **รูปแบบตัวประสานงาน**: หลัก → เอเจนต์ย่อยตัวประสานงาน →
+เอเจนต์ย่อยของเอเจนต์ย่อยที่เป็นผู้ปฏิบัติงาน
```json5
{
@@ -306,140 +295,141 @@ x-i18n:
### ระดับความลึก
-| ความลึก | รูปแบบคีย์เซสชัน | บทบาท | spawn ได้หรือไม่ |
+| ความลึก | รูปแบบคีย์เซสชัน | บทบาท | สร้างได้หรือไม่ |
| ----- | -------------------------------------------- | --------------------------------------------- | ---------------------------- |
| 0 | `agent::main` | เอเจนต์หลัก | เสมอ |
-| 1 | `agent::subagent:` | ตัวแทนย่อย (orchestrator เมื่ออนุญาตความลึก 2) | เฉพาะเมื่อ `maxSpawnDepth >= 2` |
-| 2 | `agent::subagent::subagent:` | ตัวแทนย่อยของตัวแทนย่อย (worker ปลายทาง) | ไม่เคย |
+| 1 | `agent::subagent:` | เอเจนต์ย่อย (ตัวประสานงานเมื่ออนุญาตความลึก 2) | เฉพาะเมื่อ `maxSpawnDepth >= 2` |
+| 2 | `agent::subagent::subagent:` | เอเจนต์ย่อยของเอเจนต์ย่อย (ผู้ปฏิบัติงานปลายทาง) | ไม่เคย |
-### สายการประกาศ
+### ลำดับการประกาศ
-ผลลัพธ์ไหลกลับขึ้นไปตามสาย:
+ผลลัพธ์ไหลย้อนกลับขึ้นตามลำดับ:
-1. worker ระดับความลึก 2 เสร็จสิ้น → ประกาศไปยังพาเรนต์ของตน (orchestrator ระดับความลึก 1)
-2. orchestrator ระดับความลึก 1 ได้รับประกาศ สังเคราะห์ผลลัพธ์ เสร็จสิ้น → ประกาศไปยังหลัก
-3. เอเจนต์หลักได้รับประกาศและส่งต่อให้ผู้ใช้
+1. ผู้ปฏิบัติงานระดับความลึก 2 เสร็จสิ้น → ประกาศไปยังพาเรนต์ของตัวเอง (ตัวประสานงานระดับความลึก 1)
+2. ตัวประสานงานระดับความลึก 1 ได้รับประกาศ สังเคราะห์ผลลัพธ์ เสร็จสิ้น → ประกาศไปยังหลัก
+3. เอเจนต์หลักได้รับประกาศและส่งให้ผู้ใช้
-แต่ละระดับจะเห็นเฉพาะประกาศจากลูกโดยตรงของตน
+แต่ละระดับเห็นเฉพาะประกาศจากลูกโดยตรงของตัวเองเท่านั้น
-**คำแนะนำด้านปฏิบัติการ:** เริ่มงานลูกหนึ่งครั้งแล้วรอเหตุการณ์เสร็จสิ้น
-แทนการสร้างลูป polling รอบ `sessions_list`,
+**คำแนะนำด้านการปฏิบัติการ:** เริ่มงานลูกหนึ่งครั้งและรอเหตุการณ์เสร็จสิ้น
+แทนการสร้างลูปโพลรอบ `sessions_list`,
`sessions_history`, `/subagents list` หรือคำสั่ง sleep ของ `exec`
-`sessions_list` และ `/subagents list` ทำให้ความสัมพันธ์เซสชันลูก
-มุ่งเน้นงานที่ยังทำงานอยู่ ลูกที่ยังทำงานอยู่จะยังแนบอยู่ ลูกที่สิ้นสุดแล้วจะยัง
-มองเห็นได้ในหน้าต่างล่าสุดช่วงสั้น ๆ และลิงก์ลูกที่ค้างอยู่เฉพาะใน store จะถูก
-ละเว้นหลังพ้นหน้าต่างความสดใหม่ วิธีนี้ป้องกันไม่ให้ข้อมูลเมตา `spawnedBy` /
-`parentSessionKey` เก่าทำให้ลูกหลอนกลับมาหลัง
-รีสตาร์ต หากเหตุการณ์เสร็จสิ้นของลูกมาถึงหลังจากคุณส่ง
-คำตอบสุดท้ายไปแล้ว การติดตามผลที่ถูกต้องคือโทเค็นเงียบที่ตรงเป๊ะ
+`sessions_list` และ `/subagents list` จะคงความสัมพันธ์เซสชันลูก
+ให้โฟกัสกับงานสด ลูกที่ยังทำงานอยู่ยังคงแนบอยู่ ลูกที่จบแล้วจะยัง
+มองเห็นได้ในหน้าต่างรายการล่าสุดช่วงสั้น ๆ และลิงก์ลูกที่มีเฉพาะในสโตร์และเก่าแล้วจะ
+ถูกละเว้นหลังจากหน้าต่างความสดใหม่ของมัน วิธีนี้ป้องกันไม่ให้เมทาดาทา `spawnedBy` /
+`parentSessionKey` เก่าชุบชีวิตลูกเงาหลัง
+รีสตาร์ท หากเหตุการณ์เสร็จสิ้นของลูกมาถึงหลังจากคุณส่ง
+คำตอบสุดท้ายแล้ว การติดตามผลที่ถูกต้องคือโทเคนเงียบตามตัวอักษร
`NO_REPLY` / `no_reply`
### นโยบายเครื่องมือตามความลึก
-- บทบาทและขอบเขตการควบคุมถูกเขียนลงในข้อมูลเมตาเซสชันตอน spawn วิธีนี้ช่วยป้องกันไม่ให้คีย์เซสชันแบบแบนหรือที่กู้คืนแล้วกลับมาได้สิทธิ์ orchestrator โดยไม่ตั้งใจ
-- **ความลึก 1 (orchestrator เมื่อ `maxSpawnDepth >= 2`):** ได้รับ `sessions_spawn`, `subagents`, `sessions_list`, `sessions_history` เพื่อให้จัดการลูกของตัวเองได้ เครื่องมือเซสชัน/ระบบอื่นยังถูกปฏิเสธ
+- บทบาทและขอบเขตการควบคุมถูกเขียนลงในเมทาดาทาเซสชันตอนสร้าง ซึ่งทำให้คีย์เซสชันแบบแบนหรือที่กู้คืนมาไม่สามารถได้สิทธิ์ตัวประสานงานกลับคืนโดยไม่ตั้งใจ
+- **ความลึก 1 (ตัวประสานงาน เมื่อ `maxSpawnDepth >= 2`):** ได้รับ `sessions_spawn`, `subagents`, `sessions_list`, `sessions_history` เพื่อให้จัดการลูกของตัวเองได้ เครื่องมือเซสชัน/ระบบอื่นยังคงถูกปฏิเสธ
- **ความลึก 1 (ปลายทาง เมื่อ `maxSpawnDepth == 1`):** ไม่มีเครื่องมือเซสชัน (พฤติกรรมเริ่มต้นปัจจุบัน)
-- **ความลึก 2 (worker ปลายทาง):** ไม่มีเครื่องมือเซสชัน — `sessions_spawn` ถูกปฏิเสธเสมอที่ความลึก 2 ไม่สามารถ spawn ลูกเพิ่มเติมได้
+- **ความลึก 2 (ผู้ปฏิบัติงานปลายทาง):** ไม่มีเครื่องมือเซสชัน — `sessions_spawn` ถูกปฏิเสธเสมอที่ความลึก 2 ไม่สามารถสร้างลูกต่อได้
-### ขีดจำกัดการ spawn รายเอเจนต์
+### ขีดจำกัดการสร้างรายเอเจนต์
-แต่ละเซสชันเอเจนต์ (ที่ความลึกใดก็ได้) สามารถมีลูกที่ใช้งานอยู่ได้สูงสุด `maxChildrenPerAgent`
-(ค่าเริ่มต้น `5`) ในเวลาเดียวกัน วิธีนี้ป้องกันการกระจายงานออกไปมากเกินควบคุม
-จาก orchestrator เดียว
+แต่ละเซสชันเอเจนต์ (ทุกระดับความลึก) มีลูกที่ทำงานอยู่ได้สูงสุด `maxChildrenPerAgent`
+(ค่าเริ่มต้น `5`) ในแต่ละครั้ง วิธีนี้ป้องกันการกระจายงานเกินควบคุม
+จากตัวประสานงานเดียว
-### การหยุดแบบต่อเนื่อง
+### การหยุดแบบลูกโซ่
-การหยุด orchestrator ระดับความลึก 1 จะหยุดลูกระดับความลึก 2
+การหยุดตัวประสานงานระดับความลึก 1 จะหยุดลูกระดับความลึก 2
ทั้งหมดของมันโดยอัตโนมัติ:
-- `/stop` ในแชทหลักหยุดเอเจนต์ระดับความลึก 1 ทั้งหมดและส่งผลต่อเนื่องไปยังลูกระดับความลึก 2 ของพวกมัน
-- `/subagents kill ` หยุดตัวแทนย่อยเฉพาะตัวและส่งผลต่อเนื่องไปยังลูกของมัน
-- `/subagents kill all` หยุดตัวแทนย่อยทั้งหมดสำหรับผู้ร้องขอและส่งผลต่อเนื่อง
+- `/stop` ในแชตหลักหยุดเอเจนต์ระดับความลึก 1 ทั้งหมดและหยุดแบบลูกโซ่ไปยังลูกระดับความลึก 2 ของพวกเขา
+- `/subagents kill ` หยุดเอเจนต์ย่อยที่ระบุและหยุดแบบลูกโซ่ไปยังลูกของมัน
+- `/subagents kill all` หยุดเอเจนต์ย่อยทั้งหมดสำหรับผู้ร้องขอและหยุดแบบลูกโซ่
## การยืนยันตัวตน
-การยืนยันตัวตนของตัวแทนย่อยถูก resolve ด้วย **id เอเจนต์** ไม่ใช่ชนิดเซสชัน:
+การยืนยันตัวตนของเอเจนต์ย่อยถูกแก้ตาม **ID เอเจนต์** ไม่ใช่ตามประเภทเซสชัน:
-- คีย์เซสชันตัวแทนย่อยคือ `agent::subagent:`
-- store การยืนยันตัวตนโหลดจาก `agentDir` ของเอเจนต์นั้น
-- โปรไฟล์การยืนยันตัวตนของเอเจนต์หลักถูกรวมเข้ามาเป็น **fallback** โปรไฟล์เอเจนต์จะแทนที่โปรไฟล์หลักเมื่อมีความขัดแย้ง
+- คีย์เซสชันเอเจนต์ย่อยคือ `agent::subagent:`
+- สโตร์การยืนยันตัวตนถูกโหลดจาก `agentDir` ของเอเจนต์นั้น
+- โปรไฟล์การยืนยันตัวตนของเอเจนต์หลักถูกผสานเข้าเป็น **fallback**; โปรไฟล์เอเจนต์จะแทนที่โปรไฟล์หลักเมื่อมีข้อขัดแย้ง
-การรวมเป็นแบบเพิ่มเข้าไป ดังนั้นโปรไฟล์หลักจะพร้อมใช้งานเป็น
-fallback เสมอ ยังไม่รองรับการยืนยันตัวตนแบบแยกขาดกันทั้งหมดต่อเอเจนต์
+การผสานเป็นแบบเพิ่มเข้าไป ดังนั้นโปรไฟล์หลักจึงพร้อมใช้งานเป็น
+fallback เสมอ ยังไม่รองรับการยืนยันตัวตนแบบแยกขาดต่อเอเจนต์อย่างสมบูรณ์
## การประกาศ
-ตัวแทนย่อยรายงานกลับผ่านขั้นตอนประกาศ:
+เอเจนต์ย่อยรายงานกลับผ่านขั้นตอนประกาศ:
-- ขั้นตอนประกาศทำงานภายในเซสชันตัวแทนย่อย (ไม่ใช่เซสชันผู้ร้องขอ)
-- หากตัวแทนย่อยตอบกลับตรงกับ `ANNOUNCE_SKIP` จะไม่มีการโพสต์อะไร
-- หากข้อความผู้ช่วยล่าสุดเป็นโทเค็นเงียบที่ตรงเป๊ะ `NO_REPLY` / `no_reply` เอาต์พุตประกาศจะถูกระงับ แม้ว่าก่อนหน้านั้นจะมีความคืบหน้าที่มองเห็นได้ก็ตาม
+- ขั้นตอนประกาศทำงานภายในเซสชันเอเจนต์ย่อย (ไม่ใช่เซสชันผู้ร้องขอ)
+- หากเอเจนต์ย่อยตอบกลับตรงกับ `ANNOUNCE_SKIP` จะไม่มีการโพสต์อะไร
+- หากข้อความผู้ช่วยล่าสุดเป็นโทเคนเงียบตรงตัว `NO_REPLY` / `no_reply` เอาต์พุตประกาศจะถูกระงับ แม้จะเคยมีความคืบหน้าที่มองเห็นได้ก่อนหน้านั้น
การส่งมอบขึ้นอยู่กับความลึกของผู้ร้องขอ:
- เซสชันผู้ร้องขอระดับบนสุดใช้การเรียก `agent` แบบติดตามผลพร้อมการส่งมอบภายนอก (`deliver=true`)
-- เซสชันตัวแทนย่อยของผู้ร้องขอแบบซ้อนจะได้รับการฉีดติดตามผลภายใน (`deliver=false`) เพื่อให้ orchestrator สามารถสังเคราะห์ผลลัพธ์ลูกภายในเซสชันได้
-- หากเซสชันตัวแทนย่อยของผู้ร้องขอแบบซ้อนหายไป OpenClaw จะ fallback ไปยังผู้ร้องขอของเซสชันนั้นเมื่อมีอยู่
+- เซสชันเอเจนต์ย่อยผู้ร้องขอแบบซ้อนกันจะได้รับการฉีดติดตามผลภายใน (`deliver=false`) เพื่อให้ตัวประสานงานสังเคราะห์ผลลัพธ์ลูกภายในเซสชันได้
+- หากเซสชันเอเจนต์ย่อยผู้ร้องขอแบบซ้อนกันหายไป OpenClaw จะ fallback ไปยังผู้ร้องขอของเซสชันนั้นเมื่อมี
สำหรับเซสชันผู้ร้องขอระดับบนสุด การส่งมอบโดยตรงในโหมดเสร็จสิ้นจะ
-resolve เส้นทางการสนทนา/เธรดที่ผูกไว้และการแทนที่ hook ก่อน จากนั้นจึงเติม
-ฟิลด์เป้าหมายช่องทางที่ขาดหายจากเส้นทางที่จัดเก็บไว้ของเซสชันผู้ร้องขอ
-วิธีนี้ทำให้การเสร็จสิ้นอยู่ในแชท/หัวข้อที่ถูกต้อง แม้เมื่อต้นทางการเสร็จสิ้น
-ระบุเพียงช่องทางเท่านั้น
+แก้เส้นทางบทสนทนา/เธรดที่ถูกผูกและการแทนที่ของ hook ก่อน จากนั้นเติม
+ฟิลด์เป้าหมายช่องทางที่หายไปจากเส้นทางที่เซสชันผู้ร้องขอเก็บไว้
+วิธีนี้ทำให้การเสร็จสิ้นอยู่ในแชต/หัวข้อที่ถูกต้อง แม้ต้นทางการเสร็จสิ้น
+จะระบุเฉพาะช่องทางก็ตาม
-การรวมผลการเสร็จสิ้นของลูกถูกจำกัดขอบเขตไว้ที่การทำงานผู้ร้องขอปัจจุบันเมื่อ
-สร้างผลลัพธ์การเสร็จสิ้นแบบซ้อน ช่วยป้องกันไม่ให้เอาต์พุตลูกจากการทำงานก่อนหน้า
-ที่ค้างอยู่รั่วไหลเข้ามาในประกาศปัจจุบัน คำตอบประกาศจะคง
-การกำหนดเส้นทางเธรด/หัวข้อไว้เมื่อมีอยู่ในอะแดปเตอร์ช่องทาง
+การรวมผลการเสร็จสิ้นของลูกถูกจำกัดขอบเขตไว้ที่งานผู้ร้องขอปัจจุบันเมื่อ
+สร้างข้อค้นพบการเสร็จสิ้นแบบซ้อนกัน เพื่อป้องกันไม่ให้เอาต์พุตลูกจากงานก่อนหน้า
+ที่เก่าแล้วรั่วไหลเข้าไปในการประกาศปัจจุบัน การตอบกลับประกาศจะคง
+การกำหนดเส้นทางเธรด/หัวข้อเมื่อมีในอะแดปเตอร์ช่องทาง
-### บริบทการประกาศ
+### บริบทประกาศ
-บริบทการประกาศถูกทำให้เป็นปกติเป็นบล็อกเหตุการณ์ภายในที่เสถียร:
+บริบทประกาศถูกทำให้เป็นมาตรฐานเป็นบล็อกเหตุการณ์ภายในที่เสถียร:
| ฟิลด์ | แหล่งที่มา |
| -------------- | ------------------------------------------------------------------------------------------------------------- |
| แหล่งที่มา | `subagent` หรือ `cron` |
-| id เซสชัน | คีย์/id เซสชันลูก |
-| ชนิด | ชนิดประกาศ + ป้ายกำกับงาน |
-| สถานะ | ได้มาจากผลลัพธ์รันไทม์ (`success`, `error`, `timeout` หรือ `unknown`) — **ไม่ได้** อนุมานจากข้อความ model |
-| เนื้อหาผลลัพธ์ | ข้อความผู้ช่วยล่าสุดที่มองเห็นได้ มิฉะนั้นเป็นข้อความ tool/toolResult ล่าสุดที่ผ่านการทำความสะอาด |
-| การติดตามผล | คำสั่งที่อธิบายว่าเมื่อใดควรตอบกลับเทียบกับเงียบ |
+| ID เซสชัน | คีย์/ID เซสชันลูก |
+| ประเภท | ประเภทประกาศ + ป้ายกำกับงาน |
+| สถานะ | ได้จากผลลัพธ์รันไทม์ (`success`, `error`, `timeout` หรือ `unknown`) — **ไม่ได้** อนุมานจากข้อความโมเดล |
+| เนื้อหาผลลัพธ์ | ข้อความผู้ช่วยล่าสุดที่มองเห็นได้ มิฉะนั้นเป็นข้อความ tool/toolResult ล่าสุดที่ผ่านการทำให้ปลอดภัยแล้ว |
+| การติดตามผล | คำแนะนำที่อธิบายว่าเมื่อใดควรตอบกลับหรือคงความเงียบ |
-การทำงานที่ล้มเหลวแบบสิ้นสุดรายงานสถานะล้มเหลวโดยไม่เล่นซ้ำ
-ข้อความตอบกลับที่จับไว้ เมื่อหมดเวลา หากลูกผ่านไปถึงแค่การเรียกเครื่องมือ
-ประกาศสามารถยุบประวัตินั้นเป็นสรุปความคืบหน้าบางส่วนสั้น ๆ แทน
-การเล่นซ้ำเอาต์พุตเครื่องมือดิบ
+งานที่ล้มเหลวในสถานะปลายทางจะรายงานสถานะล้มเหลวโดยไม่เล่นซ้ำข้อความตอบกลับ
+ที่จับไว้ เมื่อ timeout หากลูกผ่านไปได้เพียงการเรียกเครื่องมือ ประกาศ
+สามารถยุบประวัตินั้นเป็นสรุปความคืบหน้าบางส่วนแบบสั้น
+แทนการเล่นเอาต์พุตเครื่องมือดิบซ้ำ
### บรรทัดสถิติ
-payload ประกาศมีบรรทัดสถิติที่ท้ายสุด (แม้เมื่อถูกห่อ):
+เพย์โหลดประกาศมีบรรทัดสถิติที่ท้ายสุด (แม้ถูกห่อบรรทัด):
- รันไทม์ (เช่น `runtime 5m12s`)
-- การใช้โทเค็น (อินพุต/เอาต์พุต/รวม)
-- ค่าใช้จ่ายโดยประมาณเมื่อกำหนดราคาของ model ไว้ (`models.providers.*.models[].cost`)
-- `sessionKey`, `sessionId` และพาธทรานสคริปต์ เพื่อให้เอเจนต์หลักดึงประวัติผ่าน `sessions_history` หรือตรวจสอบไฟล์บนดิสก์ได้
+- การใช้โทเคน (อินพุต/เอาต์พุต/ทั้งหมด)
+- ค่าใช้จ่ายประมาณการเมื่อกำหนดราคาของโมเดลไว้ (`models.providers.*.models[].cost`)
+- `sessionKey`, `sessionId` และเส้นทางทรานสคริปต์ เพื่อให้เอเจนต์หลักดึงประวัติผ่าน `sessions_history` หรือตรวจสอบไฟล์บนดิสก์ได้
-ข้อมูลเมตาภายในมีไว้สำหรับการประสานงานเท่านั้น คำตอบที่ผู้ใช้เห็น
-ควรถูกเขียนใหม่ด้วยน้ำเสียงผู้ช่วยตามปกติ
+เมทาดาทาภายในมีไว้สำหรับการประสานงานเท่านั้น การตอบกลับที่แสดงต่อผู้ใช้
+ควรเขียนใหม่ด้วยเสียงผู้ช่วยตามปกติ
-### ทำไมจึงควรใช้ `sessions_history`
+### เหตุใดจึงควรใช้ `sessions_history`
`sessions_history` เป็นเส้นทางการประสานงานที่ปลอดภัยกว่า:
-- การเรียกคืนข้อความผู้ช่วยถูกทำให้เป็นปกติก่อน: ตัดแท็ก thinking ออก; ตัดโครง `` / `` ออก; ตัดบล็อก payload XML การเรียกเครื่องมือแบบข้อความล้วน (``, ``, ``, ``) ออก รวมถึง payload ที่ถูกตัดทอนและไม่เคยปิดอย่างสมบูรณ์; ตัดโครงเรียกเครื่องมือ/ผลลัพธ์ที่ถูกลดระดับและมาร์กเกอร์บริบทประวัติออก; ตัดโทเค็นควบคุม model ที่รั่ว (`<|assistant|>`, ASCII อื่น ๆ `<|...|>`, แบบเต็มความกว้าง `<|...|>`) ออก; ตัด XML การเรียกเครื่องมือ MiniMax ที่ผิดรูปออก
-- ข้อความที่คล้ายข้อมูลประจำตัว/โทเค็นจะถูกปกปิด
+- การเรียกคืนของผู้ช่วยถูกทำให้เป็นมาตรฐานก่อน: ลบแท็กการคิด; ลบโครง `` / ``; ลบบล็อกเพย์โหลด XML การเรียกเครื่องมือแบบข้อความธรรมดา (``, ``, ``, ``) รวมถึงเพย์โหลดที่ถูกตัดทอนและไม่เคยปิดอย่างเรียบร้อย; ลบโครง tool-call/result ที่ถูกลดระดับและมาร์กเกอร์บริบทประวัติ; ลบโทเคนควบคุมโมเดลที่รั่ว (`<|assistant|>`, ASCII `<|...|>` อื่น, แบบเต็มความกว้าง `<|...|>`); ลบ XML การเรียกเครื่องมือ MiniMax ที่มีรูปแบบผิด
+- ข้อความที่ดูเหมือนข้อมูลประจำตัว/โทเคนจะถูกปกปิด
- บล็อกยาวสามารถถูกตัดทอนได้
-- ประวัติที่ใหญ่มากสามารถตัดแถวเก่าทิ้งหรือแทนที่แถวขนาดใหญ่เกินด้วย `[sessions_history omitted: message too large]`
-- การตรวจสอบทรานสคริปต์ดิบบนดิสก์เป็น fallback เมื่อคุณต้องการทรานสคริปต์ครบถ้วนแบบ byte-for-byte
+- ประวัติขนาดใหญ่มากสามารถทิ้งแถวเก่ากว่า หรือแทนที่แถวที่ใหญ่เกินด้วย `[sessions_history omitted: message too large]`
+- การตรวจสอบทรานสคริปต์ดิบบนดิสก์เป็น fallback เมื่อคุณต้องการทรานสคริปต์เต็มแบบตรงทุกไบต์
## นโยบายเครื่องมือ
-ตัวแทนย่อยใช้โปรไฟล์และ pipeline นโยบายเครื่องมือเดียวกับพาเรนต์หรือ
-เอเจนต์เป้าหมายก่อน หลังจากนั้น OpenClaw จะใช้ชั้นข้อจำกัดของตัวแทนย่อย
+เอเจนต์ย่อยใช้โปรไฟล์และไปป์ไลน์นโยบายเครื่องมือเดียวกับพาเรนต์หรือ
+เอเจนต์เป้าหมายก่อน หลังจากนั้น OpenClaw จะใช้เลเยอร์ข้อจำกัด
+เอเจนต์ย่อย
-เมื่อไม่มี `tools.profile` ที่จำกัด ตัวแทนย่อยจะได้รับ **เครื่องมือทั้งหมด ยกเว้น
+เมื่อไม่มี `tools.profile` ที่จำกัด เอเจนต์ย่อยจะได้รับ **เครื่องมือทั้งหมด ยกเว้น
เครื่องมือเซสชัน** และเครื่องมือระบบ:
- `sessions_list`
@@ -447,11 +437,11 @@ payload ประกาศมีบรรทัดสถิติที่ท้
- `sessions_send`
- `sessions_spawn`
-`sessions_history` ยังคงเป็นมุมมองการเรียกคืนแบบจำกัดขอบเขตและผ่านการทำความสะอาดที่นี่ด้วย —
-ไม่ใช่การ dump ทรานสคริปต์ดิบ
+`sessions_history` ยังคงเป็นมุมมองการเรียกคืนที่มีขอบเขตและผ่านการทำให้ปลอดภัยที่นี่ด้วย —
+ไม่ใช่การดัมป์ทรานสคริปต์ดิบ
-เมื่อ `maxSpawnDepth >= 2` ตัวแทนย่อย orchestrator ระดับความลึก 1 จะ
-ได้รับ `sessions_spawn`, `subagents`, `sessions_list` และ
+เมื่อ `maxSpawnDepth >= 2` เอเจนต์ย่อยตัวประสานงานระดับความลึก 1 จะได้รับ
+`sessions_spawn`, `subagents`, `sessions_list` และ
`sessions_history` เพิ่มเติม เพื่อให้จัดการลูกของตัวเองได้
### แทนที่ผ่านการกำหนดค่า
@@ -478,12 +468,12 @@ payload ประกาศมีบรรทัดสถิติที่ท้
}
```
-`tools.subagents.tools.allow` เป็นตัวกรอง allow-only ขั้นสุดท้าย ซึ่งสามารถจำกัด
-ชุดเครื่องมือที่ถูกแก้ไขแล้วให้แคบลงได้ แต่ไม่สามารถ **เพิ่มกลับ** เครื่องมือที่ถูกนำออก
+`tools.subagents.tools.allow` เป็นตัวกรอง allow-only ขั้นสุดท้าย สามารถจำกัด
+ชุดเครื่องมือที่ resolve แล้วให้แคบลงได้ แต่ไม่สามารถ **เพิ่มกลับ** เครื่องมือที่ถูกนำออก
โดย `tools.profile` ได้ ตัวอย่างเช่น `tools.profile: "coding"` รวม
`web_search`/`web_fetch` แต่ไม่รวมเครื่องมือ `browser` หากต้องการให้
-เอเจนต์ย่อยที่ใช้โปรไฟล์ coding ใช้การทำงานอัตโนมัติของเบราว์เซอร์ได้ ให้เพิ่ม browser ใน
-ขั้นโปรไฟล์:
+sub-agent ที่ใช้ profile แบบ coding ใช้ระบบอัตโนมัติของเบราว์เซอร์ได้ ให้เพิ่ม browser ใน
+ขั้น profile:
```json5
{
@@ -494,62 +484,65 @@ payload ประกาศมีบรรทัดสถิติที่ท้
}
```
-ใช้ `agents.list[].tools.alsoAllow: ["browser"]` แบบต่อเอเจนต์เมื่อมีเพียงเอเจนต์เดียว
-ที่ควรได้รับการทำงานอัตโนมัติของเบราว์เซอร์
+ใช้ `agents.list[].tools.alsoAllow: ["browser"]` แบบรายเอเจนต์เมื่อมีเพียง
+เอเจนต์เดียวที่ควรได้รับระบบอัตโนมัติของเบราว์เซอร์
-## การทำงานพร้อมกัน
+## ภาวะพร้อมกัน
-เอเจนต์ย่อยใช้ช่องคิวเฉพาะในโปรเซส:
+Sub-agent ใช้ lane คิวในโปรเซสเฉพาะ:
-- **ชื่อช่อง:** `subagent`
-- **การทำงานพร้อมกัน:** `agents.defaults.subagents.maxConcurrent` (ค่าเริ่มต้น `8`)
+- **ชื่อ lane:** `subagent`
+- **ภาวะพร้อมกัน:** `agents.defaults.subagents.maxConcurrent` (ค่าเริ่มต้น `8`)
-## สถานะการทำงานและการกู้คืน
+## สถานะมีชีวิตและการกู้คืน
OpenClaw ไม่ถือว่าการไม่มี `endedAt` เป็นหลักฐานถาวรว่า
-เอเจนต์ย่อยยังมีชีวิตอยู่ การรันที่ยังไม่สิ้นสุดซึ่งเก่ากว่าหน้าต่าง stale-run
-จะหยุดถูกนับเป็น active/pending ใน `/subagents list`, สรุปสถานะ,
-การกั้นการเสร็จสิ้นของลูกหลาน และการตรวจสอบการทำงานพร้อมกันต่อเซสชัน
+sub-agent ยังมีชีวิตอยู่ การรันที่ยังไม่จบซึ่งเก่ากว่าหน้าต่าง stale-run
+จะหยุดนับเป็น active/pending ใน `/subagents list`, สรุปสถานะ,
+gating การเสร็จสมบูรณ์ของ descendant และการตรวจสอบภาวะพร้อมกันต่อ session
-หลังจาก Gateway รีสตาร์ต การรันที่กู้คืนมาแล้วค้างอยู่และยังไม่สิ้นสุดจะถูกตัดออก เว้นแต่
-เซสชันลูกของการรันนั้นถูกทำเครื่องหมาย `abortedLastRun: true` เซสชันลูกที่ถูกยกเลิกจากการรีสตาร์ตเหล่านั้น
-ยังสามารถกู้คืนได้ผ่านโฟลว์การกู้คืนเอเจนต์ย่อยกำพร้า ซึ่งส่งข้อความ resume สังเคราะห์ก่อน
+หลังจาก Gateway รีสตาร์ต การรันที่ restore แล้วแต่ stale และยังไม่จบจะถูกตัดทิ้ง เว้นแต่
+session ลูกของการรันนั้นจะถูกทำเครื่องหมาย `abortedLastRun: true` session ลูกที่
+ถูกยกเลิกจากการรีสตาร์ตเหล่านั้นยังสามารถกู้คืนได้ผ่านโฟลว์กู้คืน orphan ของ sub-agent
+ซึ่งจะส่งข้อความ resume สังเคราะห์ก่อน
ล้างเครื่องหมาย aborted
-การกู้คืนอัตโนมัติหลังรีสตาร์ตถูกจำกัดต่อเซสชันลูก หากลูกเอเจนต์ย่อยเดียวกัน
-ถูกรับเข้าสู่การกู้คืนกำพร้าซ้ำๆ ภายในหน้าต่าง rapid re-wedge
-OpenClaw จะบันทึก tombstone การกู้คืนไว้ในเซสชันนั้น และหยุด auto-resume ในการรีสตาร์ตภายหลัง รัน
-`openclaw tasks maintenance --apply` เพื่อปรับระเบียนงานให้สอดคล้องกัน หรือ
-`openclaw doctor --fix` เพื่อล้างแฟล็กการกู้คืน aborted ที่ค้างอยู่บน
-เซสชันที่ถูก tombstone
+การกู้คืนอัตโนมัติหลังรีสตาร์ตถูกจำกัดต่อ session ลูก หาก
+sub-agent ลูกตัวเดิมถูกยอมรับให้กู้คืน orphan ซ้ำ ๆ ภายใน
+หน้าต่าง rapid re-wedge OpenClaw จะบันทึก recovery tombstone ใน
+session นั้นและหยุด auto-resume ให้ในการรีสตาร์ตภายหลัง รัน
+`openclaw tasks maintenance --apply` เพื่อ reconcile task record หรือ
+`openclaw doctor --fix` เพื่อล้าง flag การกู้คืน aborted ที่ stale บน
+session ที่ถูก tombstone
-หากการ spawn เอเจนต์ย่อยล้มเหลวด้วย Gateway `PAIRING_REQUIRED` /
-`scope-upgrade` ให้ตรวจสอบผู้เรียก RPC ก่อนแก้ไขสถานะการจับคู่
+หากการ spawn sub-agent ล้มเหลวด้วย Gateway `PAIRING_REQUIRED` /
+`scope-upgrade` ให้ตรวจสอบ RPC caller ก่อนแก้ไขสถานะ pairing
การประสานงาน `sessions_spawn` ภายในควรเชื่อมต่อเป็น
-`client.id: "gateway-client"` พร้อม `client.mode: "backend"` ผ่านการยืนยันตัวตนแบบ shared-token/password บน
-loopback โดยตรง เส้นทางนั้นไม่ขึ้นกับ baseline ขอบเขตอุปกรณ์ที่จับคู่ของ CLI ผู้เรียกระยะไกล,
-`deviceIdentity` ที่ระบุชัดเจน, เส้นทาง device-token ที่ระบุชัดเจน และไคลเอนต์ browser/node
-ยังต้องได้รับการอนุมัติอุปกรณ์ตามปกติสำหรับการอัปเกรดขอบเขต
+`client.id: "gateway-client"` พร้อม `client.mode: "backend"` ผ่าน auth แบบ
+direct loopback shared-token/password เส้นทางนั้นไม่ขึ้นกับ
+scope baseline ของ paired-device ของ CLI ผู้เรียกจากระยะไกล,
+`deviceIdentity` แบบ explicit, เส้นทาง device-token แบบ explicit และไคลเอนต์
+browser/node ยังต้องได้รับการอนุมัติ device ตามปกติสำหรับ scope upgrade
## การหยุด
-- การส่ง `/stop` ในแชตของผู้ร้องขอจะยกเลิกเซสชันผู้ร้องขอและหยุดการรันเอเจนต์ย่อยที่ใช้งานอยู่ซึ่งถูก spawn จากเซสชันนั้น โดย cascade ไปยังลูกที่ซ้อนอยู่
-- `/subagents kill ` หยุดเอเจนต์ย่อยที่ระบุและ cascade ไปยังลูกของเอเจนต์นั้น
+- การส่ง `/stop` ในแชต requester จะยกเลิก session ของ requester และหยุดการรัน sub-agent ที่ active ใด ๆ ที่ spawn จาก session นั้น โดย cascade ไปยังลูกซ้อน
+- `/subagents kill ` หยุด sub-agent เฉพาะตัวและ cascade ไปยังลูกของมัน
## ข้อจำกัด
-- การประกาศเอเจนต์ย่อยเป็นแบบ **พยายามให้ดีที่สุด** หาก Gateway รีสตาร์ต งาน "announce back" ที่ค้างอยู่จะสูญหาย
-- เอเจนต์ย่อยยังคงใช้ทรัพยากรของโปรเซส Gateway เดียวกัน ให้ถือว่า `maxConcurrent` เป็นวาล์วนิรภัย
-- `sessions_spawn` เป็นแบบไม่บล็อกเสมอ: จะส่งคืน `{ status: "accepted", runId, childSessionKey }` ทันที
-- บริบทเอเจนต์ย่อยฉีดเฉพาะ `AGENTS.md` + `TOOLS.md` (ไม่มี `SOUL.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, หรือ `BOOTSTRAP.md`)
-- ความลึกการซ้อนสูงสุดคือ 5 (`maxSpawnDepth` ช่วง: 1–5) แนะนำให้ใช้ความลึก 2 สำหรับกรณีใช้งานส่วนใหญ่
-- `maxChildrenPerAgent` จำกัดจำนวนลูกที่ active ต่อเซสชัน (ค่าเริ่มต้น `5`, ช่วง `1–20`)
+- การ announce ของ sub-agent เป็นแบบ **best-effort** หาก Gateway รีสตาร์ต งาน "announce back" ที่ pending จะสูญหาย
+- Sub-agent ยังคงใช้ทรัพยากรของโปรเซส Gateway เดียวกัน ให้ถือว่า `maxConcurrent` เป็นวาล์วนิรภัย
+- `sessions_spawn` เป็น non-blocking เสมอ: จะคืน `{ status: "accepted", runId, childSessionKey }` ทันที
+- context ของ sub-agent inject เฉพาะ `AGENTS.md` + `TOOLS.md` (ไม่มี `SOUL.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md` หรือ `BOOTSTRAP.md`)
+- ความลึกการซ้อนสูงสุดคือ 5 (`maxSpawnDepth` range: 1–5) แนะนำให้ใช้ความลึก 2 สำหรับกรณีใช้งานส่วนใหญ่
+- `maxChildrenPerAgent` จำกัดจำนวนลูกที่ active ต่อ session (ค่าเริ่มต้น `5`, range `1–20`)
## ที่เกี่ยวข้อง
-- [เอเจนต์ ACP](/th/tools/acp-agents)
-- [การส่งเอเจนต์](/th/tools/agent-send)
+- [ACP agents](/th/tools/acp-agents)
+- [Agent send](/th/tools/agent-send)
- [งานเบื้องหลัง](/th/automation/tasks)
- [เครื่องมือ sandbox แบบหลายเอเจนต์](/th/tools/multi-agent-sandbox-tools)
diff --git a/docs/th/tools/thinking.md b/docs/th/tools/thinking.md
index 3be01d17c..7a3bd6d8d 100644
--- a/docs/th/tools/thinking.md
+++ b/docs/th/tools/thinking.md
@@ -1,140 +1,143 @@
---
read_when:
- การปรับการแยกวิเคราะห์หรือค่าเริ่มต้นของคำสั่ง thinking, fast-mode หรือ verbose
-summary: ไวยากรณ์คำสั่งกำกับสำหรับ /think, /fast, /verbose, /trace และการแสดงการให้เหตุผล
+summary: ไวยากรณ์ของไดเรกทีฟสำหรับ /think, /fast, /verbose, /trace และการมองเห็นการให้เหตุผล
title: ระดับการคิด
x-i18n:
- generated_at: "2026-04-30T16:31:19Z"
+ generated_at: "2026-05-04T02:27:32Z"
model: gpt-5.5
provider: openai
- source_hash: f9adf065e46cb64e4c2149b95ecd69ed887a17e2eff5a5569894defa3e7217b7
+ source_hash: 6fa1b0a2b5f7b93a706488c3ad39dfe08c08eed0bdd30880eb4c07d730ee4d4f
source_path: tools/thinking.md
workflow: 16
---
-## ทำอะไร
+## สิ่งที่ทำ
-- คำสั่งกำกับแบบอินไลน์ในเนื้อหาขาเข้าใดๆ: `/t `, `/think:`, หรือ `/thinking `
+- คำสั่งแบบอินไลน์ในเนื้อหาขาเข้าใด ๆ: `/t `, `/think:`, หรือ `/thinking `
- ระดับ (นามแฝง): `off | minimal | low | medium | high | xhigh | adaptive | max`
- - minimal → “คิด”
- - low → “คิดอย่างหนัก”
- - medium → “คิดให้หนักขึ้น”
+ - minimal → “think”
+ - low → “think hard”
+ - medium → “think harder”
- high → “ultrathink” (งบประมาณสูงสุด)
- xhigh → “ultrathink+” (โมเดล GPT-5.2+ และ Codex รวมถึง effort ของ Anthropic Claude Opus 4.7)
- - adaptive → การคิดแบบปรับตามสถานการณ์ที่ผู้ให้บริการจัดการ (รองรับสำหรับ Claude 4.6 บน Anthropic/Bedrock, Anthropic Claude Opus 4.7 และการคิดแบบไดนามิกของ Google Gemini)
- - max → การให้เหตุผลสูงสุดของผู้ให้บริการ (Anthropic Claude Opus 4.7; Ollama แมปค่านี้ไปยัง effort `think` แบบเนทีฟที่สูงที่สุด)
- - `x-high`, `x_high`, `extra-high`, `extra high`, และ `extra_high` แมปไปยัง `xhigh`
- - `highest` แมปไปยัง `high`
-- หมายเหตุผู้ให้บริการ:
- - เมนูและตัวเลือกการคิดขับเคลื่อนด้วยโปรไฟล์ผู้ให้บริการ Plugin ผู้ให้บริการประกาศชุดระดับที่แน่นอนสำหรับโมเดลที่เลือก รวมถึงป้ายกำกับอย่างไบนารี `on`
- - `adaptive`, `xhigh`, และ `max` จะแสดงเฉพาะโปรไฟล์ผู้ให้บริการ/โมเดลที่รองรับเท่านั้น คำสั่งกำกับแบบพิมพ์สำหรับระดับที่ไม่รองรับจะถูกปฏิเสธพร้อมตัวเลือกที่ถูกต้องของโมเดลนั้น
- - ระดับที่จัดเก็บไว้เดิมซึ่งไม่รองรับจะถูกแมปใหม่ตามลำดับอันดับของโปรไฟล์ผู้ให้บริการ `adaptive` จะถอยกลับเป็น `medium` บนโมเดลที่ไม่รองรับ adaptive ขณะที่ `xhigh` และ `max` จะถอยกลับเป็นระดับ non-off ที่ใหญ่ที่สุดที่โมเดลที่เลือกรองรับ
+ - adaptive → การคิดแบบปรับตัวที่ผู้ให้บริการจัดการ (รองรับสำหรับ Claude 4.6 บน Anthropic/Bedrock, Anthropic Claude Opus 4.7 และการคิดแบบไดนามิกของ Google Gemini)
+ - max → การใช้เหตุผลสูงสุดของผู้ให้บริการ (Anthropic Claude Opus 4.7; Ollama จับคู่ค่านี้กับ effort `think` เนทีฟระดับสูงสุด)
+ - `x-high`, `x_high`, `extra-high`, `extra high` และ `extra_high` จะจับคู่เป็น `xhigh`
+ - `highest` จะจับคู่เป็น `high`
+- หมายเหตุสำหรับผู้ให้บริการ:
+ - เมนูและตัวเลือกการคิดขับเคลื่อนโดยโปรไฟล์ผู้ให้บริการ Plugin ของผู้ให้บริการประกาศชุดระดับที่แน่นอนสำหรับโมเดลที่เลือก รวมถึงป้ายกำกับอย่าง `on` แบบไบนารี
+ - `adaptive`, `xhigh` และ `max` จะแสดงเฉพาะสำหรับโปรไฟล์ผู้ให้บริการ/โมเดลที่รองรับเท่านั้น คำสั่งที่พิมพ์สำหรับระดับที่ไม่รองรับจะถูกปฏิเสธพร้อมตัวเลือกที่ใช้ได้ของโมเดลนั้น
+ - ระดับที่ไม่รองรับซึ่งจัดเก็บไว้เดิมจะถูกจับคู่ใหม่ตามลำดับชั้นโปรไฟล์ผู้ให้บริการ `adaptive` จะถอยกลับเป็น `medium` บนโมเดลที่ไม่รองรับการปรับตัว ขณะที่ `xhigh` และ `max` จะถอยกลับเป็นระดับที่รองรับสูงสุดซึ่งไม่ใช่ off สำหรับโมเดลที่เลือก
- โมเดล Anthropic Claude 4.6 มีค่าเริ่มต้นเป็น `adaptive` เมื่อไม่ได้ตั้งค่าระดับการคิดอย่างชัดเจน
- - Anthropic Claude Opus 4.7 ไม่ได้มีค่าเริ่มต้นเป็นการคิดแบบ adaptive ค่าเริ่มต้น effort ของ API ยังคงเป็นของผู้ให้บริการ เว้นแต่คุณจะตั้งค่าระดับการคิดอย่างชัดเจน
- - Anthropic Claude Opus 4.7 แมป `/think xhigh` ไปยังการคิดแบบ adaptive พร้อม `output_config.effort: "xhigh"` เพราะ `/think` เป็นคำสั่งกำกับการคิด และ `xhigh` เป็นการตั้งค่า effort ของ Opus 4.7
- - Anthropic Claude Opus 4.7 ยังเปิดให้ใช้ `/think max`; ซึ่งแมปไปยังเส้นทาง effort สูงสุดแบบเดียวกันที่ผู้ให้บริการเป็นเจ้าของ
- - โมเดล DeepSeek V4 เปิดให้ใช้ `/think xhigh|max`; ทั้งสองแมปไปยัง DeepSeek `reasoning_effort: "max"` ขณะที่ระดับ non-off ที่ต่ำกว่าจะแมปไปยัง `high`
- - โมเดล Ollama ที่รองรับการคิดเปิดให้ใช้ `/think low|medium|high|max`; `max` แมปไปยัง `think: "high"` แบบเนทีฟ เพราะ API เนทีฟของ Ollama รับสตริง effort `low`, `medium`, และ `high`
- - โมเดล OpenAI GPT แมป `/think` ผ่านการรองรับ effort เฉพาะโมเดลของ Responses API `/think off` ส่ง `reasoning.effort: "none"` เฉพาะเมื่อโมเดลเป้าหมายรองรับเท่านั้น มิฉะนั้น OpenClaw จะละเว้น payload การให้เหตุผลที่ปิดใช้งานแทนการส่งค่าที่ไม่รองรับ
- - รายการแคตตาล็อกแบบเข้ากันได้กับ OpenAI ที่กำหนดเองสามารถเลือกใช้ `/think xhigh` ได้โดยตั้งค่า `models.providers..models[].compat.supportedReasoningEfforts` ให้รวม `"xhigh"` ซึ่งใช้เมตาดาต้า compat เดียวกันกับที่แมป payload effort การให้เหตุผลขาออกของ OpenAI ดังนั้นเมนู การตรวจสอบความถูกต้องของเซสชัน CLI ของเอเจนต์ และ `llm-task` จึงสอดคล้องกับพฤติกรรมการขนส่ง
- - refs ของ OpenRouter Hunter Alpha ที่กำหนดค่าไว้แต่ล้าสมัยจะข้ามการฉีดการให้เหตุผลผ่านพร็อกซี เพราะเส้นทางที่เลิกใช้แล้วนั้นอาจส่งคืนข้อความคำตอบสุดท้ายผ่านฟิลด์การให้เหตุผล
- - Google Gemini แมป `/think adaptive` ไปยังการคิดแบบไดนามิกที่ผู้ให้บริการ Gemini เป็นเจ้าของ คำขอ Gemini 3 จะละเว้น `thinkingLevel` แบบคงที่ ขณะที่คำขอ Gemini 2.5 จะส่ง `thinkingBudget: -1`; ระดับแบบคงที่ยังคงแมปไปยัง `thinkingLevel` หรือ budget ของ Gemini ที่ใกล้ที่สุดสำหรับตระกูลโมเดลนั้น
- - MiniMax (`minimax/*`) บนเส้นทางสตรีมมิงที่เข้ากันได้กับ Anthropic มีค่าเริ่มต้นเป็น `thinking: { type: "disabled" }` เว้นแต่คุณจะตั้งค่าการคิดอย่างชัดเจนในพารามิเตอร์โมเดลหรือพารามิเตอร์คำขอ วิธีนี้หลีกเลี่ยงเดลตา `reasoning_content` ที่รั่วจากรูปแบบสตรีม Anthropic แบบไม่ใช่เนทีฟของ MiniMax
- - Z.AI (`zai/*`) รองรับเฉพาะการคิดแบบไบนารี (`on`/`off`) ระดับใดๆ ที่ไม่ใช่ `off` จะถือเป็น `on` (แมปไปยัง `low`)
- - Moonshot (`moonshot/*`) แมป `/think off` ไปยัง `thinking: { type: "disabled" }` และระดับใดๆ ที่ไม่ใช่ `off` ไปยัง `thinking: { type: "enabled" }` เมื่อเปิดใช้การคิด Moonshot จะรับเฉพาะ `tool_choice` `auto|none`; OpenClaw จะทำให้ค่าที่เข้ากันไม่ได้เป็น `auto`
+ - Anthropic Claude Opus 4.7 ไม่ได้มีค่าเริ่มต้นเป็นการคิดแบบปรับตัว ค่าเริ่มต้น effort ของ API ยังคงเป็นของผู้ให้บริการ เว้นแต่คุณจะตั้งค่าระดับการคิดอย่างชัดเจน
+ - Anthropic Claude Opus 4.7 จับคู่ `/think xhigh` เป็นการคิดแบบปรับตัวพร้อม `output_config.effort: "xhigh"` เพราะ `/think` เป็นคำสั่งการคิด และ `xhigh` เป็นการตั้งค่า effort ของ Opus 4.7
+ - Anthropic Claude Opus 4.7 ยังเปิดเผย `/think max` ด้วย โดยจับคู่กับเส้นทาง effort สูงสุดที่ผู้ให้บริการเป็นเจ้าของเดียวกัน
+ - โมเดล DeepSeek V4 เปิดเผย `/think xhigh|max`; ทั้งสองจับคู่กับ DeepSeek `reasoning_effort: "max"` ขณะที่ระดับที่ต่ำกว่าและไม่ใช่ off จะจับคู่เป็น `high`
+ - โมเดล Ollama ที่รองรับการคิดเปิดเผย `/think low|medium|high|max`; `max` จับคู่กับ `think: "high"` แบบเนทีฟ เพราะ API เนทีฟของ Ollama รับสตริง effort `low`, `medium` และ `high`
+ - โมเดล OpenAI GPT จับคู่ `/think` ผ่านการรองรับ effort ของ Responses API เฉพาะโมเดล `/think off` จะส่ง `reasoning.effort: "none"` เฉพาะเมื่อโมเดลเป้าหมายรองรับเท่านั้น มิฉะนั้น OpenClaw จะละเว้นเพย์โหลดการใช้เหตุผลที่ปิดใช้งาน แทนที่จะส่งค่าที่ไม่รองรับ
+ - รายการแค็ตตาล็อกที่เข้ากันได้กับ OpenAI แบบกำหนดเองสามารถเลือกรองรับ `/think xhigh` ได้โดยตั้งค่า `models.providers..models[].compat.supportedReasoningEfforts` ให้รวม `"xhigh"` ซึ่งใช้เมทาดาทา compat เดียวกันที่จับคู่เพย์โหลด effort การใช้เหตุผลของ OpenAI ขาออก ดังนั้นเมนู การตรวจสอบเซสชัน agent CLI และ `llm-task` จึงสอดคล้องกับพฤติกรรมการขนส่ง
+ - refs ของ OpenRouter Hunter Alpha ที่กำหนดค่าไว้แต่ล้าสมัยจะข้ามการฉีด reasoning ของพร็อกซี เพราะเส้นทางที่เลิกใช้แล้วนั้นอาจคืนข้อความคำตอบสุดท้ายผ่านฟิลด์ reasoning ได้
+ - Google Gemini จับคู่ `/think adaptive` กับการคิดแบบไดนามิกที่ผู้ให้บริการของ Gemini เป็นเจ้าของ คำขอ Gemini 3 จะละเว้น `thinkingLevel` แบบคงที่ ขณะที่คำขอ Gemini 2.5 ส่ง `thinkingBudget: -1`; ระดับคงที่ยังคงจับคู่กับ `thinkingLevel` หรือ budget ของ Gemini ที่ใกล้ที่สุดสำหรับตระกูลโมเดลนั้น
+ - MiniMax (`minimax/*`) บนเส้นทางสตรีมมิงที่เข้ากันได้กับ Anthropic มีค่าเริ่มต้นเป็น `thinking: { type: "disabled" }` เว้นแต่คุณจะตั้งค่าการคิดอย่างชัดเจนในพารามิเตอร์โมเดลหรือพารามิเตอร์คำขอ ซึ่งช่วยหลีกเลี่ยงเดลตา `reasoning_content` ที่รั่วจากรูปแบบสตรีม Anthropic ที่ไม่ใช่เนทีฟของ MiniMax
+ - Z.AI (`zai/*`) รองรับเฉพาะการคิดแบบไบนารี (`on`/`off`) ระดับใด ๆ ที่ไม่ใช่ `off` จะถือเป็น `on` (จับคู่เป็น `low`)
+ - Moonshot (`moonshot/*`) จับคู่ `/think off` เป็น `thinking: { type: "disabled" }` และระดับใด ๆ ที่ไม่ใช่ `off` เป็น `thinking: { type: "enabled" }` เมื่อเปิดใช้การคิด Moonshot รับเฉพาะ `tool_choice` `auto|none`; OpenClaw ทำให้ค่าที่เข้ากันไม่ได้เป็น `auto`
-## ลำดับการแก้ค่า
+## ลำดับการแก้ไขค่า
-1. คำสั่งกำกับแบบอินไลน์บนข้อความ (ใช้กับข้อความนั้นเท่านั้น)
-2. การแทนที่ของเซสชัน (ตั้งค่าโดยส่งข้อความที่มีเฉพาะคำสั่งกำกับ)
-3. ค่าเริ่มต้นต่อเอเจนต์ (`agents.list[].thinkingDefault` ใน config)
+1. คำสั่งแบบอินไลน์ในข้อความ (ใช้กับข้อความนั้นเท่านั้น)
+2. การแทนที่ของเซสชัน (ตั้งค่าโดยส่งข้อความที่มีเฉพาะคำสั่ง)
+3. ค่าเริ่มต้นราย agent (`agents.list[].thinkingDefault` ใน config)
4. ค่าเริ่มต้นส่วนกลาง (`agents.defaults.thinkingDefault` ใน config)
-5. ค่า fallback: ค่าเริ่มต้นที่ผู้ให้บริการประกาศเมื่อมีให้ใช้ มิฉะนั้นโมเดลที่รองรับการให้เหตุผลจะแก้ค่าเป็น `medium` หรือระดับ non-`off` ที่รองรับและใกล้ที่สุดสำหรับโมเดลนั้น และโมเดลที่ไม่รองรับการให้เหตุผลจะคงอยู่ที่ `off`
+5. ค่าถอยกลับ: ค่าเริ่มต้นที่ผู้ให้บริการประกาศเมื่อมี มิฉะนั้นโมเดลที่รองรับการใช้เหตุผลจะแก้ค่าเป็น `medium` หรือระดับที่รองรับและไม่ใช่ `off` ที่ใกล้ที่สุดสำหรับโมเดลนั้น และโมเดลที่ไม่ใช้เหตุผลจะคงเป็น `off`
## การตั้งค่าเริ่มต้นของเซสชัน
-- ส่งข้อความที่เป็นคำสั่งกำกับ **เท่านั้น** (อนุญาตให้มีช่องว่าง) เช่น `/think:medium` หรือ `/t high`
-- ค่านั้นจะคงอยู่สำหรับเซสชันปัจจุบัน (ตามค่าเริ่มต้นต่อผู้ส่ง); ล้างได้ด้วย `/think:off` หรือการรีเซ็ตเมื่อเซสชันว่าง
-- จะส่งข้อความยืนยัน (`Thinking level set to high.` / `Thinking disabled.`) หากระดับไม่ถูกต้อง (เช่น `/thinking big`) คำสั่งจะถูกปฏิเสธพร้อมคำแนะนำ และสถานะเซสชันจะไม่เปลี่ยนแปลง
+- ส่งข้อความที่เป็นคำสั่ง **เท่านั้น** (อนุญาตช่องว่างได้) เช่น `/think:medium` หรือ `/t high`
+- ค่านั้นจะติดอยู่กับเซสชันปัจจุบัน (โดยค่าเริ่มต้นแยกตามผู้ส่ง); ล้างด้วย `/think:off` หรือการรีเซ็ตเมื่อเซสชันว่างนาน
+- จะมีการส่งคำตอบยืนยัน (`Thinking level set to high.` / `Thinking disabled.`) หากระดับไม่ถูกต้อง (เช่น `/thinking big`) คำสั่งจะถูกปฏิเสธพร้อมคำแนะนำ และสถานะเซสชันจะไม่เปลี่ยนแปลง
- ส่ง `/think` (หรือ `/think:`) โดยไม่มีอาร์กิวเมนต์เพื่อดูระดับการคิดปัจจุบัน
-## การใช้ตามเอเจนต์
+## การใช้งานตาม agent
-- **Pi แบบฝัง**: ระดับที่แก้ค่าแล้วจะถูกส่งไปยังรันไทม์เอเจนต์ Pi ในกระบวนการ
+- **Pi แบบฝังตัว**: ระดับที่แก้ไขแล้วจะถูกส่งต่อไปยังรันไทม์ agent Pi ในโปรเซส
## โหมดเร็ว (/fast)
- ระดับ: `on|off`
-- ข้อความที่มีเฉพาะคำสั่งกำกับจะสลับการแทนที่โหมดเร็วของเซสชัน และตอบกลับ `Fast mode enabled.` / `Fast mode disabled.`
-- ส่ง `/fast` (หรือ `/fast status`) โดยไม่มีโหมดเพื่อดูสถานะโหมดเร็วที่มีผลปัจจุบัน
+- ข้อความที่มีเฉพาะคำสั่งจะสลับการแทนที่โหมดเร็วของเซสชัน และตอบกลับ `Fast mode enabled.` / `Fast mode disabled.`
+- ส่ง `/fast` (หรือ `/fast status`) โดยไม่มีโหมดเพื่อดูสถานะโหมดเร็วที่มีผลอยู่ในปัจจุบัน
- OpenClaw แก้ค่าโหมดเร็วตามลำดับนี้:
- 1. `/fast on|off` แบบอินไลน์/เฉพาะคำสั่งกำกับ
+ 1. `/fast on|off` แบบอินไลน์/มีเฉพาะคำสั่ง
2. การแทนที่ของเซสชัน
- 3. ค่าเริ่มต้นต่อเอเจนต์ (`agents.list[].fastModeDefault`)
- 4. config ต่อโมเดล: `agents.defaults.models["/"].params.fastMode`
- 5. ค่า fallback: `off`
-- สำหรับ `openai/*` โหมดเร็วแมปไปยังการประมวลผลลำดับความสำคัญของ OpenAI โดยส่ง `service_tier=priority` ในคำขอ Responses ที่รองรับ
-- สำหรับ `openai-codex/*` โหมดเร็วจะส่งแฟล็ก `service_tier=priority` เดียวกันบน Codex Responses OpenClaw ใช้ตัวสลับ `/fast` ร่วมกันหนึ่งตัวในทั้งสองเส้นทาง auth
-- สำหรับคำขอ `anthropic/*` สาธารณะแบบตรง รวมถึงทราฟฟิกที่ยืนยันตัวตนด้วย OAuth ซึ่งส่งไปยัง `api.anthropic.com` โหมดเร็วแมปไปยัง service tiers ของ Anthropic: `/fast on` ตั้งค่า `service_tier=auto`, `/fast off` ตั้งค่า `service_tier=standard_only`
+ 3. ค่าเริ่มต้นราย agent (`agents.list[].fastModeDefault`)
+ 4. config รายโมเดล: `agents.defaults.models["/"].params.fastMode`
+ 5. ค่าถอยกลับ: `off`
+- สำหรับ `openai/*` โหมดเร็วจับคู่กับการประมวลผลลำดับความสำคัญของ OpenAI โดยส่ง `service_tier=priority` ในคำขอ Responses ที่รองรับ
+- สำหรับ `openai-codex/*` โหมดเร็วส่งแฟล็ก `service_tier=priority` เดียวกันใน Codex Responses OpenClaw คงสวิตช์ `/fast` ร่วมกันหนึ่งตัวสำหรับเส้นทาง auth ทั้งสอง
+- สำหรับคำขอ `anthropic/*` สาธารณะโดยตรง รวมถึงทราฟฟิกที่ยืนยันตัวตนด้วย OAuth ซึ่งส่งไปยัง `api.anthropic.com` โหมดเร็วจับคู่กับ service tier ของ Anthropic: `/fast on` ตั้งค่า `service_tier=auto`, `/fast off` ตั้งค่า `service_tier=standard_only`
- สำหรับ `minimax/*` บนเส้นทางที่เข้ากันได้กับ Anthropic, `/fast on` (หรือ `params.fastMode: true`) จะเขียน `MiniMax-M2.7` ใหม่เป็น `MiniMax-M2.7-highspeed`
-- พารามิเตอร์โมเดล Anthropic `serviceTier` / `service_tier` ที่ระบุชัดเจนจะแทนที่ค่าเริ่มต้นของโหมดเร็วเมื่อทั้งสองค่าถูกตั้ง OpenClaw ยังคงข้ามการฉีด service-tier ของ Anthropic สำหรับ URL ฐานพร็อกซีที่ไม่ใช่ Anthropic
-- `/status` แสดง `Fast` เฉพาะเมื่อเปิดใช้โหมดเร็วเท่านั้น
+- พารามิเตอร์โมเดล Anthropic `serviceTier` / `service_tier` ที่ระบุชัดเจนจะแทนที่ค่าเริ่มต้นของโหมดเร็วเมื่อทั้งสองถูกตั้งค่า OpenClaw ยังคงข้ามการฉีด service-tier ของ Anthropic สำหรับ URL ฐานของพร็อกซีที่ไม่ใช่ Anthropic
+- `/status` แสดง `Fast` เฉพาะเมื่อเปิดใช้โหมดเร็ว
-## คำสั่งกำกับแบบละเอียด (/verbose หรือ /v)
+## คำสั่ง verbose (/verbose หรือ /v)
- ระดับ: `on` (น้อยที่สุด) | `full` | `off` (ค่าเริ่มต้น)
-- ข้อความที่มีเฉพาะคำสั่งกำกับจะสลับ verbose ของเซสชัน และตอบกลับ `Verbose logging enabled.` / `Verbose logging disabled.`; ระดับที่ไม่ถูกต้องจะส่งคืนคำแนะนำโดยไม่เปลี่ยนสถานะ
-- `/verbose off` จัดเก็บการแทนที่เซสชันอย่างชัดเจน; ล้างผ่าน UI เซสชันโดยเลือก `inherit`
-- คำสั่งกำกับแบบอินไลน์มีผลเฉพาะข้อความนั้น มิฉะนั้นจะใช้ค่าเริ่มต้นของเซสชัน/ส่วนกลาง
+- ข้อความที่มีเฉพาะคำสั่งจะสลับ verbose ของเซสชัน และตอบกลับ `Verbose logging enabled.` / `Verbose logging disabled.`; ระดับที่ไม่ถูกต้องจะคืนคำแนะนำโดยไม่เปลี่ยนสถานะ
+- `/verbose off` จัดเก็บการแทนที่เซสชันแบบชัดเจน; ล้างผ่าน UI เซสชันโดยเลือก `inherit`
+- คำสั่งแบบอินไลน์มีผลเฉพาะข้อความนั้น มิฉะนั้นจะใช้ค่าเริ่มต้นของเซสชัน/ส่วนกลาง
- ส่ง `/verbose` (หรือ `/verbose:`) โดยไม่มีอาร์กิวเมนต์เพื่อดูระดับ verbose ปัจจุบัน
-- เมื่อเปิด verbose เอเจนต์ที่ส่งผลลัพธ์เครื่องมือแบบมีโครงสร้าง (Pi, เอเจนต์ JSON อื่นๆ) จะส่งการเรียกเครื่องมือแต่ละครั้งกลับเป็นข้อความที่มีเฉพาะเมตาดาต้าของตัวเอง โดยขึ้นต้นด้วย ` : ` เมื่อมีให้ใช้ (path/command) สรุปเครื่องมือเหล่านี้จะถูกส่งทันทีเมื่อแต่ละเครื่องมือเริ่มทำงาน (บับเบิลแยก) ไม่ใช่เดลตาสตรีมมิง
-- สรุปความล้มเหลวของเครื่องมือยังคงมองเห็นได้ในโหมดปกติ แต่ส่วนต่อท้ายรายละเอียดข้อผิดพลาดดิบจะถูกซ่อนไว้ เว้นแต่ verbose เป็น `on` หรือ `full`
-- เมื่อ verbose เป็น `full` เอาต์พุตของเครื่องมือจะถูกส่งต่อหลังเสร็จสิ้นด้วย (บับเบิลแยก ตัดให้ยาวไม่เกินขนาดที่ปลอดภัย) หากคุณสลับ `/verbose on|full|off` ขณะที่รันกำลังดำเนินอยู่ บับเบิลเครื่องมือถัดไปจะเคารพการตั้งค่าใหม่
+- เมื่อ verbose เปิดอยู่ agent ที่ปล่อยผลลัพธ์เครื่องมือแบบมีโครงสร้าง (Pi และ agent JSON อื่น ๆ) จะส่งการเรียกเครื่องมือแต่ละครั้งกลับเป็นข้อความเฉพาะเมทาดาทาของตัวเอง โดยนำหน้าด้วย ` : ` เมื่อมี สรุปเครื่องมือเหล่านี้จะถูกส่งทันทีที่เครื่องมือแต่ละตัวเริ่มทำงาน (บับเบิลแยกกัน) ไม่ใช่เดลตาสตรีมมิง
+- สรุปความล้มเหลวของเครื่องมือยังคงมองเห็นได้ในโหมดปกติ แต่ suffix รายละเอียดข้อผิดพลาดดิบจะถูกซ่อนไว้ เว้นแต่ verbose เป็น `on` หรือ `full`
+- เมื่อ verbose เป็น `full` เอาต์พุตเครื่องมือจะถูกส่งต่อหลังเสร็จสิ้นด้วย (บับเบิลแยกกัน ตัดให้เหลือความยาวที่ปลอดภัย) หากคุณสลับ `/verbose on|full|off` ขณะที่การรันกำลังดำเนินอยู่ บับเบิลเครื่องมือถัดไปจะใช้การตั้งค่าใหม่
+- `agents.defaults.toolProgressDetail` ควบคุมรูปแบบของสรุปเครื่องมือ `/verbose` และบรรทัดเครื่องมือแบบร่างความคืบหน้า ใช้ `"explain"` (ค่าเริ่มต้น) สำหรับป้ายกำกับสั้น ๆ ที่มนุษย์อ่านได้ เช่น `🛠️ Exec: checking JS syntax`; ใช้ `"raw"` เมื่อคุณต้องการให้แนบคำสั่ง/รายละเอียดดิบสำหรับการดีบักด้วย `agents.list[].toolProgressDetail` ราย agent จะแทนที่ค่าเริ่มต้น
+ - `explain`: `🛠️ Exec: check JS syntax for /tmp/app.js`
+ - `raw`: `🛠️ Exec: check JS syntax for /tmp/app.js, node --check /tmp/app.js`
-## คำสั่งกำกับการ trace ของ Plugin (/trace)
+## คำสั่ง trace ของ Plugin (/trace)
- ระดับ: `on` | `off` (ค่าเริ่มต้น)
-- ข้อความที่มีเฉพาะคำสั่งกำกับจะสลับเอาต์พุต trace ของ Plugin ในเซสชัน และตอบกลับ `Plugin trace enabled.` / `Plugin trace disabled.`
-- คำสั่งกำกับแบบอินไลน์มีผลเฉพาะข้อความนั้น มิฉะนั้นจะใช้ค่าเริ่มต้นของเซสชัน/ส่วนกลาง
+- ข้อความที่มีเฉพาะคำสั่งจะสลับเอาต์พุต trace ของ Plugin ในเซสชัน และตอบกลับ `Plugin trace enabled.` / `Plugin trace disabled.`
+- คำสั่งแบบอินไลน์มีผลเฉพาะข้อความนั้น มิฉะนั้นจะใช้ค่าเริ่มต้นของเซสชัน/ส่วนกลาง
- ส่ง `/trace` (หรือ `/trace:`) โดยไม่มีอาร์กิวเมนต์เพื่อดูระดับ trace ปัจจุบัน
-- `/trace` แคบกว่า `/verbose`: จะแสดงเฉพาะบรรทัด trace/debug ที่ Plugin เป็นเจ้าของ เช่น สรุป debug ของ Active Memory
-- บรรทัด trace สามารถปรากฏใน `/status` และเป็นข้อความวินิจฉัยติดตามผลหลังคำตอบปกติของผู้ช่วย
+- `/trace` แคบกว่า `/verbose`: โดยเปิดเผยเฉพาะบรรทัด trace/debug ที่ Plugin เป็นเจ้าของ เช่น สรุป debug ของ Active Memory
+- บรรทัด trace อาจปรากฏใน `/status` และเป็นข้อความวินิจฉัยติดตามผลหลังคำตอบผู้ช่วยตามปกติ
-## การมองเห็นการให้เหตุผล (/reasoning)
+## การมองเห็นการใช้เหตุผล (/reasoning)
- ระดับ: `on|off|stream`
-- ข้อความที่มีเฉพาะคำสั่งกำกับจะสลับว่าจะแสดงบล็อกการคิดในคำตอบหรือไม่
-- เมื่อเปิดใช้ การให้เหตุผลจะถูกส่งเป็น **ข้อความแยก** ที่ขึ้นต้นด้วย `Reasoning:`
-- `stream` (เฉพาะ Telegram): สตรีมการให้เหตุผลเข้าไปในบับเบิลร่างของ Telegram ขณะที่กำลังสร้างคำตอบ จากนั้นส่งคำตอบสุดท้ายโดยไม่มีการให้เหตุผล
+- ข้อความที่มีเฉพาะคำสั่งจะสลับว่าจะให้แสดงบล็อกการคิดในคำตอบหรือไม่
+- เมื่อเปิดใช้งาน การใช้เหตุผลจะถูกส่งเป็น **ข้อความแยกต่างหาก** ที่นำหน้าด้วย `Reasoning:`
+- `stream` (เฉพาะ Telegram): สตรีมการใช้เหตุผลลงในบับเบิลร่างของ Telegram ระหว่างสร้างคำตอบ จากนั้นส่งคำตอบสุดท้ายโดยไม่มีการใช้เหตุผล
- นามแฝง: `/reason`
-- ส่ง `/reasoning` (หรือ `/reasoning:`) โดยไม่มีอาร์กิวเมนต์เพื่อดูระดับการให้เหตุผลปัจจุบัน
-- ลำดับการแก้ค่า: คำสั่งกำกับแบบอินไลน์ จากนั้นการแทนที่ของเซสชัน จากนั้นค่าเริ่มต้นต่อเอเจนต์ (`agents.list[].reasoningDefault`) จากนั้นค่า fallback (`off`)
+- ส่ง `/reasoning` (หรือ `/reasoning:`) โดยไม่มีอาร์กิวเมนต์เพื่อดูระดับการใช้เหตุผลปัจจุบัน
+- ลำดับการแก้ไขค่า: คำสั่งแบบอินไลน์ จากนั้นการแทนที่ของเซสชัน จากนั้นค่าเริ่มต้นราย agent (`agents.list[].reasoningDefault`) จากนั้นค่าถอยกลับ (`off`)
-แท็กการให้เหตุผลของโมเดลในเครื่องที่ผิดรูปจะถูกจัดการอย่างระมัดระวัง บล็อก `...` ที่ปิดครบจะยังคงซ่อนอยู่ในคำตอบปกติ และการให้เหตุผลที่ไม่ปิดหลังข้อความที่มองเห็นแล้วก็จะถูกซ่อนด้วย หากคำตอบถูกครอบทั้งหมดด้วยแท็กเปิดที่ไม่ปิดเพียงแท็กเดียว และมิฉะนั้นจะส่งเป็นข้อความว่าง OpenClaw จะลบแท็กเปิดที่ผิดรูปและส่งข้อความที่เหลือ
+แท็กการใช้เหตุผลของโมเดลในเครื่องที่ผิดรูปแบบจะถูกจัดการอย่างระมัดระวัง บล็อก `...` ที่ปิดแล้วจะยังคงถูกซ่อนในคำตอบปกติ และการใช้เหตุผลที่ไม่ได้ปิดหลังข้อความที่มองเห็นแล้วก็จะถูกซ่อนเช่นกัน หากคำตอบถูกครอบทั้งหมดในแท็กเปิดเดียวที่ไม่ได้ปิด และมิฉะนั้นจะส่งเป็นข้อความว่าง OpenClaw จะลบแท็กเปิดที่ผิดรูปแบบออกและส่งข้อความที่เหลือ
## ที่เกี่ยวข้อง
- เอกสารโหมดยกระดับอยู่ใน [โหมดยกระดับ](/th/tools/elevated)
-## Heartbeats
+## Heartbeat
-- เนื้อหา probe ของ Heartbeat คือพรอมป์ Heartbeat ที่กำหนดค่าไว้ (ค่าเริ่มต้น: `Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.`) คำสั่งกำกับแบบอินไลน์ในข้อความ Heartbeat จะใช้ตามปกติ (แต่ควรหลีกเลี่ยงการเปลี่ยนค่าเริ่มต้นของเซสชันจาก Heartbeat)
-- การส่ง Heartbeat มีค่าเริ่มต้นเป็น payload สุดท้ายเท่านั้น หากต้องการส่งข้อความ `Reasoning:` แยกด้วย (เมื่อมีให้ใช้) ให้ตั้งค่า `agents.defaults.heartbeat.includeReasoning: true` หรือ `agents.list[].heartbeat.includeReasoning: true` ต่อเอเจนต์
+- เนื้อหา probe ของ Heartbeat คือ prompt Heartbeat ที่กำหนดค่าไว้ (ค่าเริ่มต้น: `Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.`) คำสั่งแบบอินไลน์ในข้อความ Heartbeat จะมีผลตามปกติ (แต่หลีกเลี่ยงการเปลี่ยนค่าเริ่มต้นของเซสชันจาก Heartbeat)
+- การส่ง Heartbeat มีค่าเริ่มต้นเป็นเฉพาะเพย์โหลดสุดท้าย หากต้องการส่งข้อความ `Reasoning:` แยกต่างหากด้วย (เมื่อมี) ให้ตั้งค่า `agents.defaults.heartbeat.includeReasoning: true` หรือ `agents.list[].heartbeat.includeReasoning: true` ราย agent
-## UI เว็บแชต
+## UI แชตบนเว็บ
-- ตัวเลือกการคิดของเว็บแชตสะท้อนระดับที่จัดเก็บไว้ของเซสชันจาก store/config เซสชันขาเข้าเมื่อหน้าโหลด
-- การเลือกระดับอื่นจะเขียนการแทนที่เซสชันทันทีผ่าน `sessions.patch`; ไม่ต้องรอการส่งครั้งถัดไป และไม่ใช่การแทนที่ `thinkingOnce` แบบครั้งเดียว
-- ตัวเลือกแรกคือ `Default ()` เสมอ โดยค่าเริ่มต้นที่แก้ค่าแล้วมาจากโปรไฟล์การคิดของผู้ให้บริการของโมเดลเซสชันที่ใช้งานอยู่ บวกกับตรรกะ fallback เดียวกับที่ `/status` และ `session_status` ใช้
-- ตัวเลือกใช้ `thinkingLevels` ที่ส่งคืนโดยแถว/ค่าเริ่มต้นเซสชันของ Gateway โดยคง `thinkingOptions` เป็นรายการป้ายกำกับเดิม UI เบราว์เซอร์ไม่ได้เก็บรายการ regex ของผู้ให้บริการเอง; Plugin เป็นเจ้าของชุดระดับเฉพาะโมเดล
-- `/think:` ยังคงใช้งานได้และอัปเดตระดับเซสชันที่จัดเก็บเดียวกัน ดังนั้นคำสั่งกำกับในแชตและตัวเลือกจึงซิงค์กัน
+- ตัวเลือกระดับการคิดของแชตบนเว็บจะสะท้อนระดับที่จัดเก็บของเซสชันจาก session store/config ขาเข้าเมื่อหน้าโหลด
+- การเลือกอีกระดับจะเขียนการแทนที่เซสชันทันทีผ่าน `sessions.patch`; ไม่ต้องรอการส่งครั้งถัดไป และไม่ใช่การแทนที่ `thinkingOnce` แบบใช้ครั้งเดียว
+- ตัวเลือกแรกจะเป็น `Default ()` เสมอ โดยค่าเริ่มต้นที่แก้ไขแล้วมาจากโปรไฟล์การคิดของผู้ให้บริการของโมเดลเซสชันที่ใช้งานอยู่ รวมกับตรรกะค่าถอยกลับเดียวกันกับที่ `/status` และ `session_status` ใช้
+- ตัวเลือกใช้ `thinkingLevels` ที่คืนโดยแถวเซสชัน/defaults ของ Gateway โดยคง `thinkingOptions` ไว้เป็นรายการป้ายกำกับแบบเดิม UI เบราว์เซอร์ไม่ได้เก็บรายการ regex ผู้ให้บริการของตัวเอง; Plugin เป็นเจ้าของชุดระดับเฉพาะโมเดล
+- `/think:` ยังคงใช้งานได้และอัปเดตระดับเซสชันที่จัดเก็บเดียวกัน ดังนั้นคำสั่งแชตและตัวเลือกจึงซิงก์กัน
## โปรไฟล์ผู้ให้บริการ
- Plugin ผู้ให้บริการสามารถเปิดเผย `resolveThinkingProfile(ctx)` เพื่อกำหนดระดับที่โมเดลรองรับและค่าเริ่มต้นได้
-- Plugin ผู้ให้บริการที่พร็อกซีโมเดล Claude ควรใช้ `resolveClaudeThinkingProfile(modelId)` จาก `openclaw/plugin-sdk/provider-model-shared` ซ้ำ เพื่อให้แค็ตตาล็อกของ Anthropic โดยตรงและแค็ตตาล็อกพร็อกซีสอดคล้องกัน
-- แต่ละระดับโปรไฟล์มี `id` มาตรฐานที่จัดเก็บไว้ (`off`, `minimal`, `low`, `medium`, `high`, `xhigh`, `adaptive` หรือ `max`) และอาจมี `label` สำหรับแสดงผล ผู้ให้บริการแบบไบนารีใช้ `{ id: "low", label: "on" }`
-- Plugin เครื่องมือที่ต้องตรวจสอบการแทนที่การคิดอย่างชัดเจนควรใช้ `api.runtime.agent.resolveThinkingPolicy({ provider, model })` ร่วมกับ `api.runtime.agent.normalizeThinkingLevel(...)`; ไม่ควรเก็บรายการระดับของผู้ให้บริการ/โมเดลไว้เอง
-- Plugin เครื่องมือที่เข้าถึงเมทาดาทาของโมเดลกำหนดเองที่ตั้งค่าไว้ได้ สามารถส่ง `catalog` เข้าไปใน `resolveThinkingPolicy` เพื่อให้การเลือกใช้ `compat.supportedReasoningEfforts` สะท้อนในการตรวจสอบฝั่ง Plugin
-- ฮุกเดิมที่เผยแพร่แล้ว (`supportsXHighThinking`, `isBinaryThinking` และ `resolveDefaultThinkingLevel`) ยังคงอยู่ในฐานะอะแดปเตอร์ความเข้ากันได้ แต่ชุดระดับแบบกำหนดเองใหม่ควรใช้ `resolveThinkingProfile`
-- แถว/ค่าเริ่มต้นของ Gateway เปิดเผย `thinkingLevels`, `thinkingOptions` และ `thinkingDefault` เพื่อให้ไคลเอนต์ ACP/แชตเรนเดอร์ `id` และป้ายกำกับโปรไฟล์เดียวกับที่การตรวจสอบรันไทม์ใช้
+- Plugin ผู้ให้บริการที่พร็อกซีโมเดล Claude ควรใช้ `resolveClaudeThinkingProfile(modelId)` จาก `openclaw/plugin-sdk/provider-model-shared` ซ้ำ เพื่อให้แคตตาล็อก Anthropic โดยตรงและแคตตาล็อกพร็อกซีสอดคล้องกัน
+- แต่ละระดับของโปรไฟล์มี `id` มาตรฐานที่จัดเก็บไว้ (`off`, `minimal`, `low`, `medium`, `high`, `xhigh`, `adaptive`, หรือ `max`) และอาจมี `label` สำหรับแสดงผล ผู้ให้บริการแบบไบนารีใช้ `{ id: "low", label: "on" }`
+- Plugin เครื่องมือที่ต้องตรวจสอบการกำหนดระดับการคิดทับอย่างชัดเจนควรใช้ `api.runtime.agent.resolveThinkingPolicy({ provider, model })` ร่วมกับ `api.runtime.agent.normalizeThinkingLevel(...)`; ไม่ควรเก็บรายการระดับของผู้ให้บริการ/โมเดลไว้เอง
+- Plugin เครื่องมือที่เข้าถึงเมตาดาต้าโมเดลแบบกำหนดเองที่กำหนดค่าไว้ได้ สามารถส่ง `catalog` เข้าไปใน `resolveThinkingPolicy` เพื่อให้การเลือกใช้ `compat.supportedReasoningEfforts` สะท้อนอยู่ในการตรวจสอบฝั่ง Plugin
+- ฮุกแบบเดิมที่เผยแพร่แล้ว (`supportsXHighThinking`, `isBinaryThinking`, และ `resolveDefaultThinkingLevel`) ยังคงอยู่ในฐานะอะแดปเตอร์ความเข้ากันได้ แต่ชุดระดับแบบกำหนดเองใหม่ควรใช้ `resolveThinkingProfile`
+- แถว/ค่าเริ่มต้นของ Gateway เปิดเผย `thinkingLevels`, `thinkingOptions`, และ `thinkingDefault` เพื่อให้ไคลเอนต์ ACP/แชตแสดงผลรหัสโปรไฟล์และป้ายกำกับเดียวกับที่การตรวจสอบขณะรันไทม์ใช้
diff --git a/docs/th/tools/web-fetch.md b/docs/th/tools/web-fetch.md
index 533cdee4e..af4363356 100644
--- a/docs/th/tools/web-fetch.md
+++ b/docs/th/tools/web-fetch.md
@@ -1,29 +1,29 @@
---
read_when:
- คุณต้องการดึงข้อมูลจาก URL และแยกเนื้อหาที่อ่านได้
- - คุณต้องกำหนดค่า web_fetch หรือ Firecrawl ซึ่งเป็นทางเลือกสำรองของมัน
+ - คุณต้องกำหนดค่า web_fetch หรือกลไกสำรองที่ใช้ Firecrawl
- คุณต้องการทำความเข้าใจข้อจำกัดและการแคชของ web_fetch
sidebarTitle: Web Fetch
-summary: เครื่องมือ web_fetch -- การดึงข้อมูลผ่าน HTTP พร้อมการสกัดเนื้อหาที่อ่านได้
+summary: เครื่องมือ web_fetch -- การดึงข้อมูล HTTP พร้อมการแยกเนื้อหาที่อ่านได้
title: การดึงข้อมูลจากเว็บ
x-i18n:
- generated_at: "2026-05-02T10:32:31Z"
+ generated_at: "2026-05-04T02:28:04Z"
model: gpt-5.5
provider: openai
- source_hash: f455da77c20049f0ed0246fa53e9f49d3cf2004e65bd64a0bf871861c6e93229
+ source_hash: c8c3efbf4a640b2fd69cc9532dcb06a873a6830a2e8a85ab7510ab38207c8670
source_path: tools/web-fetch.md
workflow: 16
---
-เครื่องมือ `web_fetch` ทำ HTTP GET แบบธรรมดาและแยกเนื้อหาที่อ่านได้
-(HTML เป็น markdown หรือข้อความ) เครื่องมือนี้ **ไม่** เรียกใช้ JavaScript
+เครื่องมือ `web_fetch` ทำ HTTP GET แบบธรรมดาและดึงเนื้อหาที่อ่านได้
+(HTML เป็นมาร์กดาวน์หรือข้อความ) เครื่องมือนี้ **ไม่** รัน JavaScript
-สำหรับไซต์ที่พึ่งพา JS มากหรือหน้าที่ป้องกันด้วยการเข้าสู่ระบบ ให้ใช้
+สำหรับไซต์ที่พึ่งพา JS หนักหรือหน้าที่ป้องกันด้วยการเข้าสู่ระบบ ให้ใช้
[เว็บเบราว์เซอร์](/th/tools/browser) แทน
## เริ่มต้นอย่างรวดเร็ว
-`web_fetch` **เปิดใช้งานโดยค่าเริ่มต้น** -- ไม่ต้องกำหนดค่า Agent สามารถ
+`web_fetch` **เปิดใช้งานตามค่าเริ่มต้น** -- ไม่ต้องกำหนดค่า เอเจนต์สามารถ
เรียกใช้ได้ทันที:
```javascript
@@ -33,11 +33,11 @@ await web_fetch({ url: "https://example.com/article" });
## พารามิเตอร์ของเครื่องมือ
-URL ที่จะดึงข้อมูล รองรับเฉพาะ `http(s)` เท่านั้น
+URL ที่จะดึงข้อมูล รองรับเฉพาะ `http(s)`
-รูปแบบเอาต์พุตหลังการแยกเนื้อหาหลัก
+รูปแบบเอาต์พุตหลังจากดึงเนื้อหาหลักแล้ว
@@ -47,20 +47,20 @@ URL ที่จะดึงข้อมูล รองรับเฉพาะ
## วิธีการทำงาน
-
- ส่ง HTTP GET พร้อม User-Agent ที่คล้าย Chrome และ header `Accept-Language`
- บล็อกชื่อโฮสต์ส่วนตัว/ภายใน และตรวจสอบ redirect ซ้ำ
+
+ ส่ง HTTP GET พร้อม User-Agent ที่คล้าย Chrome และส่วนหัว `Accept-Language`
+ บล็อกชื่อโฮสต์ส่วนตัว/ภายใน และตรวจสอบการเปลี่ยนเส้นทางซ้ำ
-
- รัน Readability (การแยกเนื้อหาหลัก) บนการตอบกลับ HTML
+
+ รัน Readability (การดึงเนื้อหาหลัก) กับการตอบกลับ HTML
-
+
หาก Readability ล้มเหลวและมีการกำหนดค่า Firecrawl ไว้ จะลองใหม่ผ่าน
- Firecrawl API ด้วยโหมดหลบเลี่ยงบอท
+ Firecrawl API ด้วยโหมดหลบเลี่ยงบอต
-
- ผลลัพธ์จะถูกแคชเป็นเวลา 15 นาที (กำหนดค่าได้) เพื่อลดการดึงข้อมูล
- URL เดิมซ้ำ
+
+ ผลลัพธ์จะถูกแคชไว้ 15 นาที (กำหนดค่าได้) เพื่อลดการดึงข้อมูลซ้ำ
+ จาก URL เดิม
@@ -79,6 +79,7 @@ URL ที่จะดึงข้อมูล รองรับเฉพาะ
timeoutSeconds: 30,
cacheTtlMinutes: 15,
maxRedirects: 3,
+ useTrustedEnvProxy: false, // let a trusted HTTP(S) env proxy resolve DNS
readability: true, // use Readability extraction
userAgent: "Mozilla/5.0 ...", // override User-Agent
ssrfPolicy: {
@@ -91,10 +92,10 @@ URL ที่จะดึงข้อมูล รองรับเฉพาะ
}
```
-## Firecrawl fallback
+## ตัวเลือกสำรอง Firecrawl
-หากการแยกด้วย Readability ล้มเหลว `web_fetch` สามารถ fallback ไปยัง
-[Firecrawl](/th/tools/firecrawl) เพื่อหลบเลี่ยงบอทและแยกเนื้อหาได้ดีขึ้น:
+หากการดึงเนื้อหาด้วย Readability ล้มเหลว `web_fetch` สามารถใช้
+[Firecrawl](/th/tools/firecrawl) เป็นตัวเลือกสำรองสำหรับการหลบเลี่ยงบอตและการดึงเนื้อหาที่ดีกว่า:
```json5
{
@@ -124,42 +125,60 @@ URL ที่จะดึงข้อมูล รองรับเฉพาะ
}
```
-`plugins.entries.firecrawl.config.webFetch.apiKey` รองรับอ็อบเจกต์ SecretRef
+`plugins.entries.firecrawl.config.webFetch.apiKey` รองรับอ็อบเจ็กต์ SecretRef
การกำหนดค่าเดิม `tools.web.fetch.firecrawl.*` จะถูกย้ายโดยอัตโนมัติด้วย `openclaw doctor --fix`
- หากเปิดใช้งาน Firecrawl และ SecretRef ของมันยัง resolve ไม่ได้โดยไม่มี
- env fallback `FIRECRAWL_API_KEY` การเริ่มต้น Gateway จะล้มเหลวอย่างรวดเร็ว
+ หาก Firecrawl เปิดใช้งานอยู่และ SecretRef ของมันแก้ค่าไม่ได้โดยไม่มี
+ env สำรอง `FIRECRAWL_API_KEY` การเริ่มต้น gateway จะล้มเหลวอย่างรวดเร็ว
- การ override `baseUrl` ของ Firecrawl ถูกจำกัดอย่างเข้มงวด: ทราฟฟิกที่โฮสต์ไว้ใช้
- `https://api.firecrawl.dev`; การ override แบบ self-hosted ต้องชี้ไปยัง endpoint ส่วนตัวหรือ
- ภายใน และ `http://` จะยอมรับเฉพาะสำหรับเป้าหมายส่วนตัวเหล่านั้นเท่านั้น
+ การ override `baseUrl` ของ Firecrawl ถูกจำกัดอย่างเข้มงวด: ทราฟฟิกแบบโฮสต์ใช้
+ `https://api.firecrawl.dev`; การ override แบบ self-hosted ต้องชี้ไปยัง
+ endpoint ส่วนตัวหรือภายใน และยอมรับ `http://` เฉพาะสำหรับเป้าหมายส่วนตัวเหล่านั้น
-พฤติกรรม runtime ปัจจุบัน:
+พฤติกรรมรันไทม์ปัจจุบัน:
-- `tools.web.fetch.provider` เลือกผู้ให้บริการ fetch fallback อย่างชัดเจน
-- หากละ `provider` ไว้ OpenClaw จะตรวจหา web-fetch
- provider ตัวแรกที่พร้อมใช้งานจากข้อมูลรับรองที่มีโดยอัตโนมัติ `web_fetch` แบบไม่อยู่ใน sandbox สามารถใช้
- Plugin ที่ติดตั้งซึ่งประกาศ `contracts.webFetchProviders` และลงทะเบียน
- provider ที่ตรงกันใน runtime ได้ ปัจจุบัน provider ที่รวมมาให้คือ Firecrawl
-- การเรียก `web_fetch` แบบ sandbox จำกัดอยู่ที่ provider ที่รวมมาให้เท่านั้น
-- หากปิดใช้งาน Readability `web_fetch` จะข้ามไปยัง
- provider fallback ที่เลือกไว้ทันที หากไม่มี provider ที่พร้อมใช้งาน จะล้มเหลวแบบปิด
+- `tools.web.fetch.provider` เลือกผู้ให้บริการตัวเลือกสำรองสำหรับการดึงข้อมูลอย่างชัดเจน
+- หากละเว้น `provider` OpenClaw จะตรวจจับผู้ให้บริการ web-fetch รายแรกที่พร้อมใช้งาน
+ จากข้อมูลรับรองที่มีโดยอัตโนมัติ `web_fetch` ที่ไม่อยู่ในแซนด์บ็อกซ์สามารถใช้
+ plugins ที่ติดตั้งซึ่งประกาศ `contracts.webFetchProviders` และลงทะเบียน
+ ผู้ให้บริการที่ตรงกันในรันไทม์ได้ ปัจจุบันผู้ให้บริการที่บันเดิลมาคือ Firecrawl
+- การเรียก `web_fetch` แบบแซนด์บ็อกซ์ยังคงจำกัดไว้เฉพาะผู้ให้บริการที่บันเดิลมา
+- หากปิดใช้งาน Readability `web_fetch` จะข้ามไปยังตัวเลือกสำรองจากผู้ให้บริการที่เลือกทันที
+ หากไม่มีผู้ให้บริการที่พร้อมใช้งาน จะล้มเหลวแบบปิด
-## ขีดจำกัดและความปลอดภัย
+## พร็อกซี Env ที่เชื่อถือได้
-- `maxChars` ถูก clamp ไว้ที่ `tools.web.fetch.maxCharsCap`
-- เนื้อหา response ถูกจำกัดที่ `maxResponseBytes` ก่อนแยกวิเคราะห์ response
- ที่ใหญ่เกินจะถูกตัดพร้อมคำเตือน
+หากการปรับใช้ของคุณต้องให้ `web_fetch` ผ่านพร็อกซี HTTP(S) ขาออก
+ที่เชื่อถือได้ ให้ตั้งค่า `tools.web.fetch.useTrustedEnvProxy: true`
+
+ในโหมดนี้ OpenClaw ยังคงใช้การตรวจสอบ SSRF ตามชื่อโฮสต์ก่อนส่งคำขอ
+แต่จะให้พร็อกซีแก้ DNS แทนการทำ DNS pinning ภายในเครื่อง
+เปิดใช้งานเฉพาะเมื่อพร็อกซีอยู่ภายใต้การควบคุมของผู้ปฏิบัติการและบังคับใช้นโยบาย
+ขาออกหลังจากการแก้ DNS แล้ว
+
+
+ หากไม่มีการกำหนดค่า env var ของพร็อกซี HTTP(S) หรือโฮสต์เป้าหมายถูกยกเว้นโดย
+ `NO_PROXY` `web_fetch` จะกลับไปใช้เส้นทางเข้มงวดปกติพร้อม DNS
+ pinning ภายในเครื่อง
+
+
+## ข้อจำกัดและความปลอดภัย
+
+- `maxChars` ถูกจำกัดไม่ให้เกิน `tools.web.fetch.maxCharsCap`
+- เนื้อหาการตอบกลับถูกจำกัดที่ `maxResponseBytes` ก่อนแยกวิเคราะห์; การตอบกลับที่ใหญ่เกินไป
+ จะถูกตัดพร้อมคำเตือน
- ชื่อโฮสต์ส่วนตัว/ภายในถูกบล็อก
- `tools.web.fetch.ssrfPolicy.allowRfc2544BenchmarkRange` และ
- `tools.web.fetch.ssrfPolicy.allowIpv6UniqueLocalRange` เป็น opt-in แบบแคบ
- สำหรับสแต็กพร็อกซี fake-IP ที่เชื่อถือได้ ให้เว้นว่างไว้ เว้นแต่พร็อกซีของคุณจะเป็นเจ้าของ
+ `tools.web.fetch.ssrfPolicy.allowIpv6UniqueLocalRange` เป็นการ opt-in แบบแคบ
+ สำหรับสแต็กพร็อกซี fake-IP ที่เชื่อถือได้; ปล่อยว่างไว้ เว้นแต่พร็อกซีของคุณจะเป็นเจ้าของ
ช่วงสังเคราะห์เหล่านั้นและบังคับใช้นโยบายปลายทางของตัวเอง
-- Redirect ถูกตรวจสอบและจำกัดโดย `maxRedirects`
+- การเปลี่ยนเส้นทางถูกตรวจสอบและจำกัดโดย `maxRedirects`
+- `useTrustedEnvProxy` เป็นการ opt-in อย่างชัดเจน และควรเปิดใช้งานเฉพาะสำหรับ
+ พร็อกซีที่ผู้ปฏิบัติการควบคุมซึ่งยังคงบังคับใช้นโยบายขาออกหลังการแก้ DNS
- `web_fetch` เป็นแบบ best-effort -- บางไซต์ต้องใช้ [เว็บเบราว์เซอร์](/th/tools/browser)
## โปรไฟล์เครื่องมือ
@@ -177,6 +196,6 @@ URL ที่จะดึงข้อมูล รองรับเฉพาะ
## ที่เกี่ยวข้อง
-- [Web Search](/th/tools/web) -- ค้นหาเว็บด้วยหลาย provider
-- [เว็บเบราว์เซอร์](/th/tools/browser) -- การทำงานอัตโนมัติของเบราว์เซอร์เต็มรูปแบบสำหรับไซต์ที่พึ่งพา JS มาก
+- [ค้นเว็บ](/th/tools/web) -- ค้นหาเว็บด้วยผู้ให้บริการหลายราย
+- [เว็บเบราว์เซอร์](/th/tools/browser) -- การทำงานอัตโนมัติของเบราว์เซอร์เต็มรูปแบบสำหรับไซต์ที่พึ่งพา JS หนัก
- [Firecrawl](/th/tools/firecrawl) -- เครื่องมือค้นหาและ scrape ของ Firecrawl
diff --git a/docs/th/web/control-ui.md b/docs/th/web/control-ui.md
index 627325038..73e6771ac 100644
--- a/docs/th/web/control-ui.md
+++ b/docs/th/web/control-ui.md
@@ -1,238 +1,239 @@
---
read_when:
- คุณต้องการใช้งาน Gateway จากเบราว์เซอร์
- - คุณต้องการเข้าถึง Tailnet โดยไม่ต้องใช้อุโมงค์ SSH
+ - คุณต้องการเข้าถึง Tailnet โดยไม่ใช้อุโมงค์ SSH
sidebarTitle: Control UI
-summary: อินเทอร์เฟซควบคุมบนเบราว์เซอร์สำหรับ Gateway (แชต, โหนด, การกำหนดค่า)
+summary: UI ควบคุมที่ทำงานบนเบราว์เซอร์สำหรับ Gateway (แชท, โหนด, การกำหนดค่า)
title: อินเทอร์เฟซควบคุม
x-i18n:
- generated_at: "2026-05-03T10:18:46Z"
+ generated_at: "2026-05-04T02:28:08Z"
model: gpt-5.5
provider: openai
- source_hash: 88959ccf435b31015039bf28c3043023d99f0b953a1489986ab2d0cbd261771c
+ source_hash: c890d83da2c296b600e4b5a00a538f37e6bd54da31fbe62113ecd6177b15626e
source_path: web/control-ui.md
workflow: 16
---
-UI ควบคุมเป็นแอปหน้าเดียว **Vite + Lit** ขนาดเล็กที่ให้บริการโดย Gateway:
+UI ควบคุมเป็นแอปหน้าเดียวขนาดเล็กแบบ **Vite + Lit** ที่ให้บริการโดย Gateway:
- ค่าเริ่มต้น: `http://:18789/`
- คำนำหน้าแบบไม่บังคับ: ตั้งค่า `gateway.controlUi.basePath` (เช่น `/openclaw`)
-แอปสื่อสาร **โดยตรงกับ Gateway WebSocket** บนพอร์ตเดียวกัน
+แอปนี้สื่อสาร **โดยตรงกับ Gateway WebSocket** บนพอร์ตเดียวกัน
-## เปิดอย่างรวดเร็ว (ในเครื่อง)
+## เปิดใช้งานด่วน (ภายในเครื่อง)
-หาก Gateway กำลังทำงานบนคอมพิวเตอร์เครื่องเดียวกัน ให้เปิด:
+หาก Gateway กำลังทำงานอยู่บนคอมพิวเตอร์เครื่องเดียวกัน ให้เปิด:
- [http://127.0.0.1:18789/](http://127.0.0.1:18789/) (หรือ [http://localhost:18789/](http://localhost:18789/))
-หากหน้าโหลดไม่สำเร็จ ให้เริ่ม Gateway ก่อน: `openclaw gateway`
+หากหน้าเว็บโหลดไม่สำเร็จ ให้เริ่ม Gateway ก่อน: `openclaw gateway`
การยืนยันตัวตนถูกส่งระหว่าง WebSocket handshake ผ่าน:
- `connect.params.auth.token`
- `connect.params.auth.password`
-- ส่วนหัวข้อมูลระบุตัวตนของ Tailscale Serve เมื่อ `gateway.auth.allowTailscale: true`
-- ส่วนหัวข้อมูลระบุตัวตนของพร็อกซีที่เชื่อถือได้เมื่อ `gateway.auth.mode: "trusted-proxy"`
+- ส่วนหัวข้อมูลประจำตัวของ Tailscale Serve เมื่อ `gateway.auth.allowTailscale: true`
+- ส่วนหัวข้อมูลประจำตัวของพร็อกซีที่เชื่อถือได้เมื่อ `gateway.auth.mode: "trusted-proxy"`
-แผงการตั้งค่าของแดชบอร์ดเก็บโทเค็นสำหรับเซสชันแท็บเบราว์เซอร์ปัจจุบันและ URL ของ gateway ที่เลือกไว้ โดยจะไม่เก็บรหัสผ่านไว้ถาวร โดยทั่วไปการเริ่มใช้งานครั้งแรกจะสร้างโทเค็น gateway สำหรับการยืนยันตัวตนแบบ shared-secret ในการเชื่อมต่อครั้งแรก แต่การยืนยันตัวตนด้วยรหัสผ่านก็ใช้งานได้เช่นกันเมื่อ `gateway.auth.mode` เป็น `"password"`
+แผงการตั้งค่าแดชบอร์ดจะเก็บ token สำหรับเซสชันแท็บเบราว์เซอร์ปัจจุบันและ URL Gateway ที่เลือกไว้ ส่วนรหัสผ่านจะไม่ถูกจัดเก็บไว้ โดยปกติ onboarding จะสร้าง gateway token สำหรับการยืนยันตัวตนแบบความลับร่วมเมื่อเชื่อมต่อครั้งแรก แต่การยืนยันตัวตนด้วยรหัสผ่านก็ใช้งานได้เช่นกันเมื่อ `gateway.auth.mode` เป็น `"password"`
## การจับคู่อุปกรณ์ (การเชื่อมต่อครั้งแรก)
-เมื่อคุณเชื่อมต่อกับ UI ควบคุมจากเบราว์เซอร์หรืออุปกรณ์ใหม่ Gateway มักต้องการ **การอนุมัติการจับคู่แบบครั้งเดียว** นี่เป็นมาตรการรักษาความปลอดภัยเพื่อป้องกันการเข้าถึงที่ไม่ได้รับอนุญาต
+เมื่อคุณเชื่อมต่อกับ UI ควบคุมจากเบราว์เซอร์หรืออุปกรณ์ใหม่ โดยปกติ Gateway จะต้องมี **การอนุมัติการจับคู่แบบครั้งเดียว** นี่เป็นมาตรการรักษาความปลอดภัยเพื่อป้องกันการเข้าถึงโดยไม่ได้รับอนุญาต
**สิ่งที่คุณจะเห็น:** "disconnected (1008): pairing required"
-
+
```bash
openclaw devices list
```
-
+
```bash
openclaw devices approve
```
-หากเบราว์เซอร์ลองจับคู่อีกครั้งด้วยรายละเอียดการยืนยันตัวตนที่เปลี่ยนไป (บทบาท/ขอบเขต/กุญแจสาธารณะ) คำขอที่รอดำเนินการก่อนหน้าจะถูกแทนที่ และจะสร้าง `requestId` ใหม่ ให้รัน `openclaw devices list` อีกครั้งก่อนอนุมัติ
+หากเบราว์เซอร์ลองจับคู่อีกครั้งโดยมีรายละเอียดการยืนยันตัวตนเปลี่ยนไป (บทบาท/ขอบเขต/กุญแจสาธารณะ) คำขอที่รอดำเนินการก่อนหน้าจะถูกแทนที่ และจะมีการสร้าง `requestId` ใหม่ ให้รัน `openclaw devices list` อีกครั้งก่อนอนุมัติ
-หากเบราว์เซอร์จับคู่แล้วและคุณเปลี่ยนจากสิทธิ์อ่านเป็นสิทธิ์เขียน/ผู้ดูแลระบบ ระบบจะถือว่าเป็นการอัปเกรดการอนุมัติ ไม่ใช่การเชื่อมต่อใหม่แบบเงียบ OpenClaw จะคงการอนุมัติเก่าให้ใช้งานอยู่ บล็อกการเชื่อมต่อใหม่ที่มีสิทธิ์กว้างขึ้น และขอให้คุณอนุมัติชุดขอบเขตใหม่อย่างชัดเจน
+หากเบราว์เซอร์จับคู่แล้ว และคุณเปลี่ยนจากสิทธิ์อ่านเป็นสิทธิ์เขียน/ผู้ดูแลระบบ ระบบจะถือว่านี่เป็นการอัปเกรดการอนุมัติ ไม่ใช่การเชื่อมต่อใหม่แบบเงียบ ๆ OpenClaw จะคงการอนุมัติเดิมไว้ บล็อกการเชื่อมต่อใหม่ที่มีขอบเขตกว้างกว่า และขอให้คุณอนุมัติชุดขอบเขตใหม่อย่างชัดเจน
-เมื่ออนุมัติแล้ว ระบบจะจำอุปกรณ์ไว้และจะไม่ต้องอนุมัติซ้ำ เว้นแต่คุณเพิกถอนด้วย `openclaw devices revoke --device --role ` ดู [CLI อุปกรณ์](/th/cli/devices) สำหรับการหมุนเวียนและการเพิกถอนโทเค็น
+เมื่ออนุมัติแล้ว อุปกรณ์จะถูกจดจำและจะไม่ต้องอนุมัติซ้ำ เว้นแต่คุณจะเพิกถอนด้วย `openclaw devices revoke --device --role ` ดู [CLI อุปกรณ์](/th/cli/devices) สำหรับการหมุนเวียน token และการเพิกถอน
-- การเชื่อมต่อเบราว์เซอร์ผ่าน local loopback โดยตรง (`127.0.0.1` / `localhost`) จะได้รับการอนุมัติโดยอัตโนมัติ
-- Tailscale Serve สามารถข้ามรอบการจับคู่สำหรับเซสชันผู้ควบคุม UI ควบคุมได้เมื่อ `gateway.auth.allowTailscale: true`, ข้อมูลระบุตัวตนของ Tailscale ผ่านการตรวจสอบ และเบราว์เซอร์แสดงข้อมูลระบุตัวตนของอุปกรณ์
-- การผูกกับ Tailnet โดยตรง การเชื่อมต่อเบราว์เซอร์ผ่าน LAN และโปรไฟล์เบราว์เซอร์ที่ไม่มีข้อมูลระบุตัวตนของอุปกรณ์ยังคงต้องได้รับการอนุมัติอย่างชัดเจน
-- โปรไฟล์เบราว์เซอร์แต่ละโปรไฟล์จะสร้าง ID อุปกรณ์ที่ไม่ซ้ำกัน ดังนั้นการเปลี่ยนเบราว์เซอร์หรือล้างข้อมูลเบราว์เซอร์จะต้องจับคู่ใหม่
+- การเชื่อมต่อเบราว์เซอร์แบบ local loopback โดยตรง (`127.0.0.1` / `localhost`) จะได้รับการอนุมัติอัตโนมัติ
+- Tailscale Serve สามารถข้ามรอบการจับคู่สำหรับเซสชันผู้ปฏิบัติงานของ UI ควบคุมได้เมื่อ `gateway.auth.allowTailscale: true`, ข้อมูลประจำตัว Tailscale ตรวจสอบผ่าน และเบราว์เซอร์แสดงข้อมูลประจำตัวของอุปกรณ์
+- การผูก Tailnet โดยตรง การเชื่อมต่อเบราว์เซอร์ผ่าน LAN และโปรไฟล์เบราว์เซอร์ที่ไม่มีข้อมูลประจำตัวอุปกรณ์ยังคงต้องได้รับการอนุมัติอย่างชัดเจน
+- โปรไฟล์เบราว์เซอร์แต่ละรายการจะสร้าง ID อุปกรณ์ที่ไม่ซ้ำกัน ดังนั้นการเปลี่ยนเบราว์เซอร์หรือล้างข้อมูลเบราว์เซอร์จะต้องจับคู่ใหม่
-## ข้อมูลระบุตัวตนส่วนบุคคล (เฉพาะเบราว์เซอร์)
+## ข้อมูลประจำตัวส่วนบุคคล (ภายในเบราว์เซอร์)
-UI ควบคุมรองรับข้อมูลระบุตัวตนส่วนบุคคลต่อเบราว์เซอร์ (ชื่อที่แสดงและอวาตาร์) ที่แนบกับข้อความขาออกเพื่อใช้ระบุผู้ส่งในเซสชันที่ใช้ร่วมกัน ข้อมูลนี้อยู่ในพื้นที่จัดเก็บของเบราว์เซอร์ จำกัดขอบเขตอยู่ที่โปรไฟล์เบราว์เซอร์ปัจจุบัน และจะไม่ซิงค์ไปยังอุปกรณ์อื่นหรือคงอยู่ฝั่งเซิร์ฟเวอร์นอกเหนือจากเมตาดาต้าผู้เขียนทรานสคริปต์ตามปกติในข้อความที่คุณส่งจริง การล้างข้อมูลไซต์หรือเปลี่ยนเบราว์เซอร์จะรีเซ็ตข้อมูลนี้ให้ว่างเปล่า
+UI ควบคุมรองรับข้อมูลประจำตัวส่วนบุคคลต่อเบราว์เซอร์ (ชื่อที่แสดงและอวาตาร์) ซึ่งแนบกับข้อความขาออกเพื่อระบุผู้ส่งในเซสชันที่ใช้ร่วมกัน ข้อมูลนี้อยู่ในที่เก็บข้อมูลของเบราว์เซอร์ จำกัดขอบเขตอยู่ที่โปรไฟล์เบราว์เซอร์ปัจจุบัน และไม่ซิงค์ไปยังอุปกรณ์อื่นหรือคงอยู่ฝั่งเซิร์ฟเวอร์ นอกเหนือจากเมตาดาต้าผู้เขียน transcript ตามปกติบนข้อความที่คุณส่งจริง การล้างข้อมูลไซต์หรือเปลี่ยนเบราว์เซอร์จะรีเซ็ตข้อมูลนี้ให้ว่างเปล่า
-รูปแบบเฉพาะเบราว์เซอร์เดียวกันใช้กับการแทนที่อวาตาร์ของผู้ช่วยด้วย อวาตาร์ผู้ช่วยที่อัปโหลดจะซ้อนทับข้อมูลระบุตัวตนที่ gateway แก้ไขได้เฉพาะในเบราว์เซอร์ภายในเครื่องเท่านั้น และจะไม่ส่งไปกลับผ่าน `config.patch` ฟิลด์คอนฟิก `ui.assistant.avatar` ที่ใช้ร่วมกันยังคงพร้อมใช้งานสำหรับไคลเอนต์ที่ไม่ใช่ UI ซึ่งเขียนฟิลด์นี้โดยตรง (เช่น gateway แบบสคริปต์หรือแดชบอร์ดกำหนดเอง)
+รูปแบบภายในเบราว์เซอร์เดียวกันนี้ใช้กับการแทนที่อวาตาร์ของผู้ช่วยด้วย อวาตาร์ผู้ช่วยที่อัปโหลดจะซ้อนทับข้อมูลประจำตัวที่ Gateway แก้ไขได้เฉพาะบนเบราว์เซอร์ภายในเครื่องเท่านั้น และจะไม่เดินทางไปกลับผ่าน `config.patch` ฟิลด์ config ที่ใช้ร่วมกัน `ui.assistant.avatar` ยังคงพร้อมใช้งานสำหรับไคลเอนต์ที่ไม่ใช่ UI ซึ่งเขียนฟิลด์นี้โดยตรง (เช่น gateway แบบสคริปต์หรือแดชบอร์ดแบบกำหนดเอง)
-## เอ็นด์พอยต์คอนฟิกรันไทม์
+## ปลายทาง config ขณะรันไทม์
-UI ควบคุมดึงการตั้งค่ารันไทม์จาก `/__openclaw/control-ui-config.json` เอ็นด์พอยต์นี้ถูกควบคุมด้วยการยืนยันตัวตน gateway เดียวกันกับพื้นผิว HTTP ส่วนที่เหลือ: เบราว์เซอร์ที่ไม่ผ่านการยืนยันตัวตนจะดึงข้อมูลไม่ได้ และการดึงข้อมูลสำเร็จต้องมีโทเค็น/รหัสผ่าน gateway ที่ถูกต้องอยู่แล้ว ข้อมูลระบุตัวตนของ Tailscale Serve หรือข้อมูลระบุตัวตนของพร็อกซีที่เชื่อถือได้
+UI ควบคุมดึงการตั้งค่าขณะรันไทม์จาก `/__openclaw/control-ui-config.json` ปลายทางนี้ถูกควบคุมด้วยการยืนยันตัวตน Gateway เดียวกับพื้นผิว HTTP ส่วนที่เหลือ: เบราว์เซอร์ที่ไม่ได้ยืนยันตัวตนจะดึงข้อมูลไม่ได้ และการดึงข้อมูลสำเร็จต้องมี gateway token/รหัสผ่านที่ถูกต้องอยู่แล้ว ข้อมูลประจำตัว Tailscale Serve หรือข้อมูลประจำตัวพร็อกซีที่เชื่อถือได้
## การรองรับภาษา
-UI ควบคุมสามารถแปลอินเทอร์เฟซของตัวเองเมื่อโหลดครั้งแรกตามภาษาของเบราว์เซอร์ของคุณ หากต้องการแทนที่ภายหลัง ให้เปิด **ภาพรวม -> การเข้าถึง Gateway -> ภาษา** ตัวเลือกภาษาอยู่ในการ์ดการเข้าถึง Gateway ไม่ได้อยู่ใต้รูปลักษณ์
+UI ควบคุมสามารถแปลตัวเองตาม locale ของเบราว์เซอร์ในการโหลดครั้งแรก หากต้องการแทนที่ภายหลัง ให้เปิด **ภาพรวม -> การเข้าถึง Gateway -> ภาษา** ตัวเลือก locale อยู่ในการ์ดการเข้าถึง Gateway ไม่ได้อยู่ใต้ลักษณะภายนอก
-- ภาษาที่รองรับ: `en`, `zh-CN`, `zh-TW`, `pt-BR`, `de`, `es`, `ja-JP`, `ko`, `fr`, `ar`, `it`, `tr`, `uk`, `id`, `pl`, `th`, `vi`, `nl`, `fa`
-- คำแปลที่ไม่ใช่ภาษาอังกฤษจะถูกโหลดแบบ lazy-load ในเบราว์เซอร์
-- ภาษาที่เลือกจะถูกบันทึกไว้ในพื้นที่จัดเก็บของเบราว์เซอร์และนำกลับมาใช้ในการเข้าชมครั้งต่อไป
-- คีย์คำแปลที่ขาดหายจะ fallback เป็นภาษาอังกฤษ
+- locale ที่รองรับ: `en`, `zh-CN`, `zh-TW`, `pt-BR`, `de`, `es`, `ja-JP`, `ko`, `fr`, `ar`, `it`, `tr`, `uk`, `id`, `pl`, `th`, `vi`, `nl`, `fa`
+- คำแปลที่ไม่ใช่ภาษาอังกฤษจะถูกโหลดแบบ lazy ในเบราว์เซอร์
+- locale ที่เลือกจะถูกบันทึกในที่เก็บข้อมูลของเบราว์เซอร์และนำกลับมาใช้ในการเข้าชมครั้งต่อไป
+- คีย์คำแปลที่หายไปจะถอยกลับไปใช้ภาษาอังกฤษ
-คำแปลเอกสารถูกสร้างสำหรับชุดภาษาที่ไม่ใช่ภาษาอังกฤษเดียวกัน แต่ตัวเลือกภาษาที่มีอยู่ในไซต์เอกสารของ Mintlify จำกัดอยู่ที่รหัสภาษาที่ Mintlify ยอมรับ เอกสารภาษาไทย (`th`) และเปอร์เซีย (`fa`) ยังคงถูกสร้างใน publish repo แต่อาจไม่ปรากฏในตัวเลือกนั้นจนกว่า Mintlify จะรองรับรหัสเหล่านั้น
+คำแปลเอกสารถูกสร้างสำหรับชุด locale ที่ไม่ใช่ภาษาอังกฤษเดียวกัน แต่ตัวเลือกภาษา Mintlify ในตัวของไซต์เอกสารจำกัดเฉพาะรหัส locale ที่ Mintlify ยอมรับ เอกสารภาษาไทย (`th`) และเปอร์เซีย (`fa`) ยังคงถูกสร้างใน publish repo แต่อาจยังไม่ปรากฏในตัวเลือกนั้นจนกว่า Mintlify จะรองรับรหัสเหล่านี้
-## ธีมรูปลักษณ์
+## ธีมลักษณะภายนอก
-แผงรูปลักษณ์เก็บธีม Claw, Knot และ Dash ในตัว รวมถึงสล็อตนำเข้า tweakcn เฉพาะเบราว์เซอร์หนึ่งสล็อต หากต้องการนำเข้าธีม ให้เปิด [ธีม tweakcn](https://tweakcn.com/themes) เลือกหรือสร้างธีม คลิก **แชร์** แล้ววางลิงก์ธีมที่คัดลอกลงในรูปลักษณ์ ตัวนำเข้ายังรองรับ URL รีจิสทรี `https://tweakcn.com/r/themes/`, URL ตัวแก้ไขเช่น `https://tweakcn.com/editor/theme?theme=amethyst-haze`, พาธสัมพัทธ์ `/themes/`, ID ธีมดิบ และชื่อธีมเริ่มต้น เช่น `amethyst-haze`
+แผงลักษณะภายนอกเก็บธีมในตัว Claw, Knot และ Dash รวมถึงช่องนำเข้า tweakcn แบบภายในเบราว์เซอร์หนึ่งช่อง หากต้องการนำเข้าธีม ให้เปิด [ธีม tweakcn](https://tweakcn.com/themes), เลือกหรือสร้างธีม, คลิก **แชร์** แล้ววางลิงก์ธีมที่คัดลอกไว้ในลักษณะภายนอก ตัวนำเข้ายังรองรับ URL registry แบบ `https://tweakcn.com/r/themes/`, URL editor เช่น `https://tweakcn.com/editor/theme?theme=amethyst-haze`, พาธสัมพัทธ์ `/themes/`, ID ธีมดิบ และชื่อธีมเริ่มต้น เช่น `amethyst-haze`
-ธีมที่นำเข้าจะถูกเก็บไว้เฉพาะในโปรไฟล์เบราว์เซอร์ปัจจุบันเท่านั้น ธีมเหล่านี้จะไม่ถูกเขียนลงในคอนฟิก gateway และจะไม่ซิงค์ข้ามอุปกรณ์ การแทนที่ธีมที่นำเข้าจะอัปเดตสล็อตภายในเครื่องหนึ่งสล็อต การล้างธีมจะเปลี่ยนธีมที่ใช้งานอยู่กลับเป็น Claw หากธีมที่นำเข้าเป็นธีมที่ถูกเลือกอยู่
+ธีมที่นำเข้าจะถูกเก็บไว้เฉพาะในโปรไฟล์เบราว์เซอร์ปัจจุบันเท่านั้น ธีมเหล่านี้จะไม่ถูกเขียนลงใน config ของ Gateway และไม่ซิงค์ข้ามอุปกรณ์ การแทนที่ธีมที่นำเข้าจะอัปเดตช่องภายในหนึ่งช่องนั้น การล้างธีมจะเปลี่ยนธีมที่ใช้งานอยู่กลับเป็น Claw หากธีมที่นำเข้าถูกเลือกอยู่
-## สิ่งที่ทำได้ (วันนี้)
+## สิ่งที่ทำได้ (ปัจจุบัน)
-
+
- แชทกับโมเดลผ่าน Gateway WS (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`)
- - พูดคุยผ่านเซสชันเรียลไทม์ของเบราว์เซอร์ OpenAI ใช้ WebRTC โดยตรง, Google Live ใช้โทเค็นเบราว์เซอร์แบบใช้ครั้งเดียวที่ถูกจำกัดผ่าน WebSocket และ Plugin เสียงเรียลไทม์แบบ backend-only ใช้การขนส่งรีเลย์ของ Gateway รีเลย์จะเก็บข้อมูลรับรองของผู้ให้บริการไว้บน Gateway ขณะที่เบราว์เซอร์สตรีม PCM ไมโครโฟนผ่าน RPC `talk.realtime.relay*` และส่ง tool call `openclaw_agent_consult` กลับผ่าน `chat.send` สำหรับโมเดล OpenClaw ขนาดใหญ่กว่าที่กำหนดค่าไว้
- - สตรีม tool call + การ์ดเอาต์พุตเครื่องมือสดในแชท (เหตุการณ์ของเอเจนต์)
+ - พูดคุยผ่านเซสชันเรียลไทม์ของเบราว์เซอร์ OpenAI ใช้ WebRTC โดยตรง, Google Live ใช้ token เบราว์เซอร์แบบใช้ครั้งเดียวที่ถูกจำกัดผ่าน WebSocket และ plugin เสียงเรียลไทม์แบบ backend-only ใช้ทรานสปอร์ต relay ของ Gateway relay จะเก็บข้อมูลรับรองของผู้ให้บริการไว้บน Gateway ขณะที่เบราว์เซอร์สตรีม PCM จากไมโครโฟนผ่าน RPC `talk.realtime.relay*` และส่งการเรียกเครื่องมือ `openclaw_agent_consult` กลับผ่าน `chat.send` สำหรับโมเดล OpenClaw ขนาดใหญ่กว่าที่กำหนดค่าไว้
+ - สตรีมการเรียกเครื่องมือ + การ์ดผลลัพธ์เครื่องมือสดในแชท (เหตุการณ์ agent)
-
- - ช่องทาง: สถานะช่องทางในตัวรวมถึงช่องทาง Plugin ที่ bundle/ภายนอก, การเข้าสู่ระบบด้วย QR และคอนฟิกต่อช่องทาง (`channels.status`, `web.login.*`, `config.patch`)
+
+ - ช่องทาง: สถานะช่องทางในตัวรวมถึง plugin ที่ bundled/ภายนอก, การเข้าสู่ระบบ QR และ config รายช่องทาง (`channels.status`, `web.login.*`, `config.patch`)
- อินสแตนซ์: รายการ presence + รีเฟรช (`system-presence`)
- - เซสชัน: รายการ + การแทนที่โมเดล/thinking/fast/verbose/trace/reasoning ต่อเซสชัน (`sessions.list`, `sessions.patch`)
- - ความฝัน: สถานะ dreaming, สวิตช์เปิด/ปิด และตัวอ่าน Dream Diary (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`)
+ - เซสชัน: รายการ + การแทนที่โมเดล/thinking/fast/verbose/trace/reasoning รายเซสชัน (`sessions.list`, `sessions.patch`)
+ - ความฝัน: สถานะ dreaming, สวิตช์เปิด/ปิด และตัวอ่านบันทึกความฝัน (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`)
-
+
- งาน Cron: แสดงรายการ/เพิ่ม/แก้ไข/รัน/เปิดใช้งาน/ปิดใช้งาน + ประวัติการรัน (`cron.*`)
- Skills: สถานะ, เปิดใช้งาน/ปิดใช้งาน, ติดตั้ง, อัปเดต API key (`skills.*`)
- - โหนด: รายการ + ความสามารถ (`node.list`)
- - การอนุมัติ exec: แก้ไข allowlist ของ gateway หรือโหนด + นโยบายถามสำหรับ `exec host=gateway/node` (`exec.approvals.*`)
+ - Node: รายการ + caps (`node.list`)
+ - การอนุมัติ exec: แก้ไข allowlist ของ gateway หรือ node + นโยบาย ask สำหรับ `exec host=gateway/node` (`exec.approvals.*`)
- ดู/แก้ไข `~/.openclaw/openclaw.json` (`config.get`, `config.set`)
- - ใช้การเปลี่ยนแปลง + รีสตาร์ทพร้อมการตรวจสอบ (`config.apply`) และปลุกเซสชันที่ใช้งานล่าสุด
- - การเขียนมีตัวป้องกัน base-hash เพื่อป้องกันการเขียนทับการแก้ไขพร้อมกัน
- - การเขียน (`config.set`/`config.apply`/`config.patch`) จะ preflight การแก้ไข SecretRef ที่ใช้งานอยู่สำหรับ ref ใน payload คอนฟิกที่ส่งมา; ref ที่ส่งมาซึ่งใช้งานอยู่แต่แก้ไขไม่ได้จะถูกปฏิเสธก่อนเขียน
- - สคีมา + การเรนเดอร์ฟอร์ม (`config.schema` / `config.schema.lookup`, รวมถึงฟิลด์ `title` / `description`, คำแนะนำ UI ที่ตรงกัน, สรุปลูกโดยตรง, เมตาดาต้าเอกสารบนโหนดออบเจกต์ซ้อน/ไวลด์การ์ด/อาร์เรย์/คอมโพสิต รวมถึงสคีมา Plugin + ช่องทางเมื่อพร้อมใช้งาน); ตัวแก้ไข Raw JSON จะพร้อมใช้งานเฉพาะเมื่อ snapshot สามารถ round-trip แบบ raw ได้อย่างปลอดภัย
- - หาก snapshot ไม่สามารถ round-trip ข้อความ raw ได้อย่างปลอดภัย UI ควบคุมจะบังคับใช้โหมดฟอร์มและปิดใช้โหมด Raw สำหรับ snapshot นั้น
- - ตัวแก้ไข Raw JSON "รีเซ็ตเป็นที่บันทึกไว้" จะคงรูปทรงที่เขียนแบบ raw ไว้ (การจัดรูปแบบ, ความคิดเห็น, เลย์เอาต์ `$include`) แทนการเรนเดอร์ snapshot แบบแบนใหม่ ดังนั้นการแก้ไขภายนอกจะยังคงอยู่หลังรีเซ็ตเมื่อ snapshot สามารถ round-trip ได้อย่างปลอดภัย
- - ค่าออบเจกต์ SecretRef แบบมีโครงสร้างจะถูกเรนเดอร์เป็นแบบอ่านอย่างเดียวในอินพุตข้อความของฟอร์มเพื่อป้องกันการทำให้ออบเจกต์เสียหายเป็นสตริงโดยไม่ตั้งใจ
+ - ใช้ค่า + รีสตาร์ทพร้อมการตรวจสอบความถูกต้อง (`config.apply`) และปลุกเซสชันที่ใช้งานล่าสุด
+ - การเขียนมี guard แบบ base-hash เพื่อป้องกันการทับการแก้ไขพร้อมกัน
+ - การเขียน (`config.set`/`config.apply`/`config.patch`) จะ preflight การแก้ SecretRef ที่ใช้งานอยู่สำหรับ ref ใน payload config ที่ส่งมา; ref ที่ส่งมาซึ่งใช้งานอยู่แต่แก้ไม่ได้จะถูกปฏิเสธก่อนเขียน
+ - การเรนเดอร์ schema + form (`config.schema` / `config.schema.lookup`, รวมถึงฟิลด์ `title` / `description`, hint ของ UI ที่ตรงกัน, สรุปลูกโดยตรง, เมตาดาต้าเอกสารบนโหนด object/wildcard/array/composition ที่ซ้อนกัน รวมถึง schema ของ plugin + ช่องทางเมื่อมี); editor Raw JSON พร้อมใช้งานเฉพาะเมื่อ snapshot มี raw round-trip ที่ปลอดภัย
+ - หาก snapshot ไม่สามารถ round-trip ข้อความ raw ได้อย่างปลอดภัย Control UI จะบังคับใช้โหมด Form และปิดใช้งานโหมด Raw สำหรับ snapshot นั้น
+ - editor Raw JSON "รีเซ็ตเป็นค่าที่บันทึกไว้" จะรักษารูปทรงที่เขียนแบบ raw (การจัดรูปแบบ, ความคิดเห็น, layout `$include`) แทนการเรนเดอร์ snapshot แบบแบนใหม่ ดังนั้นการแก้ไขภายนอกจะยังอยู่หลังรีเซ็ตเมื่อ snapshot สามารถ round-trip ได้อย่างปลอดภัย
+ - ค่า object SecretRef แบบมีโครงสร้างจะแสดงเป็นแบบอ่านอย่างเดียวใน input ข้อความของฟอร์ม เพื่อป้องกันการทำให้ object กลายเป็น string โดยไม่ตั้งใจ
-
+
- ดีบัก: snapshot สถานะ/สุขภาพ/โมเดล + บันทึกเหตุการณ์ + การเรียก RPC ด้วยตนเอง (`status`, `health`, `models.list`)
- - ล็อก: tail สดของล็อกไฟล์ gateway พร้อมตัวกรอง/ส่งออก (`logs.tail`)
- - อัปเดต: รันการอัปเดต package/git + รีสตาร์ท (`update.run`) พร้อมรายงานการรีสตาร์ท จากนั้น poll `update.status` หลังเชื่อมต่อใหม่เพื่อตรวจสอบเวอร์ชัน gateway ที่กำลังรัน
+ - บันทึก: tail สดของไฟล์ log ของ gateway พร้อมตัวกรอง/ส่งออก (`logs.tail`)
+ - อัปเดต: รันการอัปเดต package/git + รีสตาร์ท (`update.run`) พร้อมรายงานการรีสตาร์ท จากนั้น poll `update.status` หลังเชื่อมต่อใหม่เพื่อตรวจสอบเวอร์ชัน gateway ที่กำลังทำงาน
-
- - สำหรับงานแบบแยก การส่งมอบจะมีค่าเริ่มต้นเป็นการประกาศสรุป คุณสามารถเปลี่ยนเป็นไม่มีได้หากต้องการรันภายในเท่านั้น
+
+ - สำหรับงานแบบแยกเดี่ยว ค่า delivery เริ่มต้นคือการประกาศสรุป คุณสามารถเปลี่ยนเป็น none ได้หากต้องการการรันภายในเท่านั้น
- ฟิลด์ช่องทาง/เป้าหมายจะปรากฏเมื่อเลือกประกาศ
- - โหมด Webhook ใช้ `delivery.mode = "webhook"` โดยตั้งค่า `delivery.to` เป็น URL Webhook HTTP(S) ที่ถูกต้อง
- - สำหรับงานเซสชันหลัก มีโหมดการส่งมอบ Webhook และไม่มีให้ใช้
- - ตัวควบคุมการแก้ไขขั้นสูงรวมถึง delete-after-run, ล้างการแทนที่เอเจนต์, ตัวเลือก cron แบบ exact/stagger, การแทนที่โมเดล/thinking ของเอเจนต์ และสวิตช์การส่งมอบแบบ best-effort
- - การตรวจสอบฟอร์มเป็นแบบ inline พร้อมข้อผิดพลาดระดับฟิลด์; ค่าที่ไม่ถูกต้องจะปิดใช้ปุ่มบันทึกจนกว่าจะแก้ไขแล้ว
- - ตั้งค่า `cron.webhookToken` เพื่อส่ง bearer token เฉพาะ หากละไว้ Webhook จะถูกส่งโดยไม่มีส่วนหัวการยืนยันตัวตน
- - fallback ที่เลิกใช้แล้ว: งาน legacy ที่จัดเก็บไว้พร้อม `notify: true` ยังสามารถใช้ `cron.webhook` ได้จนกว่าจะย้ายข้อมูล
+ - โหมด Webhook ใช้ `delivery.mode = "webhook"` โดยตั้งค่า `delivery.to` เป็น URL HTTP(S) webhook ที่ถูกต้อง
+ - สำหรับงาน main-session จะมีโหมด delivery แบบ webhook และ none ให้ใช้
+ - ตัวควบคุมการแก้ไขขั้นสูงรวมถึง delete-after-run, ล้าง agent override, ตัวเลือก cron exact/stagger, การแทนที่โมเดล/thinking ของ agent และสวิตช์ delivery แบบ best-effort
+ - การตรวจสอบความถูกต้องของฟอร์มอยู่ในบรรทัดเดียวกับข้อผิดพลาดระดับฟิลด์; ค่าที่ไม่ถูกต้องจะปิดใช้งานปุ่มบันทึกจนกว่าจะได้รับการแก้ไข
+ - ตั้งค่า `cron.webhookToken` เพื่อส่ง bearer token เฉพาะ หากละเว้น webhook จะถูกส่งโดยไม่มีส่วนหัว auth
+ - fallback ที่เลิกใช้แล้ว: งาน legacy ที่เก็บไว้พร้อม `notify: true` ยังสามารถใช้ `cron.webhook` ได้จนกว่าจะย้ายข้อมูล
-## พฤติกรรมแชท
+## พฤติกรรมการแชท
-
- - `chat.send` เป็นแบบ **ไม่บล็อก**: จะตอบรับทันทีด้วย `{ runId, status: "started" }` และการตอบกลับจะสตรีมผ่านเหตุการณ์ `chat`
- - การอัปโหลดในแชตรองรับรูปภาพและไฟล์ที่ไม่ใช่วิดีโอ รูปภาพจะคงพาธรูปภาพเดิมไว้ ส่วนไฟล์อื่นจะถูกจัดเก็บเป็นสื่อที่จัดการโดยระบบและแสดงในประวัติเป็นลิงก์ไฟล์แนบ
- - การส่งซ้ำด้วย `idempotencyKey` เดิมจะคืนค่า `{ status: "in_flight" }` ระหว่างที่กำลังทำงาน และ `{ status: "ok" }` หลังเสร็จสิ้น
- - การตอบกลับของ `chat.history` ถูกจำกัดขนาดเพื่อความปลอดภัยของ UI เมื่อรายการทรานสคริปต์มีขนาดใหญ่เกินไป Gateway อาจตัดทอนฟิลด์ข้อความยาว ๆ ละเว้นบล็อกเมทาดาทาที่หนัก และแทนที่ข้อความขนาดใหญ่เกินด้วยตัวแทน (`[chat.history omitted: message too large]`)
- - รูปภาพของผู้ช่วย/ที่สร้างขึ้นจะถูกคงอยู่เป็นการอ้างอิงสื่อที่จัดการโดยระบบ และให้บริการกลับผ่าน URL สื่อของ Gateway ที่ผ่านการยืนยันตัวตน ดังนั้นการโหลดซ้ำจึงไม่ขึ้นกับเพย์โหลดรูปภาพ base64 ดิบที่ยังอยู่ในการตอบกลับของประวัติแชต
- - `chat.history` ยังลบแท็กคำสั่งแบบอินไลน์ที่ใช้เพื่อการแสดงผลเท่านั้นออกจากข้อความผู้ช่วยที่มองเห็นได้ (เช่น `[[reply_to_*]]` และ `[[audio_as_voice]]`), เพย์โหลด XML ของการเรียกเครื่องมือแบบข้อความธรรมดา (รวมถึง `...`, `...`, `...`, `...` และบล็อกการเรียกเครื่องมือที่ถูกตัดทอน), รวมถึงโทเค็นควบคุมโมเดลแบบ ASCII/เต็มความกว้างที่รั่วไหล และละเว้นรายการผู้ช่วยที่ข้อความที่มองเห็นได้ทั้งหมดเป็นเพียงโทเค็นเงียบที่ตรงเป๊ะ `NO_REPLY` / `no_reply`
- - ระหว่างการส่งที่กำลังทำงานและการรีเฟรชประวัติครั้งสุดท้าย มุมมองแชตจะยังคงแสดงข้อความผู้ใช้/ผู้ช่วยแบบคาดการณ์ในเครื่องไว้ หาก `chat.history` คืนสแนปช็อตที่เก่ากว่าชั่วคราว ทรานสคริปต์ตามหลักจะมาแทนที่ข้อความในเครื่องเหล่านั้นเมื่อประวัติของ Gateway ตามทัน
- - `chat.inject` ต่อท้ายโน้ตผู้ช่วยลงในทรานสคริปต์เซสชันและกระจายเหตุการณ์ `chat` สำหรับการอัปเดตเฉพาะ UI (ไม่มีการรันเอเจนต์ ไม่มีการส่งไปยังช่องทาง)
- - ตัวเลือกโมเดลและตัวเลือกการคิดในส่วนหัวของแชตจะแพตช์เซสชันที่ใช้งานอยู่ทันทีผ่าน `sessions.patch`; ค่าเหล่านี้เป็นการแทนที่ของเซสชันแบบคงอยู่ ไม่ใช่ตัวเลือกการส่งที่มีผลเพียงรอบเดียว
- - การพิมพ์ `/new` ใน Control UI จะสร้างและสลับไปยังเซสชันแดชบอร์ดใหม่เดียวกับ New Chat การพิมพ์ `/reset` จะยังคงใช้การรีเซ็ตในตำแหน่งเดิมแบบชัดเจนของ Gateway สำหรับเซสชันปัจจุบัน
- - ตัวเลือกโมเดลของแชตจะขอมุมมองโมเดลที่กำหนดค่าไว้ของ Gateway หากมี `agents.defaults.models` รายการที่อนุญาตนั้นจะกำหนดตัวเลือก มิฉะนั้นตัวเลือกจะแสดงรายการ `models.providers.*.models` ที่ระบุไว้ชัดเจน รวมถึงผู้ให้บริการที่มีการยืนยันตัวตนที่ใช้งานได้ แคตตาล็อกเต็มยังคงเข้าถึงได้ผ่าน RPC ดีบัก `models.list` พร้อม `view: "all"`
- - เมื่อรายงานการใช้งานเซสชัน Gateway สดแสดงแรงกดดันด้านบริบทสูง พื้นที่ตัวเขียนแชตจะแสดงประกาศบริบท และที่ระดับ Compaction ที่แนะนำ จะแสดงปุ่มย่อบริบทที่รันเส้นทาง Compaction ของเซสชันตามปกติ สแนปช็อตโทเค็นที่ล้าสมัยจะถูกซ่อนไว้จนกว่า Gateway จะรายงานการใช้งานที่สดอีกครั้ง
+
+ - `chat.send` เป็นแบบ **ไม่บล็อก**: ตอบรับทันทีด้วย `{ runId, status: "started" }` และสตรีมคำตอบผ่านเหตุการณ์ `chat`
+ - การอัปโหลดในแชตรองรับรูปภาพและไฟล์ที่ไม่ใช่วิดีโอ รูปภาพจะคงพาธรูปภาพเดิม ส่วนไฟล์อื่นจะถูกจัดเก็บเป็นสื่อที่มีการจัดการและแสดงในประวัติเป็นลิงก์ไฟล์แนบ
+ - การส่งซ้ำด้วย `idempotencyKey` เดิมจะคืนค่า `{ status: "in_flight" }` ขณะกำลังทำงาน และ `{ status: "ok" }` หลังเสร็จสมบูรณ์
+ - การตอบกลับของ `chat.history` มีการจำกัดขนาดเพื่อความปลอดภัยของ UI เมื่อรายการทรานสคริปต์มีขนาดใหญ่เกินไป Gateway อาจตัดทอนฟิลด์ข้อความยาว ๆ ละเว้นบล็อกเมทาดาทาหนัก ๆ และแทนที่ข้อความที่ใหญ่เกินด้วยตัวยึดตำแหน่ง (`[chat.history omitted: message too large]`)
+ - รูปภาพจากผู้ช่วยหรือที่สร้างขึ้นจะถูกเก็บถาวรเป็นการอ้างอิงสื่อที่มีการจัดการ และถูกส่งกลับผ่าน URL สื่อของ Gateway ที่ยืนยันตัวตนแล้ว ดังนั้นการโหลดซ้ำจึงไม่ขึ้นอยู่กับ payload รูปภาพ base64 ดิบที่ต้องคงอยู่ในการตอบกลับประวัติแชต
+ - `chat.history` ยังลบแท็กคำสั่งแบบอินไลน์ที่ใช้เพื่อการแสดงผลเท่านั้นออกจากข้อความผู้ช่วยที่มองเห็นได้ (เช่น `[[reply_to_*]]` และ `[[audio_as_voice]]`), payload XML ของการเรียกเครื่องมือแบบข้อความธรรมดา (รวมถึง `...`, `...`, `...`, `...` และบล็อกการเรียกเครื่องมือที่ถูกตัดทอน) และโทเค็นควบคุมโมเดลแบบ ASCII/เต็มความกว้างที่รั่วออกมา และละเว้นรายการผู้ช่วยที่ข้อความที่มองเห็นได้ทั้งหมดเป็นเพียงโทเค็นเงียบที่ตรงกันทุกตัวอักษร `NO_REPLY` / `no_reply`
+ - ระหว่างการส่งที่กำลังทำงานและการรีเฟรชประวัติขั้นสุดท้าย มุมมองแชตจะคงข้อความผู้ใช้/ผู้ช่วยแบบ optimistic ในเครื่องให้มองเห็นได้ หาก `chat.history` คืน snapshot ที่เก่ากว่าชั่วครู่ ทรานสคริปต์มาตรฐานจะแทนที่ข้อความในเครื่องเหล่านั้นเมื่อประวัติของ Gateway ตามทัน
+ - เหตุการณ์ `chat` แบบสดคือสถานะการส่งมอบ ขณะที่ `chat.history` ถูกสร้างใหม่จากทรานสคริปต์เซสชันถาวร หลังเหตุการณ์ tool-final Control UI จะโหลดประวัติใหม่และรวมเฉพาะส่วนท้ายแบบ optimistic ขนาดเล็ก ขอบเขตของทรานสคริปต์มีอธิบายไว้ใน [WebChat](/th/web/webchat)
+ - `chat.inject` เพิ่มบันทึกของผู้ช่วยต่อท้ายทรานสคริปต์เซสชันและกระจายเหตุการณ์ `chat` สำหรับการอัปเดตเฉพาะ UI (ไม่มีการรัน agent ไม่มีการส่งมอบผ่านช่องทาง)
+ - ตัวเลือกโมเดลและการคิดในส่วนหัวแชตจะแพตช์เซสชันที่ใช้งานอยู่ทันทีผ่าน `sessions.patch`; สิ่งเหล่านี้เป็นการ override เซสชันแบบถาวร ไม่ใช่ตัวเลือกการส่งสำหรับเทิร์นเดียวเท่านั้น
+ - การพิมพ์ `/new` ใน Control UI จะสร้างและสลับไปยังเซสชันแดชบอร์ดใหม่แบบเดียวกับ New Chat การพิมพ์ `/reset` จะคงการรีเซ็ตแบบในที่เดิมที่ชัดเจนของ Gateway สำหรับเซสชันปัจจุบัน
+ - ตัวเลือกโมเดลแชตจะขอมุมมองโมเดลที่กำหนดค่าไว้ของ Gateway หากมี `agents.defaults.models` allowlist นั้นจะขับเคลื่อนตัวเลือก มิฉะนั้นตัวเลือกจะแสดงรายการ `models.providers.*.models` ที่ระบุชัดเจนพร้อมผู้ให้บริการที่มีการยืนยันตัวตนที่ใช้งานได้ แค็ตตาล็อกเต็มยังคงพร้อมใช้งานผ่าน debug `models.list` RPC ด้วย `view: "all"`
+ - เมื่อรายงานการใช้งานเซสชัน Gateway สดแสดงแรงกดดันของบริบทสูง พื้นที่ตัวเรียบเรียงแชตจะแสดงประกาศบริบท และที่ระดับ Compaction ที่แนะนำ จะแสดงปุ่ม compact ที่รันเส้นทาง Compaction เซสชันปกติ snapshot โทเค็นที่ล้าสมัยจะถูกซ่อนไว้จนกว่า Gateway จะรายงานการใช้งานสดอีกครั้ง
- โหมดพูดคุยใช้ผู้ให้บริการเสียงเรียลไทม์ที่ลงทะเบียนไว้ กำหนดค่า OpenAI ด้วย `talk.provider: "openai"` พร้อม `talk.providers.openai.apiKey` หรือกำหนดค่า Google ด้วย `talk.provider: "google"` พร้อม `talk.providers.google.apiKey`; การกำหนดค่าผู้ให้บริการเรียลไทม์ของ Voice Call ยังสามารถนำกลับมาใช้เป็นค่าถอยกลับได้ เบราว์เซอร์จะไม่ได้รับคีย์ API มาตรฐานของผู้ให้บริการ OpenAI จะได้รับความลับไคลเอนต์ Realtime แบบชั่วคราวสำหรับ WebRTC Google Live จะได้รับโทเค็นยืนยันตัวตน Live API แบบใช้ครั้งเดียวที่จำกัดขอบเขตสำหรับเซสชัน WebSocket ของเบราว์เซอร์ โดยมีคำสั่งและการประกาศเครื่องมือที่ Gateway ล็อกไว้ในโทเค็น ผู้ให้บริการที่เปิดเผยเฉพาะบริดจ์เรียลไทม์ฝั่งแบ็กเอนด์จะทำงานผ่านทรานสปอร์ตรีเลย์ของ Gateway ดังนั้นข้อมูลประจำตัวและซ็อกเก็ตของผู้ขายจะยังคงอยู่ฝั่งเซิร์ฟเวอร์ ขณะที่เสียงจากเบราว์เซอร์เคลื่อนผ่าน RPC ของ Gateway ที่ผ่านการยืนยันตัวตน พรอมป์เซสชัน Realtime ถูกประกอบโดย Gateway; `talk.realtime.session` ไม่รับการแทนที่คำสั่งที่ผู้เรียกระบุเอง
+ โหมดพูดคุยใช้ผู้ให้บริการเสียงเรียลไทม์ที่ลงทะเบียนไว้ กำหนดค่า OpenAI ด้วย `talk.provider: "openai"` พร้อม `talk.providers.openai.apiKey` หรือกำหนดค่า Google ด้วย `talk.provider: "google"` พร้อม `talk.providers.google.apiKey`; การกำหนดค่าผู้ให้บริการเรียลไทม์ของ Voice Call ยังสามารถนำกลับมาใช้เป็น fallback ได้ เบราว์เซอร์จะไม่ได้รับคีย์ API ผู้ให้บริการมาตรฐาน OpenAI จะได้รับ Realtime client secret แบบชั่วคราวสำหรับ WebRTC Google Live จะได้รับโทเค็นยืนยันตัวตน Live API แบบใช้ครั้งเดียวและจำกัดขอบเขตสำหรับเซสชัน WebSocket ของเบราว์เซอร์ โดยมีคำสั่งและการประกาศเครื่องมือที่ถูกล็อกไว้ในโทเค็นโดย Gateway ผู้ให้บริการที่เปิดเผยเฉพาะ backend realtime bridge จะทำงานผ่านการขนส่งแบบ relay ของ Gateway ดังนั้นข้อมูลรับรองและ vendor socket จะอยู่ฝั่งเซิร์ฟเวอร์ ขณะที่เสียงจากเบราว์เซอร์เคลื่อนผ่าน RPC ของ Gateway ที่ยืนยันตัวตนแล้ว พรอมป์เซสชัน Realtime ถูกประกอบโดย Gateway; `talk.realtime.session` ไม่ยอมรับการ override คำสั่งจากผู้เรียก
- ในตัวเขียน Chat ตัวควบคุม Talk คือปุ่มคลื่นข้างปุ่มป้อนตามคำบอกด้วยไมโครโฟน เมื่อ Talk เริ่มต้น แถวสถานะของตัวเขียนจะแสดง `Connecting Talk...` จากนั้นแสดง `Talk live` ขณะเชื่อมต่อเสียงแล้ว หรือ `Asking OpenClaw...` ขณะที่การเรียกเครื่องมือเรียลไทม์กำลังปรึกษาโมเดลขนาดใหญ่กว่าที่กำหนดค่าไว้ผ่าน `chat.send`
+ ในตัวเรียบเรียง Chat ตัวควบคุม Talk คือปุ่มรูปคลื่นถัดจากปุ่มถอดเสียงด้วยไมโครโฟน เมื่อ Talk เริ่มต้น แถวสถานะของตัวเรียบเรียงจะแสดง `Connecting Talk...` จากนั้นแสดง `Talk live` ขณะเชื่อมต่อเสียงแล้ว หรือ `Asking OpenClaw...` ขณะการเรียกเครื่องมือเรียลไทม์กำลังปรึกษาโมเดลขนาดใหญ่กว่าที่กำหนดค่าไว้ผ่าน `chat.send`
- การทดสอบสดแบบ smoke สำหรับผู้ดูแล: `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` ตรวจสอบการแลกเปลี่ยน SDP ของ OpenAI browser WebRTC, การตั้งค่า WebSocket เบราว์เซอร์ของ Google Live constrained-token และอะแดปเตอร์เบราว์เซอร์รีเลย์ของ Gateway พร้อมสื่อไมโครโฟนปลอม คำสั่งจะพิมพ์เฉพาะสถานะผู้ให้บริการและไม่บันทึกความลับ
+ การ smoke แบบสดสำหรับ maintainer: `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` ตรวจสอบการแลกเปลี่ยน SDP ของ OpenAI browser WebRTC, การตั้งค่า WebSocket ของเบราว์เซอร์สำหรับ Google Live constrained-token และ adapter เบราว์เซอร์ของ Gateway relay พร้อมสื่อไมโครโฟนจำลอง คำสั่งนี้พิมพ์เฉพาะสถานะผู้ให้บริการและไม่บันทึก secret
- - คลิก **Stop** (เรียก `chat.abort`)
- - ขณะที่การรันกำลังทำงาน การติดตามผลตามปกติจะเข้าคิว คลิก **Steer** บนข้อความที่เข้าคิวเพื่อฉีดการติดตามผลนั้นเข้าไปในรอบที่กำลังทำงาน
- - พิมพ์ `/stop` (หรือวลีสั่งยกเลิกแบบเดี่ยว เช่น `stop`, `stop action`, `stop run`, `stop openclaw`, `please stop`) เพื่อยกเลิกนอกแบนด์
- - `chat.abort` รองรับ `{ sessionKey }` (ไม่มี `runId`) เพื่อยกเลิกการรันที่กำลังทำงานทั้งหมดสำหรับเซสชันนั้น
+ - คลิก **หยุด** (เรียก `chat.abort`)
+ - ขณะที่การรันกำลังทำงาน follow-up ปกติจะเข้าคิว คลิก **Steer** บนข้อความที่เข้าคิวเพื่อฉีด follow-up นั้นเข้าไปในเทิร์นที่กำลังทำงาน
+ - พิมพ์ `/stop` (หรือวลี abort แบบ standalone เช่น `stop`, `stop action`, `stop run`, `stop openclaw`, `please stop`) เพื่อ abort นอกแบนด์
+ - `chat.abort` รองรับ `{ sessionKey }` (ไม่มี `runId`) เพื่อ abort การรันที่ทำงานอยู่ทั้งหมดสำหรับเซสชันนั้น
-
- - เมื่อการรันถูกยกเลิก ข้อความผู้ช่วยบางส่วนยังสามารถแสดงใน UI ได้
- - Gateway คงข้อความผู้ช่วยบางส่วนที่ถูกยกเลิกไว้ในประวัติทรานสคริปต์เมื่อมีเอาต์พุตที่บัฟเฟอร์ไว้
- - รายการที่คงไว้มีเมทาดาทาการยกเลิกเพื่อให้ผู้ใช้ทรานสคริปต์แยกส่วนบางส่วนจากการยกเลิกออกจากเอาต์พุตที่เสร็จสมบูรณ์ตามปกติได้
+
+ - เมื่อการรันถูก abort ข้อความผู้ช่วยบางส่วนยังสามารถแสดงใน UI ได้
+ - Gateway จะเก็บข้อความผู้ช่วยบางส่วนที่ถูก abort ไว้ในประวัติทรานสคริปต์เมื่อมีเอาต์พุตในบัฟเฟอร์
+ - รายการที่เก็บไว้มีเมทาดาทา abort เพื่อให้ผู้บริโภคทรานสคริปต์แยกส่วนบางส่วนจาก abort ออกจากเอาต์พุตที่เสร็จสมบูรณ์ตามปกติได้
## การติดตั้ง PWA และ web push
-Control UI มาพร้อม `manifest.webmanifest` และ service worker ดังนั้นเบราว์เซอร์สมัยใหม่จึงสามารถติดตั้งเป็น PWA แบบสแตนด์อโลนได้ Web Push ช่วยให้ Gateway ปลุก PWA ที่ติดตั้งไว้ด้วยการแจ้งเตือนได้ แม้เมื่อแท็บหรือหน้าต่างเบราว์เซอร์ไม่ได้เปิดอยู่
+Control UI มาพร้อม `manifest.webmanifest` และ service worker ดังนั้นเบราว์เซอร์สมัยใหม่จึงสามารถติดตั้งเป็น PWA แบบ standalone ได้ Web Push ช่วยให้ Gateway ปลุก PWA ที่ติดตั้งไว้ด้วยการแจ้งเตือนได้แม้แท็บหรือหน้าต่างเบราว์เซอร์จะไม่ได้เปิดอยู่
-| พื้นผิว | สิ่งที่ทำ |
+| พื้นที่ใช้งาน | ทำหน้าที่อะไร |
| ----------------------------------------------------- | ------------------------------------------------------------------ |
-| `ui/public/manifest.webmanifest` | แมนิเฟสต์ PWA เบราว์เซอร์จะแสดงตัวเลือก "Install app" เมื่อเข้าถึงได้ |
+| `ui/public/manifest.webmanifest` | manifest ของ PWA เบราว์เซอร์จะแสดงตัวเลือก "ติดตั้งแอป" เมื่อเข้าถึงได้ |
| `ui/public/sw.js` | service worker ที่จัดการเหตุการณ์ `push` และการคลิกการแจ้งเตือน |
-| `push/vapid-keys.json` (อยู่ใต้ไดเรกทอรีสถานะ OpenClaw) | คู่คีย์ VAPID ที่สร้างอัตโนมัติและใช้ลงนามเพย์โหลด Web Push |
-| `push/web-push-subscriptions.json` | เอนด์พอยต์การสมัครรับข้อมูลของเบราว์เซอร์ที่คงไว้ |
+| `push/vapid-keys.json` (ใต้ไดเรกทอรีสถานะของ OpenClaw) | keypair ของ VAPID ที่สร้างอัตโนมัติ ใช้ลงนาม payload ของ Web Push |
+| `push/web-push-subscriptions.json` | endpoint การสมัครรับข้อมูลของเบราว์เซอร์ที่เก็บถาวรไว้ |
-แทนที่คู่คีย์ VAPID ผ่านตัวแปรสภาพแวดล้อมบนกระบวนการ Gateway เมื่อคุณต้องการตรึงคีย์ (สำหรับการปรับใช้หลายโฮสต์ การหมุนเวียนความลับ หรือการทดสอบ):
+Override keypair ของ VAPID ผ่าน env var บนกระบวนการ Gateway เมื่อคุณต้องการ pin คีย์ (สำหรับการปรับใช้หลายโฮสต์ การหมุนเวียน secret หรือการทดสอบ):
- `OPENCLAW_VAPID_PUBLIC_KEY`
- `OPENCLAW_VAPID_PRIVATE_KEY`
- `OPENCLAW_VAPID_SUBJECT` (ค่าเริ่มต้นคือ `mailto:openclaw@localhost`)
-Control UI ใช้เมธอด Gateway ที่ถูกจำกัดด้วยสโคปเหล่านี้เพื่อลงทะเบียนและทดสอบการสมัครรับข้อมูลของเบราว์เซอร์:
+Control UI ใช้เมธอด Gateway ที่จำกัดด้วย scope เหล่านี้เพื่อลงทะเบียนและทดสอบการสมัครรับข้อมูลของเบราว์เซอร์:
- `push.web.vapidPublicKey` — ดึงคีย์สาธารณะ VAPID ที่ใช้งานอยู่
- `push.web.subscribe` — ลงทะเบียน `endpoint` พร้อม `keys.p256dh`/`keys.auth`
-- `push.web.unsubscribe` — ลบเอนด์พอยต์ที่ลงทะเบียนไว้
+- `push.web.unsubscribe` — ลบ endpoint ที่ลงทะเบียนไว้
- `push.web.test` — ส่งการแจ้งเตือนทดสอบไปยังการสมัครรับข้อมูลของผู้เรียก
-Web Push แยกจากเส้นทางรีเลย์ APNS ของ iOS (ดู [การกำหนดค่า](/th/gateway/configuration) สำหรับ push ที่มีรีเลย์รองรับ) และเมธอด `push.test` ที่มีอยู่ ซึ่งกำหนดเป้าหมายการจับคู่กับอุปกรณ์เคลื่อนที่แบบเนทีฟ
+Web Push เป็นอิสระจากเส้นทาง relay ของ iOS APNS (ดู [การกำหนดค่า](/th/gateway/configuration) สำหรับ push ที่มี relay รองรับ) และเมธอด `push.test` ที่มีอยู่ ซึ่งมุ่งเป้าไปที่การจับคู่มือถือแบบ native
-## เอ็มเบดที่โฮสต์ไว้
+## การฝังแบบ hosted
-ข้อความผู้ช่วยสามารถเรนเดอร์เนื้อหาเว็บที่โฮสต์ไว้แบบอินไลน์ด้วยชอร์ตโค้ด `[embed ...]` นโยบายแซนด์บ็อกซ์ของ iframe ควบคุมโดย `gateway.controlUi.embedSandbox`:
+ข้อความผู้ช่วยสามารถเรนเดอร์เนื้อหาเว็บแบบ hosted แบบอินไลน์ด้วย shortcode `[embed ...]` นโยบาย sandbox ของ iframe ถูกควบคุมโดย `gateway.controlUi.embedSandbox`:
-
- ปิดใช้งานการรันสคริปต์ภายในเอ็มเบดที่โฮสต์ไว้
+
+ ปิดการทำงานของสคริปต์ภายในการฝังแบบ hosted
-
- อนุญาตเอ็มเบดแบบโต้ตอบได้ พร้อมคงการแยก origin ไว้ นี่เป็นค่าเริ่มต้นและมักเพียงพอสำหรับเกม/วิดเจ็ตเบราว์เซอร์แบบครบในตัว
+
+ อนุญาตการฝังแบบโต้ตอบได้ขณะยังคงแยก origin ไว้ นี่คือค่าเริ่มต้นและมักเพียงพอสำหรับเกม/วิดเจ็ตเบราว์เซอร์แบบ self-contained
- เพิ่ม `allow-same-origin` ทับบน `allow-scripts` สำหรับเอกสารไซต์เดียวกันที่ตั้งใจต้องการสิทธิ์ที่แข็งแรงกว่า
+ เพิ่ม `allow-same-origin` บน `allow-scripts` สำหรับเอกสาร same-site ที่ตั้งใจต้องใช้สิทธิ์ที่แข็งแรงกว่า
@@ -249,14 +250,14 @@ Web Push แยกจากเส้นทางรีเลย์ APNS ขอ
```
-ใช้ `trusted` เฉพาะเมื่อเอกสารที่ฝังต้องการพฤติกรรม same-origin อย่างแท้จริง สำหรับเกมที่เอเจนต์สร้างขึ้นและแคนวาสโต้ตอบส่วนใหญ่ `scripts` เป็นตัวเลือกที่ปลอดภัยกว่า
+ใช้ `trusted` เฉพาะเมื่อเอกสารที่ฝังต้องการพฤติกรรม same-origin จริง ๆ สำหรับเกมและแคนวาสโต้ตอบส่วนใหญ่ที่ agent สร้างขึ้น `scripts` เป็นตัวเลือกที่ปลอดภัยกว่า
-URL เอ็มเบดภายนอกแบบสัมบูรณ์ `http(s)` ยังคงถูกบล็อกตามค่าเริ่มต้น หากคุณตั้งใจให้ `[embed url="https://..."]` โหลดหน้าของบุคคลที่สาม ให้ตั้งค่า `gateway.controlUi.allowExternalEmbedUrls: true`
+URL ฝัง `http(s)` ภายนอกแบบ absolute ยังคงถูกบล็อกโดยค่าเริ่มต้น หากคุณตั้งใจต้องการให้ `[embed url="https://..."]` โหลดหน้าของบุคคลที่สาม ให้ตั้งค่า `gateway.controlUi.allowExternalEmbedUrls: true`
## ความกว้างของข้อความแชต
-ข้อความแชตที่จัดกลุ่มใช้ค่า max-width เริ่มต้นที่อ่านง่าย การปรับใช้บนจอกว้างสามารถแทนที่ได้โดยไม่ต้องแพตช์ CSS ที่มาพร้อมระบบ ด้วยการตั้งค่า `gateway.controlUi.chatMessageMaxWidth`:
+ข้อความแชตที่จัดกลุ่มใช้ max-width เริ่มต้นที่อ่านง่าย การปรับใช้บนจอกว้างสามารถ override ได้โดยไม่ต้องแพตช์ CSS ที่ bundled ไว้ ด้วยการตั้งค่า `gateway.controlUi.chatMessageMaxWidth`:
```json5
{
@@ -268,13 +269,13 @@ URL เอ็มเบดภายนอกแบบสัมบูรณ์ `ht
}
```
-ค่าจะถูกตรวจสอบก่อนถึงเบราว์เซอร์ ค่าที่รองรับรวมถึงความยาวและเปอร์เซ็นต์แบบธรรมดา เช่น `960px` หรือ `82%` รวมถึงนิพจน์ความกว้างแบบจำกัด `min(...)`, `max(...)`, `clamp(...)`, `calc(...)` และ `fit-content(...)`
+ค่าจะถูกตรวจสอบก่อนถึงเบราว์เซอร์ ค่าที่รองรับรวมถึงความยาวและเปอร์เซ็นต์แบบธรรมดา เช่น `960px` หรือ `82%` พร้อมนิพจน์ความกว้างแบบจำกัด `min(...)`, `max(...)`, `clamp(...)`, `calc(...)` และ `fit-content(...)`
## การเข้าถึง tailnet (แนะนำ)
-
- คง Gateway ไว้บน local loopback และให้ Tailscale Serve พร็อกซีด้วย HTTPS:
+
+ คง Gateway ไว้บน loopback และให้ Tailscale Serve ทำ proxy ด้วย HTTPS:
```bash
openclaw gateway --tailscale serve
@@ -284,16 +285,16 @@ URL เอ็มเบดภายนอกแบบสัมบูรณ์ `ht
- `https:///` (หรือ `gateway.controlUi.basePath` ที่คุณกำหนดค่าไว้)
- ตามค่าเริ่มต้น คำขอ Control UI/WebSocket Serve สามารถยืนยันตัวตนผ่านเฮดเดอร์ตัวตน Tailscale (`tailscale-user-login`) เมื่อ `gateway.auth.allowTailscale` เป็น `true` OpenClaw ตรวจสอบตัวตนโดยแปลงที่อยู่ `x-forwarded-for` ด้วย `tailscale whois` และจับคู่กับเฮดเดอร์ และจะยอมรับเฉพาะเมื่อคำขอกระทบ local loopback พร้อมเฮดเดอร์ `x-forwarded-*` ของ Tailscale สำหรับเซสชันผู้ปฏิบัติการ Control UI ที่มีตัวตนอุปกรณ์ของเบราว์เซอร์ เส้นทาง Serve ที่ผ่านการตรวจสอบนี้ยังข้ามรอบการจับคู่อุปกรณ์ด้วย เบราว์เซอร์ที่ไม่มีอุปกรณ์และการเชื่อมต่อบทบาทโหนดยังคงทำตามการตรวจสอบอุปกรณ์ตามปกติ ตั้งค่า `gateway.auth.allowTailscale: false` หากคุณต้องการบังคับใช้ข้อมูลประจำตัว shared-secret อย่างชัดเจนแม้สำหรับทราฟฟิก Serve จากนั้นใช้ `gateway.auth.mode: "token"` หรือ `"password"`
+ โดยค่าเริ่มต้น คำขอ Control UI/WebSocket Serve สามารถยืนยันตัวตนผ่าน header ตัวตนของ Tailscale (`tailscale-user-login`) เมื่อ `gateway.auth.allowTailscale` เป็น `true` OpenClaw ตรวจสอบตัวตนโดย resolve ที่อยู่ `x-forwarded-for` ด้วย `tailscale whois` และจับคู่กับ header และยอมรับเฉพาะเมื่อคำขอเข้าถึง loopback พร้อม header `x-forwarded-*` ของ Tailscale สำหรับเซสชันผู้ปฏิบัติงาน Control UI ที่มีตัวตนอุปกรณ์เบราว์เซอร์ เส้นทาง Serve ที่ตรวจสอบแล้วนี้ยังข้ามรอบการจับคู่อุปกรณ์ด้วย เบราว์เซอร์ที่ไม่มีอุปกรณ์และการเชื่อมต่อบทบาท node ยังคงทำตามการตรวจสอบอุปกรณ์ปกติ ตั้งค่า `gateway.auth.allowTailscale: false` หากคุณต้องการบังคับใช้ข้อมูลรับรอง shared-secret อย่างชัดเจนแม้กับทราฟฟิก Serve จากนั้นใช้ `gateway.auth.mode: "token"` หรือ `"password"`
- สำหรับเส้นทางตัวตน Serve แบบ async นี้ ความพยายามยืนยันตัวตนที่ล้มเหลวสำหรับ IP ไคลเอนต์และสโคปการยืนยันตัวตนเดียวกันจะถูกเรียงลำดับก่อนเขียน rate-limit ดังนั้นการลองซ้ำที่ผิดพร้อมกันจากเบราว์เซอร์เดียวกันอาจแสดง `retry later` ในคำขอที่สอง แทนที่จะเป็น mismatch ธรรมดาสองรายการที่แข่งกันแบบขนาน
+ สำหรับเส้นทางตัวตน Serve แบบ async นั้น ความพยายามยืนยันตัวตนที่ล้มเหลวสำหรับ IP ไคลเอนต์และ scope การยืนยันตัวตนเดียวกันจะถูกทำให้เป็นลำดับก่อนการเขียน rate-limit ดังนั้นการลองผิดซ้ำพร้อมกันจากเบราว์เซอร์เดียวกันอาจแสดง `retry later` ในคำขอที่สองแทนที่จะเป็น mismatch แบบธรรมดาสองรายการที่แข่งกันแบบขนาน
- การยืนยันตัวตน Serve แบบไม่มีโทเค็นถือว่าโฮสต์ gateway นั้นเชื่อถือได้ หากโค้ดในเครื่องที่ไม่น่าเชื่อถืออาจรันบนโฮสต์นั้น ให้บังคับใช้การยืนยันตัวตนด้วย token/password
+ การยืนยันตัวตน Serve แบบไม่มีโทเค็นถือว่าโฮสต์ gateway เชื่อถือได้ หากโค้ด local ที่ไม่น่าเชื่อถืออาจรันบนโฮสต์นั้น ให้บังคับใช้การยืนยันตัวตน token/password
-
+
```bash
openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)"
```
@@ -309,21 +310,21 @@ URL เอ็มเบดภายนอกแบบสัมบูรณ์ `ht
## HTTP ที่ไม่ปลอดภัย
-หากคุณเปิดแดชบอร์ดผ่าน HTTP ธรรมดา (`http://` หรือ `http://`) เบราว์เซอร์จะทำงานใน **บริบทที่ไม่ปลอดภัย** และบล็อก WebCrypto ตามค่าเริ่มต้น OpenClaw **บล็อก** การเชื่อมต่อ Control UI ที่ไม่มีตัวตนอุปกรณ์
+หากคุณเปิดแดชบอร์ดผ่าน HTTP ธรรมดา (`http://` หรือ `http://`) เบราว์เซอร์จะทำงานใน **บริบทที่ไม่ปลอดภัย** และบล็อก WebCrypto โดยค่าเริ่มต้น OpenClaw **บล็อก** การเชื่อมต่อ Control UI ที่ไม่มีตัวตนอุปกรณ์
-ข้อยกเว้นที่จัดทำเป็นเอกสาร:
+ข้อยกเว้นที่บันทึกไว้:
- ความเข้ากันได้กับ HTTP ที่ไม่ปลอดภัยเฉพาะ localhost ด้วย `gateway.controlUi.allowInsecureAuth=true`
-- การยืนยันตัวตน Control UI ของผู้ปฏิบัติการสำเร็จผ่าน `gateway.auth.mode: "trusted-proxy"`
-- ทางเลือกฉุกเฉิน `gateway.controlUi.dangerouslyDisableDeviceAuth=true`
+- การยืนยันตัวตน Control UI ของผู้ปฏิบัติงานสำเร็จผ่าน `gateway.auth.mode: "trusted-proxy"`
+- break-glass `gateway.controlUi.dangerouslyDisableDeviceAuth=true`
-**วิธีแก้ที่แนะนำ:** ใช้ HTTPS (Tailscale Serve) หรือเปิด UI ในเครื่อง:
+**การแก้ไขที่แนะนำ:** ใช้ HTTPS (Tailscale Serve) หรือเปิด UI ในเครื่อง:
- `https:///` (Serve)
-- `http://127.0.0.1:18789/` (บนโฮสต์ gateway)
+- `http://127.0.0.1:18789/` (บนโฮสต์ Gateway)
-
+
```json5
{
gateway: {
@@ -334,14 +335,14 @@ URL เอ็มเบดภายนอกแบบสัมบูรณ์ `ht
}
```
- `allowInsecureAuth` เป็นสวิตช์ความเข้ากันได้แบบโลคัลเท่านั้น:
+ `allowInsecureAuth` เป็นเพียงตัวสลับความเข้ากันได้สำหรับเครื่องภายในเท่านั้น:
- - อนุญาตให้เซสชัน UI ควบคุมของ localhost ดำเนินต่อได้โดยไม่มีข้อมูลระบุตัวตนอุปกรณ์ในบริบท HTTP ที่ไม่ปลอดภัย
+ - อนุญาตให้เซสชัน Control UI บน localhost ดำเนินต่อได้โดยไม่มีข้อมูลประจำตัวของอุปกรณ์ในบริบท HTTP ที่ไม่ปลอดภัย
- ไม่ข้ามการตรวจสอบการจับคู่
- - ไม่ผ่อนคลายข้อกำหนดข้อมูลระบุตัวตนอุปกรณ์ระยะไกล (ที่ไม่ใช่ localhost)
+ - ไม่ผ่อนปรนข้อกำหนดข้อมูลประจำตัวของอุปกรณ์ระยะไกล (ที่ไม่ใช่ localhost)
-
+
```json5
{
gateway: {
@@ -353,42 +354,42 @@ URL เอ็มเบดภายนอกแบบสัมบูรณ์ `ht
```
- `dangerouslyDisableDeviceAuth` ปิดใช้งานการตรวจสอบข้อมูลระบุตัวตนอุปกรณ์ของ UI ควบคุม และเป็นการลดระดับความปลอดภัยอย่างรุนแรง ให้เปลี่ยนกลับโดยเร็วหลังใช้งานในกรณีฉุกเฉิน
+ `dangerouslyDisableDeviceAuth` ปิดการตรวจสอบข้อมูลประจำตัวของอุปกรณ์สำหรับ Control UI และเป็นการลดระดับความปลอดภัยอย่างรุนแรง ให้ย้อนกลับโดยเร็วหลังใช้งานฉุกเฉิน
-
- - การตรวจสอบสิทธิ์ผ่านพร็อกซีที่เชื่อถือได้สำเร็จสามารถอนุญาตเซสชัน UI ควบคุมของ **operator** โดยไม่มีข้อมูลระบุตัวตนอุปกรณ์ได้
- - สิ่งนี้ **ไม่** ขยายไปถึงเซสชัน UI ควบคุมที่มีบทบาทเป็นโหนด
- - พร็อกซีย้อนกลับแบบ loopback บนโฮสต์เดียวกันยังคงไม่ผ่านการตรวจสอบสิทธิ์แบบพร็อกซีที่เชื่อถือได้ โปรดดู [การตรวจสอบสิทธิ์พร็อกซีที่เชื่อถือได้](/th/gateway/trusted-proxy-auth)
+
+ - การรับรองความถูกต้องผ่านพร็อกซีที่เชื่อถือได้สำเร็จสามารถอนุญาตให้เซสชัน Control UI ของ **ผู้ปฏิบัติงาน** เข้าใช้งานได้โดยไม่มีข้อมูลประจำตัวของอุปกรณ์
+ - สิ่งนี้ **ไม่** ขยายไปถึงเซสชัน Control UI บทบาท node
+ - พร็อกซีย้อนกลับแบบ loopback บนโฮสต์เดียวกันยังคงไม่ตรงตามการรับรองความถูกต้องของพร็อกซีที่เชื่อถือได้ ดู [การรับรองความถูกต้องด้วยพร็อกซีที่เชื่อถือได้](/th/gateway/trusted-proxy-auth)
-ดูคำแนะนำการตั้งค่า HTTPS ได้ที่ [Tailscale](/th/gateway/tailscale)
+ดู [Tailscale](/th/gateway/tailscale) สำหรับคำแนะนำการตั้งค่า HTTPS
## นโยบายความปลอดภัยของเนื้อหา
-UI ควบคุมมาพร้อมนโยบาย `img-src` ที่เข้มงวด: อนุญาตเฉพาะแอสเซตจาก **origin เดียวกัน**, URL `data:` และ URL `blob:` ที่สร้างขึ้นในเครื่องเท่านั้น URL รูปภาพระยะไกลแบบ `http(s)` และแบบอ้างอิงโปรโตคอลถูกเบราว์เซอร์ปฏิเสธและจะไม่ส่งคำขอเครือข่าย
+Control UI มาพร้อมนโยบาย `img-src` ที่เข้มงวด: อนุญาตเฉพาะแอสเซ็ตจาก **origin เดียวกัน**, URL `data:` และ URL `blob:` ที่สร้างในเครื่องเท่านั้น URL รูปภาพระยะไกลแบบ `http(s)` และแบบสัมพันธ์กับโปรโตคอลจะถูกเบราว์เซอร์ปฏิเสธและจะไม่ส่งคำขอดึงข้อมูลผ่านเครือข่าย
-ในทางปฏิบัติหมายความว่า:
+ความหมายในทางปฏิบัติ:
-- อวาตาร์และรูปภาพที่ให้บริการภายใต้พาธสัมพัทธ์ (เช่น `/avatars/`) ยังคงแสดงผล รวมถึงเส้นทางอวาตาร์ที่ต้องตรวจสอบสิทธิ์ ซึ่ง UI ดึงมาและแปลงเป็น URL `blob:` ในเครื่อง
-- URL `data:image/...` แบบอินไลน์ยังคงแสดงผล (มีประโยชน์สำหรับเพย์โหลดในโปรโตคอล)
-- URL `blob:` ในเครื่องที่ UI ควบคุมสร้างขึ้นยังคงแสดงผล
-- URL อวาตาร์ระยะไกลที่ส่งออกจากข้อมูลเมตาของช่องทางจะถูกลบออกที่ตัวช่วยอวาตาร์ของ UI ควบคุม และแทนที่ด้วยโลโก้/ป้ายในตัว ดังนั้นช่องทางที่ถูกบุกรุกหรือเป็นอันตรายจึงไม่สามารถบังคับให้เบราว์เซอร์ของ operator ดึงรูปภาพระยะไกลตามอำเภอใจได้
+- อวาตาร์และรูปภาพที่ให้บริการภายใต้พาธสัมพัทธ์ (เช่น `/avatars/`) ยังคงแสดงผล รวมถึง route อวาตาร์ที่ต้องรับรองความถูกต้องซึ่ง UI ดึงข้อมูลและแปลงเป็น URL `blob:` ภายในเครื่อง
+- URL `data:image/...` แบบอินไลน์ยังคงแสดงผล (มีประโยชน์สำหรับ payload ภายในโปรโตคอล)
+- URL `blob:` ภายในเครื่องที่สร้างโดย Control UI ยังคงแสดงผล
+- URL อวาตาร์ระยะไกลที่ปล่อยออกมาจาก metadata ของช่องทางจะถูกตัวช่วยอวาตาร์ของ Control UI ตัดออกและแทนที่ด้วยโลโก้/ป้ายกำกับในตัว ดังนั้นช่องทางที่ถูกเจาะหรือเป็นอันตรายจึงไม่สามารถบังคับให้เบราว์เซอร์ของผู้ปฏิบัติงานดึงรูปภาพระยะไกลตามอำเภอใจได้
-คุณไม่ต้องเปลี่ยนแปลงอะไรเพื่อให้ได้พฤติกรรมนี้ เพราะเปิดใช้งานอยู่เสมอและกำหนดค่าไม่ได้
+คุณไม่จำเป็นต้องเปลี่ยนอะไรเพื่อให้ได้ลักษณะการทำงานนี้ เพราะเปิดใช้อยู่เสมอและกำหนดค่าไม่ได้
-## การตรวจสอบสิทธิ์เส้นทางอวาตาร์
+## การรับรองความถูกต้องของ route อวาตาร์
-เมื่อกำหนดค่าการตรวจสอบสิทธิ์ Gateway แล้ว endpoint อวาตาร์ของ UI ควบคุมต้องใช้โทเค็น Gateway เดียวกับ API ส่วนที่เหลือ:
+เมื่อกำหนดค่าการรับรองความถูกต้องของ Gateway แล้ว endpoint อวาตาร์ของ Control UI จะต้องใช้โทเค็น Gateway เดียวกับ API ส่วนที่เหลือ:
-- `GET /avatar/` ส่งคืนรูปอวาตาร์ให้เฉพาะผู้เรียกที่ผ่านการตรวจสอบสิทธิ์แล้วเท่านั้น `GET /avatar/?meta=1` ส่งคืนข้อมูลเมตาอวาตาร์ภายใต้กฎเดียวกัน
-- คำขอที่ยังไม่ผ่านการตรวจสอบสิทธิ์ไปยังเส้นทางใดเส้นทางหนึ่งจะถูกปฏิเสธ (ตรงกับเส้นทาง assistant-media ข้างเคียง) วิธีนี้ป้องกันไม่ให้เส้นทางอวาตาร์รั่วไหลข้อมูลระบุตัวตนของเอเจนต์บนโฮสต์ที่ได้รับการปกป้องอยู่แล้ว
-- UI ควบคุมจะส่งต่อโทเค็น Gateway เป็น bearer header เมื่อดึงอวาตาร์ และใช้ URL blob ที่ผ่านการตรวจสอบสิทธิ์แล้ว เพื่อให้รูปภาพยังคงแสดงผลในแดชบอร์ด
+- `GET /avatar/` ส่งคืนรูปภาพอวาตาร์ให้เฉพาะผู้เรียกที่รับรองความถูกต้องแล้วเท่านั้น `GET /avatar/?meta=1` ส่งคืน metadata ของอวาตาร์ภายใต้กฎเดียวกัน
+- คำขอที่ไม่ได้รับรองความถูกต้องไปยัง route ใด route หนึ่งจะถูกปฏิเสธ (ตรงกับ route assistant-media ข้างเคียง) สิ่งนี้ป้องกันไม่ให้ route อวาตาร์รั่วไหลข้อมูลประจำตัวของ agent บนโฮสต์ที่ได้รับการป้องกันอยู่แล้ว
+- Control UI เองจะส่งต่อโทเค็น Gateway เป็นส่วนหัว bearer เมื่อดึงอวาตาร์ และใช้ URL blob ที่รับรองความถูกต้องแล้วเพื่อให้รูปภาพยังคงแสดงผลในแดชบอร์ด
-หากคุณปิดใช้งานการตรวจสอบสิทธิ์ Gateway (ไม่แนะนำบนโฮสต์ที่ใช้ร่วมกัน) เส้นทางอวาตาร์ก็จะไม่ต้องตรวจสอบสิทธิ์เช่นกัน สอดคล้องกับส่วนที่เหลือของ Gateway
+หากคุณปิดการรับรองความถูกต้องของ Gateway (ไม่แนะนำบนโฮสต์ที่ใช้ร่วมกัน) route อวาตาร์ก็จะไม่ต้องรับรองความถูกต้องเช่นกัน สอดคล้องกับส่วนที่เหลือของ Gateway
## การสร้าง UI
@@ -398,26 +399,26 @@ Gateway ให้บริการไฟล์สแตติกจาก `dist
pnpm ui:build
```
-ฐานแบบสัมบูรณ์ที่เป็นทางเลือก (เมื่อคุณต้องการ URL แอสเซตแบบคงที่):
+ฐานแบบ absolute ที่เลือกใช้ได้ (เมื่อคุณต้องการ URL แอสเซ็ตแบบคงที่):
```bash
OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
```
-สำหรับการพัฒนาในเครื่อง (เซิร์ฟเวอร์ dev แยกต่างหาก):
+สำหรับการพัฒนาภายในเครื่อง (เซิร์ฟเวอร์พัฒนาแยกต่างหาก):
```bash
pnpm ui:dev
```
-จากนั้นชี้ UI ไปที่ URL WS ของ Gateway ของคุณ (เช่น `ws://127.0.0.1:18789`)
+จากนั้นชี้ UI ไปยัง URL Gateway WS ของคุณ (เช่น `ws://127.0.0.1:18789`)
-## การดีบัก/ทดสอบ: เซิร์ฟเวอร์ dev + Gateway ระยะไกล
+## การดีบัก/การทดสอบ: เซิร์ฟเวอร์พัฒนา + Gateway ระยะไกล
-UI ควบคุมเป็นไฟล์สแตติก เป้าหมาย WebSocket สามารถกำหนดค่าได้และอาจต่างจาก origin ของ HTTP ได้ วิธีนี้สะดวกเมื่อคุณต้องการใช้เซิร์ฟเวอร์ dev ของ Vite ในเครื่อง แต่ให้ Gateway ทำงานอยู่ที่อื่น
+Control UI เป็นไฟล์สแตติก เป้าหมาย WebSocket กำหนดค่าได้และอาจแตกต่างจาก HTTP origin ได้ สิ่งนี้สะดวกเมื่อคุณต้องการใช้เซิร์ฟเวอร์พัฒนา Vite ในเครื่อง แต่ให้ Gateway ทำงานที่อื่น
-
+
```bash
pnpm ui:dev
```
@@ -427,7 +428,7 @@ UI ควบคุมเป็นไฟล์สแตติก เป้าห
http://localhost:5173/?gatewayUrl=ws%3A%2F%2F%3A18789
```
- การตรวจสอบสิทธิ์แบบใช้ครั้งเดียวที่เป็นทางเลือก (หากจำเป็น):
+ การรับรองความถูกต้องครั้งเดียวที่เลือกใช้ได้ (หากจำเป็น):
```text
http://localhost:5173/?gatewayUrl=wss%3A%2F%2F%3A18789#token=
@@ -439,16 +440,16 @@ UI ควบคุมเป็นไฟล์สแตติก เป้าห
- `gatewayUrl` จะถูกเก็บใน localStorage หลังโหลดและถูกลบออกจาก URL
- - หากคุณส่ง endpoint `ws://` หรือ `wss://` แบบเต็มผ่าน `gatewayUrl` ให้เข้ารหัส URL ของค่า `gatewayUrl` เพื่อให้เบราว์เซอร์แยกวิเคราะห์สตริงคำค้นหาได้ถูกต้อง
- - ควรส่ง `token` ผ่าน fragment ของ URL (`#token=...`) เมื่อทำได้ Fragment จะไม่ถูกส่งไปยังเซิร์ฟเวอร์ จึงหลีกเลี่ยงการรั่วไหลผ่านบันทึกคำขอและ Referer ได้ พารามิเตอร์คำค้นหา `?token=` แบบเดิมยังคงถูกนำเข้าได้หนึ่งครั้งเพื่อความเข้ากันได้ แต่ใช้เป็นทางเลือกสำรองเท่านั้น และจะถูกลบออกทันทีหลัง bootstrap
- - `password` จะถูกเก็บไว้ในหน่วยความจำเท่านั้น
- - เมื่อตั้งค่า `gatewayUrl` แล้ว UI จะไม่ fallback ไปใช้ข้อมูลรับรองจาก config หรือ environment ให้ระบุ `token` (หรือ `password`) อย่างชัดเจน การไม่มีข้อมูลรับรองที่ระบุอย่างชัดเจนถือเป็นข้อผิดพลาด
- - ใช้ `wss://` เมื่อ Gateway อยู่หลัง TLS (Tailscale Serve, พร็อกซี HTTPS ฯลฯ)
- - `gatewayUrl` จะยอมรับเฉพาะในหน้าต่างระดับบนสุดเท่านั้น (ไม่ใช่แบบฝัง) เพื่อป้องกัน clickjacking
- - การติดตั้งใช้งาน UI ควบคุมที่ไม่ใช่ loopback ต้องตั้งค่า `gateway.controlUi.allowedOrigins` อย่างชัดเจน (origin แบบเต็ม) ซึ่งรวมถึงการตั้งค่า dev ระยะไกลด้วย
- - การเริ่มต้น Gateway อาจเติม origin ในเครื่อง เช่น `http://localhost:` และ `http://127.0.0.1:` จาก bind และพอร์ต runtime ที่มีผลใช้งาน แต่ origin ของเบราว์เซอร์ระยะไกลยังคงต้องมีรายการที่ระบุอย่างชัดเจน
- - อย่าใช้ `gateway.controlUi.allowedOrigins: ["*"]` ยกเว้นสำหรับการทดสอบในเครื่องที่ควบคุมอย่างเข้มงวดเท่านั้น ค่านี้หมายถึงอนุญาต origin ของเบราว์เซอร์ใดก็ได้ ไม่ใช่ "จับคู่กับโฮสต์ใดก็ตามที่ฉันกำลังใช้"
- - `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` เปิดใช้โหมด fallback ของ origin จาก Host-header แต่เป็นโหมดความปลอดภัยที่อันตราย
+ - หากคุณส่ง endpoint `ws://` หรือ `wss://` แบบเต็มผ่าน `gatewayUrl` ให้เข้ารหัส URL ของค่า `gatewayUrl` เพื่อให้เบราว์เซอร์แยกวิเคราะห์ query string ได้ถูกต้อง
+ - ควรส่ง `token` ผ่าน fragment ของ URL (`#token=...`) เมื่อทำได้ Fragment จะไม่ถูกส่งไปยังเซิร์ฟเวอร์ จึงหลีกเลี่ยงการรั่วไหลใน request-log และ Referer พารามิเตอร์ query แบบเดิม `?token=` ยังคงถูกนำเข้าเพียงครั้งเดียวเพื่อความเข้ากันได้ แต่ใช้เป็น fallback เท่านั้น และจะถูกตัดออกทันทีหลัง bootstrap
+ - `password` ถูกเก็บไว้ในหน่วยความจำเท่านั้น
+ - เมื่อตั้งค่า `gatewayUrl` แล้ว UI จะไม่ fallback ไปยัง credential จาก config หรือ environment ให้ระบุ `token` (หรือ `password`) อย่างชัดเจน การไม่มี credential ที่ระบุอย่างชัดเจนถือเป็นข้อผิดพลาด
+ - ใช้ `wss://` เมื่อ Gateway อยู่หลัง TLS (Tailscale Serve, พร็อกซี HTTPS เป็นต้น)
+ - `gatewayUrl` จะถูกยอมรับเฉพาะในหน้าต่างระดับบนสุดเท่านั้น (ไม่ใช่แบบฝัง) เพื่อป้องกัน clickjacking
+ - การปรับใช้ Control UI ที่ไม่ใช่ loopback ต้องตั้งค่า `gateway.controlUi.allowedOrigins` อย่างชัดเจน (origin แบบเต็ม) ซึ่งรวมถึงการตั้งค่าพัฒนาระยะไกลด้วย
+ - การเริ่มต้น Gateway อาจเติม origin ภายในเครื่อง เช่น `http://localhost:` และ `http://127.0.0.1:` จาก bind และ port ของ runtime ที่มีผล แต่ origin ของเบราว์เซอร์ระยะไกลยังคงต้องมีรายการอย่างชัดเจน
+ - อย่าใช้ `gateway.controlUi.allowedOrigins: ["*"]` ยกเว้นสำหรับการทดสอบภายในเครื่องที่ควบคุมอย่างเข้มงวด หมายถึงอนุญาต origin ของเบราว์เซอร์ใดก็ได้ ไม่ใช่ "จับคู่กับโฮสต์ใดก็ตามที่ฉันใช้อยู่"
+ - `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` เปิดใช้งานโหมด fallback ของ origin จากส่วนหัว Host แต่เป็นโหมดความปลอดภัยที่อันตราย
@@ -470,6 +471,6 @@ UI ควบคุมเป็นไฟล์สแตติก เป้าห
## ที่เกี่ยวข้อง
- [แดชบอร์ด](/th/web/dashboard) — แดชบอร์ด Gateway
-- [การตรวจสอบสถานะ](/th/gateway/health) — การติดตามสถานะ Gateway
-- [TUI](/th/web/tui) — อินเทอร์เฟซผู้ใช้ในเทอร์มินัล
-- [WebChat](/th/web/webchat) — อินเทอร์เฟซแชทบนเบราว์เซอร์
+- [การตรวจสอบสถานภาพ](/th/gateway/health) — การเฝ้าระวังสถานภาพ Gateway
+- [TUI](/th/web/tui) — ส่วนติดต่อผู้ใช้บนเทอร์มินัล
+- [WebChat](/th/web/webchat) — อินเทอร์เฟซแชตบนเบราว์เซอร์
diff --git a/docs/th/web/webchat.md b/docs/th/web/webchat.md
index 59d92206b..44ee964e2 100644
--- a/docs/th/web/webchat.md
+++ b/docs/th/web/webchat.md
@@ -1,93 +1,105 @@
---
read_when:
- - การดีบักหรือการกำหนดค่าการเข้าถึง WebChat
-summary: โฮสต์สแตติกของ Loopback WebChat และการใช้งาน Gateway WS สำหรับอินเทอร์เฟซแชต
+ - การดีบักหรือกำหนดค่าการเข้าถึง WebChat
+summary: โฮสต์สแตติกของเว็บแชตลูปแบ็กและการใช้งาน Gateway WS สำหรับ UI แชท
title: เว็บแชต
x-i18n:
- generated_at: "2026-05-03T10:18:39Z"
+ generated_at: "2026-05-04T02:28:09Z"
model: gpt-5.5
provider: openai
- source_hash: 48024e58259901c6feb67168c5c1ce32f46b8ad9b6f4511e56d2000478a3ed60
+ source_hash: bf435585a13a1cde5885714837017109eeeb61ffa5e33a400017706f676f57ea
source_path: web/webchat.md
workflow: 16
---
-สถานะ: UI แชต SwiftUI บน macOS/iOS สื่อสารโดยตรงกับ Gateway WebSocket
+Status: UI แชต SwiftUI บน macOS/iOS สื่อสารโดยตรงกับ Gateway WebSocket
## คืออะไร
-- UI แชตแบบเนทีฟสำหรับ Gateway (ไม่มีเบราว์เซอร์ฝังตัวและไม่มีเซิร์ฟเวอร์สแตติกในเครื่อง)
+- UI แชตแบบเนทีฟสำหรับ Gateway (ไม่มีเบราว์เซอร์ฝังตัวและไม่มีเซิร์ฟเวอร์สแตติกภายในเครื่อง)
- ใช้เซสชันและกฎการกำหนดเส้นทางเดียวกับช่องทางอื่น
- การกำหนดเส้นทางแบบกำหนดแน่นอน: การตอบกลับจะกลับไปยัง WebChat เสมอ
## เริ่มต้นอย่างรวดเร็ว
1. เริ่ม Gateway
-2. เปิด UI WebChat (แอป macOS/iOS) หรือแท็บแชตของ Control UI
-3. ตรวจสอบว่ามีการกำหนดค่าเส้นทางการตรวจสอบสิทธิ์ของ Gateway ที่ถูกต้อง (ค่าเริ่มต้นเป็น shared-secret,
+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` ติดตามแขนงทรานสคริปต์ที่ใช้งานอยู่สำหรับไฟล์เซสชันแบบ 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 ของการเรียกเครื่องมือแบบข้อความล้วน
+- `chat.history` ถูกจำกัดขอบเขตเพื่อความเสถียร: Gateway อาจตัดฟิลด์ข้อความยาว ละเว้นเมทาดาทาหนัก และแทนที่รายการที่มีขนาดเกินด้วย `[chat.history omitted: message too large]`
+- `chat.history` ติดตามสาขาทรานสคริปต์ที่ใช้งานอยู่สำหรับไฟล์เซสชันแบบ append-only สมัยใหม่ ดังนั้นสาขา rewrite ที่ถูกละทิ้งและสำเนาพรอมป์ที่ถูกแทนที่จะไม่ถูกแสดงใน WebChat
+- รายการ Compaction แสดงเป็นตัวแบ่งประวัติที่ถูกย่ออย่างชัดเจน ตัวแบ่งอธิบายว่าเทิร์นก่อนหน้าถูกเก็บรักษาไว้ในเช็คพอยต์ และลิงก์ไปยังตัวควบคุมเช็คพอยต์ของ Sessions ซึ่งผู้ปฏิบัติงานสามารถแตกสาขาหรือกู้คืนมุมมองก่อน Compaction ได้เมื่อสิทธิ์อนุญาต
+- Control UI จดจำ Gateway `sessionId` เบื้องหลังที่ส่งกลับโดย `chat.history` และรวมค่าไว้ในการเรียก `chat.send` ต่อเนื่อง ดังนั้นการเชื่อมต่อใหม่และการรีเฟรชหน้าจะดำเนินบทสนทนาที่จัดเก็บไว้เดิมต่อ เว้นแต่ผู้ใช้จะเริ่มหรือรีเซ็ตเซสชัน
+- Control UI รวมการส่งที่กำลังดำเนินอยู่ซ้ำสำหรับเซสชัน ข้อความ และไฟล์แนบเดียวกันก่อนสร้าง id การรัน `chat.send` ใหม่; Gateway ยังคงลดคำขอซ้ำที่ใช้คีย์ idempotency เดียวกัน
+- ไฟล์เริ่มต้นของเวิร์กสเปซและคำสั่ง `BOOTSTRAP.md` ที่รอดำเนินการจะถูกส่งผ่าน Project Context ในพรอมป์ระบบของเอเจนต์ ไม่ได้คัดลอกเข้าไปในข้อความผู้ใช้ WebChat การตัด bootstrap เพิ่มเพียงประกาศกู้คืนแบบกระชับในพรอมป์ระบบ; จำนวนโดยละเอียดและปุ่มปรับแต่งการกำหนดค่ายังคงอยู่บนพื้นผิววินิจฉัย
+- `chat.history` ยังถูกปรับให้เป็นมาตรฐานสำหรับการแสดงผลด้วย: บริบท OpenClaw เฉพาะรันไทม์,
+ ตัวห่อ envelope ขาเข้า, แท็กคำสั่งการส่งมอบแบบอินไลน์
+ เช่น `[[reply_to_*]]` และ `[[audio_as_voice]]`, เพย์โหลด XML การเรียกเครื่องมือแบบข้อความธรรมดา
(รวมถึง `...`,
`...`, `...`,
- `...` และบล็อกการเรียกเครื่องมือที่ถูกตัดทอน) และ
- โทเค็นควบคุมโมเดลแบบ ASCII/เต็มความกว้างที่รั่วไหล จะถูกลบออกจากข้อความที่มองเห็นได้
- และรายการผู้ช่วยที่ข้อความที่มองเห็นได้ทั้งหมดมีเพียงโทเค็นเงียบที่ตรงทุกตัวอักษร
+ `...` และบล็อกการเรียกเครื่องมือที่ถูกตัด), และ
+ โทเค็นควบคุมโมเดล ASCII/full-width ที่รั่วไหล จะถูกลบออกจากข้อความที่มองเห็นได้,
+ และรายการผู้ช่วยที่ข้อความที่มองเห็นได้ทั้งหมดเป็นเพียงโทเค็นเงียบที่ตรงเป๊ะ
`NO_REPLY` / `no_reply` จะถูกละเว้น
-- เพย์โหลดการตอบกลับที่ติดธงเหตุผล (`isReasoning: true`) จะถูกแยกออกจากเนื้อหาผู้ช่วยของ WebChat ข้อความเล่นซ้ำของทรานสคริปต์ และบล็อกเนื้อหาเสียง ดังนั้นเพย์โหลดที่เป็นเพียงการคิดจะไม่ปรากฏเป็นข้อความผู้ช่วยที่มองเห็นได้หรือเสียงที่เล่นได้
-- `chat.inject` เพิ่มบันทึกของผู้ช่วยลงในทรานสคริปต์โดยตรงและกระจายไปยัง UI (ไม่มีการรันเอเจนต์)
+- เพย์โหลดตอบกลับที่ถูกทำเครื่องหมายเป็นการให้เหตุผล (`isReasoning: true`) จะถูกตัดออกจากเนื้อหาผู้ช่วยของ WebChat, ข้อความ replay ทรานสคริปต์ และบล็อกเนื้อหาเสียง ดังนั้นเพย์โหลดที่เป็นการคิดเท่านั้นจะไม่ปรากฏเป็นข้อความผู้ช่วยที่มองเห็นได้หรือเสียงที่เล่นได้
+- `chat.inject` เพิ่มบันทึกผู้ช่วยต่อท้ายทรานสคริปต์โดยตรงและกระจายไปยัง UI (ไม่มีการรันเอเจนต์)
- การรันที่ถูกยกเลิกสามารถคงเอาต์พุตผู้ช่วยบางส่วนให้มองเห็นได้ใน UI
-- Gateway จะเก็บข้อความผู้ช่วยบางส่วนที่ถูกยกเลิกไว้ในประวัติทรานสคริปต์เมื่อมีเอาต์พุตที่ถูกบัฟเฟอร์อยู่ และทำเครื่องหมายรายการเหล่านั้นด้วยเมทาดาทาการยกเลิก
-- ประวัติจะถูกดึงจาก Gateway เสมอ (ไม่มีการเฝ้าดูไฟล์ในเครื่อง)
-- หากไม่สามารถเข้าถึง Gateway ได้ WebChat จะเป็นแบบอ่านอย่างเดียว
+- Gateway เก็บข้อความผู้ช่วยบางส่วนที่ถูกยกเลิกไว้ในประวัติทรานสคริปต์เมื่อมีเอาต์พุตในบัฟเฟอร์ และทำเครื่องหมายรายการเหล่านั้นด้วยเมทาดาทาการยกเลิก
+- ประวัติจะถูกดึงจาก Gateway เสมอ (ไม่มีการเฝ้าดูไฟล์ภายในเครื่อง)
+- หากเข้าถึง Gateway ไม่ได้ WebChat จะเป็นแบบอ่านอย่างเดียว
+
+### ทรานสคริปต์และโมเดลการส่งมอบ
+
+WebChat มีพาธข้อมูลแยกกันสองพาธ:
+
+- ไฟล์ JSONL ของเซสชันคือทรานสคริปต์โมเดล/รันไทม์แบบถาวร สำหรับการรันเอเจนต์ปกติ Pi จะเก็บข้อความ `user`, `assistant` และ `toolResult` ที่โมเดลมองเห็นได้ผ่านตัวจัดการเซสชันของตน WebChat ไม่เขียนข้อความการส่งมอบ สถานะ หรือข้อความช่วยเหลือใดๆ เข้าไปในทรานสคริปต์นั้นโดยพลการ
+- เหตุการณ์ Gateway `ReplyPayload` คือภาพฉายการส่งมอบสด เหตุการณ์เหล่านี้สามารถถูกปรับให้เป็นมาตรฐานสำหรับการแสดง WebChat/ช่องทาง, การสตรีมบล็อก, แท็กคำสั่ง, การฝังสื่อ, แฟล็ก TTS/เสียง และพฤติกรรม fallback ของ UI เหตุการณ์เหล่านี้ไม่ใช่บันทึกเซสชันหลักโดยตัวมันเอง
+- WebChat ฉีดรายการทรานสคริปต์ผู้ช่วยเฉพาะเมื่อ Gateway เป็นเจ้าของข้อความที่แสดงนอกเทิร์นผู้ช่วย Pi ปกติ: `chat.inject`, คำตอบคำสั่งที่ไม่ใช่เอเจนต์, เอาต์พุตบางส่วนที่ถูกยกเลิก และส่วนเสริมทรานสคริปต์สื่อที่ WebChat จัดการ
+- `chat.history` อ่านทรานสคริปต์เซสชันที่จัดเก็บไว้และใช้ภาพฉายการแสดงผลของ WebChat หากข้อความผู้ช่วยสดปรากฏระหว่างการรันแต่หายไปหลังโหลดประวัติใหม่ ให้ตรวจสอบก่อนว่า JSONL ดิบมีข้อความผู้ช่วยหรือไม่ จากนั้นตรวจสอบว่าโปรเจกชัน `chat.history` ลบข้อความนั้นออกหรือไม่ แล้วจึงตรวจสอบว่าการรวม optimistic-tail ของ Control UI แทนที่สถานะการส่งมอบภายในเครื่องด้วยสแนปช็อตที่คงอยู่หรือไม่
+
+คำตอบสุดท้ายของการรันเอเจนต์ปกติควรคงอยู่ถาวรเพราะ Pi เขียน `message_end` ของผู้ช่วย fallback ใดๆ ที่สะท้อนเพย์โหลดสุดท้ายที่ส่งมอบเข้าไปในทรานสคริปต์ต้องหลีกเลี่ยงการทำซ้ำเทิร์นผู้ช่วยที่ Pi เขียนไว้แล้วก่อน
## แผงเครื่องมือเอเจนต์ของ Control UI
-- แผงเครื่องมือ `/agents` ของ Control UI มีสองมุมมองแยกกัน:
+- แผง Tools ของ Control UI `/agents` มีสองมุมมองแยกกัน:
- **พร้อมใช้งานตอนนี้** ใช้ `tools.effective(sessionKey=...)` และแสดงสิ่งที่เซสชันปัจจุบัน
- สามารถใช้ได้จริงขณะรันไทม์ รวมถึงเครื่องมือหลัก เครื่องมือของ Plugin และเครื่องมือที่ช่องทางเป็นเจ้าของ
- - **การกำหนดค่าเครื่องมือ** ใช้ `tools.catalog` และยังคงมุ่งเน้นที่โปรไฟล์ การแทนที่ และ
- ความหมายของแค็ตตาล็อก
-- ความพร้อมใช้งานขณะรันไทม์มีขอบเขตตามเซสชัน การสลับเซสชันบนเอเจนต์เดียวกันสามารถเปลี่ยนรายการ
+ ใช้งานได้จริงในรันไทม์ รวมถึงเครื่องมือหลัก, Plugin และเครื่องมือที่ช่องทางเป็นเจ้าของ
+ - **การกำหนดค่าเครื่องมือ** ใช้ `tools.catalog` และยังคงเน้นที่โปรไฟล์ การ override และ
+ ความหมายของแคตตาล็อก
+- ความพร้อมใช้งานในรันไทม์ถูกกำหนดขอบเขตตามเซสชัน การสลับเซสชันบนเอเจนต์เดียวกันสามารถเปลี่ยนรายการ
**พร้อมใช้งานตอนนี้** ได้
-- ตัวแก้ไขการกำหนดค่าไม่ได้บอกเป็นนัยถึงความพร้อมใช้งานขณะรันไทม์; การเข้าถึงที่มีผลจริงยังคงเป็นไปตามลำดับความสำคัญของนโยบาย
- (`allow`/`deny`, การแทนที่ต่อเอเจนต์และต่อผู้ให้บริการ/ช่องทาง)
+- ตัวแก้ไขการกำหนดค่าไม่ได้บ่งบอกถึงความพร้อมใช้งานในรันไทม์; การเข้าถึงที่มีผลยังคงเป็นไปตามลำดับความสำคัญของนโยบาย
+ (`allow`/`deny`, override ต่อเอเจนต์และต่อผู้ให้บริการ/ช่องทาง)
## การใช้งานระยะไกล
-- โหมดระยะไกลสร้างทันเนล Gateway WebSocket ผ่าน SSH/Tailscale
+- โหมดระยะไกล tunneling Gateway WebSocket ผ่าน SSH/Tailscale
- คุณไม่จำเป็นต้องรันเซิร์ฟเวอร์ WebChat แยกต่างหาก
## อ้างอิงการกำหนดค่า (WebChat)
-การกำหนดค่าทั้งหมด: [การกำหนดค่า](/th/gateway/configuration)
+การกำหนดค่าแบบเต็ม: [การกำหนดค่า](/th/gateway/configuration)
ตัวเลือก WebChat:
-- `gateway.webchat.chatHistoryMaxChars`: จำนวนอักขระสูงสุดสำหรับช่องข้อความในการตอบกลับ `chat.history` เมื่อรายการทรานสคริปต์เกินขีดจำกัดนี้ Gateway จะตัดช่องข้อความยาว ๆ ออก และอาจแทนที่ข้อความที่ใหญ่เกินด้วยตัวยึดตำแหน่ง ไคลเอนต์ยังสามารถส่ง `maxChars` ต่อคำขอเพื่อแทนที่ค่าเริ่มต้นนี้สำหรับการเรียก `chat.history` ครั้งเดียวได้
+- `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
+ การยืนยันตัวตน 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.auth.mode: "trusted-proxy"`: การยืนยันตัวตน reverse-proxy สำหรับลูกค้าเบราว์เซอร์ที่อยู่หลังแหล่งพร็อกซี **ที่ไม่ใช่ loopback** และรับรู้ตัวตน (ดู [Trusted Proxy Auth](/th/gateway/trusted-proxy-auth))
- `gateway.remote.url`, `gateway.remote.token`, `gateway.remote.password`: เป้าหมาย Gateway ระยะไกล
-- `session.*`: ที่จัดเก็บเซสชันและค่าเริ่มต้นของคีย์หลัก
+- `session.*`: การจัดเก็บเซสชันและค่าเริ่มต้นของคีย์หลัก
## ที่เกี่ยวข้อง
- [Control UI](/th/web/control-ui)
-- [แดชบอร์ด](/th/web/dashboard)
+- [Dashboard](/th/web/dashboard)