Mainstream messaging

Discord

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

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

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

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

    На порталі розробників Discord натисніть New Application і вкажіть назву (наприклад, «OpenClaw»).

    Відкрийте Bot на бічній панелі та задайте для Username ім’я свого агента.

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

    Залишаючись на сторінці Bot, у розділі Privileged Gateway Intents увімкніть:

    • Message Content Intent (обов’язково)
    • Server Members Intent (рекомендовано; обов’язково для списків дозволених ролей, зіставлення імен з ідентифікаторами та груп доступу до аудиторії каналу)
    • Presence Intent (необов’язково; лише для оновлень присутності)
  • Скопіюйте токен бота

    На сторінці Bot натисніть Reset Token і скопіюйте токен.

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

    Відкрийте OAuth2 на бічній панелі. У розділі OAuth2 URL Generator увімкніть області доступу:

    • bot
    • applications.commands

    У розділі Bot Permissions, що з’явиться, увімкніть щонайменше:

    Загальні дозволи

    • Перегляд каналів

    Дозволи для тексту

    • Надсилання повідомлень
    • Читання історії повідомлень
    • Вбудовування посилань
    • Прикріплення файлів
    • Додавання реакцій (необов’язково)

    Це базовий набір для звичайних текстових каналів. Якщо бот публікуватиме повідомлення в гілках, зокрема в робочих процесах форумів або медіаканалів, які створюють чи продовжують гілку, також увімкніть Send Messages in Threads.

    Скопіюйте створену URL-адресу, відкрийте її в браузері, виберіть свій сервер і натисніть Continue. Тепер бот має з’явитися на вашому сервері.

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

    У застосунку Discord увімкніть режим розробника, щоб мати змогу копіювати ідентифікатори:

    1. User Settings (піктограма шестерні) → Developer → увімкніть Developer Mode (на мобільному пристрої: App SettingsAdvanced)
    2. Клацніть правою кнопкою миші піктограму сервераCopy Server ID
    3. Клацніть правою кнопкою миші власний аватарCopy User ID

    Збережіть ідентифікатор сервера та ідентифікатор користувача разом із токеном бота; на наступному кроці знадобляться всі три значення.

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

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

    Не вимикайте цей параметр, якщо використовуєте особисті повідомлення Discord з OpenClaw. Якщо ви використовуєте лише канали сервера, його можна вимкнути після сполучення.

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

    Токен бота є секретом. Задайте його на комп’ютері, де працює OpenClaw, перш ніж надсилати повідомлення агенту:

    bash
    export DISCORD_BOT_TOKEN="YOUR_BOT_TOKEN"cat > discord.patch.json5 <<'JSON5'{channels: {discord: {  enabled: true,  token: { source: "env", provider: "default", id: "DISCORD_BOT_TOKEN" },},},}JSON5openclaw config patch --file ./discord.patch.json5 --dry-runopenclaw config patch --file ./discord.patch.json5openclaw gateway

    Якщо OpenClaw уже працює як фонова служба, перезапустіть його через застосунок OpenClaw для Mac або зупинивши й повторно запустивши процес openclaw gateway run. Для керованих інсталяцій служби виконайте openclaw gateway install в оболонці, де задано DISCORD_BOT_TOKEN, або збережіть змінну у ~/.openclaw/.env, щоб служба могла розпізнати env SecretRef після перезапуску. Якщо ваш хост заблокований або обмежений за частотою запитів під час початкового пошуку застосунку Discord, задайте ідентифікатор застосунку/клієнта з порталу розробників, щоб під час запуску можна було пропустити цей виклик REST: channels.discord.applicationId для облікового запису за замовчуванням або channels.discord.accounts.<accountId>.applicationId для кожного бота.

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

    Попросіть свого агента

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

    «Я вже задав токен свого бота Discord у конфігурації. Заверши налаштування Discord з ідентифікатором користувача <user_id> та ідентифікатором сервера <server_id>».

    CLI / конфігурація

    Файлова конфігурація:

    json5
    {channels: {discord: {enabled: true,token: {source: "env",provider: "default",id: "DISCORD_BOT_TOKEN",},},},}

    Резервне значення зі змінної середовища для облікового запису за замовчуванням:

    bash
    DISCORD_BOT_TOKEN=...

    Для сценарного або віддаленого налаштування запишіть той самий блок JSON5 за допомогою openclaw config patch --file ./discord.patch.json5 --dry-run, а потім повторіть команду без --dry-run. Звичайні текстові рядки token також працюють, а для channels.discord.token підтримуються значення SecretRef від постачальників env/file/exec. Див. Керування секретами.

    Для кількох ботів Discord зберігайте токен та ідентифікатор застосунку кожного бота в його обліковому записі. Значення верхнього рівня channels.discord.applicationId успадковується обліковими записами, тому задавайте його там лише тоді, коли всі облікові записи використовують однаковий ідентифікатор застосунку.

    json5
    {channels: {discord: {enabled: true,accounts: {personal: {  token: { source: "env", provider: "default", id: "DISCORD_PERSONAL_TOKEN" },  applicationId: "111111111111111111",},work: {  token: { source: "env", provider: "default", id: "DISCORD_WORK_TOKEN" },  applicationId: "222222222222222222",},},},},}
  • Підтвердьте перше сполучення через особисті повідомлення

    Після запуску Gateway надішліть боту особисте повідомлення в Discord. Він відповість кодом сполучення.

    Попросіть свого агента

    Надішліть код сполучення своєму агенту в наявному каналі:

    «Підтвердь цей код сполучення Discord: &lt;CODE&gt;»

    CLI

    bash
    openclaw pairing list discordopenclaw pairing approve discord &lt;CODE&gt;

    Термін дії кодів сполучення становить 1 годину. Після підтвердження спілкуйтеся зі своїм агентом в особистих повідомленнях Discord.

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

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

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

    Це дає агенту змогу відповідати в будь-якому каналі вашого сервера, а не лише в особистих повідомленнях.

    Попросіть свого агента

    «Додай ідентифікатор мого сервера Discord <server_id> до списку дозволених серверів»

    Конфігурація

    json5
    {channels: {discord: {groupPolicy: "allowlist",guilds: {YOUR_SERVER_ID: {  requireMention: true,  users: ["YOUR_USER_ID"],},},},},}
  • Дозвольте відповіді без @згадки

    За замовчуванням агент відповідає в каналах сервера лише тоді, коли його @згадують. На приватному сервері ви, імовірно, захочете, щоб він відповідав на кожне повідомлення.

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

    Якщо Discord показує індикатор набору тексту, а журнали — використання токенів, але повідомлення не публікується, перевірте, чи хід налаштовано як фонову подію кімнати або чи ввімкнено видимі відповіді через інструмент повідомлень.

    Попросіть свого агента

    «Дозволь моєму агенту відповідати на цьому сервері без необхідності @згадки»

    Конфігурація

    Задайте requireMention: false у конфігурації свого сервера:

    json5
    {channels: {discord: {guilds: {YOUR_SERVER_ID: {  requireMention: false,},},},},}

    Щоб вимагати надсилання через інструмент повідомлень для видимих відповідей у групах/каналах, задайте messages.groupChat.visibleReplies: "message_tool".

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

    Довгострокова пам’ять (MEMORY.md) автоматично завантажується лише в сеансах особистих повідомлень; канали сервера її не завантажують.

    Попросіть свого агента

    «Коли я ставлю запитання в каналах Discord, використовуй memory_search або memory_get, якщо тобі потрібен довгостроковий контекст із MEMORY.md».

    Вручну

    Для спільного контексту в кожному каналі розмістіть сталі інструкції в AGENTS.md або USER.md (вони додаються до кожного сеансу). Зберігайте довгострокові нотатки в MEMORY.md і за потреби отримуйте до них доступ за допомогою інструментів пам’яті.

  • Тепер створіть канали та почніть спілкування. Агент бачить назву каналу, а кожен канал є ізольованим сеансом — налаштуйте #coding, #home, #research або будь-які інші канали відповідно до свого робочого процесу.

    Модель виконання

    • Gateway керує підключенням до Discord.
    • Маршрутизація відповідей детермінована: відповіді на вхідні повідомлення Discord надсилаються назад у Discord.
    • Метадані сервера/каналу Discord додаються до запиту моделі як недовірений контекст, а не як видимий користувачеві префікс відповіді. Якщо модель копіює цю оболонку у відповідь, OpenClaw видаляє скопійовані метадані з вихідних відповідей і з контексту майбутнього відтворення.
    • За замовчуванням (session.dmScope=main) прямі чати спільно використовують основний сеанс агента (agent:main:main).
    • Канали сервера мають ізольовані ключі сеансів (agent:<agentId>:discord:channel:<channelId>).
    • Групові особисті повідомлення за замовчуванням ігноруються (channels.discord.dm.groupEnabled=false).
    • Вбудовані команди з косою рискою виконуються в ізольованих сеансах команд (agent:<agentId>:discord:slash:<userId>), водночас передаючи CommandTargetSessionKey до сеансу розмови, визначеного маршрутизацією.
    • Доставка текстових оголошень Cron/Heartbeat у Discord зводиться до остаточної видимої відповіді асистента, яка надсилається один раз. Медіадані та структуровані корисні навантаження компонентів залишаються багатоповідомленнєвими, коли агент створює кілька корисних навантажень для доставки.

    Канали форумів

    Канали форумів і медіаканали Discord приймають лише дописи в гілках. OpenClaw підтримує два способи їх створення:

    • Надішліть повідомлення до батьківського форуму (channel:<forumId>) для автоматичного створення гілки. Назвою гілки стане перший непорожній рядок повідомлення (обрізаний відповідно до обмеження Discord у 100 символів для назви гілки).
    • Використовуйте openclaw message thread create, щоб створити гілку безпосередньо. Не передавайте --message-id для форумних каналів.

    Надішліть повідомлення до батьківського форуму, щоб створити гілку:

    bash
    openclaw message send --channel discord --target channel:<forumId> \  --message "Topic title\nBody of the post"

    Створіть форумну гілку явно:

    bash
    openclaw message thread create --channel discord --target channel:<forumId> \  --thread-name "Topic title" --message "Body of the post"

    Батьківські форуми не приймають компоненти Discord. Якщо вам потрібні компоненти, надсилайте їх до самої гілки (channel:<threadId>).

    Інтерактивні компоненти

    OpenClaw підтримує контейнери компонентів Discord v2 для повідомлень агента. Використовуйте інструмент повідомлень із корисним навантаженням components. Результати взаємодії надходять назад до агента як звичайні вхідні повідомлення та відповідають наявним налаштуванням Discord replyToMode.

    Підтримувані блоки:

    • text, section, separator, actions, media-gallery, file
    • Рядки дій допускають до 5 кнопок або одне меню вибору
    • Типи вибору: string, user, role, mentionable, channel

    За замовчуванням компоненти можна використати лише один раз. Установіть components.reusable=true, щоб кнопки, елементи вибору та форми можна було використовувати кілька разів до завершення терміну їхньої дії.

    Щоб обмежити коло користувачів, які можуть натиснути кнопку, установіть для неї allowedUsers (ідентифікатори користувачів Discord, теги або *). Інші користувачі отримають тимчасове повідомлення про відмову, видиме лише їм.

    За замовчуванням термін дії зворотних викликів компонентів завершується через 30 хвилин. Установіть channels.discord.agentComponents.ttlMs, щоб змінити тривалість існування реєстру зворотних викликів для облікового запису за замовчуванням, або channels.discord.accounts.<accountId>.agentComponents.ttlMs для окремого облікового запису. Значення задається в мілісекундах, має бути додатним цілим числом і обмежується 86400000 (24 години). Довший термін дії підходить для процесів перевірки та схвалення, у яких кнопки мають залишатися доступними, але він подовжує період, протягом якого старе повідомлення Discord усе ще може ініціювати дію. Вибирайте найкоротший придатний термін дії та зберігайте значення за замовчуванням, якщо застарілі зворотні виклики можуть спричинити неочікувану поведінку.

    Команди з косою рискою /model і /models відкривають інтерактивний засіб вибору моделі з розкривними списками постачальника, моделі та сумісного середовища виконання, а також кроком Submit. Команда /models add застаріла й замість реєстрації моделей із чату повертає повідомлення про припинення підтримки. Відповідь засобу вибору є тимчасовою, видимою лише користувачу, який викликав команду, і доступна тільки йому. Меню вибору Discord обмежені 25 варіантами, тому додавайте записи provider/* до agents.defaults.models, якщо хочете, щоб засіб вибору показував динамічно виявлені моделі лише для вибраних постачальників, як-от openai або vllm.

    Вкладені файли:

    • Блоки file мають указувати на посилання на вкладення (attachment://<filename>)
    • Надайте вкладення через media/path/filePath (один файл); для кількох файлів використовуйте media-gallery
    • Використовуйте filename, щоб перевизначити назву завантажуваного файлу, коли вона має відповідати посиланню на вкладення

    Модальні форми:

    • Додайте components.modal, що містить до 5 полів
    • Типи полів: text, checkbox, radio, select, role-select, user-select
    • OpenClaw автоматично додає кнопку запуску

    Приклад:

    json5
    {  channel: "discord",  action: "send",  to: "channel:123456789012345678",  message: "Optional fallback text",  components: {    reusable: true,    text: "Choose a path",    blocks: [      {        type: "actions",        buttons: [          {            label: "Approve",            style: "success",            allowedUsers: ["123456789012345678"],          },          { label: "Decline", style: "danger" },        ],      },      {        type: "actions",        select: {          type: "string",          placeholder: "Pick an option",          options: [            { label: "Option A", value: "a" },            { label: "Option B", value: "b" },          ],        },      },    ],    modal: {      title: "Details",      triggerLabel: "Open form",      fields: [        { type: "text", label: "Requester" },        {          type: "select",          label: "Priority",          options: [            { label: "Low", value: "low" },            { label: "High", value: "high" },          ],        },      ],    },  },}

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

    Політика особистих повідомлень

    channels.discord.dmPolicy керує доступом до особистих повідомлень. channels.discord.allowFrom — канонічний список дозволених відправників особистих повідомлень.

    • pairing (за замовчуванням)
    • allowlist (потрібен принаймні один відправник у allowFrom)
    • open (потрібно, щоб channels.discord.allowFrom містив "*")
    • disabled

    Якщо політика особистих повідомлень не є відкритою, невідомі користувачі блокуються (або отримують запит на сполучення в режимі pairing).

    Пріоритет для кількох облікових записів:

    • channels.discord.accounts.default.allowFrom застосовується лише до облікового запису default.
    • Для одного облікового запису allowFrom має пріоритет над застарілим dm.allowFrom.
    • Іменовані облікові записи успадковують channels.discord.allowFrom, якщо їхні власні allowFrom і застарілий dm.allowFrom не задані.
    • Іменовані облікові записи не успадковують channels.discord.accounts.default.allowFrom.

    Застарілі channels.discord.dm.policy і channels.discord.dm.allowFrom усе ще зчитуються для сумісності. openclaw doctor --fix переносить їх до dmPolicy і allowFrom, коли це можна зробити без зміни доступу.

    Формат цілі особистого повідомлення для доставлення:

    • user:<id>
    • згадка <@id>

    Прості числові ідентифікатори зазвичай розпізнаються як ідентифікатори каналів, коли активне типове значення каналу, але ідентифікатори, зазначені в ефективному списку allowFrom для особистих повідомлень облікового запису, для сумісності обробляються як цілі особистих повідомлень користувачів.

    Групи доступу

    Для авторизації особистих повідомлень і текстових команд Discord можна використовувати динамічні записи accessGroup:<name> у channels.discord.allowFrom.

    Назви груп доступу є спільними для всіх каналів повідомлень. Використовуйте type: "message.senders" для статичної групи, учасники якої задаються звичайним для кожного каналу синтаксисом allowFrom, або type: "discord.channelAudience", коли поточна аудиторія ViewChannel каналу Discord має динамічно визначати належність до групи. Спільна поведінка груп доступу: Групи доступу.

    json5
    {accessGroups: {operators: {  type: "message.senders",  members: {    "*": ["global-owner-id"],    discord: ["discord:123456789012345678"],    telegram: ["987654321"],  },},},channels: {discord: {  dmPolicy: "allowlist",  allowFrom: ["accessGroup:operators"],},},}

    Текстовий канал Discord не має окремого списку учасників. type: "discord.channelAudience" моделює належність так: відправник особистого повідомлення є учасником налаштованої гільдії та наразі має ефективний дозвіл ViewChannel для налаштованого каналу після застосування перевизначень ролей і каналу.

    Приклад: дозволити всім, хто бачить #maintainers, надсилати боту особисті повідомлення, водночас залишивши їх закритими для всіх інших.

    json5
    {accessGroups: {maintainers: {  type: "discord.channelAudience",  guildId: "1456350064065904867",  channelId: "1456744319972282449",  membership: "canViewChannel",},},channels: {discord: {  dmPolicy: "allowlist",  allowFrom: ["accessGroup:maintainers"],},},}

    Можна поєднувати динамічні та статичні записи:

    json5
    {accessGroups: {maintainers: {  type: "discord.channelAudience",  guildId: "1456350064065904867",  channelId: "1456744319972282449",},},channels: {discord: {  dmPolicy: "allowlist",  allowFrom: ["accessGroup:maintainers", "discord:123456789012345678"],},},}

    У разі помилки пошуку доступ забороняється. Якщо Discord повертає Missing Access, пошук учасника завершується помилкою або канал належить іншій гільдії, відправник особистого повідомлення вважається неавторизованим.

    Увімкніть Server Members Intent у Discord Developer Portal під час використання груп доступу на основі аудиторії каналу. Особисті повідомлення не містять стану учасника гільдії, тому під час авторизації OpenClaw отримує дані учасника через Discord REST.

    Політика гільдій

    Обробкою гільдій керує channels.discord.groupPolicy:

    • open
    • allowlist
    • disabled

    Безпечним базовим значенням за наявності channels.discord є allowlist.

    Поведінка allowlist:

    • гільдія має відповідати channels.discord.guilds (бажано використовувати id, також приймається коротка назва)
    • необов’язкові списки дозволених відправників: users (рекомендовано стабільні ідентифікатори) і roles (лише ідентифікатори ролей); якщо налаштовано хоча б один із них, відправники отримують доступ, коли відповідають users АБО roles
    • пряме зіставлення імен і тегів за замовчуванням вимкнене; вмикайте channels.discord.dangerouslyAllowNameMatching: true лише як аварійний режим сумісності
    • імена й теги підтримуються для users, але ідентифікатори безпечніші; openclaw security audit попереджає про використання записів з іменами або тегами
    • якщо для гільдії налаштовано channels, канали поза списком забороняються
    • якщо гільдія не має блоку channels, дозволяються всі канали цієї гільдії зі списку дозволених

    Приклад:

    json5
    {channels: {discord: {  groupPolicy: "allowlist",  guilds: {    "123456789012345678": {      requireMention: true,      ignoreOtherMentions: true,      users: ["987654321098765432"],      roles: ["123456789012345678"],      channels: {        general: { enabled: true },        help: { enabled: true, requireMention: true },      },    },  },},},}

    Застарілий ключ allow для окремого каналу переноситься до enabled командою openclaw doctor --fix.

    Якщо ви встановили лише DISCORD_BOT_TOKEN і не створили блок channels.discord, резервним значенням під час виконання буде groupPolicy="allowlist" (із попередженням у журналах), навіть якщо channels.defaults.groupPolicy має значення open.

    Згадки та групові особисті повідомлення

    Повідомлення гільдій за замовчуванням потребують згадки.

    Виявлення згадок охоплює:

    • явну згадку бота
    • налаштовані шаблони згадок (agents.list[].groupChat.mentionPatterns, із резервним використанням messages.groupChat.mentionPatterns)
    • неявну поведінку відповіді боту в підтримуваних випадках

    Під час написання вихідних повідомлень Discord використовуйте канонічний синтаксис згадок: <@USER_ID> для користувачів, <#CHANNEL_ID> для каналів і <@&ROLE_ID> для ролей. Не використовуйте застарілу форму згадки псевдоніма <@!USER_ID>.

    requireMention налаштовується для окремої гільдії або каналу (channels.discord.guilds...). ignoreOtherMentions дає змогу відкидати повідомлення, які згадують іншого користувача чи роль, але не бота (за винятком @everyone/@here).

    Групові особисті повідомлення:

    • за замовчуванням: ігноруються (dm.groupEnabled=false)
    • необов’язковий список дозволених через dm.groupChannels (ідентифікатори або короткі назви каналів)

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

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

    json5
    {  bindings: [    {      agentId: "opus",      match: {        channel: "discord",        guildId: "123456789012345678",        roles: ["111111111111111111"],      },    },    {      agentId: "sonnet",      match: {        channel: "discord",        guildId: "123456789012345678",      },    },  ],}

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

    • commands.native за замовчуванням має значення "auto" та ввімкнено для Discord.
    • Перевизначення для окремого каналу: channels.discord.commands.native.
    • commands.native=false пропускає реєстрацію та очищення слеш-команд Discord під час запуску. Раніше зареєстровані команди можуть залишатися видимими в Discord, доки ви не видалите їх із застосунку Discord.
    • Авторизація нативних команд використовує ті самі списки дозволених користувачів і політики Discord, що й звичайна обробка повідомлень.
    • Команди можуть залишатися видимими в інтерфейсі Discord для неавторизованих користувачів; під час виконання застосовується авторизація OpenClaw і надсилається відповідь «не авторизовано».
    • Налаштування слеш-команд за замовчуванням: ephemeral: true (channels.discord.slashCommand.ephemeral).

    Каталог команд і опис їхньої поведінки див. у розділі Слеш-команди.

    Відомості про функції

    Теги відповідей і нативні відповіді

    Discord підтримує теги відповідей у виводі агента:

    • [[reply_to_current]]
    • [[reply_to:<id>]]

    Керується параметром channels.discord.replyToMode:

    • off (за замовчуванням): без неявного групування відповідей у гілки; явні теги [[reply_to_*]] усе одно враховуються
    • first: додає неявне нативне посилання на відповідь до першого вихідного повідомлення Discord у межах ходу
    • all: додає його до кожного вихідного повідомлення
    • batched: додає його лише тоді, коли вхідна подія була пакетом із кількох повідомлень, об'єднаних після затримки, — корисно, якщо нативні відповіді потрібні переважно для неоднозначних чатів зі сплесками активності, а не для кожного ходу з одним повідомленням

    Ідентифікатори повідомлень доступні в контексті та історії, щоб агенти могли адресувати конкретні повідомлення.

    Попередній перегляд посилань

    За замовчуванням Discord створює розширені вбудовані блоки для URL-адрес. OpenClaw за замовчуванням приховує ці згенеровані блоки у вихідних повідомленнях Discord, тому надіслані агентом URL-адреси залишаються звичайними посиланнями, якщо ви явно не ввімкнете цю функцію:

    json5
    {channels: {discord: {  suppressEmbeds: false,},},}

    Установіть channels.discord.accounts.<id>.suppressEmbeds, щоб перевизначити налаштування для одного облікового запису. Під час надсилання через інструмент повідомлень агент також може передати suppressEmbeds: false для окремого повідомлення. Явні корисні навантаження Discord embeds не приховуються налаштуванням попереднього перегляду посилань за замовчуванням.

    Попередній перегляд потокової відповіді наживо

    OpenClaw може потоково передавати чернетки відповідей, надсилаючи тимчасове повідомлення та редагуючи його в міру надходження тексту. channels.discord.streaming.mode приймає off | partial | block | progress (значення за замовчуванням, якщо ключ streaming або застарілий ключ streamMode не задано). streamMode — застарілий псевдонім; запустіть openclaw doctor --fix, щоб перезаписати збережену конфігурацію в канонічну вкладену структуру streaming.

    json5
    {channels: {discord: {  streaming: {    mode: "progress",    progress: {      label: "auto",      maxLines: 8,      maxLineChars: 120,      toolProgress: true,      commentary: false,    },  },},},}
    • off вимикає редагування попереднього перегляду в Discord.
    • partial редагує одне повідомлення попереднього перегляду в міру надходження токенів.
    • block надсилає фрагменти розміром із чернетку; налаштуйте розмір і точки розриву за допомогою streaming.preview.chunk (minChars, maxChars, breakPreference), з обмеженням до textChunkLimit. Коли блокове потокове передавання ввімкнено явно, OpenClaw пропускає потік попереднього перегляду, щоб уникнути подвійного потокового передавання.
    • progress зберігає одну редаговану чернетку стану та оновлює її даними про перебіг виконання інструментів до остаточного доставлення; спільна початкова мітка є рухомим рядком, тому після появи достатнього обсягу роботи вона прокручується за межі видимої області разом з рештою вмісту.
    • Остаточні відповіді з медіафайлами, помилками або явною адресацією скасовують очікувані редагування попереднього перегляду.
    • streaming.preview.toolProgress (за замовчуванням true) визначає, чи оновлення інструментів і перебігу виконання повторно використовують повідомлення попереднього перегляду.
    • Рядки інструментів і перебігу виконання відображаються у стислому форматі: емодзі + заголовок + подробиці, якщо вони доступні, наприклад 🛠️ Bash: run tests або 🔎 Web Search: for "query".
    • streaming.progress.commentary (за замовчуванням false) вмикає текст коментарів або вступу асистента в тимчасовій чернетці перебігу виконання. Перед відображенням коментарі очищуються, залишаються тимчасовими та не змінюють доставлення остаточної відповіді.
    • streaming.progress.maxLineChars визначає ліміт символів для кожного рядка попереднього перегляду перебігу виконання. Звичайний текст скорочується за межами слів; у подробицях команд і шляхів зберігаються корисні закінчення.
    • streaming.preview.commandText / streaming.progress.commandText керує подробицями команд і виконання у стислих рядках перебігу: raw (за замовчуванням) або status (лише мітка інструмента).

    Щоб приховати необроблений текст команд і виконання, зберігши стислі рядки перебігу:

    json
    {  "channels": {    "discord": {      "streaming": {        "mode": "progress",        "progress": {          "toolProgress": true,          "commandText": "status"        }      }    }  }}

    Потоковий попередній перегляд підтримує лише текст; для відповідей із медіафайлами використовується звичайне доставлення.

    Історія, контекст і поведінка гілок

    Контекст історії сервера:

    • значення channels.discord.historyLimit за замовчуванням — 20
    • резервне значення: messages.groupChat.historyLimit
    • 0 вимикає

    Керування історією приватних повідомлень:

    • channels.discord.dmHistoryLimit
    • channels.discord.dms["<user_id>"].historyLimit

    Поведінка гілок:

    • Гілки Discord маршрутизуються як сеанси каналів і успадковують конфігурацію батьківського каналу, якщо її не перевизначено.
    • Сеанси гілок успадковують вибір /model на рівні сеансу батьківського каналу лише як резервний варіант моделі; локальний вибір /model у гілці має вищий пріоритет, а історія стенограми батьківського каналу не копіюється, якщо не ввімкнено успадкування стенограми.
    • channels.discord.thread.inheritParent (за замовчуванням false) вмикає початкове заповнення нових автоматичних гілок із батьківської стенограми. Перевизначення для окремого облікового запису: channels.discord.accounts.<id>.thread.inheritParent.
    • Реакції інструмента повідомлень можуть визначати цілі приватних повідомлень user:<id>.
    • guilds.<guild>.channels.<channel>.requireMention: false зберігається під час резервної активації на етапі відповіді.

    Теми каналів додаються як ненадійний контекст. Списки дозволених користувачів визначають, хто може активувати агента, але не є повною межею редагування додаткового контексту.

    Сеанси підагентів, прив'язані до гілок

    Discord може прив'язати гілку до цільового сеансу, щоб наступні повідомлення в цій гілці й надалі маршрутизувалися до того самого сеансу, зокрема до сеансів підагентів.

    Команди:

    • /focus <target> прив'язує поточну або нову гілку до цілі підагента чи сеансу
    • /unfocus видаляє прив'язку поточної гілки
    • /agents показує активні запуски та стан прив'язки
    • /session idle <duration|off> переглядає або оновлює автоматичне зняття фокуса через неактивність для сфокусованих прив'язок
    • /session max-age <duration|off> переглядає або оновлює жорсткий максимальний вік сфокусованих прив'язок

    Конфігурація:

    json5
    {session: {threadBindings: {  enabled: true,  idleHours: 24,  maxAgeHours: 0,},},channels: {discord: {  threadBindings: {    enabled: true,    idleHours: 24,    maxAgeHours: 0,    spawnSessions: true,    defaultSpawnContext: "fork",  },},},}

    Примітки:

    • session.threadBindings.* задає глобальні значення за замовчуванням; channels.discord.threadBindings.* перевизначає поведінку Discord.
    • spawnSessions керує автоматичним створенням і прив'язуванням гілок для sessions_spawn({ thread: true }) і створення гілок ACP. Значення за замовчуванням: true.
    • defaultSpawnContext керує нативним контекстом підагента для запусків, прив'язаних до гілок. Значення за замовчуванням: "fork".
    • Застарілі ключі spawnSubagentSessions/spawnAcpSessions мігруються командою openclaw doctor --fix.
    • Якщо прив'язки гілок вимкнено для облікового запису, /focus і пов'язані операції прив'язування гілок недоступні.

    Див. Підагенти, Агенти ACP і Довідник із конфігурації.

    Постійні прив'язки каналів ACP

    Для стабільних, постійно активних робочих просторів ACP налаштуйте типізовані прив'язки ACP верхнього рівня, націлені на розмови Discord.

    Шлях конфігурації: bindings[] із type: "acp" і match.channel: "discord".

    json5
    {agents: {list: [  {    id: "codex",    runtime: {      type: "acp",      acp: {        agent: "codex",        backend: "acpx",        mode: "persistent",        cwd: "/workspace/openclaw",      },    },  },],},bindings: [{  type: "acp",  agentId: "codex",  match: {    channel: "discord",    accountId: "default",    peer: { kind: "channel", id: "222222222222222222" },  },  acp: { label: "codex-main" },},],channels: {discord: {  guilds: {    "111111111111111111": {      channels: {        "222222222222222222": {          requireMention: false,        },      },    },  },},},}

    Примітки:

    • /acp spawn codex --bind here прив'язує поточний канал або гілку безпосередньо та залишає майбутні повідомлення в тому самому сеансі ACP. Повідомлення гілки успадковують прив'язку батьківського каналу.
    • У прив'язаному каналі або гілці /new і /reset скидають той самий сеанс ACP без зміни прив'язки. Тимчасові прив'язки гілок можуть перевизначати визначення цілі, доки вони активні.
    • spawnSessions регулює створення й прив'язування дочірніх гілок через --thread auto|here.

    Докладніше про поведінку прив'язок див. у розділі Агенти ACP.

    Сповіщення про реакції

    Режим сповіщень про реакції для окремого сервера (guilds.<id>.reactionNotifications):

    • off
    • own (за замовчуванням)
    • all
    • allowlist (використовує guilds.<id>.users)

    Події реакцій перетворюються на системні події та додаються до маршрутизованого сеансу Discord.

    Реакції-підтвердження

    ackReaction надсилає емодзі-підтвердження, поки OpenClaw обробляє вхідне повідомлення.

    Порядок визначення:

    • channels.discord.accounts.<accountId>.ackReaction
    • channels.discord.ackReaction
    • messages.ackReaction
    • резервний емодзі ідентичності агента (agents.list[].identity.emoji, інакше "👀")

    Примітки:

    • Discord приймає емодзі Unicode або назви власних емодзі.
    • Використовуйте "", щоб вимкнути реакцію для каналу або облікового запису.

    Область дії (messages.ackReactionScope):

    Значення: "all" (приватні повідомлення + групи, включно з фоновими подіями кімнат), "direct" (лише приватні повідомлення), "group-all" (усі групові повідомлення, крім фонових подій кімнат, без приватних повідомлень), "group-mentions" (групи, коли згадано бота; без приватних повідомлень, значення за замовчуванням), "off" / "none" (вимкнено).

    Запис конфігурації

    Запис конфігурації, ініційований каналом, увімкнено за замовчуванням. Це впливає на сценарії /config set|unset, коли функції команд увімкнено.

    Щоб вимкнути:

    json5
    {channels: {discord: {  configWrites: false,},},}
    Проксі Gateway

    Спрямовуйте WebSocket-трафік шлюзу Discord і початкові REST-запити під час запуску (ідентифікатор застосунку + визначення списку дозволених користувачів) через HTTP(S)-проксі за допомогою channels.discord.proxy. Проксіювання WebSocket шлюзу Discord налаштовується явно; WebSocket-з'єднання не успадковують змінні середовища проксі з процесу Gateway. Початкові REST-запити використовують цей проксі, коли налаштовано channels.discord.proxy.

    json5
    {channels: {discord: {  proxy: "http://proxy.example:8080",},},}

    Перевизначення для окремого облікового запису:

    json5
    {channels: {discord: {  accounts: {    primary: {      proxy: "http://proxy.example:8080",    },  },},},}
    Підтримка PluralKit

    Увімкніть визначення PluralKit, щоб зіставляти проксійовані повідомлення з ідентичністю учасника системи:

    json5
    {channels: {discord: {  pluralkit: {    enabled: true,    token: "pk_live_...", // необов’язково; потрібно для приватних систем  },},},}

    Примітки:

    • у списках дозволених значень можна використовувати pk:<memberId>
    • відображувані імена учасників зіставляються за іменем/slug лише тоді, коли встановлено channels.discord.dangerouslyAllowNameMatching: true
    • пошук надсилає запит до API PluralKit з початковим ідентифікатором повідомлення
    • якщо пошук завершується невдало, проксійовані повідомлення вважаються повідомленнями ботів і відкидаються, якщо allowBots не дозволяє їх пропускати
    Псевдоніми вихідних згадок

    Використовуйте mentionAliases, коли агентам потрібні детерміновані вихідні згадки відомих користувачів Discord. Ключі — це ідентифікатори без початкового символу @; значення — ідентифікатори користувачів Discord. Невідомі ідентифікатори, @everyone, @here і згадки всередині фрагментів коду Markdown залишаються без змін.

    json5
    {channels: {discord: {  mentionAliases: {    SupportLead: "123456789012345678",  },  accounts: {    ops: {      mentionAliases: {        OpsLead: "234567890123456789",      },    },  },},},}
    Налаштування присутності

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

    Лише стан:

    json5
    {channels: {discord: {  status: "idle",},},}

    Активність (власний стан є стандартним типом активності, коли задано activity):

    json5
    {channels: {discord: {  activity: "Час зосередженої роботи",  activityType: 4,},},}

    Потокова трансляція:

    json5
    {channels: {discord: {  activity: "Програмування наживо",  activityType: 1,  activityUrl: "https://twitch.tv/openclaw",},},}

    Відповідність типів активності:

    • 0: Грає
    • 1: Транслює (потребує activityUrl; водночас activityUrl потребує activityType: 1)
    • 2: Слухає
    • 3: Дивиться
    • 4: Власний (використовує текст активності як стан; емодзі необов’язковий)
    • 5: Змагається

    Автоматична присутність (сигнал працездатності середовища виконання):

    json5
    {channels: {discord: {  autoPresence: {    enabled: true,    intervalMs: 30000,    minUpdateIntervalMs: 15000,    exhaustedText: "токен вичерпано",  },},},}

    Автоматична присутність зіставляє доступність середовища виконання зі станом Discord: справне => онлайн, погіршене або невідоме => неактивний, вичерпане або недоступне => не турбувати. Стандартні значення: intervalMs 30000, minUpdateIntervalMs 15000 (має бути меншим або дорівнювати intervalMs). Необов’язкові перевизначення тексту:

    • autoPresence.healthyText
    • autoPresence.degradedText
    • autoPresence.exhaustedText (підтримує заповнювач {reason})
    Схвалення в Discord

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

    Шлях конфігурації:

    • channels.discord.execApprovals.enabled
    • channels.discord.execApprovals.approvers (необов’язково; за можливості використовує commands.ownerAllowFrom як запасний варіант)
    • channels.discord.execApprovals.target (dm | channel | both, стандартно: dm)
    • agentFilter, sessionFilter, cleanupAfterResolve

    Discord автоматично вмикає нативні схвалення виконання, коли enabled не задано або має значення "auto" і можна визначити принаймні одного схвалювача — або з execApprovals.approvers, або з commands.ownerAllowFrom. Discord не визначає схвалювачів виконання зі значень allowFrom каналу, застарілого dm.allowFrom чи defaultTo приватних повідомлень. Установіть enabled: false, щоб явно вимкнути Discord як нативний клієнт схвалення.

    Для конфіденційних групових команд лише для власника, як-от /diagnostics і /export-trajectory, OpenClaw надсилає запити на схвалення та остаточні результати приватно. Спочатку він намагається використати приватні повідомлення Discord, якщо власник, який викликав команду, має маршрут власника Discord; інакше використовується перший доступний маршрут власника з commands.ownerAllowFrom, наприклад Telegram.

    Коли target має значення channel або both, запит на схвалення видимий у каналі. Кнопками можуть користуватися лише визначені схвалювачі; інші користувачі отримують ефемерну відмову. Запити на схвалення містять текст команди, тому вмикайте доставлення в канал лише в довірених каналах. Якщо ідентифікатор каналу неможливо отримати з ключа сеансу, OpenClaw використовує доставлення через приватні повідомлення як запасний варіант.

    Discord відображає спільні кнопки схвалення, які використовують інші канали чату; нативний адаптер Discord переважно додає маршрутизацію приватних повідомлень схвалювачам і розсилання в канали. Коли ці кнопки присутні, вони є основним інтерфейсом схвалення; OpenClaw має додавати ручну команду /approve лише тоді, коли результат інструмента вказує, що схвалення в чаті недоступні або ручне схвалення є єдиним способом. Якщо нативне середовище схвалення Discord неактивне, OpenClaw залишає видимим локальний детермінований запит /approve <id> <decision>. Якщо середовище активне, але нативну картку неможливо доставити жодному одержувачу, OpenClaw надсилає в той самий чат резервне сповіщення з точною командою /approve з очікуваного схвалення.

    Автентифікація Gateway і визначення схвалень відповідають спільному контракту клієнта Gateway (ідентифікатори plugin: визначаються через plugin.approval.resolve; інші ідентифікатори — через exec.approval.resolve). Стандартний строк дії схвалень — 30 хвилин.

    Див. Схвалення виконання.

    Інструменти та обмеження дій

    Дії з повідомленнями Discord охоплюють обмін повідомленнями, адміністрування каналів, модерацію, присутність і метадані.

    Основні приклади:

    • обмін повідомленнями: sendMessage, readMessages, editMessage, deleteMessage, threadReply
    • реакції: react, reactions, emojiList
    • модерація: timeout, kick, ban
    • присутність: setPresence

    Дія event-create приймає необов’язковий параметр image (URL або шлях до локального файлу), щоб установити зображення обкладинки запланованої події.

    Обмеження дій розташовані в channels.discord.actions.*.

    Стандартна поведінка обмежень:

    Група дій Стандартно
    reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions увімкнено
    roles вимкнено
    moderation вимкнено
    presence вимкнено

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

    OpenClaw використовує компоненти Discord v2 для схвалень виконання та маркерів між контекстами. Дії з повідомленнями Discord також можуть приймати components для власного інтерфейсу (розширене використання; потребує створення корисного навантаження компонента через інструмент Discord), тоді як застарілі embeds залишаються доступними, але не рекомендовані.

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

    Приклад:

    json5
    {  channels: {    discord: {      ui: {        components: {          accentColor: "#5865F2",        },      },    },  },}

    Голос

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

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

    Контрольний список налаштування:

    1. Увімкніть Message Content Intent у Discord Developer Portal.
    2. Увімкніть Server Members Intent, коли використовуються списки дозволених ролей/користувачів.
    3. Запросіть бота з областями доступу bot і applications.commands.
    4. Надайте дозволи Connect, Speak, Send Messages і Read Message History у цільовому голосовому каналі.
    5. Увімкніть нативні команди (commands.native або channels.discord.commands.native).
    6. Налаштуйте channels.discord.voice.

    Використовуйте /vc join|leave|status для керування сеансами. Команда використовує стандартного агента облікового запису та дотримується тих самих правил списку дозволених значень і групової політики, що й інші команди Discord.

    bash
    /vc join channel:<voice-channel-id>/vc status/vc leave

    Щоб перевірити фактичні дозволи бота перед приєднанням:

    bash
    openclaw channels capabilities --channel discord --target channel:<voice-channel-id>

    Приклад автоматичного приєднання:

    json5
    {  channels: {    discord: {      voice: {        enabled: true,        model: "openai/gpt-5.6-sol",        autoJoin: [          {            guildId: "123456789012345678",            channelId: "234567890123456789",          },        ],        allowedChannels: [          {            guildId: "123456789012345678",            channelId: "234567890123456789",          },        ],        daveEncryption: true,        decryptionFailureTolerance: 24,        connectTimeoutMs: 30000,        reconnectGraceMs: 15000,        realtime: {          provider: "openai",          model: "gpt-realtime-2.1",          speakerVoice: "cedar",        },      },    },  },}

    Примітки:

    • Голосові функції Discord є опціональними для конфігурацій лише з текстовим режимом; установіть channels.discord.voice.enabled=true (або збережіть наявний блок channels.discord.voice), щоб увімкнути команди /vc, голосове середовище виконання та намір Gateway GuildVoiceStates. channels.discord.intents.voiceStates дає змогу явно перевизначити підписку на намір; не задавайте його, щоб він відповідав фактичному стану ввімкнення голосових функцій.
    • voice.mode керує шляхом розмови. Типове значення — agent-proxy: інтерфейс голосової взаємодії в реальному часі керує черговістю реплік, перериванням і відтворенням, делегує змістовну роботу спрямованому агенту OpenClaw через openclaw_agent_consult і обробляє результат як текстовий запит Discord від цього мовця. stt-tts зберігає старіший пакетний процес STT із подальшим TTS. bidi дає моделі реального часу змогу вести розмову безпосередньо, надаючи openclaw_agent_consult для звернення до інтелекту OpenClaw.
    • voice.agentSession визначає, яка розмова OpenClaw отримує голосові репліки. Не задавайте його, щоб використовувати власний сеанс голосового каналу, або встановіть { mode: "target", target: "channel:<text-channel-id>" }, щоб голосовий канал слугував розширенням мікрофона й динаміка для наявного сеансу текстового каналу Discord, наприклад #maintainers.
    • voice.model перевизначає модель агента OpenClaw для голосових відповідей Discord і консультацій у реальному часі. Не задавайте його, щоб успадкувати модель спрямованого агента. Цей параметр відокремлений від voice.realtime.model.
    • voice.followUsers дає боту змогу приєднуватися до вибраних користувачів у голосових каналах Discord, переміщуватися разом із ними та виходити. Див. Слідування за користувачами в голосових каналах.
    • agent-proxy спрямовує мовлення через discord-voice, який зберігає звичайну авторизацію власника й інструментів для мовця та цільового сеансу, але приховує інструмент агента tts, оскільки відтворенням керує голосовий компонент Discord. Типово agent-proxy надає консультації повний доступ до інструментів, еквівалентний доступу власника, для мовців-власників (voice.realtime.toolPolicy: "owner") і наполегливо віддає перевагу консультації з агентом OpenClaw перед змістовними відповідями (voice.realtime.consultPolicy: "always"). У типовому режимі always шар реального часу не промовляє автоматично заповнювальні фрази перед відповіддю консультації; він захоплює й транскрибує мовлення, а потім озвучує відповідь спрямованого агента OpenClaw. Якщо кілька відповідей примусової консультації завершуються, поки Discord ще відтворює першу відповідь, наступні відповіді з точним текстом мовлення стають у чергу до завершення відтворення, а не замінюють мовлення посеред речення.
    • У режимі stt-tts STT використовує tools.media.audio; voice.model не впливає на транскрибування.
    • У режимах реального часу voice.realtime.provider, voice.realtime.model і voice.realtime.speakerVoice налаштовують аудіосеанс реального часу. Для OpenAI Realtime 2.1 разом з інтелектом Codex використовуйте voice.realtime.model: "gpt-realtime-2.1" і voice.model: "openai/gpt-5.6-sol".
    • Режими голосової взаємодії в реальному часі типово включають невеликі файли профілю IDENTITY.md, USER.md і SOUL.md до інструкцій постачальника реального часу, щоб швидкі прямі репліки зберігали ту саму ідентичність, прив’язку до користувача та особистість, що й спрямований агент OpenClaw. Установіть voice.realtime.bootstrapContextFiles у потрібну підмножину, щоб налаштувати це, або [], щоб вимкнути. Підтримуються лише ці файли профілю; AGENTS.md залишається у звичайному контексті агента. Доданий контекст профілю не замінює openclaw_agent_consult для роботи з робочим простором, актуальними фактами, пошуком у пам’яті чи діями на основі інструментів.
    • У режимі реального часу OpenAI agent-proxy установіть voice.realtime.requireWakeName: true, щоб голосовий компонент реального часу Discord мовчав, доки транскрипт не почнеться або не завершиться словом активації. Налаштовані слова активації мають складатися з одного або двох слів. Якщо voice.realtime.wakeNames не задано, OpenClaw використовує name спрямованого агента разом із OpenClaw, а за його відсутності — ідентифікатор агента разом із OpenClaw. Фільтрація за словом активації вимикає автоматичну відповідь постачальника реального часу, спрямовує прийняті репліки через шлях консультації з агентом OpenClaw і надає коротке голосове підтвердження, коли початкове слово активації розпізнано з часткової транскрипції до надходження остаточного транскрипту.
    • Постачальник реального часу OpenAI приймає поточні назви подій Realtime 2 і застарілі сумісні з Codex псевдоніми для подій вихідного аудіо й транскрипту, тому сумісні знімки стану постачальника можуть змінюватися без втрати аудіо асистента.
    • voice.realtime.bargeIn визначає, чи переривають події початку мовлення в Discord активне відтворення в реальному часі. Якщо параметр не задано, він відповідає налаштуванню переривання вхідним аудіо постачальника реального часу.
    • voice.realtime.minBargeInAudioEndMs визначає мінімальну тривалість відтворення відповіді асистента, після якої переривання в реальному часі OpenAI обрізає аудіо. Типове значення: 250. Установіть 0 для негайного переривання в приміщеннях із низьким рівнем відлуння або збільште значення для конфігурацій динаміків із сильним відлунням.
    • voice.tts перевизначає messages.tts лише для голосового відтворення stt-tts; натомість режими реального часу використовують voice.realtime.speakerVoice. Щоб використовувати голос OpenAI для відтворення в Discord, установіть voice.tts.provider: "openai" і виберіть голос синтезу мовлення в voice.tts.providers.openai.speakerVoice. cedar — вдалий варіант із чоловічим звучанням у поточній моделі TTS OpenAI.
    • Перевизначення systemPrompt для окремих каналів Discord застосовуються до реплік із голосових транскриптів відповідного голосового каналу.
    • Для команд і дій каналу, доступних лише власнику, статус власника для реплік із голосових транскриптів визначається за allowFrom (або dm.allowFrom) у Discord. Видимість інструментів агента відповідає налаштованій політиці інструментів спрямованого сеансу.
    • Якщо voice.autoJoin містить кілька записів для однієї гільдії, OpenClaw приєднується до останнього налаштованого каналу цієї гільдії.
    • voice.allowedChannels — необов’язковий список дозволених каналів перебування. Не задавайте його, щоб дозволити /vc join для будь-якого авторизованого голосового каналу Discord. Якщо його задано, /vc join, автоматичне приєднання під час запуску й переміщення бота між голосовими каналами обмежуються переліченими записами { guildId, channelId }. Установіть порожній масив, щоб заборонити всі приєднання до голосових каналів Discord. Якщо Discord перемістить бота за межі списку дозволених каналів, OpenClaw вийде з цього каналу й повторно приєднається до налаштованого цільового каналу автоматичного приєднання, якщо він доступний.
    • voice.daveEncryption і voice.decryptionFailureTolerance передаються до параметрів приєднання @discordjs/voice; типові значення у вихідній бібліотеці — daveEncryption=true і decryptionFailureTolerance=24.
    • OpenClaw використовує вбудований кодек libopus-wasm для отримання голосового аудіо Discord і відтворення необробленого PCM у реальному часі. Він постачається із зафіксованою версією збірки libopus для WebAssembly і не потребує нативних доповнень opus.
    • voice.connectTimeoutMs визначає час початкового очікування стану Ready від @discordjs/voice для /vc join і спроб автоматичного приєднання. Типове значення: 30000.
    • voice.reconnectGraceMs визначає, скільки часу OpenClaw очікує початку повторного підключення від’єднаного голосового сеансу, перш ніж знищити його. Типове значення: 15000.
    • У режимі stt-tts голосове відтворення не зупиняється лише через те, що інший користувач почав говорити. Щоб уникнути циклів зворотного зв’язку, OpenClaw ігнорує нове захоплення голосу під час відтворення TTS; для наступної репліки говоріть після завершення відтворення. Режими реального часу передають початок мовлення як сигнали переривання постачальнику реального часу.
    • У режимах реального часу відлуння від динаміків у відкритий мікрофон може сприйматися як переривання й зупиняти відтворення. Для приміщень Discord із сильним відлунням установіть voice.realtime.providers.openai.interruptResponseOnInputAudio: false, щоб OpenAI не переривав відповідь автоматично через вхідне аудіо. Додайте voice.realtime.bargeIn: true, якщо все одно хочете, щоб події початку мовлення в Discord переривали активне відтворення. Міст реального часу OpenAI ігнорує обрізання відтворення, коротші за voice.realtime.minBargeInAudioEndMs, вважаючи їх імовірним відлунням або шумом, і записує їх у журнал як пропущені замість очищення відтворення Discord.
    • voice.captureSilenceGraceMs визначає, скільки часу OpenClaw очікує після повідомлення Discord про завершення мовлення, перш ніж завершити цей аудіосегмент для STT. Типове значення: 2000; збільште його, якщо Discord розбиває звичайні паузи на уривчасті часткові транскрипти.
    • Коли вибрано постачальника TTS ElevenLabs, голосове відтворення Discord використовує потоковий TTS і починається безпосередньо з потоку відповіді постачальника. Постачальники без підтримки потокового передавання повертаються до шляху через синтезований тимчасовий файл.
    • OpenClaw відстежує помилки розшифрування отриманих даних і автоматично відновлюється, виходячи з голосового каналу та повторно приєднуючись до нього після кількох помилок за короткий проміжок часу.
    • Якщо після оновлення в журналах отримання багаторазово з’являється DecryptionFailed(UnencryptedWhenPassthroughDisabled), зберіть звіт про залежності та журнали. Вбудована версія @discordjs/voice містить виправлення доповнення з PR discord.js №11449, яке закрило проблему discord.js №11419.
    • Події отримання The operation was aborted очікувані, коли OpenClaw завершує захоплений сегмент мовця; це докладні діагностичні повідомлення, а не попередження.
    • Докладні журнали голосових функцій Discord містять обмежений однорядковий попередній перегляд транскрипту STT для кожного прийнятого сегмента мовця, тож під час налагодження видно як репліку користувача, так і відповідь агента без виведення необмеженого тексту транскрипту.
    • У режимі agent-proxy резервна примусова консультація пропускає ймовірно незавершені фрагменти транскрипту, наприклад текст, що закінчується на ... або сполучник на кшталт "і", а також очевидні завершальні фрази, що не потребують дій, як-от "зараз повернуся" чи "бувай". Коли це запобігає використанню застарілої відповіді з черги, у журналах з’являється forced agent consult skipped reason=....

    Слідування за користувачами в голосових каналах

    Використовуйте voice.followUsers, якщо потрібно, щоб голосовий бот Discord залишався з одним або кількома відомими користувачами Discord замість приєднання до фіксованого каналу під час запуску або очікування /vc join.

    json5
    {  channels: {    discord: {      voice: {        enabled: true,        followUsersEnabled: true,        followUsers: ["discord:123456789012345678"],        allowedChannels: [          {            guildId: "123456789012345678",            channelId: "234567890123456789",          },        ],      },    },  },}

    Поведінка:

    • followUsers приймає необроблені ідентифікатори користувачів Discord і значення discord:<id>. OpenClaw нормалізує обидві форми перед зіставленням подій стану голосового каналу.
    • followUsersEnabled типово має значення true, якщо налаштовано followUsers. Установіть false, щоб зберегти список, але припинити автоматичне слідування в голосових каналах.
    • Коли відстежуваний користувач приєднується до дозволеного голосового каналу, OpenClaw приєднується до цього каналу. Коли користувач переміщується, OpenClaw переміщується разом із ним. Коли активний відстежуваний користувач від’єднується, OpenClaw виходить.
    • Якщо в одній гільдії перебуває кілька відстежуваних користувачів і активний відстежуваний користувач виходить, OpenClaw перед виходом із гільдії переходить до каналу іншого відстежуваного користувача. Якщо кілька відстежуваних користувачів переміщуються одночасно, перевагу має остання спостережена подія стану голосового каналу.
    • allowedChannels продовжує застосовуватися. Відстежуваний користувач у забороненому каналі ігнорується, а сеанс, керований слідуванням, переходить до іншого відстежуваного користувача або завершується.
    • OpenClaw узгоджує пропущені події стану голосових каналів під час запуску й через обмежені інтервали. Під час узгодження перевіряються налаштовані гільдії та обмежується кількість запитів REST за один запуск, тому дуже великим спискам followUsers може знадобитися більше одного інтервалу для досягнення узгодженого стану.
    • Якщо Discord або адміністратор переміщує бота, поки той слідує за користувачем, OpenClaw перебудовує голосовий сеанс і зберігає керування слідуванням, якщо цільовий канал дозволений. Якщо бота переміщено за межі allowedChannels, OpenClaw виходить і повторно приєднується до налаштованого цільового каналу, якщо такий існує.
    • Відновлення отримання DAVE може виходити з того самого каналу й повторно приєднуватися до нього після кількох помилок розшифрування. Сеанси, керовані слідуванням, зберігають таке керування протягом цього процесу відновлення, тому подальше від’єднання відстежуваного користувача все одно призводить до виходу з каналу.

    Виберіть один із режимів приєднання:

    • Використовуйте followUsers для особистих або операторських конфігурацій, у яких бот має автоматично перебувати в голосовому каналі разом із вами.
    • Використовуйте autoJoin для ботів у фіксованих кімнатах, які мають бути присутніми, навіть коли жодного відстежуваного користувача немає в голосовому каналі.
    • Використовуйте /vc join для одноразових приєднань або кімнат, де автоматична присутність у голосовому каналі була б несподіваною.

    Голосовий кодек Discord:

    • Журнали отримання голосу містять discord voice: opus decoder: libopus-wasm.
    • Відтворення в реальному часі кодує необроблений стереофонічний PCM із частотою 48 кГц у Opus за допомогою того самого вбудованого пакета libopus-wasm, перш ніж передавати пакети до @discordjs/voice.
    • Відтворення з файлів і потоків постачальників перекодовує дані в необроблений стереофонічний PCM із частотою 48 кГц за допомогою ffmpeg, а потім використовує libopus-wasm для потоку пакетів Opus, що надсилається до Discord.

    Конвеєр STT і TTS:

    • Захоплений у Discord PCM-звук перетворюється на тимчасовий WAV-файл.
    • tools.media.audio виконує STT, наприклад за допомогою openai/gpt-4o-mini-transcribe.
    • Транскрипт передається через вхідний потік і маршрутизацію Discord, тоді як LLM відповіді працює з політикою голосового виведення, яка приховує від агента інструмент tts і запитує повернення тексту, оскільки остаточним відтворенням TTS керує голосовий канал Discord.
    • Якщо задано voice.model, він перевизначає лише LLM відповіді для цього звернення в голосовому каналі.
    • voice.tts накладається поверх messages.tts; провайдери з підтримкою потокового передавання подають звук безпосередньо до програвача, інакше отриманий аудіофайл відтворюється в каналі, до якого приєднано бота.

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

    json5
    {  channels: {    discord: {      voice: {        enabled: true,        model: "openai/gpt-5.6-sol",        followUsersEnabled: true,        followUsers: ["123456789012345678"],        realtime: {          provider: "openai",          model: "gpt-realtime-2.1",          speakerVoice: "cedar",        },      },    },  },}

    Без блоку voice.agentSession кожен голосовий канал отримує власний маршрутизований сеанс OpenClaw. Наприклад, /vc join channel:234567890123456789 звертається до сеансу цього голосового каналу Discord. Модель реального часу є лише голосовим інтерфейсом; змістовні запити передаються налаштованому агенту OpenClaw. Якщо модель реального часу створює остаточний транскрипт без виклику інструмента консультування, OpenClaw примусово виконує консультацію як резервний варіант, щоб стандартна поведінка й надалі відповідала розмові з агентом.

    Приклад застарілого режиму STT із TTS:

    json5
    {  channels: {    discord: {      voice: {        enabled: true,        mode: "stt-tts",        model: "openai/gpt-5.4-mini",        tts: {          provider: "openai",          providers: {            openai: {              model: "gpt-4o-mini-tts",              speakerVoice: "cedar",            },          },        },      },    },  },}

    Приклад двонапрямного режиму реального часу:

    json5
    {  channels: {    discord: {      voice: {        enabled: true,        mode: "bidi",        model: "openai/gpt-5.6-sol",        realtime: {          provider: "openai",          model: "gpt-realtime-2.1",          speakerVoice: "cedar",          toolPolicy: "safe-read-only",          consultPolicy: "always",        },      },    },  },}

    Голос як розширення наявного сеансу каналу Discord:

    json5
    {  channels: {    discord: {      voice: {        enabled: true,        mode: "agent-proxy",        model: "openai/gpt-5.6-sol",        agentSession: {          mode: "target",          target: "channel:123456789012345678",        },        realtime: {          provider: "openai",          model: "gpt-realtime-2.1",          speakerVoice: "cedar",        },      },    },  },}

    У режимі agent-proxy бот приєднується до налаштованого голосового каналу, але звернення агента OpenClaw використовують звичайний маршрутизований сеанс і агента цільового каналу. Голосовий сеанс реального часу озвучує повернутий результат у голосовому каналі. Агент-керівник і надалі може використовувати звичайні інструменти повідомлень відповідно до своєї політики інструментів, зокрема надсилати окреме повідомлення Discord, якщо це доречна дія.

    Поки делегований запуск OpenClaw активний, нові голосові транскрипти Discord обробляються як оперативне керування запуском до початку наступного звернення агента. Фрази на кшталт «стан», «скасуй це», «скористайся меншим виправленням» або «коли завершиш, також перевір тести» класифікуються як запит стану, скасування, коригування або подальші вхідні дані для активного сеансу. Результати запиту стану, скасування, прийнятого коригування та подальших дій озвучуються в голосовому каналі, щоб користувач знав, чи OpenClaw опрацював запит.

    Корисні форми цілі:

    • target: "channel:123456789012345678" маршрутизує через сеанс текстового каналу Discord.
    • target: "123456789012345678" обробляється як цільовий канал.
    • target: "dm:123456789012345678" або target: "user:123456789012345678" маршрутизує через відповідний сеанс особистих повідомлень.

    Приклад OpenAI Realtime для середовища із сильним відлунням:

    json5
    {  channels: {    discord: {      voice: {        enabled: true,        mode: "bidi",        model: "openai/gpt-5.6-sol",        realtime: {          provider: "openai",          model: "gpt-realtime-2.1",          speakerVoice: "cedar",          bargeIn: true,          minBargeInAudioEndMs: 500,          consultPolicy: "always",          providers: {            openai: {              interruptResponseOnInputAudio: false,            },          },        },      },    },  },}

    Використовуйте це, коли модель чує власне відтворення Discord через відкритий мікрофон, але ви все одно хочете мати змогу переривати її голосом. OpenClaw не дозволяє OpenAI автоматично переривати відповідь через необроблений вхідний звук, а bargeIn: true дає змогу подіям початку мовлення в Discord і звуку вже активного мовця скасовувати активні відповіді реального часу до того, як наступна захоплена репліка надійде до OpenAI. Дуже ранні сигнали переривання голосом зі значенням audioEndMs, меншим за minBargeInAudioEndMs, вважаються ймовірним відлунням або шумом та ігноруються, щоб модель не обривала відповідь на першому кадрі відтворення.

    Очікувані журнали голосового режиму:

    • Під час приєднання: discord voice: joining ... voiceSession=... supervisorSession=... agentSessionMode=... voiceModel=... realtimeModel=...
    • Під час запуску режиму реального часу: discord voice: realtime bridge starting ... autoRespond=false interruptResponse=false bargeIn=false minBargeInAudioEndMs=...
    • Під час надходження звуку мовця: discord voice: realtime speaker turn opened ..., discord voice: realtime input audio started ... outputAudioMs=... outputActive=... і discord voice: realtime speaker turn closed ... chunks=... discordBytes=... realtimeBytes=... interruptedPlayback=...
    • Під час пропуску застарілого мовлення: discord voice: realtime forced agent consult skipped reason=incomplete-transcript ... або reason=non-actionable-closing ...
    • Після завершення відповіді реального часу: discord voice: realtime audio playback finishing reason=response.done ... audioMs=... chunks=...
    • Під час зупинення або скидання відтворення: discord voice: realtime audio playback stopped reason=... audioMs=... elapsedMs=... chunks=...
    • Під час консультації в режимі реального часу: discord voice: realtime consult requested ... voiceSession=... supervisorSession=... question=...
    • Після відповіді агента: discord voice: agent turn answer ...
    • Під час додавання точного тексту для озвучення до черги: discord voice: realtime exact speech queued ... queued=... outputAudioMs=... outputActive=..., після чого з’являється discord voice: realtime exact speech dequeued reason=player-idle ...
    • Після виявлення переривання голосом: discord voice: realtime barge-in detected source=speaker-start ... або discord voice: realtime barge-in detected source=active-speaker-audio ..., після чого з’являється discord voice: realtime barge-in requested reason=... outputAudioMs=... outputActive=...
    • Під час переривання режиму реального часу: discord voice: realtime model interrupt requested client:response.cancel reason=barge-in, після чого з’являється або discord voice: realtime model audio truncated client:conversation.item.truncate reason=barge-in audioEndMs=..., або discord voice: realtime model interrupt confirmed server:response.done status=cancelled ...
    • Під час ігнорування відлуння або шуму: discord voice: realtime model interrupt ignored client:conversation.item.truncate.skipped reason=barge-in audioEndMs=0 minAudioEndMs=250
    • Коли переривання голосом вимкнено: discord voice: realtime capture ignored during playback (barge-in disabled) ...
    • Коли відтворення неактивне: discord voice: realtime barge-in ignored reason=... outputActive=false ... playbackChunks=0

    Щоб налагодити обривання звуку, читайте журнали голосового режиму реального часу як хронологію:

    1. realtime audio playback started означає, що Discord почав відтворювати звук асистента. Від цього моменту міст починає підраховувати фрагменти вихідного звуку асистента, байти PCM Discord, байти провайдера реального часу та тривалість синтезованого звуку.
    2. realtime speaker turn opened позначає активізацію мовця в Discord. Якщо відтворення вже активне й bargeIn увімкнено, далі може з’явитися barge-in detected source=speaker-start.
    3. realtime input audio started позначає перший фактичний аудіокадр, отриманий для цієї репліки мовця. outputActive=true або ненульове значення outputAudioMs тут означає, що мікрофон надсилає вхідний звук, поки відтворення відповіді асистента ще активне.
    4. barge-in detected source=active-speaker-audio означає, що OpenClaw виявив живий звук мовця під час активного відтворення відповіді асистента. Це допомагає відрізнити справжнє переривання від події початку мовлення в Discord без корисного звуку.
    5. barge-in requested reason=... означає, що OpenClaw попросив провайдера реального часу скасувати або обрізати активну відповідь. Запис містить outputAudioMs, outputActive і playbackChunks, щоб можна було побачити, скільки звуку асистента фактично відтворилося до переривання.
    6. realtime audio playback stopped reason=... є точкою локального скидання відтворення Discord. Причина вказує, що саме зупинило відтворення: barge-in, player-idle, provider-clear-audio, forced-agent-consult, stream-close або session-close.
    7. realtime speaker turn closed підсумовує захоплену вхідну репліку. chunks=0 або hasAudio=false означає, що репліка мовця почалася, але до мосту реального часу не надійшло придатного звуку. interruptedPlayback=true означає, що ця вхідна репліка збіглася в часі з вихідним звуком асистента й запустила логіку переривання голосом.

    Корисні поля:

    • outputAudioMs: тривалість звуку асистента, створеного провайдером реального часу до цього запису журналу.
    • audioMs: тривалість звуку асистента, яку OpenClaw підрахував до зупинення відтворення.
    • elapsedMs: фактичний час між відкриттям і закриттям потоку відтворення або репліки мовця.
    • discordBytes: байти стереофонічного PCM-звуку з частотою 48 кГц, надіслані до голосового каналу Discord або отримані з нього.
    • realtimeBytes: байти PCM-звуку у форматі провайдера, надіслані провайдеру реального часу або отримані від нього.
    • playbackChunks: фрагменти звуку асистента, передані до Discord для активної відповіді.
    • sinceLastAudioMs: проміжок між останнім захопленим аудіокадром мовця та закриттям його репліки.

    Поширені сценарії:

    • Негайне обривання з source=active-speaker-audio, малим значенням outputAudioMs і тим самим користувачем поблизу зазвичай указує на потрапляння відлуння динаміка в мікрофон. Збільште voice.realtime.minBargeInAudioEndMs, зменште гучність динаміка, використовуйте навушники або задайте voice.realtime.providers.openai.interruptResponseOnInputAudio: false.
    • source=speaker-start, після якого з’являється speaker turn closed ... hasAudio=false, означає, що Discord повідомив про початок мовлення, але звук не надійшов до OpenClaw. Причиною може бути тимчасова голосова подія Discord, поведінка шумового шлюзу або короткочасне ввімкнення мікрофона клієнтом.
    • audio playback stopped reason=stream-close без близького за часом переривання голосом або provider-clear-audio означає, що локальний потік відтворення Discord несподівано завершився. Перевірте попередні журнали провайдера й програвача Discord.
    • capture ignored during playback (barge-in disabled) означає, що OpenClaw навмисно відкинув вхідний звук, поки звук асистента був активний. Увімкніть voice.realtime.bargeIn, якщо хочете, щоб мовлення переривало відтворення.
    • barge-in ignored ... outputActive=false означає, що Discord або VAD провайдера виявив мовлення, але OpenClaw не мав активного відтворення, яке можна було б перервати. Це не повинно обривати звук.

    Облікові дані визначаються окремо для кожного компонента: автентифікація маршруту LLM для voice.model, автентифікація STT для tools.media.audio, автентифікація TTS для messages.tts/voice.tts і автентифікація провайдера реального часу для voice.realtime.providers або звичайної конфігурації автентифікації провайдера.

    Голосові повідомлення

    Голосові повідомлення Discord показують попередній перегляд форми хвилі та потребують аудіо OGG/Opus. OpenClaw автоматично створює форму хвилі, але для аналізу й перетворення на хості Gateway мають бути встановлені ffmpeg і ffprobe.

    • Укажіть шлях до локального файлу (URL-адреси відхиляються).
    • Не додавайте текстовий вміст (Discord відхиляє текст і голосове повідомлення в одному корисному навантаженні).
    • Підтримується будь-який аудіоформат; за потреби OpenClaw перетворює його на OGG/Opus.
    bash
    message(action="send", channel="discord", target="channel:123", path="/path/to/audio.mp3", asVoice=true)

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

    Використано заборонені наміри або бот не бачить повідомлень сервера
    • увімкніть Message Content Intent
    • увімкніть Server Members Intent, якщо вам потрібне визначення користчів/учасників
    • перезапустіть Gateway після зміни intents
    Повідомлення сервера несподівано блокуються
    • перевірте groupPolicy
    • перевірте список дозволених серверів у channels.discord.guilds
    • якщо існує мапа channels сервера, дозволено лише перелічені канали
    • перевірте поведінку requireMention і шаблони згадок

    Корисні перевірки:

    bash
    openclaw doctoropenclaw channels status --probeopenclaw logs --follow
    Вимогу згадки вимкнено, але повідомлення все одно блокуються

    Поширені причини:

    • groupPolicy="allowlist" без відповідного списку дозволених серверів/каналів
    • requireMention налаштовано не в тому місці (має бути в channels.discord.guilds або в записі каналу)
    • відправника заблоковано списком дозволених users сервера/каналу
    Тривалі ітерації Discord або дубльовані відповіді

    Типові журнали:

    • Slow listener detected ...
    • stuck session: sessionKey=agent:...:discord:... state=processing ...

    Параметри черги Gateway Discord:

    • один обліковий запис: channels.discord.eventQueue.listenerTimeout
    • кілька облікових записів: channels.discord.accounts.<accountId>.eventQueue.listenerTimeout
    • це керує лише роботою слухача Gateway Discord, а не тривалістю ітерації агента

    Discord не застосовує власний тайм-аут каналу до поставлених у чергу ітерацій агента. Слухачі повідомлень негайно передають роботу далі, а поставлені в чергу запуски Discord зберігають порядок у межах сеансу, доки життєвий цикл сеансу, інструмента або середовища виконання не завершить чи не перерве роботу.

    json5
    {channels: {discord: {  accounts: {    default: {      eventQueue: {        listenerTimeout: 120000,      },    },  },},},}
    Попередження про тайм-аут отримання метаданих Gateway

    Перед підключенням OpenClaw отримує метадані Discord /gateway/bot. У разі тимчасових збоїв використовується стандартна URL-адреса Gateway Discord, а частота записів у журналах обмежується.

    Параметри тайм-ауту метаданих:

    • один обліковий запис: channels.discord.gatewayInfoTimeoutMs
    • кілька облікових записів: channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs
    • резервна змінна середовища, коли конфігурацію не задано: OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS
    • стандартне значення: 30000 (30 секунд), максимум: 120000
    Перезапуски через тайм-аут READY Gateway

    OpenClaw очікує на подію READY від Gateway Discord під час запуску та після повторних підключень середовища виконання. Конфігураціям із кількома обліковими записами та поетапним запуском може знадобитися довше початкове вікно READY, ніж передбачено стандартно.

    Параметри тайм-ауту READY:

    • запуск з одним обліковим записом: channels.discord.gatewayReadyTimeoutMs
    • запуск із кількома обліковими записами: channels.discord.accounts.<accountId>.gatewayReadyTimeoutMs
    • резервна змінна середовища для запуску, коли конфігурацію не задано: OPENCLAW_DISCORD_READY_TIMEOUT_MS
    • стандартне значення для запуску: 15000 (15 секунд), максимум: 120000
    • середовище виконання з одним обліковим записом: channels.discord.gatewayRuntimeReadyTimeoutMs
    • середовище виконання з кількома обліковими записами: channels.discord.accounts.<accountId>.gatewayRuntimeReadyTimeoutMs
    • резервна змінна середовища для середовища виконання, коли конфігурацію не задано: OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS
    • стандартне значення для середовища виконання: 30000 (30 секунд), максимум: 120000
    Невідповідності під час аудиту дозволів

    Перевірки дозволів channels status --probe працюють лише з числовими ідентифікаторами каналів.

    Якщо ви використовуєте текстові ключі, зіставлення під час виконання все одно може працювати, але перевірка не зможе повністю підтвердити дозволи.

    Проблеми з приватними повідомленнями та сполученням
    • приватні повідомлення вимкнено: channels.discord.dm.enabled=false
    • політику приватних повідомлень вимкнено: channels.discord.dmPolicy="disabled" (застаріле: channels.discord.dm.policy)
    • очікується схвалення сполучення в режимі pairing
    Цикли між ботами

    Стандартно повідомлення, надіслані ботами, ігноруються.

    Якщо встановити channels.discord.allowBots=true, використовуйте суворі правила згадок і списків дозволених, щоб уникнути циклічної поведінки. Надавайте перевагу channels.discord.allowBots="mentions", щоб приймати лише повідомлення ботів, які згадують цього бота.

    OpenClaw також постачається зі спільним захистом від циклів ботів. Щоразу, коли allowBots дозволяє повідомленням ботів потрапити до диспетчеризації, Discord зіставляє вхідну подію з даними (обліковий запис, канал, пара ботів), а загальний захист пари блокує її після перевищення налаштованого бюджету подій. Захист запобігає неконтрольованим циклам між двома ботами, які раніше доводилося зупиняти обмеженнями частоти Discord; він не впливає на розгортання з одним ботом або одноразові відповіді ботів, які не перевищують бюджет.

    Стандартні налаштування (активні, коли встановлено allowBots):

    • maxEventsPerWindow: 20 -- пара ботів може обмінятися 20 повідомленнями в межах ковзного вікна
    • windowSeconds: 60 -- тривалість ковзного вікна
    • cooldownSeconds: 60 -- після вичерпання бюджету кожне наступне повідомлення між ботами в будь-якому напрямку відкидається протягом однієї хвилини

    Один раз налаштуйте спільні стандартні значення в channels.defaults.botLoopProtection, а потім перевизначте їх для Discord, якщо легітимному робочому процесу потрібен більший запас. Порядок пріоритету:

    • channels.discord.accounts.<account>.botLoopProtection
    • channels.discord.botLoopProtection
    • channels.defaults.botLoopProtection
    • вбудовані стандартні значення

    Discord використовує загальні ключі maxEventsPerWindow, windowSeconds і cooldownSeconds.

    json5
    {channels: {defaults: {  botLoopProtection: {    maxEventsPerWindow: 20,    windowSeconds: 60,    cooldownSeconds: 60,  },},discord: {  // Optional Discord-wide override. Account blocks override individual  // fields and inherit omitted fields from here.  botLoopProtection: {    maxEventsPerWindow: 4,  },  accounts: {    alpha: {      // Alpha listens to other bots only when they mention it.      allowBots: "mentions",    },    bravo: {      // Bravo listens to all bot-authored Discord messages.      allowBots: true,      mentionAliases: {        // Lets Bravo write an Alpha Discord mention with the configured user id.        Alpha: "ALPHA_DISCORD_USER_ID",      },      botLoopProtection: {        // Allow up to five messages per minute before suppressing the pair.        maxEventsPerWindow: 5,        windowSeconds: 60,        cooldownSeconds: 90,      },    },  },},},}
    Втрата голосового STT через DecryptionFailed(...)
    • підтримуйте OpenClaw в актуальному стані (openclaw update), щоб була доступна логіка відновлення приймання голосу Discord
    • переконайтеся, що channels.discord.voice.daveEncryption=true (стандартне значення)
    • почніть із channels.discord.voice.decryptionFailureTolerance=24 (стандартне значення в основному проєкті) і коригуйте лише за потреби
    • відстежуйте в журналах:
      • discord voice: DAVE decrypt failures detected
      • discord voice: repeated decrypt failures; attempting rejoin
    • якщо збої тривають після автоматичного повторного приєднання, зберіть журнали та порівняйте їх з історією приймання DAVE в основному проєкті: discord.js #11419 і discord.js #11449

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

    Основний довідник: Довідник із конфігурації — Discord.

    Найважливіші поля Discord
    • запуск/автентифікація: enabled, token, applicationId, accounts.*, allowBots
    • політика: groupPolicy, dmPolicy, allowFrom, dm.*, guilds.*, guilds.*.channels.*
    • команди: commands.native, commands.useAccessGroups (глобальне), configWrites, slashCommand.ephemeral
    • черга подій: eventQueue.listenerTimeout (бюджет слухача, стандартно 120000), eventQueue.maxQueueSize (стандартно 10000), eventQueue.maxConcurrency (стандартно 50)
    • Gateway: proxy, gatewayInfoTimeoutMs, gatewayReadyTimeoutMs, gatewayRuntimeReadyTimeoutMs
    • відповіді/історія: replyToMode, historyLimit, dmHistoryLimit, dms.*.historyLimit
    • доставлення: textChunkLimit (стандартно 2000), maxLinesPerMessage (стандартно 17)
    • потокове передавання: streaming.mode, streaming.chunkMode, streaming.preview.*, streaming.progress.*, streaming.block.* (застарілі пласкі ключі streamMode, draftChunk, blockStreaming, blockStreamingCoalesce, chunkMode переносяться до streaming.* командою openclaw doctor --fix)
    • медіа/повторні спроби: mediaMaxMb (обмежує вихідні завантаження до Discord, стандартно 100), retry
    • дії: actions.*
    • присутність: activity, status, activityType, activityUrl, autoPresence.*
    • інтерфейс: ui.components.accentColor
    • функції: threadBindings, верхньорівневий bindings[] (type: "acp"), pluralkit, execApprovals, intents, agentComponents.enabled, agentComponents.ttlMs, heartbeat, responsePrefix

    Безпека та експлуатація

    • Вважайте токени ботів секретами (у керованих середовищах рекомендовано DISCORD_BOT_TOKEN).
    • Надавайте Discord дозволи за принципом найменших привілеїв.
    • Якщо розгортання або стан команд застаріли, перезапустіть Gateway і повторно перевірте за допомогою openclaw channels status --probe.

    Пов’язані матеріали

    Was this useful?
    On this page

    On this page