Сполучення
Slash-команди
Усунення несправностей каналів
Швидке налаштування
Вам потрібно створити новий застосунок із ботом, додати бота на свій сервер і сполучити його з OpenClaw. Радимо додати бота на власний приватний сервер. Якщо у вас його ще немає, спочатку створіть його (виберіть Create My Own > For me and my friends).Створіть застосунок Discord і бота
Увімкніть privileged intents
- Message Content Intent (обов’язково)
- Server Members Intent (рекомендовано; обов’язково для allowlist ролей і зіставлення імен з ID)
- Presence Intent (необов’язково; потрібен лише для оновлень присутності)
Скопіюйте токен бота
Згенеруйте URL запрошення та додайте бота на сервер
botapplications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (необов’язково)
Увімкніть Developer Mode і зберіть свої ID
- Натисніть User Settings (значок шестерні поруч із вашим аватаром) → прокрутіть до Developer на бічній панелі → увімкніть Developer Mode (Примітка: у мобільному застосунку Discord Developer Mode розташований у App Settings → Advanced)
- Клацніть правою кнопкою значок сервера на бічній панелі → Copy Server ID
- Клацніть правою кнопкою власний аватар → Copy User ID
Дозвольте DM від учасників сервера
Безпечно встановіть токен бота (не надсилайте його в чат)
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.Налаштуйте OpenClaw і сполучіть
- Запитайте свого агента
- 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>.”
Схваліть перше сполучення через DM
- Запитайте свого агента
- CLI
“Approve this Discord pairing code: <CODE>”
DISCORD_BOT_TOKEN використовується лише для облікового запису за замовчуванням.
Якщо два ввімкнені облікові записи Discord розв’язуються в той самий токен бота, OpenClaw запускає лише один монітор gateway для цього токена. Токен із конфігурації має пріоритет над резервним env за замовчуванням; інакше перший увімкнений обліковий запис перемагає, а дубльований обліковий запис повідомляється як вимкнений.
Для розширених вихідних викликів (інструмент повідомлень/дії каналу) явний token для кожного виклику використовується саме для цього виклику. Це стосується дій надсилання та читання/перевірки, наприклад read/search/fetch/thread/pins/permissions. Політика облікового запису й налаштування повторних спроб усе одно надходять із вибраного облікового запису в активному знімку runtime.Рекомендовано: налаштуйте робочий простір гільдії
Коли DM запрацюють, ви можете налаштувати свій сервер Discord як повноцінний робочий простір, де кожен канал отримує власну сесію агента з власним контекстом. Це рекомендовано для приватних серверів, де є лише ви та ваш бот.Додайте свій сервер до allowlist гільдій
- Запитайте свого агента
- Конфігурація
“Add my Discord Server ID <server_id> to the guild allowlist”
Дозвольте відповіді без @mention
messages.groupChat.visibleReplies: "message_tool", щоб агент міг спостерігати й публікувати лише тоді, коли вирішить, що відповідь у каналі корисна. Це найкраще працює з моделями останнього покоління з надійною роботою інструментів, такими як GPT 5.5. Події фонової кімнати залишаються тихими, якщо інструмент не надсилає. Див. Події фонової кімнати для повної конфігурації режиму спостереження.Якщо Discord показує введення тексту, а журнали показують використання токенів, але повідомлення не опубліковано, перевірте, чи хід був налаштований як подія фонової кімнати або чи були ввімкнені видимі відповіді через інструмент повідомлень.- Запитайте свого агента
- Конфігурація
“Allow my agent to respond on this server without having to be @mentioned”
Сплануйте пам’ять у каналах гільдії
- Запитайте свого агента
- Вручну
“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 або будь-що, що підходить вашому робочому процесу.
Runtime-модель
- 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 компонентів залишаються багатоповідомними, коли агент видає кілька доставних payload.
Форумні канали
Форумні та медіаканали 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 для цієї кнопки (ідентифікатори користувачів Discord, теги або *). Коли налаштовано, користувачі, які не збігаються, отримують ефемерну відмову.
Callback-и компонентів за замовчуванням завершують термін дії через 30 хвилин. Установіть channels.discord.agentComponents.ttlMs, щоб змінити час життя цього реєстру callback-ів для стандартного облікового запису Discord, або channels.discord.accounts.<accountId>.agentComponents.ttlMs, щоб перевизначити один обліковий запис у багатообліковому налаштуванні. Значення задається в мілісекундах, має бути додатним цілим числом і обмежене 86400000 (24 години). Довші TTL корисні для робочих процесів review або затвердження, де кнопки мають залишатися придатними до використання, але вони також розширюють вікно, у якому старе повідомлення Discord ще може запустити дію. Віддавайте перевагу найкоротшому TTL, який відповідає робочому процесу, і залишайте значення за замовчуванням, коли застарілі callback-и були б неочікуваними.
Slash-команди /model і /models відкривають інтерактивний вибір моделі з випадаючими списками провайдера, моделі та сумісного runtime, а також кроком 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 автоматично додає кнопку запуску
Контроль доступу та маршрутизація
- Політика 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 guild до різних агентів за ID ролі. Прив’язки на основі ролей приймають лише ID ролей і оцінюються після прив’язок peer або parent-peer та перед прив’язками лише для guild. Якщо прив’язка також задає інші поля match (наприклад, peer + guildId + roles), усі налаштовані поля мають збігатися.
Нативні команди та авторизація команд
commands.nativeза замовчуванням має значення"auto"і ввімкнено для Discord.- Перевизначення для окремого каналу:
channels.discord.commands.native. commands.native=falseпропускає реєстрацію та очищення slash-команд Discord під час запуску. Раніше зареєстровані команди можуть залишатися видимими в Discord, доки ви не видалите їх із застосунку Discord.- Авторизація нативних команд використовує ті самі allowlist-и/політики Discord, що й звичайна обробка повідомлень.
- Команди все ще можуть бути видимими в інтерфейсі Discord для користувачів, які не авторизовані; виконання все одно застосовує авторизацію OpenClaw і повертає “не авторизовано”.
ephemeral: true
Деталі функцій
Link previews
Link previews
channels.discord.accounts.<id>.suppressEmbeds, щоб перевизначити один обліковий запис. Надсилання через message-tool агента також може передати suppressEmbeds: false для одного повідомлення. Явні payload-и Discord embeds не приглушуються типовим налаштуванням попереднього перегляду посилань.Live stream preview
Live stream preview
channels.discord.streaming приймає off | partial | block | progress (за замовчуванням). progress тримає одну редаговану чернетку статусу й оновлює її прогресом інструментів до фінальної доставки; спільна стартова мітка є рухомим рядком, тож вона прокручується геть, як і решта, коли з’являється достатньо роботи. streamMode — застарілий runtime-псевдонім. Запустіть openclaw doctor --fix, щоб переписати збережену конфігурацію на канонічний ключ.Установіть channels.discord.streaming.mode на off, щоб вимкнути редагування попереднього перегляду Discord. Якщо Discord block streaming явно ввімкнено, OpenClaw пропускає потік попереднього перегляду, щоб уникнути подвійного streaming.partialредагує одне повідомлення попереднього перегляду в міру надходження токенів.blockвипускає фрагменти розміром із чернетку (використовуйтеdraftChunk, щоб налаштувати розмір і точки розриву, обмеженіtextChunkLimit).- Фінали з медіа, помилками та явними відповідями скасовують очікувані редагування попереднього перегляду.
streaming.preview.toolProgress(за замовчуваннямtrue) керує тим, чи оновлення інструментів/прогресу повторно використовують повідомлення попереднього перегляду.- Рядки інструментів/прогресу відображаються як компактні emoji + заголовок + деталь, коли доступно, наприклад
🛠️ Bash: run testsабо🔎 Web Search: for "query". streaming.progress.commentary(за замовчуваннямfalse) вмикає текст коментаря/преамбули асистента в тимчасовій чернетці прогресу. Коментар очищується перед показом, залишається тимчасовим і не змінює доставку фінальної відповіді.streaming.progress.maxLineCharsкерує бюджетом попереднього перегляду прогресу на рядок. Проза скорочується на межах слів; деталі команд і шляхів зберігають корисні суфікси.streaming.preview.commandText/streaming.progress.commandTextкерує деталями command/exec у компактних рядках прогресу:raw(за замовчуванням) абоstatus(лише мітка інструмента).
block streaming явно ввімкнено, OpenClaw пропускає потік попереднього перегляду, щоб уникнути подвійного streaming.History, context, and thread behavior
History, context, and thread behavior
channels.discord.historyLimitза замовчуванням20- fallback:
messages.groupChat.historyLimit 0вимикає
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- Discord threads маршрутизуються як channel sessions і успадковують конфігурацію батьківського каналу, якщо її не перевизначено.
- Thread sessions успадковують вибір
/modelрівня сесії батьківського каналу як fallback лише для моделі; локальні для thread вибори/modelусе одно мають пріоритет, а історія transcript батька не копіюється, якщо не ввімкнено успадкування transcript. channels.discord.thread.inheritParent(за замовчуваннямfalse) вмикає для нових auto-threads початкове наповнення з parent transcript. Перевизначення для окремого облікового запису розміщені вchannels.discord.accounts.<id>.thread.inheritParent.- Реакції message-tool можуть розв’язувати DM-цілі
user:<id>. guilds.<guild>.channels.<channel>.requireMention: falseзберігається під час fallback активації на етапі відповіді.
Thread-bound sessions for subagents
Thread-bound sessions for subagents
/focus <target>прив’язати поточний/новий thread до цілі субагента/сесії/unfocusвидалити прив’язку поточного thread/agentsпоказати активні запуски та стан прив’язки/session idle <duration|off>переглянути/оновити авто-unfocus через неактивність для сфокусованих прив’язок/session max-age <duration|off>переглянути/оновити жорсткий максимальний вік для сфокусованих прив’язок
session.threadBindings.*задає глобальні типові значення.channels.discord.threadBindings.*перевизначає поведінку Discord.spawnSessionsкерує автоматичним створенням/прив’язкою threads дляsessions_spawn({ thread: true })і ACP thread spawns. За замовчуванням:true.defaultSpawnContextкерує нативним контекстом субагента для thread-bound spawns. За замовчуванням:"fork".- Застарілі ключі
spawnSubagentSessions/spawnAcpSessionsмігруються черезopenclaw doctor --fix. - Якщо thread bindings вимкнено для облікового запису,
/focusі пов’язані операції прив’язки thread недоступні.
Persistent ACP channel bindings
Persistent ACP channel bindings
bindings[]зtype: "acp"іmatch.channel: "discord"
/acp spawn codex --bind hereприв’язує поточний канал або thread на місці та зберігає майбутні повідомлення в тій самій ACP сесії. Повідомлення thread успадковують прив’язку батьківського каналу.- У прив’язаному каналі або thread
/newі/resetскидають ту саму ACP сесію на місці. Тимчасові thread bindings можуть перевизначати розв’язання цілі, поки активні. spawnSessionsобмежує створення/прив’язку дочірнього thread через--thread auto|here.
Reaction notifications
Reaction notifications
offown(за замовчуванням)allallowlist(використовуєguilds.<id>.users)
Ack reactions
Ack reactions
ackReaction надсилає emoji підтвердження, поки OpenClaw обробляє вхідне повідомлення.Порядок розв’язання:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- fallback emoji ідентичності агента (
agents.list[].identity.emoji, інакше ”👀”)
- Discord приймає unicode emoji або назви custom emoji.
- Використовуйте
"", щоб вимкнути реакцію для каналу або облікового запису.
Config writes
Config writes
/config set|unset (коли функції команд увімкнені).Вимкнути:Gateway proxy
Gateway proxy
channels.discord.proxy.
Проксіювання WebSocket Discord Gateway є явним; WebSocket-з’єднання не успадковують ambient proxy environment variables від процесу Gateway. Startup REST lookups використовують цей proxy, коли налаштовано 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(підтримує placeholder{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" і можна розв’язати принаймні одного approver — або з execApprovals.approvers, або з commands.ownerAllowFrom. Discord не виводить exec approvers з канального allowFrom, застарілого dm.allowFrom або direct-message defaultTo. Задайте enabled: false, щоб явно вимкнути Discord як нативний клієнт підтверджень.Для чутливих групових команд лише для owner, як-от /diagnostics і /export-trajectory, OpenClaw надсилає запити на підтвердження та фінальні результати приватно. Спершу він пробує Discord DM, коли owner, який викликає команду, має owner-маршрут Discord; якщо він недоступний, OpenClaw повертається до першого доступного owner-маршруту з commands.ownerAllowFrom, наприклад Telegram.Коли target має значення channel або both, запит на підтвердження видно в каналі. Лише розв’язані approvers можуть використовувати кнопки; інші користувачі отримують ephemeral відмову. Запити на підтвердження містять текст команди, тому вмикайте доставку в канал лише в довірених каналах. Якщо ID каналу неможливо отримати з ключа сесії, OpenClaw повертається до доставки через DM.Discord також відтворює спільні кнопки підтвердження, які використовують інші чат-канали. Нативний адаптер Discord переважно додає маршрутизацію approver DM і розсилання в канал.
Коли ці кнопки присутні, вони є основним UX підтвердження; OpenClaw
має додавати ручну команду /approve лише тоді, коли результат інструмента каже,
що чат-підтвердження недоступні або ручне підтвердження є єдиним шляхом.
Якщо нативний runtime підтверджень Discord не активний, OpenClaw зберігає
локальний детермінований запит /approve <id> <decision> видимим. Якщо
runtime активний, але нативну картку неможливо доставити жодній цілі,
OpenClaw надсилає резервне сповіщення в той самий чат з точною командою /approve
з очікуваного підтвердження.Автентифікація Gateway і розв’язання підтверджень дотримуються спільного контракту клієнта Gateway (ID plugin: розв’язуються через plugin.approval.resolve; інші ID — через exec.approval.resolve). Підтвердження типово спливають через 30 хвилин.Див. Exec approvals.Інструменти та шлюзи дій
Дії повідомлень 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 Components v2
OpenClaw використовує компоненти Discord v2 для exec approvals і маркерів між контекстами. Дії повідомлень Discord також можуть прийматиcomponents для користувацького UI (розширено; потребує створення component payload через інструмент discord), тоді як застарілі embeds лишаються доступними, але не рекомендуються.
channels.discord.ui.components.accentColorзадає акцентний колір, який використовують контейнери компонентів Discord (hex).- Задавайте для окремого облікового запису через
channels.discord.accounts.<id>.ui.components.accentColor. channels.discord.agentComponents.ttlMsкерує тим, як довго надіслані callback-и компонентів Discord лишаються зареєстрованими (типово1800000, максимум86400000). Задавайте для окремого облікового запису черезchannels.discord.accounts.<id>.agentComponents.ttlMs.embedsігноруються, коли присутні components v2.- Звичайні попередні перегляди URL типово пригнічуються. Задайте
suppressEmbeds: falseу дії повідомлення, коли одне вихідне посилання має розгортатися.
Голос
Discord має дві окремі голосові поверхні: realtime голосові канали (безперервні розмови) і вкладення голосових повідомлень (формат попереднього перегляду waveform). 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.
voice.ttsперевизначаєmessages.ttsлише для голосового відтворенняstt-tts. Режими реального часу використовуютьvoice.realtime.speakerVoice.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 плюс мозку Codex використовуйтеvoice.realtime.model: "gpt-realtime-2"іvoice.model: "openai/gpt-5.5". - Голосові режими реального часу за замовчуванням включають невеликі профільні файли
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для негайного переривання в кімнатах із низьким відлунням або збільште значення для конфігурацій динаміків із сильним відлунням.- Для голосу OpenAI під час відтворення в Discord задайте
voice.tts.provider: "openai"і виберіть голос Text-to-speech уvoice.tts.providers.openai.speakerVoice.cedar— хороший варіант із маскулінним звучанням у поточній моделі OpenAI TTS. - Перевизначення
systemPromptдля окремих каналів Discord застосовуються до голосових транскрибованих реплік для цього голосового каналу. - Голосові транскрибовані репліки визначають статус власника з Discord
allowFrom(абоdm.allowFrom) для команд і дій каналу, обмежених власником. Видимість інструментів агента відповідає налаштованій політиці інструментів для маршрутизованої сесії. - Голос Discord є опціональним для конфігурацій лише з текстом; задайте
channels.discord.voice.enabled=true(або збережіть наявний блокchannels.discord.voice), щоб увімкнути команди/vc, голосове середовище виконання та Gateway intentGuildVoiceStates. channels.discord.intents.voiceStatesможе явно перевизначити підписку на intent стану голосу. Залиште це поле незаданим, щоб intent відповідав фактичному ввімкненню голосу.- Якщо
voice.autoJoinмає кілька записів для тієї самої гільдії, OpenClaw приєднується до останнього налаштованого каналу для цієї гільдії. voice.allowedChannels— необов’язковий список дозволеного перебування. Залиште його незаданим, щоб дозволити/vc joinу будь-який авторизований голосовий канал Discord. Коли задано,/vc join, автоматичне приєднання під час запуску та переміщення голосового стану бота обмежуються переліченими записами{ guildId, channelId }. Задайте порожній масив, щоб заборонити всі голосові приєднання Discord. Якщо Discord перемістить бота за межі списку дозволених, OpenClaw вийде з цього каналу й повторно приєднається до налаштованої цілі автоматичного приєднання, коли вона доступна.voice.daveEncryptionіvoice.decryptionFailureToleranceпередаються напряму до параметрів приєднання@discordjs/voice.- Стандартні значення
@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містить виправлення заповнення з upstream із PR discord.js #11449, яке закрило issue discord.js #11419. - Події приймання
The operation was abortedочікувані, коли OpenClaw фіналізує захоплений сегмент мовця; це докладна діагностика, а не попередження. - Докладні журнали голосу Discord включають обмежений однорядковий попередній перегляд STT-транскрипту для кожного прийнятого сегмента мовця, тож налагодження показує і сторону користувача, і сторону відповіді агента без вивантаження необмеженого тексту транскрипту.
- У режимі
agent-proxyпримусовий запасний шлях консультації пропускає ймовірно неповні фрагменти транскрипту, як-от текст, що закінчується на...або кінцевий сполучник на кшталтand, а також очевидні неакційні завершення на кшталт “be right back” або “bye”. Журнали показують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і просить повернути текст, оскільки голос Discord відповідає за фінальне відтворення TTS. 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 розглядаються як керування живим запуском перед початком іншого ходу агента. Фрази на кшталт “status”, “cancel that”, “use the smaller fix” або “when you’re done also check tests” класифікуються як статус, скасування, спрямування або подальший ввід для активного сеансу. Результати статусу, скасування, прийнятого спрямування та подальших дій промовляються назад у голосовий канал, щоб абонент знав, чи 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 почав відтворювати аудіо асистента. Із цього моменту міст починає рахувати вихідні фрагменти асистента, байти Discord PCM, байти реального часу провайдера та тривалість синтезованого аудіо.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 генерує хвилю автоматично, але потребуєffmpeg і ffprobe на хості Gateway для перевірки та перетворення.
- Укажіть локальний шлях до файлу (URL відхиляються).
- Не додавайте текстовий вміст (Discord відхиляє текст + голосове повідомлення в одному payload).
- Приймається будь-який аудіоформат; OpenClaw за потреби перетворює його на OGG/Opus.
Усунення несправностей
Used disallowed intents or bot sees no guild messages
Used disallowed intents or bot sees no guild messages
- увімкніть Message Content Intent
- увімкніть Server Members Intent, коли залежите від розпізнавання користувачів/учасників
- перезапустіть gateway після зміни intents
Guild messages blocked unexpectedly
Guild messages blocked unexpectedly
- перевірте
groupPolicy - перевірте allowlist guild у
channels.discord.guilds - якщо існує мапа
channelsдля guild, дозволені лише перелічені канали - перевірте поведінку
requireMentionі шаблони згадок
Require mention false but still blocked
Require mention false but still blocked
groupPolicy="allowlist"без відповідного allowlist guild/channelrequireMentionналаштовано не в тому місці (має бути вchannels.discord.guildsабо записі каналу)- відправника заблоковано allowlist
usersдля guild/channel
Long-running Discord turns or duplicate replies
Long-running Discord turns or duplicate replies
Slow listener detected ...stuck session: sessionKey=agent:...:discord:... state=processing ...
- один обліковий запис:
channels.discord.eventQueue.listenerTimeout - кілька облікових записів:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout - це керує лише роботою listener Discord gateway, а не тривалістю ходу агента
Gateway metadata lookup timeout warnings
Gateway metadata lookup timeout warnings
/gateway/bot перед підключенням. Тимчасові збої повертаються до стандартного URL gateway Discord і обмежуються за частотою в журналах.Параметри тайм-ауту метаданих:- один обліковий запис:
channels.discord.gatewayInfoTimeoutMs - кілька облікових записів:
channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs - резервне env-значення, коли config не задано:
OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS - стандартно:
30000(30 секунд), максимум:120000
Gateway READY timeout restarts
Gateway READY timeout restarts
READY від gateway Discord під час запуску та після повторних підключень runtime. Налаштування з кількома обліковими записами й рознесенням старту можуть потребувати довшого стартового вікна READY, ніж стандартне.Параметри тайм-ауту READY:- запуск, один обліковий запис:
channels.discord.gatewayReadyTimeoutMs - запуск, кілька облікових записів:
channels.discord.accounts.<accountId>.gatewayReadyTimeoutMs - резервне env-значення для запуску, коли config не задано:
OPENCLAW_DISCORD_READY_TIMEOUT_MS - стандартно для запуску:
15000(15 секунд), максимум:120000 - runtime, один обліковий запис:
channels.discord.gatewayRuntimeReadyTimeoutMs - runtime, кілька облікових записів:
channels.discord.accounts.<accountId>.gatewayRuntimeReadyTimeoutMs - резервне env-значення для runtime, коли config не задано:
OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS - стандартно для runtime:
30000(30 секунд), максимум:120000
Permissions audit mismatches
Permissions audit mismatches
channels status --probe працюють лише для числових ID каналів.Якщо ви використовуєте slug-ключі, зіставлення в runtime все ще може працювати, але probe не може повністю перевірити дозволи.DM and pairing issues
DM and pairing issues
- DM вимкнено:
channels.discord.dm.enabled=false - політику DM вимкнено:
channels.discord.dmPolicy="disabled"(застаріле:channels.discord.dm.policy) - очікується схвалення pairing у режимі
pairing
Bot to bot loops
Bot to bot loops
channels.discord.allowBots=true, використовуйте суворі правила згадок і allowlist, щоб уникнути зациклення.
Надавайте перевагу channels.discord.allowBots="mentions", щоб приймати лише повідомлення ботів, які згадують бота.OpenClaw також постачає спільний захист від циклів ботів. Щоразу, коли allowBots дозволяє повідомленням, створеним ботами, доходити до dispatch, Discord зіставляє вхідну подію з фактами (account, channel, bot pair), а загальний pair guard пригнічує пару після перевищення налаштованого бюджету подій. Guard запобігає неконтрольованим циклам між двома ботами, які раніше доводилося зупиняти обмеженнями частоти Discord; він не впливає на розгортання з одним ботом або одноразові відповіді ботів, що залишаються в межах бюджету.Стандартні налаштування (активні, коли задано allowBots):maxEventsPerWindow: 20— пара ботів може обмінятися 20 повідомленнями в межах ковзного вікнаwindowSeconds: 60— довжина ковзного вікнаcooldownSeconds: 60— після спрацювання бюджету кожне додаткове повідомлення bot-to-bot у будь-якому напрямку відкидається протягом однієї хвилини
channels.defaults.botLoopProtection, а потім перевизначте Discord, коли легітимному workflow потрібен більший запас. Пріоритет такий:channels.discord.accounts.<account>.botLoopProtectionchannels.discord.botLoopProtectionchannels.defaults.botLoopProtection- вбудовані стандартні значення
maxEventsPerWindow, windowSeconds і cooldownSeconds.Voice STT drops with DecryptionFailed(...)
Voice STT drops with DecryptionFailed(...)
- підтримуйте OpenClaw актуальним (
openclaw update), щоб була наявна логіка відновлення приймання голосу Discord - підтвердьте
channels.discord.voice.daveEncryption=true(стандартно) - почніть із
channels.discord.voice.decryptionFailureTolerance=24(стандарт upstream) і налаштовуйте лише за потреби - стежте за журналами на наявність:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- якщо збої тривають після автоматичного повторного приєднання, зберіть журнали й порівняйте їх з upstream-історією приймання DAVE у discord.js #11419 і discord.js #11449
Довідник конфігурації
Основний довідник: Довідник конфігурації - Discord.High-signal Discord fields
High-signal Discord fields
- запуск/auth:
enabled,token,accounts.*,allowBots - політика:
groupPolicy,dm.*,guilds.*,guilds.*.channels.* - команда:
commands.native,commands.useAccessGroups,configWrites,slashCommand.* - черга подій:
eventQueue.listenerTimeout(бюджет listener),eventQueue.maxQueueSize,eventQueue.maxConcurrency - gateway:
gatewayInfoTimeoutMs,gatewayReadyTimeoutMs,gatewayRuntimeReadyTimeoutMs - відповідь/історія:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - доставлення:
textChunkLimit,chunkMode,maxLinesPerMessage - streaming:
streaming(застарілий alias:streamMode),streaming.preview.toolProgress,draftChunk,blockStreaming,blockStreamingCoalesce - медіа/повтор:
mediaMaxMb(обмежує вихідні завантаження Discord, стандартно100MB),retry - дії:
actions.* - присутність:
activity,status,activityType,activityUrl - UI:
ui.components.accentColor - функції:
threadBindings, top-levelbindings[](type: "acp"),pluralkit,execApprovals,intents,agentComponents.enabled,agentComponents.ttlMs,heartbeat,responsePrefix
Безпека й експлуатація
- Ставтеся до токенів ботів як до секретів (
DISCORD_BOT_TOKENбажано в керованих середовищах). - Надавайте Discord дозволи з найменшими необхідними привілеями.
- Якщо deploy/state команд застаріли, перезапустіть gateway і повторно перевірте за допомогою
openclaw channels status --probe.