Перейти к основному содержимому

Платформы для обмена сообщениями

Discord

Статус: готов к работе в личных сообщениях и каналах гильдии через официальный Discord Gateway.

Быстрая настройка

Вам нужно создать новое приложение с ботом, добавить бота на ваш сервер и подключить его к OpenClaw. Мы рекомендуем добавить бота на ваш собственный приватный сервер. Если у вас его еще нет, сначала создайте его (выберите Create My Own > For me and my friends).

Шаг 1: Создайте приложение и бота Discord

Перейдите в Discord Developer Portal и нажмите New Application. Назовите его, например, "OpenClaw". Нажмите Bot на боковой панели. Установите Username на то, как вы называете своего агента OpenClaw.

Шаг 2: Включите привилегированные интенты

Оставаясь на странице Bot, прокрутите вниз до Privileged Gateway Intents и включите:

  • Message Content Intent (обязательно)
  • Server Members Intent (рекомендуется; требуется для списков разрешенных ролей и сопоставления имени с ID)
  • Presence Intent (опционально; нужно только для обновлений статуса)

Шаг 3: Скопируйте токен вашего бота

Прокрутите обратно вверх на странице Bot и нажмите Reset Token.

ℹ️ Несмотря на название, это генерирует ваш первый токен — ничего не "сбрасывается".

Скопируйте токен и сохраните его. Это ваш Bot Token, и он скоро понадобится.

Шаг 4: Сгенерируйте URL для приглашения и добавьте бота на ваш сервер

Нажмите OAuth2 на боковой панели. Вы сгенерируете URL для приглашения с правильными разрешениями, чтобы добавить бота на ваш сервер. Прокрутите вниз до OAuth2 URL Generator и включите:

  • bot
  • applications.commands

Ниже появится раздел Bot Permissions. Включите:

  • View Channels
  • Send Messages
  • Read Message History
  • Embed Links
  • Attach Files
  • Add Reactions (опционально)

Скопируйте сгенерированный URL внизу, вставьте его в браузер, выберите ваш сервер и нажмите Continue, чтобы подключить. Теперь вы должны увидеть своего бота на сервере Discord.

Шаг 5: Включите режим разработчика и соберите ваши ID

Вернитесь в приложение Discord, вам нужно включить Developer Mode, чтобы можно было копировать внутренние ID.

  1. Нажмите User Settings (значок шестеренки рядом с аватаром) → Advanced → переключите Developer Mode в положение "вкл."
  2. Щелкните правой кнопкой мыши по иконке вашего сервера на боковой панели → Copy Server ID
  3. Щелкните правой кнопкой мыши по своему аватаруCopy User ID

Сохраните ваш Server ID и User ID вместе с Bot Token — все три значения вы отправите OpenClaw на следующем шаге.

Шаг 6: Разрешите личные сообщения от участников сервера

Для работы подключения Discord должен разрешить вашему боту отправлять вам личные сообщения. Щелкните правой кнопкой мыши по иконке вашего сервераPrivacy Settings → переключите Direct Messages в положение "вкл.". Это позволяет участникам сервера (включая ботов) отправлять вам личные сообщения. Оставьте это включенным, если хотите использовать личные сообщения Discord с OpenClaw. Если вы планируете использовать только каналы гильдии, вы можете отключить личные сообщения после подключения.

Шаг 7: Шаг 0: Безопасно установите токен вашего бота (не отправляйте его в чат)

Токен вашего Discord бота — это секрет (как пароль). Установите его на машине, где запущен OpenClaw, прежде чем отправлять сообщения вашему агенту.

openclaw config set channels.discord.token '"YOUR_BOT_TOKEN"' --json
openclaw config set channels.discord.enabled true --json
openclaw gateway

Если OpenClaw уже запущен как фоновая служба, используйте вместо этого openclaw gateway restart.

Шаг 8: Настройте OpenClaw и выполните подключение

