Сполучення
Команди з косою рискою
Усунення несправностей каналів
Швидке налаштування
Створіть застосунок Discord із ботом, додайте бота на свій сервер і сполучіть його з OpenClaw. Якщо можливо, використовуйте приватний сервер; за потреби спочатку створіть його (Create My Own > For me and my friends).Створіть застосунок і бота Discord
Увімкніть привілейовані наміри
- Message Content Intent (обов’язково)
- Server Members Intent (рекомендовано; обов’язково для списків дозволених ролей, зіставлення імен з ідентифікаторами та груп доступу до аудиторії каналу)
- Presence Intent (необов’язково; лише для оновлень присутності)
Скопіюйте токен бота
Створіть URL-адресу запрошення та додайте бота на свій сервер
botapplications.commands
- Перегляд каналів
- Надсилання повідомлень
- Читання історії повідомлень
- Вбудовування посилань
- Прикріплення файлів
- Додавання реакцій (необов’язково)
Увімкніть режим розробника та зберіть свої ідентифікатори
- User Settings (піктограма шестерні) → Developer → увімкніть Developer Mode (на мобільному пристрої: App Settings → Advanced)
- Клацніть правою кнопкою миші піктограму сервера → Copy Server ID
- Клацніть правою кнопкою миші власний аватар → Copy User ID
Дозвольте особисті повідомлення від учасників сервера
Безпечно задайте токен бота (не надсилайте його в чаті)
openclaw gateway run.
Для керованих інсталяцій служби виконайте openclaw gateway install в оболонці, де задано DISCORD_BOT_TOKEN, або збережіть змінну у ~/.openclaw/.env, щоб служба могла розпізнати env SecretRef після перезапуску.
Якщо ваш хост заблокований або обмежений за частотою запитів під час початкового пошуку застосунку Discord, задайте ідентифікатор застосунку/клієнта з порталу розробників, щоб під час запуску можна було пропустити цей виклик REST: channels.discord.applicationId для облікового запису за замовчуванням або channels.discord.accounts.<accountId>.applicationId для кожного бота.Налаштуйте OpenClaw і виконайте сполучення
- Попросіть свого агента
- CLI / конфігурація
«Я вже задав токен свого бота Discord у конфігурації. Заверши налаштування Discord з ідентифікатором користувача<user_id>та ідентифікатором сервера<server_id>».
Підтвердьте перше сполучення через особисті повідомлення
- Попросіть свого агента
- CLI
«Підтвердь цей код сполучення Discord: <CODE>»
DISCORD_BOT_TOKEN використовується лише для облікового запису за замовчуванням.
Якщо для двох увімкнених облікових записів Discord розпізнано однаковий токен бота, OpenClaw запускає лише один монітор Gateway для цього токена: токен із конфігурації має пріоритет над резервним значенням зі змінної середовища; в інших випадках пріоритет має перший увімкнений обліковий запис, а дубльований обліковий запис позначається як вимкнений із причиною duplicate bot token.
Для розширених вихідних викликів (інструмент повідомлень/дії каналу) явно заданий для кожного виклику token використовується саме для цього виклику. Це стосується дій надсилання, читання та перевірки (читання/пошук/отримання/гілки/закріплені повідомлення/дозволи). Політика облікового запису та параметри повторних спроб усе одно беруться з вибраного облікового запису в активному знімку середовища виконання.Рекомендовано: налаштуйте робочий простір сервера
Коли особисті повідомлення запрацюють, можна перетворити сервер на повноцінний робочий простір, де кожен канал матиме окремий сеанс агента з власним контекстом. Рекомендовано для приватних серверів, де є лише ви та ваш бот.Додайте свій сервер до списку дозволених серверів
- Попросіть свого агента
- Конфігурація
«Додай ідентифікатор мого сервера Discord <server_id> до списку дозволених серверів»
Дозвольте відповіді без @згадки
messages.groupChat.visibleReplies: "message_tool", щоб агент міг непомітно стежити за розмовою та публікувати повідомлення лише тоді, коли вважатиме відповідь у каналі корисною. Це найкраще працює з моделями останнього покоління, які надійно використовують інструменти, як-от GPT-5.6 Sol. Фонові події кімнати не спричиняють повідомлень, якщо їх не надсилає інструмент. Повну конфігурацію режиму непомітного спостереження див. у розділі Фонові події кімнати.Якщо Discord показує індикатор набору тексту, а журнали — використання токенів, але повідомлення не публікується, перевірте, чи хід налаштовано як фонову подію кімнати або чи ввімкнено видимі відповіді через інструмент повідомлень.- Попросіть свого агента
- Конфігурація
«Дозволь моєму агенту відповідати на цьому сервері без необхідності @згадки»
Сплануйте використання пам’яті в каналах сервера
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для форумних каналів.
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).
Відомості про функції
Теги відповідей і нативні відповіді
Теги відповідей і нативні відповіді
[[reply_to_current]][[reply_to:<id>]]
channels.discord.replyToMode:off(за замовчуванням): без неявного групування відповідей у гілки; явні теги[[reply_to_*]]усе одно враховуютьсяfirst: додає неявне нативне посилання на відповідь до першого вихідного повідомлення Discord у межах ходуall: додає його до кожного вихідного повідомленняbatched: додає його лише тоді, коли вхідна подія була пакетом із кількох повідомлень, об’єднаних після затримки, — корисно, якщо нативні відповіді потрібні переважно для неоднозначних чатів зі сплесками активності, а не для кожного ходу з одним повідомленням
Попередній перегляд посилань
Попередній перегляд посилань
channels.discord.accounts.<id>.suppressEmbeds, щоб перевизначити налаштування для одного облікового запису. Під час надсилання через інструмент повідомлень агент також може передати suppressEmbeds: false для окремого повідомлення. Явні корисні навантаження Discord embeds не приховуються налаштуванням попереднього перегляду посилань за замовчуванням.Попередній перегляд потокової відповіді наживо
Попередній перегляд потокової відповіді наживо
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.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зберігається під час резервної активації на етапі відповіді.
Сеанси підагентів, прив'язані до гілок
Сеанси підагентів, прив'язані до гілок
/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
bindings[] із type: "acp" і match.channel: "discord"./acp spawn codex --bind hereприв’язує поточний канал або гілку безпосередньо та залишає майбутні повідомлення в тому самому сеансі ACP. Повідомлення гілки успадковують прив’язку батьківського каналу.- У прив’язаному каналі або гілці
/newі/resetскидають той самий сеанс ACP без зміни прив’язки. Тимчасові прив’язки гілок можуть перевизначати визначення цілі, доки вони активні. spawnSessionsрегулює створення й прив’язування дочірніх гілок через--thread auto|here.
Сповіщення про реакції
Сповіщення про реакції
guilds.<id>.reactionNotifications):offown(за замовчуванням)allallowlist(використовуєguilds.<id>.users)
Реакції-підтвердження
Реакції-підтвердження
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" (вимкнено)."group-mentions") не надсилає реакції-підтвердження в приватних повідомленнях або для фонових подій кімнат. Щоб отримувати реакцію-підтвердження для вхідних приватних повідомлень Discord і подій у тихих кімнатах, установіть для messages.ackReactionScope значення "all".Запис конфігурації
Запис конфігурації
/config set|unset, коли функції команд увімкнено.Щоб вимкнути:Проксі Gateway
Проксі Gateway
channels.discord.proxy.
Проксіювання WebSocket шлюзу Discord налаштовується явно; WebSocket-з’єднання не успадковують змінні середовища проксі з процесу Gateway. Початкові REST-запити використовують цей проксі, коли налаштовано channels.discord.proxy.Підтримка PluralKit
Підтримка 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: Змагається
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
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 підтримує обидві.Голосові канали
Контрольний список налаштування:- Увімкніть 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.
- Голосові функції 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.
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 voice: opus decoder: libopus-wasm. - Відтворення в реальному часі кодує необроблений стереофонічний PCM із частотою 48 кГц у Opus за допомогою того самого вбудованого пакета
libopus-wasm, перш ніж передавати пакети до@discordjs/voice. - Відтворення з файлів і потоків постачальників перекодовує дані в необроблений стереофонічний PCM із частотою 48 кГц за допомогою ffmpeg, а потім використовує
libopus-wasmдля потоку пакетів Opus, що надсилається до Discord.
- Захоплений у 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:
agent-proxy бот приєднується до налаштованого голосового каналу, але звернення агента OpenClaw використовують звичайний маршрутизований сеанс і агента цільового каналу. Голосовий сеанс реального часу озвучує повернутий результат у голосовому каналі. Агент-керівник і надалі може використовувати звичайні інструменти повідомлень відповідно до своєї політики інструментів, зокрема надсилати окреме повідомлення Discord, якщо це доречна дія.
Поки делегований запуск OpenClaw активний, нові голосові транскрипти Discord обробляються як оперативне керування запуском до початку наступного звернення агента. Фрази на кшталт «стан», «скасуй це», «скористайся меншим виправленням» або «коли завершиш, також перевір тести» класифікуються як запит стану, скасування, коригування або подальші вхідні дані для активного сеансу. Результати запиту стану, скасування, прийнятого коригування та подальших дій озвучуються в голосовому каналі, щоб користувач знав, чи OpenClaw опрацював запит.
Корисні форми цілі:
target: "channel:123456789012345678"маршрутизує через сеанс текстового каналу Discord.target: "123456789012345678"обробляється як цільовий канал.target: "dm:123456789012345678"абоtarget: "user:123456789012345678"маршрутизує через відповідний сеанс особистих повідомлень.
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 не мав активного відтворення, яке можна було б перервати. Це не повинно обривати звук.
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сервера/каналу
Тривалі ітерації Discord або дубльовані відповіді
Тривалі ітерації Discord або дубльовані відповіді
Slow listener detected ...stuck session: sessionKey=agent:...:discord:... state=processing ...
- один обліковий запис:
channels.discord.eventQueue.listenerTimeout - кілька облікових записів:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout - це керує лише роботою слухача Gateway Discord, а не тривалістю ітерації агента
Попередження про тайм-аут отримання метаданих Gateway
Попередження про тайм-аут отримання метаданих Gateway
/gateway/bot. У разі тимчасових збоїв використовується стандартна URL-адреса Gateway Discord, а частота записів у журналах обмежується.Параметри тайм-ауту метаданих:- один обліковий запис:
channels.discord.gatewayInfoTimeoutMs - кілька облікових записів:
channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs - резервна змінна середовища, коли конфігурацію не задано:
OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS - стандартне значення:
30000(30 секунд), максимум:120000
Перезапуски через тайм-аут READY Gateway
Перезапуски через тайм-аут READY Gateway
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- вбудовані стандартні значення
maxEventsPerWindow, windowSeconds і cooldownSeconds.Втрата голосового STT через DecryptionFailed(...)
Втрата голосового 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
Найважливіші поля 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.