Configuration
ข้อความในกลุ่ม WhatsApp
สำหรับโมเดลกลุ่มข้ามช่องทาง (Discord, iMessage, Matrix, Microsoft Teams, Signal, Slack, Telegram, WhatsApp, Zalo) ดู กลุ่ม หน้านี้ครอบคลุมพฤติกรรมเฉพาะของ WhatsApp ที่เสริมบนโมเดลดังกล่าว: การเปิดใช้งาน รายการอนุญาตของกลุ่ม คีย์เซสชันรายกลุ่ม และการแทรกบริบทของข้อความที่รอดำเนินการ
เป้าหมาย: ให้ OpenClaw อยู่ในกลุ่ม WhatsApp ตื่นขึ้นเฉพาะเมื่อถูกเรียก และแยกเธรดนั้นออกจากเซสชัน DM ส่วนตัว
พฤติกรรม
- โหมดการเปิดใช้งาน:
mention(ค่าเริ่มต้น) หรือalwaysmentionต้องมีการเรียก (การ @-mention จริงของ WhatsApp ผ่านmentionedJids, รูปแบบ regex ที่ปลอดภัย หรือ E.164 ของบอตที่ปรากฏที่ใดก็ได้ในข้อความ)alwaysจะปลุกเอเจนต์ในทุกข้อความ แต่ควรตอบเฉพาะเมื่อสามารถเพิ่มคุณค่าได้อย่างมีความหมาย มิฉะนั้นจะคืนโทเค็นเงียบที่ตรงตัวคือNO_REPLY/no_replyสามารถตั้งค่าเริ่มต้นได้ใน config (channels.whatsapp.groups) และเขียนทับต่อกลุ่มได้ผ่าน/activationเมื่อตั้งค่าchannels.whatsapp.groupsแล้ว ค่านี้ยังทำหน้าที่เป็นรายการอนุญาตของกลุ่มด้วย (ใส่"*"เพื่ออนุญาตทั้งหมด) - นโยบายกลุ่ม:
channels.whatsapp.groupPolicyควบคุมว่าจะรับข้อความกลุ่มหรือไม่ (open|disabled|allowlist)allowlistใช้channels.whatsapp.groupAllowFrom(ค่าทดแทน:channels.whatsapp.allowFromที่ระบุอย่างชัดเจน) ค่าเริ่มต้นคือallowlist(ถูกบล็อกจนกว่าคุณจะเพิ่มผู้ส่ง) - เซสชันรายกลุ่ม: คีย์เซสชันมีรูปแบบเช่น
agent:<agentId>:whatsapp:group:<jid>ดังนั้นคำสั่งอย่าง/verbose on,/trace onหรือ/think high(ส่งเป็นข้อความเดี่ยวแยกต่างหาก) จะถูกจำกัดขอบเขตไว้ที่กลุ่มนั้น สถานะ DM ส่วนตัวจะไม่ถูกแตะต้อง Heartbeat จะถูกข้ามสำหรับเธรดกลุ่ม - การแทรกบริบท: ข้อความกลุ่ม เฉพาะที่รอดำเนินการ (ค่าเริ่มต้น 50) ที่ ไม่ได้ กระตุ้นการรัน จะถูกเติมคำนำหน้าภายใต้
[Chat messages since your last reply - for context]พร้อมบรรทัดที่กระตุ้นภายใต้[Current message - respond to this]ข้อความที่อยู่ในเซสชันแล้วจะไม่ถูกแทรกซ้ำ - การแสดงผู้ส่ง: ตอนนี้ทุกชุดข้อความกลุ่มจะลงท้ายด้วย
[from: Sender Name (+E164)]เพื่อให้ Pi รู้ว่าใครกำลังพูด - ข้อความชั่วคราว/ดูได้ครั้งเดียว: เราแกะข้อความเหล่านี้ก่อนดึงข้อความ/mentions ดังนั้นการเรียกที่อยู่ข้างในยังคงกระตุ้นได้
- 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.หากไม่มี metadata เราจะยังบอกเอเจนต์ว่าเป็นแชตกลุ่ม
ตัวอย่าง config (WhatsApp)
เพิ่มบล็อก groupChat ลงใน ~/.openclaw/openclaw.json เพื่อให้การเรียกด้วยชื่อที่แสดงทำงานได้ แม้ WhatsApp จะตัด @ ที่มองเห็นในเนื้อหาข้อความออก:
{
channels: {
whatsapp: {
groups: {
"*": { requireMention: true },
},
},
},
agents: {
list: [
{
id: "main",
groupChat: {
historyLimit: 50,
mentionPatterns: ["@?openclaw", "\\+?15555550123"],
},
},
],
},
}
หมายเหตุ:
- regex ไม่คำนึงถึงตัวพิมพ์ใหญ่เล็ก และใช้ข้อจำกัด safe-regex แบบเดียวกับพื้นผิว regex ของ config อื่น ๆ รูปแบบที่ไม่ถูกต้องและการทำซ้ำแบบซ้อนที่ไม่ปลอดภัยจะถูกละเว้น
- WhatsApp ยังคงส่ง mentions แบบมาตรฐานผ่าน
mentionedJidsเมื่อมีคนแตะรายชื่อติดต่อ ดังนั้นค่าทดแทนที่เป็นหมายเลขจึงแทบไม่จำเป็น แต่เป็นตาข่ายนิรภัยที่มีประโยชน์
คำสั่งเปิดใช้งาน (เฉพาะเจ้าของ)
ใช้คำสั่งแชตกลุ่ม:
/activation mention/activation always
เฉพาะหมายเลขของเจ้าของ (จาก channels.whatsapp.allowFrom หรือ E.164 ของบอตเองเมื่อไม่ได้ตั้งค่า) เท่านั้นที่เปลี่ยนค่านี้ได้ ส่ง /status เป็นข้อความเดี่ยวแยกต่างหากในกลุ่มเพื่อดูโหมดการเปิดใช้งานปัจจุบัน
วิธีใช้งาน
- เพิ่มบัญชี WhatsApp ของคุณ (บัญชีที่รัน OpenClaw) เข้ากลุ่ม
- พิมพ์
@openclaw …(หรือใส่หมายเลข) เฉพาะผู้ส่งที่อยู่ในรายการอนุญาตเท่านั้นที่กระตุ้นได้ เว้นแต่คุณตั้งค่าgroupPolicy: "open" - prompt ของเอเจนต์จะรวมบริบทกลุ่มล่าสุดพร้อม marker ต่อท้าย
[from: …]เพื่อให้ตอบถึงคนที่ถูกต้องได้ - คำสั่งระดับเซสชัน (
/verbose on,/trace on,/think high,/newหรือ/reset,/compact) ใช้กับเซสชันของกลุ่มนั้นเท่านั้น ส่งคำสั่งเหล่านี้เป็นข้อความเดี่ยวแยกต่างหากเพื่อให้ลงทะเบียน เซสชัน DM ส่วนตัวของคุณยังคงเป็นอิสระ
การทดสอบ / การตรวจสอบ
- smoke test แบบแมนนวล:
- ส่งการเรียก
@openclawในกลุ่มและยืนยันว่ามีคำตอบที่อ้างถึงชื่อผู้ส่ง - ส่งการเรียกครั้งที่สองและตรวจสอบว่ามีการรวมบล็อกประวัติ จากนั้นถูกล้างในเทิร์นถัดไป
- ส่งการเรียก
- ตรวจสอบล็อก Gateway (รันด้วย
--verbose) เพื่อดูรายการinbound web messageที่แสดงfrom: <groupJid>และ suffix[from: …]
ข้อควรพิจารณาที่ทราบ
- Heartbeat จะถูกข้ามสำหรับกลุ่มโดยตั้งใจ เพื่อหลีกเลี่ยงการออกอากาศที่รบกวน
- การระงับ echo ใช้สตริงชุดข้อความรวม หากคุณส่งข้อความเหมือนกันสองครั้งโดยไม่มี mentions จะมีเพียงครั้งแรกที่ได้รับคำตอบ
- รายการในที่เก็บเซสชันจะปรากฏเป็น
agent:<agentId>:whatsapp:group:<jid>ในที่เก็บเซสชัน (ค่าเริ่มต้นคือ~/.openclaw/agents/<agentId>/sessions/sessions.json) รายการที่หายไปหมายความเพียงว่ากลุ่มนั้นยังไม่เคยกระตุ้นการรัน - ตัวบ่งชี้การพิมพ์ในกลุ่มจะทำตาม
agents.defaults.typingModeเมื่อคำตอบที่มองเห็นใช้โหมดเริ่มต้นแบบเครื่องมือข้อความเท่านั้น การพิมพ์จะเริ่มทันทีตามค่าเริ่มต้น เพื่อให้สมาชิกกลุ่มเห็นว่าเอเจนต์กำลังทำงาน แม้จะไม่มีการโพสต์คำตอบสุดท้ายโดยอัตโนมัติ การตั้งค่า typing-mode อย่างชัดเจนยังคงมีสิทธิ์เหนือกว่า