الاقتران
أوامر الشرطة المائلة
استكشاف أخطاء القنوات وإصلاحها
الإعداد السريع
ستحتاج إلى إنشاء تطبيق جديد مع بوت، وإضافة البوت إلى خادمك، وإقرانه مع OpenClaw. نوصي بإضافة البوت إلى خادمك الخاص. إذا لم يكن لديك خادم بعد، أنشئ واحدًا أولًا (اختر Create My Own > For me and my friends).إنشاء تطبيق Discord وبوت
تفعيل النوايا ذات الامتيازات
- Message Content Intent (مطلوب)
- Server Members Intent (موصى به؛ مطلوب لقوائم السماح بالأدوار ومطابقة الاسم بالمعرّف)
- Presence Intent (اختياري؛ مطلوب فقط لتحديثات الحضور)
نسخ رمز البوت
إنشاء عنوان URL للدعوة وإضافة البوت إلى خادمك
botapplications.commands
- عرض القنوات
- إرسال الرسائل
- قراءة سجل الرسائل
- تضمين الروابط
- إرفاق الملفات
- إضافة التفاعلات (اختياري)
تفعيل وضع المطور وجمع معرّفاتك
- انقر على User Settings (أيقونة الترس بجانب صورتك الرمزية) ← مرّر إلى Developer في الشريط الجانبي ← فعّل Developer Mode (ملاحظة: في تطبيق Discord للجوال، يوجد وضع المطور تحت App Settings ← Advanced)
- انقر بزر الماوس الأيمن على أيقونة الخادم في الشريط الجانبي ← Copy Server ID
- انقر بزر الماوس الأيمن على صورتك الرمزية ← Copy User ID
السماح بالرسائل المباشرة من أعضاء الخادم
تعيين رمز البوت بأمان (لا ترسله في المحادثة)
openclaw gateway run وإعادة تشغيلها.
لتثبيتات الخدمة المُدارة، شغّل openclaw gateway install من صدفة يكون فيها DISCORD_BOT_TOKEN موجودًا، أو خزّن المتغير في ~/.openclaw/.env، حتى تتمكن الخدمة من حل SecretRef الخاص بالبيئة بعد إعادة التشغيل.
إذا كان مضيفك محظورًا أو محدود المعدل بسبب بحث تطبيق بدء التشغيل في Discord، فعيّن معرّف تطبيق/عميل Discord من بوابة المطورين حتى يتمكن بدء التشغيل من تخطي استدعاء REST هذا. استخدم channels.discord.applicationId للحساب الافتراضي، أو channels.discord.accounts.<accountId>.applicationId عند تشغيل عدة بوتات Discord.تكوين OpenClaw والاقتران
- اسأل وكيلك
- CLI / config
“لقد عيّنت بالفعل رمز بوت Discord الخاص بي في التكوين. يُرجى إكمال إعداد Discord باستخدام User ID<user_id>وServer ID<server_id>.”
الموافقة على أول اقتران عبر رسالة مباشرة
- اسأل وكيلك
- CLI
“وافق على رمز اقتران Discord هذا: <CODE>”
DISCORD_BOT_TOKEN للحساب الافتراضي فقط.
إذا تم حل حسابين مفعّلين في Discord إلى رمز البوت نفسه، يبدأ OpenClaw مراقب Gateway واحدًا فقط لذلك الرمز. يتفوق الرمز المأخوذ من التكوين على احتياطي البيئة الافتراضي؛ وإلا يفوز أول حساب مفعّل ويتم الإبلاغ عن تعطيل الحساب المكرر.
للاستدعاءات الصادرة المتقدمة (إجراءات أداة الرسائل/القنوات)، يُستخدم token صريح لكل استدعاء لذلك الاستدعاء. ينطبق هذا على إجراءات الإرسال والقراءة/التحقق مثل (على سبيل المثال read/search/fetch/thread/pins/permissions). لا تزال إعدادات سياسة الحساب/إعادة المحاولة تأتي من الحساب المحدد في لقطة وقت التشغيل النشطة.موصى به: إعداد مساحة عمل للخادم
بعد أن تعمل الرسائل المباشرة، يمكنك إعداد خادم Discord الخاص بك كمساحة عمل كاملة حيث تحصل كل قناة على جلسة وكيل خاصة بها وسياق خاص بها. يُوصى بهذا للخوادم الخاصة التي تكون لك أنت وبوتك فقط.إضافة خادمك إلى قائمة السماح للخوادم
- اسأل وكيلك
- التكوين
“أضف Discord Server ID الخاص بي <server_id> إلى قائمة السماح للخوادم”
السماح بالردود بدون @mention
messages.groupChat.visibleReplies: "message_tool" حتى يتمكن الوكيل من الترقب والنشر فقط عندما يقرر أن الرد في القناة مفيد. يعمل هذا بأفضل شكل مع أحدث جيل من النماذج الموثوقة في الأدوات مثل GPT 5.5. تبقى أحداث الغرفة المحيطة صامتة ما لم ترسل الأداة. راجع أحداث الغرفة المحيطة للتكوين الكامل لوضع الترقب.إذا عرض Discord الكتابة وأظهرت السجلات استخدام الرمز المميز ولكن لم تُنشر أي رسالة، فتحقق مما إذا كانت الدورة مكوّنة كحدث غرفة محيط أو اختارت الردود المرئية عبر أداة الرسائل.- اسأل وكيلك
- التكوين
“اسمح لوكيلي بالرد على هذا الخادم دون الحاجة إلى @ذكره”
#coding أو #home أو #research أو أي شيء يناسب سير عملك.
نموذج وقت التشغيل
- يملك Gateway اتصال Discord.
- توجيه الردود حتمي: تعود الردود الواردة من Discord إلى Discord.
- تُضاف بيانات تعريف خادم/قناة Discord إلى مطالبة النموذج كسياق غير موثوق به، لا كبادئة رد مرئية للمستخدم. إذا نسخ النموذج ذلك الغلاف مرة أخرى، يزيل OpenClaw بيانات التعريف المنسوخة من الردود الصادرة ومن سياق إعادة التشغيل المستقبلي.
- افتراضيًا (
session.dmScope=main)، تشارك المحادثات المباشرة جلسة الوكيل الرئيسية (agent:main:main). - تُعزل قنوات الخادم في مفاتيح جلسات (
agent:<agentId>:discord:channel:<channelId>). - تُتجاهل رسائل DM الجماعية افتراضيًا (
channels.discord.dm.groupEnabled=false). - تعمل أوامر الشرطة المائلة الأصلية في جلسات أوامر معزولة (
agent:<agentId>:discord:slash:<userId>)، مع الاستمرار في حملCommandTargetSessionKeyإلى جلسة المحادثة الموجّهة. - يستخدم تسليم إعلانات cron/Heartbeat النصية فقط إلى Discord الإجابة النهائية المرئية للمساعد مرة واحدة. وتبقى حمولات الوسائط والمكوّنات المنظمة متعددة الرسائل عندما يصدر الوكيل عدة حمولات قابلة للتسليم.
قنوات المنتديات
لا تقبل قنوات المنتديات والوسائط في Discord إلا منشورات السلاسل. يدعم OpenClaw طريقتين لإنشائها:- أرسل رسالة إلى أصل المنتدى (
channel:<forumId>) لإنشاء سلسلة تلقائيًا. يستخدم عنوان السلسلة أول سطر غير فارغ من رسالتك. - استخدم
openclaw message thread createلإنشاء سلسلة مباشرة. لا تمرر--message-idلقنوات المنتديات.
channel:<threadId>).
المكوّنات التفاعلية
يدعم OpenClaw حاويات مكوّنات Discord v2 لرسائل الوكيل. استخدم أداة الرسائل مع حمولة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 لتغيير عمر سجل الاستدعاءات هذا لحساب Discord الافتراضي، أو channels.discord.accounts.<accountId>.agentComponents.ttlMs لتجاوز حساب واحد في إعداد متعدد الحسابات. القيمة بالمللي ثانية، ويجب أن تكون عددًا صحيحًا موجبًا، ومحددة بسقف 86400000 (24 ساعة). تفيد مدد TTL الأطول في سير عمل المراجعة أو الموافقة التي تحتاج إلى أن تبقى الأزرار قابلة للاستخدام، لكنها توسّع أيضًا النافذة التي يمكن فيها لرسالة Discord قديمة أن تظل قادرة على تشغيل إجراء. فضّل أقصر TTL يناسب سير العمل، واحتفظ بالقيمة الافتراضية عندما تكون الاستدعاءات القديمة مفاجئة.
تفتح أوامر الشرطة المائلة /model و/models منتقي نماذج تفاعليًا يتضمن قوائم منسدلة للموفّر، والنموذج، ووقت التشغيل المتوافق، إضافة إلى خطوة إرسال. أصبح /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 زر تشغيل تلقائيًا
التحكم في الوصول والتوجيه
- سياسة DM
- مجموعات الوصول
- سياسة الخادم
- الإشارات ورسائل DM الجماعية
channels.discord.dmPolicy في الوصول عبر DM. تُعد channels.discord.allowFrom قائمة السماح الأساسية للـ DM.pairing(الافتراضي)allowlistopen(يتطلب أن تتضمن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 عندما يمكنه فعل ذلك من دون تغيير الوصول.تنسيق هدف DM للتسليم:user:<id>- إشارة
<@id>
allowFrom الفعالة للـ DM في الحساب تُعامل كأهداف DM لمستخدمين لأجل التوافق.توجيه الوكلاء المستند إلى الأدوار
استخدم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
تفاصيل الميزة
وسوم الردود والردود الأصلية
وسوم الردود والردود الأصلية
[[reply_to_current]][[reply_to:<id>]]
channels.discord.replyToMode:off(افتراضي)firstallbatched
off ربط الردود الضمني كسلاسل. ولا تزال وسوم [[reply_to_*]] الصريحة محترمة.
يرفق first دائمًا مرجع الرد الأصلي الضمني بأول رسالة Discord صادرة في الدور.
يرفق batched مرجع الرد الأصلي الضمني في Discord فقط عندما يكون
الحدث الوارد دفعة مؤجلة من رسائل متعددة. يكون هذا مفيدًا
عندما تريد الردود الأصلية أساسًا للمحادثات المتدفقة الملتبسة، وليس لكل
دور ذي رسالة واحدة.تظهر معرّفات الرسائل في السياق/السجل حتى يتمكن الوكلاء من استهداف رسائل محددة.معاينات الروابط
معاينات الروابط
channels.discord.accounts.<id>.suppressEmbeds لتجاوز حساب واحد. ويمكن لعمليات الإرسال عبر أداة رسائل الوكيل أيضًا تمرير suppressEmbeds: false لرسالة واحدة. لا تُكبت حمولات embeds الصريحة في Discord بواسطة إعداد معاينة الروابط الافتراضي.معاينة البث المباشر
معاينة البث المباشر
channels.discord.streaming القيم off | partial | block | progress (افتراضي). يحتفظ progress بمسودة حالة واحدة قابلة للتحرير ويحدّثها بتقدم الأدوات حتى التسليم النهائي؛ وتكون تسمية البداية المشتركة سطرًا متحركًا، لذلك تمر بعيدًا مثل الباقي عندما يظهر عمل كافٍ. streamMode اسم بديل قديم لوقت التشغيل. شغّل openclaw doctor --fix لإعادة كتابة الإعدادات المحفوظة إلى المفتاح القياسي.عيّن channels.discord.streaming.mode إلى off لتعطيل تعديلات معاينة Discord. إذا كان بث الكتل في Discord مفعّلًا صراحةً، يتخطى OpenClaw بث المعاينة لتجنب البث المزدوج.- يحرر
partialرسالة معاينة واحدة مع وصول الرموز. - يصدر
blockأجزاء بحجم المسودة (استخدمdraftChunkلضبط الحجم ونقاط القطع، مع تقييدها بـtextChunkLimit). - تلغي النتائج النهائية للوسائط والأخطاء والردود الصريحة تعديلات المعاينة المعلقة.
- يتحكم
streaming.preview.toolProgress(افتراضيًاtrue) فيما إذا كانت تحديثات الأداة/التقدم تعيد استخدام رسالة المعاينة. - تُعرض صفوف الأداة/التقدم كرمز تعبيري مضغوط + عنوان + تفاصيل عند توفرها، مثل
🛠️ Bash: run testsأو🔎 Web Search: for "query". - يفعّل
streaming.progress.commentary(افتراضيًاfalse) نص تعليق/تمهيد المساعد في مسودة التقدم المؤقتة. يُنظف التعليق قبل العرض، ويبقى عابرًا، ولا يغيّر تسليم الإجابة النهائية. - يتحكم
streaming.progress.maxLineCharsفي ميزانية معاينة التقدم لكل سطر. يُختصر النثر عند حدود الكلمات؛ وتحتفظ تفاصيل الأوامر والمسارات باللواحق المفيدة. - يتحكم
streaming.preview.commandText/streaming.progress.commandTextفي تفاصيل الأمر/التنفيذ ضمن أسطر التقدم المضغوطة:raw(افتراضي) أوstatus(تسمية الأداة فقط).
block مفعّلًا صراحةً، يتخطى OpenClaw بث المعاينة لتجنب البث المزدوج.السجل والسياق وسلوك السلاسل
السجل والسياق وسلوك السلاسل
- القيمة الافتراضية لـ
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". - تتم ترحيل مفاتيح
spawnSubagentSessions/spawnAcpSessionsالمهملة بواسطةopenclaw doctor --fix. - إذا كانت ارتباطات السلاسل معطّلة لحساب ما، فلن تكون
/focusوعمليات ربط السلاسل ذات الصلة متاحة.
ارتباطات قنوات ACP المستمرة
ارتباطات قنوات ACP المستمرة
bindings[]معtype: "acp"وmatch.channel: "discord"
- يربط
/acp spawn codex --bind hereالقناة أو السلسلة الحالية في مكانها ويبقي الرسائل المستقبلية على جلسة ACP نفسها. ترث رسائل السلاسل ارتباط القناة الأصل. - في قناة أو سلسلة مرتبطة، يعيد
/newو/resetضبط جلسة ACP نفسها في مكانها. يمكن لارتباطات السلاسل المؤقتة تجاوز حل الهدف أثناء نشاطها. - يتحكم
spawnSessionsفي إنشاء/ربط السلاسل الفرعية عبر--thread auto|here.
إشعارات التفاعلات
إشعارات التفاعلات
offown(افتراضي)allallowlist(يستخدمguilds.<id>.users)
تفاعلات الإقرار
تفاعلات الإقرار
ackReaction رمزًا تعبيريًا للإقرار أثناء معالجة OpenClaw لرسالة واردة.ترتيب الحل:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- احتياطي الرمز التعبيري لهوية الوكيل (
agents.list[].identity.emoji، وإلا ”👀”)
- يقبل Discord رموز Unicode التعبيرية أو أسماء الرموز التعبيرية المخصصة.
- استخدم
""لتعطيل التفاعل لقناة أو حساب.
كتابات الإعدادات
كتابات الإعدادات
/config set|unset (عندما تكون ميزات الأوامر مفعّلة).التعطيل:وكيل Gateway
وكيل Gateway
channels.discord.proxy.
توكيل WebSocket الخاص بـ Discord Gateway صريح؛ لا ترث اتصالات WebSocket متغيرات بيئة الوكيل المحيطة من عملية Gateway. تستخدم عمليات بحث REST عند بدء التشغيل هذا الوكيل عند ضبط channels.discord.proxy.PluralKit support
PluralKit support
- يمكن لقوائم السماح استخدام
pk:<memberId> - تتم مطابقة أسماء عرض الأعضاء بالاسم/الاسم المختصر فقط عندما تكون
channels.discord.dangerouslyAllowNameMatching: true - تستخدم عمليات البحث معرّف الرسالة الأصلي وتكون مقيّدة بنافذة زمنية
- إذا فشل البحث، تُعامل الرسائل الموكّلة كرسائل بوت ويتم إسقاطها ما لم تكن
allowBots=true
Outbound mention aliases
Outbound mention aliases
mentionAliases عندما تحتاج الوكلاء إلى إشارات صادرة حتمية لمستخدمي Discord المعروفين. المفاتيح هي المعرّفات دون علامة @ البادئة؛ والقيم هي معرّفات مستخدمي Discord. تُترك المعرّفات غير المعروفة، و@everyone، و@here، والإشارات داخل مقاطع كود Markdown دون تغيير.Presence configuration
Presence configuration
- 0: تشغيل
- 1: بث (يتطلب
activityUrl) - 2: استماع
- 3: مشاهدة
- 4: مخصص (يستخدم نص النشاط كحالة؛ الرمز التعبيري اختياري)
- 5: تنافس
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(يدعم العنصر النائب{reason})
Approvals in Discord
Approvals in 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 DM أولًا عندما يكون للمالك المستدعي مسار مالك في 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.*.
سلوك البوابة الافتراضي:
| مجموعة الإجراءات | الافتراضي |
|---|---|
| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | مفعّل |
| roles | معطّل |
| moderation | معطّل |
| presence | معطّل |
واجهة مستخدم Components v2
يستخدم OpenClaw مكوّنات Discord v2 لموافقات التنفيذ وعلامات السياقات المتقاطعة. يمكن لإجراءات رسائل 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عند وجود مكوّنات v2. - يتم كبت معاينات URL العادية افتراضيًا. اضبط
suppressEmbeds: falseعلى إجراء رسالة عندما ينبغي توسيع رابط صادر واحد.
الصوت
لدى Discord سطحان صوتيان متميزان: قنوات صوتية فورية (محادثات مستمرة) ومرفقات رسائل صوتية (تنسيق معاينة الموجة). يدعم Gateway كليهما.القنوات الصوتية
قائمة إعداد:- فعّل Message Content Intent في بوابة مطوري Discord.
- فعّل 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 الأخرى.
- يتجاوز
voice.ttsإعدادmessages.ttsلتشغيل الصوت فيstt-ttsفقط. تستخدم أوضاع الوقت الفعليvoice.realtime.speakerVoice. - يتحكم
voice.modeفي مسار المحادثة. الوضع الافتراضي هوagent-proxy: تتولى واجهة صوتية أمامية في الوقت الفعلي توقيت الدور، والمقاطعة، والتشغيل، وتفوّض العمل الجوهري إلى وكيل OpenClaw الموجّه عبرopenclaw_agent_consult، وتتعامل مع النتيجة كموجّه Discord مكتوب من ذلك المتحدث. يحافظstt-ttsعلى تدفق 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، يستخدم STTtools.media.audio؛ ولا يؤثرvoice.modelفي النسخ. - في أوضاع الوقت الفعلي، تضبط
voice.realtime.providerوvoice.realtime.modelوvoice.realtime.speakerVoiceجلسة الصوت في الوقت الفعلي. لاستخدام OpenAI Realtime 2 مع عقل Codex، استخدمvoice.realtime.model: "gpt-realtime-2"وvoice.model: "openai/gpt-5.5". - تتضمن أوضاع الصوت في الوقت الفعلي ملفات ملف تعريف صغيرة
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غير مضبوط، يستخدم OpenClawnameللوكيل الموجّه بالإضافة إلىOpenClaw، مع الرجوع إلى معرف الوكيل بالإضافة إلىOpenClaw. يعطل شرط اسم التنبيه الاستجابة التلقائية لمزود الوقت الفعلي، ويوجّه الأدوار المقبولة عبر مسار استشارة وكيل OpenClaw، ويعطي إقراراً صوتياً قصيراً عند التعرف على اسم تنبيه بادئ من نسخ جزئي قبل وصول النسخة النهائية. - يقبل مزود OpenAI في الوقت الفعلي أسماء أحداث Realtime 2 الحالية والأسماء المستعارة القديمة المتوافقة مع Codex لأحداث صوت الإخراج والنص المنسوخ، بحيث يمكن أن تنحرف لقطات المزود المتوافقة دون إسقاط صوت المساعد.
- يتحكم
voice.realtime.bargeInفيما إذا كانت أحداث بدء متحدث Discord تقاطع تشغيل الوقت الفعلي النشط. إذا كان غير مضبوط، فإنه يتبع إعداد مقاطعة صوت الإدخال لمزود الوقت الفعلي. - يتحكم
voice.realtime.minBargeInAudioEndMsفي الحد الأدنى لمدة تشغيل المساعد قبل أن يقتطع تداخل OpenAI في الوقت الفعلي الصوت. الافتراضي:250. اضبطه على0للمقاطعة الفورية في الغرف منخفضة الصدى، أو ارفعه لإعدادات مكبرات الصوت كثيرة الصدى. - لاستخدام صوت OpenAI في تشغيل Discord، اضبط
voice.tts.provider: "openai"واختر صوت Text-to-speech ضمنvoice.tts.providers.openai.speakerVoice. يُعدcedarخياراً جيداً ذا وقع ذكوري في نموذج OpenAI TTS الحالي. - تنطبق تجاوزات
systemPromptلكل قناة في Discord على أدوار النص المنسوخ الصوتية لتلك القناة الصوتية. - تستمد أدوار النص المنسوخ الصوتية حالة المالك من
allowFromفي Discord (أوdm.allowFrom) للأوامر وإجراءات القنوات المقيدة بالمالك. تتبع مرئية أدوات الوكيل سياسة الأدوات المضبوطة للجلسة الموجّهة. - صوت Discord اختياري لإعدادات النص فقط؛ اضبط
channels.discord.voice.enabled=true(أو احتفظ بكتلةchannels.discord.voiceموجودة) لتمكين أوامر/vc، وبيئة تشغيل الصوت، وهدف GatewayGuildVoiceStates. - يمكن لـ
channels.discord.intents.voiceStatesتجاوز اشتراك هدف حالة الصوت صراحةً. اتركه غير مضبوط ليتبع الهدف التمكين الصوتي الفعلي. - إذا كان لدى
voice.autoJoinعدة إدخالات للنقابة نفسها، ينضم OpenClaw إلى آخر قناة مضبوطة لتلك النقابة. voice.allowedChannelsهي قائمة سماح إقامة اختيارية. اتركها غير مضبوطة للسماح لـ/vc joinبالدخول إلى أي قناة صوت Discord مخوّلة. عند ضبطها، تُقيَّد/vc joinوالانضمام التلقائي عند بدء التشغيل وانتقالات حالة صوت البوت إلى إدخالات{ guildId, channelId }المدرجة. اضبطها على مصفوفة فارغة لرفض كل انضمامات صوت Discord. إذا نقل Discord البوت إلى خارج قائمة السماح، يغادر OpenClaw تلك القناة ويعيد الانضمام إلى هدف الانضمام التلقائي المضبوط عند توفره.- يمرر
voice.daveEncryptionوvoice.decryptionFailureToleranceإلى خيارات انضمام@discordjs/voice. - افتراضيات
@discordjs/voiceهيdaveEncryption=trueوdecryptionFailureTolerance=24إذا كانت غير مضبوطة. - يستخدم OpenClaw مرمّز
libopus-wasmالمضمّن لاستقبال صوت Discord وتشغيل PCM الخام في الوقت الفعلي. يشحن بناء WebAssembly مثبتاً من libopus ولا يتطلب إضافات opus أصلية. - يتحكم
voice.connectTimeoutMsفي انتظار Ready الأولي لـ@discordjs/voiceلمحاولات/vc joinوالانضمام التلقائي. الافتراضي:30000. - يتحكم
voice.reconnectGraceMsفي مدة انتظار OpenClaw لجلسة صوت منقطعة حتى تبدأ إعادة الاتصال قبل تدميرها. الافتراضي:15000. - في وضع
stt-tts، لا يتوقف تشغيل الصوت لمجرد أن مستخدماً آخر بدأ الكلام. لتجنب حلقات التغذية الراجعة، يتجاهل OpenClaw التقاط الصوت الجديد أثناء تشغيل TTS؛ تحدث بعد انتهاء التشغيل للدور التالي. تمرر أوضاع الوقت الفعلي بدايات المتحدثين كإشارات تداخل إلى مزود الوقت الفعلي. - في أوضاع الوقت الفعلي، يمكن أن يبدو الصدى من مكبرات الصوت إلى ميكروفون مفتوح كتداخل ويقاطع التشغيل. لغرف Discord كثيرة الصدى، اضبط
voice.realtime.providers.openai.interruptResponseOnInputAudio: falseلمنع OpenAI من المقاطعة التلقائية عند صوت الإدخال. أضفvoice.realtime.bargeIn: trueإذا كنت لا تزال تريد أن تقاطع أحداث بدء متحدث Discord التشغيل النشط. يتجاهل جسر OpenAI في الوقت الفعلي اقتطاعات التشغيل الأقصر منvoice.realtime.minBargeInAudioEndMsباعتبارها صدى/ضجيجاً محتملاً ويسجلها كمتخطاة بدلاً من مسح تشغيل Discord. - يتحكم
voice.captureSilenceGraceMsفي مدة انتظار OpenClaw بعد أن يبلّغ Discord عن توقف متحدث قبل إنهاء ذلك المقطع الصوتي لـ STT. الافتراضي:2000؛ ارفع هذا إذا كان Discord يقسم الوقفات العادية إلى نصوص جزئية متقطعة. - عندما يكون ElevenLabs هو مزود TTS المحدد، يستخدم تشغيل صوت Discord بث TTS ويبدأ من تدفق استجابة المزود. تعود المزودات التي لا تدعم البث إلى مسار الملف المؤقت المصطنع.
- يراقب OpenClaw أيضاً فشل فك تشفير الاستقبال ويتعافى تلقائياً بمغادرة القناة الصوتية وإعادة الانضمام إليها بعد إخفاقات متكررة في نافذة قصيرة.
- إذا أظهرت سجلات الاستقبال مراراً
DecryptionFailed(UnencryptedWhenPassthroughDisabled)بعد التحديث، فاجمع تقرير تبعية وسجلات. يتضمن سطر@discordjs/voiceالمضمّن إصلاح الحشو الصاعد من PR #11449 في discord.js، الذي أغلق issue #11419 في discord.js. - أحداث استقبال
The operation was abortedمتوقعة عندما ينهي OpenClaw مقطع متحدث ملتقطاً؛ وهي تشخيصات مسهبة، لا تحذيرات. - تتضمن سجلات صوت Discord المسهبة معاينة محدودة بسطر واحد لنص STT المنسوخ لكل مقطع متحدث مقبول، بحيث يُظهر التصحيح كلاً من جانب المستخدم وجانب رد الوكيل دون تفريغ نص منسوخ غير محدود.
- في وضع
agent-proxy، يتخطى رجوع الاستشارة المفروضة أجزاء النص المنسوخ التي تبدو غير مكتملة، مثل النص المنتهي بـ...أو رابط لاحق مثلand، إضافة إلى الخواتيم الواضحة غير القابلة للتنفيذ مثل “سأعود حالاً” أو “إلى اللقاء”. تعرض السجلات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تحويل الكلام إلى نص، مثل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 الجديدة كتحكم مباشر في التشغيل قبل بدء دورة وكيل أخرى. تصنف عبارات مثل “status” أو “cancel that” أو “use the smaller fix” أو “when you’re done also check tests” كإدخال حالة أو إلغاء أو توجيه أو متابعة للجلسة النشطة. يتم نطق نتائج الحالة والإلغاء والتوجيه المقبول والمتابعة داخل القناة الصوتية حتى يعرف المتصل ما إذا كان 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 أو VAD الخاص بالمزود أبلغ عن كلام، لكن لم يكن لدى OpenClaw تشغيل نشط لمقاطعته. لا ينبغي أن يؤدي هذا إلى قطع الصوت.
voice.model، ومصادقة STT لـ tools.media.audio، ومصادقة TTS لـ messages.tts/voice.tts، ومصادقة مزود الوقت الفعلي لـ voice.realtime.providers أو إعداد مصادقة المزود العادي.
الرسائل الصوتية
تعرض الرسائل الصوتية في Discord معاينة موجية وتتطلب صوت OGG/Opus. ينشئ OpenClaw الموجة تلقائيا، لكنه يحتاج إلىffmpeg وffprobe على مضيف Gateway للفحص والتحويل.
- وفّر مسار ملف محليًا (تُرفض عناوين URL).
- احذف محتوى النص (يرفض Discord النص + الرسالة الصوتية في الحمولة نفسها).
- يُقبل أي تنسيق صوتي؛ يحوّل OpenClaw إلى OGG/Opus عند الحاجة.
استكشاف الأخطاء وإصلاحها
استخدام intents غير مسموح بها أو أن البوت لا يرى رسائل guild
استخدام intents غير مسموح بها أو أن البوت لا يرى رسائل guild
- فعّل Message Content Intent
- فعّل Server Members Intent عندما تعتمد على حل المستخدم/العضو
- أعد تشغيل gateway بعد تغيير intents
حظر رسائل guild بشكل غير متوقع
حظر رسائل guild بشكل غير متوقع
- تحقق من
groupPolicy - تحقق من allowlist الخاصة بـ guild ضمن
channels.discord.guilds - إذا كانت خريطة
channelsالخاصة بـ guild موجودة، فلن يُسمح إلا بالقنوات المدرجة - تحقق من سلوك
requireMentionوأنماط الإشارة
Require mention false لكن ما زال الحظر قائمًا
Require mention false لكن ما زال الحظر قائمًا
groupPolicy="allowlist"بدون allowlist مطابقة لـ guild/channel- تكوين
requireMentionفي المكان الخطأ (يجب أن يكون ضمنchannels.discord.guildsأو إدخال القناة) - حظر المرسل بواسطة allowlist الخاصة بـ guild/channel
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 - بديل env عند عدم تعيين التكوين:
OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS - الافتراضي:
30000(30 ثانية)، الحد الأقصى:120000
إعادة التشغيل بسبب انتهاء مهلة Gateway READY
إعادة التشغيل بسبب انتهاء مهلة Gateway READY
READY أثناء بدء التشغيل وبعد إعادة اتصال وقت التشغيل. قد تحتاج إعدادات الحسابات المتعددة ذات التدرج في بدء التشغيل إلى نافذة READY أطول من الافتراضية عند بدء التشغيل.مفاتيح ضبط مهلة READY:- بدء التشغيل لحساب واحد:
channels.discord.gatewayReadyTimeoutMs - بدء التشغيل لعدة حسابات:
channels.discord.accounts.<accountId>.gatewayReadyTimeoutMs - بديل env لبدء التشغيل عند عدم تعيين التكوين:
OPENCLAW_DISCORD_READY_TIMEOUT_MS - افتراضي بدء التشغيل:
15000(15 ثانية)، الحد الأقصى:120000 - وقت التشغيل لحساب واحد:
channels.discord.gatewayRuntimeReadyTimeoutMs - وقت التشغيل لعدة حسابات:
channels.discord.accounts.<accountId>.gatewayRuntimeReadyTimeoutMs - بديل env لوقت التشغيل عند عدم تعيين التكوين:
OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS - افتراضي وقت التشغيل:
30000(30 ثانية)، الحد الأقصى:120000
عدم تطابق تدقيق الأذونات
عدم تطابق تدقيق الأذونات
channels status --probe فقط مع معرّفات القنوات الرقمية.إذا استخدمت مفاتيح slug، فقد تظل المطابقة في وقت التشغيل تعمل، لكن probe لا يمكنه التحقق الكامل من الأذونات.مشكلات DM والاقتران
مشكلات DM والاقتران
- DM معطّل:
channels.discord.dm.enabled=false - سياسة DM معطّلة:
channels.discord.dmPolicy="disabled"(قديم:channels.discord.dm.policy) - انتظار موافقة الاقتران في وضع
pairing
حلقات البوت إلى البوت
حلقات البوت إلى البوت
channels.discord.allowBots=true، فاستخدم قواعد إشارة وallowlist صارمة لتجنب سلوك الحلقات.
يُفضّل استخدام channels.discord.allowBots="mentions" لقبول رسائل البوتات التي تشير إلى البوت فقط.يوفّر OpenClaw أيضًا حماية حلقات البوت المشتركة. كلما سمح allowBots للرسائل المنشأة بواسطة البوتات بالوصول إلى الإرسال، يربط Discord الحدث الوارد بحقائق (account, channel, bot pair)، ويقوم حارس الأزواج العام بكبت الزوج بعد تجاوزه ميزانية الأحداث المكوّنة. يمنع الحارس حلقات البوتين المنفلتة التي كان يجب إيقافها سابقًا بواسطة حدود معدل 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 العامة.إسقاطات STT الصوتية مع DecryptionFailed(...)
إسقاطات STT الصوتية مع DecryptionFailed(...)
- أبقِ OpenClaw محدثًا (
openclaw update) حتى تكون منطقية استعادة استقبال صوت Discord موجودة - تأكد من
channels.discord.voice.daveEncryption=true(الافتراضي) - ابدأ من
channels.discord.voice.decryptionFailureTolerance=24(افتراضي upstream) واضبط فقط عند الحاجة - راقب السجلات بحثًا عن:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- إذا استمرت حالات الفشل بعد إعادة الانضمام التلقائية، فاجمع السجلات وقارنها بسجل استقبال DAVE في upstream ضمن discord.js #11419 وdiscord.js #11449
مرجع التكوين
المرجع الأساسي: مرجع التكوين - Discord.حقول Discord عالية الإشارة
حقول Discord عالية الإشارة
- بدء التشغيل/المصادقة:
enabled,token,accounts.*,allowBots - السياسة:
groupPolicy,dm.*,guilds.*,guilds.*.channels.* - الأمر:
commands.native,commands.useAccessGroups,configWrites,slashCommand.* - طابور الأحداث:
eventQueue.listenerTimeout(ميزانية المستمع)،eventQueue.maxQueueSize,eventQueue.maxConcurrency - Gateway:
gatewayInfoTimeoutMs,gatewayReadyTimeoutMs,gatewayRuntimeReadyTimeoutMs - الرد/السجل:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - التسليم:
textChunkLimit,chunkMode,maxLinesPerMessage - البث:
streaming(اسم بديل قديم:streamMode)،streaming.preview.toolProgress,draftChunk,blockStreaming,blockStreamingCoalesce - الوسائط/إعادة المحاولة:
mediaMaxMb(يحد تحميلات Discord الصادرة، الافتراضي100MB)،retry - الإجراءات:
actions.* - الحضور:
activity,status,activityType,activityUrl - UI:
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.