Configuration
กลุ่ม
OpenClaw ใช้กฎกลุ่มเดียวกันกับทุกช่องทางที่รองรับกลุ่ม รวมถึง Discord, iMessage, Matrix, Microsoft Teams, QQBot, Signal, Slack, Telegram, WhatsApp และ Zalo
สำหรับห้องที่เปิดใช้งานตลอดเวลาซึ่งควรให้บริบทอย่างเงียบ ๆ เว้นแต่เอเจนต์จะส่งข้อความที่มองเห็นได้อย่างชัดเจน โปรดดู เหตุการณ์ห้องแบบแวดล้อม
บทนำสำหรับผู้เริ่มต้น (2 นาที)
OpenClaw "ทำงานอยู่" บนบัญชีรับส่งข้อความของคุณเอง โดยไม่มีผู้ใช้บอต WhatsApp แยกต่างหาก กล่าวคือ หาก คุณ อยู่ในกลุ่ม OpenClaw จะมองเห็นกลุ่มนั้นและตอบกลับในกลุ่มได้
ลักษณะการทำงานเริ่มต้น:
- กลุ่มถูกจำกัด (
groupPolicy: "allowlist"); ผู้ส่งในกลุ่มจะถูกบล็อกจนกว่าจะได้รับอนุญาต - การตอบกลับต้องมีการกล่าวถึง เว้นแต่คุณจะปิดข้อกำหนดการกล่าวถึงสำหรับกลุ่มนั้น
- ข้อความตอบกลับสุดท้ายจะถูกโพสต์ไปยังห้องโดยอัตโนมัติ (
visibleReplies: "automatic")
กล่าวคือ ผู้ส่งที่ได้รับอนุญาตสามารถกระตุ้น OpenClaw ได้ด้วยการกล่าวถึง OpenClaw
ลำดับการทำงานโดยย่อ (สิ่งที่เกิดขึ้นกับข้อความกลุ่ม):
groupPolicy? disabled -> dropgroupPolicy? allowlist -> group allowed? no -> droprequireMention? yes -> mentioned? no -> store for context onlymention/reply/command/DM -> user requestalways-on group chatter -> user request, or room event when configuredการตอบกลับที่มองเห็นได้
สำหรับคำขอทั่วไปในกลุ่ม/ช่องทาง ค่าเริ่มต้นของ OpenClaw คือ messages.groupChat.visibleReplies: "automatic": ข้อความสุดท้ายของผู้ช่วยจะถูกโพสต์ไปยังห้องเป็นการตอบกลับที่มองเห็นได้
ใช้ messages.groupChat.visibleReplies: "message_tool" เมื่อห้องที่ใช้ร่วมกันควรให้เอเจนต์ตัดสินใจว่าจะพูดเมื่อใดด้วยการเรียก message(action=send) วิธีนี้ทำงานได้ดีที่สุดกับโมเดลที่ใช้เครื่องมือได้อย่างเชื่อถือได้ (เช่น GPT-5.6 Sol) หากโมเดลไม่ได้เรียกเครื่องมือและส่งคืนข้อความสุดท้ายที่มีเนื้อหาสำคัญ OpenClaw จะเก็บข้อความนั้นไว้เป็นส่วนตัวแทนการโพสต์ไปยังห้อง
ใช้ "automatic" สำหรับโมเดลหรือรันไทม์ที่ไม่สามารถทำตามการส่งผ่านเครื่องมือเท่านั้นได้อย่างเชื่อถือได้: ข้อความสุดท้ายตามปกติจะถูกโพสต์ไปยังห้องโดยตรง และเอเจนต์ยังคงเรียก message(action=send) ได้สำหรับไฟล์ รูปภาพ หรือไฟล์แนบอื่น ๆ ที่ไม่สามารถส่งไปพร้อมกับข้อความสุดท้ายได้
หากเครื่องมือส่งข้อความไม่พร้อมใช้งานภายใต้นโยบายเครื่องมือที่ใช้งานอยู่ OpenClaw จะย้อนกลับไปใช้การตอบกลับที่มองเห็นได้แบบอัตโนมัติแทนการระงับการตอบกลับโดยไม่แจ้งให้ทราบ openclaw doctor จะแจ้งเตือนเกี่ยวกับความไม่สอดคล้องนี้
สำหรับแชตโดยตรงและเหตุการณ์จากแหล่งอื่น ๆ messages.visibleReplies: "message_tool" จะใช้ลักษณะการทำงานผ่านเครื่องมือเท่านั้นแบบเดียวกันทั่วทั้งระบบ ส่วน messages.groupChat.visibleReplies ยังคงเป็นค่าที่เจาะจงกว่าและใช้แทนค่าสำหรับห้องกลุ่ม/ช่องทาง การโต้ตอบโดยตรงภายใน WebChat จะใช้การส่งคำตอบสุดท้ายแบบอัตโนมัติเป็นค่าเริ่มต้น เพื่อให้ Pi และ Codex ได้รับสัญญาการตอบกลับที่มองเห็นได้แบบเดียวกัน
โหมดผ่านเครื่องมือเท่านั้นใช้แทนรูปแบบเดิมที่บังคับให้โมเดลตอบ NO_REPLY สำหรับการโต้ตอบส่วนใหญ่ในโหมดเฝ้าดูอย่างเงียบ ๆ ในโหมดผ่านเครื่องมือเท่านั้น พรอมต์จะไม่กำหนดสัญญา NO_REPLY; การไม่แสดงสิ่งใดให้เห็นหมายถึงเพียงการไม่เรียกเครื่องมือส่งข้อความ
การผูกการสนทนาที่ Plugin เป็นเจ้าของถือเป็นข้อยกเว้น เมื่อ Plugin ผูกเธรดและรับช่วงการโต้ตอบขาเข้าแล้ว การตอบกลับที่ Plugin ส่งคืนจะเป็นการตอบกลับของการผูกที่มองเห็นได้ โดยไม่จำเป็นต้องใช้ message(action=send) การตอบกลับนั้นเป็นผลลัพธ์จากรันไทม์ของ Plugin ไม่ใช่ข้อความสุดท้ายส่วนตัวของโมเดล
ระบบยังคงส่งตัวบ่งชี้การพิมพ์สำหรับคำขอโดยตรงในกลุ่ม เหตุการณ์ห้องแบบแวดล้อมที่เปิดใช้งานตลอดเวลา เมื่อเปิดใช้แล้ว จะยังคงเคร่งครัดและเงียบ เว้นแต่เอเจนต์จะเรียกเครื่องมือส่งข้อความ
โดยค่าเริ่มต้น เซสชันจะระงับสรุปเครื่องมือ/ความคืบหน้าแบบละเอียด ใช้ /verbose on (หรือ /verbose full) เพื่อแสดงข้อมูลเหล่านั้นสำหรับเซสชันปัจจุบันระหว่างการแก้ไขจุดบกพร่อง และใช้ /verbose off เพื่อกลับไปใช้ลักษณะการทำงานที่แสดงเฉพาะการตอบกลับสุดท้าย สถานะแบบละเอียดแยกตามเซสชันและทำงานเหมือนกันในแชตโดยตรง กลุ่ม ช่องทาง และหัวข้อฟอรัม
หากต้องการส่งการสนทนาในกลุ่มที่เปิดใช้งานตลอดเวลาและไม่มีการกล่าวถึงเป็นบริบทของห้องอย่างเงียบ ๆ แทนคำขอของผู้ใช้ ให้ใช้ เหตุการณ์ห้องแบบแวดล้อม:
{ messages: { groupChat: { unmentionedInbound: "room_event", }, },}ค่าเริ่มต้นคือ unmentionedInbound: "user_request" ข้อความที่มีการกล่าวถึง คำสั่ง คำขอยกเลิก และข้อความส่วนตัวยังคงเป็นคำขอของผู้ใช้
หากต้องการกำหนดให้ผลลัพธ์ที่มองเห็นได้สำหรับคำขอในกลุ่ม/ช่องทางต้องส่งผ่านเครื่องมือส่งข้อความ:
{ messages: { groupChat: { visibleReplies: "message_tool", }, },}หากต้องการกำหนดเช่นนี้สำหรับทุกแชตต้นทาง:
{ messages: { visibleReplies: "message_tool", },}Gateway จะรับการเปลี่ยนแปลงการกำหนดค่า messages หลังจากบันทึกไฟล์โดยไม่ต้องเริ่มการทำงานใหม่ ให้เริ่มการทำงานใหม่เฉพาะเมื่อปิดการโหลดการกำหนดค่าซ้ำ (gateway.reload.mode: "off")
การโต้ตอบด้วยคำสั่งจะข้าม visibleReplies: "message_tool" และตอบกลับให้มองเห็นได้เสมอ ทั้งคำสั่งเครื่องหมายทับแบบเนทีฟ (Discord, Telegram และส่วนติดต่ออื่น ๆ ที่รองรับคำสั่งแบบเนทีฟ) และคำสั่งข้อความ /... ที่ได้รับอนุญาตจะโพสต์การตอบกลับไปยังแชตต้นทาง การโต้ตอบด้วยข้อความ /... ที่ไม่ได้รับอนุญาตในกลุ่มจะยังคงใช้เครื่องมือส่งข้อความเท่านั้น ส่วนการโต้ตอบด้วยแชตทั่วไปจะเป็นไปตามค่าเริ่มต้นที่กำหนดไว้
การมองเห็นบริบทและรายการอนุญาต
ความปลอดภัยของกลุ่มเกี่ยวข้องกับการควบคุมสองส่วนที่แตกต่างกัน:
- การอนุญาตให้กระตุ้น: ใครสามารถกระตุ้นเอเจนต์ได้ (
groupPolicy,groups,groupAllowFrom, รายการอนุญาตเฉพาะช่องทาง) - การมองเห็นบริบท: บริบทเสริมใดบ้างที่ถูกป้อนเข้าสู่โมเดล (ข้อความตอบกลับ/ข้อความอ้างอิง ประวัติเธรด เมทาดาทาที่ส่งต่อ)
โดยค่าเริ่มต้น OpenClaw จะเก็บบริบทตามที่ได้รับ: รายการอนุญาตกำหนดว่าใครสามารถกระตุ้นการดำเนินการได้ ไม่ใช่กำหนดว่าข้อความอ้างอิงหรือส่วนย่อยจากประวัติใดที่โมเดลมองเห็น หากต้องการกรองบริบทเสริมด้วย ให้ตั้งค่า contextVisibility:
| โหมด | ลักษณะการทำงาน |
|---|---|
"all" (ค่าเริ่มต้น) |
เก็บบริบทเสริมตามที่ได้รับ |
"allowlist" |
ป้อนเฉพาะบริบทประวัติ/เธรด/ข้อความอ้างอิง/ข้อความส่งต่อจากผู้ส่งที่ได้รับอนุญาต |
"allowlist_quote" |
ใช้ allowlist พร้อมทั้งเก็บข้อความที่ถูกอ้างอิง/ตอบกลับอย่างชัดเจนจากผู้ส่งทุกคน |
ตั้งค่าได้ต่อช่องทาง (channels.<channel>.contextVisibility) ต่อบัญชี (channels.<channel>.accounts.<accountId>.contextVisibility) หรือทั่วทั้งระบบ (channels.defaults.contextVisibility) ช่องทางที่ดึงบริบทเสริม (Discord, Feishu, iMessage, Matrix, Microsoft Teams, Signal, Slack, Telegram, WhatsApp) จะใช้นโยบายนี้ขณะสร้างบริบทขาเข้า หากพบชุดนโยบายที่ไม่รู้จัก ระบบจะปฏิเสธโดยค่าเริ่มต้นและละเว้นบริบทนั้น
หากคุณต้องการ...
| เป้าหมาย | ค่าที่ต้องตั้ง |
|---|---|
| อนุญาตทุกกลุ่ม แต่ตอบกลับเฉพาะเมื่อมีการกล่าวถึงด้วย @ | groups: { "*": { requireMention: true } } |
| ปิดการตอบกลับในกลุ่มทั้งหมด | groupPolicy: "disabled" |
| อนุญาตเฉพาะบางกลุ่ม | groups: { "<group-id>": { ... } } (ไม่มีคีย์ "*") |
| ให้เฉพาะคุณกระตุ้นเอเจนต์ในกลุ่มได้ | groupPolicy: "allowlist", groupAllowFrom: ["+1555..."] |
| ใช้ชุดผู้ส่งที่เชื่อถือได้ชุดเดียวร่วมกันระหว่างช่องทาง | groupAllowFrom: ["accessGroup:operators"] |
สำหรับรายการอนุญาตผู้ส่งที่นำกลับมาใช้ซ้ำได้ โปรดดู กลุ่มการเข้าถึง
คีย์เซสชัน
- เซสชันกลุ่มใช้คีย์เซสชัน
agent:<agentId>:<channel>:group:<id>(ห้อง/ช่องทางใช้agent:<agentId>:<channel>:channel:<id>) - หัวข้อฟอรัม Telegram จะเพิ่ม
:topic:<threadId>ต่อท้ายรหัสกลุ่ม เพื่อให้แต่ละหัวข้อมีเซสชันของตนเอง - แชตโดยตรงใช้เซสชันหลัก (หรือเซสชันแยกตามผู้ส่ง หากกำหนดค่า
session.dmScope) - Heartbeat ทำงานในเซสชัน Heartbeat ที่กำหนดไว้ (ค่าเริ่มต้น: เซสชันหลักของเอเจนต์); เซสชันกลุ่มจะไม่เรียกใช้ Heartbeat ของตนเอง
รูปแบบ: ข้อความส่วนตัวส่วนบุคคล + กลุ่มสาธารณะ (เอเจนต์เดียว)
ใช่ — วิธีนี้ทำงานได้ดีหากการรับส่งข้อมูล "ส่วนบุคคล" ของคุณเป็น ข้อความส่วนตัว และการรับส่งข้อมูล "สาธารณะ" เป็น กลุ่ม
เหตุผล: ในโหมดเอเจนต์เดียว ข้อความส่วนตัวมักเข้าสู่คีย์เซสชัน หลัก (agent:main:main) ขณะที่กลุ่มจะใช้คีย์เซสชันที่ ไม่ใช่เซสชันหลัก (agent:main:<channel>:group:<id>) เสมอ หากคุณเปิดใช้แซนด์บ็อกซ์ด้วย mode: "non-main" เซสชันกลุ่มเหล่านั้นจะทำงานในแบ็กเอนด์แซนด์บ็อกซ์ที่กำหนดไว้ ขณะที่เซสชันข้อความส่วนตัวหลักของคุณยังคงทำงานบนโฮสต์ Docker เป็นแบ็กเอนด์เริ่มต้นหากคุณไม่ได้เลือกแบ็กเอนด์อื่น
วิธีนี้ทำให้คุณมี "สมอง" ของเอเจนต์หนึ่งชุด (พื้นที่ทำงาน + หน่วยความจำที่ใช้ร่วมกัน) แต่มีรูปแบบการดำเนินงานสองแบบ:
- ข้อความส่วนตัว: เครื่องมือครบถ้วน (โฮสต์)
- กลุ่ม: แซนด์บ็อกซ์ + เครื่องมือที่ถูกจำกัด
ข้อความส่วนตัวบนโฮสต์ กลุ่มอยู่ในแซนด์บ็อกซ์
{ agents: { defaults: { sandbox: { mode: "non-main", // groups/channels are non-main -> sandboxed scope: "session", // strongest isolation (one container per group/channel) workspaceAccess: "none", }, }, }, tools: { sandbox: { tools: { // If allow is non-empty, everything else is blocked (deny still wins). allow: ["group:messaging", "group:sessions"], deny: ["group:runtime", "group:fs", "group:ui", "nodes", "cron", "gateway"], }, }, },}กลุ่มมองเห็นเฉพาะโฟลเดอร์ที่ได้รับอนุญาต
ต้องการให้ "กลุ่มมองเห็นได้เฉพาะโฟลเดอร์ X" แทน "ไม่มีสิทธิ์เข้าถึงโฮสต์" ใช่หรือไม่ ให้คง workspaceAccess: "none" ไว้และเมานต์เฉพาะพาธที่ได้รับอนุญาตเข้าสู่แซนด์บ็อกซ์:
{ agents: { defaults: { sandbox: { mode: "non-main", scope: "session", workspaceAccess: "none", docker: { binds: [ // hostPath:containerPath:mode "/home/user/FriendsShared:/data:ro", ], }, }, }, },}เนื้อหาที่เกี่ยวข้อง:
- คีย์การกำหนดค่าและค่าเริ่มต้น: การกำหนดค่า Gateway
- การแก้ไขจุดบกพร่องเพื่อหาสาเหตุที่เครื่องมือถูกบล็อก: แซนด์บ็อกซ์เทียบกับนโยบายเครื่องมือเทียบกับสิทธิ์ระดับสูง
- รายละเอียดการเมานต์แบบผูก: การใช้แซนด์บ็อกซ์
ป้ายกำกับที่แสดง
- ป้ายกำกับใน UI ใช้
displayNameเมื่อมี โดยจัดรูปแบบเป็น<channel>:<token> #roomสงวนไว้สำหรับห้อง/ช่องทาง ส่วนแชตกลุ่มใช้g-<slug>(ตัวพิมพ์เล็ก ช่องว่าง ->-และคงอักขระ#@+._-ไว้) รหัสทึบแสงที่ยาวมากจะถูกย่อเป็นโทเค็นที่คงที่ แทนการเปิดเผยรหัสเส้นทางทั้งหมดใน UI
นโยบายกลุ่ม
ควบคุมวิธีจัดการข้อความกลุ่ม/ห้องในแต่ละช่องทาง:
{ channels: { whatsapp: { groupPolicy: "disabled", // "open" | "disabled" | "allowlist" groupAllowFrom: ["+15551234567"], }, telegram: { groupPolicy: "disabled", groupAllowFrom: ["123456789"], // numeric Telegram user id (setup resolves @username) }, signal: { groupPolicy: "disabled", groupAllowFrom: ["+15551234567"], }, imessage: { groupPolicy: "disabled", groupAllowFrom: ["chat_id:123"], }, msteams: { groupPolicy: "disabled", groupAllowFrom: ["user@org.com"], }, discord: { groupPolicy: "allowlist", guilds: { GUILD_ID: { channels: { help: { enabled: true } } }, }, }, slack: { groupPolicy: "allowlist", channels: { "#general": { enabled: true } }, }, matrix: { groupPolicy: "allowlist", groupAllowFrom: ["@owner:example.org"], groups: { "!roomId:example.org": { enabled: true }, "#alias:example.org": { enabled: true }, }, }, },}| นโยบาย | ลักษณะการทำงาน |
|---|---|
"open" |
กลุ่มข้ามรายการอนุญาต แต่การควบคุมด้วยการกล่าวถึงยังคงมีผล |
"disabled" |
บล็อกข้อความกลุ่มทั้งหมดโดยสมบูรณ์ |
"allowlist" |
อนุญาตเฉพาะกลุ่ม/ห้องที่ตรงกับรายการอนุญาตที่กำหนดค่าไว้ |
Per-channel notes
groupPolicyแยกจากการควบคุมด้วยการกล่าวถึง (ซึ่งกำหนดให้ต้องมี @mentions)- WhatsApp/Telegram/Signal/iMessage/Microsoft Teams/Zalo: ใช้
groupAllowFrom(ค่าทดแทน:allowFromที่ระบุไว้อย่างชัดเจน) - Signal:
groupAllowFromสามารถจับคู่กับรหัสกลุ่ม Signal ขาเข้าหรือหมายเลขโทรศัพท์/UUID ของผู้ส่งก็ได้ - การอนุมัติการจับคู่ DM (รายการในที่เก็บ
*-allowFrom) ใช้กับการเข้าถึง DM เท่านั้น ส่วนการอนุญาตผู้ส่งในกลุ่มยังต้องระบุไว้อย่างชัดเจนในรายการอนุญาตของกลุ่ม - Discord: รายการอนุญาตใช้
channels.discord.guilds.<id>.channels - Slack: รายการอนุญาตใช้
channels.slack.channels - Matrix: รายการอนุญาตใช้
channels.matrix.groupsใช้รหัสห้อง (!room:server) หรือนามแฝง (#alias:server) คีย์ชื่อห้องจะจับคู่เฉพาะเมื่อกำหนดchannels.matrix.dangerouslyAllowNameMatching: trueและรายการที่แปลงค่าไม่ได้จะถูกละเว้นขณะรัน ใช้channels.matrix.groupAllowFromเพื่อจำกัดผู้ส่ง และยังรองรับรายการอนุญาตusersแยกตามห้องด้วย - DM แบบกลุ่มถูกควบคุมแยกต่างหาก (
channels.discord.dm.*,channels.slack.dm.*:groupEnabled,groupChannels) - Telegram: รายการอนุญาตผู้ส่งยอมรับเฉพาะรหัสผู้ใช้ที่เป็นตัวเลข (
"123456789"โดยคำนำหน้าtelegram:/tg:จะถูกตัดออกโดยไม่คำนึงถึงตัวพิมพ์เล็ก-ใหญ่) รายการ@usernameจะไม่จับคู่ขณะรันและจะบันทึกคำเตือน ส่วนขั้นตอนการตั้งค่าจะแปลง@usernameเป็นรหัส รหัสแชตที่เป็นค่าลบต้องอยู่ภายใต้channels.telegram.groupsไม่ใช่รายการอนุญาตผู้ส่ง - ค่าเริ่มต้นคือ
groupPolicy: "allowlist"หากรายการอนุญาตของกลุ่มว่างเปล่า ข้อความกลุ่มจะถูกบล็อก - ความปลอดภัยขณะรัน: เมื่อไม่มีบล็อกของผู้ให้บริการเลย (ไม่มี
channels.<provider>) นโยบายกลุ่มจะปิดกั้นอย่างปลอดภัยด้วยค่าallowlistแทนการสืบทอดchannels.defaults.groupPolicyและ Gateway จะบันทึกการใช้ค่าทดแทนหนึ่งครั้งต่อบัญชี
แบบจำลองอย่างย่อ (ลำดับการประเมินข้อความกลุ่ม):
groupPolicy
groupPolicy (เปิด/ปิดใช้งาน/รายการอนุญาต)
Group allowlists
รายการอนุญาตของกลุ่ม (*.groups, *.groupAllowFrom, รายการอนุญาตเฉพาะช่องทาง)
Mention gating
การควบคุมด้วยการกล่าวถึง (requireMention, /activation)
การควบคุมด้วยการกล่าวถึง (ค่าเริ่มต้น)
ข้อความกลุ่มต้องมีการกล่าวถึง เว้นแต่จะมีการกำหนดเป็นอย่างอื่นสำหรับแต่ละกลุ่ม ค่าเริ่มต้นอยู่ในแต่ละระบบย่อยภายใต้ *.groups."*"
การตอบกลับข้อความของบอตถือเป็นการกล่าวถึงโดยนัยเมื่อช่องทางเปิดเผยข้อมูลเมตาของการตอบกลับ การอ้างข้อความของบอตก็อาจถือเป็นการกล่าวถึงได้เช่นกันในช่องทางที่เปิดเผยข้อมูลเมตาของการอ้าง กรณีที่รองรับในตัวปัจจุบัน ได้แก่ Discord, Microsoft Teams, QQBot, Slack, Telegram, WhatsApp และ Zalo ส่วนบุคคล
{ channels: { whatsapp: { groups: { "*": { requireMention: true }, "123@g.us": { requireMention: false }, }, }, telegram: { groups: { "*": { requireMention: true }, "123456789": { requireMention: false }, }, }, imessage: { groups: { "*": { requireMention: true }, "123": { requireMention: false }, }, }, }, agents: { list: [ { id: "main", groupChat: { mentionPatterns: ["@openclaw", "openclaw", "\\+15555550123"], historyLimit: 50, }, }, ], },}การกำหนดขอบเขตรูปแบบการกล่าวถึงที่ตั้งค่าไว้
mentionPatterns ที่กำหนดค่าไว้เป็นทริกเกอร์สำรองแบบนิพจน์ทั่วไป ใช้เมื่อแพลตฟอร์มไม่เปิดเผยการกล่าวถึงบอตโดยตรง หรือเมื่อต้องการให้ข้อความธรรมดา เช่น openclaw: นับเป็นการกล่าวถึง การกล่าวถึงโดยตรงของแพลตฟอร์มจะแยกต่างหาก เมื่อ Discord, Slack, Telegram, Matrix หรือช่องทางอื่นสามารถยืนยันได้ว่าข้อความกล่าวถึงบอตอย่างชัดเจน การกล่าวถึงโดยตรงนั้นจะยังคงกระตุ้นการทำงานแม้ในตำแหน่งที่ปฏิเสธรูปแบบนิพจน์ทั่วไปที่กำหนดค่าไว้
โดยค่าเริ่มต้น รูปแบบการกล่าวถึงที่กำหนดค่าไว้จะใช้ทุกที่ที่ช่องทางส่งข้อมูลผู้ให้บริการและการสนทนาเข้าสู่การตรวจจับการกล่าวถึง เพื่อป้องกันไม่ให้รูปแบบที่กว้างปลุกเอเจนต์ในทุกกลุ่ม ให้กำหนดขอบเขตแยกตามช่องทางด้วย channels.<channel>.mentionPatterns
ใช้ mode: "deny" เมื่อต้องการปิดรูปแบบการกล่าวถึงแบบนิพจน์ทั่วไปเป็นค่าเริ่มต้นสำหรับช่องทาง แล้วเลือกเปิดใช้เฉพาะห้องด้วย allowIn:
{ messages: { groupChat: { mentionPatterns: ["\\bopenclaw\\b", "\\bops bot\\b"], }, }, channels: { slack: { mentionPatterns: { mode: "deny", allowIn: ["C0123OPS"], }, }, },}ใช้ค่าเริ่มต้น mode: "allow" (หรือละ mode ไว้) เมื่อต้องการให้รูปแบบการกล่าวถึงแบบนิพจน์ทั่วไปใช้ในวงกว้าง แล้วปิดรูปแบบดังกล่าวในห้องที่มีข้อความรบกวนมากด้วย denyIn:
{ messages: { groupChat: { mentionPatterns: ["\\bopenclaw\\b"], }, }, channels: { telegram: { mentionPatterns: { denyIn: ["-1001234567890", "-1001234567890:topic:42"], }, }, },}การตัดสินนโยบาย:
| ฟิลด์ | ผล |
|---|---|
mode: "allow" |
เปิดใช้รูปแบบการกล่าวถึงแบบนิพจน์ทั่วไป เว้นแต่รหัสการสนทนาจะอยู่ใน denyIn นี่คือค่าเริ่มต้น |
mode: "deny" |
ปิดใช้รูปแบบการกล่าวถึงแบบนิพจน์ทั่วไป เว้นแต่รหัสการสนทนาจะอยู่ใน allowIn |
allowIn |
รหัสการสนทนาที่เปิดใช้รูปแบบการกล่าวถึงแบบนิพจน์ทั่วไปในโหมดปฏิเสธ |
denyIn |
รหัสการสนทนาที่ปิดใช้รูปแบบการกล่าวถึงแบบนิพจน์ทั่วไป หากทั้งสองรายการมีรหัสเดียวกัน denyIn จะมีลำดับความสำคัญเหนือ allowIn |
นโยบายนิพจน์ทั่วไปแบบกำหนดขอบเขตที่รองรับในปัจจุบัน:
| ช่องทาง | รหัสที่ใช้ใน allowIn / denyIn |
|---|---|
| Discord | รหัสช่อง Discord |
| Matrix | รหัสห้อง Matrix |
| Slack | รหัสช่อง Slack |
| Telegram | รหัสแชตกลุ่ม หรือ chatId:topic:threadId สำหรับหัวข้อในฟอรัม |
รหัสการสนทนา WhatsApp เช่น 123@g.us |
การกำหนดค่าช่องทางระดับบัญชีสามารถตั้งนโยบายเดียวกันภายใต้ channels.<channel>.accounts.<accountId>.mentionPatterns เมื่อช่องทางนั้นรองรับหลายบัญชี นโยบายบัญชีมีลำดับความสำคัญเหนือนโยบายช่องทางระดับบนสุดสำหรับบัญชีนั้น
Mention gating notes
mentionPatternsเป็นรูปแบบนิพจน์ทั่วไปที่ปลอดภัยและไม่คำนึงถึงตัวพิมพ์เล็ก-ใหญ่ รูปแบบที่ไม่ถูกต้องและรูปแบบการทำซ้ำซ้อนที่ไม่ปลอดภัยจะถูกละเว้น (พร้อมคำเตือน)- ลำดับความสำคัญของรูปแบบ:
agents.list[].groupChat.mentionPatterns(มีประโยชน์เมื่อหลายเอเจนต์ใช้กลุ่มร่วมกัน) มีลำดับความสำคัญเหนือmessages.groupChat.mentionPatternsหากไม่ได้ตั้งค่าทั้งสองรายการ ระบบจะสร้างรูปแบบจากชื่อ/อีโมจิประจำตัวของเอเจนต์ - การควบคุมด้วยการกล่าวถึงจะบังคับใช้เฉพาะเมื่อสามารถตรวจจับการกล่าวถึงได้ (มีการกล่าวถึงโดยตรงหรือกำหนดค่า
mentionPatternsไว้) - การเพิ่มกลุ่มหรือผู้ส่งลงในรายการอนุญาตไม่ได้ปิดการควบคุมด้วยการกล่าวถึง ให้ตั้ง
requireMentionของกลุ่มนั้นเป็นfalseเมื่อต้องการให้ทุกข้อความกระตุ้นการทำงาน - บริบทพรอมต์การแชตกลุ่มอัตโนมัติจะส่งคำสั่งการตอบแบบเงียบที่ตัดสินแล้วในทุกครั้ง ไฟล์เวิร์กสเปซไม่ควรทำกลไก
NO_REPLYซ้ำ - กลุ่มที่อนุญาตการตอบแบบเงียบอัตโนมัติจะถือว่าเทิร์นของโมเดลที่ว่างเปล่าอย่างสมบูรณ์หรือมีเพียงการให้เหตุผลเป็นการตอบแบบเงียบ ซึ่งเทียบเท่ากับ
NO_REPLYแชตโดยตรงจะไม่ได้รับคำแนะนำNO_REPLYและการตอบในกลุ่มที่ใช้เฉพาะเครื่องมือข้อความจะยังคงเงียบโดยไม่เรียกmessage(action=send) - การสนทนาทั่วไปในกลุ่มที่เปิดรับตลอดเวลาจะใช้ความหมายแบบคำขอของผู้ใช้เป็นค่าเริ่มต้น ตั้ง
messages.groupChat.unmentionedInbound: "room_event"เพื่อส่งเป็นบริบทแบบเงียบแทน ดูตัวอย่างการตั้งค่าที่ เหตุการณ์ห้องโดยรอบ - เหตุการณ์ห้องจะไม่ถูกจัดเก็บเป็นคำขอผู้ใช้ปลอม และข้อความส่วนตัวของผู้ช่วยจากเหตุการณ์ห้องที่ไม่มีเครื่องมือข้อความจะไม่ถูกเล่นซ้ำเป็นประวัติการแชต
- ค่าเริ่มต้นของ Discord อยู่ใน
channels.discord.guilds."*"(เขียนทับแยกตามกิลด์/ช่องได้) - บริบทประวัติกลุ่มถูกครอบด้วยรูปแบบเดียวกันในทุกช่องทาง กลุ่มที่ควบคุมด้วยการกล่าวถึงจะเก็บข้อความที่ข้ามไว้ซึ่งยังรอดำเนินการ ส่วนกลุ่มที่เปิดรับตลอดเวลาอาจเก็บข้อความห้องที่ประมวลผลแล้วล่าสุดไว้ด้วยเมื่อช่องทางรองรับ ใช้
messages.groupChat.historyLimitเป็นค่าเริ่มต้นส่วนกลาง และใช้channels.<channel>.historyLimit(หรือchannels.<channel>.accounts.*.historyLimit) เพื่อเขียนทับ ตั้งเป็น0เพื่อปิดใช้งาน
ข้อจำกัดเครื่องมือของกลุ่ม/ช่องทาง (ไม่บังคับ)
การกำหนดค่าบางช่องทางรองรับการจำกัดว่าเครื่องมือใดพร้อมใช้งาน ภายในกลุ่ม/ห้อง/ช่องที่ระบุ
tools: อนุญาต/ปฏิเสธเครื่องมือสำหรับทั้งกลุ่ม (allow,alsoAllow,denyโดยการปฏิเสธมีลำดับความสำคัญสูงกว่า)toolsBySender: การเขียนทับแยกตามผู้ส่งภายในกลุ่ม ใช้คำนำหน้าคีย์ที่ชัดเจน ได้แก่channel:<channelId>:<senderId>,id:<senderId>,e164:<phone>,username:<handle>,name:<displayName>และอักขระตัวแทน"*"รหัสช่องใช้รหัสช่องมาตรฐานของ OpenClaw ส่วนนามแฝง เช่นteamsจะถูกปรับให้เป็นmsteamsคีย์แบบเดิมที่ไม่มีคำนำหน้ายังคงใช้ได้ โดยจะจับคู่เป็นid:เท่านั้น และบันทึกคำเตือนการเลิกใช้งาน
ลำดับการตัดสิน (รายการที่เฉพาะเจาะจงที่สุดมีลำดับความสำคัญสูงสุด):
Group toolsBySender
การจับคู่ toolsBySender ของกลุ่ม/ช่องทาง
Group tools
tools ของกลุ่ม/ช่องทาง
Default toolsBySender
การจับคู่ toolsBySender ค่าเริ่มต้น ("*")
Default tools
tools ค่าเริ่มต้น ("*")
ตัวอย่าง (Telegram):
{ channels: { telegram: { groups: { "*": { tools: { deny: ["exec"] } }, "-1001234567890": { tools: { deny: ["exec", "read", "write"] }, toolsBySender: { "id:123456789": { alsoAllow: ["exec"] }, }, }, }, }, },}รายการอนุญาตของกลุ่ม
เมื่อกำหนดค่า channels.whatsapp.groups, channels.telegram.groups หรือ channels.imessage.groups คีย์เหล่านี้จะทำหน้าที่เป็นรายการอนุญาตของกลุ่ม ใช้ "*" เพื่ออนุญาตทุกกลุ่ม โดยยังคงกำหนดลักษณะการกล่าวถึงเริ่มต้นได้
จุดประสงค์ที่พบบ่อย (คัดลอก/วาง):
ปิดการตอบกลับในกลุ่มทั้งหมด
{ channels: { whatsapp: { groupPolicy: "disabled" } },}อนุญาตเฉพาะกลุ่มที่ระบุ (WhatsApp)
{ channels: { whatsapp: { groups: { "123@g.us": { requireMention: true }, "456@g.us": { requireMention: false }, }, }, },}อนุญาตทุกกลุ่มแต่ต้องมีการกล่าวถึง
{ channels: { whatsapp: { groups: { "*": { requireMention: true } }, }, },}ทริกเกอร์สำหรับเจ้าของเท่านั้น (WhatsApp)
{ channels: { whatsapp: { groupPolicy: "allowlist", groupAllowFrom: ["+15551234567"], groups: { "*": { requireMention: true } }, }, },}การเปิดใช้งาน (เฉพาะเจ้าของ)
เจ้าของกลุ่มสามารถสลับการเปิดใช้งานของแต่ละกลุ่มได้ด้วยข้อความเดี่ยว:
/activation mention/activation always
/activation เป็นคำสั่งหลักที่จำกัดไว้สำหรับเจ้าของและใช้ได้เฉพาะในแชตกลุ่ม เจ้าของหมายถึงผู้ส่งที่ตรงกับ allowFrom / commands.ownerAllowFrom ของช่องทาง (เมื่อไม่ได้กำหนดรายการอนุญาต รหัสของบัญชีนั้นเองจะถือเป็นเจ้าของ) โหมดที่จัดเก็บไว้จะแทนที่ requireMention ของกลุ่มนั้นในช่องทางที่ตรวจสอบค่านี้ (Google Chat, QQBot, Telegram, WhatsApp) และข้อความเกริ่นนำของพรอมต์ระบบสำหรับกลุ่มจะแสดงโหมดที่ใช้งานอยู่ในทุกช่องทาง
ฟิลด์บริบท
เพย์โหลดขาเข้าของกลุ่มจะตั้งค่า:
ChatType=groupGroupSubject(หากทราบ)GroupMembers(หากทราบ)WasMentioned(ผลลัพธ์จากเงื่อนไขการกล่าวถึง)- หัวข้อฟอรัมของ Telegram จะมี
MessageThreadIdและIsForumเพิ่มด้วย
พรอมต์ระบบของเอเจนต์จะมีข้อความเกริ่นนำสำหรับกลุ่มในเทิร์นแรกของเซสชันกลุ่มใหม่ (และหลังการเปลี่ยนแปลง /activation) ข้อความนี้เตือนโมเดลให้ตอบอย่างเป็นธรรมชาติ ลดบรรทัดว่างให้เหลือน้อยที่สุด ใช้ระยะห่างตามปกติของการแชต และหลีกเลี่ยงการพิมพ์ลำดับอักขระ \n แบบตรงตัว นอกจากนี้ กลุ่มที่ไม่ใช่ Telegram ยังไม่แนะนำให้ใช้ตาราง Markdown ส่วนแนวทางข้อความแบบริชเท็กซ์ของ Telegram มาจากพรอมต์ของช่องทาง Telegram ชื่อกลุ่มและป้ายกำกับผู้เข้าร่วมที่มาจากช่องทางจะแสดงเป็นเมทาดาทาที่ไม่น่าเชื่อถือภายในบล็อกแบบมีรั้ว ไม่ใช่คำสั่งระบบแบบอินไลน์
รายละเอียดเฉพาะของ iMessage
- ควรใช้
chat_id:<id>เมื่อกำหนดเส้นทางหรือเพิ่มลงในรายการอนุญาต - แสดงรายการแชต:
imsg chats --limit 20 - การตอบกลับในกลุ่มจะส่งกลับไปยัง
chat_idเดิมเสมอ
พรอมต์ระบบของ WhatsApp
ดูหลักเกณฑ์มาตรฐานของพรอมต์ระบบ WhatsApp ได้ที่ WhatsApp ซึ่งครอบคลุมการเลือกพรอมต์สำหรับกลุ่มและข้อความโดยตรง ลักษณะการทำงานของไวลด์การ์ด และความหมายของการแทนที่ค่าระดับบัญชี
รายละเอียดเฉพาะของ WhatsApp
ดูพฤติกรรมเฉพาะของ WhatsApp (การแทรกประวัติและรายละเอียดการจัดการการกล่าวถึง) ได้ที่ ข้อความกลุ่ม