Skip to main content
OpenClaw підключається до Discord як бот через офіційний Gateway Discord. Підтримуються особисті повідомлення та канали серверів.

Сполучення

Особисті повідомлення Discord за замовчуванням використовують режим сполучення.

Команди з косою рискою

Поведінка вбудованих команд і каталог команд.

Усунення несправностей каналів

Міжканальна діагностика та процес виправлення.

Швидке налаштування

Створіть застосунок Discord із ботом, додайте бота на свій сервер і сполучіть його з OpenClaw. Якщо можливо, використовуйте приватний сервер; за потреби спочатку створіть його (Create My Own > For me and my friends).
1

Створіть застосунок і бота Discord

На порталі розробників Discord натисніть New Application і вкажіть назву (наприклад, «OpenClaw»).Відкрийте Bot на бічній панелі та задайте для Username ім’я свого агента.
2

Увімкніть привілейовані наміри

Залишаючись на сторінці Bot, у розділі Privileged Gateway Intents увімкніть:
  • Message Content Intent (обов’язково)
  • Server Members Intent (рекомендовано; обов’язково для списків дозволених ролей, зіставлення імен з ідентифікаторами та груп доступу до аудиторії каналу)
  • Presence Intent (необов’язково; лише для оновлень присутності)
3

Скопіюйте токен бота

На сторінці Bot натисніть Reset Token і скопіюйте токен.
Попри назву, ця дія створює ваш перший токен — нічого не «скидається».
4

Створіть URL-адресу запрошення та додайте бота на свій сервер

Відкрийте OAuth2 на бічній панелі. У розділі OAuth2 URL Generator увімкніть області доступу:
  • bot
  • applications.commands
У розділі Bot Permissions, що з’явиться, увімкніть щонайменше:Загальні дозволи
  • Перегляд каналів
Дозволи для тексту
  • Надсилання повідомлень
  • Читання історії повідомлень
  • Вбудовування посилань
  • Прикріплення файлів
  • Додавання реакцій (необов’язково)
Це базовий набір для звичайних текстових каналів. Якщо бот публікуватиме повідомлення в гілках, зокрема в робочих процесах форумів або медіаканалів, які створюють чи продовжують гілку, також увімкніть Send Messages in Threads.Скопіюйте створену URL-адресу, відкрийте її в браузері, виберіть свій сервер і натисніть Continue. Тепер бот має з’явитися на вашому сервері.
5

Увімкніть режим розробника та зберіть свої ідентифікатори

У застосунку Discord увімкніть режим розробника, щоб мати змогу копіювати ідентифікатори:
  1. User Settings (піктограма шестерні) → Developer → увімкніть Developer Mode (на мобільному пристрої: App SettingsAdvanced)
  2. Клацніть правою кнопкою миші піктограму сервераCopy Server ID
  3. Клацніть правою кнопкою миші власний аватарCopy User ID
Збережіть ідентифікатор сервера та ідентифікатор користувача разом із токеном бота; на наступному кроці знадобляться всі три значення.
6

Дозвольте особисті повідомлення від учасників сервера

Щоб сполучення працювало, Discord має дозволяти боту надсилати вам особисті повідомлення. Клацніть правою кнопкою миші піктограму сервераPrivacy Settings → увімкніть Direct Messages.Не вимикайте цей параметр, якщо використовуєте особисті повідомлення Discord з OpenClaw. Якщо ви використовуєте лише канали сервера, його можна вимкнути після сполучення.
7

Безпечно задайте токен бота (не надсилайте його в чаті)

Токен бота є секретом. Задайте його на комп’ютері, де працює OpenClaw, перш ніж надсилати повідомлення агенту:
Якщо 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 для кожного бота.
8

Налаштуйте OpenClaw і виконайте сполучення

Поспілкуйтеся зі своїм агентом OpenClaw у наявному каналі (наприклад, Telegram) і повідомте йому потрібні дані. Якщо Discord — ваш перший канал, натомість скористайтеся вкладкою CLI / конфігурації.
«Я вже задав токен свого бота Discord у конфігурації. Заверши налаштування Discord з ідентифікатором користувача <user_id> та ідентифікатором сервера <server_id>».
9

