Discord (Bot API)
Статус: готово для приватних повідомлень і каналів серверів через офіційний шлюз Discord.Сполучення
Слеш-команди
Усунення проблем каналу
Швидке налаштування
Вам потрібно створити нову програму з ботом, додати бота на свій сервер і сполучити його з OpenClaw. Ми рекомендуємо додати бота на ваш власний приватний сервер. Якщо у вас його ще немає, спочатку створіть його (виберіть Create My Own > For me and my friends).Створіть програму Discord і бота
Увімкніть привілейовані intents
- Message Content Intent (обов’язково)
- Server Members Intent (рекомендовано; обов’язково для allowlist ролей і зіставлення імен з ID)
- Presence Intent (необов’язково; потрібен лише для оновлень статусу присутності)
Скопіюйте токен бота
Згенеруйте URL-запрошення і додайте бота на свій сервер
botapplications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (необов’язково)
Увімкніть Developer Mode і зберіть свої ID
- Натисніть User Settings (значок шестерні поруч із вашим аватаром) → Advanced → увімкніть Developer Mode
- Клацніть правою кнопкою миші на значку сервера на бічній панелі → Copy Server ID
- Клацніть правою кнопкою миші на своєму аватарі → Copy User ID
Дозвольте приватні повідомлення від учасників сервера
Безпечно встановіть токен свого бота (не надсилайте його в чат)
openclaw gateway run.Налаштуйте OpenClaw і виконайте сполучення
- Запитайте свого агента
- CLI / config
“Я вже встановив токен свого Discord-бота в конфігурації. Будь ласка, заверши налаштування Discord за допомогою User ID<user_id>і Server ID<server_id>.”
Підтвердьте перше сполучення через приватне повідомлення
- Запитайте свого агента
- CLI
“Підтвердь цей код сполучення Discord: <CODE>”
DISCORD_BOT_TOKEN використовується лише для облікового запису за замовчуванням.
Для розширених вихідних викликів (message tool/channel actions) явний token для виклику використовується для цього виклику. Це стосується дій надсилання та дій у стилі читання/перевірки (наприклад, read/search/fetch/thread/pins/permissions). Налаштування політики облікового запису/повторних спроб усе ще беруться з вибраного облікового запису в активному runtime snapshot.Рекомендовано: налаштуйте робочий простір сервера
Щойно приватні повідомлення запрацюють, ви можете налаштувати свій сервер Discord як повноцінний робочий простір, де кожен канал отримує власну сесію агента з власним контекстом. Це рекомендовано для приватних серверів, де є лише ви та ваш бот.Додайте свій сервер до allowlist серверів
- Запитайте свого агента
- Config
“Додай мій Discord Server ID <server_id> до allowlist серверів”
Дозвольте відповіді без @mention
- Запитайте свого агента
- Config
“Дозволь моєму агенту відповідати на цьому сервері без потреби в @mentioned”
Сплануйте пам’ять для каналів сервера
- Запитайте свого агента
- Вручну
“Коли я ставлю запитання в каналах Discord, використовуй memory_search або memory_get, якщо тобі потрібен довготривалий контекст із MEMORY.md.”
#coding, #home, #research або будь-що, що відповідає вашому процесу роботи.
Модель runtime
- Шлюз керує з’єднанням із Discord.
- Маршрутизація відповідей детермінована: вхідні повідомлення Discord отримують відповіді назад у Discord.
- За замовчуванням (
session.dmScope=main) прямі чати спільно використовують основну сесію агента (agent:main:main). - Канали серверів мають ізольовані ключі сесій (
agent:<agentId>:discord:channel:<channelId>). - Групові приватні повідомлення ігноруються за замовчуванням (
channels.discord.dm.groupEnabled=false). - Нативні слеш-команди виконуються в ізольованих сесіях команд (
agent:<agentId>:discord:slash:<userId>), водночас зберігаючиCommandTargetSessionKeyдля маршрутизованої сесії розмови.
Канали forum
Канали форумів і медіаканали Discord приймають лише дописи в потоках. OpenClaw підтримує два способи їх створення:- Надішліть повідомлення до батьківського forum (
channel:<forumId>), щоб автоматично створити потік. Заголовок потоку використовує перший непорожній рядок вашого повідомлення. - Використайте
openclaw message thread create, щоб створити потік безпосередньо. Не передавайте--message-idдля каналів forum.
channel:<threadId>).
Інтерактивні компоненти
OpenClaw підтримує контейнери Discord components v2 для повідомлень агента. Використовуйте message tool із payloadcomponents. Результати взаємодій маршрутизуються назад до агента як звичайні вхідні повідомлення та дотримуються наявних налаштувань Discord replyToMode.
Підтримувані блоки:
text,section,separator,actions,media-gallery,file- Рядки дій підтримують до 5 кнопок або одне меню вибору
- Типи вибору:
string,user,role,mentionable,channel
components.reusable=true, щоб дозволити використовувати кнопки, елементи вибору та форми кілька разів, доки вони не спливуть.
Щоб обмежити, хто може натискати кнопку, установіть allowedUsers для цієї кнопки (ID користувачів Discord, теги або *). Якщо це налаштовано, користувачі, які не відповідають умові, отримають ефемерну відмову.
Слеш-команди /model і /models відкривають інтерактивний засіб вибору моделі з випадними списками провайдера та моделі, а також кроком Submit. Відповідь засобу вибору є ефемерною, і використовувати її може лише користувач, який його викликав.
Вкладення файлів:
- Блоки
fileмають вказувати на посилання вкладення (attachment://<filename>) - Надайте вкладення через
media/path/filePath(один файл); використовуйтеmedia-galleryдля кількох файлів - Використовуйте
filename, щоб перевизначити ім’я завантаження, коли воно має відповідати посиланню вкладення
- Додайте
components.modalз максимум 5 полями - Типи полів:
text,checkbox,radio,select,role-select,user-select - OpenClaw автоматично додає кнопку запуску
Керування доступом і маршрутизація
- Політика приватних повідомлень
- Політика серверів
- Згадки та групові приватні повідомлення
channels.discord.dmPolicy керує доступом до приватних повідомлень (застаріле: channels.discord.dm.policy):pairing(за замовчуванням)allowlistopen(потребує, щобchannels.discord.allowFromвключав"*"; застаріле:channels.discord.dm.allowFrom)disabled
pairing).Пріоритет для кількох облікових записів:channels.discord.accounts.default.allowFromзастосовується лише до облікового записуdefault.- Іменовані облікові записи успадковують
channels.discord.allowFrom, коли їхній власнийallowFromне встановлено. - Іменовані облікові записи не успадковують
channels.discord.accounts.default.allowFrom.
user:<id>- згадка
<@id>
Маршрутизація агентів за ролями
Використовуйтеbindings[].match.roles, щоб маршрутизувати учасників Discord-сервера до різних агентів за ID ролі. Прив’язки за ролями приймають лише ID ролей і обчислюються після прив’язок peer або parent-peer та перед прив’язками лише за сервером. Якщо прив’язка також задає інші поля відповідності (наприклад, peer + guildId + roles), мають збігатися всі налаштовані поля.
Налаштування Developer Portal
Створення програми і бота
Створення програми і бота
- Discord Developer Portal -> Applications -> New Application
- Bot -> Add Bot
- Скопіюйте токен бота
Привілейовані intents
Привілейовані intents
- Message Content Intent
- Server Members Intent (рекомендовано)
setPresence) не потребує ввімкнення оновлень присутності для учасників.OAuth scopes і базові дозволи
OAuth scopes і базові дозволи
- scopes:
bot,applications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (необов’язково)
Administrator, якщо це не потрібно явно.Скопіюйте ID
Скопіюйте ID
- ID сервера
- ID каналу
- ID користувача
Нативні команди та авторизація команд
commands.nativeза замовчуванням має значення"auto"і ввімкнений для Discord.- Перевизначення для конкретного каналу:
channels.discord.commands.native. commands.native=falseявно очищає раніше зареєстровані нативні команди Discord.- Авторизація нативних команд використовує ті самі allowlist/політики Discord, що й звичайна обробка повідомлень.
- Команди все ще можуть бути видимими в інтерфейсі Discord для користувачів, які не мають доступу; виконання все одно застосовує авторизацію OpenClaw і повертає “not authorized”.
ephemeral: true
Деталі функцій
Теги відповіді та нативні відповіді
Теги відповіді та нативні відповіді
[[reply_to_current]][[reply_to:<id>]]
channels.discord.replyToMode:off(за замовчуванням)firstallbatched
off вимикає неявне впорядкування відповідей у потоки. Явні теги [[reply_to_*]] усе одно враховуються.
first завжди додає неявне посилання нативної відповіді до першого вихідного повідомлення Discord у межах ходу.
batched додає неявне посилання нативної відповіді Discord лише коли
вхідний хід був дебаунсованим пакетом із кількох повідомлень. Це корисно,
якщо ви хочете використовувати нативні відповіді переважно для неоднозначних
активних чатів із серіями повідомлень, а не для кожного окремого повідомлення.ID повідомлень передаються в контексті/історії, щоб агенти могли націлюватися на конкретні повідомлення.Попередній перегляд live stream
Попередній перегляд live stream
channels.discord.streamingкерує потоковим попереднім переглядом (off|partial|block|progress, за замовчуванням:off).- За замовчуванням залишається
off, оскільки редагування попереднього перегляду в Discord може швидко впертися в обмеження частоти, особливо коли кілька ботів або шлюзів використовують один обліковий запис або трафік сервера. progressприймається для міжканальної узгодженості та відображається якpartialу Discord.channels.discord.streamMode— це застарілий псевдонім, і він автоматично мігрується.partialредагує одне повідомлення попереднього перегляду в міру надходження токенів.blockвиводить фрагменти розміру чернетки (використовуйтеdraftChunkдля налаштування розміру та точок розриву).
block (обмежуються channels.discord.textChunkLimit):Історія, контекст і поведінка потоків
Історія, контекст і поведінка потоків
channels.discord.historyLimitза замовчуванням20- резервно:
messages.groupChat.historyLimit 0вимикає
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- Потоки Discord маршрутизуються як сесії каналів
- метадані батьківського потоку можуть використовуватися для зв’язування з батьківською сесією
- конфігурація потоку успадковує конфігурацію батьківського каналу, якщо не існує запису, специфічного для потоку
Прив’язані до потоків сесії для субагентів
Прив’язані до потоків сесії для субагентів
/focus <target>прив’язати поточний/новий потік до цілі субагента/сесії/unfocusвидалити поточну прив’язку потоку/agentsпоказати активні запуски та стан прив’язки/session idle <duration|off>переглянути/оновити автоматичне скасування фокусу через неактивність для прив’язаних фокусованих сесій/session max-age <duration|off>переглянути/оновити жорсткий максимальний вік для прив’язаних фокусованих сесій
session.threadBindings.*задає глобальні значення за замовчуванням.channels.discord.threadBindings.*перевизначає поведінку Discord.spawnSubagentSessionsмає бути true, щоб автоматично створювати/прив’язувати потоки дляsessions_spawn({ thread: true }).spawnAcpSessionsмає бути true, щоб автоматично створювати/прив’язувати потоки для ACP (/acp spawn ... --thread ...абоsessions_spawn({ runtime: "acp", thread: true })).- Якщо прив’язки потоків вимкнені для облікового запису,
/focusі пов’язані операції прив’язки потоків недоступні.
Постійні прив’язки ACP-каналів
Постійні прив’язки ACP-каналів
bindings[]зtype: "acp"іmatch.channel: "discord"
/acp spawn codex --bind hereприв’язує поточний канал або потік Discord на місці й надалі спрямовує майбутні повідомлення до тієї самої ACP-сесії.- Це все ще може означати «запустити свіжу ACP-сесію Codex», але саме по собі не створює новий потік Discord. Наявний канал залишається поверхнею чату.
- Codex усе ще може працювати у власному
cwdабо робочому просторі backend на диску. Цей робочий простір є станом runtime, а не потоком Discord. - Повідомлення в потоках можуть успадковувати ACP-прив’язку батьківського каналу.
- У прив’язаному каналі або потоці
/newі/resetскидають ту саму ACP-сесію на місці. - Тимчасові прив’язки потоків усе ще працюють і можуть перевизначати визначення цілі, поки активні.
spawnAcpSessionsпотрібен лише тоді, коли OpenClaw має створити/прив’язати дочірній потік через--thread auto|here. Він не потрібен для/acp spawn ... --bind hereу поточному каналі.
Сповіщення про реакції
Сповіщення про реакції
offown(за замовчуванням)allallowlist(використовуєguilds.<id>.users)
Реакції підтвердження
Реакції підтвердження
ackReaction надсилає емодзі-підтвердження, поки OpenClaw обробляє вхідне повідомлення.Порядок визначення:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- резервне емодзі ідентичності агента (
agents.list[].identity.emoji, інакше ”👀”)
- Discord приймає emoji Unicode або назви власних emoji.
- Використовуйте
"", щоб вимкнути реакцію для каналу або облікового запису.
Записи конфігурації
Записи конфігурації
/config set|unset (коли функції команд увімкнено).Вимкнення:Gateway proxy
Gateway proxy
channels.discord.proxy.Підтримка PluralKit
Підтримка PluralKit
- allowlist можуть використовувати
pk:<memberId> - відображувані імена учасників зіставляються за name/slug лише коли
channels.discord.dangerouslyAllowNameMatching: true - пошуки використовують ID оригінального повідомлення та обмежені часовим вікном
- якщо пошук не вдається, проксійовані повідомлення вважаються повідомленнями бота й відкидаються, якщо
allowBots=trueне встановлено
Налаштування статусу присутності
Налаштування статусу присутності
- 0: Playing
- 1: Streaming (потрібен
activityUrl) - 2: Listening
- 3: Watching
- 4: Custom (використовує текст активності як стан статусу; emoji необов’язкове)
- 5: Competing
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(підтримує заповнювач{reason})
Підтвердження в Discord
Підтвердження в Discord
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(необов’язково; за можливості резервно використовуєтьсяcommands.ownerAllowFrom)channels.discord.execApprovals.target(dm|channel|both, за замовчуванням:dm)agentFilter,sessionFilter,cleanupAfterResolve
enabled не встановлено або дорівнює "auto" і принаймні одного затверджувача можна визначити або з execApprovals.approvers, або з commands.ownerAllowFrom. Discord не виводить затверджувачів exec із allowFrom каналу, застарілого dm.allowFrom або defaultTo для прямих повідомлень. Установіть enabled: false, щоб явно вимкнути Discord як нативний клієнт підтверджень.Коли target має значення channel або both, запит на підтвердження видимий у каналі. Лише визначені затверджувачі можуть використовувати кнопки; інші користувачі отримують ефемерну відмову. Запити на підтвердження містять текст команди, тож вмикайте доставку в канал лише в довірених каналах. Якщо ID каналу не вдається вивести з ключа сесії, OpenClaw повертається до доставки через приватні повідомлення.Discord також відображає спільні кнопки підтвердження, які використовуються іншими чат-каналами. Нативний адаптер Discord переважно додає маршрутизацію приватних повідомлень для затверджувачів і fanout у канал.
Коли ці кнопки присутні, вони є основним UX підтверджень; OpenClaw
має включати ручну команду /approve лише тоді, коли результат інструмента каже,
що підтвердження в чаті недоступні або ручне підтвердження є єдиним шляхом.Авторизація шлюзу для цього обробника використовує той самий спільний контракт визначення облікових даних, що й інші клієнти Gateway:- локальна авторизація env-first (
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD, потімgateway.auth.*) - у локальному режимі
gateway.remote.*може використовуватися як резерв лише якщоgateway.auth.*не встановлено; налаштовані, але нерозв’язані локальні SecretRef завершуються з закриттям доступу - підтримка remote-mode через
gateway.remote.*, коли застосовно - перевизначення URL безпечні щодо перевизначень: перевизначення CLI не повторно використовують неявні облікові дані, а перевизначення env використовують лише облікові дані env
- ID з префіксом
plugin:визначаються черезplugin.approval.resolve. - Інші ID визначаються через
exec.approval.resolve. - Discord не робить тут додаткового резервного переходу exec-to-plugin; саме префікс id визначає, який метод шлюзу викликається.
Інструменти та шлюзи дій
Дії з повідомленнями Discord включають обмін повідомленнями, адміністрування каналів, модерацію, статус присутності та дії з метаданими. Основні приклади:- обмін повідомленнями:
sendMessage,readMessages,editMessage,deleteMessage,threadReply - реакції:
react,reactions,emojiList - модерація:
timeout,kick,ban - статус присутності:
setPresence
channels.discord.actions.*.
Поведінка шлюзів за замовчуванням:
| Група дій | За замовчуванням |
|---|---|
| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | увімкнено |
| roles | вимкнено |
| moderation | вимкнено |
| presence | вимкнено |
Components v2 UI
OpenClaw використовує Discord components v2 для exec approvals і міжконтекстних маркерів. Дії з повідомленнями Discord також можуть прийматиcomponents для користувацького UI (розширено; потребує побудови payload компонента через discord tool), тоді як застарілі embeds усе ще доступні, але не рекомендовані.
channels.discord.ui.components.accentColorзадає акцентний колір, який використовується контейнерами компонентів Discord (hex).- Для окремого облікового запису задається через
channels.discord.accounts.<id>.ui.components.accentColor. embedsігноруються, коли присутні components v2.
Голосові канали
OpenClaw може приєднуватися до голосових каналів Discord для безперервних розмов у реальному часі. Це окремо від вкладень голосових повідомлень. Вимоги:- Увімкніть нативні команди (
commands.nativeабоchannels.discord.commands.native). - Налаштуйте
channels.discord.voice. - Бот має мати дозволи Connect + Speak у цільовому голосовому каналі.
/vc join|leave|status для керування сесіями. Команда використовує агента за замовчуванням для облікового запису й дотримується тих самих правил allowlist і group policy, що й інші команди Discord.
Приклад auto-join:
voice.ttsперевизначаєmessages.ttsлише для відтворення голосу.- Ходи транскрипції голосу визначають статус власника з
allowFromDiscord (абоdm.allowFrom); мовці, які не є власниками, не можуть використовувати інструменти лише для власника (наприклад,gatewayіcron). - Голос увімкнений за замовчуванням; установіть
channels.discord.voice.enabled=false, щоб вимкнути його. voice.daveEncryptionіvoice.decryptionFailureToleranceпередаються далі до параметрів приєднання@discordjs/voice.- Типові значення
@discordjs/voice—daveEncryption=trueіdecryptionFailureTolerance=24, якщо не встановлено. - OpenClaw також відстежує помилки розшифрування під час прийому й автоматично відновлюється, виходячи та повторно приєднуючись до голосового каналу після повторних помилок за короткий проміжок часу.
- Якщо журнали прийому постійно показують
DecryptionFailed(UnencryptedWhenPassthroughDisabled), це може бути помилка прийому у@discordjs/voice, відстежувана в discord.js #11419.
Голосові повідомлення
Голосові повідомлення Discord показують попередній перегляд хвильової форми й потребують аудіо OGG/Opus разом із метаданими. OpenClaw генерує хвильову форму автоматично, але для перевірки й конвертації аудіофайлів на вузлі шлюзу мають бути доступніffmpeg і ffprobe.
Вимоги та обмеження:
- Надавайте локальний шлях до файлу (URL відхиляються).
- Не додавайте текстовий вміст (Discord не дозволяє текст + голосове повідомлення в одному payload).
- Приймається будь-який аудіоформат; OpenClaw за потреби конвертує його в OGG/Opus.
Усунення проблем
Використовуються заборонені intents або бот не бачить повідомлень сервера
Використовуються заборонені intents або бот не бачить повідомлень сервера
- увімкніть Message Content Intent
- увімкніть Server Members Intent, якщо ви залежите від визначення користувачів/учасників
- перезапустіть шлюз після зміни intents
Повідомлення сервера неочікувано блокуються
Повідомлення сервера неочікувано блокуються
- перевірте
groupPolicy - перевірте allowlist сервера в
channels.discord.guilds - якщо існує мапа
channelsсервера, дозволені лише перелічені канали - перевірте поведінку
requireMentionі шаблони згадок
Require mention false, але все одно блокується
Require mention false, але все одно блокується
groupPolicy="allowlist"без відповідного allowlist сервера/каналуrequireMentionналаштовано не там, де потрібно (має бути вchannels.discord.guildsабо записі каналу)- відправника блокує allowlist
usersсервера/каналу
Довготривалі обробники завершуються за тайм-аутом або дублюють відповіді
Довготривалі обробники завершуються за тайм-аутом або дублюють відповіді
Listener DiscordMessageListener timed out after 30000ms for event MESSAGE_CREATESlow listener detected ...discord inbound worker timed out after ...
- один обліковий запис:
channels.discord.eventQueue.listenerTimeout - кілька облікових записів:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout
- один обліковий запис:
channels.discord.inboundWorker.runTimeoutMs - кілька облікових записів:
channels.discord.accounts.<accountId>.inboundWorker.runTimeoutMs - за замовчуванням:
1800000(30 хвилин); установіть0, щоб вимкнути
eventQueue.listenerTimeout для повільного налаштування слухача, а inboundWorker.runTimeoutMs
лише якщо вам потрібен окремий запобіжник для агентських ходів у черзі.Невідповідності аудиту дозволів
Невідповідності аудиту дозволів
channels status --probe працюють лише для числових ID каналів.Якщо ви використовуєте ключі slug, зіставлення під час runtime все ще може працювати, але перевірка не зможе повністю верифікувати дозволи.Проблеми з приватними повідомленнями та сполученням
Проблеми з приватними повідомленнями та сполученням
- приватні повідомлення вимкнено:
channels.discord.dm.enabled=false - політику приватних повідомлень вимкнено:
channels.discord.dmPolicy="disabled"(застаріле:channels.discord.dm.policy) - очікується підтвердження сполучення в режимі
pairing
Цикли бот-бот
Цикли бот-бот
channels.discord.allowBots=true, використовуйте суворі правила згадок і allowlist, щоб уникнути циклічної поведінки.
Віддавайте перевагу channels.discord.allowBots="mentions", щоб приймати лише повідомлення ботів, які згадують бота.Voice STT пропадає з DecryptionFailed(...)
Voice STT пропадає з DecryptionFailed(...)
- підтримуйте актуальність OpenClaw (
openclaw update), щоб логіка відновлення прийому голосу Discord була на місці - підтвердьте
channels.discord.voice.daveEncryption=true(за замовчуванням) - почніть з
channels.discord.voice.decryptionFailureTolerance=24(типове значення upstream) і налаштовуйте лише за потреби - стежте за журналами на предмет:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- якщо збої тривають після автоматичного повторного приєднання, зберіть журнали й порівняйте з discord.js #11419
Вказівники на довідник конфігурації
Основний довідник: Високосигнальні поля Discord:- запуск/авторизація:
enabled,token,accounts.*,allowBots - політика:
groupPolicy,dm.*,guilds.*,guilds.*.channels.* - команди:
commands.native,commands.useAccessGroups,configWrites,slashCommand.* - черга подій:
eventQueue.listenerTimeout(бюджет слухача),eventQueue.maxQueueSize,eventQueue.maxConcurrency - вхідний worker:
inboundWorker.runTimeoutMs - відповідь/історія:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - доставка:
textChunkLimit,chunkMode,maxLinesPerMessage - streaming:
streaming(застарілий псевдонім:streamMode),draftChunk,blockStreaming,blockStreamingCoalesce - медіа/повторні спроби:
mediaMaxMb,retrymediaMaxMbобмежує вихідні завантаження Discord (за замовчуванням:100MB)
- дії:
actions.* - статус присутності:
activity,status,activityType,activityUrl - UI:
ui.components.accentColor - функції:
threadBindings, верхньорівневийbindings[](type: "acp"),pluralkit,execApprovals,intents,agentComponents,heartbeat,responsePrefix
Безпека та експлуатація
- Розглядайте токени бота як секрети (
DISCORD_BOT_TOKENбажаний у керованих середовищах). - Надавайте Discord лише мінімально необхідні дозволи.
- Якщо стан розгортання/стану команд застарів, перезапустіть шлюз і знову перевірте через
openclaw channels status --probe.