الانتقال إلى المحتوى الرئيسي

رسائل المجموعات (قناة WhatsApp web)

الهدف: السماح لـ Clawd بالتواجد في مجموعات WhatsApp، والاستيقاظ فقط عند مناداته، مع إبقاء ذلك الخيط منفصلًا عن جلسة الرسائل الخاصة (DM) الشخصية. ملاحظة: أصبح agents.list[].groupChat.mentionPatterns مستخدمًا الآن أيضًا في Telegram/Discord/Slack/iMessage؛ يركّز هذا المستند على السلوك الخاص بـ WhatsApp. لإعدادات متعددة الوكلاء، اضبط agents.list[].groupChat.mentionPatterns لكل وكيل (أو استخدم messages.groupChat.mentionPatterns كبديل عام).

ما تم تنفيذه (2025-12-03)

  • أوضاع التفعيل: mention (الافتراضي) أو always. يتطلّب mention تنبيهًا (إشارات WhatsApp الحقيقية عبر mentionedJids، أو أنماط regex، أو رقم E.164 الخاص بالبوت في أي موضع من النص). يقوم always بإيقاظ الوكيل عند كل رسالة، لكنه ينبغي أن يرد فقط عندما يمكنه إضافة قيمة ذات معنى؛ وإلا فيُرجِع الرمز الصامت NO_REPLY. يمكن تعيين القيم الافتراضية في التهيئة (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 أو /think high (عند إرسالها كرسائل مستقلة) محصورة بتلك المجموعة؛ ولا تتأثر حالة الرسائل الخاصة الشخصية. يتم تخطي نبضات القلب لخيوط المجموعات.
  • حقن السياق: يتم إلحاق رسائل المجموعة المعلّقة فقط (الافتراضي 50) التي لم تُشغِّل تنفيذًا تحت [Chat messages since your last reply - for context]، مع السطر المُحفِّز تحت [Current message - respond to this]. لا تتم إعادة حقن الرسائل الموجودة بالفعل في الجلسة.
  • إظهار المُرسِل: تنتهي كل دفعة رسائل مجموعة الآن بـ [from: Sender Name (+E164)] كي يعرف Pi من المتحدث.
  • الرسائل المؤقتة/عرض لمرة واحدة: نقوم بفكّها قبل استخراج النص/الإشارات، لذا فإن التنبيهات داخلها ما زالت تُحفِّز.
  • موجه النظام للمجموعة: في أول دور من جلسة المجموعة (وعندما يُغيِّر /activation الوضع) نُدرِج فقرة قصيرة في موجه النظام مثل 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 يرسل الإشارات القياسية عبر mentionedJids عندما ينقر شخص على جهة الاتصال، لذا نادرًا ما تكون الحاجة إلى بديل الرقم، لكنها شبكة أمان مفيدة.

أمر التفعيل (خاص بالمالك فقط)

استخدم أمر الدردشة الجماعية:
  • /activation mention
  • /activation always
يمكن فقط لرقم المالك (من channels.whatsapp.allowFrom، أو رقم E.164 الخاص بالبوت عند عدم تعيينه) تغيير ذلك. أرسل /status كرسالة مستقلة في المجموعة لعرض وضع التفعيل الحالي.

كيفية الاستخدام

  1. أضِف حساب WhatsApp الخاص بك (الذي يشغّل OpenClaw) إلى المجموعة.
  2. قُل @openclaw … (أو أدرِج الرقم). يمكن فقط للمرسلين ضمن قائمة السماح تشغيله ما لم تُعيِّن groupPolicy: "open".
  3. سيتضمن موجه الوكيل سياق المجموعة الأخير بالإضافة إلى وسم [from: …] الختامي ليتمكن من مخاطبة الشخص الصحيح.
  4. تنطبق توجيهات مستوى الجلسة (/verbose on، /think high، /new أو /reset، /compact) فقط على جلسة تلك المجموعة؛ أرسلها كرسائل مستقلة كي تُسجَّل. تبقى جلسة الرسائل الخاصة الشخصية مستقلة.

الاختبار / التحقق

  • دخان يدوي:
    • أرسل تنبيه @openclaw في المجموعة وتحقق من وجود رد يشير إلى اسم المُرسِل.
    • أرسل تنبيهًا ثانيًا وتحقق من تضمين كتلة السجل ثم مسحها في الدور التالي.
  • تحقّق من سجلات Gateway (شغّل مع --verbose) لرؤية إدخالات inbound web message التي تُظهِر from: <groupJid> واللاحقة [from: …].

اعتبارات معروفة

  • يتم تخطي نبضات القلب للمجموعات عمدًا لتجنّب البث المزعج.
  • يستخدم كبح الصدى السلسلة المجمّعة الموحّدة؛ إذا أرسلت نصًا متطابقًا مرتين دون إشارات، فسيحصل الأول فقط على رد.
  • ستظهر إدخالات مخزن الجلسات على أنها agent:<agentId>:whatsapp:group:<jid> في مخزن الجلسات (~/.openclaw/agents/<agentId>/sessions/sessions.json افتراضيًا)؛ وعدم وجود إدخال يعني فقط أن المجموعة لم تُشغِّل تنفيذًا بعد.
  • تتبع مؤشرات الكتابة في المجموعات agents.defaults.typingMode (الافتراضي: message عند عدم الإشارة).