Discord (Bot API)
Статус: готов для личных сообщений (DM) и текстовых каналов серверов (guild) через официальный шлюз Discord для ботов.Быстрая настройка (для начинающих)
- Создайте Discord-бота и скопируйте токен бота.
- В настройках приложения Discord включите Message Content Intent (и Server Members Intent, если планируете использовать списки разрешённых или поиск по именам).
- Задайте токен для OpenClaw:
- Env:
DISCORD_BOT_TOKEN=... - Или конфиг:
channels.discord.token: "...". - Если заданы оба варианта, приоритет у конфига (env используется как запасной вариант только для аккаунта по умолчанию).
- Env:
- Пригласите бота на свой сервер с правами на сообщения (создайте приватный сервер, если вам нужны только DM).
- Запустите Gateway (шлюз).
- Доступ к DM по умолчанию требует сопряжения; подтвердите код сопряжения при первом контакте.
Цели
- Общение с OpenClaw через DM в Discord или каналы серверов.
- Прямые чаты сворачиваются в основной сеанс агента (по умолчанию
agent:main:main); каналы серверов остаются изолированными какagent:<agentId>:discord:channel:<channelId>(отображаемые имена используютdiscord:<guildSlug>#<channelSlug>). - Групповые DM по умолчанию игнорируются; включаются через
channels.discord.dm.groupEnabledи при необходимости ограничиваются с помощьюchannels.discord.dm.groupChannels. - Детерминированная маршрутизация: ответы всегда возвращаются в тот канал, откуда пришли.
Как это работает
- Создайте приложение Discord → Bot, включите нужные intents (DM + сообщения серверов + содержимое сообщений) и получите токен бота.
- Пригласите бота на сервер с правами, необходимыми для чтения/отправки сообщений там, где вы хотите его использовать.
- Сконфигурируйте OpenClaw с помощью
channels.discord.token(илиDISCORD_BOT_TOKENкак запасной вариант). - Запустите Gateway (шлюз); он автоматически запускает канал Discord, когда доступен токен (сначала конфиг, затем env как запасной вариант) и
channels.discord.enabledне равноfalse.- Если предпочитаете переменные окружения, установите
DISCORD_BOT_TOKEN(блок конфига необязателен).
- Если предпочитаете переменные окружения, установите
- Прямые чаты: при доставке используйте
user:<id>(или упоминание<@id>); все реплики попадают в общий сеансmain. «Голые» числовые идентификаторы неоднозначны и отклоняются. - Каналы серверов: используйте
channel:<channelId>для доставки. Упоминания требуются по умолчанию и могут настраиваться для каждого сервера или канала. - Прямые чаты: по умолчанию защищены через
channels.discord.dm.policy(значение по умолчанию:"pairing"). Неизвестные отправители получают код сопряжения (истекает через 1 час); подтвердите черезopenclaw pairing approve discord <code>.- Чтобы сохранить старое поведение «открыто для всех»: установите
channels.discord.dm.policy="open"иchannels.discord.dm.allowFrom=["*"]. - Для жёсткого списка разрешённых: установите
channels.discord.dm.policy="allowlist"и перечислите отправителей вchannels.discord.dm.allowFrom. - Чтобы игнорировать все DM: установите
channels.discord.dm.enabled=falseилиchannels.discord.dm.policy="disabled".
- Чтобы сохранить старое поведение «открыто для всех»: установите
- Групповые DM по умолчанию игнорируются; включите через
channels.discord.dm.groupEnabledи при необходимости ограничьте с помощьюchannels.discord.dm.groupChannels. - Необязательные правила серверов: задайте
channels.discord.guilds, ключами — id сервера (предпочтительно) или slug, с правилами на уровне каналов. - Необязательные нативные команды:
commands.nativeпо умолчанию равен"auto"(включено для Discord/Telegram, выключено для Slack). Переопределяется черезchannels.discord.commands.native: true|false|"auto";falseочищает ранее зарегистрированные команды. Текстовые команды управляются черезcommands.textи должны отправляться как отдельные сообщения/.... Используйтеcommands.useAccessGroups: false, чтобы обойти проверки групп доступа для команд.- Полный список команд и конфиг: Slash commands
- Необязательная история контекста сервера: установите
channels.discord.historyLimit(по умолчанию 20, с откатом кmessages.groupChat.historyLimit), чтобы включать последние N сообщений сервера как контекст при ответе на упоминание. Установите0для отключения. - Реакции: агент может инициировать реакции через инструмент
discord(ограничиваетсяchannels.discord.actions.*).- Семантика удаления реакций: см. /tools/reactions.
- Инструмент
discordдоступен только когда текущий канал — Discord.
- Нативные команды используют изолированные ключи сеансов (
agent:<agentId>:discord:slash:<userId>), а не общий сеансmain.
<@id>.
Примечание: Slug — это нижний регистр, пробелы заменяются на -. Имена каналов приводятся к slug без ведущего #.
Примечание: Строки контекста сервера [from:] включают author.tag + id, чтобы упростить ответы с пингами.
Запись конфига
По умолчанию Discord разрешено записывать обновления конфига, инициированные/config set|unset (требуется commands.config: true).
Отключить:
Как создать собственного бота
Это настройка в «Discord Developer Portal» для запуска OpenClaw в канале сервера (guild), например#help.
1. Создайте приложение Discord + пользователя-бота
- Discord Developer Portal → Applications → New Application
- В приложении:
- Bot → Add Bot
- Скопируйте Bot Token (это значение указывается в
DISCORD_BOT_TOKEN)
2) Включите intents шлюза, необходимые OpenClaw
Discord блокирует «привилегированные intents», если вы явно их не включили. В Bot → Privileged Gateway Intents включите:- Message Content Intent (обязательно для чтения текста сообщений в большинстве серверов; без него вы увидите «Used disallowed intents» или бот подключится, но не будет реагировать)
- Server Members Intent (рекомендуется; требуется для некоторых поисков участников/пользователей и сопоставления списков разрешённых на серверах)
setPresence) использует gateway OP3 и не требует этого intent; он нужен только если вы хотите получать обновления статусов других участников сервера.
3. Сгенерируйте URL приглашения (OAuth2 URL Generator)
В приложении: OAuth2 → URL Generator Scopes- ✅
bot - ✅
applications.commands(обязательно для нативных команд)
- ✅ View Channels
- ✅ Send Messages
- ✅ Read Message History
- ✅ Embed Links
- ✅ Attach Files
- ✅ Add Reactions (необязательно, но рекомендуется)
- ✅ Use External Emojis / Stickers (необязательно; только если нужно)
4. Получите идентификаторы (guild/user/channel)
Discord везде использует числовые id; конфиг OpenClaw предпочитает id.- Discord (desktop/web) → User Settings → Advanced → включите Developer Mode
- Правый клик:
- Имя сервера → Copy Server ID (id сервера)
- Канал (например,
#help) → Copy Channel ID - Ваш пользователь → Copy User ID
5) Настройте OpenClaw
Токен
Задайте токен бота через переменную окружения (рекомендуется на серверах):DISCORD_BOT_TOKEN=...
channels.discord.accounts с токенами для каждого аккаунта и необязательным name. gateway/configuration для общего шаблона.
Список разрешённых + маршрутизация каналов
Пример «один сервер, разрешить только мне, только #help»:requireMention: trueозначает, что бот отвечает только при упоминании (рекомендуется для общих каналов).agents.list[].groupChat.mentionPatterns(илиmessages.groupChat.mentionPatterns) также считаются упоминаниями для сообщений сервера.- Переопределение для нескольких агентов: задайте шаблоны для каждого агента в
agents.list[].groupChat.mentionPatterns. - Если присутствует
channels, любой неуказанный канал по умолчанию запрещён. - Используйте запись канала
"*", чтобы применить значения по умолчанию ко всем каналам; явные записи каналов переопределяют wildcard. - Треды наследуют конфигурацию родительского канала (список разрешённых,
requireMention, навыки, промпты и т. д.), если вы явно не добавите id треда. если вы не добавите идентификатор канала потока явно. - Подсказка владельца: когда список разрешённых
usersна уровне сервера или канала совпадает с отправителем, OpenClaw считает этого отправителя владельцем в системном промпте. Для глобального владельца во всех каналах установитеcommands.ownerAllowFrom. - Сообщения, созданные ботом, по умолчанию игнорируются; установите
channels.discord.allowBots=true, чтобы разрешить их (собственные сообщения всё равно фильтруются). - Предупреждение: если вы разрешаете ответы другим ботам (
channels.discord.allowBots=true), предотвратите циклы «бот↔бот» с помощью списков разрешённыхrequireMention,channels.discord.guilds.*.channels.<id>.usersи/или очистите ограничители вAGENTS.mdиSOUL.md.
6. Проверьте работу
- Запустите Gateway (шлюз).
- В канале сервера отправьте:
@Krill hello(или имя вашего бота). - Если ничего не происходит: проверьте раздел Устранение неполадок ниже.
Устранение неполадок
- Сначала: выполните
openclaw doctorиopenclaw channels status --probe(предупреждения с действиями + быстрые проверки). - «Used disallowed intents»: включите Message Content Intent (и, вероятно, Server Members Intent) в Developer Portal, затем перезапустите Gateway (шлюз).
- Бот подключается, но не отвечает в канале сервера:
- Отсутствует Message Content Intent, или
- У бота нет прав канала (View/Send/Read History), или
- Конфиг требует упоминаний, а вы не упомянули бота, или
- Список разрешённых сервера/канала запрещает канал/пользователя.
requireMention: false, но ответов всё равно нет:channels.discord.groupPolicyпо умолчанию равен allowlist; установите"open"или добавьте запись сервера вchannels.discord.guilds(при необходимости перечислите каналы вchannels.discord.guilds.<id>.channelsдля ограничения).- Если вы установили только
DISCORD_BOT_TOKENи никогда не создавали разделchannels.discord, во время выполнения значениеgroupPolicyпо умолчанию устанавливается вopen. Добавьтеchannels.discord.groupPolicy,channels.defaults.groupPolicyили список разрешённых сервера/канала, чтобы зафиксировать ограничения.
- Если вы установили только
requireMentionдолжен находиться подchannels.discord.guilds(или конкретным каналом).channels.discord.requireMentionна верхнем уровне игнорируется.- Аудиты прав (
channels status --probe) проверяют только числовые id каналов. Если вы используете slug/имена как ключиchannels.discord.guilds.*.channels, аудит не сможет проверить права. - DM не работают:
channels.discord.dm.enabled=false,channels.discord.dm.policy="disabled"или вы ещё не одобрены (channels.discord.dm.policy="pairing"). - Подтверждения выполнения (exec approvals) в Discord: Discord поддерживает UI с кнопками для подтверждений в DM (Allow once / Always allow / Deny).
/approve <id> ...используется только для пересылаемых подтверждений и не решает запросы с кнопками Discord. Если вы видите❌ Failed to submit approval: Error: unknown approval idили UI не появляется, проверьте:channels.discord.execApprovals.enabled: trueв конфиге.- Ваш Discord user id указан в
channels.discord.execApprovals.approvers(UI отправляется только утверждающим). - Используйте кнопки в DM (Allow once, Always allow, Deny).
- См. Exec approvals и Slash commands для общего потока подтверждений и команд.
Возможности и ограничения
- DM и текстовые каналы серверов (треды считаются отдельными каналами; голос не поддерживается).
- Индикаторы набора текста отправляются по возможности; разбиение сообщений использует
channels.discord.textChunkLimit(по умолчанию 2000) и делит длинные ответы по количеству строк (channels.discord.maxLinesPerMessage, по умолчанию 17). - Необязательное разбиение по переносам строк: установите
channels.discord.chunkMode="newline", чтобы сначала делить по пустым строкам (границы абзацев), а затем по длине. - Загрузка файлов поддерживается до настроенного значения
channels.discord.mediaMaxMb(по умолчанию 8 МБ). - Ответы в каналах серверов по умолчанию требуют упоминания, чтобы избежать «шумных» ботов.
- Контекст ответа внедряется, когда сообщение ссылается на другое сообщение (цитируемое содержимое + id).
- Нативное тредирование ответов выключено по умолчанию; включается через
channels.discord.replyToModeи теги ответов.
Политика повторов
Исходящие вызовы Discord API повторяются при ограничениях скорости (429) с использованием Discordretry_after при наличии, с экспоненциальной задержкой и jitter. Настраивается через channels.discord.retry. См. Retry policy.
Конфиг
messages.ackReaction +
messages.ackReactionScope. Используйте messages.removeAckAfterReply, чтобы очистить
реакцию подтверждения после ответа бота.
dm.enabled: установитеfalse, чтобы игнорировать все DM (по умолчаниюtrue).dm.policy: контроль доступа к DM (рекомендуетсяpairing)."open"требуетdm.allowFrom=["*"].dm.allowFrom: список разрешённых для DM (id пользователей или имена). Используетсяdm.policy="allowlist"и для проверкиdm.policy="open". Мастер настройки принимает имена пользователей и разрешает их в id, когда бот может искать участников.dm.groupEnabled: включить групповые DM (по умолчаниюfalse).dm.groupChannels: необязательный список разрешённых для id или slug каналов групповых DM.groupPolicy: управление обработкой каналов серверов (open|disabled|allowlist);allowlistтребует списков разрешённых каналов.guilds: правила на уровне сервера, ключи — id сервера (предпочтительно) или slug.guilds."*": настройки сервера по умолчанию, применяемые при отсутствии явной записи.guilds.<id>.slug: необязательный дружелюбный slug для отображаемых имён.guilds.<id>.users: необязательный список разрешённых пользователей сервера (id или имена).guilds.<id>.tools: необязательные переопределения политик инструментов на уровне сервера (allow/deny/alsoAllow), используемые при отсутствии переопределения канала.guilds.<id>.toolsBySender: необязательные переопределения политик инструментов на уровне отправителя в пределах сервера (применяется при отсутствии переопределения канала; поддерживается wildcard"*").guilds.<id>.channels.<channel>.allow: разрешить/запретить канал приgroupPolicy="allowlist".guilds.<id>.channels.<channel>.requireMention: требование упоминания для канала.guilds.<id>.channels.<channel>.tools: необязательные переопределения политик инструментов на уровне канала (allow/deny/alsoAllow).guilds.<id>.channels.<channel>.toolsBySender: необязательные переопределения политик инструментов для отправителя внутри канала (поддерживается wildcard"*").guilds.<id>.channels.<channel>.users: необязательный список разрешённых пользователей канала.guilds.<id>.channels.<channel>.skills: фильтр навыков (не указано = все навыки, пусто = ни одного).guilds.<id>.channels.<channel>.systemPrompt: дополнительный системный промпт для канала. Темы каналов Discord внедряются как недоверенный контекст (не системный промпт).guilds.<id>.channels.<channel>.enabled: установитеfalse, чтобы отключить канал.guilds.<id>.channels: правила каналов (ключи — slug или id каналов).guilds.<id>.requireMention: требование упоминания на уровне сервера (можно переопределить на уровне канала).guilds.<id>.reactionNotifications: режим системных событий реакций (off,own,all,allowlist).textChunkLimit: размер чанка исходящего текста (символы). По умолчанию: 2000.chunkMode:length(по умолчанию) делит только при превышенииtextChunkLimit;newlineделит по пустым строкам (границы абзацев) перед делением по длине.maxLinesPerMessage: мягкий максимум строк на сообщение. По умолчанию: 17.mediaMaxMb: ограничение входящих медиа, сохраняемых на диск.historyLimit: количество последних сообщений сервера для включения в контекст при ответе на упоминание (по умолчанию 20; с откатом кmessages.groupChat.historyLimit;0отключает).dmHistoryLimit: лимит истории DM в пользовательских репликах. Переопределения для пользователей:dms["<user_id>"].historyLimit.retry: политика повторов для исходящих вызовов Discord API (attempts, minDelayMs, maxDelayMs, jitter).pluralkit: разрешать PluralKit-проксированные сообщения так, чтобы участники системы отображались как отдельные отправители.actions: ограничения инструментов по действиям; не указывайте, чтобы разрешить всё (установитеfalseдля отключения).reactions(покрывает реакции + чтение реакций)stickers,emojiUploads,stickerUploads,polls,permissions,messages,threads,pins,searchmemberInfo,roleInfo,channelInfo,voiceStatus,eventschannels(создание/редактирование/удаление каналов + категорий + прав)roles(добавление/удаление ролей, по умолчаниюfalse)moderation(таймаут/кик/бан, по умолчаниюfalse)presence(статус/активность бота, по умолчаниюfalse)
execApprovals: подтверждения выполнения (exec approvals) только для Discord в DM (UI с кнопками). Поддерживаетenabled,approvers,agentFilter,sessionFilter.
guilds.<id>.reactionNotifications:
off: без событий реакций.own: реакции на собственные сообщения бота (по умолчанию).all: все реакции на все сообщения.allowlist: реакции отguilds.<id>.usersна всех сообщениях (пустой список отключает).
Поддержка PluralKit (PK)
Включите поиск PK, чтобы проксированные сообщения разрешались к исходной системе и участнику. При включении OpenClaw использует идентичность участника для списков разрешённых и помечает отправителя какMember (PK:System), чтобы избежать случайных пингов в Discord.
- Используйте
pk:<memberId>вdm.allowFrom,guilds.<id>.usersили вusersна уровне канала. - Отображаемые имена участников также сопоставляются по имени/slug.
- Поиск использует оригинальный ID сообщения Discord (до проксирования), поэтому API PK разрешает его только в пределах 30 минут.
- Если поиск PK не удался (например, приватная система без токена), проксированные сообщения
считаются сообщениями бота и отбрасываются, если не задано
channels.discord.allowBots=true.
Значения по умолчанию для действий инструментов
| Группа действий | По умолчанию | Примечания |
|---|---|---|
| reactions | enabled | Реакции + список реакций + emojiList |
| stickers | enabled | Отправка стикеров |
| emojiUploads | enabled | Загрузить эмодзи |
| stickerUploads | enabled | Загрузка стикеров |
| polls | enabled | Создание опросов |
| permissions | enabled | Снимок прав канала |
| messages | enabled | Чтение/отправка/редактирование/удаление |
| threads | enabled | Создание/список/ответ |
| pins | enabled | Закрепить/открепить/список |
| search | enabled | Поиск сообщений (preview-функция) |
| memberInfo | enabled | Информация об участнике |
| roleInfo | enabled | Список ролей |
| channelInfo | enabled | Информация о канале + список |
| channels | включено | Управление каналами/категориями |
| voiceStatus | включено | Просмотр состояния голоса |
| events | включено | Список/создание запланированных событий |
| роли | отключено | Добавление/удаление ролей |
| модерация | отключено | Таймаут/кик/бан |
| присутствие | отключено | Статус/активность бота (setPresence) |
replyToMode:off(по умолчанию),firstилиall. Применяется только когда модель включает тег ответа.
Теги ответов
Чтобы запросить ответ в треде, модель может включить один тег в выводе:[[reply_to_current]]— ответить на инициирующее сообщение Discord.[[reply_to:<id>]]— ответить на конкретный id сообщения из контекста/истории. Текущие id сообщений добавляются к промптам как[message_id: …]; записи истории уже включают id.
channels.discord.replyToMode:
off: игнорировать теги.first: только первый исходящий чанк/вложение является ответом.all: каждый исходящий чанк/вложение является ответом.
allowFrom/users/groupChannelsпринимают id, имена, теги или упоминания вроде<@id>.- Поддерживаются префиксы
discord:/user:(пользователи) иchannel:(групповые DM). - Используйте
*, чтобы разрешить любого отправителя/канал. - При наличии
guilds.<id>.channelsканалы, не перечисленные, запрещены по умолчанию. - Если
guilds.<id>.channelsопущен, разрешены все каналы в сервере из списка разрешённых. - Чтобы не разрешать ни одного канала, установите
channels.discord.groupPolicy: "disabled"(или оставьте пустой список разрешённых). - Мастер настройки принимает имена
Guild/Channel(публичные + приватные) и по возможности разрешает их в ID. - При запуске OpenClaw разрешает имена каналов/пользователей в списках разрешённых в ID (когда бот может искать участников) и логирует соответствие; неразрешённые записи сохраняются как введены.
- Зарегистрированные команды зеркалируют чат-команды OpenClaw.
- Нативные команды учитывают те же списки разрешённых, что и DM/сообщения серверов (
channels.discord.dm.allowFrom,channels.discord.guilds, правила каналов). - Slash-команды могут быть видны в UI Discord пользователям вне списков разрешённых; OpenClaw проверяет доступ при выполнении и отвечает «not authorized».
Действия инструментов
Агент может вызыватьdiscord с действиями, такими как:
react/reactions(добавить или перечислить реакции)sticker,poll,permissionsreadMessages,sendMessage,editMessage,deleteMessage- Полезные нагрузки инструментов чтения/поиска/закрепления включают нормализованные
timestampMs(UTC epoch ms) иtimestampUtcвместе с «сырыми» Discordtimestamp. threadCreate,threadList,threadReplypinMessage,unpinMessage,listPinssearchMessages,memberInfo,roleInfo,roleAdd,roleRemove,emojiListchannelInfo,channelList,voiceStatus,eventList,eventCreatetimeout,kick,bansetPresence(активность бота и онлайн-статус)
[discord message id: …] и строки истории), чтобы агент мог на них нацеливаться.
Эмодзи могут быть unicode (например, ✅) или в синтаксисе кастомных эмодзи, как <:party_blob:1234567890>.
Безопасность и эксплуатация
- Обращайтесь с токеном бота как с паролем; предпочтительна переменная окружения
DISCORD_BOT_TOKENна контролируемых хостах или строгие права доступа к файлу конфига. - Выдавайте боту только необходимые права (обычно Read/Send Messages).
- Если бот завис или упёрся в лимиты, перезапустите Gateway (шлюз) (
openclaw gateway --force), убедившись, что никакие другие процессы не владеют сессией Discord.