Общайтесь с вашим агентом OpenClaw на любом существующем канале (например, Telegram) и скажите ему. Если Discord — ваш первый канал, используйте вместо этого CLI / вкладку config.

“I already set my Discord bot token in config. Please finish Discord setup with User ID <user_id> and Server ID <server_id>.”

{
channels: {
discord: {
enabled: true,
token: "YOUR_BOT_TOKEN",
},
},
}

Шаг 9: Подтвердите первое подключение через личные сообщения

Дождитесь, пока шлюз запустится, затем напишите вашему боту в личные сообщения Discord. Он ответит с кодом подключения.

Отправьте код подключения вашему агенту на существующем канале:

“Approve this Discord pairing code: ``”

openclaw pairing list discord
openclaw pairing approve discord <CODE>

Коды подключения истекают через 1 час. Теперь вы должны иметь возможность общаться с вашим агентом в Discord через личные сообщения.

ℹ️ Разрешение токена учитывает аккаунт. Значения токена из конфига имеют приоритет над резервным значением из переменной окружения. DISCORD_BOT_TOKEN используется только для аккаунта по умолчанию.

Рекомендуется: Настройте рабочее пространство гильдии

Как только личные сообщения работают, вы можете настроить ваш сервер Discord как полноценное рабочее пространство, где каждый канал получает свою собственную сессию агента со своим контекстом. Это рекомендуется для приватных серверов, где есть только вы и ваш бот.

Шаг 1: Добавьте ваш сервер в список разрешенных гильдий

Это позволяет вашему агенту отвечать в любом канале на вашем сервере, а не только в личных сообщениях.

“Add my Discord Server ID <server_id> to the guild allowlist”

{
channels: {
discord: {
groupPolicy: "allowlist",
guilds: {
YOUR_SERVER_ID: {
requireMention: true,
users: ["YOUR_USER_ID"],
},
},
},
},
}

Шаг 2: Разрешите ответы без упоминания @

По умолчанию ваш агент отвечает в каналах гильдии только когда его @упоминают. Для приватного сервера вы, вероятно, хотите, чтобы он отвечал на каждое сообщение.

“Allow my agent to respond on this server without having to be @mentioned”

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

Шаг 3: Планируйте использование памяти в каналах гильдии

По умолчанию долговременная память (MEMORY.md) загружается только в сессиях личных сообщений. Каналы гильдии не загружают MEMORY.md автоматически.

“When I ask questions in Discord channels, use memory_search or memory_get if you need long-term context from MEMORY.md.”

Если вам нужен общий контекст в каждом канале, поместите стабильные инструкции в AGENTS.md или USER.md (они внедряются для каждой сессии). Храните долговременные заметки в MEMORY.md и обращайтесь к ним по запросу с помощью инструментов памяти.

Теперь создайте несколько каналов на вашем сервере Discord и начните общаться. Ваш агент видит название канала, и каждый канал получает свою изолированную сессию — так что вы можете настроить #coding, #home, #research или что угодно, что подходит вашему рабочему процессу.

Модель выполнения

  • Шлюз владеет подключением к Discord.
  • Маршрутизация ответов детерминирована: входящие сообщения из Discord возвращаются обратно в Discord.
  • По умолчанию (session.dmScope=main) прямые чаты используют основную сессию агента (agent:main:main).
  • Каналы гильдии имеют изолированные ключи сессий (agent::discord:channel:).
  • Групповые личные сообщения игнорируются по умолчанию (channels.discord.dm.groupEnabled=false).
  • Нативные слэш-команды выполняются в изолированных командных сессиях (agent::discord:slash:), при этом все еще передавая CommandTargetSessionKey в маршрутизированную сессию разговора.

Форумные каналы

Форумные и медиа-каналы Discord принимают только сообщения в ветках. OpenClaw поддерживает два способа их создания:

  • Отправьте сообщение в родительский форум (channel:), чтобы автоматически создать ветку. Заголовок ветки использует первую непустую строку вашего сообщения.
  • Используйте openclaw message thread create, чтобы создать ветку напрямую. Не передавайте --message-id для форумных каналов.

