Configuration
เหตุการณ์แวดล้อมภายในห้อง
เหตุการณ์ห้องแบบแวดล้อมช่วยให้ OpenClaw ประมวลผลบทสนทนาในกลุ่มหรือช่องที่ไม่ได้กล่าวถึงเอเจนต์เป็นบริบทเงียบได้ เอเจนต์สามารถอัปเดตหน่วยความจำและสถานะเซสชัน แต่ห้องจะยังคงเงียบ เว้นแต่เอเจนต์จะเรียกใช้เครื่องมือ message อย่างชัดเจน
สำหรับแชตกลุ่มที่เปิดใช้งานตลอดเวลา ให้ใช้ messages.groupChat.unmentionedInbound: "room_event" ร่วมกับ messages.groupChat.visibleReplies: "message_tool" เอเจนต์จะรับฟัง ตัดสินใจว่าเมื่อใดควรตอบ และไม่จำเป็นต้องใช้รูปแบบพรอมต์แบบเดิมที่ตอบ NO_REPLY
ช่องทางที่รองรับในปัจจุบัน ได้แก่ ช่องกิลด์ Discord, ช่องสาธารณะและช่องส่วนตัวของ Slack, DM แบบหลายคนของ Slack และกลุ่มหรือซูเปอร์กรุ๊ป Telegram ช่องกลุ่มอื่น ๆ จะยังคงใช้พฤติกรรมกลุ่มเดิม เว้นแต่หน้าเอกสารของช่องนั้นจะระบุว่ารองรับเหตุการณ์ห้องแบบแวดล้อม
การตั้งค่าที่แนะนำ
ตั้งค่าพฤติกรรมแชตกลุ่มส่วนกลาง:
{ messages: { groupChat: { unmentionedInbound: "room_event", visibleReplies: "message_tool", historyLimit: 50, }, },}จากนั้นทำให้ห้องเปิดใช้งานตลอดเวลาโดยปิดการจำกัดให้ต้องกล่าวถึงสำหรับห้องนั้น ห้องยังคงต้องผ่าน groupPolicy ปกติ รายการอนุญาตของห้อง และรายการอนุญาตของผู้ส่ง
หลังจากบันทึกการกำหนดค่า Gateway จะนำการตั้งค่า messages ไปใช้แบบทันที รีสตาร์ตเฉพาะเมื่อปิดการเฝ้าดูไฟล์หรือการโหลดการกำหนดค่าใหม่ (gateway.reload.mode: "off")
สิ่งที่เปลี่ยนแปลง
เมื่อใช้ messages.groupChat.unmentionedInbound: "room_event":
- ข้อความจากกลุ่มหรือช่องที่ได้รับอนุญาตและไม่ได้กล่าวถึงเอเจนต์จะกลายเป็นเหตุการณ์ห้องแบบเงียบ
- ข้อความที่กล่าวถึงเอเจนต์จะยังคงเป็นคำขอของผู้ใช้
- คำสั่งควบคุมแบบข้อความและคำสั่งแบบเนทีฟจะยังคงเป็นคำขอของผู้ใช้
- คำขอยกเลิกหรือหยุดจะยังคงเป็นคำขอของผู้ใช้
- ข้อความโดยตรงจะยังคงเป็นคำขอของผู้ใช้
เหตุการณ์ห้องใช้การส่งที่มองเห็นได้แบบเข้มงวด ข้อความสุดท้ายจากผู้ช่วยจะเป็นแบบส่วนตัว เอเจนต์ต้องเรียก message(action=send) เพื่อโพสต์ในห้อง
การแสดงสถานะกำลังพิมพ์และรีแอ็กชันสถานะวงจรการทำงานจะยังคงถูกระงับสำหรับเหตุการณ์ห้อง ข้อยกเว้นเดียวที่ยืนยันการรับอย่างชัดเจนคือ messages.ackReactionScope: "all" ซึ่งจะส่งรีแอ็กชันยืนยันการรับที่กำหนดค่าไว้ หากห้องต้องเงียบสนิท ให้ใช้ขอบเขตที่แคบกว่านั้นหรือ "off"
ตัวอย่าง Discord
{ messages: { groupChat: { unmentionedInbound: "room_event", visibleReplies: "message_tool", historyLimit: 50, }, }, channels: { discord: { groupPolicy: "allowlist", guilds: { "<DISCORD_SERVER_ID>": { requireMention: false, users: ["<YOUR_DISCORD_USER_ID>"], }, }, }, },}ใช้การกำหนดค่า Discord แยกตามช่องเมื่อต้องการให้มีเพียงช่องเดียวเป็นแบบแวดล้อม ภายใต้ groupPolicy: "allowlist" การระบุช่องในรายการคือสิ่งที่อนุญาตช่องนั้น (enabled: false จะปิดใช้งานรายการ):
{ channels: { discord: { groupPolicy: "allowlist", guilds: { "<DISCORD_SERVER_ID>": { channels: { "<DISCORD_CHANNEL_ID_OR_NAME>": { requireMention: false, }, }, }, }, }, },}ตัวอย่าง Slack
รายการอนุญาตช่อง Slack ใช้ ID เป็นหลัก ใช้ ID ช่อง เช่น C12345678 ไม่ใช่ #channel-name การระบุช่องไว้ภายใต้ channels.slack.channels คือสิ่งที่อนุญาตช่องนั้น (enabled: false จะปิดใช้งานรายการ):
{ messages: { groupChat: { unmentionedInbound: "room_event", visibleReplies: "message_tool", historyLimit: 50, }, }, channels: { slack: { groupPolicy: "allowlist", channels: { "<SLACK_CHANNEL_ID>": { requireMention: false, }, }, }, },}ตัวอย่าง Telegram
สำหรับกลุ่ม Telegram บอตต้องสามารถเห็นข้อความกลุ่มตามปกติได้ หากใช้ requireMention: false ให้ปิดโหมดความเป็นส่วนตัวของ BotFather หรือใช้การตั้งค่า Telegram รูปแบบอื่นที่ส่งทราฟฟิกทั้งหมดของกลุ่มไปยังบอต
{ messages: { groupChat: { unmentionedInbound: "room_event", visibleReplies: "message_tool", historyLimit: 50, }, }, channels: { telegram: { groups: { "<TELEGRAM_GROUP_CHAT_ID>": { groupPolicy: "open", requireMention: false, }, }, }, },}โดยทั่วไป ID กลุ่ม Telegram เป็นจำนวนลบ เช่น -1001234567890 อ่าน chat.id จาก openclaw logs --follow ส่งต่อข้อความกลุ่มไปยังบอตช่วยค้นหา ID หรือตรวจสอบ getUpdates ของ Bot API
นโยบายเฉพาะเอเจนต์
ใช้การกำหนดค่าทับสำหรับเอเจนต์เมื่อมีเอเจนต์หลายตัวใช้ห้องเดียวกันร่วมกัน แต่ต้องการให้มีเพียงตัวเดียวที่ถือว่าบทสนทนาที่ไม่ได้กล่าวถึงเป็นบริบทแบบแวดล้อม:
{ messages: { groupChat: { visibleReplies: "message_tool", }, }, agents: { list: [ { id: "main", groupChat: { unmentionedInbound: "room_event", mentionPatterns: ["@openclaw", "openclaw"], }, }, ], },}ค่า agents.list[].groupChat.unmentionedInbound เฉพาะเอเจนต์จะแทนที่ messages.groupChat.unmentionedInbound สำหรับเอเจนต์นั้น
โหมดการตอบกลับที่มองเห็นได้
ค่าเริ่มต้นของ messages.groupChat.visibleReplies คือ "automatic" สำหรับคำขอของผู้ใช้ในกลุ่มหรือช่องตามปกติ ใช้ค่าเริ่มต้นนี้ต่อไปเมื่อต้องการให้ข้อความสุดท้ายจากผู้ช่วยถูกโพสต์ให้มองเห็นได้โดยไม่ต้องเรียกเครื่องมือส่งข้อความอย่างชัดเจน
สำหรับห้องแบบแวดล้อมที่เปิดใช้งานตลอดเวลา ยังคงแนะนำให้ใช้ messages.groupChat.visibleReplies: "message_tool" โดยเฉพาะกับโมเดลรุ่นล่าสุดที่เรียกใช้เครื่องมือได้อย่างเชื่อถือได้ เช่น GPT-5.6 Sol การตั้งค่านี้ช่วยให้เอเจนต์ตัดสินใจว่าจะพูดเมื่อใดด้วยการเรียกเครื่องมือส่งข้อความ หากโมเดลส่งคืนข้อความสุดท้ายโดยไม่เรียกเครื่องมือ OpenClaw จะเก็บข้อความสุดท้ายนั้นไว้เป็นส่วนตัวและบันทึกข้อมูลเมตาของการส่งที่ถูกระงับ
เหตุการณ์ห้องจะยังคงใช้โหมดเข้มงวด แม้ว่าคำขออื่นในกลุ่มจะใช้การตอบกลับอัตโนมัติก็ตาม เหตุการณ์ห้องแบบแวดล้อมที่ไม่ได้กล่าวถึงต้องใช้ message(action=send) เสมอเพื่อให้ผลลัพธ์มองเห็นได้
ประวัติ
messages.groupChat.historyLimit กำหนดค่าเริ่มต้นส่วนกลางของประวัติกลุ่ม (50 เมื่อไม่ได้ตั้งค่า และต้องเป็นจำนวนเต็มบวก) ช่องต่าง ๆ สามารถแทนที่ค่านี้ด้วย channels.<channel>.historyLimit และบางช่องยังรองรับขีดจำกัดประวัติแยกตามบัญชีด้วย ตั้งค่า historyLimit: 0 ที่ระดับช่องเพื่อปิดบริบทประวัติกลุ่มสำหรับช่องนั้น
ช่องที่รองรับเหตุการณ์ห้องจะเก็บข้อความห้องแบบแวดล้อมล่าสุดไว้เป็นบริบท Telegram เก็บหน้าต่างข้อความแบบเลื่อนต่อเนื่องแยกตามกลุ่มที่เปิดใช้งานตลอดเวลา โดยมีขอบเขตตาม historyLimit รอบคำขอของผู้ใช้จะเลือกรายการหลังจากการตอบกลับล่าสุดของบอตที่บันทึกไว้ ส่วนรอบเหตุการณ์ห้องจะได้รับหน้าต่างข้อความล่าสุดทั้งหมด เพื่อให้โมเดลเห็นโพสต์ล่าสุดของตนเอง คีย์โหมด Telegram includeGroupHistoryContext ที่เลิกใช้แล้วจะถูกนำออกโดย openclaw doctor --fix
การแก้ไขปัญหา
หากห้องแสดงสถานะกำลังพิมพ์หรือการใช้โทเค็น แต่ไม่มีข้อความที่มองเห็นได้:
- ยืนยันว่าห้องได้รับอนุญาตโดยรายการอนุญาตของช่องและรายการอนุญาตของผู้ส่ง
- ยืนยันว่าได้ตั้งค่า
requireMention: falseในระดับห้องที่ต้องการ - ตรวจสอบว่า
messages.groupChat.unmentionedInboundหรือการกำหนดค่าทับของเอเจนต์เป็น"room_event"หรือไม่ - ตรวจสอบบันทึกสำหรับข้อมูลเมตาของเพย์โหลดสุดท้ายที่ถูกระงับ หรือ
didSendViaMessagingTool: false - สำหรับคำขอปกติในกลุ่ม ให้คงไว้หรือคืนค่า
messages.groupChat.visibleReplies: "automatic"หากต้องการให้โพสต์คำตอบสุดท้ายโดยอัตโนมัติ สำหรับห้องแบบแวดล้อมที่ใช้message_toolให้ใช้โมเดลหรือรันไทม์ที่เรียกใช้เครื่องมือได้อย่างเชื่อถือได้
หากห้องแบบแวดล้อมของ Telegram ไม่ทริกเกอร์เลย ให้ตรวจสอบโหมดความเป็นส่วนตัวของ BotFather และยืนยันว่า Gateway ได้รับข้อความกลุ่มตามปกติ
หากห้องแบบแวดล้อมของ Slack ไม่ทริกเกอร์ ให้ตรวจสอบว่าคีย์ช่องเป็น ID ช่อง Slack และแอปมีขอบเขตสิทธิ์ประวัติสำหรับประเภทห้องนั้น ได้แก่ channels:history (สาธารณะ), groups:history (ส่วนตัว) หรือ mpim:history (DM แบบหลายคน)