Configuration

ข้อความกลุ่ม WhatsApp

สำหรับโมเดลกลุ่มข้ามช่องทาง (Discord, iMessage, Matrix, Microsoft Teams, QQBot, Signal, Slack, Telegram, WhatsApp, Zalo) โปรดดู กลุ่ม หน้านี้ครอบคลุมพฤติกรรมเฉพาะของ WhatsApp ที่ทำงานเพิ่มเติมจากโมเดลดังกล่าว ได้แก่ การเปิดใช้งาน รายการอนุญาตของกลุ่ม คีย์เซสชันแยกตามกลุ่ม และการแทรกบริบทของข้อความที่รอดำเนินการ

เป้าหมาย: ให้ OpenClaw อยู่ในกลุ่ม WhatsApp ตื่นขึ้นเฉพาะเมื่อถูกเรียก และแยกเธรดนั้นออกจากเซสชัน DM ส่วนตัว

พฤติกรรม

  • โหมดการเปิดใช้งาน: mention (ค่าเริ่มต้น) หรือ always โดย mention ต้องมีการเรียก ได้แก่ การ @-กล่าวถึงจริงของ WhatsApp (mentionedJids) รูปแบบนิพจน์ทั่วไปที่กำหนดค่าไว้ เลข E.164 ของบอตที่ปรากฏตรงส่วนใดก็ได้ในข้อความ หรือการตอบกลับโดยอ้างข้อความใดข้อความหนึ่งของบอต (ยกเว้นการตั้งค่าแชตกับตนเองที่ใช้หมายเลขร่วมกัน) ส่วน always จะปลุกเอเจนต์ทุกครั้งที่มีข้อความ แต่พรอมต์กลุ่มที่แทรกเข้ามาจะสั่งให้ตอบเฉพาะเมื่อคำตอบมีประโยชน์ และในกรณีอื่นให้ส่งคืนโทเค็นเงียบ NO_REPLY ตรงตามนี้ (ไม่คำนึงถึงตัวพิมพ์เล็ก-ใหญ่) ค่าเริ่มต้นมาจากการกำหนดค่า (channels.whatsapp.groups requireMention) และสามารถแทนที่แยกตามกลุ่มผ่าน /activation
  • รายการอนุญาตของกลุ่ม: เมื่อกำหนด channels.whatsapp.groups ระบบจะยอมรับเฉพาะ JID ของกลุ่มที่ระบุไว้เท่านั้น (ใส่ "*" เพื่ออนุญาตทั้งหมด) ข้อความจากกลุ่มที่ไม่อยู่ในรายการจะถูกทิ้งพร้อมคำแนะนำในบันทึก
  • นโยบายกลุ่ม: channels.whatsapp.groupPolicy ควบคุมว่าจะยอมรับข้อความกลุ่มหรือไม่ (open|disabled|allowlist) โดย allowlist ใช้ channels.whatsapp.groupAllowFrom (ค่าสำรอง: channels.whatsapp.allowFrom ที่ระบุอย่างชัดเจน) ค่าเริ่มต้นคือ allowlist (ถูกบล็อกจนกว่าจะเพิ่มผู้ส่ง)
  • เซสชันแยกตามกลุ่ม: คีย์เซสชันมีรูปแบบคล้าย agent:<agentId>:whatsapp:group:<jid> (บัญชีที่ไม่ใช่ค่าเริ่มต้นจะต่อท้ายด้วย :thread:whatsapp-account-<accountId>) ดังนั้นคำสั่งกำกับ เช่น /verbose on, /trace on หรือ /think high (ส่งเป็นข้อความแยกเดี่ยว) จะมีขอบเขตเฉพาะกลุ่มนั้น โดยไม่กระทบสถานะ DM ส่วนตัว
  • การแทรกบริบท: ข้อความกลุ่มที่ รอดำเนินการเท่านั้น (ค่าเริ่มต้น 50 ข้อความ) ซึ่ง ไม่ได้ ทริกเกอร์การทำงาน จะถูกเติมไว้ข้างหน้าภายใต้ [Chat messages since your last reply - for context] และบรรทัดที่ทริกเกอร์จะอยู่ภายใต้ [Current message - respond to this] หน้าต่างข้อความรอดำเนินการจะถูกล้างหลังการทำงาน และข้อความที่อยู่ในเซสชันแล้วจะไม่ถูกแทรกซ้ำ
  • การระบุผู้ส่ง: แต่ละบรรทัดในกลุ่มจะมีป้ายกำกับผู้ส่งอยู่ภายในซองข้อความ เช่น [WhatsApp <groupJid> <timestamp>] Alice (+447700900123): text และข้อมูลประจำตัวผู้ส่ง รวมถึงหัวข้อ/สมาชิกของกลุ่ม จะถูกส่งไปพร้อมกันในบล็อกข้อมูลเมตาการสนทนาที่ไม่เชื่อถือ
  • ข้อความชั่วคราว/ดูได้ครั้งเดียว: ระบบจะแกะตัวห่อหุ้มก่อนแยกข้อความ/การกล่าวถึง ดังนั้นการเรียกที่อยู่ภายในยังคงทริกเกอร์ได้
  • พรอมต์ระบบของกลุ่ม: เทิร์นแรกของเซสชันกลุ่ม (และทุกเทิร์นหลังจาก /activation เปลี่ยนโหมด) จะแทรกคำแนะนำการเปิดใช้งานไว้ในพรอมต์ระบบ (Activation: trigger-only ... หรือ Activation: always-on ... รวมถึง "กล่าวตอบผู้ส่งรายนั้นโดยเฉพาะ") ระบบจะใส่คำแนะนำถาวรเกี่ยวกับการส่งข้อความในแชตกลุ่ม ("คุณอยู่ในแชตกลุ่ม WhatsApp...") เสมอ

