Mainstream messaging

Discord

OpenClaw आधिकारिक Discord gateway के माध्यम से एक बॉट के रूप में Discord से कनेक्ट होता है। DMs और गिल्ड चैनल समर्थित हैं।

त्वरित सेटअप

एक बॉट के साथ Discord एप्लिकेशन बनाएँ, बॉट को अपने सर्वर में जोड़ें और उसे OpenClaw के साथ पेयर करें। यदि संभव हो, तो निजी सर्वर का उपयोग करें; आवश्यकता होने पर पहले एक सर्वर बनाएँ (Create My Own > For me and my friends)।

  • Discord एप्लिकेशन और बॉट बनाएँ

    Discord Developer Portal में New Application पर क्लिक करें और उसे एक नाम दें (उदाहरण के लिए "OpenClaw")।

    साइडबार में Bot खोलें और Username को अपने एजेंट के नाम पर सेट करें।

  • विशेषाधिकार-प्राप्त इंटेंट सक्षम करें

    अभी भी Bot पेज पर, Privileged Gateway Intents के अंतर्गत इन्हें सक्षम करें:

    • Message Content Intent (आवश्यक)
    • Server Members Intent (अनुशंसित; भूमिका अनुमति-सूचियों, नाम-से-ID मिलान और चैनल-ऑडियंस एक्सेस समूहों के लिए आवश्यक)
    • Presence Intent (वैकल्पिक; केवल उपस्थिति अपडेट के लिए)
  • अपना बॉट टोकन कॉपी करें

    Bot पेज पर Reset Token पर क्लिक करें और टोकन कॉपी करें।

  • आमंत्रण URL जनरेट करें और बॉट को अपने सर्वर में जोड़ें

    साइडबार में OAuth2 खोलें। OAuth2 URL Generator में ये स्कोप सक्षम करें:

    • bot
    • applications.commands

    दिखाई देने वाले Bot Permissions अनुभाग में कम से कम इन्हें सक्षम करें:

    General Permissions

    • View Channels

    Text Permissions

    • Send Messages
    • Read Message History
    • Embed Links
    • Attach Files
    • Add Reactions (वैकल्पिक)

    सामान्य टेक्स्ट चैनलों के लिए यह आधारभूत सेटअप है। यदि बॉट थ्रेड में पोस्ट करेगा—जिसमें थ्रेड बनाने या जारी रखने वाले फ़ोरम या मीडिया चैनल वर्कफ़्लो भी शामिल हैं—तो Send Messages in Threads भी सक्षम करें।

    जनरेट किया गया URL कॉपी करें, उसे ब्राउज़र में खोलें, अपना सर्वर चुनें और Continue पर क्लिक करें। अब बॉट आपके सर्वर में दिखाई देना चाहिए।

  • Developer Mode सक्षम करें और अपनी IDs एकत्र करें

    Discord ऐप में Developer Mode सक्षम करें, ताकि आप IDs कॉपी कर सकें:

    1. User Settings (गियर आइकन) → DeveloperDeveloper Mode चालू करें (मोबाइल पर: App SettingsAdvanced)
    2. अपने सर्वर आइकन पर राइट-क्लिक करें → Copy Server ID
    3. अपने अवतार पर राइट-क्लिक करें → Copy User ID

    Server ID और User ID को अपने बॉट टोकन के साथ रखें; अगले चरण के लिए आपको इन तीनों की आवश्यकता होगी।

  • सर्वर सदस्यों से DMs की अनुमति दें

    पेयरिंग के काम करने के लिए Discord को बॉट द्वारा आपको DM भेजने की अनुमति देनी होगी। अपने सर्वर आइकन पर राइट-क्लिक करें → Privacy SettingsDirect Messages चालू करें।

    यदि आप OpenClaw के साथ Discord DMs का उपयोग करते हैं, तो इसे चालू रखें। यदि आप केवल गिल्ड चैनलों का उपयोग करते हैं, तो पेयरिंग के बाद इसे अक्षम कर सकते हैं।

  • अपना बॉट टोकन सुरक्षित रूप से सेट करें (इसे चैट में न भेजें)

    बॉट टोकन एक सीक्रेट है। अपने एजेंट को संदेश भेजने से पहले इसे OpenClaw चलाने वाली मशीन पर सेट करें:

    bash
    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 के स्टार्टअप एप्लिकेशन लुकअप द्वारा ब्लॉक या रेट-लिमिट किया गया है, तो Developer Portal से एप्लिकेशन/क्लाइंट ID सेट करें, ताकि स्टार्टअप उस REST कॉल को छोड़ सके: डिफ़ॉल्ट अकाउंट के लिए channels.discord.applicationId, या प्रत्येक बॉट के लिए channels.discord.accounts.<accountId>.applicationId

  • OpenClaw कॉन्फ़िगर करें और पेयर करें

    अपने एजेंट से कहें

    किसी मौजूदा चैनल (उदाहरण के लिए Telegram) पर अपने OpenClaw एजेंट से चैट करें और उसे निर्देश दें। यदि Discord आपका पहला चैनल है, तो इसके बजाय CLI / कॉन्फ़िगरेशन टैब का उपयोग करें।

    "मैंने कॉन्फ़िगरेशन में अपना Discord बॉट टोकन पहले ही सेट कर दिया है। कृपया User ID <user_id> और Server ID <server_id> के साथ Discord सेटअप पूरा करें।"

    CLI / कॉन्फ़िगरेशन

    फ़ाइल-आधारित कॉन्फ़िगरेशन:

    json5
    {channels: {discord: {enabled: true,token: {source: "env",provider: "default",id: "DISCORD_BOT_TOKEN",},},},}

    डिफ़ॉल्ट अकाउंट के लिए env फ़ॉलबैक:

    bash
    DISCORD_BOT_TOKEN=...

    स्क्रिप्टेड या रिमोट सेटअप के लिए, openclaw config patch --file ./discord.patch.json5 --dry-run के साथ वही JSON5 ब्लॉक लिखें, फिर --dry-run के बिना दोबारा चलाएँ। प्लेनटेक्स्ट token स्ट्रिंग भी काम करती हैं और env/file/exec प्रोवाइडर में channels.discord.token के लिए SecretRef मान समर्थित हैं। सीक्रेट प्रबंधन देखें।

    कई Discord बॉट के लिए, प्रत्येक बॉट का टोकन और एप्लिकेशन ID उसके अकाउंट के अंतर्गत रखें। शीर्ष-स्तरीय channels.discord.applicationId अकाउंट द्वारा इनहेरिट किया जाता है, इसलिए उसे वहाँ केवल तभी सेट करें जब प्रत्येक अकाउंट समान एप्लिकेशन ID का उपयोग करता हो।

    json5
    {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",},},},},}
  • पहली DM पेयरिंग स्वीकृत करें

    gateway चलने के बाद Discord में अपने बॉट को DM भेजें। वह एक पेयरिंग कोड के साथ उत्तर देगा।

    अपने एजेंट से कहें

    अपने मौजूदा चैनल पर पेयरिंग कोड अपने एजेंट को भेजें:

    "इस Discord पेयरिंग कोड को स्वीकृत करें: &lt;CODE&gt;"

    CLI

    bash
    openclaw pairing list discordopenclaw pairing approve discord &lt;CODE&gt;

    पेयरिंग कोड 1 घंटे बाद समाप्त हो जाते हैं। स्वीकृति के बाद Discord DM में अपने एजेंट से चैट करें।

  • अनुशंसित: गिल्ड वर्कस्पेस सेट अप करें

    DMs के काम करने के बाद आप अपने सर्वर को एक पूर्ण वर्कस्पेस में बदल सकते हैं, जहाँ प्रत्येक चैनल को अपने संदर्भ वाला अलग एजेंट सेशन मिलता है। उन निजी सर्वरों के लिए अनुशंसित है जहाँ केवल आप और आपका बॉट हों।

  • अपने सर्वर को गिल्ड अनुमति-सूची में जोड़ें

    इससे आपका एजेंट केवल DMs में ही नहीं, बल्कि आपके सर्वर के किसी भी चैनल में उत्तर दे सकता है।

    अपने एजेंट से कहें

    "मेरी Discord Server ID <server_id> को गिल्ड अनुमति-सूची में जोड़ें"

    कॉन्फ़िगरेशन

    json5
    {channels: {discord: {groupPolicy: "allowlist",guilds: {YOUR_SERVER_ID: {  requireMention: true,  users: ["YOUR_USER_ID"],},},},},}
  • @mention के बिना उत्तरों की अनुमति दें

    डिफ़ॉल्ट रूप से एजेंट गिल्ड चैनलों में केवल तभी उत्तर देता है जब उसका @mention किया जाए। निजी सर्वर पर संभवतः आप चाहेंगे कि वह प्रत्येक संदेश का उत्तर दे।

    गिल्ड चैनलों में सामान्य उत्तर डिफ़ॉल्ट रूप से अपने-आप पोस्ट होते हैं। साझा हमेशा-सक्रिय रूम के लिए messages.groupChat.visibleReplies: "message_tool" चुनें, ताकि एजेंट निष्क्रिय रूप से देखता रहे और केवल तभी पोस्ट करे जब उसे लगे कि चैनल में उत्तर उपयोगी होगा। यह GPT-5.6 Sol जैसे नवीनतम पीढ़ी के, विश्वसनीय टूल-उपयोग वाले मॉडल के साथ सबसे अच्छा काम करता है। जब तक टूल न भेजे, परिवेशी रूम इवेंट शांत रहते हैं। पूर्ण निष्क्रिय-अवलोकन मोड कॉन्फ़िगरेशन के लिए परिवेशी रूम इवेंट देखें।

    यदि Discord टाइपिंग दिखाता है और लॉग टोकन उपयोग दिखाते हैं, लेकिन कोई संदेश पोस्ट नहीं होता, तो जाँचें कि टर्न को परिवेशी रूम इवेंट के रूप में कॉन्फ़िगर किया गया था या मैसेज-टूल के दृश्य उत्तरों का विकल्प चुना गया था।

    अपने एजेंट से कहें

    "मेरे एजेंट को इस सर्वर पर @mention किए बिना उत्तर देने की अनुमति दें"

    कॉन्फ़िगरेशन

    अपने गिल्ड कॉन्फ़िगरेशन में requireMention: false सेट करें:

    json5
    {channels: {discord: {guilds: {YOUR_SERVER_ID: {  requireMention: false,},},},},}

    दृश्यमान समूह/चैनल उत्तरों के लिए मैसेज-टूल से भेजना आवश्यक बनाने हेतु messages.groupChat.visibleReplies: "message_tool" सेट करें।

  • गिल्ड चैनलों में मेमोरी की योजना बनाएँ

    दीर्घकालिक मेमोरी (MEMORY.md) केवल DM सेशन में स्वतः लोड होती है; गिल्ड चैनल इसे लोड नहीं करते।

    अपने एजेंट से कहें

    "जब मैं Discord चैनलों में प्रश्न पूछूँ, तो यदि आपको MEMORY.md से दीर्घकालिक संदर्भ चाहिए, memory_search या memory_get का उपयोग करें।"

    मैन्युअल

    प्रत्येक चैनल में साझा संदर्भ के लिए स्थिर निर्देश AGENTS.md या USER.md में रखें (प्रत्येक सेशन में इंजेक्ट किए जाते हैं)। दीर्घकालिक नोट्स MEMORY.md में रखें और आवश्यकता होने पर मेमोरी टूल से उन तक पहुँचें।

  • अब चैनल बनाएँ और चैट करना शुरू करें। एजेंट चैनल का नाम देखता है और प्रत्येक चैनल एक पृथक सेशन होता है—अपने वर्कफ़्लो के अनुसार #coding, #home, #research या कोई अन्य उपयुक्त चैनल सेट अप करें।

    रनटाइम मॉडल

    • Gateway Discord कनेक्शन का स्वामी है।
    • उत्तर रूटिंग नियतात्मक है: Discord से आने वाले संदेशों के उत्तर Discord पर ही जाते हैं।
    • Discord गिल्ड/चैनल मेटाडेटा मॉडल प्रॉम्प्ट में अविश्वसनीय संदर्भ के रूप में जोड़ा जाता है, उपयोगकर्ता को दिखाई देने वाले उत्तर प्रीफ़िक्स के रूप में नहीं। यदि कोई मॉडल उस एनवेलप को वापस कॉपी करता है, तो OpenClaw आउटबाउंड उत्तरों और भविष्य के रीप्ले संदर्भ से कॉपी किया हुआ मेटाडेटा हटा देता है।
    • डिफ़ॉल्ट रूप से (session.dmScope=main), सीधे चैट एजेंट का मुख्य सेशन (agent:main:main) साझा करते हैं।
    • गिल्ड चैनल पृथक सेशन कुंजियाँ (agent:<agentId>:discord:channel:<channelId>) हैं।
    • समूह DMs को डिफ़ॉल्ट रूप से अनदेखा किया जाता है (channels.discord.dm.groupEnabled=false)।
    • नेटिव स्लैश कमांड पृथक कमांड सेशन (agent:<agentId>:discord:slash:<userId>) में चलते हैं, जबकि रूट किए गए वार्तालाप सेशन में CommandTargetSessionKey भी ले जाते हैं।
    • Discord पर केवल-टेक्स्ट cron/heartbeat घोषणा डिलीवरी अंतिम सहायक-दृश्य उत्तर तक सीमित हो जाती है और केवल एक बार भेजी जाती है। जब एजेंट कई डिलीवर किए जा सकने वाले पेलोड उत्सर्जित करता है, तो मीडिया और संरचित कंपोनेंट पेलोड बहु-संदेश बने रहते हैं।

    फ़ोरम चैनल

    Discord फ़ोरम और मीडिया चैनल केवल थ्रेड पोस्ट स्वीकार करते हैं। OpenClaw उन्हें बनाने के दो तरीके समर्थित करता है:

    • थ्रेड अपने-आप बनाने के लिए फ़ोरम पैरेंट (channel:<forumId>) को संदेश भेजें। थ्रेड का शीर्षक संदेश की पहली गैर-रिक्त पंक्ति होती है (Discord की 100-वर्ण वाली थ्रेड-नाम सीमा तक संक्षिप्त)।
    • सीधे थ्रेड बनाने के लिए openclaw message thread create का उपयोग करें। फ़ोरम चैनलों के लिए --message-id पास न करें।

    थ्रेड बनाने के लिए फ़ोरम पैरेंट को भेजें:

    bash
    openclaw message send --channel discord --target channel:<forumId> \  --message "विषय का शीर्षक\nपोस्ट का मुख्य भाग"

    फ़ोरम थ्रेड स्पष्ट रूप से बनाएँ:

    bash
    openclaw message thread create --channel discord --target channel:<forumId> \  --thread-name "विषय का शीर्षक" --message "पोस्ट का मुख्य भाग"

    फ़ोरम पैरेंट 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 उपयोगकर्ता ID, टैग या *)। मेल न खाने वाले उपयोगकर्ताओं को केवल उन्हें दिखाई देने वाला अस्वीकृति संदेश मिलता है।

    कंपोनेंट कॉलबैक की समय-सीमा डिफ़ॉल्ट रूप से 30 मिनट बाद समाप्त हो जाती है। डिफ़ॉल्ट खाते के लिए कॉलबैक रजिस्ट्री का जीवनकाल बदलने हेतु channels.discord.agentComponents.ttlMs या प्रत्येक खाते के लिए channels.discord.accounts.<accountId>.agentComponents.ttlMs सेट करें। मान मिलीसेकंड में होता है, धनात्मक पूर्णांक होना चाहिए और अधिकतम 86400000 (24 घंटे) तक सीमित है। लंबे TTL उन समीक्षा/अनुमोदन कार्यप्रवाहों के लिए उपयुक्त हैं जिनमें बटनों को उपयोग योग्य बनाए रखना आवश्यक है, लेकिन वे उस अवधि को बढ़ाते हैं जिसमें कोई पुराना Discord संदेश अब भी कार्रवाई ट्रिगर कर सकता है। आवश्यकता के अनुरूप सबसे छोटा TTL चुनें और यदि पुराने कॉलबैक आश्चर्यजनक होंगे, तो डिफ़ॉल्ट बनाए रखें।

    /model और /models स्लैश कमांड प्रदाता, मॉडल और संगत रनटाइम ड्रॉपडाउन के साथ एक इंटरैक्टिव मॉडल चयनकर्ता तथा सबमिट चरण खोलते हैं। /models add अप्रचलित है और चैट से मॉडल पंजीकृत करने के बजाय अप्रचलन संदेश लौटाता है। चयनकर्ता का उत्तर केवल उसे शुरू करने वाले उपयोगकर्ता को दिखाई देता है और केवल वही उसका उपयोग कर सकता है। Discord चयन मेनू 25 विकल्पों तक सीमित हैं, इसलिए यदि आप चाहते हैं कि चयनकर्ता केवल openai या vllm जैसे चुने गए प्रदाताओं के लिए गतिशील रूप से खोजे गए मॉडल दिखाए, तो agents.defaults.modelPolicy.allow में provider/* प्रविष्टियाँ जोड़ें।

    फ़ाइल अटैचमेंट:

    • file ब्लॉक को किसी अटैचमेंट संदर्भ (attachment://<filename>) की ओर इंगित करना चाहिए
    • अटैचमेंट को media/path/filePath (एक फ़ाइल) के माध्यम से दें; एकाधिक फ़ाइलों के लिए media-gallery का उपयोग करें
    • यदि अपलोड नाम को अटैचमेंट संदर्भ से मेल खाना चाहिए, तो उसे ओवरराइड करने के लिए filename का उपयोग करें

    मोडल फ़ॉर्म:

    • अधिकतम 5 फ़ील्ड के साथ components.modal जोड़ें
    • फ़ील्ड प्रकार: text, checkbox, radio, select, role-select, user-select
    • OpenClaw स्वचालित रूप से एक ट्रिगर बटन जोड़ता है

    उदाहरण:

    json5
    {  channel: "discord",  action: "send",  to: "channel:123456789012345678",  message: "वैकल्पिक फ़ॉलबैक टेक्स्ट",  components: {    reusable: true,    text: "कोई मार्ग चुनें",    blocks: [      {        type: "actions",        buttons: [          {            label: "अनुमोदित करें",            style: "success",            allowedUsers: ["123456789012345678"],          },          { label: "अस्वीकार करें", style: "danger" },        ],      },      {        type: "actions",        select: {          type: "string",          placeholder: "कोई विकल्प चुनें",          options: [            { label: "विकल्प A", value: "a" },            { label: "विकल्प B", value: "b" },          ],        },      },    ],    modal: {      title: "विवरण",      triggerLabel: "फ़ॉर्म खोलें",      fields: [        { type: "text", label: "अनुरोधकर्ता" },        {          type: "select",          label: "प्राथमिकता",          options: [            { label: "निम्न", value: "low" },            { label: "उच्च", value: "high" },          ],        },      ],    },  },}

    अभिगम नियंत्रण और रूटिंग

    DM नीति

    channels.discord.dmPolicy DM अभिगम को नियंत्रित करता है। channels.discord.allowFrom प्रामाणिक DM अनुमति-सूची है।

    • pairing (डिफ़ॉल्ट)
    • allowlist (कम-से-कम एक allowFrom प्रेषक आवश्यक है)
    • open (channels.discord.allowFrom में "*" का शामिल होना आवश्यक है)
    • disabled

    यदि DM नीति खुली नहीं है, तो अज्ञात उपयोगकर्ताओं को अवरुद्ध कर दिया जाता है (या 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> उल्लेख

    जब कोई चैनल डिफ़ॉल्ट सक्रिय होता है, तो केवल संख्यात्मक ID सामान्यतः चैनल ID के रूप में हल होते हैं, लेकिन खाते के प्रभावी DM allowFrom में सूचीबद्ध ID को संगतता के लिए उपयोगकर्ता DM लक्ष्य माना जाता है।

    अभिगम समूह

    Discord DM और टेक्स्ट कमांड प्राधिकरण, channels.discord.allowFrom में गतिशील accessGroup:<name> प्रविष्टियों का उपयोग कर सकते हैं।

    अभिगम समूह के नाम सभी संदेश चैनलों में साझा होते हैं। ऐसे स्थिर समूह के लिए type: "message.senders" का उपयोग करें जिसके सदस्य प्रत्येक चैनल के सामान्य allowFrom सिंटैक्स में व्यक्त किए गए हों, या जब किसी Discord चैनल के वर्तमान ViewChannel दर्शक-समूह से सदस्यता गतिशील रूप से निर्धारित होनी चाहिए, तब type: "discord.channelAudience" का उपयोग करें। साझा अभिगम-समूह व्यवहार: अभिगम समूह

    json5
    {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" सदस्यता को इस प्रकार मॉडल करता है: DM प्रेषक कॉन्फ़िगर किए गए गिल्ड का सदस्य है और भूमिका तथा चैनल ओवरराइड लागू होने के बाद वर्तमान में कॉन्फ़िगर किए गए चैनल पर उसके पास प्रभावी ViewChannel अनुमति है।

    उदाहरण: बॉट को DM भेजने की अनुमति ऐसे किसी भी व्यक्ति को दें जो #maintainers देख सकता है, जबकि अन्य सभी के लिए DM बंद रखें।

    json5
    {accessGroups: {maintainers: {  type: "discord.channelAudience",  guildId: "1456350064065904867",  channelId: "1456744319972282449",  membership: "canViewChannel",},},channels: {discord: {  dmPolicy: "allowlist",  allowFrom: ["accessGroup:maintainers"],},},}

    आप गतिशील और स्थिर प्रविष्टियों को मिला सकते हैं:

    json5
    {accessGroups: {maintainers: {  type: "discord.channelAudience",  guildId: "1456350064065904867",  channelId: "1456744319972282449",},},channels: {discord: {  dmPolicy: "allowlist",  allowFrom: ["accessGroup:maintainers", "discord:123456789012345678"],},},}

    लुकअप विफल होने पर अभिगम बंद रहता है। यदि Discord Missing Access लौटाता है, सदस्य लुकअप विफल होता है या चैनल किसी अलग गिल्ड से संबंधित है, तो DM प्रेषक को अनधिकृत माना जाता है।

    चैनल-दर्शक अभिगम समूहों का उपयोग करते समय Discord Developer Portal में Server Members Intent सक्षम करें। DM में गिल्ड सदस्य स्थिति शामिल नहीं होती, इसलिए OpenClaw प्राधिकरण के समय Discord REST के माध्यम से सदस्य का समाधान करता है।

    गिल्ड नीति

    गिल्ड प्रबंधन को channels.discord.groupPolicy नियंत्रित करता है:

    • open
    • allowlist
    • disabled

    जब channels.discord मौजूद हो, तो सुरक्षित आधाररेखा allowlist होती है।

    allowlist व्यवहार:

    • गिल्ड का channels.discord.guilds से मेल खाना आवश्यक है (id को प्राथमिकता दी जाती है, स्लग स्वीकार्य है)
    • वैकल्पिक प्रेषक अनुमति-सूचियाँ: users (स्थिर ID अनुशंसित) और roles (केवल भूमिका ID); यदि इनमें से कोई भी कॉन्फ़िगर किया गया है, तो प्रेषकों को अनुमति तब मिलती है जब वे users या roles से मेल खाते हैं
    • प्रत्यक्ष नाम/टैग मिलान डिफ़ॉल्ट रूप से अक्षम है; channels.discord.dangerouslyAllowNameMatching: true को केवल आपातकालीन संगतता मोड के रूप में सक्षम करें
    • users के लिए नाम/टैग समर्थित हैं, लेकिन ID अधिक सुरक्षित हैं; नाम/टैग प्रविष्टियों का उपयोग होने पर openclaw security audit चेतावनी देता है
    • यदि किसी गिल्ड के लिए channels कॉन्फ़िगर किया गया है, तो सूची में शामिल न किए गए चैनल अस्वीकृत किए जाते हैं
    • यदि किसी गिल्ड में channels ब्लॉक नहीं है, तो उस अनुमति-सूचीबद्ध गिल्ड के सभी चैनलों को अनुमति होती है

    उदाहरण:

    json5
    {channels: {discord: {  groupPolicy: "allowlist",  guilds: {    "123456789012345678": {      requireMention: true,      ignoreOtherMentions: true,      users: ["987654321098765432"],      roles: ["123456789012345678"],      channels: {        general: { enabled: true },        help: { enabled: true, requireMention: true },      },    },  },},},}

    विरासती प्रति-चैनल allow कुंजी को openclaw doctor --fix द्वारा enabled में माइग्रेट किया जाता है।

    यदि आप केवल DISCORD_BOT_TOKEN सेट करते हैं और channels.discord ब्लॉक नहीं बनाते, तो रनटाइम फ़ॉलबैक groupPolicy="allowlist" होता है (लॉग में चेतावनी के साथ), भले ही channels.defaults.groupPolicy, open हो।

    उल्लेख और समूह DM

    गिल्ड संदेशों के लिए डिफ़ॉल्ट रूप से उल्लेख आवश्यक होता है।

    उल्लेख पहचान में शामिल हैं:

    • बॉट का स्पष्ट उल्लेख
    • कॉन्फ़िगर किए गए उल्लेख पैटर्न (agents.entries.*.groupChat.mentionPatterns, फ़ॉलबैक messages.groupChat.mentionPatterns)
    • समर्थित स्थितियों में बॉट को उत्तर देने का अंतर्निहित व्यवहार

    आउटबाउंड Discord संदेश लिखते समय प्रामाणिक उल्लेख सिंटैक्स का उपयोग करें: उपयोगकर्ताओं के लिए <@USER_ID>, चैनलों के लिए <#CHANNEL_ID> और भूमिकाओं के लिए <@&ROLE_ID>। विरासती <@!USER_ID> उपनाम उल्लेख प्रारूप का उपयोग न करें।

    requireMention को प्रत्येक गिल्ड/चैनल (channels.discord.guilds...) के लिए कॉन्फ़िगर किया जाता है। ignoreOtherMentions वैकल्पिक रूप से उन संदेशों को हटा देता है जो किसी अन्य उपयोगकर्ता/भूमिका का उल्लेख करते हैं, लेकिन बॉट का नहीं (@everyone/@here को छोड़कर)।

    समूह DM:

    • डिफ़ॉल्ट: अनदेखा किया जाता है (dm.groupEnabled=false)
    • dm.groupChannels के माध्यम से वैकल्पिक अनुमति-सूची (चैनल ID या स्लग)

    भूमिका-आधारित एजेंट रूटिंग

    Discord गिल्ड सदस्यों को भूमिका ID के अनुसार अलग-अलग एजेंटों तक रूट करने के लिए bindings[].match.roles का उपयोग करें। भूमिका-आधारित बाइंडिंग केवल भूमिका ID स्वीकार करती हैं और उनका मूल्यांकन पीयर या पैरेंट-पीयर बाइंडिंग के बाद तथा केवल-गिल्ड बाइंडिंग से पहले किया जाता है। यदि कोई बाइंडिंग अन्य मिलान फ़ील्ड भी सेट करती है (उदाहरण के लिए peer + guildId + roles), तो सभी कॉन्फ़िगर किए गए फ़ील्ड का मेल खाना आवश्यक है।

    json5
    {  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 UI में दिखाई दे सकते हैं; निष्पादन OpenClaw प्रमाणीकरण लागू करता है और "अधिकृत नहीं" उत्तर देता है।
    • डिफ़ॉल्ट स्लैश कमांड सेटिंग्स: ephemeral: true (channels.discord.slashCommand.ephemeral)।

    कमांड कैटलॉग और व्यवहार के लिए स्लैश कमांड देखें।

    सुविधा विवरण

    उत्तर टैग और नेटिव उत्तर

    Discord एजेंट आउटपुट में उत्तर टैग का समर्थन करता है:

    • [[reply_to_current]]
    • [[reply_to:<id>]]

    इसे channels.discord.replyToMode नियंत्रित करता है:

    • off (डिफ़ॉल्ट): कोई अंतर्निहित उत्तर थ्रेडिंग नहीं; स्पष्ट [[reply_to_*]] टैग का अब भी पालन किया जाता है
    • first: अंतर्निहित नेटिव उत्तर संदर्भ को इस टर्न के पहले आउटबाउंड Discord संदेश से जोड़ता है
    • all: इसे प्रत्येक आउटबाउंड संदेश से जोड़ता है
    • batched: इसे केवल तब जोड़ता है जब इनबाउंड इवेंट कई संदेशों का डिबाउंस किया गया बैच था — यह तब उपयोगी है जब आप नेटिव उत्तर मुख्यतः अस्पष्ट, तेज़ी से आने वाली चैट के लिए चाहते हैं, न कि प्रत्येक एकल-संदेश टर्न के लिए

    संदेश ID संदर्भ/इतिहास में उपलब्ध कराए जाते हैं, ताकि एजेंट विशिष्ट संदेशों को लक्षित कर सकें।

    लिंक पूर्वावलोकन

    Discord डिफ़ॉल्ट रूप से URL के लिए समृद्ध लिंक एम्बेड बनाता है। OpenClaw डिफ़ॉल्ट रूप से आउटबाउंड Discord संदेशों पर उन जनरेट किए गए एम्बेड को रोकता है, इसलिए एजेंट द्वारा भेजे गए URL तब तक सामान्य लिंक बने रहते हैं, जब तक आप उन्हें स्पष्ट रूप से सक्षम नहीं करते:

    json5
    {channels: {discord: {  suppressEmbeds: false,},},}

    किसी एक अकाउंट को ओवरराइड करने के लिए channels.discord.accounts.<id>.suppressEmbeds सेट करें। एजेंट संदेश-टूल से भेजे गए संदेश किसी एक संदेश के लिए suppressEmbeds: false भी पास कर सकते हैं। स्पष्ट Discord embeds पेलोड डिफ़ॉल्ट लिंक-पूर्वावलोकन सेटिंग द्वारा नहीं रोके जाते।

    लाइव स्ट्रीम पूर्वावलोकन

    OpenClaw एक अस्थायी संदेश भेजकर और टेक्स्ट आते ही उसे संपादित करके ड्राफ़्ट उत्तर स्ट्रीम कर सकता है। channels.discord.streaming.mode, off | partial | block | progress स्वीकार करता है (जब कोई streaming/पुरानी streamMode कुंजी सेट नहीं होती, तब डिफ़ॉल्ट)। streamMode एक पुराना उपनाम है; सहेजे गए कॉन्फ़िगरेशन को मानक नेस्टेड streaming आकार में फिर से लिखने के लिए openclaw doctor --fix चलाएँ।

    json5
    {channels: {discord: {  streaming: {    mode: "progress",    progress: {      maxLines: 8,      maxLineChars: 120,      toolProgress: false,      commentary: false,    },  },},},}
    • off Discord पूर्वावलोकन संपादनों को अक्षम करता है।
    • partial टोकन आते ही एकल पूर्वावलोकन संदेश को संपादित करता है।
    • block ड्राफ़्ट-आकार के खंड उत्सर्जित करता है; streaming.preview.chunk (minChars, maxChars, breakPreference) से आकार और विराम-बिंदुओं को समायोजित करें, जिन्हें textChunkLimit तक सीमित किया जाता है। जब ब्लॉक स्ट्रीमिंग स्पष्ट रूप से सक्षम होती है, तो OpenClaw दोहरी स्ट्रीमिंग से बचने के लिए पूर्वावलोकन स्ट्रीम को छोड़ देता है।
    • progress अंतिम डिलीवरी तक एक संपादन योग्य स्थिति ड्राफ़्ट बनाए रखता है। डिफ़ॉल्ट रूप से यह एजेंट की नवीनतम प्रस्तावना या वर्णन की एक पंक्ति दिखाता है, बिना किसी जनरेट किए गए लेबल, स्पेसर या टूल पंक्ति के।
    • मीडिया, त्रुटि और स्पष्ट-उत्तर वाले अंतिम संदेश लंबित पूर्वावलोकन संपादनों को रद्द कर देते हैं।
    • streaming.preview.toolProgress का डिफ़ॉल्ट मान partial/block मोड में true होता है। Discord प्रगति मोड में डिफ़ॉल्ट रूप से कोई टूल पंक्ति नहीं होती; इसे सक्षम करने के लिए streaming.progress.toolProgress: true सेट करें।
    • 🛠️ Bash: run tests या 🔎 Web Search: for "query" जैसी संक्षिप्त टूल/प्रगति पंक्तियाँ जोड़ने के लिए streaming.progress.toolProgress: true सेट करें। संगतता के लिए, मौजूदा progress.label या progress.labels कॉन्फ़िगरेशन पहले वाले टूल-पंक्ति डिफ़ॉल्ट को बनाए रखता है; पंक्तियों के बिना कस्टम लेबल के लिए toolProgress: false सेट करें।
    • streaming.progress.commentary (डिफ़ॉल्ट false) अस्थायी प्रगति ड्राफ़्ट में अपरिष्कृत सहायक टिप्पणी को सक्षम करता है। डिफ़ॉल्ट प्रस्तावना/वर्णन स्थिति पंक्ति इस विकल्प से स्वतंत्र है। टिप्पणी को प्रदर्शित करने से पहले साफ़ किया जाता है, यह अस्थायी रहती है और अंतिम उत्तर की डिलीवरी नहीं बदलती।
    • streaming.progress.maxLineChars प्रति-पंक्ति प्रगति पूर्वावलोकन सीमा नियंत्रित करता है। गद्य को शब्द सीमाओं पर छोटा किया जाता है; कमांड और पथ विवरण उपयोगी प्रत्यय बनाए रखते हैं।
    • streaming.preview.commandText / streaming.progress.commandText संक्षिप्त प्रगति पंक्तियों में कमांड/निष्पादन विवरण नियंत्रित करता है: raw (डिफ़ॉल्ट) या status (केवल टूल लेबल)।

    संक्षिप्त प्रगति पंक्तियाँ बनाए रखते हुए अपरिष्कृत कमांड/निष्पादन टेक्स्ट छिपाएँ:

    json
    {  "channels": {    "discord": {      "streaming": {        "mode": "progress",        "progress": {          "toolProgress": true,          "commandText": "status"        }      }    }  }}

    पूर्वावलोकन स्ट्रीमिंग केवल टेक्स्ट के लिए है; मीडिया उत्तर सामान्य डिलीवरी पर वापस आ जाते हैं।

    इतिहास, संदर्भ और थ्रेड व्यवहार

    गिल्ड इतिहास संदर्भ:

    • channels.discord.historyLimit डिफ़ॉल्ट 20
    • फ़ॉलबैक: messages.groupChat.historyLimit
    • 0 अक्षम करता है

    DM इतिहास नियंत्रण:

    • channels.discord.dmHistoryLimit
    • channels.discord.dms["<user_id>"].historyLimit

    थ्रेड व्यवहार:

    • Discord थ्रेड चैनल सत्रों के रूप में रूट होते हैं और ओवरराइड न किए जाने पर पैरेंट चैनल का कॉन्फ़िगरेशन इनहेरिट करते हैं।
    • थ्रेड सत्र पैरेंट चैनल के सत्र-स्तरीय /model चयन को केवल-मॉडल फ़ॉलबैक के रूप में इनहेरिट करते हैं; थ्रेड-स्थानीय /model चयन को प्राथमिकता मिलती है, और ट्रांसक्रिप्ट इनहेरिटेंस सक्षम न होने पर पैरेंट ट्रांसक्रिप्ट इतिहास कॉपी नहीं किया जाता।
    • channels.discord.thread.inheritParent (डिफ़ॉल्ट false) नए स्वचालित थ्रेड को पैरेंट ट्रांसक्रिप्ट से आरंभिक सामग्री लेने में शामिल करता है। प्रति-अकाउंट ओवरराइड: channels.discord.accounts.<id>.thread.inheritParent
    • संदेश-टूल प्रतिक्रियाएँ user:<id> DM लक्ष्यों को हल कर सकती हैं।
    • उत्तर-चरण सक्रियण फ़ॉलबैक के दौरान guilds.<guild>.channels.<channel>.requireMention: false संरक्षित रहता है।

    चैनल विषयों को अविश्वसनीय संदर्भ के रूप में अंतःक्षेपित किया जाता है। अनुमत-सूचियाँ नियंत्रित करती हैं कि एजेंट को कौन ट्रिगर कर सकता है; वे पूर्ण पूरक-संदर्भ संशोधन सीमा नहीं हैं।

    उप-एजेंट के लिए थ्रेड-बद्ध सत्र

    Discord किसी थ्रेड को सत्र लक्ष्य से बाँध सकता है, ताकि उस थ्रेड के अनुवर्ती संदेश उसी सत्र पर रूट होते रहें (उप-एजेंट सत्रों सहित)।

    कमांड:

    • /focus <target> वर्तमान/नए थ्रेड को उप-एजेंट/सत्र लक्ष्य से बाँधता है
    • /unfocus वर्तमान थ्रेड बाइंडिंग हटाता है
    • /agents सक्रिय रन और बाइंडिंग स्थिति दिखाता है
    • /session idle <duration|off> फ़ोकस की गई बाइंडिंग के लिए निष्क्रियता-आधारित स्वचालित अनफ़ोकस का निरीक्षण/अपडेट करता है
    • /session max-age <duration|off> फ़ोकस की गई बाइंडिंग के लिए अधिकतम आयु का निरीक्षण/अपडेट करता है

    कॉन्फ़िगरेशन:

    json5
    {session: {threadBindings: {  enabled: true,  idleHours: 24,  maxAgeHours: 0,  spawnSessions: true,  defaultSpawnContext: "fork",},},}

    टिप्पणियाँ:

    • session.threadBindings.* Discord और Telegram के लिए मानक नीति है।
    • spawnSessions, sessions_spawn({ thread: true }) और ACP थ्रेड स्पॉन के लिए थ्रेड का स्वचालित निर्माण/बाइंडिंग नियंत्रित करता है। डिफ़ॉल्ट: true
    • defaultSpawnContext थ्रेड-बद्ध स्पॉन के लिए नेटिव उप-एजेंट संदर्भ नियंत्रित करता है। डिफ़ॉल्ट: "fork"
    • अप्रचलित spawnSubagentSessions/spawnAcpSessions कुंजियों को openclaw doctor --fix द्वारा माइग्रेट किया जाता है।
    • यदि थ्रेड बाइंडिंग अक्षम हैं, तो /focus और संबंधित संक्रियाएँ उपलब्ध नहीं होतीं।

    उप-एजेंट, ACP एजेंट और कॉन्फ़िगरेशन संदर्भ देखें।

    स्रोत संदेश पर उप-एजेंट की प्रगति

    पैरेंट रन शुरू करने वाले Discord संदेश पर बैकग्राउंड चाइल्ड गतिविधि दिखाने के लिए channels.discord.subagentProgress: true सेट करें।

    json5
    {channels: {discord: {  subagentProgress: true,},},}

    चाइल्ड रन सक्रिय रहने के दौरान OpenClaw, Discord टाइपिंग को एक घंटे तक सक्रिय रखता है और समवर्ती संख्या बदलने पर एक गणना प्रतिक्रिया (1️⃣ से 🔟) को बदलता है; 🔟 का अर्थ 10 या अधिक भी है। अंतिम चाइल्ड समाप्त होने के बाद गणना प्रतिक्रिया हटा दी जाती है। विफल, समय-समाप्त या समाप्त किया गया चाइल्ड 🔴 प्रतिक्रिया छोड़ता है।

    यह वैकल्पिक रूप से सक्षम होता है और निश्चित आंतरिक समय तथा इमोजी डिफ़ॉल्ट का उपयोग करता है। प्रतिक्रिया फ़ीडबैक के लिए बॉट को Add Reactions अनुमति चाहिए। अकाउंट-स्तरीय channels.discord.accounts.<id>.subagentProgress शीर्ष-स्तरीय मान को ओवरराइड करता है।

    स्थायी ACP चैनल बाइंडिंग

    स्थिर "हमेशा सक्रिय" ACP कार्यस्थलों के लिए, Discord वार्तालापों को लक्षित करने वाली शीर्ष-स्तरीय टाइप की गई ACP बाइंडिंग कॉन्फ़िगर करें।

    कॉन्फ़िगरेशन पथ: bindings[], type: "acp" और match.channel: "discord" के साथ।

    json5
    {agents: {entries: {  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 एजेंट देखें।

    प्रतिक्रिया सूचनाएँ

    प्रति-गिल्ड प्रतिक्रिया सूचना मोड (guilds.<id>.reactionNotifications):

    • off
    • own (डिफ़ॉल्ट)
    • all
    • allowlist (guilds.<id>.users का उपयोग करता है)

    प्रतिक्रिया इवेंट को सिस्टम इवेंट में बदलकर रूट किए गए Discord सत्र से जोड़ दिया जाता है।

    ऑनलाइन उपस्थिति इवेंट

    किसी मानव सदस्य के ऑफ़लाइन से ऑनलाइन होने पर रूट किए गए एजेंट को सक्रिय करने के लिए गिल्ड को सक्षम करें:

    json5
    {  channels: {    discord: {      intents: { presence: true },      guilds: {        "111111111111111111": {          presenceEvents: {            channelId: "222222222222222222",            users: ["333333333333333333"], // वैकल्पिक; चैनल दर्शकों को और सीमित करें            reconnectSuppressSeconds: 300, // वैकल्पिक; नए सत्र की शांत अवधि (0 अक्षम करता है)            burstLimit: 8, // वैकल्पिक; प्रत्येक बर्स्ट विंडो में अधिकतम इवेंट            burstWindowSeconds: 60, // वैकल्पिक; स्लाइडिंग बर्स्ट-पहचान विंडो          },        },      },    },  },}

    presenceEvents के लिए रूट किए गए एजेंट हेतु सक्षम Heartbeat और Discord Developer Portal में एप्लिकेशन के Bot पृष्ठ पर विशेषाधिकार-प्राप्त Presence Intent आवश्यक है। OpenClaw प्रत्येक पूर्ण GUILD_CREATE स्नैपशॉट से वर्तमान ऑनलाइन सदस्यों को आरंभिक रूप से दर्ज करता है, देखे गए ऑफ़लाइन-से-ऑनलाइन संक्रमणों को रूट करता है, और किसी अनदेखे सदस्य के लिए बाद में मिले पहले ऑनलाइन संकेत को भी नई उपलब्धता मानता है। हो सकता है कि वह सदस्य स्नैपशॉट के बाद ऑनलाइन आया या शामिल हुआ हो, इसलिए इवेंट किसी सटीक पूर्व स्थिति का दावा नहीं करता। केवल वे मनुष्य पात्र हैं जो channelId देख सकते हैं: चैनलों और सार्वजनिक थ्रेड के लिए चैनल या पैरेंट पर View Channel आवश्यक है, जबकि निजी थ्रेड के लिए अतिरिक्त रूप से सदस्यता या Manage Threads आवश्यक है। users उस समूह को और सीमित कर सकता है। OpenClaw बॉट और अपरिवर्तित ऑनलाइन स्थितियों को अनदेखा करता है तथा Gateway के पुनरारंभों के दौरान भी प्रति-उपयोगकर्ता आठ घंटे का कूलडाउन बनाए रखता है। जब Discord नया Gateway सत्र स्थापित करके READY भेजता है, तब गिल्ड की उपस्थिति स्थिति फिर से बनते समय OpenClaw reconnectSuppressSeconds तक (डिफ़ॉल्ट 300, 0 अक्षम करता है) उपस्थिति से प्राप्त इवेंट को रोकता है, ताकि दोबारा देखे गए सदस्य एजेंट को एक-एक करके सक्रिय न कर सकें। इसके अतिरिक्त, यह प्रत्येक गिल्ड के सफलतापूर्वक कतारबद्ध इवेंट को प्रत्येक burstWindowSeconds स्लाइडिंग विंडो (डिफ़ॉल्ट 60) में burstLimit इवेंट (डिफ़ॉल्ट 8) तक सीमित करता है और हर गिल्ड की रोक अवधि को एक बार लॉग करता है। पुनः आरंभ किया गया सत्र नया सत्र नहीं माना जाता। Discord 75,000 से अधिक सदस्यों वाले गिल्ड के स्नैपशॉट सीमित करता है; वहाँ अभिवादन से पहले OpenClaw को स्पष्ट ऑफ़लाइन अपडेट की आवश्यकता होती है। सिस्टम इवेंट में परिवर्तनशील प्रदर्शन नाम जोड़े बिना अपरिवर्तनीय उपयोगकर्ता, गिल्ड और चैनल ID होते हैं। एजेंट तय करता है कि अभिवादन करना है या नहीं और कैसे करना है।

    पावती प्रतिक्रियाएँ

    किसी इनबाउंड संदेश को OpenClaw द्वारा संसाधित किए जाने के दौरान ackReaction एक पावती इमोजी भेजता है।

    समाधान क्रम:

    • channels.discord.accounts.<accountId>.ackReaction
    • channels.discord.ackReaction
    • messages.ackReaction
    • एजेंट पहचान इमोजी फ़ॉलबैक (agents.entries.*.identity.emoji, अन्यथा "👀")

    टिप्पणियाँ:

    • Discord यूनिकोड इमोजी या कस्टम इमोजी नाम स्वीकार करता है।
    • किसी चैनल या खाते के लिए प्रतिक्रिया अक्षम करने हेतु "" का उपयोग करें।

    दायरा (messages.ackReactionScope):

    मान: "all" (DM + समूह, परिवेशी रूम इवेंट सहित), "direct" (केवल DM), "group-all" (परिवेशी रूम इवेंट के अतिरिक्त प्रत्येक समूह संदेश, कोई DM नहीं), "group-mentions" (जब बॉट का उल्लेख हो तब समूह; कोई DM नहीं, डिफ़ॉल्ट), "off" / "none" (अक्षम)।

    कॉन्फ़िगरेशन लेखन

    चैनल द्वारा आरंभ किए गए कॉन्फ़िगरेशन लेखन डिफ़ॉल्ट रूप से सक्षम होते हैं। यह /config set|unset प्रवाहों को प्रभावित करता है (जब कमांड सुविधाएँ सक्षम हों)।

    अक्षम करें:

    json5
    {channels: {discord: {  configWrites: false,},},}
    Gateway प्रॉक्सी

    Discord Gateway WebSocket ट्रैफ़िक और स्टार्टअप REST लुकअप (एप्लिकेशन ID + अनुमतिसूची समाधान) को channels.discord.proxy के साथ HTTP(S) प्रॉक्सी से रूट करें। Discord Gateway WebSocket प्रॉक्सी स्पष्ट होती है; WebSocket कनेक्शन Gateway प्रक्रिया के परिवेशी प्रॉक्सी एनवायरनमेंट वेरिएबल इनहेरिट नहीं करते। channels.discord.proxy कॉन्फ़िगर होने पर स्टार्टअप REST लुकअप इस प्रॉक्सी का उपयोग करते हैं।

    json5
    {channels: {discord: {  proxy: "http://proxy.example:8080",},},}

    प्रति-खाता ओवरराइड:

    json5
    {channels: {discord: {  accounts: {    primary: {      proxy: "http://proxy.example:8080",    },  },},},}
    PluralKit समर्थन

    प्रॉक्सी किए गए संदेशों को सिस्टम सदस्य पहचान से मैप करने के लिए PluralKit समाधान सक्षम करें:

    json5
    {channels: {discord: {  pluralkit: {    enabled: true,    token: "pk_live_...", // वैकल्पिक; निजी सिस्टम के लिए आवश्यक  },},},}

    टिप्पणियाँ:

    • अनुमतिसूचियाँ pk:<memberId> का उपयोग कर सकती हैं
    • सदस्य प्रदर्शन नाम केवल तभी नाम/स्लग द्वारा मिलाए जाते हैं जब channels.discord.dangerouslyAllowNameMatching: true
    • लुकअप मूल संदेश ID के साथ PluralKit API को क्वेरी करते हैं
    • यदि लुकअप विफल होता है, तो प्रॉक्सी किए गए संदेशों को बॉट संदेश मानकर हटा दिया जाता है, जब तक कि allowBots उन्हें आगे जाने की अनुमति न दे
    आउटबाउंड उल्लेख उपनाम

    जब एजेंटों को ज्ञात Discord उपयोगकर्ताओं के लिए नियतात्मक आउटबाउंड उल्लेखों की आवश्यकता हो, तब mentionAliases का उपयोग करें। कुंजियाँ आरंभिक @ के बिना हैंडल होती हैं; मान Discord उपयोगकर्ता ID होते हैं। अज्ञात हैंडल, @everyone, @here, और Markdown कोड स्पैन के भीतर के उल्लेख अपरिवर्तित रहते हैं।

    json5
    {channels: {discord: {  mentionAliases: {    SupportLead: "123456789012345678",  },  accounts: {    ops: {      mentionAliases: {        OpsLead: "234567890123456789",      },    },  },},},}
    उपस्थिति कॉन्फ़िगरेशन

    जब आप कोई स्थिति या गतिविधि फ़ील्ड सेट करते हैं, या स्वचालित उपस्थिति सक्षम करते हैं, तब उपस्थिति अपडेट लागू किए जाते हैं।

    केवल स्थिति:

    json5
    {channels: {discord: {  status: "idle",},},}

    गतिविधि (activity सेट होने पर कस्टम स्थिति डिफ़ॉल्ट गतिविधि प्रकार होती है):

    json5
    {channels: {discord: {  activity: "केंद्रित समय",  activityType: 4,},},}

    स्ट्रीमिंग:

    json5
    {channels: {discord: {  activity: "लाइव कोडिंग",  activityType: 1,  activityUrl: "https://twitch.tv/openclaw",},},}

    गतिविधि प्रकार मैप:

    • 0: खेल रहा है
    • 1: स्ट्रीमिंग (activityUrl आवश्यक; इसके बदले activityUrl को activityType: 1 आवश्यक है)
    • 2: सुन रहा है
    • 3: देख रहा है
    • 4: कस्टम (गतिविधि टेक्स्ट को स्थिति स्टेट के रूप में उपयोग करता है; इमोजी वैकल्पिक है)
    • 5: प्रतिस्पर्धा कर रहा है

    स्वचालित उपस्थिति (रनटाइम स्वास्थ्य संकेत):

    json5
    {channels: {discord: {  autoPresence: {    enabled: true,    intervalMs: 30000,    minUpdateIntervalMs: 15000,    exhaustedText: "टोकन समाप्त",  },},},}

    स्वचालित उपस्थिति रनटाइम उपलब्धता को Discord स्थिति से मैप करती है: स्वस्थ => ऑनलाइन, अवक्रमित या अज्ञात => निष्क्रिय, समाप्त या अनुपलब्ध => परेशान न करें। डिफ़ॉल्ट: intervalMs 30000, minUpdateIntervalMs 15000 (intervalMs से कम या उसके बराबर होना चाहिए)। वैकल्पिक टेक्स्ट ओवरराइड:

    • autoPresence.healthyText
    • autoPresence.degradedText
    • autoPresence.exhaustedText ({reason} प्लेसहोल्डर का समर्थन करता है)
    Discord में अनुमोदन

    Discord DM में बटन-आधारित अनुमोदन प्रबंधन का समर्थन करता है और वैकल्पिक रूप से मूल चैनल में अनुमोदन प्रॉम्प्ट पोस्ट कर सकता है।

    कॉन्फ़िगरेशन पथ:

    • channels.discord.execApprovals.enabled
    • channels.discord.execApprovals.approvers (वैकल्पिक; संभव होने पर commands.ownerAllowFrom पर फ़ॉलबैक करता है)
    • channels.discord.execApprovals.target (dm | channel | both, डिफ़ॉल्ट: dm)
    • agentFilter, sessionFilter, cleanupAfterResolve

    जब enabled सेट न हो या "auto" हो और कम-से-कम एक अनुमोदक को execApprovals.approvers या commands.ownerAllowFrom से हल किया जा सके, तब Discord मूल exec अनुमोदनों को स्वतः सक्षम करता है। Discord चैनल allowFrom, लेगेसी dm.allowFrom, या सीधे-संदेश defaultTo से exec अनुमोदकों का अनुमान नहीं लगाता। Discord को मूल अनुमोदन क्लाइंट के रूप में स्पष्टतः अक्षम करने के लिए enabled: false सेट करें।

    /diagnostics और /export-trajectory जैसे संवेदनशील, केवल-मालिक समूह कमांड के लिए OpenClaw अनुमोदन प्रॉम्प्ट और अंतिम परिणाम निजी रूप से भेजता है। जब आह्वान करने वाले मालिक के पास Discord मालिक रूट हो, तो यह पहले Discord DM का प्रयास करता है; अन्यथा यह commands.ownerAllowFrom से पहले उपलब्ध मालिक रूट, जैसे Telegram, पर फ़ॉलबैक करता है।

    जब target, channel या both हो, तब अनुमोदन प्रॉम्प्ट चैनल में दिखाई देता है। केवल हल किए गए अनुमोदक बटनों का उपयोग कर सकते हैं; अन्य उपयोगकर्ताओं को अल्पकालिक अस्वीकृति मिलती है। अनुमोदन प्रॉम्प्ट में कमांड टेक्स्ट शामिल होता है, इसलिए चैनल डिलीवरी केवल विश्वसनीय चैनलों में सक्षम करें। यदि सत्र कुंजी से चैनल ID प्राप्त नहीं किया जा सकता, तो OpenClaw DM डिलीवरी पर फ़ॉलबैक करता है।

    Discord अन्य चैट चैनलों द्वारा उपयोग किए जाने वाले साझा अनुमोदन बटन रेंडर करता है; मूल Discord अडैप्टर मुख्यतः अनुमोदक DM रूटिंग और चैनल फ़ैनआउट जोड़ता है। जब वे बटन मौजूद हों, तो वे प्राथमिक अनुमोदन UX होते हैं; OpenClaw को मैन्युअल /approve कमांड केवल तभी शामिल करना चाहिए जब टूल परिणाम बताए कि चैट अनुमोदन अनुपलब्ध हैं या मैन्युअल अनुमोदन ही एकमात्र मार्ग है। यदि Discord का मूल अनुमोदन रनटाइम सक्रिय नहीं है, तो OpenClaw स्थानीय नियतात्मक /approve <id> <decision> प्रॉम्प्ट दृश्यमान रखता है। यदि रनटाइम सक्रिय है लेकिन कोई मूल कार्ड किसी भी लक्ष्य तक नहीं पहुँचाया जा सकता, तो OpenClaw लंबित अनुमोदन से सटीक /approve कमांड सहित उसी चैट में फ़ॉलबैक सूचना भेजता है।

    Gateway प्रमाणीकरण और अनुमोदन समाधान साझा Gateway क्लाइंट अनुबंध का पालन करते हैं (plugin: ID, plugin.approval.resolve के माध्यम से हल होते हैं; अन्य ID, exec.approval.resolve के माध्यम से)। अनुमोदन डिफ़ॉल्ट रूप से 30 मिनट बाद समाप्त हो जाते हैं।

    Exec अनुमोदन देखें।

    टूल और कार्रवाई गेट

    Discord संदेश कार्रवाइयों में संदेश-प्रेषण, चैनल प्रशासन, मॉडरेशन, उपस्थिति और मेटाडेटा शामिल हैं।

    मुख्य उदाहरण:

    • संदेश-प्रेषण: sendMessage, readMessages, editMessage, deleteMessage, threadReply
    • प्रतिक्रियाएँ: react, reactions, emojiList
    • मॉडरेशन: timeout, kick, ban
    • उपस्थिति: setPresence

    event-create कार्रवाई अनुसूचित इवेंट की कवर छवि सेट करने के लिए वैकल्पिक image पैरामीटर (URL या स्थानीय फ़ाइल पथ) स्वीकार करती है।

    कार्रवाई गेट channels.discord.actions.* के अंतर्गत होते हैं।

    डिफ़ॉल्ट गेट व्यवहार:

    क्रिया समूह डिफ़ॉल्ट
    प्रतिक्रियाएँ, संदेश, थ्रेड, पिन, पोल, खोज, सदस्य जानकारी, भूमिका जानकारी, चैनल जानकारी, चैनल, वॉइस स्थिति, ईवेंट, स्टिकर, इमोजी अपलोड, स्टिकर अपलोड, अनुमतियाँ सक्षम
    भूमिकाएँ अक्षम
    मॉडरेशन अक्षम
    उपस्थिति अक्षम

    कंपोनेंट्स v2 UI

    OpenClaw निष्पादन अनुमोदनों और क्रॉस-कॉन्टेक्स्ट मार्कर के लिए Discord कंपोनेंट्स v2 का उपयोग करता है। Discord संदेश क्रियाएँ कस्टम UI के लिए 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 सेट करें।

    उदाहरण:

    json5
    {  channels: {    discord: {      ui: {        components: {          accentColor: "#5865F2",        },      },    },  },}

    वॉइस

    Discord में दो अलग-अलग वॉइस सतहें हैं: रीयलटाइम वॉइस चैनल (निरंतर बातचीत) और वॉइस संदेश अटैचमेंट (वेवफ़ॉर्म पूर्वावलोकन प्रारूप)। Gateway दोनों का समर्थन करता है।

    वॉइस चैनल

    सेटअप चेकलिस्ट:

    1. Discord Developer Portal में Message Content Intent सक्षम करें।
    2. भूमिका/उपयोगकर्ता अनुमत-सूचियों का उपयोग होने पर Server Members Intent सक्षम करें।
    3. बॉट को bot और applications.commands स्कोप के साथ आमंत्रित करें।
    4. लक्ष्य वॉइस चैनल में Connect, Speak, Send Messages और Read Message History प्रदान करें।
    5. नेटिव कमांड (commands.native या channels.discord.commands.native) सक्षम करें।
    6. channels.discord.voice कॉन्फ़िगर करें।

    सत्रों को नियंत्रित करने के लिए /vc join|leave|status का उपयोग करें। कमांड अकाउंट के डिफ़ॉल्ट एजेंट का उपयोग करता है और अन्य Discord कमांड की तरह समान अनुमत-सूची और समूह नीति नियमों का पालन करता है।

    bash
    /vc join channel:<voice-channel-id>/vc status/vc leave

    शामिल होने से पहले बॉट की प्रभावी अनुमतियों का निरीक्षण करने के लिए:

    bash
    openclaw channels capabilities --channel discord --target channel:<voice-channel-id>

    स्वतः शामिल होने का उदाहरण:

    json5
    {  channels: {    discord: {      voice: {        enabled: true,        model: "openai/gpt-5.6-sol",        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.1",          speakerVoice: "cedar",        },      },    },  },}

    टिप्पणियाँ:

    • केवल-टेक्स्ट कॉन्फ़िगरेशन के लिए Discord वॉइस ऑप्ट-इन है; /vc कमांड, वॉइस रनटाइम और GuildVoiceStates Gateway इंटेंट सक्षम करने के लिए channels.discord.voice.enabled=true सेट करें (या मौजूदा channels.discord.voice ब्लॉक बनाए रखें)। channels.discord.intents.voiceStates इंटेंट सब्सक्रिप्शन को स्पष्ट रूप से ओवरराइड कर सकता है; प्रभावी वॉइस सक्षमता का अनुसरण करने के लिए इसे सेट न करें।
    • voice.mode वार्तालाप पथ नियंत्रित करता है। डिफ़ॉल्ट agent-proxy है: एक रीयलटाइम वॉइस फ़्रंट एंड टर्न का समय, व्यवधान और प्लेबैक संभालता है, openclaw_agent_consult के माध्यम से रूट किए गए OpenClaw एजेंट को मूल कार्य सौंपता है और परिणाम को उस वक्ता से आए टाइप किए गए Discord प्रॉम्प्ट की तरह मानता है। stt-tts पुराने बैच STT और TTS प्रवाह को बनाए रखता है। bidi रीयलटाइम मॉडल को सीधे वार्तालाप करने देता है और साथ ही OpenClaw मस्तिष्क के लिए openclaw_agent_consult उपलब्ध कराता है।
    • voice.agentSession नियंत्रित करता है कि वॉइस टर्न किस OpenClaw वार्तालाप को प्राप्त होंगे। वॉइस चैनल के अपने सत्र के लिए इसे सेट न करें, या वॉइस चैनल को #maintainers जैसे किसी मौजूदा Discord टेक्स्ट चैनल सत्र के माइक्रोफ़ोन/स्पीकर विस्तार के रूप में काम करने देने के लिए { mode: "target", target: "channel:<text-channel-id>" } सेट करें।
    • voice.model Discord वॉइस प्रतिक्रियाओं और रीयलटाइम परामर्शों के लिए OpenClaw एजेंट मस्तिष्क को ओवरराइड करता है। रूट किए गए एजेंट मॉडल को इनहेरिट करने के लिए इसे सेट न करें। यह 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 मोड में, STT tools.media.audio का उपयोग करता है; voice.model ट्रांसक्रिप्शन को प्रभावित नहीं करता।
    • रीयलटाइम मोड में, voice.realtime.provider, voice.realtime.model और voice.realtime.speakerVoice रीयलटाइम ऑडियो सत्र कॉन्फ़िगर करते हैं। OpenAI Realtime 2.1 और Codex मस्तिष्क के लिए voice.realtime.model: "gpt-realtime-2.1" और voice.model: "openai/gpt-5.6-sol" का उपयोग करें।
    • रीयलटाइम वॉइस मोड डिफ़ॉल्ट रूप से रीयलटाइम प्रदाता निर्देशों में छोटी IDENTITY.md, USER.md और SOUL.md प्रोफ़ाइल फ़ाइलें शामिल करते हैं, ताकि तेज़ प्रत्यक्ष टर्न रूट किए गए OpenClaw एजेंट जैसी ही पहचान, उपयोगकर्ता-आधार और व्यक्तित्व बनाए रखें। इसे अनुकूलित करने के लिए voice.realtime.bootstrapContextFiles को किसी उपसमुच्चय पर सेट करें, या इसे अक्षम करने के लिए [] सेट करें। केवल वे प्रोफ़ाइल फ़ाइलें समर्थित हैं; AGENTS.md सामान्य एजेंट संदर्भ में बनी रहती है। इंजेक्ट किया गया प्रोफ़ाइल संदर्भ कार्यस्थान के कार्य, वर्तमान तथ्यों, मेमोरी खोज या टूल-समर्थित कार्रवाइयों के लिए openclaw_agent_consult को प्रतिस्थापित नहीं करता।
    • OpenAI agent-proxy रीयलटाइम मोड में, वेक-नाम गेटिंग डिफ़ॉल्ट रूप से कमरे के अनुरूप ढलती है: एक व्यक्ति बिना वेक नाम के स्वाभाविक रूप से बात कर सकता है, जबकि दो या अधिक व्यक्तियों को टर्न की शुरुआत या अंत वेक नाम से करना होगा। अन्य बॉट लोगों की संख्या में नहीं गिने जाते। हमेशा वेक नाम आवश्यक करने के लिए voice.realtime.requireWakeName: true या कभी भी आवश्यक न करने के लिए false सेट करें। कॉन्फ़िगर किए गए वेक नाम एक या दो शब्दों के होने चाहिए। यदि voice.realtime.wakeNames सेट नहीं है, तो OpenClaw रूट किए गए एजेंट के name के साथ OpenClaw का उपयोग करता है और अनुपलब्ध होने पर एजेंट आईडी के साथ OpenClaw का उपयोग करता है। सक्रिय वेक-नाम गेट रीयलटाइम प्रदाता की स्वचालित प्रतिक्रिया अक्षम करता है, स्वीकृत टर्न को OpenClaw एजेंट परामर्श पथ से रूट करता है और अंतिम ट्रांसक्रिप्ट आने से पहले आंशिक ट्रांसक्रिप्शन में आरंभिक वेक नाम पहचाने जाने पर संक्षिप्त मौखिक अभिस्वीकृति देता है। यह नीति वॉइस को दोबारा कनेक्ट किए बिना लाइव शामिल होने और बाहर निकलने की घटनाओं का अनुसरण करती है।
    • OpenAI रीयलटाइम प्रदाता आउटपुट ऑडियो और ट्रांसक्रिप्ट इवेंट के लिए वर्तमान Realtime 2 इवेंट नाम और पुराने Codex-संगत उपनाम स्वीकार करता है, ताकि संगत प्रदाता स्नैपशॉट में बदलाव होने पर भी सहायक का ऑडियो न छूटे।
    • voice.realtime.bargeIn नियंत्रित करता है कि Discord में वक्ता के बोलना शुरू करने की घटनाएँ सक्रिय रीयलटाइम प्लेबैक को बाधित करेंगी या नहीं। यदि सेट नहीं है, तो यह रीयलटाइम प्रदाता की इनपुट-ऑडियो व्यवधान सेटिंग का अनुसरण करता है।
    • voice.realtime.minBargeInAudioEndMs वह न्यूनतम सहायक प्लेबैक अवधि नियंत्रित करता है जिसके बाद OpenAI रीयलटाइम बार्ज-इन ऑडियो को काटता है। डिफ़ॉल्ट: 250। कम प्रतिध्वनि वाले कमरों में तत्काल व्यवधान के लिए 0 सेट करें, या अधिक प्रतिध्वनि वाले स्पीकर सेटअप के लिए इसे बढ़ाएँ।
    • voice.tts केवल stt-tts वॉइस प्लेबैक के लिए tts को ओवरराइड करता है; रीयलटाइम मोड इसके बजाय voice.realtime.speakerVoice का उपयोग करते हैं। Discord प्लेबैक पर OpenAI वॉइस के लिए voice.tts.provider: "openai" सेट करें और voice.tts.providers.openai.speakerVoice के अंतर्गत टेक्स्ट-टू-स्पीच वॉइस चुनें। वर्तमान OpenAI TTS मॉडल पर cedar पुरुषोचित ध्वनि वाला एक अच्छा विकल्प है।
    • प्रति-चैनल Discord systemPrompt ओवरराइड उस वॉइस चैनल के वॉइस ट्रांसक्रिप्ट टर्न पर लागू होते हैं।
    • जब OpenClaw किसी वॉइस चैनल में शामिल होता है, तो रूट किए गए एजेंट सत्र को वर्तमान प्रतिभागी सूची वाला एक मौन सिस्टम इवेंट मिलता है। बाद में प्रतिभागियों के शामिल होने और बाहर निकलने पर उस सत्र को बिना किसी अनचाही मौखिक प्रतिक्रिया के अपडेट किया जाता है; Discord प्रदर्शन नामों को अविश्वसनीय लेबल माना जाता है। अधिकृत वॉइस टर्न को भी प्रतिभागियों की नई सूची का स्नैपशॉट मिलता है।
    • वॉइस ट्रांसक्रिप्ट टर्न और /vc कमांड स्वामी स्थिति के लिए commands.ownerAllowFrom में मौजूद Discord प्रविष्टियों का उपयोग करते हैं। जब कोई Discord कमांड स्वामी कॉन्फ़िगर नहीं होता, तो चुने गए Discord खाते का allowFrom (या पुराना dm.allowFrom) स्वामी स्थिति दिए बिना भी वॉइस एक्सेस अधिकृत कर सकता है। एजेंट टूल की दृश्यता रूट किए गए सत्र के लिए कॉन्फ़िगर की गई टूल नीति का अनुसरण करती है।
    • यदि voice.autoJoin में एक ही गिल्ड के लिए कई प्रविष्टियाँ हैं, तो OpenClaw उस गिल्ड के लिए अंतिम कॉन्फ़िगर किए गए चैनल में शामिल होता है।
    • voice.allowedChannels एक वैकल्पिक निवास अनुमति-सूची है। /vc join को किसी भी अधिकृत Discord वॉइस चैनल में जाने देने के लिए इसे सेट न करें। सेट होने पर /vc join, स्टार्टअप पर स्वचालित रूप से शामिल होना और बॉट की वॉइस-स्थिति में स्थानांतरण सूचीबद्ध { guildId, channelId } प्रविष्टियों तक सीमित रहते हैं। Discord वॉइस में शामिल होने की सभी कार्रवाइयाँ अस्वीकार करने के लिए इसे रिक्त ऐरे पर सेट करें। यदि Discord बॉट को अनुमति-सूची से बाहर ले जाता है, तो OpenClaw उस चैनल से बाहर निकल जाता है और उपलब्ध होने पर कॉन्फ़िगर किए गए स्वतः-शामिल लक्ष्य में दोबारा शामिल होता है।
    • voice.daveEncryption और voice.decryptionFailureTolerance, @discordjs/voice के शामिल होने के विकल्पों को सीधे भेजे जाते हैं; अपस्ट्रीम डिफ़ॉल्ट daveEncryption=true और decryptionFailureTolerance=24 हैं।
    • OpenClaw, Discord वॉइस प्राप्ति और रीयलटाइम रॉ PCM प्लेबैक के लिए बंडल किए गए libopus-wasm कोडेक का उपयोग करता है। इसके साथ पिन किया हुआ libopus WebAssembly बिल्ड आता है और इसे नेटिव opus ऐडऑन की आवश्यकता नहीं होती।
    • voice.connectTimeoutMs, /vc join और स्वतः-शामिल होने के प्रयासों के लिए आरंभिक @discordjs/voice Ready प्रतीक्षा नियंत्रित करता है। डिफ़ॉल्ट: 30000
    • voice.reconnectGraceMs नियंत्रित करता है कि OpenClaw डिस्कनेक्ट हुए वॉइस सत्र को नष्ट करने से पहले उसके पुनः कनेक्ट होना शुरू करने की कितनी देर प्रतीक्षा करता है। डिफ़ॉल्ट: 15000
    • stt-tts मोड में, केवल किसी अन्य उपयोगकर्ता के बोलना शुरू करने से वॉइस प्लेबैक बंद नहीं होता। फ़ीडबैक लूप से बचने के लिए, TTS चलते समय OpenClaw नए वॉइस कैप्चर को अनदेखा करता है; अगले टर्न के लिए प्लेबैक समाप्त होने के बाद बोलें। रीयलटाइम मोड वक्ता के बोलना शुरू करने की घटनाओं को बार्ज-इन संकेतों के रूप में रीयलटाइम प्रदाता को भेजते हैं।
    • रीयलटाइम मोड में, स्पीकर से खुले माइक में आने वाली प्रतिध्वनि बार्ज-इन जैसी लग सकती है और प्लेबैक बाधित कर सकती है। अधिक प्रतिध्वनि वाले Discord कमरों में, इनपुट ऑडियो पर OpenAI का स्वतः बाधित होना रोकने के लिए voice.realtime.providers.openai.interruptResponseOnInputAudio: false सेट करें। यदि आप अब भी चाहते हैं कि Discord में वक्ता के बोलना शुरू करने की घटनाएँ सक्रिय प्लेबैक बाधित करें, तो voice.realtime.bargeIn: true जोड़ें। OpenAI रीयलटाइम ब्रिज voice.realtime.minBargeInAudioEndMs से छोटी प्लेबैक कटौतियों को संभावित प्रतिध्वनि/शोर मानकर अनदेखा करता है और Discord प्लेबैक साफ़ करने के बजाय उन्हें छोड़ा गया दर्ज करता है।
    • voice.captureSilenceGraceMs नियंत्रित करता है कि Discord द्वारा वक्ता के रुकने की सूचना देने के बाद OpenClaw उस ऑडियो खंड को STT के लिए अंतिम रूप देने से पहले कितनी देर प्रतीक्षा करता है। डिफ़ॉल्ट: 2000; यदि Discord सामान्य विरामों को असंबद्ध आंशिक ट्रांसक्रिप्ट में बाँटता है, तो इसे बढ़ाएँ।
    • जब ElevenLabs चुना गया TTS प्रदाता होता है, तो Discord वॉइस प्लेबैक स्ट्रीमिंग TTS का उपयोग करता है और प्रदाता की प्रतिक्रिया स्ट्रीम से शुरू होता है। स्ट्रीमिंग समर्थन के बिना प्रदाता संश्लेषित अस्थायी-फ़ाइल पथ पर वापस लौटते हैं।
    • OpenClaw प्राप्ति डिक्रिप्शन विफलताओं की निगरानी करता है और छोटी अवधि में बार-बार विफलता होने पर वॉइस चैनल से निकलकर फिर से शामिल होते हुए स्वचालित रूप से पुनर्प्राप्त करता है।
    • यदि अपडेट करने के बाद प्राप्ति लॉग बार-बार DecryptionFailed(UnencryptedWhenPassthroughDisabled) दिखाते हैं, तो निर्भरता रिपोर्ट और लॉग एकत्र करें। बंडल की गई @discordjs/voice लाइन में discord.js PR #11449 का अपस्ट्रीम पैडिंग सुधार शामिल है, जिसने discord.js समस्या #11419 को बंद किया था।
    • जब OpenClaw कैप्चर किए गए वक्ता खंड को अंतिम रूप देता है, तब The operation was aborted प्राप्ति इवेंट अपेक्षित होते हैं; वे विस्तृत निदान हैं, चेतावनियाँ नहीं।
    • विस्तृत Discord वॉइस लॉग में प्रत्येक स्वीकृत वक्ता खंड के लिए सीमित एक-पंक्ति STT ट्रांसक्रिप्ट पूर्वावलोकन शामिल होता है, ताकि डीबगिंग में असीमित ट्रांसक्रिप्ट टेक्स्ट डंप किए बिना उपयोगकर्ता पक्ष और एजेंट के उत्तर, दोनों पक्ष दिखाई दें।
    • agent-proxy मोड में, बलपूर्वक परामर्श फ़ॉलबैक संभावित रूप से अधूरे ट्रांसक्रिप्ट अंशों को छोड़ देता है, जैसे ... पर समाप्त होने वाला टेक्स्ट या "and" जैसा अंतिम संयोजक, और "be right back" या "bye" जैसे स्पष्ट रूप से कार्रवाई योग्य न होने वाले समापन। जब यह किसी पुराने कतारबद्ध उत्तर को रोकता है, तो लॉग forced agent consult skipped reason=... दिखाते हैं।

    वॉइस में उपयोगकर्ताओं का अनुसरण करें

    जब आप चाहते हैं कि Discord वॉइस बॉट स्टार्टअप पर किसी निश्चित चैनल में शामिल होने या /vc join की प्रतीक्षा करने के बजाय एक या अधिक ज्ञात Discord उपयोगकर्ताओं के साथ बना रहे, तब voice.followUsers का उपयोग करें।

    json5
    {  channels: {    discord: {      voice: {        enabled: true,        followUsersEnabled: true,        followUsers: ["discord:123456789012345678"],        allowedChannels: [          {            guildId: "123456789012345678",            channelId: "234567890123456789",          },        ],      },    },  },}

    व्यवहार:

    • followUsers अपरिष्कृत Discord उपयोगकर्ता ID और discord:<id> मान स्वीकार करता है। OpenClaw वॉइस-स्टेट इवेंट का मिलान करने से पहले दोनों प्रारूपों को सामान्यीकृत करता है।
    • followUsers कॉन्फ़िगर होने पर followUsersEnabled का डिफ़ॉल्ट मान true होता है। सहेजी गई सूची बनाए रखते हुए स्वचालित वॉइस अनुसरण रोकने के लिए इसे false पर सेट करें।
    • followUsers केवल वॉइस उपस्थिति नियंत्रित करता है। यह वक्ता पहुँच या स्वामी अधिकार प्रदान नहीं करता; commands.ownerAllowFrom और गिल्ड या चैनल उपयोगकर्ताओं तथा भूमिकाओं को अलग से कॉन्फ़िगर करें।
    • जब अनुसरण किया जा रहा कोई उपयोगकर्ता किसी अनुमत वॉइस चैनल से जुड़ता है, तो OpenClaw उस चैनल से जुड़ जाता है। उपयोगकर्ता के स्थानांतरित होने पर OpenClaw भी उसके साथ स्थानांतरित होता है। सक्रिय अनुसरण किए जा रहे उपयोगकर्ता के डिस्कनेक्ट होने पर OpenClaw चैनल छोड़ देता है।
    • यदि एक ही गिल्ड में अनुसरण किए जा रहे कई उपयोगकर्ता हैं और सक्रिय अनुसरण किया जा रहा उपयोगकर्ता चला जाता है, तो OpenClaw गिल्ड छोड़ने से पहले किसी अन्य ट्रैक किए जा रहे उपयोगकर्ता के चैनल पर स्थानांतरित होता है। यदि अनुसरण किए जा रहे कई उपयोगकर्ता एक साथ स्थानांतरित होते हैं, तो सबसे हाल में देखा गया वॉइस-स्टेट इवेंट प्रभावी होता है।
    • allowedChannels अब भी लागू होता है। किसी अस्वीकृत चैनल में अनुसरण किए जा रहे उपयोगकर्ता को अनदेखा किया जाता है और अनुसरण-स्वामित्व वाला सत्र किसी अन्य अनुसरण किए जा रहे उपयोगकर्ता के पास चला जाता है या चैनल छोड़ देता है।
    • OpenClaw स्टार्टअप पर और एक सीमित अंतराल पर छूटे हुए वॉइस-स्टेट इवेंट का मिलान करता है। मिलान कॉन्फ़िगर किए गए गिल्ड का नमूना लेता है और प्रत्येक रन में REST लुकअप सीमित करता है, इसलिए बहुत बड़ी followUsers सूचियों को अभिसरित होने में एक से अधिक अंतराल लग सकते हैं।
    • यदि किसी उपयोगकर्ता का अनुसरण करते समय Discord या कोई एडमिन बॉट को स्थानांतरित करता है, तो गंतव्य अनुमत होने पर OpenClaw वॉइस सत्र को फिर से बनाता है और अनुसरण स्वामित्व बनाए रखता है। यदि बॉट को allowedChannels से बाहर स्थानांतरित किया जाता है, तो OpenClaw चैनल छोड़कर कॉन्फ़िगर किया गया लक्ष्य उपलब्ध होने पर उससे दोबारा जुड़ता है।
    • बार-बार डिक्रिप्शन विफल होने के बाद DAVE रिसीव रिकवरी उसी चैनल को छोड़कर दोबारा जुड़ सकती है। अनुसरण-स्वामित्व वाले सत्र उस रिकवरी पथ के दौरान अपना अनुसरण स्वामित्व बनाए रखते हैं, इसलिए बाद में अनुसरण किए जा रहे उपयोगकर्ता के डिस्कनेक्ट होने पर भी चैनल छोड़ दिया जाता है।

    जुड़ने के मोड में से चुनें:

    • व्यक्तिगत या ऑपरेटर सेटअप के लिए followUsers का उपयोग करें, जहाँ आपके वॉइस में होने पर बॉट को स्वचालित रूप से वॉइस में होना चाहिए।
    • निश्चित-कक्ष बॉट के लिए autoJoin का उपयोग करें, जिन्हें किसी ट्रैक किए गए उपयोगकर्ता के वॉइस में न होने पर भी उपस्थित रहना चाहिए।
    • एकबारगी जुड़ने या ऐसे कक्षों के लिए /vc join का उपयोग करें, जहाँ स्वचालित वॉइस उपस्थिति अप्रत्याशित होगी।

    Discord वॉइस कोडेक:

    • वॉइस रिसीव लॉग discord voice: opus decoder: libopus-wasm दिखाते हैं।
    • रीयलटाइम प्लेबैक, पैकेट को @discordjs/voice को सौंपने से पहले, उसी बंडल किए गए libopus-wasm पैकेज से अपरिष्कृत 48 kHz स्टीरियो PCM को Opus में एन्कोड करता है।
    • फ़ाइल और प्रदाता-स्ट्रीम प्लेबैक ffmpeg से अपरिष्कृत 48 kHz स्टीरियो PCM में ट्रांसकोड करता है, फिर Discord को भेजे जाने वाले Opus पैकेट स्ट्रीम के लिए libopus-wasm का उपयोग करता है।

    STT और TTS पाइपलाइन:

    • Discord PCM कैप्चर को एक अस्थायी WAV फ़ाइल में बदला जाता है।
    • tools.media.audio STT संभालता है, उदाहरण के लिए openai/gpt-4o-mini-transcribe
    • प्रतिलेख को Discord इनग्रेस और रूटिंग के माध्यम से भेजा जाता है, जबकि प्रतिक्रिया LLM ऐसी वॉइस-आउटपुट नीति के साथ चलता है जो एजेंट के tts टूल को छिपाती है और लौटाया गया टेक्स्ट माँगती है, क्योंकि अंतिम TTS प्लेबैक का स्वामित्व Discord वॉइस के पास होता है।
    • voice.model सेट होने पर केवल इस वॉइस-चैनल टर्न के प्रतिक्रिया LLM को ओवरराइड करता है।
    • voice.tts को tts के ऊपर मर्ज किया जाता है; स्ट्रीमिंग-सक्षम प्रदाता सीधे प्लेयर को फ़ीड करते हैं, अन्यथा परिणामी ऑडियो फ़ाइल जुड़े हुए चैनल में चलाई जाती है।

    डिफ़ॉल्ट एजेंट-प्रॉक्सी वॉइस-चैनल सत्र का उदाहरण:

    json5
    {  channels: {    discord: {      voice: {        enabled: true,        model: "openai/gpt-5.6-sol",        followUsersEnabled: true,        followUsers: ["123456789012345678"],        realtime: {          provider: "openai",          model: "gpt-realtime-2.1",          speakerVoice: "cedar",        },      },    },  },}

    voice.agentSession ब्लॉक न होने पर प्रत्येक वॉइस चैनल को अपना रूट किया गया OpenClaw सत्र मिलता है। उदाहरण के लिए, /vc join channel:234567890123456789 उस Discord वॉइस चैनल के सत्र से बात करता है। रीयलटाइम मॉडल केवल वॉइस फ़्रंट एंड है; महत्वपूर्ण अनुरोध कॉन्फ़िगर किए गए OpenClaw एजेंट को सौंपे जाते हैं। यदि रीयलटाइम मॉडल कंसल्ट टूल को कॉल किए बिना अंतिम प्रतिलेख बनाता है, तो OpenClaw फ़ॉलबैक के रूप में कंसल्ट को बाध्य करता है, ताकि डिफ़ॉल्ट व्यवहार अब भी एजेंट से बात करने जैसा रहे।

    लेगेसी STT और TTS का उदाहरण:

    json5
    {  channels: {    discord: {      voice: {        enabled: true,        mode: "stt-tts",        model: "openai/gpt-5.4-mini",        tts: {          provider: "openai",          providers: {            openai: {              model: "gpt-4o-mini-tts",              speakerVoice: "cedar",            },          },        },      },    },  },}

    रीयलटाइम द्विदिश उदाहरण:

    json5
    {  channels: {    discord: {      voice: {        enabled: true,        mode: "bidi",        model: "openai/gpt-5.6-sol",        realtime: {          provider: "openai",          model: "gpt-realtime-2.1",          speakerVoice: "cedar",          toolPolicy: "safe-read-only",          consultPolicy: "always",        },      },    },  },}

    किसी मौजूदा Discord चैनल सत्र के विस्तार के रूप में वॉइस:

    json5
    {  channels: {    discord: {      voice: {        enabled: true,        mode: "agent-proxy",        model: "openai/gpt-5.6-sol",        agentSession: {          mode: "target",          target: "channel:123456789012345678",        },        realtime: {          provider: "openai",          model: "gpt-realtime-2.1",          speakerVoice: "cedar",        },      },    },  },}

    agent-proxy मोड में बॉट कॉन्फ़िगर किए गए वॉइस चैनल से जुड़ता है, लेकिन OpenClaw एजेंट टर्न लक्ष्य चैनल के सामान्य रूट किए गए सत्र और एजेंट का उपयोग करते हैं। रीयलटाइम वॉइस सत्र लौटाए गए परिणाम को वॉइस चैनल में बोलता है। सुपरवाइज़र एजेंट अपनी टूल नीति के अनुसार सामान्य संदेश टूल का उपयोग अब भी कर सकता है, जिसमें उचित कार्रवाई होने पर एक अलग Discord संदेश भेजना शामिल है।

    प्रत्यायोजित OpenClaw रन सक्रिय होने के दौरान, नया एजेंट टर्न शुरू करने से पहले नए Discord वॉइस प्रतिलेख को लाइव रन नियंत्रण माना जाता है। "स्थिति", "इसे रद्द करें", "छोटे सुधार का उपयोग करें", या "काम पूरा होने पर परीक्षण भी जाँचें" जैसे वाक्यांशों को सक्रिय सत्र के लिए स्थिति, रद्दीकरण, मार्गदर्शन या फ़ॉलो-अप इनपुट के रूप में वर्गीकृत किया जाता है। स्थिति, रद्दीकरण, स्वीकृत मार्गदर्शन और फ़ॉलो-अप परिणाम वॉइस चैनल में वापस बोले जाते हैं, ताकि कॉलर को पता रहे कि OpenClaw ने अनुरोध संभाला या नहीं।

    उपयोगी लक्ष्य प्रारूप:

    • target: "channel:123456789012345678" किसी Discord टेक्स्ट चैनल सत्र के माध्यम से रूट करता है।
    • target: "123456789012345678" को चैनल लक्ष्य माना जाता है।
    • target: "dm:123456789012345678" या target: "user:123456789012345678" उस डायरेक्ट-मैसेज सत्र के माध्यम से रूट करता है।

    अधिक प्रतिध्वनि वाला OpenAI Realtime उदाहरण:

    json5
    {  channels: {    discord: {      voice: {        enabled: true,        mode: "bidi",        model: "openai/gpt-5.6-sol",        realtime: {          provider: "openai",          model: "gpt-realtime-2.1",          speakerVoice: "cedar",          bargeIn: true,          minBargeInAudioEndMs: 500,          consultPolicy: "always",          providers: {            openai: {              interruptResponseOnInputAudio: false,            },          },        },      },    },  },}

    इसका उपयोग तब करें जब मॉडल खुले माइक से अपना ही Discord प्लेबैक सुनता हो, लेकिन आप फिर भी बोलकर उसे बाधित करना चाहते हों। OpenClaw अपरिष्कृत इनपुट ऑडियो पर OpenAI को स्वतः बाधित होने से रोकता है, जबकि bargeIn: true Discord स्पीकर-स्टार्ट इवेंट और पहले से सक्रिय स्पीकर ऑडियो को अगला कैप्चर किया गया टर्न OpenAI तक पहुँचने से पहले सक्रिय रीयलटाइम प्रतिक्रियाएँ रद्द करने देता है। minBargeInAudioEndMs से कम audioEndMs वाले बहुत शुरुआती बार्ज-इन संकेतों को संभावित प्रतिध्वनि/शोर मानकर अनदेखा किया जाता है, ताकि मॉडल पहले प्लेबैक फ़्रेम पर ही बोलना बंद न कर दे।

    अपेक्षित वॉइस लॉग:

    • जुड़ने पर: 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

    कटे हुए ऑडियो को डीबग करने के लिए रीयलटाइम वॉइस लॉग को समयरेखा के रूप में पढ़ें:

    1. realtime audio playback started का अर्थ है कि Discord ने सहायक ऑडियो चलाना शुरू कर दिया है। इस बिंदु से ब्रिज सहायक आउटपुट चंक, Discord PCM बाइट, प्रदाता रीयलटाइम बाइट और संश्लेषित ऑडियो अवधि गिनना शुरू करता है।
    2. realtime speaker turn opened किसी Discord स्पीकर के सक्रिय होने को चिह्नित करता है। यदि प्लेबैक पहले से सक्रिय है और bargeIn सक्षम है, तो इसके बाद barge-in detected source=speaker-start आ सकता है।
    3. realtime input audio started उस स्पीकर टर्न के लिए प्राप्त पहले वास्तविक ऑडियो फ़्रेम को चिह्नित करता है। यहाँ outputActive=true या शून्य से अधिक outputAudioMs का अर्थ है कि सहायक प्लेबैक सक्रिय रहने के दौरान माइक इनपुट भेज रहा है।
    4. barge-in detected source=active-speaker-audio का अर्थ है कि सहायक प्लेबैक सक्रिय रहने के दौरान OpenClaw ने लाइव स्पीकर ऑडियो देखा। यह वास्तविक व्यवधान को ऐसे Discord स्पीकर-स्टार्ट इवेंट से अलग करने में उपयोगी है जिसमें कोई उपयोगी ऑडियो नहीं है।
    5. barge-in requested reason=... का अर्थ है कि OpenClaw ने रीयलटाइम प्रदाता से सक्रिय प्रतिक्रिया को रद्द या छोटा करने के लिए कहा। इसमें outputAudioMs, outputActive, और playbackChunks शामिल हैं, ताकि आप देख सकें कि व्यवधान से पहले सहायक का कितना ऑडियो वास्तव में चल चुका था।
    6. realtime audio playback stopped reason=... स्थानीय Discord प्लेबैक रीसेट बिंदु है। कारण बताता है कि प्लेबैक किसने रोका: barge-in, player-idle, provider-clear-audio, forced-agent-consult, stream-close, या session-close
    7. realtime speaker turn closed कैप्चर किए गए इनपुट टर्न का सारांश देता है। chunks=0 या hasAudio=false का अर्थ है कि स्पीकर टर्न खुला, लेकिन कोई उपयोग योग्य ऑडियो रीयलटाइम ब्रिज तक नहीं पहुँचा। interruptedPlayback=true का अर्थ है कि वह इनपुट टर्न सहायक आउटपुट के साथ ओवरलैप हुआ और उसने बार्ज-इन लॉजिक ट्रिगर किया।

    उपयोगी फ़ील्ड:

    • outputAudioMs: लॉग पंक्ति से पहले रीयलटाइम प्रदाता द्वारा जनरेट की गई सहायक ऑडियो अवधि।
    • audioMs: प्लेबैक रुकने से पहले OpenClaw द्वारा गिनी गई सहायक ऑडियो अवधि।
    • elapsedMs: प्लेबैक स्ट्रीम या स्पीकर टर्न खोलने और बंद करने के बीच का वास्तविक समय।
    • discordBytes: Discord वॉइस को भेजे गए या उससे प्राप्त 48 kHz स्टीरियो PCM बाइट।
    • 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 वॉइस इवेंट, नॉइज़ गेट व्यवहार, या क्लाइंट द्वारा थोड़ी देर के लिए माइक सक्रिय करना हो सकता है।
    • पास में बार्ज-इन या provider-clear-audio के बिना audio playback stopped reason=stream-close का अर्थ है कि स्थानीय Discord प्लेबैक स्ट्रीम अप्रत्याशित रूप से समाप्त हो गई। इससे पहले के प्रदाता और Discord प्लेयर लॉग जाँचें।
    • capture ignored during playback (barge-in disabled) का अर्थ है कि सहायक का ऑडियो सक्रिय रहने के दौरान OpenClaw ने जानबूझकर इनपुट छोड़ दिया। यदि आप चाहते हैं कि बोलने पर प्लेबैक बाधित हो, तो voice.realtime.bargeIn सक्षम करें।
    • barge-in ignored ... outputActive=false का अर्थ है कि Discord या प्रदाता VAD ने बोलना रिपोर्ट किया, लेकिन बाधित करने के लिए OpenClaw में कोई सक्रिय प्लेबैक नहीं था। इससे ऑडियो कटना नहीं चाहिए।

    क्रेडेंशियल प्रत्येक घटक के अनुसार हल किए जाते हैं: voice.model के लिए LLM रूट प्रमाणीकरण, tools.media.audio के लिए STT प्रमाणीकरण, tts/voice.tts के लिए TTS प्रमाणीकरण, और voice.realtime.providers या प्रदाता के सामान्य प्रमाणीकरण कॉन्फ़िगरेशन के लिए रियलटाइम प्रदाता प्रमाणीकरण।

    वॉइस संदेश

    Discord वॉइस संदेश वेवफ़ॉर्म पूर्वावलोकन दिखाते हैं और उनके लिए OGG/Opus ऑडियो आवश्यक है। OpenClaw वेवफ़ॉर्म स्वचालित रूप से बनाता है, लेकिन निरीक्षण और रूपांतरण के लिए Gateway होस्ट पर ffmpeg और ffprobe आवश्यक हैं।

    • एक स्थानीय फ़ाइल पथ दें (URL अस्वीकार किए जाते हैं)।
    • टेक्स्ट सामग्री न दें (Discord एक ही पेलोड में टेक्स्ट + वॉइस संदेश अस्वीकार करता है)।
    • कोई भी ऑडियो प्रारूप स्वीकार किया जाता है; OpenClaw आवश्यकतानुसार उसे OGG/Opus में बदलता है।
    bash
    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 का व्यवहार और उल्लेख पैटर्न सत्यापित करें

    उपयोगी जाँचें:

    bash
    openclaw doctoropenclaw channels status --probeopenclaw logs --follow
    उल्लेख की आवश्यकता बंद है, फिर भी अवरुद्ध है

    सामान्य कारण:

    • मेल खाती गिल्ड/चैनल अनुमतिसूची के बिना groupPolicy="allowlist"
    • requireMention गलत स्थान पर कॉन्फ़िगर किया गया है (channels.discord.guilds या किसी चैनल प्रविष्टि के अंतर्गत होना आवश्यक है)
    • गिल्ड/चैनल की users अनुमतिसूची द्वारा प्रेषक अवरुद्ध है
    लंबे समय तक चलने वाले Discord टर्न या डुप्लिकेट उत्तर

    सामान्य लॉग:

    • Slow listener detected ...
    • stuck session: sessionKey=agent:...:discord:... state=processing ...

    Discord कतारबद्ध एजेंट टर्न पर चैनल-स्वामित्व वाला टाइमआउट लागू नहीं करता। संदेश लिसनर तुरंत हैंडऑफ़ करते हैं, और कतारबद्ध Discord रन सत्र/टूल/रनटाइम जीवनचक्र द्वारा काम पूरा या निरस्त किए जाने तक प्रति-सत्र क्रम बनाए रखते हैं।

    Gateway मेटाडेटा लुकअप टाइमआउट चेतावनियाँ

    OpenClaw कनेक्ट होने से पहले Discord का /gateway/bot मेटाडेटा प्राप्त करता है। अस्थायी विफलताओं पर Discord के डिफ़ॉल्ट Gateway URL का फ़ॉलबैक उपयोग होता है और लॉग में दर-सीमा लागू होती है।

    मेटाडेटा टाइमआउट का डिफ़ॉल्ट 30 सेकंड है। असामान्य होस्ट परिवेशों के लिए OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS इसे ओवरराइड कर सकता है।

    Gateway READY टाइमआउट के कारण पुनः आरंभ

    OpenClaw स्टार्टअप के दौरान और रनटाइम पुनः कनेक्शन के बाद Discord के Gateway READY इवेंट की प्रतीक्षा करता है। चरणबद्ध स्टार्टअप वाले बहु-खाता सेटअप के लिए डिफ़ॉल्ट से अधिक लंबी स्टार्टअप READY अवधि की आवश्यकता हो सकती है।

    स्टार्टअप 15 सेकंड और रनटाइम पुनः कनेक्शन 30 सेकंड प्रतीक्षा करते हैं। असामान्य होस्ट परिवेशों के लिए OPENCLAW_DISCORD_READY_TIMEOUT_MS और OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS उपलब्ध रहते हैं।

    अनुमति ऑडिट में बेमेल

    channels status --probe अनुमति जाँच केवल संख्यात्मक चैनल ID के लिए काम करती है।

    यदि आप स्लग कुंजियों का उपयोग करते हैं, तो रनटाइम मिलान फिर भी काम कर सकता है, लेकिन प्रोब अनुमतियों को पूरी तरह सत्यापित नहीं कर सकता।

    DM और पेयरिंग संबंधी समस्याएँ
    • DM अक्षम: channels.discord.dm.enabled=false
    • DM नीति अक्षम: channels.discord.dmPolicy="disabled" (पुराना: channels.discord.dm.policy)
    • pairing मोड में पेयरिंग स्वीकृति की प्रतीक्षा है
    बॉट-से-बॉट लूप

    डिफ़ॉल्ट रूप से बॉट द्वारा लिखे गए संदेशों को अनदेखा किया जाता है।

    यदि आप channels.discord.allowBots=true सेट करते हैं, तो लूप व्यवहार से बचने के लिए सख्त उल्लेख और अनुमतिसूची नियमों का उपयोग करें। केवल बॉट का उल्लेख करने वाले बॉट संदेशों को स्वीकार करने के लिए 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>.botLoopProtection
    • channels.discord.botLoopProtection
    • channels.defaults.botLoopProtection
    • अंतर्निहित डिफ़ॉल्ट

    Discord सामान्य maxEventsPerWindow, windowSeconds, और cooldownSeconds कुंजियों का उपयोग करता है।

    json5
    {channels: {defaults: {  botLoopProtection: {    maxEventsPerWindow: 20,    windowSeconds: 60,    cooldownSeconds: 60,  },},discord: {  // वैकल्पिक Discord-व्यापी ओवरराइड। खाता ब्लॉक अलग-अलग  // फ़ील्ड ओवरराइड करते हैं और यहाँ से छोड़े गए फ़ील्ड इनहेरिट करते हैं।  botLoopProtection: {    maxEventsPerWindow: 4,  },  accounts: {    alpha: {      // Alpha अन्य बॉट को केवल तभी सुनता है, जब वे उसका उल्लेख करते हैं।      allowBots: "mentions",    },    bravo: {      // Bravo बॉट द्वारा लिखे गए सभी Discord संदेशों को सुनता है।      allowBots: true,      mentionAliases: {        // कॉन्फ़िगर की गई उपयोगकर्ता ID के साथ Bravo को Alpha का Discord उल्लेख लिखने देता है।        Alpha: "ALPHA_DISCORD_USER_ID",      },      botLoopProtection: {        // जोड़ी को दबाने से पहले प्रति मिनट अधिकतम पाँच संदेशों की अनुमति दें।        maxEventsPerWindow: 5,        windowSeconds: 60,        cooldownSeconds: 90,      },    },  },},},}
    DecryptionFailed(...) के साथ वॉइस STT छूटना
    • OpenClaw को अद्यतित रखें (openclaw update), ताकि Discord वॉइस रिसीव पुनर्प्राप्ति लॉजिक मौजूद रहे
    • channels.discord.voice.daveEncryption=true (डिफ़ॉल्ट) की पुष्टि करें
    • channels.discord.voice.decryptionFailureTolerance=24 (अपस्ट्रीम डिफ़ॉल्ट) से शुरू करें और आवश्यकता होने पर ही समायोजित करें
    • इनके लिए लॉग देखें:
      • discord voice: DAVE decrypt failures detected
      • discord voice: repeated decrypt failures; attempting rejoin
    • यदि स्वचालित रूप से पुनः जुड़ने के बाद भी विफलताएँ जारी रहें, तो लॉग एकत्र करें और उनकी तुलना discord.js #11419 तथा discord.js #11449 में अपस्ट्रीम DAVE रिसीव इतिहास से करें

    कॉन्फ़िगरेशन संदर्भ

    प्राथमिक संदर्भ: कॉन्फ़िगरेशन संदर्भ - Discord

    उच्च-संकेत वाले Discord फ़ील्ड
    • स्टार्टअप/प्रमाणीकरण: enabled, token, applicationId, accounts.*, allowBots
    • नीति: groupPolicy, dmPolicy, allowFrom, dm.*, guilds.*, guilds.*.channels.*
    • कमांड: commands.native, commands.useAccessGroups (वैश्विक), configWrites, slashCommand.ephemeral
    • Gateway: proxy
    • उत्तर/इतिहास: replyToMode, historyLimit, dmHistoryLimit, dms.*.historyLimit
    • डिलीवरी: textChunkLimit (डिफ़ॉल्ट 2000), maxLinesPerMessage (डिफ़ॉल्ट 17)
    • स्ट्रीमिंग: streaming.mode, streaming.chunkMode, streaming.preview.*, streaming.progress.*, streaming.block.* (पुरानी फ़्लैट कुंजियाँ streamMode, draftChunk, blockStreaming, blockStreamingCoalesce, chunkMode, openclaw doctor --fix द्वारा streaming.* में माइग्रेट की जाती हैं)
    • मीडिया: mediaMaxMb (आउटबाउंड Discord अपलोड सीमित करता है, डिफ़ॉल्ट 100)
    • क्रियाएँ: actions.*
    • उपस्थिति: activity, status, activityType, activityUrl, autoPresence.*
    • UI: ui.components.accentColor
    • सुविधाएँ: threadBindings, शीर्ष-स्तरीय bindings[] (type: "acp"), pluralkit, execApprovals, intents, agentComponents.enabled, agentComponents.ttlMs, activities, heartbeat, responsePrefix

    Discord Activities

    एजेंटों को Discord के भीतर खुलने वाले स्व-निहित HTML विजेट पोस्ट करने देने के लिए channels.discord.activities सेट करें। यह ब्लॉक वैकल्पिक है; इसके अनुपस्थित होने पर OpenClaw कोई Activity रूट, टूल या इंटरैक्शन हैंडलर पंजीकृत नहीं करता। Developer Portal, टनल, सुरक्षा और समस्या निवारण सेटअप के लिए Discord Activities देखें।

    • activities.clientSecret: Discord एप्लिकेशन के लिए OAuth2 क्लाइंट सीक्रेट; DISCORD_CLIENT_SECRET पर फ़ॉलबैक करता है
    • activities.applicationId: वैकल्पिक Activity एप्लिकेशन ID; डिफ़ॉल्ट रूप से Gateway स्टार्टअप पर प्राप्त बॉट एप्लिकेशन ID का उपयोग करता है

    सुरक्षा और संचालन

    • बॉट टोकन को सीक्रेट मानें (पर्यवेक्षित परिवेशों में DISCORD_BOT_TOKEN को प्राथमिकता दें)।
    • Discord को न्यूनतम-विशेषाधिकार अनुमतियाँ प्रदान करें।
    • यदि कमांड परिनियोजन/स्थिति पुरानी है, तो Gateway पुनः आरंभ करें और openclaw channels status --probe से दोबारा जाँचें।

    संबंधित

    Was this useful?
    On this page

    On this page