Mainstream messaging
Discord
جاهز للرسائل المباشرة وقنوات النقابة عبر Gateway الرسمي لـ Discord.
تُضبط رسائل Discord المباشرة افتراضيًا على وضع الإقران.
سلوك الأوامر الأصلي وفهرس الأوامر.
تشخيصات متعددة القنوات ومسار الإصلاح.
الإعداد السريع
ستحتاج إلى إنشاء تطبيق جديد مع روبوت، وإضافة الروبوت إلى خادمك، وإقرانه بـ OpenClaw. نوصي بإضافة روبوتك إلى خادمك الخاص. إذا لم يكن لديك واحد بعد، أنشئ واحدًا أولًا (اختر Create My Own > For me and my friends).
إنشاء تطبيق وروبوت Discord
انتقل إلى Discord Developer Portal وانقر على New Application. سمّه شيئًا مثل "OpenClaw".
انقر على Bot في الشريط الجانبي. اضبط Username على الاسم الذي تطلقه على وكيل OpenClaw لديك.
تمكين النوايا ذات الامتيازات
وأنت ما زلت في صفحة Bot، مرّر لأسفل إلى Privileged Gateway Intents ومكّن:
- Message Content Intent (مطلوب)
- Server Members Intent (موصى به؛ مطلوب لقوائم السماح بالأدوار ومطابقة الاسم بالمعرّف)
- Presence Intent (اختياري؛ مطلوب فقط لتحديثات الحضور)
نسخ رمز الروبوت
مرّر للأعلى مرة أخرى في صفحة Bot وانقر على Reset Token.
انسخ الرمز واحفظه في مكان ما. هذا هو Bot Token الخاص بك وستحتاج إليه بعد قليل.
إنشاء عنوان URL للدعوة وإضافة الروبوت إلى خادمك
انقر على OAuth2 في الشريط الجانبي. ستنشئ عنوان URL للدعوة بالصلاحيات المناسبة لإضافة الروبوت إلى خادمك.
مرّر لأسفل إلى OAuth2 URL Generator ومكّن:
botapplications.commands
سيظهر قسم Bot Permissions أدناه. مكّن على الأقل:
الأذونات العامة
- عرض القنوات أذونات النص
- إرسال الرسائل
- قراءة سجل الرسائل
- تضمين الروابط
- إرفاق الملفات
- إضافة التفاعلات (اختياري)
هذه هي المجموعة الأساسية للقنوات النصية العادية. إذا كنت تخطط للنشر في سلاسل Discord، بما في ذلك سير عمل قنوات المنتدى أو الوسائط التي تنشئ سلسلة أو تتابعها، فمكّن أيضًا Send Messages in Threads. انسخ عنوان URL الذي تم إنشاؤه في الأسفل، والصقه في متصفحك، وحدد خادمك، ثم انقر على Continue للاتصال. يجب أن ترى الآن روبوتك في خادم Discord.
تمكين وضع المطور وجمع معرّفاتك
في تطبيق Discord، تحتاج إلى تمكين وضع المطور حتى تتمكن من نسخ المعرّفات الداخلية.
- انقر على User Settings (أيقونة الترس بجانب صورتك الرمزية) → Advanced → فعّل Developer Mode
- انقر بزر الماوس الأيمن على أيقونة الخادم في الشريط الجانبي → Copy Server ID
- انقر بزر الماوس الأيمن على صورتك الرمزية → Copy User ID
احفظ Server ID و User ID بجانب Bot Token — سترسل الثلاثة جميعًا إلى OpenClaw في الخطوة التالية.
السماح بالرسائل المباشرة من أعضاء الخادم
لكي يعمل الإقران، يحتاج Discord إلى السماح لروبوتك بإرسال رسالة مباشرة إليك. انقر بزر الماوس الأيمن على أيقونة الخادم → Privacy Settings → فعّل Direct Messages.
يتيح هذا لأعضاء الخادم (بما في ذلك الروبوتات) إرسال رسائل مباشرة إليك. أبقِ هذا ممكّنًا إذا كنت تريد استخدام رسائل Discord المباشرة مع OpenClaw. إذا كنت تخطط لاستخدام قنوات النقابة فقط، فيمكنك تعطيل الرسائل المباشرة بعد الإقران.
ضبط رمز الروبوت بأمان (لا ترسله في الدردشة)
رمز روبوت Discord الخاص بك سرّي (مثل كلمة المرور). اضبطه على الجهاز الذي يشغّل OpenClaw قبل مراسلة وكيلك.
export DISCORD_BOT_TOKEN="YOUR_BOT_TOKEN"cat > discord.patch.json5 <<'JSON5'{channels: {discord: { enabled: true, token: { source: "env", provider: "default", id: "DISCORD_BOT_TOKEN" },},},}JSON5openclaw config patch --file ./discord.patch.json5 --dry-runopenclaw config patch --file ./discord.patch.json5openclaw gatewayإذا كان OpenClaw يعمل بالفعل كخدمة في الخلفية، فأعد تشغيله عبر تطبيق OpenClaw على Mac أو بإيقاف عملية openclaw gateway run وإعادة تشغيلها.
بالنسبة لتثبيتات الخدمة المُدارة، شغّل openclaw gateway install من صدفة يكون فيها DISCORD_BOT_TOKEN موجودًا، أو خزّن المتغير في ~/.openclaw/.env، حتى تتمكن الخدمة من حل env SecretRef بعد إعادة التشغيل.
إذا كان مضيفك محظورًا أو محدود المعدل بسبب بحث تطبيق بدء التشغيل في Discord، فاضبط معرّف تطبيق/عميل Discord من Developer Portal حتى يتمكن بدء التشغيل من تخطي استدعاء REST هذا. استخدم channels.discord.applicationId للحساب الافتراضي، أو channels.discord.accounts.<accountId>.applicationId عند تشغيل عدة روبوتات Discord.
تكوين OpenClaw والإقران
اسأل وكيلك
تحدّث مع وكيل OpenClaw لديك على أي قناة حالية (مثل Telegram) وأخبره. إذا كانت Discord هي قناتك الأولى، فاستخدم تبويب CLI / التكوين بدلًا من ذلك.
"لقد ضبطت بالفعل رمز روبوت Discord الخاص بي في التكوين. يُرجى إكمال إعداد Discord باستخدام User ID
<user_id>و Server ID<server_id>."
CLI / التكوين
إذا كنت تفضل التكوين المستند إلى الملفات، فاضبط:
{channels: {discord: {enabled: true,token: {source: "env",provider: "default",id: "DISCORD_BOT_TOKEN",},},},}رجوع env للحساب الافتراضي:
DISCORD_BOT_TOKEN=...للإعداد المبرمج أو البعيد، اكتب كتلة JSON5 نفسها باستخدام openclaw config patch --file ./discord.patch.json5 --dry-run ثم أعد التشغيل بدون --dry-run. قيم token النصية الصريحة مدعومة. قيم SecretRef مدعومة أيضًا لـ channels.discord.token عبر مزودي env/file/exec. راجع إدارة الأسرار.
لعدة روبوتات Discord، احتفظ برمز كل روبوت ومعرّف التطبيق تحت حسابه. يتم توريث channels.discord.applicationId ذي المستوى الأعلى بواسطة الحسابات، لذا لا تضبطه هناك إلا عندما يجب أن يستخدم كل حساب معرّف التطبيق نفسه.
{channels: {discord: {enabled: true,accounts: {personal: { token: { source: "env", provider: "default", id: "DISCORD_PERSONAL_TOKEN" }, applicationId: "111111111111111111",},work: { token: { source: "env", provider: "default", id: "DISCORD_WORK_TOKEN" }, applicationId: "222222222222222222",},},},},}الموافقة على أول إقران برسالة مباشرة
انتظر حتى يعمل Gateway، ثم أرسل رسالة مباشرة إلى روبوتك في Discord. سيرد برمز إقران.
اسأل وكيلك
أرسل رمز الإقران إلى وكيلك على قناتك الحالية:
"وافق على رمز إقران Discord هذا:
<CODE>"
CLI
openclaw pairing list discordopenclaw pairing approve discord <CODE>تنتهي صلاحية رموز الإقران بعد ساعة واحدة.
يجب أن تتمكن الآن من الدردشة مع وكيلك في Discord عبر رسالة مباشرة.
موصى به: إعداد مساحة عمل للنقابة
بعد أن تعمل الرسائل المباشرة، يمكنك إعداد خادم Discord الخاص بك كمساحة عمل كاملة حيث تحصل كل قناة على جلسة وكيل خاصة بها بسياقها الخاص. يوصى بهذا للخوادم الخاصة التي تضمك أنت وروبوتك فقط.
إضافة خادمك إلى قائمة السماح للنقابة
يتيح هذا لوكيلك الرد في أي قناة على خادمك، وليس فقط في الرسائل المباشرة.
اسأل وكيلك
"أضف Discord Server ID
<server_id>الخاص بي إلى قائمة السماح للنقابة"
التكوين
{channels: {discord: {groupPolicy: "allowlist",guilds: {YOUR_SERVER_ID: { requireMention: true, users: ["YOUR_USER_ID"],},},},},}السماح بالردود بدون @mention
افتراضيًا، لا يرد وكيلك في قنوات النقابة إلا عند الإشارة إليه بـ @. بالنسبة لخادم خاص، ربما تريد أن يرد على كل رسالة.
في قنوات النقابة، تبقى الردود النهائية العادية للمساعد خاصة افتراضيًا. يجب إرسال مخرجات Discord المرئية صراحة باستخدام أداة message، حتى يتمكن الوكيل من المراقبة افتراضيًا والنشر فقط عندما يقرر أن ردًا في القناة مفيد.
يعني هذا أن النموذج المحدد يجب أن يستدعي الأدوات بموثوقية. إذا أظهر Discord حالة الكتابة وأظهرت السجلات استخدام الرموز ولكن لم تُنشر أي رسالة، فتحقق من سجل الجلسة بحثًا عن نص المساعد مع didSendViaMessagingTool: false. يعني هذا أن النموذج أنشأ إجابة نهائية خاصة بدلًا من استدعاء message(action=send). انتقل إلى نموذج أقوى في استدعاء الأدوات، أو استخدم التكوين أدناه لاستعادة الردود النهائية التلقائية القديمة.
اسأل وكيلك
"اسمح لوكيلي بالرد على هذا الخادم بدون الحاجة إلى أن تتم الإشارة إليه بـ @"
التكوين
اضبط requireMention: false في تكوين النقابة لديك:
{channels: {discord: {guilds: {YOUR_SERVER_ID: { requireMention: false,},},},},}لاستعادة الردود النهائية التلقائية القديمة لغرف المجموعات/القنوات، اضبط messages.groupChat.visibleReplies: "automatic".
التخطيط للذاكرة في قنوات النقابة
افتراضيًا، لا تُحمّل الذاكرة طويلة المدى (MEMORY.md) إلا في جلسات الرسائل المباشرة. لا تُحمّل قنوات النقابة MEMORY.md تلقائيًا.
اسأل وكيلك
"عندما أطرح أسئلة في قنوات Discord، استخدم memory_search أو memory_get إذا كنت تحتاج إلى سياق طويل المدى من MEMORY.md."
يدوي
إذا كنت تحتاج إلى سياق مشترك في كل قناة، فضع التعليمات الثابتة في AGENTS.md أو USER.md (يتم حقنها في كل جلسة). احتفظ بالملاحظات طويلة المدى في MEMORY.md وادخل إليها عند الطلب باستخدام أدوات الذاكرة.
أنشئ الآن بعض القنوات على خادم Discord وابدأ الدردشة. يستطيع وكيلك رؤية اسم القناة، وتحصل كل قناة على جلستها المعزولة الخاصة — بحيث يمكنك إعداد #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). - تعمل أوامر slash الأصلية في جلسات أوامر معزولة (
agent:<agentId>:discord:slash:<userId>)، مع الاستمرار في حملCommandTargetSessionKeyإلى جلسة المحادثة الموجّهة. - يستخدم تسليم إعلانات cron/heartbeat النصية فقط إلى Discord الإجابة النهائية المرئية للمساعد مرة واحدة. تبقى حمولات الوسائط والمكوّنات المهيكلة متعددة الرسائل عندما يصدر الوكيل عدة حمولات قابلة للتسليم.
قنوات المنتديات
تقبل قنوات المنتديات والوسائط في Discord منشورات السلاسل فقط. يدعم OpenClaw طريقتين لإنشائها:
- أرسل رسالة إلى أصل المنتدى (
channel:<forumId>) لإنشاء سلسلة تلقائيًا. يستخدم عنوان السلسلة أول سطر غير فارغ من رسالتك. - استخدم
openclaw message thread createلإنشاء سلسلة مباشرة. لا تمرّر--message-idلقنوات المنتديات.
مثال: الإرسال إلى أصل المنتدى لإنشاء سلسلة
openclaw message send --channel discord --target channel:<forumId> \ --message "Topic title\nBody of the post"مثال: إنشاء سلسلة منتدى صراحةً
openclaw message thread create --channel discord --target channel:<forumId> \ --thread-name "Topic title" --message "Body of the post"لا تقبل أصول المنتديات مكوّنات Discord. إذا كنت تحتاج إلى مكوّنات، فأرسل إلى السلسلة نفسها (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 أو الوسوم أو *). عند التهيئة، يتلقى المستخدمون غير المطابقين رفضًا عابرًا.
تفتح أوامر slash /model و/models منتقي نماذج تفاعليًا مع قوائم منسدلة لمزوّد الخدمة والنموذج وبيئة التشغيل المتوافقة، إضافة إلى خطوة إرسال. أصبح /models add مهمَلًا، ويعيد الآن رسالة إهمال بدلًا من تسجيل النماذج من الدردشة. يكون رد المنتقي عابرًا ولا يمكن استخدامه إلا للمستخدم الذي استدعاه. قوائم اختيار Discord محدودة بـ 25 خيارًا، لذا أضف إدخالات provider/* إلى agents.defaults.models عندما تريد أن يعرض المنتقي النماذج المكتشفة ديناميكيًا فقط لمزوّدي خدمات محددين مثل openai-codex أو vllm.
مرفقات الملفات:
- يجب أن تشير كتل
fileإلى مرجع مرفق (attachment://<filename>) - وفّر المرفق عبر
media/path/filePath(ملف واحد)؛ استخدمmedia-galleryلعدة ملفات - استخدم
filenameلتجاوز اسم الرفع عندما يجب أن يطابق مرجع المرفق
نماذج Modal:
- أضف
components.modalمع ما يصل إلى 5 حقول - أنواع الحقول:
text,checkbox,radio,select,role-select,user-select - يضيف OpenClaw زر تشغيل تلقائيًا
مثال:
{ channel: "discord", action: "send", to: "channel:123456789012345678", message: "Optional fallback text", components: { reusable: true, text: "Choose a path", blocks: [ { type: "actions", buttons: [ { label: "Approve", style: "success", allowedUsers: ["123456789012345678"], }, { label: "Decline", style: "danger" }, ], }, { type: "actions", select: { type: "string", placeholder: "Pick an option", options: [ { label: "Option A", value: "a" }, { label: "Option B", value: "b" }, ], }, }, ], modal: { title: "Details", triggerLabel: "Open form", fields: [ { type: "text", label: "Requester" }, { type: "select", label: "Priority", options: [ { label: "Low", value: "low" }, { label: "High", value: "high" }, ], }, ], }, },}التحكم في الوصول والتوجيه
DM policy
يتحكم channels.discord.dmPolicy في الوصول إلى الرسائل المباشرة. channels.discord.allowFrom هي قائمة السماح الأساسية للرسائل المباشرة.
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 عندما يستطيع فعل ذلك دون تغيير الوصول.
تنسيق هدف الرسائل المباشرة للتسليم:
user:<id>- إشارة
<@id>
عادةً ما تُحل معرّفات الأرقام المجردة كمعرّفات قنوات عندما تكون قناة افتراضية نشطة، لكن المعرّفات المدرجة في allowFrom الفعّالة للرسائل المباشرة في الحساب تُعامل كأهداف رسائل مباشرة للمستخدمين لأغراض التوافق.
Access groups
يمكن لتفويض رسائل Discord المباشرة وأوامر النص استخدام إدخالات accessGroup:<name> الديناميكية في channels.discord.allowFrom.
تتم مشاركة أسماء مجموعات الوصول عبر قنوات الرسائل. استخدم type: "message.senders" لمجموعة ثابتة يُعبَّر عن أعضائها ببنية allowFrom العادية لكل قناة، أو type: "discord.channelAudience" عندما يجب أن يحدد جمهور ViewChannel الحالي لقناة Discord العضوية ديناميكيًا. سلوك مجموعات الوصول المشتركة موثق هنا: مجموعات الوصول.
{accessGroups: {operators: { type: "message.senders", members: { "*": ["global-owner-id"], discord: ["discord:123456789012345678"], telegram: ["987654321"], },},},channels: {discord: { dmPolicy: "allowlist", allowFrom: ["accessGroup:operators"],},},}لا تحتوي قناة نصية في Discord على قائمة أعضاء منفصلة. يمثّل type: "discord.channelAudience" العضوية على النحو التالي: يكون مرسل الرسالة المباشرة عضوًا في الخادم المهيأ ولديه حاليًا إذن ViewChannel فعّال على القناة المهيأة بعد تطبيق تجاوزات الأدوار والقنوات.
مثال: السماح لأي شخص يستطيع رؤية #maintainers بمراسلة البوت مباشرة، مع إبقاء الرسائل المباشرة مغلقة أمام الجميع غير ذلك.
{accessGroups: {maintainers: { type: "discord.channelAudience", guildId: "1456350064065904867", channelId: "1456744319972282449", membership: "canViewChannel",},},channels: {discord: { dmPolicy: "allowlist", allowFrom: ["accessGroup:maintainers"],},},}يمكنك مزج الإدخالات الديناميكية والثابتة:
{accessGroups: {maintainers: { type: "discord.channelAudience", guildId: "1456350064065904867", channelId: "1456744319972282449",},},channels: {discord: { dmPolicy: "allowlist", allowFrom: ["accessGroup:maintainers", "discord:123456789012345678"],},},}تفشل عمليات البحث بإغلاق الوصول. إذا أعاد Discord القيمة Missing Access، أو فشل بحث العضو، أو كانت القناة تنتمي إلى خادم مختلف، يُعامل مرسل الرسالة المباشرة كغير مصرّح له.
فعّل Server Members Intent في Discord Developer Portal للبوت عند استخدام مجموعات وصول جمهور القناة. لا تتضمن الرسائل المباشرة حالة عضو الخادم، لذلك يحل OpenClaw العضو عبر Discord REST وقت التفويض.
Guild policy
يتحكم channels.discord.groupPolicy في معالجة الخوادم:
openallowlistdisabled
خط الأساس الآمن عندما يكون channels.discord موجودًا هو allowlist.
سلوك allowlist:
- يجب أن يطابق الخادم
channels.discord.guilds(يُفضّلid، ويُقبل slug) - قوائم سماح اختيارية للمرسلين:
users(يُوصى بالمعرّفات الثابتة) وroles(معرّفات الأدوار فقط)؛ إذا تمت تهيئة أي منهما، يُسمح للمرسلين عندما يطابقونusersأوroles - تكون المطابقة المباشرة بالاسم/الوسم معطلة افتراضيًا؛ فعّل
channels.discord.dangerouslyAllowNameMatching: trueفقط كوضع توافق لكسر الزجاج - الأسماء/الوسوم مدعومة لـ
users، لكن المعرّفات أكثر أمانًا؛ يحذّرopenclaw security auditعند استخدام إدخالات الاسم/الوسم - إذا كان لدى خادم
channelsمهيأة، تُرفض القنوات غير المدرجة - إذا لم يكن لدى خادم كتلة
channels، يُسمح بكل القنوات في ذلك الخادم المدرج في قائمة السماح
مثال:
{channels: {discord: { groupPolicy: "allowlist", guilds: { "123456789012345678": { requireMention: true, ignoreOtherMentions: true, users: ["987654321098765432"], roles: ["123456789012345678"], channels: { general: { allow: true }, help: { allow: true, requireMention: true }, }, }, },},},}إذا عيّنت DISCORD_BOT_TOKEN فقط ولم تنشئ كتلة channels.discord، يكون الرجوع في وقت التشغيل هو groupPolicy="allowlist" (مع تحذير في السجلات)، حتى إذا كان channels.defaults.groupPolicy هو open.
Mentions and group DMs
تكون رسائل الخوادم محكومة بالإشارات افتراضيًا.
يتضمن كشف الإشارات:
- إشارة صريحة إلى البوت
- أنماط الإشارة المهيأة (
agents.list[].groupChat.mentionPatterns، والاحتياطيmessages.groupChat.mentionPatterns) - سلوك الرد الضمني على البوت في الحالات المدعومة
عند كتابة رسائل Discord صادرة، استخدم بنية الإشارة الأساسية: <@USER_ID> للمستخدمين، و<#CHANNEL_ID> للقنوات، و<@&ROLE_ID> للأدوار. لا تستخدم صيغة إشارة اللقب القديمة <@!USER_ID>.
تتم تهيئة requireMention لكل خادم/قناة (channels.discord.guilds...).
يزيل ignoreOtherMentions اختياريًا الرسائل التي تشير إلى مستخدم/دور آخر ولكن لا تشير إلى البوت (باستثناء @everyone/@here).
الرسائل المباشرة الجماعية:
- افتراضيًا: متجاهلة (
dm.groupEnabled=false) - قائمة سماح اختيارية عبر
dm.groupChannels(معرّفات قنوات أو slugs)
توجيه الوكلاء المستند إلى الأدوار
استخدم bindings[].match.roles لتوجيه أعضاء خوادم Discord إلى وكلاء مختلفين حسب معرّف الدور. تقبل الارتباطات المستندة إلى الأدوار معرّفات الأدوار فقط، وتُقيَّم بعد ارتباطات النظير أو النظير الأصل وقبل ارتباطات الخادم فقط. إذا عيّن ارتباط حقول مطابقة أخرى أيضًا (مثلًا peer + guildId + roles)، فيجب أن تتطابق كل الحقول المهيأة.
{ bindings: [ { agentId: "opus", match: { channel: "discord", guildId: "123456789012345678", roles: ["111111111111111111"], }, }, { agentId: "sonnet", match: { channel: "discord", guildId: "123456789012345678", }, }, ],}الأوامر الأصلية ومصادقة الأوامر
- يتم تعيين القيمة الافتراضية لـ
commands.nativeإلى"auto"ويكون مفعلا لـ Discord. - التجاوز لكل قناة:
channels.discord.commands.native. - يؤدي
commands.native=falseإلى تخطي تسجيل أوامر الشرطة المائلة في Discord وتنظيفها أثناء بدء التشغيل. قد تبقى الأوامر المسجلة سابقا مرئية في Discord إلى أن تزيلها من تطبيق Discord. - تستخدم مصادقة الأوامر الأصلية قوائم السماح/السياسات نفسها في Discord مثل معالجة الرسائل العادية.
- قد تظل الأوامر مرئية في واجهة Discord للمستخدمين غير المصرح لهم؛ لكن التنفيذ يظل يفرض مصادقة OpenClaw ويعيد "غير مصرح".
راجع أوامر الشرطة المائلة لمعرفة كتالوج الأوامر وسلوكها.
إعدادات أوامر الشرطة المائلة الافتراضية:
ephemeral: true
تفاصيل الميزة
وسوم الرد والردود الأصلية
يدعم Discord وسوم الرد في مخرجات الوكيل:
[[reply_to_current]][[reply_to:<id>]]
يتم التحكم فيها بواسطة channels.discord.replyToMode:
off(الافتراضي)firstallbatched
ملاحظة: يعطل off تسلسل الردود الضمني. تظل وسوم [[reply_to_*]] الصريحة محترمة.
يرفق first دائما مرجع الرد الأصلي الضمني بأول رسالة صادرة في Discord لذلك الدور.
لا يرفق batched مرجع الرد الأصلي الضمني في Discord إلا عندما يكون
الدور الوارد دفعة مؤجلة من رسائل متعددة. يكون هذا مفيدا
عندما تريد الردود الأصلية أساسا للمحادثات المتدفقة الملتبسة، وليس لكل
دور ذي رسالة واحدة.
تظهر معرفات الرسائل في السياق/السجل حتى يتمكن الوكلاء من استهداف رسائل محددة.
معاينة البث المباشر
يمكن لـ OpenClaw بث مسودات الردود عبر إرسال رسالة مؤقتة وتعديلها مع وصول النص. يأخذ channels.discord.streaming القيم off | partial | block | progress (الافتراضي). يحتفظ progress بمسودة حالة واحدة قابلة للتعديل ويحدثها بتقدم الأدوات حتى التسليم النهائي؛ تسمية البدء المشتركة سطر متحرك، لذلك تختفي بالتمرير مثل البقية بمجرد ظهور عمل كاف. streamMode اسم مستعار قديم وقت التشغيل. شغل openclaw doctor --fix لإعادة كتابة الإعدادات المحفوظة إلى المفتاح القانوني.
عيّن channels.discord.streaming.mode إلى off لتعطيل تعديلات معاينة Discord. إذا تم تفعيل بث كتل Discord صراحة، يتخطى OpenClaw بث المعاينة لتجنب البث المزدوج.
{channels: {discord: { streaming: { mode: "progress", progress: { label: "auto", maxLines: 8, toolProgress: true, }, },},},}- يعدل
partialرسالة معاينة واحدة مع وصول الرموز. - يصدر
blockأجزاء بحجم المسودة (استخدمdraftChunkلضبط الحجم ونقاط الفصل، مع تقييدها إلىtextChunkLimit). - تؤدي نهائيات الوسائط والأخطاء والردود الصريحة إلى إلغاء تعديلات المعاينة المعلقة.
- يتحكم
streaming.preview.toolProgress(الافتراضيtrue) فيما إذا كانت تحديثات الأداة/التقدم تعيد استخدام رسالة المعاينة. - تعرض صفوف الأداة/التقدم كرمز تعبيري مضغوط + عنوان + تفاصيل عند توفرها، مثلا
🛠️ Bash: run testsأو🔎 Web Search: for "query". - يتحكم
streaming.preview.commandText/streaming.progress.commandTextفي تفاصيل الأمر/التنفيذ في أسطر التقدم المضغوطة:raw(الافتراضي) أوstatus(تسمية الأداة فقط).
إخفاء نص الأمر/التنفيذ الخام مع الإبقاء على أسطر التقدم المضغوطة:
{ "channels": { "discord": { "streaming": { "mode": "progress", "progress": { "toolProgress": true, "commandText": "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أثناء بديل تفعيل مرحلة الرد.
يتم حقن مواضيع القنوات كسياق غير موثوق. تتحكم قوائم السماح في من يستطيع تشغيل الوكيل، وليست حد تنقيح كامل لسياق تكميلي.
جلسات مرتبطة بسلسلة المحادثة للوكلاء الفرعيين
يمكن لـ Discord ربط سلسلة محادثة بهدف جلسة بحيث تستمر الرسائل اللاحقة في تلك السلسلة بالتوجيه إلى الجلسة نفسها (بما في ذلك جلسات الوكيل الفرعي).
الأوامر:
/focus <target>ربط سلسلة المحادثة الحالية/الجديدة بهدف وكيل فرعي/جلسة/unfocusإزالة ربط سلسلة المحادثة الحالية/agentsعرض التشغيلات النشطة وحالة الربط/session idle <duration|off>فحص/تحديث إلغاء التركيز التلقائي عند الخمول للارتباطات المركزة/session max-age <duration|off>فحص/تحديث الحد الأقصى الصارم للعمر للارتباطات المركزة
الإعدادات:
{session: {threadBindings: { enabled: true, idleHours: 24, maxAgeHours: 0,},},channels: {discord: { threadBindings: { enabled: true, idleHours: 24, maxAgeHours: 0, spawnSessions: true, defaultSpawnContext: "fork", },},},}ملاحظات:
- يحدد
session.threadBindings.*القيم الافتراضية العامة. - يتجاوز
channels.discord.threadBindings.*سلوك Discord. - يتحكم
spawnSessionsفي الإنشاء/الربط التلقائي لسلاسل المحادثة لـsessions_spawn({ thread: true })وعمليات إنشاء سلاسل ACP. الافتراضي:true. - يتحكم
defaultSpawnContextفي سياق الوكيل الفرعي الأصلي لعمليات الإنشاء المرتبطة بسلسلة المحادثة. الافتراضي:"fork". - يتم ترحيل مفاتيح
spawnSubagentSessions/spawnAcpSessionsالمهملة بواسطةopenclaw doctor --fix. - إذا كانت ارتباطات سلاسل المحادثة معطلة لحساب، فإن
/focusوعمليات ربط سلاسل المحادثة ذات الصلة لا تكون متاحة.
راجع الوكلاء الفرعيين، ووكلاء ACP، ومرجع الإعدادات.
ارتباطات قنوات ACP المستمرة
لمساحات عمل ACP مستقرة "دائمة التشغيل"، اضبط ارتباطات ACP المكتوبة على المستوى الأعلى التي تستهدف محادثات Discord.
مسار الإعدادات:
bindings[]معtype: "acp"وmatch.channel: "discord"
مثال:
{agents: {list: [ { id: "codex", runtime: { type: "acp", acp: { agent: "codex", backend: "acpx", mode: "persistent", cwd: "/workspace/openclaw", }, }, },],},bindings: [{ type: "acp", agentId: "codex", match: { channel: "discord", accountId: "default", peer: { kind: "channel", id: "222222222222222222" }, }, acp: { label: "codex-main" },},],channels: {discord: { guilds: { "111111111111111111": { channels: { "222222222222222222": { requireMention: false, }, }, }, },},},}ملاحظات:
- يربط
/acp spawn codex --bind hereالقناة أو سلسلة المحادثة الحالية في مكانها ويحافظ على الرسائل المستقبلية في جلسة ACP نفسها. ترث رسائل سلسلة المحادثة ربط القناة الأصلية. - في قناة أو سلسلة محادثة مرتبطة، يعيد
/newو/resetضبط جلسة ACP نفسها في مكانها. يمكن لارتباطات سلسلة المحادثة المؤقتة تجاوز حل الهدف أثناء نشاطها. - يتحكم
spawnSessionsفي إنشاء/ربط سلاسل المحادثة الفرعية عبر--thread auto|here.
راجع وكلاء ACP للحصول على تفاصيل سلوك الربط.
إشعارات التفاعلات
وضع إشعار التفاعل لكل خادم:
offown(الافتراضي)allallowlist(يستخدمguilds.<id>.users)
يتم تحويل أحداث التفاعل إلى أحداث نظام وإرفاقها بجلسة Discord الموجهة.
تفاعلات الإقرار
يرسل ackReaction رمزا تعبيريا للإقرار أثناء معالجة OpenClaw لرسالة واردة.
ترتيب الحل:
channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- بديل الرمز التعبيري لهوية الوكيل (
agents.list[].identity.emoji، وإلا "👀")
ملاحظات:
- يقبل Discord الرموز التعبيرية الموحّدة أو أسماء الرموز التعبيرية المخصصة.
- استخدم
""لتعطيل التفاعل لقناة أو حساب.
كتابات الإعدادات
يتم تفعيل كتابات الإعدادات التي تبدأها القناة افتراضيا.
يؤثر هذا في تدفقات /config set|unset (عند تفعيل ميزات الأوامر).
التعطيل:
{channels: {discord: { configWrites: false,},},}وكيل Gateway
وجّه حركة WebSocket الخاصة بـ Gateway في Discord وعمليات بحث REST عند بدء التشغيل (معرف التطبيق + حل قائمة السماح) عبر وكيل HTTP(S) باستخدام channels.discord.proxy.
{channels: {discord: { proxy: "http://proxy.example:8080",},},}تجاوز لكل حساب:
{channels: {discord: { accounts: { primary: { proxy: "http://proxy.example:8080", }, },},},}دعم PluralKit
فعّل حل PluralKit لتعيين الرسائل الموكلة إلى هوية عضو النظام:
{channels: {discord: { pluralkit: { enabled: true, token: "pk_live_...", // optional; needed for private systems },},},}ملاحظات:
- يمكن لقوائم السماح استخدام
pk:<memberId> - تتم مطابقة أسماء عرض الأعضاء بالاسم/الاسم المختصر فقط عندما يكون
channels.discord.dangerouslyAllowNameMatching: true - تستخدم عمليات البحث معرف الرسالة الأصلي وتكون مقيدة بنافذة زمنية
- إذا فشلت عملية البحث، تعامل الرسائل الموكلة كرسائل بوت ويتم إسقاطها ما لم يكن
allowBots=true
أسماء مستعارة للإشارات الصادرة
استخدم mentionAliases عندما يحتاج الوكلاء إلى إشارات صادرة حتمية لمستخدمي Discord معروفين. المفاتيح هي مقابض دون @ البادئة؛ والقيم هي معرفات مستخدمي Discord. تترك المقابض غير المعروفة، و@everyone، و@here، والإشارات داخل مقاطع كود Markdown دون تغيير.
{channels: {discord: { mentionAliases: { Vladislava: "123456789012345678", }, accounts: { ops: { mentionAliases: { OpsLead: "234567890123456789", }, }, },},},}إعدادات الحضور
يتم تطبيق تحديثات الحضور عندما تضبط حقل حالة أو نشاط، أو عندما تفعّل الحضور التلقائي.
مثال الحالة فقط:
{channels: {discord: { status: "idle",},},}مثال النشاط (الحالة المخصصة هي نوع النشاط الافتراضي):
{channels: {discord: { activity: "Focus time", activityType: 4,},},}مثال البث:
{channels: {discord: { activity: "Live coding", activityType: 1, activityUrl: "https://twitch.tv/openclaw",},},}خريطة نوع النشاط:
- 0: اللعب
- 1: البث (يتطلب
activityUrl) - 2: الاستماع
- 3: المشاهدة
- 4: مخصص (يستخدم نص النشاط كحالة للحالة؛ الرمز التعبيري اختياري)
- 5: المنافسة
مثال الحضور التلقائي (إشارة سلامة وقت التشغيل):
{channels: {discord: { autoPresence: { enabled: true, intervalMs: 30000, minUpdateIntervalMs: 15000, exhaustedText: "token exhausted", },},},}يربط الحضور التلقائي إتاحة وقت التشغيل بحالة Discord: سليم => متصل، متدهور أو غير معروف => خامل، مستنفد أو غير متاح => عدم الإزعاج. تجاوزات النص الاختيارية:
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
يفعّل Discord موافقات التنفيذ الأصلية تلقائيًا عندما يكون 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.*.
سلوك البوابة الافتراضي:
| مجموعة الإجراءات | الافتراضي |
|---|---|
| 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 (hex). - عيّنه لكل حساب باستخدام
channels.discord.accounts.<id>.ui.components.accentColor. - يتم تجاهل
embedsعند وجود مكونات v2.
مثال:
{ channels: { discord: { ui: { components: { accentColor: "#5865F2", }, }, }, },}الصوت
لدى 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 الأخرى.
/vc join channel:<voice-channel-id>/vc status/vc leaveلفحص الأذونات الفعلية للروبوت قبل الانضمام، شغّل:
openclaw channels capabilities --channel discord --target channel:<voice-channel-id>مثال الانضمام التلقائي:
{ channels: { discord: { voice: { enabled: true, model: "openai-codex/gpt-5.5", autoJoin: [ { guildId: "123456789012345678", channelId: "234567890123456789", }, ], allowedChannels: [ { guildId: "123456789012345678", channelId: "234567890123456789", }, ], daveEncryption: true, decryptionFailureTolerance: 24, connectTimeoutMs: 30000, reconnectGraceMs: 15000, realtime: { provider: "openai", model: "gpt-realtime-2", voice: "cedar", }, }, }, },}ملاحظات:
- يتجاوز
voice.ttsإعدادmessages.ttsلتشغيل الصوت فيstt-ttsفقط. تستخدم أوضاع الوقت الحقيقيvoice.realtime.voice. - يتحكم
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. - يوجّه
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.voiceجلسة الصوت في الوقت الحقيقي. لاستخدام OpenAI Realtime 2 مع عقل Codex، استخدمvoice.realtime.model: "gpt-realtime-2"وvoice.model: "openai-codex/gpt-5.5". - يقبل موفر الوقت الحقيقي في OpenAI أسماء أحداث Realtime 2 الحالية والأسماء المستعارة القديمة المتوافقة مع Codex لأحداث صوت المخرجات والنص المنسوخ، بحيث يمكن أن تنحرف لقطات الموفر المتوافقة دون إسقاط صوت المساعد.
- يتحكم
voice.realtime.bargeInفيما إذا كانت أحداث بدء المتحدث في Discord تقاطع التشغيل النشط في الوقت الحقيقي. إذا تُرك غير معيّن، فإنه يتبع إعداد مقاطعة صوت الإدخال لدى موفر الوقت الحقيقي. - يتحكم
voice.realtime.minBargeInAudioEndMsفي الحد الأدنى لمدة تشغيل المساعد قبل أن تقطع مقاطعة OpenAI في الوقت الحقيقي الصوت. الافتراضي:250. اضبط0للمقاطعة الفورية في الغرف منخفضة الصدى، أو ارفعه لإعدادات مكبرات الصوت كثيرة الصدى. - لاستخدام صوت OpenAI في تشغيل Discord، اضبط
voice.tts.provider: "openai"واختر صوت تحويل نص إلى كلام ضمنvoice.tts.openai.voiceأوvoice.tts.providers.openai.voice. يُعدcedarخياراً جيداً ذا طابع صوتي ذكوري على نموذج TTS الحالي من OpenAI. - تنطبق تجاوزات
systemPromptفي Discord لكل قناة على أدوار نصوص الصوت المنسوخة لتلك القناة الصوتية. - تستمد أدوار نصوص الصوت المنسوخة حالة المالك من
allowFromفي Discord (أوdm.allowFrom)؛ ولا يمكن للمتحدثين غير المالكين الوصول إلى الأدوات المخصصة للمالك فقط (مثلgatewayوcron). - صوت 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 افتراضياً مفكك ترميز
opusscriptالمكتوب بـ JS فقط لاستقبال صوت Discord. يتجاهل repo حزمة@discordjs/opusالأصلية الاختيارية وفق سياسة تثبيت pnpm، بحيث لا تقوم عمليات التثبيت العادية ومسارات Docker والاختبارات غير ذات الصلة بتجميع إضافة أصلية. يمكن لمضيفي أداء الصوت المخصصين الاشتراك عبرOPENCLAW_DISCORD_OPUS_DECODER=nativeبعد تثبيت الإضافة الأصلية. - يتحكم
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. الافتراضي:2500؛ ارفع هذه القيمة إذا كان Discord يقسم الوقفات الطبيعية إلى نصوص منسوخة جزئية متقطعة. - عندما يكون ElevenLabs هو موفر TTS المحدد، يستخدم تشغيل صوت Discord TTS بالتدفق ويبدأ من تدفق استجابة الموفر. تعود الموفرات التي لا تدعم التدفق إلى مسار الملف المؤقت المركّب.
- يراقب OpenClaw أيضاً حالات فشل فك تشفير الاستقبال ويتعافى تلقائياً عبر مغادرة/إعادة الانضمام إلى القناة الصوتية بعد إخفاقات متكررة ضمن نافذة قصيرة.
- إذا أظهرت سجلات الاستقبال بشكل متكرر
DecryptionFailed(UnencryptedWhenPassthroughDisabled)بعد التحديث، فاجمع تقرير اعتماديات وسجلات. يتضمن خط@discordjs/voiceالمرفق إصلاح الحشو upstream من PR #11449 في discord.js، الذي أغلق issue #11419 في discord.js. - أحداث استقبال
The operation was abortedمتوقعة عندما ينهي OpenClaw مقطع متحدث ملتقطاً؛ وهي تشخيصات مطولة، لا تحذيرات. - تتضمن سجلات صوت Discord المطولة معاينة محدودة من سطر واحد لنص STT المنسوخ لكل مقطع متحدث مقبول، بحيث يعرض التصحيح جانب المستخدم وجانب رد الوكيل دون تفريغ نصوص منسوخة غير محدودة.
- في وضع
agent-proxy، يتخطى رجوع الاستشارة المفروضة أجزاء النص المنسوخ التي تبدو غير مكتملة مثل النص المنتهي بـ...أو واصل لاحق مثلand، إضافة إلى عبارات الإغلاق الواضحة غير القابلة للتنفيذ مثل “سأعود حالاً” أو “وداعاً”. تعرض السجلاتforced agent consult skipped reason=...عندما يمنع ذلك إجابة قديمة في الطابور.
إعداد opus الأصلي لنسخ المصدر:
pnpm installmise exec node@22 -- pnpm discord:opus:installاستخدم Node 22 للـ Gateway عندما تريد الإضافة الأصلية المبنية مسبقاً upstream لنظام macOS arm64. إذا استخدمت وقت تشغيل Node آخر، فقد يحتاج المثبت الاختياري إلى سلسلة أدوات بناء مصدر محلية لـ node-gyp.
بعد تثبيت الإضافة الأصلية، ابدأ Gateway باستخدام:
OPENCLAW_DISCORD_OPUS_DECODER=native pnpm gateway:watchينبغي أن تعرض سجلات الصوت المطولة discord voice: opus decoder: @discordjs/opus. من دون الاشتراك عبر متغير البيئة، أو إذا كانت الإضافة الأصلية مفقودة أو لا يمكن تحميلها على المضيف، يسجل OpenClaw discord voice: opus decoder: opusscript ويواصل استقبال الصوت عبر بديل JS الصرف.
مسار STT مع TTS:
- يتم تحويل التقاط PCM من Discord إلى ملف WAV مؤقت.
- يتولى
tools.media.audioمعالجة STT، على سبيل المثالopenai/gpt-4o-mini-transcribe. - يُرسل النص المنسوخ عبر مدخل Discord والتوجيه بينما يعمل LLM للاستجابة بسياسة إخراج صوتي تخفي أداة الوكيل
ttsوتطلب نصاً مُعاداً، لأن صوت Discord يمتلك تشغيل TTS النهائي. - عند تعيين
voice.model، فإنه يتجاوز فقط LLM الخاص بالاستجابة لهذا الدور في القناة الصوتية. - يُدمج
voice.ttsفوقmessages.tts؛ تغذي الموفرات القادرة على التدفق المشغل مباشرة، وإلا فيُشغل ملف الصوت الناتج في القناة المنضم إليها.
مثال جلسة قناة صوتية افتراضية للوكيل الوكيل:
{ channels: { discord: { voice: { enabled: true, model: "openai-codex/gpt-5.5", realtime: { provider: "openai", model: "gpt-realtime-2", voice: "cedar", }, }, }, },}من دون كتلة voice.agentSession، تحصل كل قناة صوتية على جلسة OpenClaw موجّهة خاصة بها. على سبيل المثال، يتحدث /vc join channel:234567890123456789 إلى الجلسة الخاصة بتلك القناة الصوتية في Discord. نموذج الوقت الحقيقي هو واجهة الصوت فقط؛ وتُسلّم الطلبات الجوهرية إلى وكيل OpenClaw المهيأ. إذا أنتج نموذج الوقت الحقيقي نصاً نهائياً منسوخاً من دون استدعاء أداة الاستشارة، يفرض OpenClaw الاستشارة كرجوع بحيث يظل السلوك الافتراضي مشابهاً للتحدث إلى الوكيل.
مثال STT مع TTS القديم:
{ channels: { discord: { voice: { enabled: true, mode: "stt-tts", model: "openai/gpt-5.4-mini", tts: { provider: "openai", openai: { model: "gpt-4o-mini-tts", voice: "cedar", }, }, }, }, },}مثال bidi في الوقت الحقيقي:
{ channels: { discord: { voice: { enabled: true, mode: "bidi", model: "openai-codex/gpt-5.5", realtime: { provider: "openai", model: "gpt-realtime-2", voice: "cedar", toolPolicy: "safe-read-only", consultPolicy: "always", }, }, }, },}الصوت كامتداد لجلسة قناة Discord موجودة:
{ channels: { discord: { voice: { enabled: true, mode: "agent-proxy", model: "openai-codex/gpt-5.5", agentSession: { mode: "target", target: "channel:123456789012345678", }, realtime: { provider: "openai", model: "gpt-realtime-2", voice: "cedar", }, }, }, },}في وضع agent-proxy، ينضم البوت إلى القناة الصوتية المهيأة، لكن أدوار وكيل OpenClaw تستخدم الجلسة والوكيل الموجّهين العاديين للقناة المستهدفة. تنطق جلسة الصوت في الوقت الحقيقي النتيجة المعادة داخل القناة الصوتية. لا يزال بإمكان وكيل الإشراف استخدام أدوات الرسائل العادية وفقاً لسياسة أدواته، بما في ذلك إرسال رسالة Discord منفصلة إذا كان ذلك هو الإجراء الصحيح.
صيغ الأهداف المفيدة:
- يوجّه
target: "channel:123456789012345678"عبر جلسة قناة نصية في Discord. - يُعامل
target: "123456789012345678"كهدف قناة. - يوجّه
target: "dm:123456789012345678"أوtarget: "user:123456789012345678"عبر جلسة الرسائل المباشرة تلك.
مثال OpenAI Realtime للبيئات كثيرة الصدى:
{ channels: { discord: { voice: { enabled: true, mode: "bidi", model: "openai-codex/gpt-5.5", realtime: { provider: "openai", model: "gpt-realtime-2", voice: "cedar", bargeIn: true, minBargeInAudioEndMs: 500, consultPolicy: "always", providers: { openai: { interruptResponseOnInputAudio: false, }, }, }, }, }, },}استخدم هذا عندما يسمع النموذج تشغيل Discord الخاص به عبر ميكروفون مفتوح، لكنك لا تزال تريد مقاطعته بالتحدث. يمنع OpenClaw OpenAI من المقاطعة التلقائية عند إدخال صوت خام، بينما يتيح 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 بدأ تشغيل صوت المساعد. يبدأ الجسر من هذه النقطة في عد أجزاء مخرجات المساعد، وبايتات Discord PCM، وبايتات موفر الوقت الفعلي، ومدة الصوت المركب. - يحدد
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 voice أو المستلمة منه.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 voice عابرًا، أو سلوك بوابة ضجيج، أو عميلًا يفعّل الميكروفون للحظة قصيرة. - يعني
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 تشغيل نشط لمقاطعته. لا ينبغي أن يؤدي هذا إلى قطع الصوت.
تُحل بيانات الاعتماد لكل مكون: مصادقة مسار LLM لـ 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 حسب الحاجة.
message(action="send", channel="discord", target="channel:123", path="/path/to/audio.mp3", asVoice=true)استكشاف الأخطاء وإصلاحها
استُخدمت نوايا غير مسموح بها أو لا يرى البوت رسائل النقابة
- فعّل Message Content Intent
- فعّل Server Members Intent عندما تعتمد على حل المستخدم/العضو
- أعد تشغيل Gateway بعد تغيير النوايا
حُظرت رسائل النقابة بشكل غير متوقع
- تحقق من
groupPolicy - تحقق من قائمة السماح للنقابة ضمن
channels.discord.guilds - إذا كانت خريطة
channelsللنقابة موجودة، فلا يُسمح إلا بالقنوات المدرجة - تحقق من سلوك
requireMentionوأنماط الإشارة
فحوصات مفيدة:
openclaw doctoropenclaw channels status --probeopenclaw logs --followRequire mention false لكنه لا يزال محظورًا
الأسباب الشائعة:
groupPolicy="allowlist"دون قائمة سماح مطابقة للنقابة/القناة- تهيئة
requireMentionفي الموضع الخطأ (يجب أن تكون ضمنchannels.discord.guildsأو إدخال القناة) - المرسل محظور بواسطة قائمة سماح
usersالخاصة بالنقابة/القناة
لفات Discord طويلة التشغيل أو ردود مكررة
سجلات نموذجية:
Slow listener detected ...stuck session: sessionKey=agent:...:discord:... state=processing ...
مفاتيح ضبط طابور Discord Gateway:
- حساب واحد:
channels.discord.eventQueue.listenerTimeout - حسابات متعددة:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout - يتحكم هذا فقط في عمل مستمع Discord Gateway، وليس عمر لفة الوكيل
لا يطبق Discord مهلة مملوكة للقناة على لفات الوكيل المدرجة في الطابور. يسلّم مستمعو الرسائل العمل فورًا، وتحافظ تشغيلات Discord المدرجة في الطابور على ترتيب كل جلسة حتى تكتمل دورة حياة الجلسة/الأداة/وقت التشغيل أو يُجهض العمل.
{channels: {discord: { accounts: { default: { eventQueue: { listenerTimeout: 120000, }, }, },},},}تحذيرات مهلة البحث عن بيانات Gateway الوصفية
يجلب OpenClaw بيانات Discord /gateway/bot الوصفية قبل الاتصال. تعود حالات الفشل العابرة إلى عنوان URL الافتراضي لـ Gateway في Discord وتخضع لتحديد معدل في السجلات.
مفاتيح ضبط مهلة البيانات الوصفية:
- حساب واحد:
channels.discord.gatewayInfoTimeoutMs - حسابات متعددة:
channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs - بديل البيئة عندما لا تكون التهيئة مضبوطة:
OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS - الافتراضي:
30000(30 ثانية)، الحد الأقصى:120000
إعادات تشغيل بسبب مهلة Gateway READY
ينتظر OpenClaw حدث 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 فقط مع معرفات القنوات الرقمية.
إذا كنت تستخدم مفاتيح slug، فقد تستمر المطابقة في وقت التشغيل بالعمل، لكن لا يستطيع الفحص التحقق من الأذونات بالكامل.
مشكلات الرسائل الخاصة والاقتران
- الرسائل الخاصة معطلة:
channels.discord.dm.enabled=false - سياسة الرسائل الخاصة معطلة:
channels.discord.dmPolicy="disabled"(قديم:channels.discord.dm.policy) - انتظار موافقة الاقتران في وضع
pairing
حلقات بوت إلى بوت
افتراضيًا، تُتجاهل الرسائل التي يكتبها بوت.
إذا عيّنت channels.discord.allowBots=true، فاستخدم قواعد صارمة للإشارة وقائمة السماح لتجنب سلوك الحلقات.
يفضّل استخدام channels.discord.allowBots="mentions" لقبول رسائل البوتات فقط عندما تشير إلى البوت.
{channels: {discord: { accounts: { mantis: { // Mantis listens to other bots only when they mention her. allowBots: "mentions", }, molty: { // Molty listens to all bot-authored Discord messages. allowBots: true, mentionAliases: { // Lets Molty write "@Mantis" and send a real Discord mention. Mantis: "MANTIS_DISCORD_USER_ID", }, }, },},},}Voice STT drops with 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.
High-signal Discord fields
- بدء التشغيل/المصادقة:
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,heartbeat,responsePrefix
السلامة والعمليات
- تعامل مع رموز البوتات كأسرار (يفضل
DISCORD_BOT_TOKENفي البيئات الخاضعة للإشراف). - امنح أذونات Discord بأقل امتيازات ممكنة.
- إذا كانت حالة نشر الأوامر/الحالة قديمة، فأعد تشغيل Gateway ثم أعد الفحص باستخدام
openclaw channels status --probe.