Mainstream messaging
Discord
OpenClaw підключається до Discord як бот через офіційний Gateway Discord. Підтримуються особисті повідомлення та канали серверів.
Особисті повідомлення Discord за замовчуванням використовують режим сполучення.
Поведінка вбудованих команд і каталог команд.
Міжканальна діагностика та процес виправлення.
Швидке налаштування
Створіть застосунок Discord із ботом, додайте бота на свій сервер і сполучіть його з OpenClaw. Якщо можливо, використовуйте приватний сервер; за потреби спочатку створіть його (Create My Own > For me and my friends).
Створіть застосунок і бота Discord
На порталі розробників Discord натисніть New Application і вкажіть назву (наприклад, «OpenClaw»).
Відкрийте Bot на бічній панелі та задайте для Username ім’я свого агента.
Увімкніть привілейовані наміри
Залишаючись на сторінці Bot, у розділі Privileged Gateway Intents увімкніть:
- Message Content Intent (обов’язково)
- Server Members Intent (рекомендовано; обов’язково для списків дозволених ролей, зіставлення імен з ідентифікаторами та груп доступу до аудиторії каналу)
- Presence Intent (необов’язково; лише для оновлень присутності)
Скопіюйте токен бота
На сторінці Bot натисніть Reset Token і скопіюйте токен.
Створіть URL-адресу запрошення та додайте бота на свій сервер
Відкрийте OAuth2 на бічній панелі. У розділі OAuth2 URL Generator увімкніть області доступу:
botapplications.commands
У розділі Bot Permissions, що з’явиться, увімкніть щонайменше:
Загальні дозволи
- Перегляд каналів
Дозволи для тексту
- Надсилання повідомлень
- Читання історії повідомлень
- Вбудовування посилань
- Прикріплення файлів
- Додавання реакцій (необов’язково)
Це базовий набір для звичайних текстових каналів. Якщо бот публікуватиме повідомлення в гілках, зокрема в робочих процесах форумів або медіаканалів, які створюють чи продовжують гілку, також увімкніть Send Messages in Threads.
Скопіюйте створену URL-адресу, відкрийте її в браузері, виберіть свій сервер і натисніть Continue. Тепер бот має з’явитися на вашому сервері.
Увімкніть режим розробника та зберіть свої ідентифікатори
У застосунку Discord увімкніть режим розробника, щоб мати змогу копіювати ідентифікатори:
- User Settings (піктограма шестерні) → Developer → увімкніть Developer Mode (на мобільному пристрої: App Settings → Advanced)
- Клацніть правою кнопкою миші піктограму сервера → Copy Server ID
- Клацніть правою кнопкою миші власний аватар → Copy User ID
Збережіть ідентифікатор сервера та ідентифікатор користувача разом із токеном бота; на наступному кроці знадобляться всі три значення.
Дозвольте особисті повідомлення від учасників сервера
Щоб сполучення працювало, Discord має дозволяти боту надсилати вам особисті повідомлення. Клацніть правою кнопкою миші піктограму сервера → Privacy Settings → увімкніть Direct Messages.
Не вимикайте цей параметр, якщо використовуєте особисті повідомлення Discord з OpenClaw. Якщо ви використовуєте лише канали сервера, його можна вимкнути після сполучення.
Безпечно задайте токен бота (не надсилайте його в чаті)
Токен бота є секретом. Задайте його на комп’ютері, де працює OpenClaw, перш ніж надсилати повідомлення агенту:
export DISCORD_BOT_TOKEN="YOUR_BOT_TOKEN"cat > discord.patch.json5 <<'JSON5'{channels: {discord: { enabled: true, token: { source: "env", provider: "default", id: "DISCORD_BOT_TOKEN" },},},}JSON5openclaw config patch --file ./discord.patch.json5 --dry-runopenclaw config patch --file ./discord.patch.json5openclaw gatewayЯкщо OpenClaw уже працює як фонова служба, перезапустіть його через застосунок OpenClaw для Mac або зупинивши й повторно запустивши процес openclaw gateway run.
Для керованих інсталяцій служби виконайте openclaw gateway install в оболонці, де задано DISCORD_BOT_TOKEN, або збережіть змінну у ~/.openclaw/.env, щоб служба могла розпізнати env SecretRef після перезапуску.
Якщо ваш хост заблокований або обмежений за частотою запитів під час початкового пошуку застосунку Discord, задайте ідентифікатор застосунку/клієнта з порталу розробників, щоб під час запуску можна було пропустити цей виклик REST: channels.discord.applicationId для облікового запису за замовчуванням або channels.discord.accounts.<accountId>.applicationId для кожного бота.
Налаштуйте OpenClaw і виконайте сполучення
Попросіть свого агента
Поспілкуйтеся зі своїм агентом OpenClaw у наявному каналі (наприклад, Telegram) і повідомте йому потрібні дані. Якщо Discord — ваш перший канал, натомість скористайтеся вкладкою CLI / конфігурації.
«Я вже задав токен свого бота Discord у конфігурації. Заверши налаштування Discord з ідентифікатором користувача
<user_id>та ідентифікатором сервера<server_id>».
CLI / конфігурація
Файлова конфігурація:
{channels: {discord: {enabled: true,token: {source: "env",provider: "default",id: "DISCORD_BOT_TOKEN",},},},}Резервне значення зі змінної середовища для облікового запису за замовчуванням:
DISCORD_BOT_TOKEN=...Для сценарного або віддаленого налаштування запишіть той самий блок JSON5 за допомогою openclaw config patch --file ./discord.patch.json5 --dry-run, а потім повторіть команду без --dry-run. Звичайні текстові рядки token також працюють, а для channels.discord.token підтримуються значення SecretRef від постачальників env/file/exec. Див. Керування секретами.
Для кількох ботів Discord зберігайте токен та ідентифікатор застосунку кожного бота в його обліковому записі. Значення верхнього рівня channels.discord.applicationId успадковується обліковими записами, тому задавайте його там лише тоді, коли всі облікові записи використовують однаковий ідентифікатор застосунку.
{channels: {discord: {enabled: true,accounts: {personal: { token: { source: "env", provider: "default", id: "DISCORD_PERSONAL_TOKEN" }, applicationId: "111111111111111111",},work: { token: { source: "env", provider: "default", id: "DISCORD_WORK_TOKEN" }, applicationId: "222222222222222222",},},},},}Підтвердьте перше сполучення через особисті повідомлення
Після запуску Gateway надішліть боту особисте повідомлення в Discord. Він відповість кодом сполучення.
Попросіть свого агента
Надішліть код сполучення своєму агенту в наявному каналі:
«Підтвердь цей код сполучення Discord:
<CODE>»
CLI
openclaw pairing list discordopenclaw pairing approve discord <CODE>Термін дії кодів сполучення становить 1 годину. Після підтвердження спілкуйтеся зі своїм агентом в особистих повідомленнях Discord.
Рекомендовано: налаштуйте робочий простір сервера
Коли особисті повідомлення запрацюють, можна перетворити сервер на повноцінний робочий простір, де кожен канал матиме окремий сеанс агента з власним контекстом. Рекомендовано для приватних серверів, де є лише ви та ваш бот.
Додайте свій сервер до списку дозволених серверів
Це дає агенту змогу відповідати в будь-якому каналі вашого сервера, а не лише в особистих повідомленнях.
Попросіть свого агента
«Додай ідентифікатор мого сервера Discord
<server_id>до списку дозволених серверів»
Конфігурація
{channels: {discord: {groupPolicy: "allowlist",guilds: {YOUR_SERVER_ID: { requireMention: true, users: ["YOUR_USER_ID"],},},},},}Дозвольте відповіді без @згадки
За замовчуванням агент відповідає в каналах сервера лише тоді, коли його @згадують. На приватному сервері ви, імовірно, захочете, щоб він відповідав на кожне повідомлення.
У каналах сервера звичайні відповіді за замовчуванням публікуються автоматично. Для спільних кімнат, що завжди активні, увімкніть messages.groupChat.visibleReplies: "message_tool", щоб агент міг непомітно стежити за розмовою та публікувати повідомлення лише тоді, коли вважатиме відповідь у каналі корисною. Це найкраще працює з моделями останнього покоління, які надійно використовують інструменти, як-от GPT-5.6 Sol. Фонові події кімнати не спричиняють повідомлень, якщо їх не надсилає інструмент. Повну конфігурацію режиму непомітного спостереження див. у розділі Фонові події кімнати.
Якщо Discord показує індикатор набору тексту, а журнали — використання токенів, але повідомлення не публікується, перевірте, чи хід налаштовано як фонову подію кімнати або чи ввімкнено видимі відповіді через інструмент повідомлень.
Попросіть свого агента
«Дозволь моєму агенту відповідати на цьому сервері без необхідності @згадки»
Конфігурація
Задайте requireMention: false у конфігурації свого сервера:
{channels: {discord: {guilds: {YOUR_SERVER_ID: { requireMention: false,},},},},}Щоб вимагати надсилання через інструмент повідомлень для видимих відповідей у групах/каналах, задайте messages.groupChat.visibleReplies: "message_tool".
Сплануйте використання пам’яті в каналах сервера
Довгострокова пам’ять (MEMORY.md) автоматично завантажується лише в сеансах особистих повідомлень; канали сервера її не завантажують.
Попросіть свого агента
«Коли я ставлю запитання в каналах Discord, використовуй
memory_searchабоmemory_get, якщо тобі потрібен довгостроковий контекст ізMEMORY.md».
Вручну
Для спільного контексту в кожному каналі розмістіть сталі інструкції в 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>). - Групові особисті повідомлення за замовчуванням ігноруються (
channels.discord.dm.groupEnabled=false). - Вбудовані команди з косою рискою виконуються в ізольованих сеансах команд (
agent:<agentId>:discord:slash:<userId>), водночас передаючиCommandTargetSessionKeyдо сеансу розмови, визначеного маршрутизацією. - Доставка текстових оголошень Cron/Heartbeat у Discord зводиться до остаточної видимої відповіді асистента, яка надсилається один раз. Медіадані та структуровані корисні навантаження компонентів залишаються багатоповідомленнєвими, коли агент створює кілька корисних навантажень для доставки.
Канали форумів
Канали форумів і медіаканали Discord приймають лише дописи в гілках. OpenClaw підтримує два способи їх створення:
- Надішліть повідомлення до батьківського форуму (
channel:<forumId>) для автоматичного створення гілки. Назвою гілки стане перший непорожній рядок повідомлення (обрізаний відповідно до обмеження Discord у 100 символів для назви гілки). - Використовуйте
openclaw message thread create, щоб створити гілку безпосередньо. Не передавайте--message-idдля форумних каналів.
Надішліть повідомлення до батьківського форуму, щоб створити гілку:
openclaw message send --channel discord --target channel:<forumId> \ --message "Topic title\nBody of the post"Створіть форумну гілку явно:
openclaw message thread create --channel discord --target channel:<forumId> \ --thread-name "Topic title" --message "Body of the post"Батьківські форуми не приймають компоненти Discord. Якщо вам потрібні компоненти, надсилайте їх до самої гілки (channel:<threadId>).
Інтерактивні компоненти
OpenClaw підтримує контейнери компонентів Discord v2 для повідомлень агента. Використовуйте інструмент повідомлень із корисним навантаженням components. Результати взаємодії надходять назад до агента як звичайні вхідні повідомлення та відповідають наявним налаштуванням Discord replyToMode.
Підтримувані блоки:
text,section,separator,actions,media-gallery,file- Рядки дій допускають до 5 кнопок або одне меню вибору
- Типи вибору:
string,user,role,mentionable,channel
За замовчуванням компоненти можна використати лише один раз. Установіть components.reusable=true, щоб кнопки, елементи вибору та форми можна було використовувати кілька разів до завершення терміну їхньої дії.
Щоб обмежити коло користувачів, які можуть натиснути кнопку, установіть для неї allowedUsers (ідентифікатори користувачів Discord, теги або *). Інші користувачі отримають тимчасове повідомлення про відмову, видиме лише їм.
За замовчуванням термін дії зворотних викликів компонентів завершується через 30 хвилин. Установіть channels.discord.agentComponents.ttlMs, щоб змінити тривалість існування реєстру зворотних викликів для облікового запису за замовчуванням, або channels.discord.accounts.<accountId>.agentComponents.ttlMs для окремого облікового запису. Значення задається в мілісекундах, має бути додатним цілим числом і обмежується 86400000 (24 години). Довший термін дії підходить для процесів перевірки та схвалення, у яких кнопки мають залишатися доступними, але він подовжує період, протягом якого старе повідомлення Discord усе ще може ініціювати дію. Вибирайте найкоротший придатний термін дії та зберігайте значення за замовчуванням, якщо застарілі зворотні виклики можуть спричинити неочікувану поведінку.
Команди з косою рискою /model і /models відкривають інтерактивний засіб вибору моделі з розкривними списками постачальника, моделі та сумісного середовища виконання, а також кроком Submit. Команда /models add застаріла й замість реєстрації моделей із чату повертає повідомлення про припинення підтримки. Відповідь засобу вибору є тимчасовою, видимою лише користувачу, який викликав команду, і доступна тільки йому. Меню вибору Discord обмежені 25 варіантами, тому додавайте записи provider/* до agents.defaults.models, якщо хочете, щоб засіб вибору показував динамічно виявлені моделі лише для вибраних постачальників, як-от openai або vllm.
Вкладені файли:
- Блоки
fileмають указувати на посилання на вкладення (attachment://<filename>) - Надайте вкладення через
media/path/filePath(один файл); для кількох файлів використовуйтеmedia-gallery - Використовуйте
filename, щоб перевизначити назву завантажуваного файлу, коли вона має відповідати посиланню на вкладення
Модальні форми:
- Додайте
components.modal, що містить до 5 полів - Типи полів:
text,checkbox,radio,select,role-select,user-select - OpenClaw автоматично додає кнопку запуску
Приклад:
{ channel: "discord", action: "send", to: "channel:123456789012345678", message: "Optional fallback text", components: { reusable: true, text: "Choose a path", blocks: [ { type: "actions", buttons: [ { label: "Approve", style: "success", allowedUsers: ["123456789012345678"], }, { label: "Decline", style: "danger" }, ], }, { type: "actions", select: { type: "string", placeholder: "Pick an option", options: [ { label: "Option A", value: "a" }, { label: "Option B", value: "b" }, ], }, }, ], modal: { title: "Details", triggerLabel: "Open form", fields: [ { type: "text", label: "Requester" }, { type: "select", label: "Priority", options: [ { label: "Low", value: "low" }, { label: "High", value: "high" }, ], }, ], }, },}Керування доступом і маршрутизація
Політика особистих повідомлень
channels.discord.dmPolicy керує доступом до особистих повідомлень. channels.discord.allowFrom — канонічний список дозволених відправників особистих повідомлень.
pairing(за замовчуванням)allowlist(потрібен принаймні один відправник уallowFrom)open(потрібно, щобchannels.discord.allowFromмістив"*")disabled
Якщо політика особистих повідомлень не є відкритою, невідомі користувачі блокуються (або отримують запит на сполучення в режимі pairing).
Пріоритет для кількох облікових записів:
channels.discord.accounts.default.allowFromзастосовується лише до облікового записуdefault.- Для одного облікового запису
allowFromмає пріоритет над застарілимdm.allowFrom. - Іменовані облікові записи успадковують
channels.discord.allowFrom, якщо їхні власніallowFromі застарілийdm.allowFromне задані. - Іменовані облікові записи не успадковують
channels.discord.accounts.default.allowFrom.
Застарілі channels.discord.dm.policy і channels.discord.dm.allowFrom усе ще зчитуються для сумісності. openclaw doctor --fix переносить їх до dmPolicy і allowFrom, коли це можна зробити без зміни доступу.
Формат цілі особистого повідомлення для доставлення:
user:<id>- згадка
<@id>
Прості числові ідентифікатори зазвичай розпізнаються як ідентифікатори каналів, коли активне типове значення каналу, але ідентифікатори, зазначені в ефективному списку allowFrom для особистих повідомлень облікового запису, для сумісності обробляються як цілі особистих повідомлень користувачів.
Групи доступу
Для авторизації особистих повідомлень і текстових команд Discord можна використовувати динамічні записи accessGroup:<name> у channels.discord.allowFrom.
Назви груп доступу є спільними для всіх каналів повідомлень. Використовуйте type: "message.senders" для статичної групи, учасники якої задаються звичайним для кожного каналу синтаксисом allowFrom, або type: "discord.channelAudience", коли поточна аудиторія ViewChannel каналу Discord має динамічно визначати належність до групи. Спільна поведінка груп доступу: Групи доступу.
{accessGroups: {operators: { type: "message.senders", members: { "*": ["global-owner-id"], discord: ["discord:123456789012345678"], telegram: ["987654321"], },},},channels: {discord: { dmPolicy: "allowlist", allowFrom: ["accessGroup:operators"],},},}Текстовий канал Discord не має окремого списку учасників. type: "discord.channelAudience" моделює належність так: відправник особистого повідомлення є учасником налаштованої гільдії та наразі має ефективний дозвіл ViewChannel для налаштованого каналу після застосування перевизначень ролей і каналу.
Приклад: дозволити всім, хто бачить #maintainers, надсилати боту особисті повідомлення, водночас залишивши їх закритими для всіх інших.
{accessGroups: {maintainers: { type: "discord.channelAudience", guildId: "1456350064065904867", channelId: "1456744319972282449", membership: "canViewChannel",},},channels: {discord: { dmPolicy: "allowlist", allowFrom: ["accessGroup:maintainers"],},},}Можна поєднувати динамічні та статичні записи:
{accessGroups: {maintainers: { type: "discord.channelAudience", guildId: "1456350064065904867", channelId: "1456744319972282449",},},channels: {discord: { dmPolicy: "allowlist", allowFrom: ["accessGroup:maintainers", "discord:123456789012345678"],},},}У разі помилки пошуку доступ забороняється. Якщо Discord повертає Missing Access, пошук учасника завершується помилкою або канал належить іншій гільдії, відправник особистого повідомлення вважається неавторизованим.
Увімкніть Server Members Intent у Discord Developer Portal під час використання груп доступу на основі аудиторії каналу. Особисті повідомлення не містять стану учасника гільдії, тому під час авторизації OpenClaw отримує дані учасника через Discord REST.
Політика гільдій
Обробкою гільдій керує channels.discord.groupPolicy:
openallowlistdisabled
Безпечним базовим значенням за наявності channels.discord є allowlist.
Поведінка allowlist:
- гільдія має відповідати
channels.discord.guilds(бажано використовуватиid, також приймається коротка назва) - необов’язкові списки дозволених відправників:
users(рекомендовано стабільні ідентифікатори) іroles(лише ідентифікатори ролей); якщо налаштовано хоча б один із них, відправники отримують доступ, коли відповідаютьusersАБОroles - пряме зіставлення імен і тегів за замовчуванням вимкнене; вмикайте
channels.discord.dangerouslyAllowNameMatching: trueлише як аварійний режим сумісності - імена й теги підтримуються для
users, але ідентифікатори безпечніші;openclaw security auditпопереджає про використання записів з іменами або тегами - якщо для гільдії налаштовано
channels, канали поза списком забороняються - якщо гільдія не має блоку
channels, дозволяються всі канали цієї гільдії зі списку дозволених
Приклад:
{channels: {discord: { groupPolicy: "allowlist", guilds: { "123456789012345678": { requireMention: true, ignoreOtherMentions: true, users: ["987654321098765432"], roles: ["123456789012345678"], channels: { general: { enabled: true }, help: { enabled: true, requireMention: true }, }, }, },},},}Застарілий ключ allow для окремого каналу переноситься до enabled командою openclaw doctor --fix.
Якщо ви встановили лише DISCORD_BOT_TOKEN і не створили блок channels.discord, резервним значенням під час виконання буде groupPolicy="allowlist" (із попередженням у журналах), навіть якщо channels.defaults.groupPolicy має значення open.
Згадки та групові особисті повідомлення
Повідомлення гільдій за замовчуванням потребують згадки.
Виявлення згадок охоплює:
- явну згадку бота
- налаштовані шаблони згадок (
agents.list[].groupChat.mentionPatterns, із резервним використаннямmessages.groupChat.mentionPatterns) - неявну поведінку відповіді боту в підтримуваних випадках
Під час написання вихідних повідомлень Discord використовуйте канонічний синтаксис згадок: <@USER_ID> для користувачів, <#CHANNEL_ID> для каналів і <@&ROLE_ID> для ролей. Не використовуйте застарілу форму згадки псевдоніма <@!USER_ID>.
requireMention налаштовується для окремої гільдії або каналу (channels.discord.guilds...).
ignoreOtherMentions дає змогу відкидати повідомлення, які згадують іншого користувача чи роль, але не бота (за винятком @everyone/@here).
Групові особисті повідомлення:
- за замовчуванням: ігноруються (
dm.groupEnabled=false) - необов’язковий список дозволених через
dm.groupChannels(ідентифікатори або короткі назви каналів)
Маршрутизація агентів на основі ролей
Використовуйте bindings[].match.roles, щоб спрямовувати учасників гільдії Discord до різних агентів за ідентифікатором ролі. Прив’язки на основі ролей приймають лише ідентифікатори ролей і оцінюються після прив’язок за співрозмовником або батьківським співрозмовником, але перед прив’язками лише за гільдією. Якщо прив’язка також задає інші поля відповідності (наприклад, peer + guildId + roles), мають збігатися всі налаштовані поля.
{ bindings: [ { agentId: "opus", match: { channel: "discord", guildId: "123456789012345678", roles: ["111111111111111111"], }, }, { agentId: "sonnet", match: { channel: "discord", guildId: "123456789012345678", }, }, ],}Вбудовані команди та авторизація команд
commands.nativeза замовчуванням має значення"auto"та ввімкнено для Discord.- Перевизначення для окремого каналу:
channels.discord.commands.native. commands.native=falseпропускає реєстрацію та очищення слеш-команд Discord під час запуску. Раніше зареєстровані команди можуть залишатися видимими в Discord, доки ви не видалите їх із застосунку Discord.- Авторизація нативних команд використовує ті самі списки дозволених користувачів і політики Discord, що й звичайна обробка повідомлень.
- Команди можуть залишатися видимими в інтерфейсі Discord для неавторизованих користувачів; під час виконання застосовується авторизація OpenClaw і надсилається відповідь «не авторизовано».
- Налаштування слеш-команд за замовчуванням:
ephemeral: true(channels.discord.slashCommand.ephemeral).
Каталог команд і опис їхньої поведінки див. у розділі Слеш-команди.
Відомості про функції
Теги відповідей і нативні відповіді
Discord підтримує теги відповідей у виводі агента:
[[reply_to_current]][[reply_to:<id>]]
Керується параметром channels.discord.replyToMode:
off(за замовчуванням): без неявного групування відповідей у гілки; явні теги[[reply_to_*]]усе одно враховуютьсяfirst: додає неявне нативне посилання на відповідь до першого вихідного повідомлення Discord у межах ходуall: додає його до кожного вихідного повідомленняbatched: додає його лише тоді, коли вхідна подія була пакетом із кількох повідомлень, об'єднаних після затримки, — корисно, якщо нативні відповіді потрібні переважно для неоднозначних чатів зі сплесками активності, а не для кожного ходу з одним повідомленням
Ідентифікатори повідомлень доступні в контексті та історії, щоб агенти могли адресувати конкретні повідомлення.
Попередній перегляд посилань
За замовчуванням Discord створює розширені вбудовані блоки для URL-адрес. OpenClaw за замовчуванням приховує ці згенеровані блоки у вихідних повідомленнях Discord, тому надіслані агентом URL-адреси залишаються звичайними посиланнями, якщо ви явно не ввімкнете цю функцію:
{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 — застарілий псевдонім; запустіть openclaw doctor --fix, щоб перезаписати збережену конфігурацію в канонічну вкладену структуру streaming.
{channels: {discord: { streaming: { mode: "progress", progress: { label: "auto", maxLines: 8, maxLineChars: 120, toolProgress: true, commentary: false, }, },},},}offвимикає редагування попереднього перегляду в Discord.partialредагує одне повідомлення попереднього перегляду в міру надходження токенів.blockнадсилає фрагменти розміром із чернетку; налаштуйте розмір і точки розриву за допомогоюstreaming.preview.chunk(minChars,maxChars,breakPreference), з обмеженням доtextChunkLimit. Коли блокове потокове передавання ввімкнено явно, OpenClaw пропускає потік попереднього перегляду, щоб уникнути подвійного потокового передавання.progressзберігає одну редаговану чернетку стану та оновлює її даними про перебіг виконання інструментів до остаточного доставлення; спільна початкова мітка є рухомим рядком, тому після появи достатнього обсягу роботи вона прокручується за межі видимої області разом з рештою вмісту.- Остаточні відповіді з медіафайлами, помилками або явною адресацією скасовують очікувані редагування попереднього перегляду.
streaming.preview.toolProgress(за замовчуваннямtrue) визначає, чи оновлення інструментів і перебігу виконання повторно використовують повідомлення попереднього перегляду.- Рядки інструментів і перебігу виконання відображаються у стислому форматі: емодзі + заголовок + подробиці, якщо вони доступні, наприклад
🛠️ Bash: run testsабо🔎 Web Search: for "query". streaming.progress.commentary(за замовчуваннямfalse) вмикає текст коментарів або вступу асистента в тимчасовій чернетці перебігу виконання. Перед відображенням коментарі очищуються, залишаються тимчасовими та не змінюють доставлення остаточної відповіді.streaming.progress.maxLineCharsвизначає ліміт символів для кожного рядка попереднього перегляду перебігу виконання. Звичайний текст скорочується за межами слів; у подробицях команд і шляхів зберігаються корисні закінчення.streaming.preview.commandText/streaming.progress.commandTextкерує подробицями команд і виконання у стислих рядках перебігу:raw(за замовчуванням) абоstatus(лише мітка інструмента).
Щоб приховати необроблений текст команд і виконання, зберігши стислі рядки перебігу:
{ "channels": { "discord": { "streaming": { "mode": "progress", "progress": { "toolProgress": true, "commandText": "status" } } } }}Потоковий попередній перегляд підтримує лише текст; для відповідей із медіафайлами використовується звичайне доставлення.
Історія, контекст і поведінка гілок
Контекст історії сервера:
- значення
channels.discord.historyLimitза замовчуванням —20 - резервне значення:
messages.groupChat.historyLimit 0вимикає
Керування історією приватних повідомлень:
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
Поведінка гілок:
- Гілки Discord маршрутизуються як сеанси каналів і успадковують конфігурацію батьківського каналу, якщо її не перевизначено.
- Сеанси гілок успадковують вибір
/modelна рівні сеансу батьківського каналу лише як резервний варіант моделі; локальний вибір/modelу гілці має вищий пріоритет, а історія стенограми батьківського каналу не копіюється, якщо не ввімкнено успадкування стенограми. channels.discord.thread.inheritParent(за замовчуваннямfalse) вмикає початкове заповнення нових автоматичних гілок із батьківської стенограми. Перевизначення для окремого облікового запису:channels.discord.accounts.<id>.thread.inheritParent.- Реакції інструмента повідомлень можуть визначати цілі приватних повідомлень
user:<id>. guilds.<guild>.channels.<channel>.requireMention: falseзберігається під час резервної активації на етапі відповіді.
Теми каналів додаються як ненадійний контекст. Списки дозволених користувачів визначають, хто може активувати агента, але не є повною межею редагування додаткового контексту.
Сеанси підагентів, прив'язані до гілок
Discord може прив'язати гілку до цільового сеансу, щоб наступні повідомлення в цій гілці й надалі маршрутизувалися до того самого сеансу, зокрема до сеансів підагентів.
Команди:
/focus <target>прив'язує поточну або нову гілку до цілі підагента чи сеансу/unfocusвидаляє прив'язку поточної гілки/agentsпоказує активні запуски та стан прив'язки/session idle <duration|off>переглядає або оновлює автоматичне зняття фокуса через неактивність для сфокусованих прив'язок/session max-age <duration|off>переглядає або оновлює жорсткий максимальний вік сфокусованих прив'язок
Конфігурація:
{session: {threadBindings: { enabled: true, idleHours: 24, maxAgeHours: 0,},},channels: {discord: { threadBindings: { enabled: true, idleHours: 24, maxAgeHours: 0, spawnSessions: true, defaultSpawnContext: "fork", },},},}Примітки:
session.threadBindings.*задає глобальні значення за замовчуванням;channels.discord.threadBindings.*перевизначає поведінку Discord.spawnSessionsкерує автоматичним створенням і прив'язуванням гілок дляsessions_spawn({ thread: true })і створення гілок ACP. Значення за замовчуванням:true.defaultSpawnContextкерує нативним контекстом підагента для запусків, прив'язаних до гілок. Значення за замовчуванням:"fork".- Застарілі ключі
spawnSubagentSessions/spawnAcpSessionsмігруються командоюopenclaw doctor --fix. - Якщо прив'язки гілок вимкнено для облікового запису,
/focusі пов'язані операції прив'язування гілок недоступні.
Див. Підагенти, Агенти ACP і Довідник із конфігурації.
Постійні прив'язки каналів ACP
Для стабільних, постійно активних робочих просторів ACP налаштуйте типізовані прив'язки ACP верхнього рівня, націлені на розмови Discord.
Шлях конфігурації: bindings[] із type: "acp" і match.channel: "discord".
{agents: {list: [ { id: "codex", runtime: { type: "acp", acp: { agent: "codex", backend: "acpx", mode: "persistent", cwd: "/workspace/openclaw", }, }, },],},bindings: [{ type: "acp", agentId: "codex", match: { channel: "discord", accountId: "default", peer: { kind: "channel", id: "222222222222222222" }, }, acp: { label: "codex-main" },},],channels: {discord: { guilds: { "111111111111111111": { channels: { "222222222222222222": { requireMention: false, }, }, }, },},},}Примітки:
/acp spawn codex --bind hereприв'язує поточний канал або гілку безпосередньо та залишає майбутні повідомлення в тому самому сеансі ACP. Повідомлення гілки успадковують прив'язку батьківського каналу.- У прив'язаному каналі або гілці
/newі/resetскидають той самий сеанс ACP без зміни прив'язки. Тимчасові прив'язки гілок можуть перевизначати визначення цілі, доки вони активні. spawnSessionsрегулює створення й прив'язування дочірніх гілок через--thread auto|here.
Докладніше про поведінку прив'язок див. у розділі Агенти ACP.
Сповіщення про реакції
Режим сповіщень про реакції для окремого сервера (guilds.<id>.reactionNotifications):
offown(за замовчуванням)allallowlist(використовуєguilds.<id>.users)
Події реакцій перетворюються на системні події та додаються до маршрутизованого сеансу Discord.
Реакції-підтвердження
ackReaction надсилає емодзі-підтвердження, поки OpenClaw обробляє вхідне повідомлення.
Порядок визначення:
channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- резервний емодзі ідентичності агента (
agents.list[].identity.emoji, інакше "👀")
Примітки:
- Discord приймає емодзі Unicode або назви власних емодзі.
- Використовуйте
"", щоб вимкнути реакцію для каналу або облікового запису.
Область дії (messages.ackReactionScope):
Значення: "all" (приватні повідомлення + групи, включно з фоновими подіями кімнат), "direct" (лише приватні повідомлення), "group-all" (усі групові повідомлення, крім фонових подій кімнат, без приватних повідомлень), "group-mentions" (групи, коли згадано бота; без приватних повідомлень, значення за замовчуванням), "off" / "none" (вимкнено).
Запис конфігурації
Запис конфігурації, ініційований каналом, увімкнено за замовчуванням. Це впливає на сценарії /config set|unset, коли функції команд увімкнено.
Щоб вимкнути:
{channels: {discord: { configWrites: false,},},}Проксі Gateway
Спрямовуйте WebSocket-трафік шлюзу Discord і початкові REST-запити під час запуску (ідентифікатор застосунку + визначення списку дозволених користувачів) через HTTP(S)-проксі за допомогою channels.discord.proxy.
Проксіювання WebSocket шлюзу Discord налаштовується явно; WebSocket-з'єднання не успадковують змінні середовища проксі з процесу Gateway. Початкові REST-запити використовують цей проксі, коли налаштовано channels.discord.proxy.
{channels: {discord: { proxy: "http://proxy.example:8080",},},}Перевизначення для окремого облікового запису:
{channels: {discord: { accounts: { primary: { proxy: "http://proxy.example:8080", }, },},},}Підтримка PluralKit
Увімкніть визначення PluralKit, щоб зіставляти проксійовані повідомлення з ідентичністю учасника системи:
{channels: {discord: { pluralkit: { enabled: true, token: "pk_live_...", // необов’язково; потрібно для приватних систем },},},}Примітки:
- у списках дозволених значень можна використовувати
pk:<memberId> - відображувані імена учасників зіставляються за іменем/slug лише тоді, коли встановлено
channels.discord.dangerouslyAllowNameMatching: true - пошук надсилає запит до API PluralKit з початковим ідентифікатором повідомлення
- якщо пошук завершується невдало, проксійовані повідомлення вважаються повідомленнями ботів і відкидаються, якщо
allowBotsне дозволяє їх пропускати
Псевдоніми вихідних згадок
Використовуйте mentionAliases, коли агентам потрібні детерміновані вихідні згадки відомих користувачів Discord. Ключі — це ідентифікатори без початкового символу @; значення — ідентифікатори користувачів Discord. Невідомі ідентифікатори, @everyone, @here і згадки всередині фрагментів коду Markdown залишаються без змін.
{channels: {discord: { mentionAliases: { SupportLead: "123456789012345678", }, accounts: { ops: { mentionAliases: { OpsLead: "234567890123456789", }, }, },},},}Налаштування присутності
Оновлення присутності застосовуються, коли ви задаєте поле стану чи активності або вмикаєте автоматичну присутність.
Лише стан:
{channels: {discord: { status: "idle",},},}Активність (власний стан є стандартним типом активності, коли задано activity):
{channels: {discord: { activity: "Час зосередженої роботи", activityType: 4,},},}Потокова трансляція:
{channels: {discord: { activity: "Програмування наживо", activityType: 1, activityUrl: "https://twitch.tv/openclaw",},},}Відповідність типів активності:
- 0: Грає
- 1: Транслює (потребує
activityUrl; водночасactivityUrlпотребуєactivityType: 1) - 2: Слухає
- 3: Дивиться
- 4: Власний (використовує текст активності як стан; емодзі необов’язковий)
- 5: Змагається
Автоматична присутність (сигнал працездатності середовища виконання):
{channels: {discord: { autoPresence: { enabled: true, intervalMs: 30000, minUpdateIntervalMs: 15000, exhaustedText: "токен вичерпано", },},},}Автоматична присутність зіставляє доступність середовища виконання зі станом Discord: справне => онлайн, погіршене або невідоме => неактивний, вичерпане або недоступне => не турбувати. Стандартні значення: intervalMs 30000, minUpdateIntervalMs 15000 (має бути меншим або дорівнювати intervalMs). Необов’язкові перевизначення тексту:
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(підтримує заповнювач{reason})
Схвалення в Discord
Discord підтримує обробку схвалень за допомогою кнопок у приватних повідомленнях і за бажанням може публікувати запити на схвалення у вихідному каналі.
Шлях конфігурації:
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(необов’язково; за можливості використовуєcommands.ownerAllowFromяк запасний варіант)channels.discord.execApprovals.target(dm|channel|both, стандартно:dm)agentFilter,sessionFilter,cleanupAfterResolve
Discord автоматично вмикає нативні схвалення виконання, коли enabled не задано або має значення "auto" і можна визначити принаймні одного схвалювача — або з execApprovals.approvers, або з commands.ownerAllowFrom. Discord не визначає схвалювачів виконання зі значень allowFrom каналу, застарілого dm.allowFrom чи defaultTo приватних повідомлень. Установіть enabled: false, щоб явно вимкнути Discord як нативний клієнт схвалення.
Для конфіденційних групових команд лише для власника, як-от /diagnostics і /export-trajectory, OpenClaw надсилає запити на схвалення та остаточні результати приватно. Спочатку він намагається використати приватні повідомлення Discord, якщо власник, який викликав команду, має маршрут власника Discord; інакше використовується перший доступний маршрут власника з commands.ownerAllowFrom, наприклад Telegram.
Коли target має значення channel або both, запит на схвалення видимий у каналі. Кнопками можуть користуватися лише визначені схвалювачі; інші користувачі отримують ефемерну відмову. Запити на схвалення містять текст команди, тому вмикайте доставлення в канал лише в довірених каналах. Якщо ідентифікатор каналу неможливо отримати з ключа сеансу, OpenClaw використовує доставлення через приватні повідомлення як запасний варіант.
Discord відображає спільні кнопки схвалення, які використовують інші канали чату; нативний адаптер Discord переважно додає маршрутизацію приватних повідомлень схвалювачам і розсилання в канали. Коли ці кнопки присутні, вони є основним інтерфейсом схвалення; OpenClaw має додавати ручну команду /approve лише тоді, коли результат інструмента вказує, що схвалення в чаті недоступні або ручне схвалення є єдиним способом. Якщо нативне середовище схвалення Discord неактивне, OpenClaw залишає видимим локальний детермінований запит /approve <id> <decision>. Якщо середовище активне, але нативну картку неможливо доставити жодному одержувачу, OpenClaw надсилає в той самий чат резервне сповіщення з точною командою /approve з очікуваного схвалення.
Автентифікація Gateway і визначення схвалень відповідають спільному контракту клієнта Gateway (ідентифікатори plugin: визначаються через plugin.approval.resolve; інші ідентифікатори — через exec.approval.resolve). Стандартний строк дії схвалень — 30 хвилин.
Див. Схвалення виконання.
Інструменти та обмеження дій
Дії з повідомленнями Discord охоплюють обмін повідомленнями, адміністрування каналів, модерацію, присутність і метадані.
Основні приклади:
- обмін повідомленнями:
sendMessage,readMessages,editMessage,deleteMessage,threadReply - реакції:
react,reactions,emojiList - модерація:
timeout,kick,ban - присутність:
setPresence
Дія event-create приймає необов’язковий параметр image (URL або шлях до локального файлу), щоб установити зображення обкладинки запланованої події.
Обмеження дій розташовані в channels.discord.actions.*.
Стандартна поведінка обмежень:
| Група дій | Стандартно |
|---|---|
| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | увімкнено |
| roles | вимкнено |
| moderation | вимкнено |
| presence | вимкнено |
Інтерфейс компонентів v2
OpenClaw використовує компоненти Discord v2 для схвалень виконання та маркерів між контекстами. Дії з повідомленнями Discord також можуть приймати components для власного інтерфейсу (розширене використання; потребує створення корисного навантаження компонента через інструмент Discord), тоді як застарілі embeds залишаються доступними, але не рекомендовані.
channels.discord.ui.components.accentColorзадає колір акценту, який використовують контейнери компонентів Discord (шістнадцятковий код). Для окремого облікового запису:channels.discord.accounts.<id>.ui.components.accentColor.channels.discord.agentComponents.ttlMsвизначає, як довго зворотні виклики надісланих компонентів Discord залишаються зареєстрованими (стандартно1800000, максимум86400000). Для окремого облікового запису:channels.discord.accounts.<id>.agentComponents.ttlMs.embedsігноруються, коли присутні компоненти v2.- Попередній перегляд звичайних URL стандартно приховано. Установіть
suppressEmbeds: falseу дії з повідомленням, якщо одне вихідне посилання має розгортатися.
Приклад:
{ channels: { discord: { ui: { components: { accentColor: "#5865F2", }, }, }, },}Голос
Discord має дві окремі голосові поверхні: голосові канали в реальному часі (безперервні розмови) та вкладення голосових повідомлень (формат попереднього перегляду у вигляді звукової хвилі). Gateway підтримує обидві.
Голосові канали
Контрольний список налаштування:
- Увімкніть Message Content Intent у Discord Developer Portal.
- Увімкніть Server Members Intent, коли використовуються списки дозволених ролей/користувачів.
- Запросіть бота з областями доступу
botіapplications.commands. - Надайте дозволи Connect, Speak, Send Messages і Read Message History у цільовому голосовому каналі.
- Увімкніть нативні команди (
commands.nativeабоchannels.discord.commands.native). - Налаштуйте
channels.discord.voice.
Використовуйте /vc join|leave|status для керування сеансами. Команда використовує стандартного агента облікового запису та дотримується тих самих правил списку дозволених значень і групової політики, що й інші команди Discord.
/vc join channel:<voice-channel-id>/vc status/vc leaveЩоб перевірити фактичні дозволи бота перед приєднанням:
openclaw channels capabilities --channel discord --target channel:<voice-channel-id>Приклад автоматичного приєднання:
{ channels: { discord: { voice: { enabled: true, model: "openai/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 є опціональними для конфігурацій лише з текстовим режимом; установіть
channels.discord.voice.enabled=true(або збережіть наявний блокchannels.discord.voice), щоб увімкнути команди/vc, голосове середовище виконання та намір GatewayGuildVoiceStates.channels.discord.intents.voiceStatesдає змогу явно перевизначити підписку на намір; не задавайте його, щоб він відповідав фактичному стану ввімкнення голосових функцій. voice.modeкерує шляхом розмови. Типове значення —agent-proxy: інтерфейс голосової взаємодії в реальному часі керує черговістю реплік, перериванням і відтворенням, делегує змістовну роботу спрямованому агенту OpenClaw черезopenclaw_agent_consultі обробляє результат як текстовий запит Discord від цього мовця.stt-ttsзберігає старіший пакетний процес STT із подальшим TTS.bidiдає моделі реального часу змогу вести розмову безпосередньо, надаючиopenclaw_agent_consultдля звернення до інтелекту OpenClaw.voice.agentSessionвизначає, яка розмова OpenClaw отримує голосові репліки. Не задавайте його, щоб використовувати власний сеанс голосового каналу, або встановіть{ mode: "target", target: "channel:<text-channel-id>" }, щоб голосовий канал слугував розширенням мікрофона й динаміка для наявного сеансу текстового каналу Discord, наприклад#maintainers.voice.modelперевизначає модель агента OpenClaw для голосових відповідей Discord і консультацій у реальному часі. Не задавайте його, щоб успадкувати модель спрямованого агента. Цей параметр відокремлений відvoice.realtime.model.voice.followUsersдає боту змогу приєднуватися до вибраних користувачів у голосових каналах Discord, переміщуватися разом із ними та виходити. Див. Слідування за користувачами в голосових каналах.agent-proxyспрямовує мовлення черезdiscord-voice, який зберігає звичайну авторизацію власника й інструментів для мовця та цільового сеансу, але приховує інструмент агентаtts, оскільки відтворенням керує голосовий компонент Discord. Типовоagent-proxyнадає консультації повний доступ до інструментів, еквівалентний доступу власника, для мовців-власників (voice.realtime.toolPolicy: "owner") і наполегливо віддає перевагу консультації з агентом OpenClaw перед змістовними відповідями (voice.realtime.consultPolicy: "always"). У типовому режиміalwaysшар реального часу не промовляє автоматично заповнювальні фрази перед відповіддю консультації; він захоплює й транскрибує мовлення, а потім озвучує відповідь спрямованого агента OpenClaw. Якщо кілька відповідей примусової консультації завершуються, поки Discord ще відтворює першу відповідь, наступні відповіді з точним текстом мовлення стають у чергу до завершення відтворення, а не замінюють мовлення посеред речення.- У режимі
stt-ttsSTT використовує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, щоб голосовий компонент реального часу Discord мовчав, доки транскрипт не почнеться або не завершиться словом активації. Налаштовані слова активації мають складатися з одного або двох слів. Якщоvoice.realtime.wakeNamesне задано, OpenClaw використовуєnameспрямованого агента разом ізOpenClaw, а за його відсутності — ідентифікатор агента разом ізOpenClaw. Фільтрація за словом активації вимикає автоматичну відповідь постачальника реального часу, спрямовує прийняті репліки через шлях консультації з агентом OpenClaw і надає коротке голосове підтвердження, коли початкове слово активації розпізнано з часткової транскрипції до надходження остаточного транскрипту. - Постачальник реального часу OpenAI приймає поточні назви подій Realtime 2 і застарілі сумісні з Codex псевдоніми для подій вихідного аудіо й транскрипту, тому сумісні знімки стану постачальника можуть змінюватися без втрати аудіо асистента.
voice.realtime.bargeInвизначає, чи переривають події початку мовлення в Discord активне відтворення в реальному часі. Якщо параметр не задано, він відповідає налаштуванню переривання вхідним аудіо постачальника реального часу.voice.realtime.minBargeInAudioEndMsвизначає мінімальну тривалість відтворення відповіді асистента, після якої переривання в реальному часі OpenAI обрізає аудіо. Типове значення:250. Установіть0для негайного переривання в приміщеннях із низьким рівнем відлуння або збільште значення для конфігурацій динаміків із сильним відлунням.voice.ttsперевизначаєmessages.ttsлише для голосового відтворенняstt-tts; натомість режими реального часу використовуютьvoice.realtime.speakerVoice. Щоб використовувати голос OpenAI для відтворення в Discord, установітьvoice.tts.provider: "openai"і виберіть голос синтезу мовлення вvoice.tts.providers.openai.speakerVoice.cedar— вдалий варіант із чоловічим звучанням у поточній моделі TTS OpenAI.- Перевизначення
systemPromptдля окремих каналів Discord застосовуються до реплік із голосових транскриптів відповідного голосового каналу. - Для команд і дій каналу, доступних лише власнику, статус власника для реплік із голосових транскриптів визначається за
allowFrom(абоdm.allowFrom) у Discord. Видимість інструментів агента відповідає налаштованій політиці інструментів спрямованого сеансу. - Якщо
voice.autoJoinмістить кілька записів для однієї гільдії, OpenClaw приєднується до останнього налаштованого каналу цієї гільдії. voice.allowedChannels— необов’язковий список дозволених каналів перебування. Не задавайте його, щоб дозволити/vc joinдля будь-якого авторизованого голосового каналу Discord. Якщо його задано,/vc join, автоматичне приєднання під час запуску й переміщення бота між голосовими каналами обмежуються переліченими записами{ guildId, channelId }. Установіть порожній масив, щоб заборонити всі приєднання до голосових каналів Discord. Якщо Discord перемістить бота за межі списку дозволених каналів, OpenClaw вийде з цього каналу й повторно приєднається до налаштованого цільового каналу автоматичного приєднання, якщо він доступний.voice.daveEncryptionіvoice.decryptionFailureToleranceпередаються до параметрів приєднання@discordjs/voice; типові значення у вихідній бібліотеці —daveEncryption=trueіdecryptionFailureTolerance=24.- OpenClaw використовує вбудований кодек
libopus-wasmдля отримання голосового аудіо Discord і відтворення необробленого PCM у реальному часі. Він постачається із зафіксованою версією збірки libopus для WebAssembly і не потребує нативних доповнень opus. voice.connectTimeoutMsвизначає час початкового очікування стану Ready від@discordjs/voiceдля/vc joinі спроб автоматичного приєднання. Типове значення:30000.voice.reconnectGraceMsвизначає, скільки часу OpenClaw очікує початку повторного підключення від’єднаного голосового сеансу, перш ніж знищити його. Типове значення:15000.- У режимі
stt-ttsголосове відтворення не зупиняється лише через те, що інший користувач почав говорити. Щоб уникнути циклів зворотного зв’язку, OpenClaw ігнорує нове захоплення голосу під час відтворення TTS; для наступної репліки говоріть після завершення відтворення. Режими реального часу передають початок мовлення як сигнали переривання постачальнику реального часу. - У режимах реального часу відлуння від динаміків у відкритий мікрофон може сприйматися як переривання й зупиняти відтворення. Для приміщень Discord із сильним відлунням установіть
voice.realtime.providers.openai.interruptResponseOnInputAudio: false, щоб OpenAI не переривав відповідь автоматично через вхідне аудіо. Додайтеvoice.realtime.bargeIn: true, якщо все одно хочете, щоб події початку мовлення в Discord переривали активне відтворення. Міст реального часу OpenAI ігнорує обрізання відтворення, коротші заvoice.realtime.minBargeInAudioEndMs, вважаючи їх імовірним відлунням або шумом, і записує їх у журнал як пропущені замість очищення відтворення Discord. voice.captureSilenceGraceMsвизначає, скільки часу OpenClaw очікує після повідомлення Discord про завершення мовлення, перш ніж завершити цей аудіосегмент для STT. Типове значення:2000; збільште його, якщо Discord розбиває звичайні паузи на уривчасті часткові транскрипти.- Коли вибрано постачальника TTS ElevenLabs, голосове відтворення Discord використовує потоковий TTS і починається безпосередньо з потоку відповіді постачальника. Постачальники без підтримки потокового передавання повертаються до шляху через синтезований тимчасовий файл.
- OpenClaw відстежує помилки розшифрування отриманих даних і автоматично відновлюється, виходячи з голосового каналу та повторно приєднуючись до нього після кількох помилок за короткий проміжок часу.
- Якщо після оновлення в журналах отримання багаторазово з’являється
DecryptionFailed(UnencryptedWhenPassthroughDisabled), зберіть звіт про залежності та журнали. Вбудована версія@discordjs/voiceмістить виправлення доповнення з PR discord.js №11449, яке закрило проблему discord.js №11419. - Події отримання
The operation was abortedочікувані, коли OpenClaw завершує захоплений сегмент мовця; це докладні діагностичні повідомлення, а не попередження. - Докладні журнали голосових функцій Discord містять обмежений однорядковий попередній перегляд транскрипту STT для кожного прийнятого сегмента мовця, тож під час налагодження видно як репліку користувача, так і відповідь агента без виведення необмеженого тексту транскрипту.
- У режимі
agent-proxyрезервна примусова консультація пропускає ймовірно незавершені фрагменти транскрипту, наприклад текст, що закінчується на...або сполучник на кшталт "і", а також очевидні завершальні фрази, що не потребують дій, як-от "зараз повернуся" чи "бувай". Коли це запобігає використанню застарілої відповіді з черги, у журналах з’являєтьсяforced agent consult skipped reason=....
Слідування за користувачами в голосових каналах
Використовуйте voice.followUsers, якщо потрібно, щоб голосовий бот Discord залишався з одним або кількома відомими користувачами Discord замість приєднання до фіксованого каналу під час запуску або очікування /vc join.
{ channels: { discord: { voice: { enabled: true, followUsersEnabled: true, followUsers: ["discord:123456789012345678"], allowedChannels: [ { guildId: "123456789012345678", channelId: "234567890123456789", }, ], }, }, },}Поведінка:
followUsersприймає необроблені ідентифікатори користувачів Discord і значенняdiscord:<id>. OpenClaw нормалізує обидві форми перед зіставленням подій стану голосового каналу.followUsersEnabledтипово має значенняtrue, якщо налаштованоfollowUsers. Установітьfalse, щоб зберегти список, але припинити автоматичне слідування в голосових каналах.- Коли відстежуваний користувач приєднується до дозволеного голосового каналу, OpenClaw приєднується до цього каналу. Коли користувач переміщується, OpenClaw переміщується разом із ним. Коли активний відстежуваний користувач від’єднується, OpenClaw виходить.
- Якщо в одній гільдії перебуває кілька відстежуваних користувачів і активний відстежуваний користувач виходить, OpenClaw перед виходом із гільдії переходить до каналу іншого відстежуваного користувача. Якщо кілька відстежуваних користувачів переміщуються одночасно, перевагу має остання спостережена подія стану голосового каналу.
allowedChannelsпродовжує застосовуватися. Відстежуваний користувач у забороненому каналі ігнорується, а сеанс, керований слідуванням, переходить до іншого відстежуваного користувача або завершується.- OpenClaw узгоджує пропущені події стану голосових каналів під час запуску й через обмежені інтервали. Під час узгодження перевіряються налаштовані гільдії та обмежується кількість запитів REST за один запуск, тому дуже великим спискам
followUsersможе знадобитися більше одного інтервалу для досягнення узгодженого стану. - Якщо Discord або адміністратор переміщує бота, поки той слідує за користувачем, OpenClaw перебудовує голосовий сеанс і зберігає керування слідуванням, якщо цільовий канал дозволений. Якщо бота переміщено за межі
allowedChannels, OpenClaw виходить і повторно приєднується до налаштованого цільового каналу, якщо такий існує. - Відновлення отримання DAVE може виходити з того самого каналу й повторно приєднуватися до нього після кількох помилок розшифрування. Сеанси, керовані слідуванням, зберігають таке керування протягом цього процесу відновлення, тому подальше від’єднання відстежуваного користувача все одно призводить до виходу з каналу.
Виберіть один із режимів приєднання:
- Використовуйте
followUsersдля особистих або операторських конфігурацій, у яких бот має автоматично перебувати в голосовому каналі разом із вами. - Використовуйте
autoJoinдля ботів у фіксованих кімнатах, які мають бути присутніми, навіть коли жодного відстежуваного користувача немає в голосовому каналі. - Використовуйте
/vc joinдля одноразових приєднань або кімнат, де автоматична присутність у голосовому каналі була б несподіваною.
Голосовий кодек Discord:
- Журнали отримання голосу містять
discord voice: opus decoder: libopus-wasm. - Відтворення в реальному часі кодує необроблений стереофонічний PCM із частотою 48 кГц у Opus за допомогою того самого вбудованого пакета
libopus-wasm, перш ніж передавати пакети до@discordjs/voice. - Відтворення з файлів і потоків постачальників перекодовує дані в необроблений стереофонічний PCM із частотою 48 кГц за допомогою ffmpeg, а потім використовує
libopus-wasmдля потоку пакетів Opus, що надсилається до Discord.
Конвеєр STT і TTS:
- Захоплений у Discord PCM-звук перетворюється на тимчасовий WAV-файл.
tools.media.audioвиконує STT, наприклад за допомогоюopenai/gpt-4o-mini-transcribe.- Транскрипт передається через вхідний потік і маршрутизацію Discord, тоді як LLM відповіді працює з політикою голосового виведення, яка приховує від агента інструмент
ttsі запитує повернення тексту, оскільки остаточним відтворенням TTS керує голосовий канал Discord. - Якщо задано
voice.model, він перевизначає лише LLM відповіді для цього звернення в голосовому каналі. voice.ttsнакладається поверхmessages.tts; провайдери з підтримкою потокового передавання подають звук безпосередньо до програвача, інакше отриманий аудіофайл відтворюється в каналі, до якого приєднано бота.
Приклад стандартного сеансу голосового каналу з проксі агента:
{ 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:
{ 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", }, }, }, }, }, },}Приклад двонапрямного режиму реального часу:
{ 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:
{ 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 для середовища із сильним відлунням:
{ 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. Дуже ранні сигнали переривання голосом зі значенням audioEndMs, меншим за minBargeInAudioEndMs, вважаються ймовірним відлунням або шумом та ігноруються, щоб модель не обривала відповідь на першому кадрі відтворення.
Очікувані журнали голосового режиму:
- Під час приєднання:
discord voice: joining ... voiceSession=... supervisorSession=... agentSessionMode=... voiceModel=... realtimeModel=... - Під час запуску режиму реального часу:
discord voice: realtime bridge starting ... autoRespond=false interruptResponse=false bargeIn=false minBargeInAudioEndMs=... - Під час надходження звуку мовця:
discord voice: realtime speaker turn opened ...,discord voice: realtime input audio started ... outputAudioMs=... outputActive=...іdiscord voice: realtime speaker turn closed ... chunks=... discordBytes=... realtimeBytes=... interruptedPlayback=... - Під час пропуску застарілого мовлення:
discord voice: realtime forced agent consult skipped reason=incomplete-transcript ...абоreason=non-actionable-closing ... - Після завершення відповіді реального часу:
discord voice: realtime audio playback finishing reason=response.done ... audioMs=... chunks=... - Під час зупинення або скидання відтворення:
discord voice: realtime audio playback stopped reason=... audioMs=... elapsedMs=... chunks=... - Під час консультації в режимі реального часу:
discord voice: realtime consult requested ... voiceSession=... supervisorSession=... question=... - Після відповіді агента:
discord voice: agent turn answer ... - Під час додавання точного тексту для озвучення до черги:
discord voice: realtime exact speech queued ... queued=... outputAudioMs=... outputActive=..., після чого з’являєтьсяdiscord voice: realtime exact speech dequeued reason=player-idle ... - Після виявлення переривання голосом:
discord voice: realtime barge-in detected source=speaker-start ...абоdiscord voice: realtime barge-in detected source=active-speaker-audio ..., після чого з’являєтьсяdiscord voice: realtime barge-in requested reason=... outputAudioMs=... outputActive=... - Під час переривання режиму реального часу:
discord voice: realtime model interrupt requested client:response.cancel reason=barge-in, після чого з’являється абоdiscord voice: realtime model audio truncated client:conversation.item.truncate reason=barge-in audioEndMs=..., абоdiscord voice: realtime model interrupt confirmed server:response.done status=cancelled ... - Під час ігнорування відлуння або шуму:
discord voice: realtime model interrupt ignored client:conversation.item.truncate.skipped reason=barge-in audioEndMs=0 minAudioEndMs=250 - Коли переривання голосом вимкнено:
discord voice: realtime capture ignored during playback (barge-in disabled) ... - Коли відтворення неактивне:
discord voice: realtime barge-in ignored reason=... outputActive=false ... playbackChunks=0
Щоб налагодити обривання звуку, читайте журнали голосового режиму реального часу як хронологію:
realtime audio playback startedозначає, що Discord почав відтворювати звук асистента. Від цього моменту міст починає підраховувати фрагменти вихідного звуку асистента, байти PCM Discord, байти провайдера реального часу та тривалість синтезованого звуку.realtime speaker turn openedпозначає активізацію мовця в Discord. Якщо відтворення вже активне йbargeInувімкнено, далі може з’явитисяbarge-in detected source=speaker-start.realtime input audio startedпозначає перший фактичний аудіокадр, отриманий для цієї репліки мовця.outputActive=trueабо ненульове значенняoutputAudioMsтут означає, що мікрофон надсилає вхідний звук, поки відтворення відповіді асистента ще активне.barge-in detected source=active-speaker-audioозначає, що OpenClaw виявив живий звук мовця під час активного відтворення відповіді асистента. Це допомагає відрізнити справжнє переривання від події початку мовлення в Discord без корисного звуку.barge-in requested reason=...означає, що OpenClaw попросив провайдера реального часу скасувати або обрізати активну відповідь. Запис міститьoutputAudioMs,outputActiveіplaybackChunks, щоб можна було побачити, скільки звуку асистента фактично відтворилося до переривання.realtime audio playback stopped reason=...є точкою локального скидання відтворення Discord. Причина вказує, що саме зупинило відтворення:barge-in,player-idle,provider-clear-audio,forced-agent-consult,stream-closeабоsession-close.realtime speaker turn closedпідсумовує захоплену вхідну репліку.chunks=0абоhasAudio=falseозначає, що репліка мовця почалася, але до мосту реального часу не надійшло придатного звуку.interruptedPlayback=trueозначає, що ця вхідна репліка збіглася в часі з вихідним звуком асистента й запустила логіку переривання голосом.
Корисні поля:
outputAudioMs: тривалість звуку асистента, створеного провайдером реального часу до цього запису журналу.audioMs: тривалість звуку асистента, яку OpenClaw підрахував до зупинення відтворення.elapsedMs: фактичний час між відкриттям і закриттям потоку відтворення або репліки мовця.discordBytes: байти стереофонічного PCM-звуку з частотою 48 кГц, надіслані до голосового каналу Discord або отримані з нього.realtimeBytes: байти PCM-звуку у форматі провайдера, надіслані провайдеру реального часу або отримані від нього.playbackChunks: фрагменти звуку асистента, передані до Discord для активної відповіді.sinceLastAudioMs: проміжок між останнім захопленим аудіокадром мовця та закриттям його репліки.
Поширені сценарії:
- Негайне обривання з
source=active-speaker-audio, малим значеннямoutputAudioMsі тим самим користувачем поблизу зазвичай указує на потрапляння відлуння динаміка в мікрофон. Збільштеvoice.realtime.minBargeInAudioEndMs, зменште гучність динаміка, використовуйте навушники або задайтеvoice.realtime.providers.openai.interruptResponseOnInputAudio: false. source=speaker-start, після якого з’являєтьсяspeaker turn closed ... hasAudio=false, означає, що Discord повідомив про початок мовлення, але звук не надійшов до OpenClaw. Причиною може бути тимчасова голосова подія Discord, поведінка шумового шлюзу або короткочасне ввімкнення мікрофона клієнтом.audio playback stopped reason=stream-closeбез близького за часом переривання голосом абоprovider-clear-audioозначає, що локальний потік відтворення Discord несподівано завершився. Перевірте попередні журнали провайдера й програвача Discord.capture ignored during playback (barge-in disabled)означає, що OpenClaw навмисно відкинув вхідний звук, поки звук асистента був активний. Увімкнітьvoice.realtime.bargeIn, якщо хочете, щоб мовлення переривало відтворення.barge-in ignored ... outputActive=falseозначає, що Discord або VAD провайдера виявив мовлення, але OpenClaw не мав активного відтворення, яке можна було б перервати. Це не повинно обривати звук.
Облікові дані визначаються окремо для кожного компонента: автентифікація маршруту LLM для voice.model, автентифікація STT для tools.media.audio, автентифікація TTS для messages.tts/voice.tts і автентифікація провайдера реального часу для voice.realtime.providers або звичайної конфігурації автентифікації провайдера.
Голосові повідомлення
Голосові повідомлення Discord показують попередній перегляд форми хвилі та потребують аудіо OGG/Opus. OpenClaw автоматично створює форму хвилі, але для аналізу й перетворення на хості Gateway мають бути встановлені ffmpeg і ffprobe.
- Укажіть шлях до локального файлу (URL-адреси відхиляються).
- Не додавайте текстовий вміст (Discord відхиляє текст і голосове повідомлення в одному корисному навантаженні).
- Підтримується будь-який аудіоформат; за потреби OpenClaw перетворює його на OGG/Opus.
message(action="send", channel="discord", target="channel:123", path="/path/to/audio.mp3", asVoice=true)Усунення несправностей
Використано заборонені наміри або бот не бачить повідомлень сервера
- увімкніть Message Content Intent
- увімкніть Server Members Intent, якщо вам потрібне визначення користчів/учасників
- перезапустіть Gateway після зміни intents
Повідомлення сервера несподівано блокуються
- перевірте
groupPolicy - перевірте список дозволених серверів у
channels.discord.guilds - якщо існує мапа
channelsсервера, дозволено лише перелічені канали - перевірте поведінку
requireMentionі шаблони згадок
Корисні перевірки:
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 ...
Параметри черги Gateway Discord:
- один обліковий запис:
channels.discord.eventQueue.listenerTimeout - кілька облікових записів:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout - це керує лише роботою слухача Gateway Discord, а не тривалістю ітерації агента
Discord не застосовує власний тайм-аут каналу до поставлених у чергу ітерацій агента. Слухачі повідомлень негайно передають роботу далі, а поставлені в чергу запуски Discord зберігають порядок у межах сеансу, доки життєвий цикл сеансу, інструмента або середовища виконання не завершить чи не перерве роботу.
{channels: {discord: { accounts: { default: { eventQueue: { listenerTimeout: 120000, }, }, },},},}Попередження про тайм-аут отримання метаданих Gateway
Перед підключенням OpenClaw отримує метадані Discord /gateway/bot. У разі тимчасових збоїв використовується стандартна URL-адреса Gateway Discord, а частота записів у журналах обмежується.
Параметри тайм-ауту метаданих:
- один обліковий запис:
channels.discord.gatewayInfoTimeoutMs - кілька облікових записів:
channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs - резервна змінна середовища, коли конфігурацію не задано:
OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS - стандартне значення:
30000(30 секунд), максимум:120000
Перезапуски через тайм-аут READY Gateway
OpenClaw очікує на подію READY від Gateway Discord під час запуску та після повторних підключень середовища виконання. Конфігураціям із кількома обліковими записами та поетапним запуском може знадобитися довше початкове вікно READY, ніж передбачено стандартно.
Параметри тайм-ауту READY:
- запуск з одним обліковим записом:
channels.discord.gatewayReadyTimeoutMs - запуск із кількома обліковими записами:
channels.discord.accounts.<accountId>.gatewayReadyTimeoutMs - резервна змінна середовища для запуску, коли конфігурацію не задано:
OPENCLAW_DISCORD_READY_TIMEOUT_MS - стандартне значення для запуску:
15000(15 секунд), максимум:120000 - середовище виконання з одним обліковим записом:
channels.discord.gatewayRuntimeReadyTimeoutMs - середовище виконання з кількома обліковими записами:
channels.discord.accounts.<accountId>.gatewayRuntimeReadyTimeoutMs - резервна змінна середовища для середовища виконання, коли конфігурацію не задано:
OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS - стандартне значення для середовища виконання:
30000(30 секунд), максимум:120000
Невідповідності під час аудиту дозволів
Перевірки дозволів channels status --probe працюють лише з числовими ідентифікаторами каналів.
Якщо ви використовуєте текстові ключі, зіставлення під час виконання все одно може працювати, але перевірка не зможе повністю підтвердити дозволи.
Проблеми з приватними повідомленнями та сполученням
- приватні повідомлення вимкнено:
channels.discord.dm.enabled=false - політику приватних повідомлень вимкнено:
channels.discord.dmPolicy="disabled"(застаріле:channels.discord.dm.policy) - очікується схвалення сполучення в режимі
pairing
Цикли між ботами
Стандартно повідомлення, надіслані ботами, ігноруються.
Якщо встановити channels.discord.allowBots=true, використовуйте суворі правила згадок і списків дозволених, щоб уникнути циклічної поведінки.
Надавайте перевагу channels.discord.allowBots="mentions", щоб приймати лише повідомлення ботів, які згадують цього бота.
OpenClaw також постачається зі спільним захистом від циклів ботів. Щоразу, коли allowBots дозволяє повідомленням ботів потрапити до диспетчеризації, Discord зіставляє вхідну подію з даними (обліковий запис, канал, пара ботів), а загальний захист пари блокує її після перевищення налаштованого бюджету подій. Захист запобігає неконтрольованим циклам між двома ботами, які раніше доводилося зупиняти обмеженнями частоти Discord; він не впливає на розгортання з одним ботом або одноразові відповіді ботів, які не перевищують бюджет.
Стандартні налаштування (активні, коли встановлено allowBots):
maxEventsPerWindow: 20-- пара ботів може обмінятися 20 повідомленнями в межах ковзного вікнаwindowSeconds: 60-- тривалість ковзного вікнаcooldownSeconds: 60-- після вичерпання бюджету кожне наступне повідомлення між ботами в будь-якому напрямку відкидається протягом однієї хвилини
Один раз налаштуйте спільні стандартні значення в channels.defaults.botLoopProtection, а потім перевизначте їх для Discord, якщо легітимному робочому процесу потрібен більший запас. Порядок пріоритету:
channels.discord.accounts.<account>.botLoopProtectionchannels.discord.botLoopProtectionchannels.defaults.botLoopProtection- вбудовані стандартні значення
Discord використовує загальні ключі maxEventsPerWindow, windowSeconds і cooldownSeconds.
{channels: {defaults: { botLoopProtection: { maxEventsPerWindow: 20, windowSeconds: 60, cooldownSeconds: 60, },},discord: { // Optional Discord-wide override. Account blocks override individual // fields and inherit omitted fields from here. botLoopProtection: { maxEventsPerWindow: 4, }, accounts: { alpha: { // Alpha listens to other bots only when they mention it. allowBots: "mentions", }, bravo: { // Bravo listens to all bot-authored Discord messages. allowBots: true, mentionAliases: { // Lets Bravo write an Alpha Discord mention with the configured user id. Alpha: "ALPHA_DISCORD_USER_ID", }, botLoopProtection: { // Allow up to five messages per minute before suppressing the pair. maxEventsPerWindow: 5, windowSeconds: 60, cooldownSeconds: 90, }, }, },},},}Втрата голосового STT через DecryptionFailed(...)
- підтримуйте OpenClaw в актуальному стані (
openclaw update), щоб була доступна логіка відновлення приймання голосу Discord - переконайтеся, що
channels.discord.voice.daveEncryption=true(стандартне значення) - почніть із
channels.discord.voice.decryptionFailureTolerance=24(стандартне значення в основному проєкті) і коригуйте лише за потреби - відстежуйте в журналах:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- якщо збої тривають після автоматичного повторного приєднання, зберіть журнали та порівняйте їх з історією приймання DAVE в основному проєкті: discord.js #11419 і discord.js #11449
Довідник із конфігурації
Основний довідник: Довідник із конфігурації — Discord.
Найважливіші поля Discord
- запуск/автентифікація:
enabled,token,applicationId,accounts.*,allowBots - політика:
groupPolicy,dmPolicy,allowFrom,dm.*,guilds.*,guilds.*.channels.* - команди:
commands.native,commands.useAccessGroups(глобальне),configWrites,slashCommand.ephemeral - черга подій:
eventQueue.listenerTimeout(бюджет слухача, стандартно120000),eventQueue.maxQueueSize(стандартно10000),eventQueue.maxConcurrency(стандартно50) - Gateway:
proxy,gatewayInfoTimeoutMs,gatewayReadyTimeoutMs,gatewayRuntimeReadyTimeoutMs - відповіді/історія:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - доставлення:
textChunkLimit(стандартно2000),maxLinesPerMessage(стандартно17) - потокове передавання:
streaming.mode,streaming.chunkMode,streaming.preview.*,streaming.progress.*,streaming.block.*(застарілі пласкі ключіstreamMode,draftChunk,blockStreaming,blockStreamingCoalesce,chunkModeпереносяться доstreaming.*командоюopenclaw doctor --fix) - медіа/повторні спроби:
mediaMaxMb(обмежує вихідні завантаження до Discord, стандартно100),retry - дії:
actions.* - присутність:
activity,status,activityType,activityUrl,autoPresence.* - інтерфейс:
ui.components.accentColor - функції:
threadBindings, верхньорівневийbindings[](type: "acp"),pluralkit,execApprovals,intents,agentComponents.enabled,agentComponents.ttlMs,heartbeat,responsePrefix
Безпека та експлуатація
- Вважайте токени ботів секретами (у керованих середовищах рекомендовано
DISCORD_BOT_TOKEN). - Надавайте Discord дозволи за принципом найменших привілеїв.
- Якщо розгортання або стан команд застаріли, перезапустіть Gateway і повторно перевірте за допомогою
openclaw channels status --probe.
Пов’язані матеріали
Сполучіть користувача Discord із Gateway.
Поведінка групових чатів і списків дозволених.
Маршрутизуйте вхідні повідомлення до агентів.
Модель загроз і посилення захисту.
Зіставляйте сервери й канали з агентами.
Поведінка нативних команд.