Підтвердьте перше сполучення через особисті повідомлення

Після запуску Gateway надішліть боту особисте повідомлення в Discord. Він відповість кодом сполучення.
Надішліть код сполучення своєму агенту в наявному каналі:
«Підтвердь цей код сполучення Discord: <CODE>»
Термін дії кодів сполучення становить 1 годину. Після підтвердження спілкуйтеся зі своїм агентом в особистих повідомленнях Discord.
Розпізнавання токенів враховує обліковий запис. Значення токена з конфігурації мають пріоритет над резервним значенням зі змінної середовища, а DISCORD_BOT_TOKEN використовується лише для облікового запису за замовчуванням. Якщо для двох увімкнених облікових записів Discord розпізнано однаковий токен бота, OpenClaw запускає лише один монітор Gateway для цього токена: токен із конфігурації має пріоритет над резервним значенням зі змінної середовища; в інших випадках пріоритет має перший увімкнений обліковий запис, а дубльований обліковий запис позначається як вимкнений із причиною duplicate bot token. Для розширених вихідних викликів (інструмент повідомлень/дії каналу) явно заданий для кожного виклику token використовується саме для цього виклику. Це стосується дій надсилання, читання та перевірки (читання/пошук/отримання/гілки/закріплені повідомлення/дозволи). Політика облікового запису та параметри повторних спроб усе одно беруться з вибраного облікового запису в активному знімку середовища виконання.

Рекомендовано: налаштуйте робочий простір сервера

Коли особисті повідомлення запрацюють, можна перетворити сервер на повноцінний робочий простір, де кожен канал матиме окремий сеанс агента з власним контекстом. Рекомендовано для приватних серверів, де є лише ви та ваш бот.
1

Додайте свій сервер до списку дозволених серверів

Це дає агенту змогу відповідати в будь-якому каналі вашого сервера, а не лише в особистих повідомленнях.
«Додай ідентифікатор мого сервера Discord <server_id> до списку дозволених серверів»
2

Дозвольте відповіді без @згадки

За замовчуванням агент відповідає в каналах сервера лише тоді, коли його @згадують. На приватному сервері ви, імовірно, захочете, щоб він відповідав на кожне повідомлення.У каналах сервера звичайні відповіді за замовчуванням публікуються автоматично. Для спільних кімнат, що завжди активні, увімкніть messages.groupChat.visibleReplies: "message_tool", щоб агент міг непомітно стежити за розмовою та публікувати повідомлення лише тоді, коли вважатиме відповідь у каналі корисною. Це найкраще працює з моделями останнього покоління, які надійно використовують інструменти, як-от GPT-5.6 Sol. Фонові події кімнати не спричиняють повідомлень, якщо їх не надсилає інструмент. Повну конфігурацію режиму непомітного спостереження див. у розділі Фонові події кімнати.Якщо Discord показує індикатор набору тексту, а журнали — використання токенів, але повідомлення не публікується, перевірте, чи хід налаштовано як фонову подію кімнати або чи ввімкнено видимі відповіді через інструмент повідомлень.
«Дозволь моєму агенту відповідати на цьому сервері без необхідності @згадки»
3

Сплануйте використання пам’яті в каналах сервера

Довгострокова пам’ять (MEMORY.md) автоматично завантажується лише в сеансах особистих повідомлень; канали сервера її не завантажують.
«Коли я ставлю запитання в каналах Discord, використовуй memory_search або memory_get, якщо тобі потрібен довгостроковий контекст із 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 для форумних каналів.
Надішліть повідомлення до батьківського форуму, щоб створити гілку:
Створіть форумну гілку явно:
Батьківські форуми не приймають компоненти 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 автоматично додає кнопку запуску
Приклад:

Керування доступом і маршрутизація

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 для особистих повідомлень облікового запису, для сумісності обробляються як цілі особистих повідомлень користувачів.

Маршрутизація агентів на основі ролей

Використовуйте bindings[].match.roles, щоб спрямовувати учасників гільдії Discord до різних агентів за ідентифікатором ролі. Прив’язки на основі ролей приймають лише ідентифікатори ролей і оцінюються після прив’язок за співрозмовником або батьківським співрозмовником, але перед прив’язками лише за гільдією. Якщо прив’язка також задає інші поля відповідності (наприклад, peer + guildId + roles), мають збігатися всі налаштовані поля.

