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

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

الهدف: السماح لـ Clawd بالوجود في مجموعات WhatsApp، والاستيقاظ فقط عند مناداته، وإبقاء هذا السياق منفصلًا عن جلسة الرسائل المباشرة الشخصية. ملاحظة: يُستخدم 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 / 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 (المرسلة كرسائل مستقلة) ضمن نطاق تلك المجموعة؛ وتبقى حالة الرسائل المباشرة الشخصية دون تغيير. يتم تخطي إشارات heartbeat لخيوط المجموعات.
  • حقن السياق: تُضاف رسائل المجموعات المعلّقة فقط (الافتراضي 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 غير حساسة لحالة الأحرف وتستخدم حواجز الحماية نفسها الخاصة بـ safe-regex المستخدمة في واجهات regex الأخرى في الإعداد؛ ويتم تجاهل الأنماط غير الصالحة والتكرار المتداخل غير الآمن.
  • لا يزال 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: …].

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

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