Готово для особистих повідомлень і каналів гільдій через офіційний Discord Gateway.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Pairing
Slash commands
Channel troubleshooting
Швидке налаштування
Вам потрібно створити новий застосунок із ботом, додати бота на свій сервер і спарувати його з OpenClaw. Ми рекомендуємо додавати бота на власний приватний сервер. Якщо у вас його ще немає, спочатку створіть його (виберіть Create My Own > For me and my friends).Create a Discord application and bot
Enable privileged intents
- Message Content Intent (обов’язково)
- Server Members Intent (рекомендовано; обов’язково для allowlist ролей і зіставлення імен з ID)
- Presence Intent (необов’язково; потрібно лише для оновлень присутності)
Copy your bot token
Generate an invite URL and add the bot to your server
botapplications.commands
- View Channels Text Permissions
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (необов’язково)
Enable Developer Mode and collect your IDs
- Натисніть User Settings (значок шестерні поруч з аватаром) → Advanced → увімкніть Developer Mode
- Клацніть правою кнопкою миші значок сервера на бічній панелі → Copy Server ID
- Клацніть правою кнопкою миші власний аватар → Copy User ID
Allow DMs from server members
Set your bot token securely (do not send it in chat)
openclaw gateway run.
Для встановлень керованої служби запустіть openclaw gateway install з оболонки, де присутній DISCORD_BOT_TOKEN, або збережіть змінну в ~/.openclaw/.env, щоб служба могла визначити env SecretRef після перезапуску.
Якщо ваш хост заблокований або обмежений лімітом запитів під час стартового пошуку застосунку Discord, встановіть ID застосунку/клієнта Discord з Developer Portal, щоб запуск міг пропустити цей REST-виклик. Використовуйте channels.discord.applicationId для облікового запису за замовчуванням або channels.discord.accounts.<accountId>.applicationId, коли запускаєте кілька ботів Discord.Configure OpenClaw and pair
- Ask your agent
- CLI / config
“I already set my Discord bot token in config. Please finish Discord setup with User ID<user_id>and Server ID<server_id>.”
Approve first DM pairing
- Ask your agent
- CLI
“Approve this Discord pairing code: <CODE>”
DISCORD_BOT_TOKEN використовується лише для облікового запису за замовчуванням.
Якщо два ввімкнені облікові записи Discord визначаються до одного й того самого токена бота, OpenClaw запускає лише один монітор Gateway для цього токена. Токен із конфігурації має пріоритет над резервним env за замовчуванням; інакше перемагає перший увімкнений обліковий запис, а дубльований обліковий запис повідомляється як вимкнений.
Для розширених вихідних викликів (інструмент повідомлень/дії каналу) явний token для конкретного виклику використовується для цього виклику. Це застосовується до дій надсилання та читання/перевірки (наприклад read/search/fetch/thread/pins/permissions). Налаштування політики облікового запису/повторних спроб усе одно беруться з вибраного облікового запису в активному runtime snapshot.Рекомендовано: налаштуйте робочий простір гільдії
Коли особисті повідомлення запрацюють, ви можете налаштувати свій сервер Discord як повний робочий простір, де кожен канал отримує власну сесію агента з власним контекстом. Це рекомендовано для приватних серверів, де є лише ви та ваш бот.Add your server to the guild allowlist
- Ask your agent
- Config
“Add my Discord Server ID <server_id> to the guild allowlist”
Allow responses without @mention
message, тож агент може за замовчуванням лишатися непомітним і публікувати лише тоді, коли вирішить, що відповідь у канал корисна.Це означає, що вибрана модель має надійно викликати інструменти. Якщо Discord показує індикатор набору, а журнали показують використання токенів, але повідомлення не опубліковано, перевірте журнал сесії на наявність тексту асистента з didSendViaMessagingTool: false. Це означає, що модель створила приватну фінальну відповідь замість виклику message(action=send). Перейдіть на сильнішу модель для виклику інструментів або використайте конфігурацію нижче, щоб відновити застарілі автоматичні фінальні відповіді.- Ask your agent
- Config
“Allow my agent to respond on this server without having to be @mentioned”
Plan for memory in guild channels
- Ask your agent
- Manual
“When I ask questions in Discord channels, use memory_search or memory_get if you need long-term context from MEMORY.md.”
#coding, #home, #research або будь-що, що підходить вашому робочому процесу.
Модель виконання
- Gateway керує з’єднанням Discord.
- Маршрутизація відповідей детермінована: вхідні відповіді Discord повертаються до Discord.
- Метадані гільдії/каналу Discord додаються до запиту моделі як ненадійний контекст, а не як видимий користувачу префікс відповіді. Якщо модель копіює цю обгортку назад, OpenClaw вилучає скопійовані метадані з вихідних відповідей і з майбутнього контексту повторного відтворення.
- За замовчуванням (
session.dmScope=main) прямі чати спільно використовують головну сесію агента (agent:main:main). - Канали гільдії ізольовані ключами сесій (
agent:<agentId>:discord:channel:<channelId>). - Групові DM за замовчуванням ігноруються (
channels.discord.dm.groupEnabled=false). - Нативні slash-команди виконуються в ізольованих командних сесіях (
agent:<agentId>:discord:slash:<userId>), водночас зберігаючиCommandTargetSessionKeyдля маршрутизованої сесії розмови. - Доставка текстових оголошень Cron/Heartbeat до Discord використовує фінальну видиму асистенту відповідь один раз. Медіа та структуровані payload компонентів залишаються багатоповідомними, коли агент створює кілька deliverable payloads.
Форумні канали
Форумні та медіаканали Discord приймають лише дописи в тредах. OpenClaw підтримує два способи їх створення:- Надішліть повідомлення до батьківського форуму (
channel:<forumId>), щоб автоматично створити тред. Заголовок треду використовує перший непорожній рядок вашого повідомлення. - Використайте
openclaw message thread create, щоб створити тред напряму. Не передавайте--message-idдля форумних каналів.
channel:<threadId>).
Інтерактивні компоненти
OpenClaw підтримує контейнери компонентів Discord v2 для повідомлень агента. Використовуйте інструмент повідомлень із payloadcomponents. Результати взаємодій маршрутизуються назад до агента як звичайні вхідні повідомлення й дотримуються наявних налаштувань Discord replyToMode.
Підтримувані блоки:
text,section,separator,actions,media-gallery,file- Рядки дій дозволяють до 5 кнопок або одне меню вибору
- Типи вибору:
string,user,role,mentionable,channel
components.reusable=true, щоб дозволити використовувати кнопки, меню вибору та форми кілька разів до завершення їхнього терміну дії.
Щоб обмежити, хто може натиснути кнопку, установіть allowedUsers для цієї кнопки (ID користувачів Discord, теги або *). Коли це налаштовано, користувачі без збігу отримують ефемерну відмову.
Slash-команди /model і /models відкривають інтерактивний вибір моделі з розкривними списками провайдера, моделі та сумісного runtime, а також кроком Submit. /models add застаріла й тепер повертає повідомлення про застарілість замість реєстрації моделей із чату. Відповідь вибору ефемерна, і використовувати її може лише користувач, який її викликав. Меню вибору Discord обмежені 25 варіантами, тому додавайте записи provider/* до agents.defaults.models, коли потрібно, щоб вибір показував динамічно виявлені моделі лише для вибраних провайдерів, таких як openai-codex або vllm.
Вкладення файлів:
- Блоки
fileмають указувати на посилання вкладення (attachment://<filename>) - Надайте вкладення через
media/path/filePath(один файл); використовуйтеmedia-galleryдля кількох файлів - Використовуйте
filename, щоб перевизначити назву завантаження, коли вона має збігатися з посиланням вкладення
- Додайте
components.modalіз максимум 5 полями - Типи полів:
text,checkbox,radio,select,role-select,user-select - OpenClaw автоматично додає кнопку-тригер
Контроль доступу та маршрутизація
- Політика DM
- Групи доступу
- Політика гільдії
- Згадки та групові DM
channels.discord.dmPolicy керує доступом до DM. channels.discord.allowFrom є канонічним allowlist DM.pairing(за замовчуванням)allowlistopen(потребує, щоб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, коли може зробити це без зміни доступу.Формат цілі DM для доставки:user:<id>- згадка
<@id>
allowFrom облікового запису, трактуються як цілі DM користувачів для сумісності.Маршрутизація агентів на основі ролей
Використовуйтеbindings[].match.roles, щоб маршрутизувати учасників гільдії Discord до різних агентів за ID ролі. Прив’язки на основі ролей приймають лише ID ролей і оцінюються після прив’язок peer або parent-peer та перед прив’язками лише за гільдією. Якщо прив’язка також задає інші поля збігу (наприклад, peer + guildId + roles), усі налаштовані поля мають збігатися.
Нативні команди та авторизація команд
commands.nativeза замовчуванням має значення"auto"і ввімкнено для Discord.- Перевизначення для окремого каналу:
channels.discord.commands.native. commands.native=falseпропускає реєстрацію slash-команд Discord і очищення під час запуску. Раніше зареєстровані команди можуть залишатися видимими в Discord, доки ви не видалите їх із застосунку Discord.- Авторизація нативних команд використовує ті самі списки дозволених користувачів і політики Discord, що й звичайна обробка повідомлень.
- Команди все ще можуть бути видимими в UI Discord для користувачів без авторизації; виконання все одно застосовує авторизацію OpenClaw і повертає “not authorized”.
ephemeral: true
Деталі функцій
Теги відповіді та нативні відповіді
Теги відповіді та нативні відповіді
[[reply_to_current]][[reply_to:<id>]]
channels.discord.replyToMode:off(типово)firstallbatched
off вимикає неявне створення гілок відповідей. Явні теги [[reply_to_*]] усе ще враховуються.
first завжди додає неявне нативне посилання відповіді до першого вихідного повідомлення Discord для цього ходу.
batched додає неявне нативне посилання відповіді Discord лише тоді, коли
вхідний хід був debounce-пакетом із кількох повідомлень. Це корисно,
коли ви хочете нативні відповіді переважно для неоднозначних швидких чатів, а не для кожного
ходу з одним повідомленням.ID повідомлень показуються в контексті/історії, щоб агенти могли націлюватися на конкретні повідомлення.Попередній перегляд live stream
Попередній перегляд live stream
channels.discord.streaming приймає off | partial | block | progress (типово). progress зберігає одну редаговану чернетку статусу й оновлює її прогресом інструментів до остаточної доставки; спільна початкова мітка є рухомим рядком, тому вона прокручується вгору, як і решта, коли з’являється достатньо роботи. streamMode — застарілий runtime-псевдонім. Запустіть openclaw doctor --fix, щоб переписати збережену конфігурацію на канонічний ключ.Установіть channels.discord.streaming.mode у off, щоб вимкнути редагування попереднього перегляду Discord. Якщо block streaming Discord явно ввімкнено, OpenClaw пропускає потік попереднього перегляду, щоб уникнути подвійного streaming.partialредагує одне повідомлення попереднього перегляду в міру надходження токенів.blockвидає фрагменти розміру чернетки (використовуйтеdraftChunk, щоб налаштувати розмір і точки розриву, з обмеженням доtextChunkLimit).- Фінальні повідомлення з медіа, помилкою або явною відповіддю скасовують очікувані редагування попереднього перегляду.
streaming.preview.toolProgress(типовоtrue) керує тим, чи оновлення інструментів/прогресу повторно використовують повідомлення попереднього перегляду.- Рядки інструментів/прогресу відображаються як компактні emoji + заголовок + деталі, коли доступно, наприклад
🛠️ Bash: run testsабо🔎 Web Search: for "query". streaming.preview.commandText/streaming.progress.commandTextкерує деталями команди/виконання в компактних рядках прогресу:raw(типово) абоstatus(лише мітка інструмента).
block streaming явно ввімкнено, OpenClaw пропускає потік попереднього перегляду, щоб уникнути подвійного streaming.Історія, контекст і поведінка гілок
Історія, контекст і поведінка гілок
channels.discord.historyLimitтипово20- fallback:
messages.groupChat.historyLimit 0вимикає
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- Гілки Discord маршрутизуються як сеанси каналу й успадковують конфігурацію батьківського каналу, якщо її не перевизначено.
- Сеанси гілок успадковують вибір
/modelрівня сеансу батьківського каналу як fallback лише для моделі; локальні для гілки вибори/modelусе ще мають пріоритет, а історія транскрипту батьківського каналу не копіюється, якщо успадкування транскрипту не ввімкнено. channels.discord.thread.inheritParent(типовоfalse) вмикає для нових автоматичних гілок початкове заповнення з батьківського транскрипту. Перевизначення для окремого акаунта розміщені вchannels.discord.accounts.<id>.thread.inheritParent.- Реакції інструмента повідомлень можуть розв’язувати DM-цілі
user:<id>. guilds.<guild>.channels.<channel>.requireMention: falseзберігається під час fallback активації на етапі відповіді.
Сеанси, прив’язані до гілки, для субагентів
Сеанси, прив’язані до гілки, для субагентів
/focus <target>прив’язати поточну/нову гілку до цілі субагента/сеансу/unfocusвидалити прив’язку поточної гілки/agentsпоказати активні запуски та стан прив’язки/session idle <duration|off>переглянути/оновити автоматичний unfocus через неактивність для сфокусованих прив’язок/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.
Сповіщення про реакції
Сповіщення про реакції
offown(типово)allallowlist(використовуєguilds.<id>.users)
Ack-реакції
Ack-реакції
ackReaction надсилає emoji підтвердження, поки OpenClaw обробляє вхідне повідомлення.Порядок розв’язання:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- fallback до emoji ідентичності агента (
agents.list[].identity.emoji, інакше ”👀”)
- Discord приймає unicode emoji або назви користувацьких emoji.
- Використовуйте
"", щоб вимкнути реакцію для каналу або акаунта.
Записи конфігурації
Записи конфігурації
/config set|unset (коли функції команд увімкнено).Вимкнути:Проксі Gateway
Проксі Gateway
channels.discord.proxy.Підтримка PluralKit
Підтримка PluralKit
- списки дозволених можуть використовувати
pk:<memberId> - відображувані імена учасників зіставляються за назвою/slug лише коли
channels.discord.dangerouslyAllowNameMatching: true - пошуки використовують ID оригінального повідомлення та обмежені часовим вікном
- якщо пошук не вдається, проксійовані повідомлення обробляються як повідомлення ботів і відкидаються, якщо
allowBots=trueне задано
Псевдоніми вихідних згадок
Псевдоніми вихідних згадок
mentionAliases, коли агентам потрібні детерміновані вихідні згадки для відомих користувачів Discord. Ключі — це handles без початкового @; значення — ID користувачів Discord. Невідомі handles, @everyone, @here і згадки всередині Markdown code spans залишаються без змін.Конфігурація присутності
Конфігурація присутності
- 0: Грає
- 1: Транслює (потребує
activityUrl) - 2: Слухає
- 3: Дивиться
- 4: Власний (використовує текст активності як стан статусу; emoji необов’язковий)
- 5: Змагається
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 DM, коли власник, що викликає команду, має маршрут власника Discord; якщо він недоступний, використовується перший доступний маршрут власника з commands.ownerAllowFrom, наприклад Telegram.Коли target має значення channel або both, запит підтвердження видимий у каналі. Лише визначені затверджувачі можуть використовувати кнопки; інші користувачі отримують ефемерну відмову. Запити підтвердження містять текст команди, тому вмикайте доставку в канал лише в довірених каналах. Якщо ID каналу неможливо отримати з ключа сесії, OpenClaw повертається до доставки через DM.Discord також відтворює спільні кнопки підтвердження, які використовують інші чат-канали. Нативний адаптер Discord переважно додає маршрутизацію DM для затверджувачів і розсилання в канали.
Коли ці кнопки присутні, вони є основним UX підтвердження; OpenClaw
має додавати ручну команду /approve лише тоді, коли результат інструмента каже,
що чат-підтвердження недоступні або ручне підтвердження є єдиним шляхом.
Якщо нативний runtime підтверджень Discord не активний, OpenClaw залишає
локальний детермінований запит /approve <id> <decision> видимим. Якщо
runtime активний, але нативну картку неможливо доставити до жодної цілі,
OpenClaw надсилає резервне повідомлення в той самий чат із точною командою /approve
з очікуваного підтвердження.Автентифікація Gateway і розв’язання підтверджень відповідають спільному контракту клієнта Gateway (plugin: ID розв’язуються через plugin.approval.resolve; інші ID через exec.approval.resolve). Типово підтвердження спливають через 30 хвилин.Див. Підтвердження виконання.Інструменти та шлюзи дій
Дії з повідомленнями Discord охоплюють обмін повідомленнями, адміністрування каналів, модерацію, присутність і дії з метаданими. Основні приклади:- обмін повідомленнями:
sendMessage,readMessages,editMessage,deleteMessage,threadReply - реакції:
react,reactions,emojiList - модерація:
timeout,kick,ban - присутність:
setPresence
event-create приймає необов’язковий параметр image (URL або шлях до локального файла), щоб установити обкладинку запланованої події.
Шлюзи дій розташовані в channels.discord.actions.*.
Типова поведінка шлюзів:
| Група дій | Типово |
|---|---|
| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | увімкнено |
| roles | вимкнено |
| moderation | вимкнено |
| presence | вимкнено |
UI компонентів v2
OpenClaw використовує компоненти Discord v2 для підтверджень виконання та міжконтекстних маркерів. Дії з повідомленнями Discord також можуть прийматиcomponents для власного UI (розширений режим; потребує побудови payload компонента через інструмент discord), тоді як застарілі embeds залишаються доступними, але не рекомендовані.
channels.discord.ui.components.accentColorзадає колір акценту, який використовують контейнери компонентів Discord (hex).- Установлюється для кожного облікового запису через
channels.discord.accounts.<id>.ui.components.accentColor. embedsігноруються, коли присутні компоненти v2.
Голос
Discord має дві окремі голосові поверхні: realtime голосові канали (безперервні розмови) і вкладення голосових повідомлень (формат попереднього перегляду waveform). Gateway підтримує обидві.Голосові канали
Контрольний список налаштування:- Увімкніть Message Content Intent у Discord Developer Portal.
- Увімкніть Server Members Intent, коли використовуються allowlist ролей/користувачів.
- Запросіть бота зі scopes
botіapplications.commands. - Надайте Connect, Speak, Send Messages і Read Message History у цільовому голосовому каналі.
- Увімкніть нативні команди (
commands.nativeабоchannels.discord.commands.native). - Налаштуйте
channels.discord.voice.
/vc join|leave|status, щоб керувати сесіями. Команда використовує типового агента облікового запису та дотримується тих самих правил allowlist і групової політики, що й інші команди Discord.
voice.ttsперевизначаєmessages.ttsлише для голосового відтворенняstt-tts. Режими реального часу використовуютьvoice.realtime.voice.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.agent-proxyмаршрутизує мовлення черезdiscord-voice, що зберігає звичайну авторизацію власника/інструментів для мовця й цільової сесії, але приховує інструмент агентаtts, оскільки Discord voice відповідає за відтворення. Типово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.voiceналаштовують аудіосесію реального часу. Для OpenAI Realtime 2 плюс мозку Codex використовуйтеvoice.realtime.model: "gpt-realtime-2"іvoice.model: "openai-codex/gpt-5.5". - Провайдер OpenAI Realtime приймає поточні назви подій Realtime 2 і застарілі сумісні з Codex псевдоніми для подій вихідного аудіо та транскриптів, тому сумісні знімки провайдера можуть змінюватися без втрати аудіо асистента.
voice.realtime.bargeInкерує тим, чи події початку мовлення в Discord переривають активне відтворення реального часу. Якщо не задано, це значення наслідує налаштування переривання вхідного аудіо провайдера реального часу.voice.realtime.minBargeInAudioEndMsкерує мінімальною тривалістю відтворення асистента перед тим, як barge-in OpenAI Realtime обрізає аудіо. Типово:250. Установіть0для негайного переривання в кімнатах із низьким рівнем відлуння або збільште значення для конфігурацій із динаміками та сильним відлунням.- Для голосу OpenAI під час відтворення в Discord установіть
voice.tts.provider: "openai"і виберіть голос Text-to-speech уvoice.tts.openai.voiceабоvoice.tts.providers.openai.voice.cedar— вдалий вибір із чоловічим звучанням у поточній моделі OpenAI TTS. - Перевизначення
systemPromptдля окремих каналів Discord застосовуються до реплік голосового транскрипту для цього голосового каналу. - Репліки голосового транскрипту визначають статус власника з Discord
allowFrom(абоdm.allowFrom); мовці, які не є власниками, не можуть отримувати доступ до інструментів лише для власників (наприклад,gatewayіcron). - Голос Discord є opt-in для конфігурацій лише з текстом; установіть
channels.discord.voice.enabled=true(або збережіть наявний блокchannels.discord.voice), щоб увімкнути команди/vc, голосове середовище виконання та Gateway intentGuildVoiceStates. channels.discord.intents.voiceStatesможе явно перевизначити підписку на voice-state intent. Залиште це значення незаданим, щоб intent відповідав ефективному ввімкненню голосу.- Якщо
voice.autoJoinмає кілька записів для тієї самої гільдії, OpenClaw приєднується до останнього налаштованого каналу для цієї гільдії. voice.allowedChannels— необов’язковий allowlist резидентності. Залиште це значення незаданим, щоб дозволити/vc joinу будь-який авторизований голосовий канал Discord. Якщо задано,/vc join, auto-join під час запуску та переміщення голосового стану бота обмежуються переліченими записами{ guildId, channelId }. Установіть порожній масив, щоб заборонити всі голосові приєднання Discord. Якщо Discord перемістить бота за межі allowlist, OpenClaw залишить цей канал і повторно приєднається до налаштованої цілі auto-join, коли вона доступна.voice.daveEncryptionіvoice.decryptionFailureToleranceпередаються напряму до параметрів приєднання@discordjs/voice.- Типові значення
@discordjs/voice—daveEncryption=trueіdecryptionFailureTolerance=24, якщо їх не задано. - OpenClaw типово використовує чистий JS-декодер
opusscriptдля приймання голосу Discord. Необов’язковий нативний пакет@discordjs/opusігнорується політикою встановлення pnpm у репозиторії, щоб звичайні встановлення, Docker-лінії та непов’язані тести не компілювали нативний addon. Виділені хости для голосової продуктивності можуть opt-in черезOPENCLAW_DISCORD_OPUS_DECODER=nativeпісля встановлення нативного addon. voice.connectTimeoutMsкерує початковим очікуванням Ready@discordjs/voiceдля спроб/vc joinі auto-join. Типово:30000.voice.reconnectGraceMsкерує тим, як довго OpenClaw чекає, доки від’єднана голосова сесія почне повторне підключення, перш ніж знищити її. Типово:15000.- У режимі
stt-ttsголосове відтворення не зупиняється лише через те, що інший користувач починає говорити. Щоб уникнути циклів зворотного зв’язку, OpenClaw ігнорує нове захоплення голосу, поки TTS відтворюється; говоріть після завершення відтворення для наступної репліки. Режими реального часу передають початок мовлення як сигнали barge-in провайдеру реального часу. - У режимах реального часу відлуння від динаміків у відкритий мікрофон може виглядати як barge-in і переривати відтворення. Для кімнат Discord із сильним відлунням установіть
voice.realtime.providers.openai.interruptResponseOnInputAudio: false, щоб OpenAI не переривався автоматично на вхідному аудіо. Додайтеvoice.realtime.bargeIn: true, якщо ви все ще хочете, щоб події початку мовлення Discord переривали активне відтворення. Міст OpenAI Realtime ігнорує обрізання відтворення, коротші заvoice.realtime.minBargeInAudioEndMs, як імовірне відлуння/шум і логує їх як пропущені замість очищення відтворення Discord. voice.captureSilenceGraceMsкерує тим, як довго OpenClaw чекає після того, як Discord повідомляє, що мовець зупинився, перш ніж фіналізувати цей аудіосегмент для STT. Типово:2500; збільште це значення, якщо Discord розбиває звичайні паузи на уривчасті часткові транскрипти.- Коли вибраним провайдером TTS є ElevenLabs, голосове відтворення Discord використовує потоковий TTS і починається з потоку відповіді провайдера. Провайдери без підтримки потокового передавання повертаються до шляху синтезованого тимчасового файла.
- OpenClaw також відстежує помилки розшифрування приймання й автоматично відновлюється, виходячи з голосового каналу та повторно приєднуючись до нього після повторних помилок у короткому вікні.
- Якщо журнали приймання повторно показують
DecryptionFailed(UnencryptedWhenPassthroughDisabled)після оновлення, зберіть звіт про залежності та журнали. Вбудована лінія@discordjs/voiceмістить upstream-виправлення padding з PR discord.js #11449, яке закрило issue discord.js #11419. - Події приймання
The operation was abortedочікувані, коли OpenClaw фіналізує захоплений сегмент мовця; це докладні діагностичні повідомлення, а не попередження. - Докладні голосові журнали Discord містять обмежений однорядковий попередній перегляд STT-транскрипту для кожного прийнятого сегмента мовця, тож налагодження показує і сторону користувача, і сторону відповіді агента без виведення необмеженого тексту транскрипту.
- У режимі
agent-proxyпримусовий fallback консультації пропускає ймовірно неповні фрагменти транскрипту, наприклад текст, що закінчується на...або кінцевий сполучник на кшталтand, а також очевидні неакційні завершення на кшталт “be right back” або “bye”. Журнали показуютьforced agent consult skipped reason=..., коли це запобігає застарілій відповіді в черзі.
node-gyp.
Після встановлення нативного addon запустіть Gateway з:
discord voice: opus decoder: @discordjs/opus. Без env opt-in або якщо нативний addon відсутній чи не може завантажитися на хості, OpenClaw логує discord voice: opus decoder: opusscript і продовжує приймати голос через чистий JS fallback.
Конвеєр STT плюс TTS:
- Захоплення Discord PCM перетворюється на тимчасовий WAV-файл.
tools.media.audioобробляє STT, наприкладopenai/gpt-4o-mini-transcribe.- Транскрипт надсилається через ingress і маршрутизацію Discord, тоді як response LLM працює з політикою голосового виводу, яка приховує інструмент агента
ttsі просить повернутий текст, оскільки Discord voice відповідає за фінальне відтворення TTS. voice.model, якщо задано, перевизначає лише response LLM для цієї репліки голосового каналу.voice.ttsоб’єднується поверхmessages.tts; провайдери з підтримкою потокового передавання подають дані безпосередньо в програвач, інакше отриманий аудіофайл відтворюється в приєднаному каналі.
voice.agentSession кожен голосовий канал отримує власну маршрутизовану сесію OpenClaw. Наприклад, /vc join channel:234567890123456789 спілкується із сесією для цього голосового каналу Discord. Модель реального часу — це лише голосовий фронтенд; змістовні запити передаються налаштованому агенту OpenClaw. Якщо модель реального часу створює фінальний транскрипт без виклику інструмента консультації, OpenClaw примусово виконує консультацію як fallback, щоб типова поведінка все одно була схожою на розмову з агентом.
Приклад застарілого STT плюс TTS:
agent-proxy бот приєднується до налаштованого голосового каналу, але репліки агента OpenClaw використовують звичайну маршрутизовану сесію та агента цільового каналу. Голосова сесія реального часу озвучує повернутий результат назад у голосовий канал. Агент-супервізор усе ще може використовувати звичайні інструменти повідомлень відповідно до своєї політики інструментів, зокрема надсилати окреме повідомлення Discord, якщо це правильна дія.
Корисні форми цілі:
target: "channel:123456789012345678"маршрутизує через сесію текстового каналу Discord.target: "123456789012345678"обробляється як ціль каналу.target: "dm:123456789012345678"абоtarget: "user:123456789012345678"маршрутизує через цю сесію direct message.
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означає, що VAD Discord або постачальника повідомив про мовлення, але 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 після зміни намірів
Повідомлення гільдії несподівано заблоковано
Повідомлення гільдії несподівано заблоковано
- перевірте
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 - резервне значення env, коли конфігурацію не встановлено:
OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS - стандартне значення:
30000(30 секунд), максимум:120000
Перезапуски через тайм-аут READY Gateway
Перезапуски через тайм-аут READY Gateway
READY під час запуску та після повторних підключень середовища виконання. Налаштування з кількома обліковими записами й поетапним запуском можуть потребувати довшого стартового вікна READY, ніж стандартне.Параметри тайм-ауту READY:- запуск, один обліковий запис:
channels.discord.gatewayReadyTimeoutMs - запуск, кілька облікових записів:
channels.discord.accounts.<accountId>.gatewayReadyTimeoutMs - резервне значення env для запуску, коли конфігурацію не встановлено:
OPENCLAW_DISCORD_READY_TIMEOUT_MS - стандартне значення запуску:
15000(15 секунд), максимум:120000 - середовище виконання, один обліковий запис:
channels.discord.gatewayRuntimeReadyTimeoutMs - середовище виконання, кілька облікових записів:
channels.discord.accounts.<accountId>.gatewayRuntimeReadyTimeoutMs - резервне значення env для середовища виконання, коли конфігурацію не встановлено:
OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS - стандартне значення середовища виконання:
30000(30 секунд), максимум:120000
Невідповідності аудиту дозволів
Невідповідності аудиту дозволів
channels status --probe працюють лише для числових ідентифікаторів каналів.Якщо ви використовуєте ключі-слаги, зіставлення під час виконання все одно може працювати, але проба не може повністю перевірити дозволи.Проблеми з DM і сполученням
Проблеми з DM і сполученням
- DM вимкнено:
channels.discord.dm.enabled=false - політику DM вимкнено:
channels.discord.dmPolicy="disabled"(застаріле:channels.discord.dm.policy) - очікується схвалення сполучення в режимі
pairing
Цикли бот-бот
Цикли бот-бот
channels.discord.allowBots=true, use strict mention and allowlist rules to avoid loop behavior.
Prefer channels.discord.allowBots="mentions" to only accept bot messages that mention the bot.Voice STT drops with DecryptionFailed(...)
Voice STT drops with DecryptionFailed(...)
- keep OpenClaw current (
openclaw update) so the Discord voice receive recovery logic is present - confirm
channels.discord.voice.daveEncryption=true(default) - start from
channels.discord.voice.decryptionFailureTolerance=24(upstream default) and tune only if needed - watch logs for:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- if failures continue after automatic rejoin, collect logs and compare against the upstream DAVE receive history in discord.js #11419 and discord.js #11449
Configuration reference
Primary reference: Configuration reference - Discord.High-signal Discord fields
High-signal Discord fields
- startup/auth:
enabled,token,accounts.*,allowBots - policy:
groupPolicy,dm.*,guilds.*,guilds.*.channels.* - command:
commands.native,commands.useAccessGroups,configWrites,slashCommand.* - event queue:
eventQueue.listenerTimeout(listener budget),eventQueue.maxQueueSize,eventQueue.maxConcurrency - gateway:
gatewayInfoTimeoutMs,gatewayReadyTimeoutMs,gatewayRuntimeReadyTimeoutMs - reply/history:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - delivery:
textChunkLimit,chunkMode,maxLinesPerMessage - streaming:
streaming(legacy alias:streamMode),streaming.preview.toolProgress,draftChunk,blockStreaming,blockStreamingCoalesce - media/retry:
mediaMaxMb(caps outbound Discord uploads, default100MB),retry - actions:
actions.* - presence:
activity,status,activityType,activityUrl - UI:
ui.components.accentColor - features:
threadBindings, top-levelbindings[](type: "acp"),pluralkit,execApprovals,intents,agentComponents,heartbeat,responsePrefix
Safety and operations
- Treat bot tokens as secrets (
DISCORD_BOT_TOKENpreferred in supervised environments). - Grant least-privilege Discord permissions.
- If command deploy/state is stale, restart gateway and re-check with
openclaw channels status --probe.