Вбудовані команди та авторизація команд

  • commands.native за замовчуванням має значення "auto" та ввімкнено для Discord.
  • Перевизначення для окремого каналу: channels.discord.commands.native.
  • commands.native=false пропускає реєстрацію та очищення слеш-команд Discord під час запуску. Раніше зареєстровані команди можуть залишатися видимими в Discord, доки ви не видалите їх із застосунку Discord.
  • Авторизація нативних команд використовує ті самі списки дозволених користувачів і політики Discord, що й звичайна обробка повідомлень.
  • Команди можуть залишатися видимими в інтерфейсі Discord для неавторизованих користувачів; під час виконання застосовується авторизація OpenClaw і надсилається відповідь «не авторизовано».
  • Налаштування слеш-команд за замовчуванням: ephemeral: true (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.accounts.<id>.suppressEmbeds, щоб перевизначити налаштування для одного облікового запису. Під час надсилання через інструмент повідомлень агент також може передати suppressEmbeds: false для окремого повідомлення. Явні корисні навантаження Discord embeds не приховуються налаштуванням попереднього перегляду посилань за замовчуванням.
OpenClaw може потоково передавати чернетки відповідей, надсилаючи тимчасове повідомлення та редагуючи його в міру надходження тексту. channels.discord.streaming.mode приймає off | partial | block | progress (значення за замовчуванням, якщо ключ streaming або застарілий ключ streamMode не задано). streamMode — застарілий псевдонім; запустіть openclaw doctor --fix, щоб перезаписати збережену конфігурацію в канонічну вкладену структуру streaming.
  • 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.historyLimit за замовчуванням — 20
  • резервне значення: messages.groupChat.historyLimit
  • 0 вимикає
Керування історією приватних повідомлень:
  • channels.discord.dmHistoryLimit
  • channels.discord.dms["<user_id>"].historyLimit
Поведінка гілок:
  • Гілки Discord маршрутизуються як сеанси каналів і успадковують конфігурацію батьківського каналу, якщо її не перевизначено.
  • Сеанси гілок успадковують вибір /model на рівні сеансу батьківського каналу лише як резервний варіант моделі; локальний вибір /model у гілці має вищий пріоритет, а історія стенограми батьківського каналу не копіюється, якщо не ввімкнено успадкування стенограми.
  • channels.discord.thread.inheritParent (за замовчуванням false) вмикає початкове заповнення нових автоматичних гілок із батьківської стенограми. Перевизначення для окремого облікового запису: channels.discord.accounts.<id>.thread.inheritParent.
  • Реакції інструмента повідомлень можуть визначати цілі приватних повідомлень user:<id>.
  • guilds.<guild>.channels.<channel>.requireMention: false зберігається під час резервної активації на етапі відповіді.
Теми каналів додаються як ненадійний контекст. Списки дозволених користувачів визначають, хто може активувати агента, але не є повною межею редагування додаткового контексту.
Discord може прив’язати гілку до цільового сеансу, щоб наступні повідомлення в цій гілці й надалі маршрутизувалися до того самого сеансу, зокрема до сеансів підагентів.Команди:
  • /focus <target> прив’язує поточну або нову гілку до цілі підагента чи сеансу
  • /unfocus видаляє прив’язку поточної гілки
  • /agents показує активні запуски та стан прив’язки
  • /session idle <duration|off> переглядає або оновлює автоматичне зняття фокуса через неактивність для сфокусованих прив’язок
  • /session max-age <duration|off> переглядає або оновлює жорсткий максимальний вік сфокусованих прив’язок
Конфігурація:
Примітки:
  • session.threadBindings.* задає глобальні значення за замовчуванням; channels.discord.threadBindings.* перевизначає поведінку Discord.
  • spawnSessions керує автоматичним створенням і прив’язуванням гілок для sessions_spawn({ thread: true }) і створення гілок ACP. Значення за замовчуванням: true.
  • defaultSpawnContext керує нативним контекстом підагента для запусків, прив’язаних до гілок. Значення за замовчуванням: "fork".
  • Застарілі ключі spawnSubagentSessions/spawnAcpSessions мігруються командою openclaw doctor --fix.
  • Якщо прив’язки гілок вимкнено для облікового запису, /focus і пов’язані операції прив’язування гілок недоступні.
Див. Підагенти, Агенти ACP і Довідник із конфігурації.
Для стабільних, постійно активних робочих просторів ACP налаштуйте типізовані прив’язки ACP верхнього рівня, націлені на розмови Discord.Шлях конфігурації: bindings[] із type: "acp" і match.channel: "discord".
Примітки:
  • /acp spawn codex --bind here прив’язує поточний канал або гілку безпосередньо та залишає майбутні повідомлення в тому самому сеансі ACP. Повідомлення гілки успадковують прив’язку батьківського каналу.
  • У прив’язаному каналі або гілці /new і /reset скидають той самий сеанс ACP без зміни прив’язки. Тимчасові прив’язки гілок можуть перевизначати визначення цілі, доки вони активні.
  • spawnSessions регулює створення й прив’язування дочірніх гілок через --thread auto|here.
Докладніше про поведінку прив’язок див. у розділі Агенти ACP.
Режим сповіщень про реакції для окремого сервера (guilds.<id>.reactionNotifications):
  • off
  • own (за замовчуванням)
  • all
  • allowlist (використовує guilds.<id>.users)
Події реакцій перетворюються на системні події та додаються до маршрутизованого сеансу Discord.
ackReaction надсилає емодзі-підтвердження, поки OpenClaw обробляє вхідне повідомлення.Порядок визначення:
  • channels.discord.accounts.<accountId>.ackReaction
  • channels.discord.ackReaction
  • messages.ackReaction
  • резервний емодзі ідентичності агента (agents.list[].identity.emoji, інакше ”👀”)
Примітки:
  • Discord приймає емодзі Unicode або назви власних емодзі.
  • Використовуйте "", щоб вимкнути реакцію для каналу або облікового запису.
Область дії (messages.ackReactionScope):Значення: "all" (приватні повідомлення + групи, включно з фоновими подіями кімнат), "direct" (лише приватні повідомлення), "group-all" (усі групові повідомлення, крім фонових подій кімнат, без приватних повідомлень), "group-mentions" (групи, коли згадано бота; без приватних повідомлень, значення за замовчуванням), "off" / "none" (вимкнено).
Область дії за замовчуванням ("group-mentions") не надсилає реакції-підтвердження в приватних повідомленнях або для фонових подій кімнат. Щоб отримувати реакцію-підтвердження для вхідних приватних повідомлень Discord і подій у тихих кімнатах, установіть для messages.ackReactionScope значення "all".
Запис конфігурації, ініційований каналом, увімкнено за замовчуванням. Це впливає на сценарії /config set|unset, коли функції команд увімкнено.Щоб вимкнути:
Спрямовуйте WebSocket-трафік шлюзу Discord і початкові REST-запити під час запуску (ідентифікатор застосунку + визначення списку дозволених користувачів) через HTTP(S)-проксі за допомогою channels.discord.proxy. Проксіювання WebSocket шлюзу Discord налаштовується явно; WebSocket-з’єднання не успадковують змінні середовища проксі з процесу Gateway. Початкові REST-запити використовують цей проксі, коли налаштовано channels.discord.proxy.
Перевизначення для окремого облікового запису:
Увімкніть визначення PluralKit, щоб зіставляти проксійовані повідомлення з ідентичністю учасника системи:
Примітки:
  • у списках дозволених значень можна використовувати pk:<memberId>
  • відображувані імена учасників зіставляються за іменем/slug лише тоді, коли встановлено channels.discord.dangerouslyAllowNameMatching: true
  • пошук надсилає запит до API PluralKit з початковим ідентифікатором повідомлення
  • якщо пошук завершується невдало, проксійовані повідомлення вважаються повідомленнями ботів і відкидаються, якщо allowBots не дозволяє їх пропускати
Використовуйте mentionAliases, коли агентам потрібні детерміновані вихідні згадки відомих користувачів Discord. Ключі — це ідентифікатори без початкового символу @; значення — ідентифікатори користувачів Discord. Невідомі ідентифікатори, @everyone, @here і згадки всередині фрагментів коду Markdown залишаються без змін.
Оновлення присутності застосовуються, коли ви задаєте поле стану чи активності або вмикаєте автоматичну присутність.Лише стан:
Активність (власний стан є стандартним типом активності, коли задано activity):
Потокова трансляція:
Відповідність типів активності:
  • 0: Грає
  • 1: Транслює (потребує activityUrl; водночас activityUrl потребує activityType: 1)
  • 2: Слухає
  • 3: Дивиться
  • 4: Власний (використовує текст активності як стан; емодзі необов’язковий)
  • 5: Змагається
Автоматична присутність (сигнал працездатності середовища виконання):
Автоматична присутність зіставляє доступність середовища виконання зі станом Discord: справне => онлайн, погіршене або невідоме => неактивний, вичерпане або недоступне => не турбувати. Стандартні значення: intervalMs 30000, minUpdateIntervalMs 15000 (має бути меншим або дорівнювати intervalMs). Необов’язкові перевизначення тексту:
  • autoPresence.healthyText
  • autoPresence.degradedText
  • autoPresence.exhaustedText (підтримує заповнювач {reason})
Discord підтримує обробку схвалень за допомогою кнопок у приватних повідомленнях і за бажанням може публікувати запити на схвалення у вихідному каналі.Шлях конфігурації:
  • channels.discord.execApprovals.enabled
  • channels.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.*. Стандартна поведінка обмежень:

Інтерфейс компонентів v2

OpenClaw використовує компоненти Discord v2 для схвалень виконання та маркерів між контекстами. Дії з повідомленнями Discord також можуть приймати components для власного інтерфейсу (розширене використання; потребує створення корисного навантаження компонента через інструмент Discord), тоді як застарілі embeds залишаються доступними, але не рекомендовані.
  • channels.discord.ui.components.accentColor задає колір акценту, який використовують контейнери компонентів Discord (шістнадцятковий код). Для окремого облікового запису: channels.discord.accounts.<id>.ui.components.accentColor.
  • channels.discord.agentComponents.ttlMs визначає, як довго зворотні виклики надісланих компонентів Discord залишаються зареєстрованими (стандартно 1800000, максимум 86400000). Для окремого облікового запису: channels.discord.accounts.<id>.agentComponents.ttlMs.
  • embeds ігноруються, коли присутні компоненти v2.
  • Попередній перегляд звичайних URL стандартно приховано. Установіть suppressEmbeds: false у дії з повідомленням, якщо одне вихідне посилання має розгортатися.
Приклад:

Голос

Discord має дві окремі голосові поверхні: голосові канали в реальному часі (безперервні розмови) та вкладення голосових повідомлень (формат попереднього перегляду у вигляді звукової хвилі). Gateway підтримує обидві.

Голосові канали

Контрольний список налаштування:
  1. Увімкніть Message Content Intent у Discord Developer Portal.
  2. Увімкніть Server Members Intent, коли використовуються списки дозволених ролей/користувачів.
  3. Запросіть бота з областями доступу bot і applications.commands.
  4. Надайте дозволи Connect, Speak, Send Messages і Read Message History у цільовому голосовому каналі.
  5. Увімкніть нативні команди (commands.native або channels.discord.commands.native).
  6. Налаштуйте channels.discord.voice.
Використовуйте /vc join|leave|status для керування сеансами. Команда використовує стандартного агента облікового запису та дотримується тих самих правил списку дозволених значень і групової політики, що й інші команди Discord.
Щоб перевірити фактичні дозволи бота перед приєднанням:
Приклад автоматичного приєднання:
Примітки:
  • Голосові функції Discord є опціональними для конфігурацій лише з текстовим режимом; установіть channels.discord.voice.enabled=true (або збережіть наявний блок channels.discord.voice), щоб увімкнути команди /vc, голосове середовище виконання та намір Gateway GuildVoiceStates. 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-tts STT використовує tools.media.audio; voice.model не впливає на транскрибування.
  • У режимах реального часу voice.realtime.provider, voice.realtime.model і voice.realtime.speakerVoice налаштовують аудіосеанс реального часу. Для OpenAI Realtime 2.1 разом з інтелектом Codex використовуйте voice.realtime.model: "gpt-realtime-2.1" і voice.model: "openai/gpt-5.6-sol".
  • Режими голосової взаємодії в реальному часі типово включають невеликі файли профілю IDENTITY.md, USER.md і SOUL.md до інструкцій постачальника реального часу, щоб швидкі прямі репліки зберігали ту саму ідентичність, прив’язку до користувача та особистість, що й спрямований агент OpenClaw. Установіть voice.realtime.bootstrapContextFiles у потрібну підмножину, щоб налаштувати це, або [], щоб вимкнути. Підтримуються лише ці файли профілю; AGENTS.md залишається у звичайному контексті агента. Доданий контекст профілю не замінює openclaw_agent_consult для роботи з робочим простором, актуальними фактами, пошуком у пам’яті чи діями на основі інструментів.
  • У режимі реального часу OpenAI agent-proxy установіть voice.realtime.requireWakeName: true, щоб голосовий компонент реального часу 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.
Поведінка:
  • 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; провайдери з підтримкою потокового передавання подають звук безпосередньо до програвача, інакше отриманий аудіофайл відтворюється в каналі, до якого приєднано бота.
Приклад стандартного сеансу голосового каналу з проксі агента:
Без блоку voice.agentSession кожен голосовий канал отримує власний маршрутизований сеанс OpenClaw. Наприклад, /vc join channel:234567890123456789 звертається до сеансу цього голосового каналу Discord. Модель реального часу є лише голосовим інтерфейсом; змістовні запити передаються налаштованому агенту OpenClaw. Якщо модель реального часу створює остаточний транскрипт без виклику інструмента консультування, OpenClaw примусово виконує консультацію як резервний варіант, щоб стандартна поведінка й надалі відповідала розмові з агентом. Приклад застарілого режиму STT із TTS:
Приклад двонапрямного режиму реального часу:
Голос як розширення наявного сеансу каналу Discord:
У режимі agent-proxy бот приєднується до налаштованого голосового каналу, але звернення агента OpenClaw використовують звичайний маршрутизований сеанс і агента цільового каналу. Голосовий сеанс реального часу озвучує повернутий результат у голосовому каналі. Агент-керівник і надалі може використовувати звичайні інструменти повідомлень відповідно до своєї політики інструментів, зокрема надсилати окреме повідомлення Discord, якщо це доречна дія. Поки делегований запуск OpenClaw активний, нові голосові транскрипти Discord обробляються як оперативне керування запуском до початку наступного звернення агента. Фрази на кшталт «стан», «скасуй це», «скористайся меншим виправленням» або «коли завершиш, також перевір тести» класифікуються як запит стану, скасування, коригування або подальші вхідні дані для активного сеансу. Результати запиту стану, скасування, прийнятого коригування та подальших дій озвучуються в голосовому каналі, щоб користувач знав, чи OpenClaw опрацював запит. Корисні форми цілі:
  • target: "channel:123456789012345678" маршрутизує через сеанс текстового каналу Discord.
  • target: "123456789012345678" обробляється як цільовий канал.
  • target: "dm:123456789012345678" або target: "user:123456789012345678" маршрутизує через відповідний сеанс особистих повідомлень.
Приклад OpenAI Realtime для середовища із сильним відлунням:
Використовуйте це, коли модель чує власне відтворення 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
Щоб налагодити обривання звуку, читайте журнали голосового режиму реального часу як хронологію:
  1. realtime audio playback started означає, що Discord почав відтворювати звук асистента. Від цього моменту міст починає підраховувати фрагменти вихідного звуку асистента, байти PCM Discord, байти провайдера реального часу та тривалість синтезованого звуку.
  2. realtime speaker turn opened позначає активізацію мовця в Discord. Якщо відтворення вже активне й bargeIn увімкнено, далі може з’явитися barge-in detected source=speaker-start.
  3. realtime input audio started позначає перший фактичний аудіокадр, отриманий для цієї репліки мовця. outputActive=true або ненульове значення outputAudioMs тут означає, що мікрофон надсилає вхідний звук, поки відтворення відповіді асистента ще активне.
  4. barge-in detected source=active-speaker-audio означає, що OpenClaw виявив живий звук мовця під час активного відтворення відповіді асистента. Це допомагає відрізнити справжнє переривання від події початку мовлення в Discord без корисного звуку.
  5. barge-in requested reason=... означає, що OpenClaw попросив провайдера реального часу скасувати або обрізати активну відповідь. Запис містить outputAudioMs, outputActive і playbackChunks, щоб можна було побачити, скільки звуку асистента фактично відтворилося до переривання.
  6. realtime audio playback stopped reason=... є точкою локального скидання відтворення Discord. Причина вказує, що саме зупинило відтворення: barge-in, player-idle, provider-clear-audio, forced-agent-consult, stream-close або session-close.
  7. realtime speaker turn closed підсумовує захоплену вхідну репліку. chunks=0 або hasAudio=false означає, що репліка мовця почалася, але до мосту реального часу не надійшло придатного звуку. interruptedPlayback=true означає, що ця вхідна репліка збіглася в часі з вихідним звуком асистента й запустила логіку переривання голосом.
Корисні поля:
  • outputAudioMs: тривалість звуку асистента, створеного провайдером реального часу до цього запису журналу.
  • audioMs: тривалість звуку асистента, яку OpenClaw підрахував до зупинення відтворення.
  • elapsedMs: фактичний час між відкриттям і закриттям потоку відтворення або репліки мовця.
  • discordBytes: байти стереофонічного 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 Content Intent
  • увімкніть Server Members Intent, якщо вам потрібне визначення користчів/учасників
  • перезапустіть Gateway після зміни intents
  • перевірте groupPolicy
  • перевірте список дозволених серверів у channels.discord.guilds
  • якщо існує мапа channels сервера, дозволено лише перелічені канали
  • перевірте поведінку requireMention і шаблони згадок
Корисні перевірки:
Поширені причини:
  • groupPolicy="allowlist" без відповідного списку дозволених серверів/каналів
  • requireMention налаштовано не в тому місці (має бути в channels.discord.guilds або в записі каналу)
  • відправника заблоковано списком дозволених users сервера/каналу
Типові журнали:
  • 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 зберігають порядок у межах сеансу, доки життєвий цикл сеансу, інструмента або середовища виконання не завершить чи не перерве роботу.
Перед підключенням OpenClaw отримує метадані Discord /gateway/bot. У разі тимчасових збоїв використовується стандартна URL-адреса Gateway Discord, а частота записів у журналах обмежується.Параметри тайм-ауту метаданих:
  • один обліковий запис: channels.discord.gatewayInfoTimeoutMs
  • кілька облікових записів: channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs
  • резервна змінна середовища, коли конфігурацію не задано: OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS
  • стандартне значення: 30000 (30 секунд), максимум: 120000
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>.botLoopProtection
  • channels.discord.botLoopProtection
  • channels.defaults.botLoopProtection
  • вбудовані стандартні значення
Discord використовує загальні ключі maxEventsPerWindow, windowSeconds і cooldownSeconds.
  • підтримуйте OpenClaw в актуальному стані (openclaw update), щоб була доступна логіка відновлення приймання голосу Discord
  • переконайтеся, що channels.discord.voice.daveEncryption=true (стандартне значення)
  • почніть із channels.discord.voice.decryptionFailureTolerance=24 (стандартне значення в основному проєкті) і коригуйте лише за потреби
  • відстежуйте в журналах:
    • discord voice: DAVE decrypt failures detected
    • discord voice: repeated decrypt failures; attempting rejoin
  • якщо збої тривають після автоматичного повторного приєднання, зберіть журнали та порівняйте їх з історією приймання DAVE в основному проєкті: discord.js #11419 і discord.js #11449

Довідник із конфігурації

Основний довідник: Довідник із конфігурації — 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.

Групи

Поведінка групових чатів і списків дозволених.

Маршрутизація каналів

Маршрутизуйте вхідні повідомлення до агентів.

Безпека

Модель загроз і посилення захисту.

Маршрутизація між кількома агентами

Зіставляйте сервери й канали з агентами.

Команди з косою рискою

Поведінка нативних команд.