Configuration

เหตุการณ์แวดล้อมภายในห้อง

เหตุการณ์ห้องแบบแวดล้อมช่วยให้ OpenClaw ประมวลผลบทสนทนาในกลุ่มหรือช่องที่ไม่ได้กล่าวถึงเอเจนต์เป็นบริบทเงียบได้ เอเจนต์สามารถอัปเดตหน่วยความจำและสถานะเซสชัน แต่ห้องจะยังคงเงียบ เว้นแต่เอเจนต์จะเรียกใช้เครื่องมือ message อย่างชัดเจน

สำหรับแชตกลุ่มที่เปิดใช้งานตลอดเวลา ให้ใช้ messages.groupChat.unmentionedInbound: "room_event" ร่วมกับ messages.groupChat.visibleReplies: "message_tool" เอเจนต์จะรับฟัง ตัดสินใจว่าเมื่อใดควรตอบ และไม่จำเป็นต้องใช้รูปแบบพรอมต์แบบเดิมที่ตอบ NO_REPLY

ช่องทางที่รองรับในปัจจุบัน ได้แก่ ช่องกิลด์ Discord, ช่องสาธารณะและช่องส่วนตัวของ Slack, DM แบบหลายคนของ Slack และกลุ่มหรือซูเปอร์กรุ๊ป Telegram ช่องกลุ่มอื่น ๆ จะยังคงใช้พฤติกรรมกลุ่มเดิม เว้นแต่หน้าเอกสารของช่องนั้นจะระบุว่ารองรับเหตุการณ์ห้องแบบแวดล้อม

การตั้งค่าที่แนะนำ

ตั้งค่าพฤติกรรมแชตกลุ่มส่วนกลาง:

json5
{  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

json5
{  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 จะปิดใช้งานรายการ):

json5
{  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 จะปิดใช้งานรายการ):

json5
{  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 รูปแบบอื่นที่ส่งทราฟฟิกทั้งหมดของกลุ่มไปยังบอต

json5
{  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

นโยบายเฉพาะเอเจนต์

ใช้การกำหนดค่าทับสำหรับเอเจนต์เมื่อมีเอเจนต์หลายตัวใช้ห้องเดียวกันร่วมกัน แต่ต้องการให้มีเพียงตัวเดียวที่ถือว่าบทสนทนาที่ไม่ได้กล่าวถึงเป็นบริบทแบบแวดล้อม:

json5
{  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

การแก้ไขปัญหา

หากห้องแสดงสถานะกำลังพิมพ์หรือการใช้โทเค็น แต่ไม่มีข้อความที่มองเห็นได้:

  1. ยืนยันว่าห้องได้รับอนุญาตโดยรายการอนุญาตของช่องและรายการอนุญาตของผู้ส่ง
  2. ยืนยันว่าได้ตั้งค่า requireMention: false ในระดับห้องที่ต้องการ
  3. ตรวจสอบว่า messages.groupChat.unmentionedInbound หรือการกำหนดค่าทับของเอเจนต์เป็น "room_event" หรือไม่
  4. ตรวจสอบบันทึกสำหรับข้อมูลเมตาของเพย์โหลดสุดท้ายที่ถูกระงับ หรือ didSendViaMessagingTool: false
  5. สำหรับคำขอปกติในกลุ่ม ให้คงไว้หรือคืนค่า messages.groupChat.visibleReplies: "automatic" หากต้องการให้โพสต์คำตอบสุดท้ายโดยอัตโนมัติ สำหรับห้องแบบแวดล้อมที่ใช้ message_tool ให้ใช้โมเดลหรือรันไทม์ที่เรียกใช้เครื่องมือได้อย่างเชื่อถือได้

หากห้องแบบแวดล้อมของ Telegram ไม่ทริกเกอร์เลย ให้ตรวจสอบโหมดความเป็นส่วนตัวของ BotFather และยืนยันว่า Gateway ได้รับข้อความกลุ่มตามปกติ

หากห้องแบบแวดล้อมของ Slack ไม่ทริกเกอร์ ให้ตรวจสอบว่าคีย์ช่องเป็น ID ช่อง Slack และแอปมีขอบเขตสิทธิ์ประวัติสำหรับประเภทห้องนั้น ได้แก่ channels:history (สาธารณะ), groups:history (ส่วนตัว) หรือ mpim:history (DM แบบหลายคน)

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

Was this useful?
On this page

On this page