ข้อความกลุ่ม (ช่องทาง WhatsApp web)¶
เป้าหมาย: ให้ Clawd อยู่ในกลุ่ม WhatsApp ตื่นขึ้นเฉพาะเมื่อถูกเรียก และแยกเธรดนั้นออกจากเซสชัน DM ส่วนตัว
หมายเหตุ: ปัจจุบัน agents.list[].groupChat.mentionPatterns ถูกใช้กับ Telegram/Discord/Slack/iMessage ด้วย เอกสารนี้จึงเน้นพฤติกรรมเฉพาะของ WhatsApp สำหรับการตั้งค่าแบบหลายเอเจนต์ ให้ตั้งค่า agents.list[].groupChat.mentionPatterns ต่อเอเจนต์ (หรือใช้ messages.groupChat.mentionPatterns เป็นค่า fallback แบบส่วนกลาง) 35. สำหรับการตั้งค่าแบบหลายเอเจนต์ ให้ตั้งค่า agents.list[].groupChat.mentionPatterns ต่อเอเจนต์ (หรือใช้ messages.groupChat.mentionPatterns เป็นค่า fallback ระดับโกลบอล)
สิ่งที่รองรับแล้ว (2025-12-03)¶
- โหมดการกระตุ้น:
mention(ค่าเริ่มต้น) หรือalways. 36.mentionต้องมีการ ping (การ @-mention ของ WhatsApp จริงผ่านmentionedJids, รูปแบบ regex หรือหมายเลข E.164 ของบ็อตที่อยู่ที่ใดก็ได้ในข้อความ)mentionต้องมีการเรียก (การ @-mention ของ WhatsApp จริงผ่านmentionedJids, แพทเทิร์น regex หรือหมายเลข E.164 ของบอตที่ปรากฏที่ใดก็ได้ในข้อความ) ส่วนalwaysจะปลุกเอเจนต์ทุกข้อความ แต่ควรตอบเฉพาะเมื่อเพิ่มคุณค่าได้ มิฉะนั้นจะส่งโทเคนเงียบNO_REPLY. สามารถตั้งค่าเริ่มต้นได้ในคอนฟิก (channels.whatsapp.groups) และเขียนทับเป็นรายกลุ่มผ่าน/activation. เมื่อกำหนดchannels.whatsapp.groupsจะทำหน้าที่เป็น allowlist ของกลุ่มด้วย (ใส่"*"เพื่ออนุญาตทั้งหมด) - นโยบายกลุ่ม:
channels.whatsapp.groupPolicyควบคุมว่าจะยอมรับข้อความกลุ่มหรือไม่ (open|disabled|allowlist).allowlistใช้channels.whatsapp.groupAllowFrom(fallback: ระบุchannels.whatsapp.allowFromแบบชัดเจน) ค่าเริ่มต้นคือallowlist(บล็อกจนกว่าจะเพิ่มผู้ส่ง) 37. ค่าเริ่มต้นคือallowlist(ถูกบล็อกจนกว่าคุณจะเพิ่มผู้ส่ง) - เซสชันแยกตามกลุ่ม: คีย์เซสชันมีรูปแบบเช่น
agent:<agentId>:whatsapp:group:<jid>ดังนั้นคำสั่งอย่าง/verbose onหรือ/think high(ส่งเป็นข้อความเดี่ยว) จะถูกจำกัดขอบเขตอยู่ในกลุ่มนั้น สถานะ DM ส่วนตัวจะไม่ถูกรบกวน ข้ามการส่งฮาร์ตบีตสำหรับเธรดกลุ่ม 38. ข้าม heartbeat สำหรับเธรดกลุ่ม - การฉีดบริบท: ข้อความกลุ่มแบบ pending-only (ค่าเริ่มต้น 50 ข้อความ) ที่ ไม่ได้ กระตุ้นการรัน จะถูกใส่นำหน้าภายใต้
[Chat messages since your last reply - for context]โดยมีบรรทัดที่กระตุ้นอยู่ใต้[Current message - respond to this]. ข้อความที่อยู่ในเซสชันแล้วจะไม่ถูกฉีดซ้ำ - การแสดงผู้ส่ง: ทุกแบตช์ของกลุ่มจะลงท้ายด้วย
[from: Sender Name (+E164)]เพื่อให้ Pi ทราบว่าใครกำลังพูด -
- แบบชั่วคราว/ดูครั้งเดียว (Ephemeral/view-once): เราจะแกะห่อสิ่งเหล่านี้ก่อนดึงข้อความ/การกล่าวถึง ดังนั้น ping ภายในยังคงทำงาน
- system prompt ของกลุ่ม: ในเทิร์นแรกของเซสชันกลุ่ม (และเมื่อใดก็ตามที่
/activationเปลี่ยนโหมด) เราจะฉีดข้อความสั้น ๆ ลงใน system prompt เช่นYou are replying inside the WhatsApp group "<subject>". Group members: Alice (+44...), Bob (+43...), … Activation: trigger-only … Address the specific sender noted in the message context.หากไม่มีเมตาดาต้า เรายังคงบอกเอเจนต์ว่านี่คือแชตกลุ่ม
ตัวอย่างคอนฟิก (WhatsApp)¶
เพิ่มบล็อก groupChat ลงใน ~/.openclaw/openclaw.json เพื่อให้การเรียกด้วยชื่อที่แสดงทำงานได้ แม้ WhatsApp จะตัดสัญลักษณ์ @ ที่มองเห็นออกจากเนื้อความ:
{
channels: {
whatsapp: {
groups: {
"*": { requireMention: true },
},
},
},
agents: {
list: [
{
id: "main",
groupChat: {
historyLimit: 50,
mentionPatterns: ["@?openclaw", "\\+?15555550123"],
},
},
],
},
}
หมายเหตุ:
- regex ไม่สนตัวพิมพ์ใหญ่เล็ก ครอบคลุมการเรียกด้วยชื่อที่แสดงเช่น
@openclawและหมายเลขดิบที่มีหรือไม่มี+/ช่องว่าง - WhatsApp ยังส่ง canonical mentions ผ่าน
mentionedJidsเมื่อมีการแตะรายชื่อผู้ติดต่อ ดังนั้น fallback ด้วยหมายเลขจึงแทบไม่จำเป็น แต่เป็นตาข่ายนิรภัยที่มีประโยชน์
คำสั่งการกระตุ้น (เฉพาะเจ้าของ)¶
ใช้คำสั่งในแชตกลุ่ม:
/activation mention/activation always
มีเพียงหมายเลขเจ้าของ (จาก channels.whatsapp.allowFrom หรือหมายเลข E.164 ของบอตเองเมื่อยังไม่ตั้งค่า) เท่านั้นที่เปลี่ยนค่าได้ ส่ง /status เป็นข้อความเดี่ยวในกลุ่มเพื่อดูโหมดการกระตุ้นปัจจุบัน 40. ส่ง /status เป็นข้อความเดี่ยวในกลุ่มเพื่อดูโหมดการทำงานปัจจุบัน
วิธีใช้งาน¶
- เพิ่มบัญชี WhatsApp ของคุณ (บัญชีที่รัน OpenClaw) เข้าไปในกลุ่ม
-
- พิมพ์
@openclaw …(หรือใส่หมายเลข) พูด@openclaw …(หรือใส่หมายเลข) เฉพาะผู้ส่งที่อยู่ใน allowlist เท่านั้นที่จะกระตุ้นได้ เว้นแต่คุณตั้งค่าgroupPolicy: "open"
- พิมพ์
- prompt ของเอเจนต์จะมีบริบทกลุ่มล่าสุด พร้อมตัวบ่งชี้ท้าย
[from: …]เพื่อให้ตอบถูกคน - คำสั่งระดับเซสชัน (
/verbose on,/think high,/newหรือ/reset,/compact) จะมีผลเฉพาะเซสชันของกลุ่มนั้น ส่งเป็นข้อความเดี่ยวเพื่อให้ถูกบันทึก เซสชัน DM ส่วนตัวยังคงแยกอิสระ 42. เซสชัน DM ส่วนตัวของคุณยังคงเป็นอิสระ
การทดสอบ / การยืนยัน¶
- การทดสอบแบบ manual smoke:
- ส่งการเรียก
@openclawในกลุ่มและยืนยันว่ามีการตอบกลับที่อ้างอิงชื่อผู้ส่ง - ส่งการเรียกครั้งที่สองและตรวจสอบว่าบล็อกประวัติถูกใส่มา แล้วถูกล้างในเทิร์นถัดไป
- ตรวจสอบล็อกของ Gateway (รันด้วย
--verbose) เพื่อดูรายการinbound web messageที่แสดงfrom: <groupJid>และซัฟฟิกซ์[from: …]
ข้อควรทราบที่ทราบแล้ว¶
- มีการข้ามฮาร์ตบีตสำหรับกลุ่มโดยตั้งใจเพื่อหลีกเลี่ยงการกระจายข้อความรบกวน
- การกดทับ echo ใช้สตริงแบตช์รวม หากส่งข้อความเหมือนกันสองครั้งโดยไม่มีการกล่าวถึง จะมีเพียงครั้งแรกที่ได้การตอบกลับ
- รายการในที่เก็บเซสชันจะปรากฏเป็น
agent:<agentId>:whatsapp:group:<jid>ในที่เก็บเซสชัน (ค่าเริ่มต้นคือ~/.openclaw/agents/<agentId>/sessions/sessions.json) หากไม่พบรายการ แปลว่ากลุ่มนั้นยังไม่เคยกระตุ้นการรัน - ตัวบ่งชี้การพิมพ์ในกลุ่มเป็นไปตาม
agents.defaults.typingMode(ค่าเริ่มต้น:messageเมื่อไม่มีการกล่าวถึง)