ตัวอย่างการกำหนดค่า (WhatsApp)

ทำให้การเรียกด้วยชื่อที่แสดงทำงานได้ แม้ WhatsApp จะตัด @ ที่มองเห็นออกจากเนื้อหาข้อความ:

json5
{  channels: {    whatsapp: {      groups: {        "*": { requireMention: true },      },      historyLimit: 50, // หน้าต่างบริบทกลุ่มที่รอดำเนินการ (ค่าเริ่มต้น 50)    },  },  agents: {    list: [      {        id: "main",        groupChat: {          mentionPatterns: ["@?openclaw", "\\+?15555550123"],        },      },    ],  },}

หมายเหตุ:

  • นิพจน์ทั่วไปไม่คำนึงถึงตัวพิมพ์เล็ก-ใหญ่ และใช้ข้อจำกัดด้านความปลอดภัยของนิพจน์ทั่วไปแบบเดียวกับพื้นผิวการกำหนดค่าอื่น ระบบจะละเว้นรูปแบบที่ไม่ถูกต้องและการทำซ้ำซ้อนแบบไม่ปลอดภัย
  • WhatsApp ยังคงส่งการกล่าวถึงตามรูปแบบมาตรฐานผ่าน mentionedJids เมื่อมีผู้แตะรายชื่อติดต่อ ดังนั้นจึงแทบไม่จำเป็นต้องใช้หมายเลขเป็นค่าสำรอง แต่ก็เป็นแนวป้องกันที่มีประโยชน์
  • ระบบกำหนดหน้าต่างบริบทที่รอดำเนินการตามลำดับ channels.whatsapp.accounts.<id>.historyLimitchannels.whatsapp.historyLimitmessages.groupChat.historyLimit → 50

คำสั่งเปิดใช้งาน (เจ้าของเท่านั้น)

ใช้คำสั่งแชตกลุ่ม:

  • /activation mention
  • /activation always

เฉพาะหมายเลขของเจ้าของ (จาก channels.whatsapp.allowFrom หรือหมายเลข E.164 ของบอตเองเมื่อไม่ได้กำหนดค่า) เท่านั้นที่เปลี่ยนค่านี้ได้ ระบบจะละเว้น /activation จากบุคคลอื่นและจัดเก็บเป็นบริบทเท่านั้น ส่ง /status เป็นข้อความแยกเดี่ยวในกลุ่มเพื่อดูโหมดการเปิดใช้งานปัจจุบัน

วิธีใช้

  1. เพิ่มบัญชี WhatsApp ของคุณ (บัญชีที่ใช้เรียกใช้ OpenClaw) เข้ากลุ่ม
  2. ส่ง @openclaw ... (หรือใส่หมายเลขด้วย) เฉพาะผู้ส่งที่อยู่ในรายการอนุญาตเท่านั้นที่สามารถทริกเกอร์ได้ เว้นแต่จะกำหนด groupPolicy: "open"
  3. พรอมต์ของเอเจนต์จะมีบริบทกลุ่มที่รอดำเนินการ พร้อมบรรทัดที่ติดป้ายกำกับผู้ส่ง เพื่อให้ตอบบุคคลที่ถูกต้องได้
  4. คำสั่งกำกับเซสชัน (/verbose on, /trace on, /think high, /new หรือ /reset, /compact) จะใช้กับเซสชันของกลุ่มนั้นเท่านั้น โปรดส่งเป็นข้อความแยกเดี่ยวเพื่อให้ระบบบันทึกคำสั่ง เซสชัน DM ส่วนตัวจะยังคงเป็นอิสระจากกัน

การทดสอบ / การตรวจสอบ

  • การทดสอบเบื้องต้นด้วยตนเอง:
    • ส่งการเรียก @openclaw ในกลุ่ม และยืนยันว่าได้รับคำตอบที่อ้างถึงชื่อผู้ส่ง
    • ส่งการเรียกครั้งที่สองและตรวจสอบว่ามีบล็อกประวัติรวมอยู่ จากนั้นยืนยันว่าบล็อกถูกล้างในเทิร์นถัดไป
  • ตรวจสอบบันทึกของ Gateway (เรียกใช้ด้วย --verbose) เพื่อหารายการ inbound web message ที่แสดง from: <groupJid> และเนื้อหาที่ติดป้ายกำกับผู้ส่ง

ข้อควรพิจารณาที่ทราบ

  • Heartbeat ทำงานในเซสชันหลักของเอเจนต์ เซสชันกลุ่มจะไม่ได้รับการทำงานของ Heartbeat
  • การระงับข้อความสะท้อนจะจดจำพรอมต์ที่รวมกัน (ประวัติ + ข้อความปัจจุบัน) แยกตามเซสชัน เพื่อไม่ให้ข้อความที่บอตส่งเองทริกเกอร์การทำงานซ้ำ ระบบอาจข้ามชุดข้อความที่เหมือนกันทุกประการซึ่งเกิดซ้ำ โดยถือว่าเป็นข้อความสะท้อน
  • รายการในที่จัดเก็บเซสชันจะแสดงเป็น agent:<agentId>:whatsapp:group:<jid> ในที่จัดเก็บเซสชัน SQLite แยกตามเอเจนต์ การไม่มีรายการเพียงหมายความว่ากลุ่มนั้นยังไม่เคยทริกเกอร์การทำงาน
  • ตัวบ่งชี้การพิมพ์ทำงานตาม session.typingMode / agents.defaults.typingMode เมื่อกำหนดให้การตอบกลับที่มองเห็นได้ใช้โหมดเครื่องมือข้อความเท่านั้น โดยค่าเริ่มต้นการพิมพ์จะเริ่มทันที เพื่อให้สมาชิกกลุ่มเห็นว่าเอเจนต์กำลังทำงาน แม้ว่าจะไม่มีการโพสต์คำตอบสุดท้ายอัตโนมัติก็ตาม การกำหนดค่าโหมดการพิมพ์อย่างชัดเจนยังคงมีลำดับความสำคัญเหนือกว่า

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

Was this useful?
On this page

On this page