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.groupsrequireMention) และสามารถแทนที่แยกตามกลุ่มผ่าน/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 จะตัด @ ที่มองเห็นออกจากเนื้อหาข้อความ:
{ channels: { whatsapp: { groups: { "*": { requireMention: true }, }, historyLimit: 50, // หน้าต่างบริบทกลุ่มที่รอดำเนินการ (ค่าเริ่มต้น 50) }, }, agents: { list: [ { id: "main", groupChat: { mentionPatterns: ["@?openclaw", "\\+?15555550123"], }, }, ], },}หมายเหตุ:
- นิพจน์ทั่วไปไม่คำนึงถึงตัวพิมพ์เล็ก-ใหญ่ และใช้ข้อจำกัดด้านความปลอดภัยของนิพจน์ทั่วไปแบบเดียวกับพื้นผิวการกำหนดค่าอื่น ระบบจะละเว้นรูปแบบที่ไม่ถูกต้องและการทำซ้ำซ้อนแบบไม่ปลอดภัย
- WhatsApp ยังคงส่งการกล่าวถึงตามรูปแบบมาตรฐานผ่าน
mentionedJidsเมื่อมีผู้แตะรายชื่อติดต่อ ดังนั้นจึงแทบไม่จำเป็นต้องใช้หมายเลขเป็นค่าสำรอง แต่ก็เป็นแนวป้องกันที่มีประโยชน์ - ระบบกำหนดหน้าต่างบริบทที่รอดำเนินการตามลำดับ
channels.whatsapp.accounts.<id>.historyLimit→channels.whatsapp.historyLimit→messages.groupChat.historyLimit→ 50
คำสั่งเปิดใช้งาน (เจ้าของเท่านั้น)
ใช้คำสั่งแชตกลุ่ม:
/activation mention/activation always
เฉพาะหมายเลขของเจ้าของ (จาก channels.whatsapp.allowFrom หรือหมายเลข E.164 ของบอตเองเมื่อไม่ได้กำหนดค่า) เท่านั้นที่เปลี่ยนค่านี้ได้ ระบบจะละเว้น /activation จากบุคคลอื่นและจัดเก็บเป็นบริบทเท่านั้น ส่ง /status เป็นข้อความแยกเดี่ยวในกลุ่มเพื่อดูโหมดการเปิดใช้งานปัจจุบัน
วิธีใช้
- เพิ่มบัญชี WhatsApp ของคุณ (บัญชีที่ใช้เรียกใช้ OpenClaw) เข้ากลุ่ม
- ส่ง
@openclaw ...(หรือใส่หมายเลขด้วย) เฉพาะผู้ส่งที่อยู่ในรายการอนุญาตเท่านั้นที่สามารถทริกเกอร์ได้ เว้นแต่จะกำหนดgroupPolicy: "open" - พรอมต์ของเอเจนต์จะมีบริบทกลุ่มที่รอดำเนินการ พร้อมบรรทัดที่ติดป้ายกำกับผู้ส่ง เพื่อให้ตอบบุคคลที่ถูกต้องได้
- คำสั่งกำกับเซสชัน (
/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เมื่อกำหนดให้การตอบกลับที่มองเห็นได้ใช้โหมดเครื่องมือข้อความเท่านั้น โดยค่าเริ่มต้นการพิมพ์จะเริ่มทันที เพื่อให้สมาชิกกลุ่มเห็นว่าเอเจนต์กำลังทำงาน แม้ว่าจะไม่มีการโพสต์คำตอบสุดท้ายอัตโนมัติก็ตาม การกำหนดค่าโหมดการพิมพ์อย่างชัดเจนยังคงมีลำดับความสำคัญเหนือกว่า