Configuration

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

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

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

พฤติกรรม

  • โหมดการเปิดใช้งาน: mention (ค่าเริ่มต้น) หรือ always mention ต้องมีการเรียก (การ @-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 เป็นข้อความเดี่ยวแยกต่างหากในกลุ่มเพื่อดูโหมดการเปิดใช้งานปัจจุบัน

วิธีใช้งาน

  1. เพิ่มบัญชี WhatsApp ของคุณ (บัญชีที่รัน OpenClaw) เข้ากลุ่ม
  2. พิมพ์ @openclaw … (หรือใส่หมายเลข) เฉพาะผู้ส่งที่อยู่ในรายการอนุญาตเท่านั้นที่กระตุ้นได้ เว้นแต่คุณตั้งค่า groupPolicy: "open"
  3. prompt ของเอเจนต์จะรวมบริบทกลุ่มล่าสุดพร้อม marker ต่อท้าย [from: …] เพื่อให้ตอบถึงคนที่ถูกต้องได้
  4. คำสั่งระดับเซสชัน (/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 อย่างชัดเจนยังคงมีสิทธิ์เหนือกว่า

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