الإقران
أوامر الشرطة المائلة
استكشاف أخطاء القنوات وإصلاحها
الإعداد السريع
أنشئ تطبيق Discord يتضمن روبوتًا، وأضف الروبوت إلى خادمك، ثم اقرنه بـ OpenClaw. استخدم خادمًا خاصًا إن أمكن؛ أنشئ واحدًا أولًا (Create My Own > For me and my friends) عند الحاجة.إنشاء تطبيق Discord وروبوت
تمكين النوايا ذات الامتيازات
- Message Content Intent (مطلوب)
- Server Members Intent (موصى به؛ ومطلوب لقوائم السماح القائمة على الأدوار، ومطابقة الأسماء بالمعرّفات، ومجموعات الوصول إلى جمهور القناة)
- Presence Intent (اختياري؛ لتحديثات حالة الحضور فقط)
نسخ رمز روبوتك
إنشاء عنوان URL للدعوة وإضافة الروبوت إلى خادمك
botapplications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (اختياري)
تمكين وضع المطور وجمع معرّفاتك
- User Settings (أيقونة الترس) → Developer → فعّل Developer Mode (على الهاتف المحمول: App Settings → Advanced)
- انقر بزر الماوس الأيمن على أيقونة خادمك → Copy Server ID
- انقر بزر الماوس الأيمن على صورتك الرمزية → Copy User ID
السماح بالرسائل الخاصة من أعضاء الخادم
ضبط رمز روبوتك بأمان (لا ترسله في الدردشة)
openclaw gateway run وإعادة تشغيلها.
بالنسبة إلى عمليات التثبيت المُدارة كخدمة، شغّل openclaw gateway install من صدفة تكون فيها قيمة DISCORD_BOT_TOKEN مضبوطة، أو خزّن المتغير في ~/.openclaw/.env حتى تتمكن الخدمة من تحليل مرجع السر في البيئة بعد إعادة التشغيل.
إذا كان مضيفك محظورًا أو خاضعًا لتحديد المعدل عند بحث Discord عن التطبيق أثناء بدء التشغيل، فاضبط معرّف التطبيق/العميل من بوابة المطورين حتى يمكن لبدء التشغيل تجاوز استدعاء REST هذا: استخدم channels.discord.applicationId للحساب الافتراضي، أو channels.discord.accounts.<accountId>.applicationId لكل روبوت.تهيئة OpenClaw وإجراء الإقران
- اطلب من وكيلك
- CLI / التهيئة
“لقد ضبطت بالفعل رمز روبوت Discord في التهيئة. يُرجى إكمال إعداد Discord باستخدام معرّف المستخدم<user_id>ومعرّف الخادم<server_id>.”
الموافقة على إقران الرسالة الخاصة الأولى
- اطلب من وكيلك
- CLI
“وافق على رمز إقران Discord هذا: <CODE>”
DISCORD_BOT_TOKEN إلا للحساب الافتراضي.
إذا تم تحليل حسابين مفعّلين في Discord إلى رمز الروبوت نفسه، فلن يشغّل OpenClaw سوى مراقب Gateway واحد لذلك الرمز: يتغلب الرمز الآتي من التهيئة على القيمة الاحتياطية من البيئة؛ وفي غير ذلك يفوز أول حساب مفعّل، ويُبلّغ عن تعطيل الحساب المكرر مع السبب duplicate bot token.
بالنسبة إلى الاستدعاءات الصادرة المتقدمة (أداة الرسائل/إجراءات القنوات)، يُستخدم token صريح لكل استدعاء في ذلك الاستدعاء. ينطبق هذا على إجراءات الإرسال وإجراءات القراءة/الاستقصاء (القراءة/البحث/الجلب/سلسلة المحادثات/العناصر المثبتة/الأذونات). وتظل إعدادات سياسة الحساب وإعادة المحاولة مأخوذة من الحساب المحدد في لقطة وقت التشغيل النشطة.موصى به: إعداد مساحة عمل على خادم
بعد أن تعمل الرسائل الخاصة، يمكنك تحويل خادمك إلى مساحة عمل كاملة تحصل فيها كل قناة على جلسة وكيل مستقلة بسياقها الخاص. يُوصى بذلك للخوادم الخاصة التي لا تضم سوى أنت وروبوتك.إضافة خادمك إلى قائمة السماح للخوادم
- اطلب من وكيلك
- التهيئة
“أضف معرّف خادم Discord الخاص بي <server_id> إلى قائمة السماح للخوادم”
السماح بالردود من دون @إشارة
messages.groupChat.visibleReplies: "message_tool" كي يتمكن الوكيل من المتابعة بصمت وألا ينشر إلا عندما يقرر أن الرد في القناة مفيد. يعمل هذا بأفضل شكل مع نماذج الجيل الأحدث الموثوقة في استخدام الأدوات، مثل GPT-5.6 Sol. وتظل أحداث الغرفة المحيطة صامتة ما لم تُرسل الأداة رسالة. راجع أحداث الغرفة المحيطة للاطلاع على التهيئة الكاملة لوضع المتابعة الصامتة.إذا أظهر Discord مؤشر الكتابة وأظهرت السجلات استخدام الرموز، لكن لم تُنشر أي رسالة، فتحقق مما إذا كان الدور قد هُيئ كحدث غرفة محيطة أو فُعّلت فيه الردود المرئية عبر أداة الرسائل.- اطلب من وكيلك
- التهيئة
“اسمح لوكيلي بالرد على هذا الخادم من دون الحاجة إلى الإشارة إليه باستخدام @”
التخطيط للذاكرة في قنوات الخادم
MEMORY.md) تلقائيًا إلا في جلسات الرسائل الخاصة؛ ولا تحمّلها قنوات الخادم.- اطلب من وكيلك
- يدوي
“عندما أطرح أسئلة في قنوات Discord، استخدم memory_search أو memory_get إذا احتجت إلى سياق طويل الأمد من MEMORY.md.”
#coding أو #home أو #research أو أي أسماء تناسب سير عملك.
نموذج وقت التشغيل
- يملك Gateway اتصال Discord.
- توجيه الردود حتمي: تعود الردود الواردة من Discord إلى Discord.
- تُضاف البيانات الوصفية لخادم/قناة Discord إلى مطالبة النموذج كسياق غير موثوق، لا كبادئة رد مرئية للمستخدم. إذا نسخ نموذج ذلك الغلاف إلى الرد، يزيل OpenClaw البيانات الوصفية المنسوخة من الردود الصادرة ومن سياق إعادة التشغيل المستقبلي.
- افتراضيًا (
session.dmScope=main)، تشترك المحادثات المباشرة في الجلسة الرئيسية للوكيل (agent:main:main). - لقنوات الخوادم مفاتيح جلسات معزولة (
agent:<agentId>:discord:channel:<channelId>). - تُتجاهل الرسائل الخاصة الجماعية افتراضيًا (
channels.discord.dm.groupEnabled=false). - تعمل أوامر الشرطة المائلة الأصلية في جلسات أوامر معزولة (
agent:<agentId>:discord:slash:<userId>)، مع استمرار حملCommandTargetSessionKeyإلى جلسة المحادثة الموجّهة. - يُختزل تسليم الإعلانات النصية فقط من Cron/Heartbeat إلى Discord إلى الإجابة النهائية المرئية من المساعد، وتُرسل مرة واحدة. أما حمولات الوسائط والمكوّنات المنظمة فتظل متعددة الرسائل عندما يصدر الوكيل عدة حمولات قابلة للتسليم.
قنوات المنتديات
لا تقبل قنوات المنتديات والوسائط في Discord سوى منشورات سلاسل المحادثات. يدعم OpenClaw طريقتين لإنشائها:- أرسل رسالة إلى أصل المنتدى (
channel:<forumId>) لإنشاء سلسلة نقاش تلقائيًا. يكون عنوان سلسلة النقاش هو أول سطر غير فارغ من الرسالة (مع اقتطاعه وفق حد Discord البالغ 100 محرف لأسماء سلاسل النقاش). - استخدم
openclaw message thread createلإنشاء سلسلة نقاش مباشرةً. لا تمرّر--message-idلقنوات المنتدى.
channel:<threadId>).
المكوّنات التفاعلية
يدعم OpenClaw حاويات مكوّنات Discord بالإصدار 2 لرسائل الوكيل. استخدم أداة الرسائل مع حمولةcomponents. تُوجَّه نتائج التفاعل مجددًا إلى الوكيل كرسائل واردة عادية وتتبع إعدادات Discord الحالية في replyToMode.
الكتل المدعومة:
textوsectionوseparatorوactionsوmedia-galleryوfile- تسمح صفوف الإجراءات بما يصل إلى 5 أزرار أو قائمة تحديد واحدة
- أنواع التحديد:
stringوuserوroleوmentionableوchannel
components.reusable=true للسماح باستخدام الأزرار وقوائم التحديد والنماذج عدة مرات حتى انتهاء صلاحيتها.
لتقييد من يمكنه النقر على زر، عيّن allowedUsers في ذلك الزر (معرّفات مستخدمي Discord أو الوسوم أو *). يتلقى المستخدمون غير المطابقين رفضًا مؤقتًا.
تنتهي صلاحية استدعاءات المكوّنات بعد 30 دقيقة افتراضيًا. عيّن channels.discord.agentComponents.ttlMs لتغيير مدة بقاء سجل الاستدعاءات للحساب الافتراضي، أو channels.discord.accounts.<accountId>.agentComponents.ttlMs لكل حساب. تمثل القيمة أجزاء من ألف من الثانية، ويجب أن تكون عددًا صحيحًا موجبًا، وبحد أقصى 86400000 (24 ساعة). تناسب مدد الصلاحية الأطول سير عمل المراجعة والموافقة الذي يحتاج إلى بقاء الأزرار قابلة للاستخدام، لكنها توسّع النافذة التي يمكن خلالها لرسالة Discord قديمة أن تفعّل إجراءً. فضّل أقصر مدة صلاحية مناسبة، واحتفظ بالقيمة الافتراضية عندما تكون الاستدعاءات القديمة غير متوقعة.
يفتح أمرا الشرطة المائلة /model و/models منتقي نماذج تفاعليًا يتضمن قوائم منسدلة لمزوّد الخدمة والنموذج وبيئات التشغيل المتوافقة، بالإضافة إلى خطوة Submit. أصبح /models add مهمَلًا ويعيد رسالة إهمال بدلًا من تسجيل النماذج من المحادثة. يكون رد المنتقي مؤقتًا ولا يمكن استخدامه إلا بواسطة المستخدم الذي استدعاه. تقتصر قوائم تحديد Discord على 25 خيارًا، لذا أضف إدخالات provider/* إلى agents.defaults.models عندما تريد أن يعرض المنتقي النماذج المكتشفة ديناميكيًا لمزوّدي خدمات محددين فقط، مثل openai أو vllm.
مرفقات الملفات:
- يجب أن تشير كتل
fileإلى مرجع مرفق (attachment://<filename>) - وفّر المرفق عبر
mediaأوpathأوfilePath(ملف واحد)؛ واستخدمmedia-galleryلملفات متعددة - استخدم
filenameلتجاوز اسم الرفع عندما ينبغي أن يطابق مرجع المرفق
- أضف
components.modalبما يصل إلى 5 حقول - أنواع الحقول:
textوcheckboxوradioوselectوrole-selectوuser-select - يضيف OpenClaw زر تشغيل تلقائيًا
التحكم في الوصول والتوجيه
- سياسة الرسائل المباشرة
- مجموعات الوصول
- سياسة الخادم
- الإشارات والرسائل المباشرة الجماعية
channels.discord.dmPolicy في الوصول عبر الرسائل المباشرة. تمثل channels.discord.allowFrom قائمة السماح الأساسية للرسائل المباشرة.pairing(الافتراضي)allowlist(يتطلب مرسلًا واحدًا على الأقل فيallowFrom)open(يتطلب أن تتضمنchannels.discord.allowFromالقيمة"*")disabled
pairing).أسبقية الحسابات المتعددة:- لا ينطبق
channels.discord.accounts.default.allowFromإلا على حسابdefault. - بالنسبة إلى حساب واحد، تكون لـ
allowFromالأسبقية علىdm.allowFromالقديمة. - ترث الحسابات المسماة
channels.discord.allowFromعندما لا تكونallowFromالخاصة بها ولاdm.allowFromالقديمة معيّنتين. - لا ترث الحسابات المسماة
channels.discord.accounts.default.allowFrom.
channels.discord.dm.policy وchannels.discord.dm.allowFrom القديمتين لأغراض التوافق. ينقلهما openclaw doctor --fix إلى dmPolicy وallowFrom عندما يستطيع فعل ذلك دون تغيير الوصول.تنسيق وجهة الرسائل المباشرة للتسليم:user:<id>- الإشارة
<@id>
allowFrom الفعّالة للرسائل المباشرة في الحساب تُعامل كوجهات رسائل مباشرة للمستخدمين لأغراض التوافق.توجيه الوكلاء المستند إلى الأدوار
استخدمbindings[].match.roles لتوجيه أعضاء خادم Discord إلى وكلاء مختلفين حسب معرّف الدور. لا تقبل الارتباطات المستندة إلى الأدوار إلا معرّفات الأدوار، وتُقيَّم بعد ارتباطات النظير أو النظير الأصل وقبل الارتباطات الخاصة بالخادم فقط. إذا عيّن ارتباط أيضًا حقول مطابقة أخرى (مثل peer مع guildId وroles)، فيجب أن تتطابق جميع الحقول المضبوطة.
الأوامر الأصلية وتخويل الأوامر
- الإعداد الافتراضي لـ
commands.nativeهو"auto"، وهو مفعّل لـ Discord. - التجاوز الخاص بكل قناة:
channels.discord.commands.native. - يؤدي
commands.native=falseإلى تخطي تسجيل أوامر الشرطة المائلة في Discord وتنظيفها أثناء بدء التشغيل. قد تظل الأوامر المسجّلة سابقًا ظاهرة في Discord حتى تزيلها من تطبيق Discord. - تستخدم مصادقة الأوامر الأصلية قوائم السماح والسياسات نفسها في Discord التي تستخدمها معالجة الرسائل العادية.
- قد تظل الأوامر ظاهرة في واجهة Discord للمستخدمين غير المصرّح لهم؛ يفرض التنفيذ مصادقة OpenClaw ويردّ بالنص “غير مصرّح”.
- إعدادات أوامر الشرطة المائلة الافتراضية:
ephemeral: true(channels.discord.slashCommand.ephemeral).
تفاصيل الميزات
وسوم الرد والردود الأصلية
وسوم الرد والردود الأصلية
[[reply_to_current]][[reply_to:<id>]]
channels.discord.replyToMode:off(الافتراضي): لا توجد سلاسل رد ضمنية؛ مع الاستمرار في مراعاة وسوم[[reply_to_*]]الصريحةfirst: يرفق مرجع الرد الأصلي الضمني بأول رسالة Discord صادرة في الدورall: يرفقه بكل رسالة صادرةbatched: يرفقه فقط عندما يكون الحدث الوارد دفعةً مؤجّلة من رسائل متعددة — وهذا مفيد عندما تريد الردود الأصلية أساسًا للمحادثات المتدفقة الملتبسة، لا لكل دور يتضمن رسالة واحدة
معاينات الروابط
معاينات الروابط
channels.discord.accounts.<id>.suppressEmbeds لتجاوز الإعداد لحساب واحد. ويمكن أيضًا لعمليات الإرسال عبر أداة الرسائل الخاصة بالوكيل تمرير suppressEmbeds: false لرسالة واحدة. لا يحجب إعداد معاينة الروابط الافتراضي حمولات embeds الصريحة في Discord.معاينة البث المباشر
معاينة البث المباشر
channels.discord.streaming.mode القيم off | partial | block | progress (الافتراضي عند عدم تعيين المفتاح streaming أو المفتاح القديم streamMode). يمثّل streamMode اسمًا مستعارًا قديمًا؛ شغّل openclaw doctor --fix لإعادة كتابة الإعداد المحفوظ إلى بنية streaming المتداخلة القياسية.- يعطّل
offتعديلات المعاينة في Discord. - يعدّل
partialرسالة معاينة واحدة مع وصول الرموز. - يصدر
blockأجزاءً بحجم المسودة؛ اضبط الحجم ونقاط الفصل باستخدامstreaming.preview.chunk(minCharsوmaxCharsوbreakPreference)، مع تقييدها بـtextChunkLimit. عند تفعيل البث بالكتل صراحةً، يتخطى OpenClaw بث المعاينة لتجنب البث المزدوج. - يحتفظ
progressبمسودة حالة واحدة قابلة للتحرير ويحدّثها بتقدّم الأدوات حتى التسليم النهائي؛ وتكون تسمية البدء المشتركة سطرًا متحركًا، لذا تختفي بالتمرير مثل بقية المحتوى بعد ظهور قدر كافٍ من العمل. - تؤدي النتائج النهائية التي تتضمن وسائط أو أخطاء أو ردودًا صريحة إلى إلغاء تعديلات المعاينة المعلّقة.
- يتحكم
streaming.preview.toolProgress(الافتراضيtrue) فيما إذا كانت تحديثات الأداة/التقدّم تعيد استخدام رسالة المعاينة. - تُعرض صفوف الأداة/التقدّم بشكل مضغوط يتكوّن من رمز تعبيري + عنوان + تفاصيل عند توفرها، مثل
🛠️ Bash: تشغيل الاختباراتأو🔎 Web Search: عن "الاستعلام". - يفعّل
streaming.progress.commentary(الافتراضيfalse) نص تعليقات/تمهيد المساعد في مسودة التقدّم المؤقتة. يُنقّى التعليق قبل عرضه، ويظل مؤقتًا، ولا يغيّر تسليم الإجابة النهائية. - يتحكم
streaming.progress.maxLineCharsفي الحد المخصص لكل سطر في معاينة التقدّم. يُختصر النثر عند حدود الكلمات؛ بينما تحتفظ تفاصيل الأوامر والمسارات باللواحق المفيدة. - يتحكم
streaming.preview.commandText/streaming.progress.commandTextفي تفاصيل الأوامر/التنفيذ ضمن أسطر التقدّم المضغوطة:raw(الافتراضي) أوstatus(تسمية الأداة فقط).
السجل والسياق وسلوك سلاسل المحادثة
السجل والسياق وسلوك سلاسل المحادثة
- القيمة الافتراضية لـ
channels.discord.historyLimitهي20 - الاحتياطي:
messages.groupChat.historyLimit - تؤدي القيمة
0إلى التعطيل
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- تُوجَّه سلاسل محادثات Discord على أنها جلسات قناة وترث إعداد القناة الأم ما لم يُتجاوز.
- ترث جلسات سلاسل المحادثة تحديد
/modelعلى مستوى جلسة القناة الأم كخيار احتياطي للنموذج فقط؛ وتحظى تحديدات/modelالمحلية في سلسلة المحادثة بالأولوية، ولا يُنسخ سجل نص المحادثة الأم ما لم يُفعّل توارث نص المحادثة. - يتيح
channels.discord.thread.inheritParent(الافتراضيfalse) لسلاسل المحادثة التلقائية الجديدة البدء من نص محادثة القناة الأم. التجاوز الخاص بكل حساب:channels.discord.accounts.<id>.thread.inheritParent. - يمكن لتفاعلات أداة الرسائل تحليل أهداف الرسائل الخاصة من النوع
user:<id>. - يُحتفظ بـ
guilds.<guild>.channels.<channel>.requireMention: falseأثناء الرجوع الاحتياطي لتفعيل مرحلة الرد.
الجلسات المرتبطة بسلاسل المحادثة للوكلاء الفرعيين
الجلسات المرتبطة بسلاسل المحادثة للوكلاء الفرعيين
/focus <target>ربط سلسلة المحادثة الحالية/الجديدة بهدف وكيل فرعي/جلسة/unfocusإزالة ارتباط سلسلة المحادثة الحالية/agentsعرض عمليات التشغيل النشطة وحالة الارتباط/session idle <duration|off>فحص/تحديث إلغاء التركيز التلقائي بسبب عدم النشاط للارتباطات المركّزة/session max-age <duration|off>فحص/تحديث الحد الأقصى الصارم لعمر الارتباطات المركّزة
- يعيّن
session.threadBindings.*الإعدادات الافتراضية العامة؛ ويتجاوزchannels.discord.threadBindings.*سلوك Discord. - يتحكم
spawnSessionsفي الإنشاء/الربط التلقائي لسلاسل المحادثة من أجلsessions_spawn({ thread: true })وعمليات إنشاء سلاسل ACP. الافتراضي:true. - يتحكم
defaultSpawnContextفي سياق الوكيل الفرعي الأصلي لعمليات الإنشاء المرتبطة بسلاسل المحادثة. الافتراضي:"fork". - يرحّل
openclaw doctor --fixالمفتاحين المهملينspawnSubagentSessionsوspawnAcpSessions. - إذا كانت ارتباطات سلاسل المحادثة معطّلة لحساب، فلن يتوفر
/focusولا عمليات ربط سلاسل المحادثة ذات الصلة.
ارتباطات قنوات ACP الدائمة
ارتباطات قنوات ACP الدائمة
bindings[] مع type: "acp" وmatch.channel: "discord".- يربط
/acp spawn codex --bind hereالقناة أو سلسلة المحادثة الحالية في موضعها، ويُبقي الرسائل المستقبلية على جلسة ACP نفسها. ترث رسائل سلسلة المحادثة ارتباط القناة الأم. - في قناة أو سلسلة محادثة مرتبطة، يعيد
/newو/resetضبط جلسة ACP نفسها في موضعها. ويمكن لارتباطات سلاسل المحادثة المؤقتة تجاوز تحليل الهدف ما دامت نشطة. - يتحكم
spawnSessionsفي إنشاء/ربط سلاسل المحادثة الفرعية عبر--thread auto|here.
إشعارات التفاعلات
إشعارات التفاعلات
guilds.<id>.reactionNotifications):offown(الافتراضي)allallowlist(يستخدمguilds.<id>.users)
تفاعلات الإقرار
تفاعلات الإقرار
ackReaction رمزًا تعبيريًا للإقرار بينما يعالج OpenClaw رسالة واردة.ترتيب التحليل:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- الرجوع إلى الرمز التعبيري لهوية الوكيل (
agents.list[].identity.emoji، وإلا ”👀”)
- يقبل Discord الرموز التعبيرية الموحّدة أو أسماء الرموز التعبيرية المخصصة.
- استخدم
""لتعطيل التفاعل لقناة أو حساب.
messages.ackReactionScope):القيم: "all" (الرسائل الخاصة + المجموعات، بما في ذلك أحداث الغرف المحيطة)، و"direct" (الرسائل الخاصة فقط)، و"group-all" (كل رسالة جماعية باستثناء أحداث الغرف المحيطة، من دون رسائل خاصة)، و"group-mentions" (المجموعات عند الإشارة إلى البوت؛ من دون رسائل خاصة، الافتراضي)، و"off" / "none" (معطّل)."group-mentions") تفاعلات الإقرار في الرسائل المباشرة أو أحداث الغرف المحيطة. للحصول على تفاعل إقرار على رسائل Discord الخاصة الواردة وأحداث الغرف الهادئة، اضبط messages.ackReactionScope على "all".كتابة الإعداد
كتابة الإعداد
/config set|unset (عندما تكون ميزات الأوامر مفعّلة).للتعطيل:وكيل Gateway
وكيل Gateway
channels.discord.proxy.
استخدام وكيل لحركة WebSocket الخاصة بـ Gateway في Discord صريح؛ ولا ترث اتصالات WebSocket متغيرات بيئة الوكيل المحيطة من عملية Gateway. تستخدم عمليات بحث REST عند بدء التشغيل هذا الوكيل عند ضبط channels.discord.proxy.دعم PluralKit
دعم PluralKit
- يمكن لقوائم السماح استخدام
pk:<memberId> - تُطابَق أسماء العرض للأعضاء بالاسم/المعرّف النصي فقط عندما تكون
channels.discord.dangerouslyAllowNameMatching: true - تستعلم عمليات البحث من واجهة PluralKit API باستخدام معرّف الرسالة الأصلي
- إذا فشل البحث، تُعامل الرسائل الممرَّرة بالوكالة كرسائل روبوت وتُسقَط ما لم يسمح
allowBotsبمرورها
الأسماء المستعارة للإشارات الصادرة
الأسماء المستعارة للإشارات الصادرة
mentionAliases عندما تحتاج الوكلاء إلى إشارات صادرة حتمية لمستخدمي Discord المعروفين. المفاتيح هي المعرّفات من دون السابقة @؛ والقيم هي معرّفات مستخدمي Discord. تُترك المعرّفات غير المعروفة و@everyone و@here والإشارات داخل مقاطع شيفرة Markdown بلا تغيير.إعداد حالة الحضور
إعداد حالة الحضور
activity):- 0: يلعب
- 1: يبث مباشرة (يتطلب
activityUrl؛ ويتطلبactivityUrlبدورهactivityType: 1) - 2: يستمع
- 3: يشاهد
- 4: مخصص (يستخدم نص النشاط بوصفه حالة الحضور؛ والرمز التعبيري اختياري)
- 5: يتنافس
intervalMs تساوي 30000، وminUpdateIntervalMs تساوي 15000 (ويجب أن تكون أقل من intervalMs أو مساوية لها). تجاوزات النص الاختيارية:autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(يدعم العنصر النائب{reason})
الموافقات في Discord
الموافقات في Discord
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(اختياري؛ يعود إلىcommands.ownerAllowFromعند الإمكان)channels.discord.execApprovals.target(dm|channel|both، الافتراضي:dm)agentFilter، وsessionFilter، وcleanupAfterResolve
enabled معيّنة أو تكون "auto" ويمكن تحديد موافِق واحد على الأقل، إما من execApprovals.approvers أو من commands.ownerAllowFrom. لا يستنتج Discord موافقي التنفيذ من allowFrom الخاصة بالقناة، أو dm.allowFrom القديمة، أو defaultTo للرسائل المباشرة. عيّن enabled: false لتعطيل Discord صراحةً بوصفه عميل موافقة أصليًا.بالنسبة إلى أوامر المجموعات الحساسة والمقصورة على المالك مثل /diagnostics و/export-trajectory، يرسل OpenClaw مطالبات الموافقة والنتائج النهائية على نحو خاص. يحاول أولًا استخدام رسالة Discord خاصة عندما يكون للمالك المستدعي مسار مالك في Discord؛ وإلا فيعود إلى أول مسار مالك متاح من commands.ownerAllowFrom، مثل Telegram.عندما تكون target هي channel أو both، تظهر مطالبة الموافقة في القناة. لا يمكن استخدام الأزرار إلا بواسطة الموافِقين المحددين؛ ويتلقى المستخدمون الآخرون رفضًا مؤقتًا لا يظهر إلا لهم. تتضمن مطالبات الموافقة نص الأمر، لذا لا تمكّن التسليم إلى القناة إلا في القنوات الموثوقة. إذا تعذر اشتقاق معرّف القناة من مفتاح الجلسة، يعود OpenClaw إلى التسليم عبر الرسائل الخاصة.يعرض Discord أزرار الموافقة المشتركة التي تستخدمها قنوات الدردشة الأخرى؛ ويضيف محول Discord الأصلي أساسًا توجيه الرسائل الخاصة إلى الموافِقين والتوزيع على القنوات. عند وجود هذه الأزرار، تكون هي تجربة المستخدم الأساسية للموافقة؛ ولا ينبغي لـ OpenClaw تضمين أمر /approve يدوي إلا عندما تشير نتيجة الأداة إلى أن موافقات الدردشة غير متاحة أو أن الموافقة اليدوية هي المسار الوحيد. إذا لم يكن وقت تشغيل الموافقة الأصلي في Discord نشطًا، يُبقي OpenClaw مطالبة /approve <id> <decision> المحلية والحتمية ظاهرة. وإذا كان وقت التشغيل نشطًا لكن تعذر تسليم بطاقة أصلية إلى أي وجهة، يرسل OpenClaw إشعارًا احتياطيًا في الدردشة نفسها يتضمن أمر /approve الدقيق من الموافقة المعلّقة.تتبع مصادقة Gateway وحل الموافقات عقد عميل Gateway المشترك (تُحل معرّفات plugin: عبر plugin.approval.resolve؛ والمعرّفات الأخرى عبر exec.approval.resolve). تنتهي صلاحية الموافقات بعد 30 دقيقة افتراضيًا.راجع موافقات التنفيذ.الأدوات وبوابات الإجراءات
تغطي إجراءات رسائل Discord المراسلة وإدارة القنوات والإشراف والحضور والبيانات الوصفية. أمثلة أساسية:- المراسلة:
sendMessage، وreadMessages، وeditMessage، وdeleteMessage، وthreadReply - التفاعلات:
react، وreactions، وemojiList - الإشراف:
timeout، وkick، وban - الحضور:
setPresence
event-create معامل image اختياريًا (عنوان URL أو مسار ملف محلي) لتعيين صورة غلاف الحدث المجدول.
توجد بوابات الإجراءات ضمن channels.discord.actions.*.
سلوك البوابات الافتراضي:
واجهة مستخدم المكونات بالإصدار الثاني
يستخدم OpenClaw مكونات Discord بالإصدار الثاني لموافقات التنفيذ وعلامات السياقات المتقاطعة. ويمكن لإجراءات رسائل Discord أيضًا قبولcomponents لإنشاء واجهة مستخدم مخصصة (متقدم؛ يتطلب إنشاء حمولة مكونات عبر أداة Discord)، بينما تظل embeds القديمة متاحة لكن لا يُنصح بها.
- يعيّن
channels.discord.ui.components.accentColorلون التمييز الذي تستخدمه حاويات مكونات Discord (بالصيغة السداسية العشرية). لكل حساب:channels.discord.accounts.<id>.ui.components.accentColor. - يتحكم
channels.discord.agentComponents.ttlMsفي مدة بقاء استدعاءات مكونات Discord المُرسلة مسجلة (الافتراضي1800000، والحد الأقصى86400000). لكل حساب:channels.discord.accounts.<id>.agentComponents.ttlMs. - تُتجاهل
embedsعند وجود مكونات الإصدار الثاني. - تُمنع معاينات عناوين URL العادية افتراضيًا. عيّن
suppressEmbeds: falseفي إجراء رسالة عندما ينبغي توسيع رابط صادر واحد.
الصوت
يحتوي Discord على سطحين صوتيين متميزين: القنوات الصوتية في الوقت الفعلي (محادثات مستمرة) ومرفقات الرسائل الصوتية (تنسيق معاينة الشكل الموجي). يدعم Gateway كليهما.القنوات الصوتية
قائمة تحقق الإعداد:- فعّل Message Content Intent في Discord Developer Portal.
- فعّل Server Members Intent عند استخدام قوائم السماح للأدوار/المستخدمين.
- ادعُ الروبوت باستخدام النطاقين
botوapplications.commands. - امنح أذونات Connect وSpeak وSend Messages وRead Message History في القناة الصوتية المستهدفة.
- فعّل الأوامر الأصلية (
commands.nativeأوchannels.discord.commands.native). - اضبط
channels.discord.voice.
/vc join|leave|status للتحكم في الجلسات. يستخدم الأمر الوكيل الافتراضي للحساب ويتبع قواعد قوائم السماح وسياسات المجموعات نفسها المتبعة في أوامر Discord الأخرى.
- يُعد صوت Discord ميزة اختيارية في إعدادات النص فقط؛ اضبط
channels.discord.voice.enabled=true(أو احتفظ بكتلةchannels.discord.voiceموجودة) لتمكين أوامر/vc، وبيئة تشغيل الصوت، وهدف Gateway المسمىGuildVoiceStates. يمكن لـchannels.discord.intents.voiceStatesتجاوز الاشتراك في الهدف صراحةً؛ اتركه من دون ضبط ليتبع حالة التمكين الفعلية للصوت. - يتحكم
voice.modeفي مسار المحادثة. الوضع الافتراضي هوagent-proxy: تتولى واجهة صوتية أمامية في الوقت الفعلي توقيت الأدوار، والمقاطعة، والتشغيل، وتفوّض العمل الجوهري إلى وكيل OpenClaw الموجّه عبرopenclaw_agent_consult، وتتعامل مع النتيجة كموجّه Discord مكتوب صادر عن ذلك المتحدث. يحتفظstt-ttsبمسار التحويل الدفعي الأقدم من الكلام إلى نص ثم من النص إلى كلام. يتيحbidiللنموذج في الوقت الفعلي إجراء المحادثة مباشرةً مع إتاحةopenclaw_agent_consultلعقل OpenClaw. - يتحكم
voice.agentSessionفي محادثة OpenClaw التي تستقبل الأدوار الصوتية. اتركه من دون ضبط لاستخدام جلسة القناة الصوتية نفسها، أو اضبطه على{ mode: "target", target: "channel:<text-channel-id>" }لجعل القناة الصوتية تعمل امتدادًا للميكروفون/مكبر الصوت لجلسة قناة نصية موجودة في Discord مثل#maintainers. - يتجاوز
voice.modelعقل وكيل OpenClaw المستخدم لردود Discord الصوتية والاستشارات في الوقت الفعلي. اتركه من دون ضبط ليرث نموذج الوكيل الموجّه. وهو منفصل عنvoice.realtime.model. - يتيح
voice.followUsersللبوت الانضمام إلى صوت Discord والتنقل فيه ومغادرته مع مستخدمين محددين. راجع متابعة المستخدمين في الصوت. - يوجّه
agent-proxyالكلام عبرdiscord-voice، مما يحافظ على تفويض المالك/الأدوات المعتاد للمتحدث والجلسة المستهدفة، لكنه يخفي أداة الوكيلttsلأن صوت Discord يتولى التشغيل. افتراضيًا، يمنحagent-proxyالاستشارة وصولًا كاملًا إلى الأدوات مكافئًا لوصول المالك للمتحدثين المالكين (voice.realtime.toolPolicy: "owner")، ويفضّل بشدة استشارة وكيل OpenClaw قبل تقديم الإجابات الجوهرية (voice.realtime.consultPolicy: "always"). في وضعalwaysالافتراضي هذا، لا تنطق طبقة الوقت الفعلي تلقائيًا بكلام حشو قبل إجابة الاستشارة؛ بل تلتقط الكلام وتحوّله إلى نص، ثم تنطق إجابة OpenClaw الموجّهة. إذا اكتملت عدة إجابات استشارة إلزامية بينما لا يزال Discord يشغّل الإجابة الأولى، توضع إجابات النطق الحرفي اللاحقة في طابور حتى يصبح التشغيل خاملًا بدلًا من استبدال الكلام في منتصف الجملة. - في وضع
stt-tts، يستخدم التحويل من الكلام إلى نصtools.media.audio؛ ولا يؤثرvoice.modelفي النسخ النصي. - في أوضاع الوقت الفعلي، تضبط
voice.realtime.providerوvoice.realtime.modelوvoice.realtime.speakerVoiceجلسة الصوت في الوقت الفعلي. لاستخدام OpenAI Realtime 2.1 مع عقل Codex، استخدمvoice.realtime.model: "gpt-realtime-2.1"وvoice.model: "openai/gpt-5.6-sol". - تتضمن أوضاع الصوت في الوقت الفعلي افتراضيًا ملفات التعريف الصغيرة
IDENTITY.mdوUSER.mdوSOUL.mdضمن تعليمات مزوّد الوقت الفعلي، بحيث تحافظ الأدوار المباشرة السريعة على الهوية نفسها، والارتكاز إلى المستخدم، والشخصية نفسها الخاصة بوكيل OpenClaw الموجّه. اضبطvoice.realtime.bootstrapContextFilesعلى مجموعة فرعية لتخصيص ذلك، أو على[]لتعطيله. لا تُدعم سوى ملفات التعريف هذه؛ ويبقىAGENTS.mdضمن سياق الوكيل المعتاد. لا يحل سياق التعريف المحقون محلopenclaw_agent_consultعند تنفيذ أعمال مساحة العمل، أو جلب الحقائق الحالية، أو البحث في الذاكرة، أو تنفيذ الإجراءات المدعومة بالأدوات. - في وضع الوقت الفعلي
agent-proxyلدى OpenAI، اضبطvoice.realtime.requireWakeName: trueلإبقاء صوت Discord في الوقت الفعلي صامتًا حتى يبدأ النسخ النصي أو ينتهي باسم تنبيه. يجب أن تتكون أسماء التنبيه المضبوطة من كلمة أو كلمتين. إذا لم يُضبطvoice.realtime.wakeNames، يستخدم OpenClaw قيمةnameللوكيل الموجّه إضافةً إلىOpenClaw، مع الرجوع إلى معرّف الوكيل إضافةً إلىOpenClawعند التعذر. يؤدي التقييد باسم التنبيه إلى تعطيل الاستجابة التلقائية لمزوّد الوقت الفعلي، وتوجيه الأدوار المقبولة عبر مسار استشارة وكيل OpenClaw، وتقديم إقرار صوتي قصير عند التعرّف على اسم تنبيه في البداية من النسخ الجزئي قبل وصول النسخ النهائي. - يقبل مزوّد OpenAI للوقت الفعلي أسماء أحداث Realtime 2 الحالية والأسماء البديلة القديمة المتوافقة مع Codex لأحداث إخراج الصوت والنسخ النصي، بحيث يمكن أن تنحرف لقطات المزوّد المتوافقة من دون إسقاط صوت المساعد.
- يتحكم
voice.realtime.bargeInفي ما إذا كانت أحداث بدء المتحدث في Discord تقاطع التشغيل النشط في الوقت الفعلي. إذا لم يُضبط، فإنه يتبع إعداد مقاطعة صوت الإدخال لدى مزوّد الوقت الفعلي. - يتحكم
voice.realtime.minBargeInAudioEndMsفي الحد الأدنى لمدة تشغيل المساعد قبل أن تؤدي مقاطعة في الوقت الفعلي من OpenAI إلى اقتطاع الصوت. القيمة الافتراضية:250. اضبطه على0للمقاطعة الفورية في الغرف منخفضة الصدى، أو ارفعه لإعدادات مكبرات الصوت ذات الصدى الشديد. - يتجاوز
voice.ttsقيمةmessages.ttsلتشغيل الصوت في وضعstt-ttsفقط؛ وتستخدم أوضاع الوقت الفعليvoice.realtime.speakerVoiceبدلًا منه. لاستخدام صوت من OpenAI في تشغيل Discord، اضبطvoice.tts.provider: "openai"واختر صوتًا لتحويل النص إلى كلام ضمنvoice.tts.providers.openai.speakerVoice. يُعدcedarخيارًا جيدًا ذا طابع صوتي ذكوري في نموذج OpenAI الحالي لتحويل النص إلى كلام. - تنطبق تجاوزات
systemPromptالخاصة بكل قناة في Discord على أدوار النسخ الصوتي لتلك القناة الصوتية. - تستمد أدوار النسخ الصوتي حالة المالك من
allowFromفي Discord (أوdm.allowFrom) للأوامر وإجراءات القنوات المقيّدة بالمالك. ويتبع ظهور أدوات الوكيل سياسة الأدوات المضبوطة للجلسة الموجّهة. - إذا احتوى
voice.autoJoinعلى عدة إدخالات للخادم نفسه، ينضم OpenClaw إلى آخر قناة مضبوطة لذلك الخادم. - تمثل
voice.allowedChannelsقائمة سماح اختيارية للإقامة. اتركها من دون ضبط للسماح للأمر/vc joinبالانضمام إلى أي قناة صوتية مصرّح بها في Discord. عند ضبطها، تُقيّد عمليات/vc joinوالانضمام التلقائي عند بدء التشغيل وتنقلات الحالة الصوتية للبوت إلى إدخالات{ guildId, channelId }المدرجة. اضبطها على مصفوفة فارغة لمنع جميع عمليات الانضمام إلى صوت Discord. إذا نقل Discord البوت خارج قائمة السماح، يغادر OpenClaw تلك القناة ويعيد الانضمام إلى هدف الانضمام التلقائي المضبوط عند توفره. - تُمرَّر
voice.daveEncryptionوvoice.decryptionFailureToleranceإلى خيارات الانضمام في@discordjs/voice؛ والقيم الافتراضية في المصدر الأعلى هيdaveEncryption=trueوdecryptionFailureTolerance=24. - يستخدم OpenClaw برنامج الترميز المضمّن
libopus-wasmلاستقبال صوت Discord وتشغيل PCM الخام في الوقت الفعلي. وهو يتضمن إصدارًا مثبتًا من libopus المبني باستخدام WebAssembly ولا يتطلب إضافات opus أصلية. - يتحكم
voice.connectTimeoutMsفي مدة الانتظار الأولية لحالة@discordjs/voiceالمسماة Ready لمحاولات/vc joinوالانضمام التلقائي. القيمة الافتراضية:30000. - يتحكم
voice.reconnectGraceMsفي المدة التي ينتظرها OpenClaw حتى تبدأ جلسة صوتية منقطعة الاتصال بإعادة الاتصال قبل إتلافها. القيمة الافتراضية:15000. - في وضع
stt-tts، لا يتوقف تشغيل الصوت لمجرد أن مستخدمًا آخر بدأ الكلام. لتجنب حلقات التغذية الراجعة، يتجاهل OpenClaw التقاط صوت جديد أثناء تشغيل تحويل النص إلى كلام؛ تحدث بعد انتهاء التشغيل لبدء الدور التالي. تمرر أوضاع الوقت الفعلي بدايات المتحدثين كإشارات مقاطعة إلى مزوّد الوقت الفعلي. - في أوضاع الوقت الفعلي، قد يبدو صدى مكبرات الصوت الداخل إلى ميكروفون مفتوح كمقاطعة ويوقف التشغيل. في غرف Discord شديدة الصدى، اضبط
voice.realtime.providers.openai.interruptResponseOnInputAudio: falseلمنع OpenAI من المقاطعة التلقائية عند وجود صوت إدخال. أضفvoice.realtime.bargeIn: trueإذا كنت لا تزال تريد أن تقاطع أحداث بدء المتحدث في Discord التشغيل النشط. يتجاهل جسر OpenAI للوقت الفعلي اقتطاعات التشغيل الأقصر منvoice.realtime.minBargeInAudioEndMsباعتبارها على الأرجح صدى/ضوضاء، ويسجلها كمتخطاة بدلًا من مسح تشغيل Discord. - يتحكم
voice.captureSilenceGraceMsفي المدة التي ينتظرها OpenClaw بعد أن يبلغ Discord عن توقف متحدث، قبل إنهاء ذلك المقطع الصوتي لتحويل الكلام إلى نص. القيمة الافتراضية:2000؛ ارفعها إذا كان Discord يقسم فترات التوقف الطبيعية إلى نسخ جزئية متقطعة. - عندما يكون ElevenLabs هو مزوّد تحويل النص إلى كلام المحدد، يستخدم تشغيل صوت Discord تحويل النص إلى كلام بالتدفق ويبدأ من تدفق استجابة المزوّد. أما المزوّدون الذين لا يدعمون التدفق فيرجعون إلى مسار الملف المؤقت المُركّب.
- يراقب OpenClaw حالات فشل فك تشفير الاستقبال ويتعافى تلقائيًا عبر مغادرة القناة الصوتية وإعادة الانضمام إليها بعد تكرر حالات الفشل ضمن فترة قصيرة.
- إذا أظهرت سجلات الاستقبال مرارًا
DecryptionFailed(UnencryptedWhenPassthroughDisabled)بعد التحديث، فاجمع تقريرًا عن الاعتماديات والسجلات. يتضمن إصدار@discordjs/voiceالمضمّن إصلاح الحشو من طلب السحب رقم #11449 في discord.js، الذي أغلق المشكلة رقم #11419 في discord.js. - تُعد أحداث الاستقبال
The operation was abortedمتوقعة عندما ينهي OpenClaw مقطعًا ملتقطًا للمتحدث؛ وهي تشخيصات تفصيلية وليست تحذيرات. - تتضمن سجلات صوت Discord التفصيلية معاينة محدودة من سطر واحد لنسخ التحويل من الكلام إلى نص لكل مقطع متحدث مقبول، بحيث يُظهر تصحيح الأخطاء جانب المستخدم وجانب رد الوكيل من دون تفريغ نص نسخ غير محدود.
- في وضع
agent-proxy، يتخطى الرجوع إلى الاستشارة الإلزامية أجزاء النسخ التي يُرجّح أنها غير مكتملة، مثل النص المنتهي بـ...أو بأداة ربط ختامية مثل “و”، إضافةً إلى العبارات الختامية الواضحة التي لا تتطلب إجراءً مثل “سأعود حالًا” أو “وداعًا”. تعرض السجلاتforced agent consult skipped reason=...عندما يمنع ذلك إجابة قديمة في الطابور.
متابعة المستخدمين في الصوت
استخدمvoice.followUsers عندما تريد أن يبقى بوت صوت Discord مع مستخدم واحد أو أكثر من مستخدمي Discord المعروفين بدلًا من الانضمام إلى قناة ثابتة عند بدء التشغيل أو انتظار /vc join.
- يقبل
followUsersمعرّفات مستخدمي Discord الخام وقيمdiscord:<id>. يوحّد OpenClaw كلا الشكلين قبل مطابقة أحداث الحالة الصوتية. - تكون القيمة الافتراضية لـ
followUsersEnabledهيtrueعند ضبطfollowUsers. اضبطها علىfalseللاحتفاظ بالقائمة المحفوظة مع إيقاف المتابعة الصوتية التلقائية. - عندما ينضم مستخدم متابَع إلى قناة صوتية مسموح بها، ينضم OpenClaw إلى تلك القناة. وعندما ينتقل المستخدم، ينتقل OpenClaw معه. وعندما ينقطع اتصال المستخدم المتابَع النشط، يغادر OpenClaw.
- إذا كان عدة مستخدمين متابَعين في الخادم نفسه وغادر المستخدم المتابَع النشط، ينتقل OpenClaw إلى قناة مستخدم متابَع آخر يجري تتبعه قبل مغادرة الخادم. وإذا انتقل عدة مستخدمين متابَعين في الوقت نفسه، يفوز آخر حدث حالة صوتية تمت ملاحظته.
- تظل
allowedChannelsسارية. يُتجاهل المستخدم المتابَع الموجود في قناة غير مسموح بها، وتنتقل الجلسة المملوكة للمتابعة إلى مستخدم متابَع آخر أو تغادر. - يوفّق OpenClaw أحداث الحالة الصوتية الفائتة عند بدء التشغيل وعلى فاصل زمني محدود. تأخذ عملية التوفيق عينات من الخوادم المضبوطة وتضع حدًا لعمليات بحث REST في كل تشغيل، لذا قد تحتاج قوائم
followUsersالكبيرة جدًا إلى أكثر من فاصل زمني واحد للوصول إلى الحالة المتسقة. - إذا نقل Discord أو مسؤول البوت أثناء متابعته لمستخدم، يعيد OpenClaw بناء الجلسة الصوتية ويحافظ على ملكية المتابعة عندما تكون الوجهة مسموحًا بها. وإذا نُقل البوت خارج
allowedChannels، يغادر OpenClaw ويعيد الانضمام إلى الهدف المضبوط عند وجوده. - قد يغادر تعافي استقبال DAVE القناة نفسها ويعيد الانضمام إليها بعد تكرر حالات فشل فك التشفير. تحتفظ الجلسات المملوكة للمتابعة بملكية المتابعة عبر مسار التعافي هذا، ولذلك يؤدي انقطاع مستخدم متابَع لاحقًا إلى مغادرة القناة.
- استخدم
followUsersللإعدادات الشخصية أو إعدادات المشغّلين التي ينبغي أن يوجد فيها البوت تلقائيًا في الصوت عندما تكون موجودًا. - استخدم
autoJoinلبوتات الغرف الثابتة التي ينبغي أن تبقى حاضرة حتى عندما لا يكون أي مستخدم متتبَّع في الصوت. - استخدم
/vc joinلعمليات الانضمام لمرة واحدة أو للغرف التي سيكون فيها الوجود الصوتي التلقائي مفاجئًا.
- تعرض سجلات استقبال الصوت
discord voice: opus decoder: libopus-wasm. - يرمّز التشغيل في الوقت الفعلي PCM ستيريو خامًا بتردد 48 كيلوهرتز إلى Opus باستخدام حزمة
libopus-wasmالمضمّنة نفسها قبل تسليم الحزم إلى@discordjs/voice. - يحوّل تشغيل الملفات وتدفقات المزوّد إلى PCM ستيريو خام بتردد 48 كيلوهرتز باستخدام ffmpeg، ثم يستخدم
libopus-wasmلتدفق حزم Opus المرسلة إلى Discord.
- يُحوَّل التقاط PCM من Discord إلى ملف WAV مؤقت.
- تتولى
tools.media.audioتحويل الكلام إلى نص (STT)، مثلopenai/gpt-4o-mini-transcribe. - تُرسل النسخة النصية عبر مسار الإدخال والتوجيه في Discord، بينما يعمل نموذج اللغة الكبير للاستجابة وفق سياسة إخراج صوتي تُخفي أداة الوكيل
ttsوتطلب إرجاع النص، لأن صوت Discord يتولى تشغيل تحويل النص إلى كلام (TTS) النهائي. - عند تعيين
voice.model، فإنه يتجاوز نموذج اللغة الكبير للاستجابة لهذه الجولة في القناة الصوتية فقط. - يُدمج
voice.ttsفوقmessages.tts؛ وتغذي الجهات الموفرة الداعمة للبث المشغّل مباشرةً، وإلا فيُشغَّل ملف الصوت الناتج في القناة المنضم إليها.
voice.agentSession، تحصل كل قناة صوتية على جلسة OpenClaw موجّهة خاصة بها. على سبيل المثال، يتحدث /vc join channel:234567890123456789 إلى جلسة قناة Discord الصوتية تلك. نموذج الوقت الفعلي ليس سوى واجهة الصوت الأمامية؛ أما الطلبات الجوهرية فتُحال إلى وكيل OpenClaw المُعدّ. إذا أنتج نموذج الوقت الفعلي نسخة نصية نهائية دون استدعاء أداة الاستشارة، يفرض OpenClaw الاستشارة بوصفها إجراءً احتياطيًا كي يظل السلوك الافتراضي مماثلًا للتحدث إلى الوكيل.
مثال قديم لتحويل الكلام إلى نص ثم النص إلى كلام:
agent-proxy، ينضم الروبوت إلى القناة الصوتية المُعدّة، لكن جولات وكيل OpenClaw تستخدم الجلسة الموجّهة العادية للقناة المستهدفة ووكيلها. تنطق جلسة الصوت في الوقت الفعلي النتيجة المُعادة داخل القناة الصوتية. لا يزال بإمكان الوكيل المشرف استخدام أدوات الرسائل العادية وفق سياسة أدواته، بما في ذلك إرسال رسالة Discord منفصلة إذا كان ذلك هو الإجراء المناسب.
أثناء نشاط تشغيل OpenClaw مفوّض، تُعامل النسخ النصية الصوتية الجديدة من Discord بوصفها تحكمًا مباشرًا في التشغيل قبل بدء جولة وكيل أخرى. تُصنّف عبارات مثل «الحالة» أو «ألغِ ذلك» أو «استخدم الإصلاح الأصغر» أو «عندما تنتهي، تحقّق أيضًا من الاختبارات» بوصفها إدخالًا للاستعلام عن الحالة أو الإلغاء أو التوجيه أو المتابعة للجلسة النشطة. تُنطق نتائج الحالة والإلغاء والتوجيه المقبول والمتابعة داخل القناة الصوتية كي يعرف المتصل ما إذا كان OpenClaw قد عالج الطلب.
صيغ أهداف مفيدة:
- يوجّه
target: "channel:123456789012345678"عبر جلسة قناة نصية في Discord. - يُعامل
target: "123456789012345678"بوصفه هدف قناة. - يوجّه
target: "dm:123456789012345678"أوtarget: "user:123456789012345678"عبر جلسة الرسائل المباشرة تلك.
bargeIn: true لأحداث بدء المتحدث في Discord وصوت المتحدث النشط بالفعل إلغاء استجابات الوقت الفعلي النشطة قبل وصول الجولة الملتقطة التالية إلى OpenAI. تُعامل إشارات المقاطعة الكلامية المبكرة جدًا التي تكون فيها قيمة audioEndMs أقل من minBargeInAudioEndMs بوصفها صدى أو ضوضاء محتملة وتُتجاهل كي لا يتوقف النموذج عند أول إطار تشغيل.
سجلات الصوت المتوقعة:
- عند الانضمام:
discord voice: joining ... voiceSession=... supervisorSession=... agentSessionMode=... voiceModel=... realtimeModel=... - عند بدء الوقت الفعلي:
discord voice: realtime bridge starting ... autoRespond=false interruptResponse=false bargeIn=false minBargeInAudioEndMs=... - عند صوت المتحدث:
discord voice: realtime speaker turn opened ...وdiscord voice: realtime input audio started ... outputAudioMs=... outputActive=...وdiscord voice: realtime speaker turn closed ... chunks=... discordBytes=... realtimeBytes=... interruptedPlayback=... - عند تخطي كلام قديم:
discord voice: realtime forced agent consult skipped reason=incomplete-transcript ...أوreason=non-actionable-closing ... - عند اكتمال استجابة الوقت الفعلي:
discord voice: realtime audio playback finishing reason=response.done ... audioMs=... chunks=... - عند إيقاف التشغيل أو إعادة ضبطه:
discord voice: realtime audio playback stopped reason=... audioMs=... elapsedMs=... chunks=... - عند استشارة الوقت الفعلي:
discord voice: realtime consult requested ... voiceSession=... supervisorSession=... question=... - عند إجابة الوكيل:
discord voice: agent turn answer ... - عند إدراج كلام مطابق في قائمة الانتظار:
discord voice: realtime exact speech queued ... queued=... outputAudioMs=... outputActive=...، ثمdiscord voice: realtime exact speech dequeued reason=player-idle ... - عند اكتشاف المقاطعة الكلامية:
discord voice: realtime barge-in detected source=speaker-start ...أوdiscord voice: realtime barge-in detected source=active-speaker-audio ...، ثمdiscord voice: realtime barge-in requested reason=... outputAudioMs=... outputActive=... - عند مقاطعة الوقت الفعلي:
discord voice: realtime model interrupt requested client:response.cancel reason=barge-in، ثم إماdiscord voice: realtime model audio truncated client:conversation.item.truncate reason=barge-in audioEndMs=...أوdiscord voice: realtime model interrupt confirmed server:response.done status=cancelled ... - عند تجاهل الصدى أو الضوضاء:
discord voice: realtime model interrupt ignored client:conversation.item.truncate.skipped reason=barge-in audioEndMs=0 minAudioEndMs=250 - عند تعطيل المقاطعة الكلامية:
discord voice: realtime capture ignored during playback (barge-in disabled) ... - عند خمول التشغيل:
discord voice: realtime barge-in ignored reason=... outputActive=false ... playbackChunks=0
- يعني
realtime audio playback startedأن Discord بدأ تشغيل صوت المساعد. يبدأ الجسر من هذه النقطة عدّ مقاطع خرج المساعد وبايتات PCM الخاصة بـDiscord وبايتات الوقت الفعلي للجهة الموفرة ومدة الصوت المُركّب. - يشير
realtime speaker turn openedإلى أن أحد المتحدثين في Discord أصبح نشطًا. إذا كان التشغيل نشطًا بالفعل وكانbargeInمفعّلًا، فقد يتبعهbarge-in detected source=speaker-start. - يشير
realtime input audio startedإلى أول إطار صوتي فعلي يُستقبل لجولة المتحدث تلك. تعنيoutputActive=trueأو قيمةoutputAudioMsغير الصفرية هنا أن الميكروفون يرسل إدخالًا بينما لا يزال تشغيل المساعد نشطًا. - يعني
barge-in detected source=active-speaker-audioأن OpenClaw رصد صوت متحدث مباشرًا أثناء نشاط تشغيل المساعد. يفيد ذلك في التمييز بين مقاطعة حقيقية وحدث بدء متحدث في Discord دون صوت مفيد. - يعني
barge-in requested reason=...أن OpenClaw طلب من جهة توفير الوقت الفعلي إلغاء الاستجابة النشطة أو اقتطاعها. ويتضمنoutputAudioMsوoutputActiveوplaybackChunksكي تتمكن من معرفة مقدار صوت المساعد الذي شُغّل فعليًا قبل المقاطعة. - يمثّل
realtime audio playback stopped reason=...نقطة إعادة ضبط تشغيل Discord المحلي. يوضّح السبب من أوقف التشغيل:barge-inأوplayer-idleأوprovider-clear-audioأوforced-agent-consultأوstream-closeأوsession-close. - يلخّص
realtime speaker turn closedجولة الإدخال الملتقطة. تعنيchunks=0أوhasAudio=falseأن جولة المتحدث فُتحت، لكن لم يصل أي صوت صالح للاستخدام إلى جسر الوقت الفعلي. وتعنيinterruptedPlayback=trueأن جولة الإدخال تلك تداخلت مع خرج المساعد وشغّلت منطق المقاطعة الكلامية.
outputAudioMs: مدة صوت المساعد التي أنشأتها جهة توفير الوقت الفعلي قبل سطر السجل.audioMs: مدة صوت المساعد التي عدّها OpenClaw قبل توقف التشغيل.elapsedMs: الزمن الفعلي المنقضي بين فتح تدفق التشغيل أو جولة المتحدث وإغلاقهما.discordBytes: بايتات PCM استيريو بتردد 48 كيلوهرتز المُرسلة إلى صوت Discord أو المستلمة منه.realtimeBytes: بايتات PCM بتنسيق الجهة الموفرة المُرسلة إلى جهة توفير الوقت الفعلي أو المستلمة منها.playbackChunks: مقاطع صوت المساعد المُمررة إلى Discord للاستجابة النشطة.sinceLastAudioMs: الفاصل بين آخر إطار صوتي ملتقط من المتحدث وإغلاق جولة المتحدث.
- يشير الانقطاع الفوري مع
source=active-speaker-audioوقيمةoutputAudioMsصغيرة ووجود المستخدم نفسه بالقرب من الجهاز عادةً إلى دخول صدى مكبر الصوت إلى الميكروفون. ارفع قيمةvoice.realtime.minBargeInAudioEndMsأو اخفض مستوى صوت مكبر الصوت أو استخدم سماعات رأس أو عيّنvoice.realtime.providers.openai.interruptResponseOnInputAudio: false. - يعني ظهور
source=speaker-startمتبوعًا بـspeaker turn closed ... hasAudio=falseأن Discord أبلغ عن بدء متحدث، لكن لم يصل أي صوت إلى OpenClaw. قد يكون ذلك حدثًا عابرًا في صوت Discord أو سلوك بوابة الضوضاء أو فتح العميل للميكروفون لوقت وجيز. - يعني ظهور
audio playback stopped reason=stream-closeدون مقاطعة كلامية قريبة أوprovider-clear-audioأن تدفق تشغيل Discord المحلي انتهى على نحو غير متوقع. تحقّق من سجلات الجهة الموفرة ومشغّل Discord السابقة. - يعني
capture ignored during playback (barge-in disabled)أن OpenClaw أسقط الإدخال عمدًا أثناء نشاط صوت المساعد. فعّلvoice.realtime.bargeInإذا أردت أن يقاطع الكلامُ التشغيلَ. - يعني
barge-in ignored ... outputActive=falseأن اكتشاف النشاط الصوتي في Discord أو لدى الجهة الموفرة أبلغ عن كلام، لكن لم يكن لدى OpenClaw تشغيل نشط لمقاطعته. لا ينبغي أن يؤدي ذلك إلى قطع الصوت.
voice.model، ومصادقة تحويل الكلام إلى نص لـtools.media.audio، ومصادقة تحويل النص إلى كلام لـmessages.tts/voice.tts، ومصادقة جهة توفير الوقت الفعلي لـvoice.realtime.providers أو إعداد المصادقة العادي للجهة الموفرة.
الرسائل الصوتية
تعرض رسائل Discord الصوتية معاينة للموجة الصوتية وتتطلب صوتًا بتنسيق OGG/Opus. ينشئ OpenClaw الموجة الصوتية تلقائيًا، لكنه يحتاج إلىffmpeg وffprobe على مضيف Gateway لفحص الصوت وتحويله.
- وفّر مسار ملف محليًا (تُرفض عناوين URL).
- احذف المحتوى النصي (يرفض Discord النص والرسالة الصوتية في الحمولة نفسها).
- يُقبل أي تنسيق صوتي؛ ويحوّله OpenClaw إلى OGG/Opus عند الحاجة.
استكشاف الأخطاء وإصلاحها
استُخدمت مقاصد غير مسموح بها أو لا يرى الروبوت رسائل الخادم
استُخدمت مقاصد غير مسموح بها أو لا يرى الروبوت رسائل الخادم
- فعّل Message Content Intent
- فعّل Server Members Intent عندما تعتمد على التعرّف على المستخدمين/الأعضاء
- أعد تشغيل Gateway بعد تغيير intents
حظر رسائل الخادم بشكل غير متوقع
حظر رسائل الخادم بشكل غير متوقع
- تحقّق من
groupPolicy - تحقّق من قائمة السماح للخادم ضمن
channels.discord.guilds - إذا وُجدت خريطة
channelsلخادم، فلن يُسمح إلا بالقنوات المدرجة - تحقّق من سلوك
requireMentionوأنماط الإشارة
تعطيل اشتراط الإشارة مع استمرار الحظر
تعطيل اشتراط الإشارة مع استمرار الحظر
- ضبط
groupPolicy="allowlist"دون قائمة سماح مطابقة للخادم/القناة - ضبط
requireMentionفي موضع خاطئ (يجب أن يكون ضمنchannels.discord.guildsأو إدخال قناة) - حظر المُرسِل بواسطة قائمة السماح
usersللخادم/القناة
استغراق تفاعلات Discord وقتًا طويلًا أو تكرار الردود
استغراق تفاعلات Discord وقتًا طويلًا أو تكرار الردود
Slow listener detected ...stuck session: sessionKey=agent:...:discord:... state=processing ...
- حساب واحد:
channels.discord.eventQueue.listenerTimeout - حسابات متعددة:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout - يتحكم هذا في عمل مستمع Discord Gateway فقط، وليس في مدة تفاعل الوكيل
تحذيرات انتهاء مهلة البحث عن بيانات Gateway الوصفية
تحذيرات انتهاء مهلة البحث عن بيانات Gateway الوصفية
/gateway/bot قبل الاتصال. عند حدوث إخفاقات عابرة، يُستخدم عنوان URL الافتراضي لـ Discord Gateway كخيار احتياطي، ويُحدّ من معدل تسجيل هذه الإخفاقات.إعدادات مهلة البيانات الوصفية:- حساب واحد:
channels.discord.gatewayInfoTimeoutMs - حسابات متعددة:
channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs - متغير البيئة الاحتياطي عند عدم ضبط الإعداد:
OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS - القيمة الافتراضية:
30000(30 ثانية)، والحد الأقصى:120000
إعادات التشغيل بسبب انتهاء مهلة READY في Gateway
إعادات التشغيل بسبب انتهاء مهلة READY في Gateway
READY من Discord Gateway أثناء بدء التشغيل وبعد عمليات إعادة الاتصال في وقت التشغيل. قد تحتاج إعدادات الحسابات المتعددة التي تستخدم تدرّج بدء التشغيل إلى نافذة READY أطول من القيمة الافتراضية أثناء بدء التشغيل.إعدادات مهلة READY:- بدء التشغيل لحساب واحد:
channels.discord.gatewayReadyTimeoutMs - بدء التشغيل لحسابات متعددة:
channels.discord.accounts.<accountId>.gatewayReadyTimeoutMs - متغير البيئة الاحتياطي لبدء التشغيل عند عدم ضبط الإعداد:
OPENCLAW_DISCORD_READY_TIMEOUT_MS - القيمة الافتراضية لبدء التشغيل:
15000(15 ثانية)، والحد الأقصى:120000 - وقت التشغيل لحساب واحد:
channels.discord.gatewayRuntimeReadyTimeoutMs - وقت التشغيل لحسابات متعددة:
channels.discord.accounts.<accountId>.gatewayRuntimeReadyTimeoutMs - متغير البيئة الاحتياطي لوقت التشغيل عند عدم ضبط الإعداد:
OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS - القيمة الافتراضية لوقت التشغيل:
30000(30 ثانية)، والحد الأقصى:120000
حالات عدم التطابق في تدقيق الأذونات
حالات عدم التطابق في تدقيق الأذونات
channels status --probe إلا مع معرّفات القنوات الرقمية.إذا استخدمت مفاتيح الأسماء المختصرة، فقد تظل المطابقة في وقت التشغيل تعمل، لكن الفحص لا يستطيع التحقق من الأذونات بالكامل.مشكلات الرسائل المباشرة والإقران
مشكلات الرسائل المباشرة والإقران
- الرسائل المباشرة معطّلة:
channels.discord.dm.enabled=false - سياسة الرسائل المباشرة معطّلة:
channels.discord.dmPolicy="disabled"(قديم:channels.discord.dm.policy) - انتظار الموافقة على الإقران في وضع
pairing
حلقات التواصل بين البوتات
حلقات التواصل بين البوتات
channels.discord.allowBots=true، فاستخدم قواعد صارمة للإشارة وقوائم السماح لتجنّب سلوك الحلقات.
يُفضّل استخدام channels.discord.allowBots="mentions" لقبول رسائل البوتات التي تشير إلى البوت فقط.يتضمن OpenClaw أيضًا حماية مشتركة من حلقات البوتات. كلما سمح allowBots بوصول الرسائل الصادرة عن البوتات إلى التوجيه، يحوّل Discord الحدث الوارد إلى حقائق (الحساب، القناة، زوج البوتات)، ويمنع حارس الأزواج العام الزوج بعد تجاوزه ميزانية الأحداث المضبوطة. يمنع الحارس حلقات البوتين المنفلتة التي كان لا بد سابقًا من إيقافها بواسطة حدود معدل Discord؛ ولا يؤثر في عمليات النشر التي تستخدم بوتًا واحدًا أو ردود البوت لمرة واحدة التي تبقى ضمن الميزانية.الإعدادات الافتراضية (تكون نشطة عند ضبط allowBots):maxEventsPerWindow: 20— يمكن لزوج البوتات تبادل 20 رسالة ضمن النافذة المنزلقةwindowSeconds: 60— طول النافذة المنزلقةcooldownSeconds: 60— بعد تجاوز الميزانية، تُسقط لمدة دقيقة كل رسالة إضافية بين البوتين في أي من الاتجاهين
channels.defaults.botLoopProtection، ثم تجاوز إعداد Discord عندما يحتاج سير عمل مشروع إلى هامش أكبر. ترتيب الأولوية هو:channels.discord.accounts.<account>.botLoopProtectionchannels.discord.botLoopProtectionchannels.defaults.botLoopProtection- القيم الافتراضية المضمّنة
maxEventsPerWindow وwindowSeconds وcooldownSeconds.انقطاع تحويل الصوت إلى نص مع DecryptionFailed(...)
انقطاع تحويل الصوت إلى نص مع DecryptionFailed(...)
- حافظ على تحديث OpenClaw (
openclaw update) لضمان توفر منطق استرداد استقبال صوت Discord - تأكّد من
channels.discord.voice.daveEncryption=true(القيمة الافتراضية) - ابدأ بالقيمة
channels.discord.voice.decryptionFailureTolerance=24(القيمة الافتراضية للمنبع)، ولا تعدّلها إلا عند الحاجة - راقب السجلات بحثًا عن:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- إذا استمرت الإخفاقات بعد إعادة الانضمام التلقائية، فاجمع السجلات وقارنها بسجل استقبال DAVE في المنبع ضمن discord.js #11419 وdiscord.js #11449
مرجع الإعدادات
المرجع الأساسي: مرجع الإعدادات - Discord.حقول Discord عالية الأهمية
حقول Discord عالية الأهمية
- بدء التشغيل/المصادقة:
enabled،token،applicationId،accounts.*،allowBots - السياسة:
groupPolicy،dmPolicy،allowFrom،dm.*،guilds.*،guilds.*.channels.* - الأوامر:
commands.native،commands.useAccessGroups(عام)،configWrites،slashCommand.ephemeral - طابور الأحداث:
eventQueue.listenerTimeout(ميزانية المستمع، القيمة الافتراضية120000)،eventQueue.maxQueueSize(القيمة الافتراضية10000)،eventQueue.maxConcurrency(القيمة الافتراضية50) - Gateway:
proxy،gatewayInfoTimeoutMs،gatewayReadyTimeoutMs،gatewayRuntimeReadyTimeoutMs - الرد/السجل:
replyToMode،historyLimit،dmHistoryLimit،dms.*.historyLimit - التسليم:
textChunkLimit(القيمة الافتراضية2000)،maxLinesPerMessage(القيمة الافتراضية17) - البث:
streaming.mode،streaming.chunkMode،streaming.preview.*،streaming.progress.*،streaming.block.*(يُرحّلopenclaw doctor --fixالمفاتيح المسطحة القديمةstreamModeوdraftChunkوblockStreamingوblockStreamingCoalesceوchunkModeإلىstreaming.*) - الوسائط/إعادة المحاولة:
mediaMaxMb(يضع حدًا أقصى لعمليات الرفع الصادرة إلى Discord، والقيمة الافتراضية100)،retry - الإجراءات:
actions.* - الحضور:
activity،status،activityType،activityUrl،autoPresence.* - واجهة المستخدم:
ui.components.accentColor - الميزات:
threadBindings، وbindings[]في المستوى الأعلى (type: "acp")، وpluralkit، وexecApprovals، وintents، وagentComponents.enabled، وagentComponents.ttlMs، وheartbeat، وresponsePrefix
السلامة والتشغيل
- تعامل مع رموز البوت بوصفها أسرارًا (يُفضّل
DISCORD_BOT_TOKENفي البيئات الخاضعة للإشراف). - امنح أذونات Discord وفق مبدأ أقل قدر من الامتيازات.
- إذا كانت حالة نشر الأوامر/حالَتها قديمة، فأعد تشغيل Gateway ثم أعد التحقق باستخدام
openclaw channels status --probe.