Пример: отправка в родительский форум для создания ветки

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

Пример: явное создание ветки форума

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

Родительские форумы не принимают Discord компоненты. Если вам нужны компоненты, отправляйте в саму ветку (channel:).

Интерактивные компоненты

OpenClaw поддерживает контейнеры Discord components v2 для сообщений агента. Используйте инструмент сообщений с полезной нагрузкой components. Результаты взаимодействия маршрутизируются обратно к агенту как обычные входящие сообщения и следуют существующим настройкам Discord replyToMode. Поддерживаемые блоки:

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

По умолчанию компоненты одноразовые. Установите components.reusable=true, чтобы разрешить кнопкам, выпадающим меню и формам использоваться многократно до истечения срока. Чтобы ограничить, кто может нажать кнопку, установите allowedUsers для этой кнопки (ID пользователей Discord, теги или *). При настройке неавторизованные пользователи получают эфемерный отказ. Слэш-команды /model и /models открывают интерактивный выбор модели с выпадающими списками провайдера и модели, а также шагом Submit. Ответ выбора эфемерный, и использовать его может только вызвавший пользователь. Вложения файлов:

  • Блоки file должны указывать на ссылку вложения (attachment://)
  • Предоставьте вложение через media/path/filePath (один файл); используйте media-gallery для нескольких файлов
  • Используйте filename, чтобы переопределить имя загрузки, когда оно должно совпадать со ссылкой на вложение

Модальные формы:

  • Добавьте components.modal с до 5 полей
  • Типы полей: text, checkbox, radio, select, role-select, user-select
  • OpenClaw автоматически добавляет кнопку-триггер

Пример:

{
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.dm.policy):

  • pairing (по умолчанию)
  • allowlist
  • open (требует, чтобы channels.discord.allowFrom включал "*"; устаревшее: channels.discord.dm.allowFrom)
  • disabled

Если политика личных сообщений не открыта, неизвестные пользователи блокируются (или получают запрос на подключение в режиме pairing). Приоритетность для нескольких аккаунтов:

  • channels.discord.accounts.default.allowFrom применяется только к аккаунту default.
  • Именованные аккаунты наследуют channels.discord.allowFrom, когда их собственный allowFrom не установлен.
  • Именованные аккаунты не наследуют channels.discord.accounts.default.allowFrom.

Формат цели для доставки в личные сообщения:

  • user:
  • Упоминание <@id>

Голые числовые ID неоднозначны и отклоняются, если не указан явный вид цели user/channel.

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

Сообщения в гильдии по умолчанию требуют упоминания. Обнаружение упоминаний включает:

  • явное упоминание бота
  • настроенные шаблоны упоминаний (agents.list[].groupChat.mentionPatterns, резервный messages.groupChat.mentionPatterns)
  • неявное поведение ответа-боту в поддерживаемых случаях

requireMention настраивается для каждой гильдии/канала (channels.discord.guilds...). ignoreOtherMentions опционально отбрасывает сообщения, которые упоминают другого пользователя/роль, но не бота (исключая @everyone/@here). Групповые личные сообщения:

  • по умолчанию: игнорируются (dm.groupEnabled=false)
  • опциональный список разрешений через dm.groupChannels (ID каналов или слаг)

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

Используйте bindings[].match.roles, чтобы направлять участников гильдии Discord к разным агентам по ID роли. Привязки на основе ролей принимают только ID ролей и оцениваются после привязок peer или parent-peer и до привязок только для гильдии. Если привязка также устанавливает другие поля соответствия (например, peer + guildId + roles), все настроенные поля должны совпадать.

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

Настройка в Developer Portal

  1. Discord Developer Portal -> Applications -> New Application
  2. Bot -> Add Bot
  3. Скопируйте токен бота

В Bot -> Privileged Gateway Intents включите:

  • Message Content Intent
  • Server Members Intent (рекомендуется)

Интент Presence опционален и требуется только если вы хотите получать обновления статуса. Установка статуса бота (setPresence) не требует включения обновлений статуса для участников.

Генератор URL OAuth:

  • области: bot, applications.commands

Типичные базовые разрешения:

  • View Channels
  • Send Messages
  • Read Message History
  • Embed Links
  • Attach Files
  • Add Reactions (опционально)

Избегайте Administrator, если это явно не требуется.

Включите Discord Developer Mode, затем скопируйте:

  • ID сервера
  • ID канала
  • ID пользователя

Предпочитайте числовые ID в конфиге OpenClaw для надежного аудита и проверок.

Нативные команды и авторизация команд

  • commands.native по умолчанию "auto" и включен для Discord.
  • Переопределение для канала: channels.discord.commands.native.
  • commands.native=false явно очищает ранее зарегистрированные нативные команды Discord.
  • Авторизация нативных команд использует те же списки разрешений/политики Discord, что и обычная обработка сообщений.
  • Команды все еще могут быть видны в интерфейсе Discord для пользователей, которые не авторизованы; выполнение все равно применяет авторизацию OpenClaw и возвращает "not authorized".

См. Слэш-команды для каталога команд и поведения. Настройки слэш-команд по умолчанию:

  • ephemeral: true

Детали функций

Discord поддерживает теги ответов в выводе агента:

  • [[reply_to_current]]
  • [[reply_to:]]

Управляется через channels.discord.replyToMode:

  • off (по умолчанию)
  • first
  • all

Примечание: off отключает неявное создание цепочек ответов. Явные теги [[reply_to_*]] все еще учитываются. ID сообщений передаются в контекст/историю, чтобы агенты могли нацеливаться на конкретные сообщения.

OpenClaw может транслировать черновики ответов, отправляя временное сообщение и редактируя его по мере поступления текста.

  • channels.discord.streaming управляет потоковым предпросмотром (off | partial | block | progress, по умолчанию: off).
  • progress принимается для согласованности между каналами и преобразуется в partial на Discord.
  • channels.discord.streamMode — это устаревший псевдоним и автоматически мигрируется.
  • partial редактирует одно сообщение предпросмотра по мере поступления токенов.
  • block отправляет фрагменты размером с черновик (используйте draftChunk для настройки размера и точек разрыва).

Пример:

{
channels: {
discord: {
streaming: "partial",
},
},
}

Настройки фрагментации для режима block по умолчанию (ограничены channels.discord.textChunkLimit):

{
channels: {
discord: {
streaming: "block",
draftChunk: {
minChars: 200,
maxChars: 800,
breakPreference: "paragraph",
},
},
},
}

Потоковый предпросмотр только для текста; ответы с медиа возвращаются к обычной доставке. Примечание: потоковый предпросмотр отделен от потоковой передачи блоками. Когда потоковая передача блоками явно включена для Discord, OpenClaw пропускает поток предпросмотра, чтобы избежать двойной потоковой передачи.

Контекст истории гильдии:

  • channels.discord.historyLimit по умолчанию 20
  • резервный: messages.groupChat.historyLimit
  • 0 отключает

Управление историей личных сообщений:

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

Поведение веток:

  • Ветки Discord маршрутизируются как сессии каналов
  • Метаданные родительской ветки могут использоваться для связи с родительской сессией
  • Конфигурация ветки наследует конфигурацию родительского канала, если не существует записи, специфичной для ветки

Темы каналов внедряются как ненадежный контекст (не как системный промпт).

Discord может привязать ветку к цели сессии, чтобы последующие сообщения в этой ветке продолжали маршрутизироваться к той же сессии (включая сессии суб-агентов). Команды:

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

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

{
session: {
threadBindings: {
enabled: true,
idleHours: 24,
maxAgeHours: 0,
},
},
channels: {
discord: {
threadBindings: {
enabled: true,
idleHours: 24,
maxAgeHours: 0,
spawnSubagentSessions: false, // опционально
},
},
},
}

Примечания:

  • session.threadBindings.* устанавливает глобальные значения по умолчанию.
  • channels.discord.threadBindings.* переопределяет поведение для Discord.
  • spawnSubagentSessions должен быть true для автоматического создания/привязки веток для sessions_spawn({ thread: true }).
  • spawnAcpSessions должен быть true для автоматического создания/привязки веток для ACP (/acp spawn ... --thread ... или sessions_spawn({ runtime: "acp", thread: true })).
  • Если привязки веток отключены для аккаунта, /focus и связанные операции привязки веток недоступны.

См. Суб-агенты, ACP Агенты и Справочник по конфигурации.

Для стабильных "всегда включенных" рабочих пространств ACP настройте привязки ACP верхнего уровня с типом, нацеленные на беседы Discord. Путь конфигурации:

  • bindings[] с type: "acp" и match.channel: "discord"

Пример:

{
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 родительского канала.
  • В привязанном канале или ветке /new и /reset сбрасывают ту же сессию ACP на месте.
  • Временные привязки веток все еще работают и могут переопределять разрешение цели, пока активны.

См. ACP Агенты для деталей поведения привязок.

Режим уведомлений о реакциях для каждой гильдии:

  • off
  • own (по умолчанию)
  • all
  • allowlist (использует guilds..users)

События реакций преобразуются в системные события и прикрепляются к маршрутизированной сессии Discord.

ackReaction отправляет эмодзи подтверждения, пока OpenClaw обрабатывает входящее сообщение. Порядок разрешения:

  • channels.discord.accounts..ackReaction
  • channels.discord.ackReaction
  • messages.ackReaction
  • резервный эмодзи идентичности агента (agents.list[].identity.emoji, иначе ”👀”)

Примечания:

  • Discord принимает эмодзи Unicode или имена пользовательских эмодзи.
  • Используйте "", чтобы отключить реакцию для канала или аккаунта.

Запись конфигурации, инициированная каналом, включена по умолчанию. Это влияет на процессы /config set|unset (когда включены функции команд). Отключить:

{
channels: {
discord: {
configWrites: false,
},
},
}

Маршрутизируйте трафик WebSocket шлюза Discord и начальные REST-запросы (ID приложения + разрешение списка разрешений) через HTTP(S) прокси с помощью channels.discord.proxy.

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

Переопределение для аккаунта:

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

Включите разрешение PluralKit для сопоставления проксированных сообщений с идентичностью участника системы:

{
channels: {
discord: {
pluralkit: {
enabled: true,
token: "pk_live_...", // опционально; нужно для приватных систем
},
},
},
}

Примечания:

  • списки разрешений могут использовать pk:
  • отображаемые имена участников сопоставляются только по имени/слагу, когда channels.discord.dangerouslyAllowNameMatching: true
  • поиски используют оригинальный ID сообщения и ограничены временным окном
  • если поиск не удался, проксированные сообщения обрабатываются как сообщения бота и отбрасываются, если не allowBots=true

Обновления статуса применяются, когда вы устанавливаете поле статуса или активности, или когда вы включаете авто-статус. Пример только статуса:

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

Пример активности (пользовательский статус — тип активности по умолчанию):

{
channels: {
discord: {
activity: "Focus time",
activityType: 4,
},
},
}

Пример стриминга:

{
channels: {
discord: {
activity: "Live coding",
activityType: 1,
activityUrl: "https://twitch.tv/openclaw",
},
},
}

Карта типов активности:

  • 0: Играет
  • 1: Стримит (требует activityUrl)
  • 2: Слушает
  • 3: Смотрит
  • 4: Пользовательский (использует текст активности как состояние статуса; эмодзи опционально)
  • 5: Соревнуется

Безопасность и эксплуатация

  • Относитесь к токенам бота как к секретам (DISCORD_BOT_TOKEN предпочтителен в контролируемых средах).
  • Предоставляйте наименьшие привилегии Discord.
  • Если развертывание команд/состояние устарело, перезапустите шлюз и проверьте снова с помощью openclaw channels status --probe.

Связанное