Hermes Agent интегрируется с Discord в качестве бота, позволяя вам общаться с вашим AI-ассистентом через личные сообщения или серверные каналы. Бот получает ваши сообщения, обрабатывает их через конвейер Hermes Agent (включая использование инструментов, память и рассуждения) и отвечает в реальном времени. Поддерживаются текст, голосовые сообщения, вложения файлов и slash-команды.
Перед настройкой — вот то, что большинство людей хотят знать: как Hermes ведёт себя, оказавшись на вашем сервере.
Как ведёт себя Hermes
Контекст
Поведение
ЛС
Hermes отвечает на каждое сообщение. @упоминание не требуется. Каждое ЛС имеет свою собственную сессию.
Серверные каналы
По умолчанию Hermes отвечает только когда вы упоминаете его через @упоминание. Если вы пишете в канале без упоминания, Hermes игнорирует сообщение.
Каналы свободного ответа
Вы можете сделать определённые каналы свободными от упоминаний с помощью DISCORD_FREE_RESPONSE_CHANNELS или отключить упоминания глобально с помощью DISCORD_REQUIRE_MENTION=false. Сообщения в таких каналах обрабатываются встроенно — авто-создание тредов пропускается, чтобы канал оставался лёгким чатом.
Треды
Hermes отвечает в том же треде. Правила упоминаний всё ещё действуют, если только этот тред или его родительский канал не настроен как свободный для ответа. Треды изолированы от родительского канала для истории сессии.
Общие каналы с несколькими пользователями
По умолчанию Hermes изолирует историю сессии по пользователю внутри канала для безопасности и ясности. Два человека, общающихся в одном канале, не используют один транскрипт, если вы явно не отключите это.
Сообщения, упоминающие других пользователей
Когда DISCORD_IGNORE_NO_MENTION имеет значение true (по умолчанию), Hermes молчит, если сообщение @упоминает других пользователей, но не упоминает бота. Это предотвращает вмешательство бота в разговоры, адресованные другим людям. Установите false, если хотите, чтобы бот отвечал на все сообщения независимо от того, кто упомянут. Это применимо только к серверным каналам, не к ЛС.
Если вы хотите обычный канал для помощи, где люди могут общаться с Hermes без тегирования каждый раз, добавьте этот канал в `DISCORD_FREE_RESPONSE_CHANNELS`.
Модель шлюза Discord
Hermes в Discord — это не вебхук, отвечающий без сохранения состояния. Он работает через полноценный шлюз обмена сообщениями, что означает, что каждое входящее сообщение проходит через:
авторизацию (DISCORD_ALLOWED_USERS)
проверки упоминаний / свободного ответа
поиск сессии
загрузку транскрипта сессии
обычное выполнение агента Hermes, включая инструменты, память и slash-команды
доставку ответа обратно в Discord
Это важно, потому что поведение на загруженном сервере зависит как от маршрутизации Discord, так и от политики сессий Hermes.
Модель сессий в Discord
По умолчанию:
каждое ЛС получает свою собственную сессию
каждый серверный тред получает своё пространство имён сессии
каждый пользователь в общем канале получает свою собственную сессию внутри этого канала
Таким образом, если Алиса и Боб оба общаются с Hermes в #research, Hermes по умолчанию обрабатывает это как отдельные разговоры, даже если они используют один и тот же видимый канал Discord.
Это контролируется в config.yaml:
group_sessions_per_user:true
Установите значение false, только если вы явно хотите один общий разговор для всей комнаты:
group_sessions_per_user:false
Общие сессии могут быть полезны для совместной комнаты, но это также означает:
пользователи разделяют рост контекста и затраты на токены
длительная задача с интенсивным использованием инструментов одного человека может раздуть контекст всех остальных
выполняющийся запуск одного человека может прервать последующее сообщение другого человека в той же комнате
Прерывания и конкурентность
Hermes отслеживает запущенных агентов по ключу сессии.
При значении по умолчанию group_sessions_per_user: true:
прерывание Алисой своего собственного текущего запроса влияет только на сессию Алисы в этом канале
Боб может продолжать общаться в том же канале, не наследуя историю Алисы и не прерывая её запуск
При group_sessions_per_user: false:
вся комната разделяет один слот запущенного агента для этого канала/треда
последующие сообщения от разных людей могут прерывать друг друга или стоять в очереди
Это руководство проведёт вас через полный процесс настройки — от создания бота на портале разработчиков Discord до отправки вашего первого сообщения.
Нажмите New Application (Новое приложение) в правом верхнем углу.
Введите название вашего приложения (например, "Hermes Agent") и примите Условия использования для разработчиков.
Нажмите Create (Создать).
Вы окажетесь на странице General Information (Общая информация). Обратите внимание на Application ID (ID приложения) — он понадобится вам позже для создания URL-приглашения.
Шаг 2: Создайте бота
На левой боковой панели нажмите Bot (Бот).
Discord автоматически создаёт пользователя-бота для вашего приложения. Вы увидите имя пользователя бота, которое можно настроить.
В разделе Authorization Flow (Поток авторизации):
Установите Public Bot (Публичный бот) в положение ВКЛ — необходимо для использования ссылки-приглашения от Discord (рекомендуется). Это позволяет вкладке Installation генерировать URL авторизации по умолчанию.
Оставьте Require OAuth2 Code Grant (Требовать код OAuth2) в положении ВЫКЛ.
На этой странице вы можете установить произвольный аватар и баннер для вашего бота. Именно это увидят пользователи в Discord.
info[Альтернатива приватного бота]
Если вы предпочитаете оставить бота приватным (Public Bot = ВЫКЛ), вы должны использовать метод Manual URL (Ручной URL) на Шаге 5 вместо вкладки Installation. Ссылка от Discord требует, чтобы Public Bot был включён.
Шаг 3: Включите привилегированные намерения шлюза
Это самый критический шаг во всей настройке. Без включённых правильных намерений ваш бот подключится к Discord, но не сможет читать содержимое сообщений.
На странице Bot (Бот) прокрутите вниз до раздела Privileged Gateway Intents (Привилегированные намерения шлюза). Вы увидите три переключателя:
Намерение
Назначение
Обязательно?
Presence Intent
Видеть статус пользователя (онлайн/офлайн)
Опционально
Server Members Intent
Доступ к списку участников, разрешение имён пользователей
Обязательно
Message Content Intent
Читать текстовое содержимое сообщений
Обязательно
Включите оба — Server Members Intent и Message Content Intent, переведя их в положение ВКЛ.
Без Message Content Intent ваш бот получает события о сообщениях, но текст сообщения пуст — бот буквально не видит, что вы напечатали.
Без Server Members Intent бот не может определить имена пользователей для списка разрешённых пользователей и может не идентифицировать, кто ему пишет.
warning[Это причина №1, почему Discord-боты не работают]
Если ваш бот онлайн, но никогда не отвечает на сообщения, Message Content Intent почти наверняка отключён. Вернитесь на Портал разработчиков, выберите ваше приложение → Bot → Privileged Gateway Intents, и убедитесь, что Message Content Intent включён. Нажмите Save Changes (Сохранить изменения).
Относительно количества серверов:
Если ваш бот находится менее чем на 100 серверах, вы можете просто свободно включать и выключать намерения.
Если ваш бот находится на 100 или более серверах, Discord требует подать заявку на верификацию для использования привилегированных намерений. Для личного использования это не является проблемой.
Нажмите Save Changes (Сохранить изменения) внизу страницы.
Шаг 4: Получите токен бота
Токен бота — это учётные данные, которые Hermes Agent использует для входа в систему как ваш бот. Всё ещё на странице Bot (Бот):
В разделе Token (Токен) нажмите Reset Token (Сбросить токен).
Если на вашей учётной записи Discord включена двухфакторная аутентификация, введите ваш 2FA-код.
Discord отобразит ваш новый токен. Скопируйте его немедленно.
warning[Токен показывается только один раз]
Токен отображается только один раз. Если вы его потеряете, вам придётся сбросить его и создать новый. Никогда не делитесь своим токеном публично и не сохраняйте его в Git — любой, у кого есть этот токен, получает полный контроль над вашим ботом.
Сохраните токен в надёжном месте (например, в менеджере паролей). Он понадобится вам на Шаге 8.
Шаг 5: Сгенерируйте URL-приглашение
Вам нужен OAuth2 URL, чтобы пригласить бота на ваш сервер. Есть два способа это сделать:
Вариант A: Использование вкладки Installation (Рекомендуется)
note[Требуется Public Bot]
Этот метод требует, чтобы Public Bot был установлен в ВКЛ на Шаге 2. Если вы установили Public Bot в ВЫКЛ, используйте вместо этого метод Manual URL ниже.
На левой боковой панели нажмите Installation (Установка).
В разделе Installation Contexts (Контексты установки) включите Guild Install (Установка на сервер).
Для Install Link (Ссылка установки) выберите Discord Provided Link (Ссылка от Discord).
В разделе Default Install Settings (Настройки установки по умолчанию) для Guild Install:
Scopes (Области): выберите bot и applications.commands
Всё вышеперечисленное плюс Embed Links, Send Messages in Threads, Add Reactions
Шаг 6: Пригласите на ваш сервер
Откройте URL-приглашение в вашем браузере (из вкладки Installation или созданного вами вручную URL).
В выпадающем списке Add to Server (Добавить на сервер) выберите ваш сервер.
Нажмите Continue (Продолжить), затем Authorize (Авторизовать).
Пройдите CAPTCHA, если потребуется.
Для приглашения бота на сервер Discord требуется разрешение **Manage Server** (Управлять сервером). Если вы не видите свой сервер в выпадающем списке, попросите администратора сервера использовать ссылку-приглашение.
После авторизации бот появится в списке участников вашего сервера (он будет отображаться как офлайн, пока вы не запустите шлюз Hermes).
Шаг 7: Найдите ваш Discord User ID
Hermes Agent использует ваш Discord User ID для контроля того, кто может взаимодействовать с ботом. Чтобы найти его:
Откройте Discord (десктопное или веб-приложение).
Перейдите в Settings (Настройки) → Advanced (Расширенные) → переключите Developer Mode (Режим разработчика) в положение ВКЛ.
Закройте настройки.
Щёлкните правой кнопкой мыши по своему имени пользователя (в сообщении, списке участников или вашем профиле) → Copy User ID (Копировать ID пользователя).
Ваш User ID — это длинное число, например 284102345871466496.
Режим разработчика также позволяет копировать **Channel IDs** и **Server IDs** таким же образом — щёлкните правой кнопкой мыши по имени канала или сервера и выберите Copy ID. Вам понадобится Channel ID, если вы хотите вручную установить домашний канал.
Шаг 8: Настройте Hermes Agent
Вариант A: Интерактивная настройка (Рекомендуется)
Запустите команду guided setup:
hermesgatewaysetup
Выберите Discord при появлении запроса, затем вставьте токен бота и ID пользователя, когда будет предложено.
Вариант B: Ручная настройка
Добавьте следующее в ваш файл ~/.hermes/.env:
# ОбязательноDISCORD_BOT_TOKEN=your-bot-token
DISCORD_ALLOWED_USERS=284102345871466496# Несколько разрешённых пользователей (через запятую)# DISCORD_ALLOWED_USERS=284102345871466496,198765432109876543
Затем запустите шлюз:
hermesgateway
Бот должен появиться онлайн в Discord в течение нескольких секунд. Отправьте ему сообщение — либо в ЛС, либо в канале, который он видит — чтобы протестировать.
Вы можете запустить `hermes gateway` в фоне или как systemd-сервис для постоянной работы. Смотрите документацию по развёртыванию для подробностей.
Справочник по конфигурации
Поведение Discord контролируется через два файла: ~/.hermes/.env для учётных данных и переключателей уровня окружения и ~/.hermes/config.yaml для структурированных настроек. Переменные окружения всегда имеют приоритет над значениями config.yaml, если оба установлены.
Разделённые запятыми Discord ID пользователей, которым разрешено взаимодействовать с ботом. Без этого илиDISCORD_ALLOWED_ROLES шлюз отклоняет всех пользователей.
DISCORD_ALLOWED_ROLES
Нет
—
Разделённые запятыми Discord ID ролей. Любой участник с одной из этих ролей авторизован — логика ИЛИ с DISCORD_ALLOWED_USERS. Автоматически включает Server Members Intent при подключении. Полезно, когда состав команды модерации меняется: новые модераторы получают доступ сразу после назначения роли, без обновления конфига.
DISCORD_HOME_CHANNEL
Нет
—
ID канала, куда бот отправляет проактивные сообщения (результаты cron, напоминания, уведомления).
DISCORD_HOME_CHANNEL_NAME
Нет
"Home"
Отображаемое имя домашнего канала в логах и выводе статуса.
DISCORD_COMMAND_SYNC_POLICY
Нет
"safe"
Управляет синхронизацией нативных slash-команд при запуске. "safe" сравнивает существующие глобальные команды и обновляет только изменённые, пересоздавая команды, когда изменения метаданных Discord не могут быть применены через патч. "bulk" сохраняет старое поведение tree.sync(). "off" полностью пропускает синхронизацию при запуске.
DISCORD_REQUIRE_MENTION
Нет
true
Когда true, бот отвечает в серверных каналах только при @упоминании. Установите false, чтобы отвечать на все сообщения в каждом канале.
DISCORD_FREE_RESPONSE_CHANNELS
Нет
—
Разделённые запятыми ID каналов, где бот отвечает без необходимости @упоминания, даже когда DISCORD_REQUIRE_MENTION имеет значение true.
DISCORD_IGNORE_NO_MENTION
Нет
true
Когда true, бот молчит, если сообщение @упоминает других пользователей, но не упоминает бота. Предотвращает вмешательство бота в разговоры, адресованные другим людям. Применяется только в серверных каналах, не в ЛС.
DISCORD_AUTO_THREAD
Нет
true
Когда true, автоматически создаёт новый тред для каждого @упоминания в текстовом канале, чтобы каждый разговор был изолирован (аналогично поведению Slack). Сообщения внутри существующих тредов или ЛС не затрагиваются.
DISCORD_ALLOW_BOTS
Нет
"none"
Управляет тем, как бот обрабатывает сообщения от других Discord-ботов. "none" — игнорировать всех других ботов. "mentions" — принимать только сообщения от ботов, которые @упоминают Hermes. "all" — принимать все сообщения от ботов.
DISCORD_REACTIONS
Нет
true
Когда true, бот добавляет emoji-реакции на сообщения во время обработки (👀 при начале, ✅ при успехе, ❌ при ошибке). Установите false, чтобы полностью отключить реакции.
DISCORD_IGNORED_CHANNELS
Нет
—
Разделённые запятыми ID каналов, где бот никогда не отвечает, даже при @упоминании. Имеет приоритет над всеми остальными настройками каналов.
DISCORD_ALLOWED_CHANNELS
Нет
—
Разделённые запятыми ID каналов. Когда установлено, бот отвечает только в этих каналах (плюс ЛС, если разрешено). Переопределяет config.yamldiscord.allowed_channels. Комбинируйте с DISCORD_IGNORED_CHANNELS для правил разрешения/запрета.
DISCORD_NO_THREAD_CHANNELS
Нет
—
Разделённые запятыми ID каналов, где бот отвечает напрямую в канале вместо создания треда. Актуально только когда DISCORD_AUTO_THREAD имеет значение true.
DISCORD_REPLY_TO_MODE
Нет
"first"
Управляет поведением ответа-ссылки: "off" — никогда не отвечать на исходное сообщение, "first" — ссылка на ответ только на первом фрагменте сообщения (по умолчанию), "all" — ссылка на ответ на каждом фрагменте.
DISCORD_ALLOW_MENTION_EVERYONE
Нет
false
Когда false (по умолчанию), бот не может пинговать @everyone или @here, даже если его ответ содержит эти токены. Установите true, чтобы разрешить. См. Mention Control ниже.
DISCORD_ALLOW_MENTION_ROLES
Нет
false
Когда false (по умолчанию), бот не может пинговать упоминания @ролей. Установите true, чтобы разрешить.
DISCORD_ALLOW_MENTION_USERS
Нет
true
Когда true (по умолчанию), бот может пинговать отдельных пользователей по ID.
DISCORD_ALLOW_MENTION_REPLIED_USER
Нет
true
Когда true (по умолчанию), ответ на сообщение пингует исходного автора.
DISCORD_PROXY
Нет
—
URL прокси для подключений к Discord (HTTP, WebSocket, REST). Переопределяет HTTPS_PROXY/ALL_PROXY. Поддерживает схемы http://, https:// и socks5://.
HERMES_DISCORD_TEXT_BATCH_DELAY_SECONDS
Нет
0.6
Окно ожидания адаптера перед отправкой накопленного текстового фрагмента. Полезно для сглаживания потокового вывода.
HERMES_DISCORD_TEXT_BATCH_SPLIT_DELAY_SECONDS
Нет
2.0
Задержка между разделёнными фрагментами, когда одно сообщение превышает лимит длины Discord.
Файл конфигурации (config.yaml)
Раздел discord в ~/.hermes/config.yaml отражает переменные окружения выше. Настройки config.yaml применяются как значения по умолчанию — если эквивалентная переменная окружения уже установлена, переменная окружения имеет приоритет.
# Discord-specific settingsdiscord:require_mention:true# Требовать @упоминание в серверных каналахfree_response_channels:""# ID каналов через запятую (или YAML-список)auto_thread:true# Авто-создание тредов при @упоминанииreactions:true# Добавлять emoji-реакции во время обработкиignored_channels:[]# ID каналов, где бот никогда не отвечаетno_thread_channels:[]# ID каналов, где бот отвечает без создания тредаchannel_prompts:{}# Временные системные промпты для каждого каналаallow_mentions:# Что бот может пинговать (безопасные значения по умолчанию)everyone:false# @everyone / @here пинги (по умолчанию: false)roles:false# @role пинги (по умолчанию: false)users:true# @user пинги (по умолчанию: true)replied_user:true# ответ-ссылка пингует автора (по умолчанию: true)# Изоляция сессий (применяется ко всем платформам шлюза, не только Discord)group_sessions_per_user:true# Изолировать сессии по пользователю в общих каналах
discord.require_mention
Тип: boolean — По умолчанию:true
Когда включено, бот отвечает в серверных каналах только при прямом @упоминании. В ЛС бот всегда отвечает независимо от этой настройки.
discord.free_response_channels
Тип: строка или список — По умолчанию:""
ID каналов, где бот отвечает на все сообщения без необходимости @упоминания. Принимает как строку с разделителями-запятыми, так и YAML-список:
Если родительский канал треда находится в этом списке, тред также становится свободным от упоминаний.
Каналы свободного ответа также пропускают авто-создание тредов — бот отвечает встроенно, вместо создания нового треда для каждого сообщения. Это сохраняет канал пригодным для использования как лёгкая чат-поверхность. Если вы хотите поведение с тредами, не добавляйте канал в список свободного ответа (используйте обычный поток с @упоминанием).
discord.auto_thread
Тип: boolean — По умолчанию:true
Когда включено, каждое @упоминание в обычном текстовом канале автоматически создаёт новый тред для разговора. Это сохраняет основной канал чистым и даёт каждому разговору свою собственную изолированную историю сессии. После создания треда последующие сообщения в этом треде не требуют @упоминания — бот знает, что он уже участвует.
Сообщения, отправленные в существующих тредах или ЛС, не затрагиваются этой настройкой. Каналы, перечисленные в discord.free_response_channels или discord.no_thread_channels, также обходят авто-создание тредов и получают встроенные ответы.
discord.reactions
Тип: boolean — По умолчанию:true
Управляет тем, добавляет ли бот emoji-реакции на сообщения в качестве визуальной обратной связи:
👀 добавляется, когда бот начинает обработку вашего сообщения
✅ добавляется, когда ответ успешно доставлен
❌ добавляется, если произошла ошибка во время обработки
Отключите это, если считаете реакции отвлекающими или если у роли бота нет разрешения Add Reactions.
discord.ignored_channels
Тип: строка или список — По умолчанию:[]
ID каналов, где бот никогда не отвечает, даже при прямом @упоминании. Это имеет наивысший приоритет — если канал находится в этом списке, бот молча игнорирует все сообщения там, независимо от require_mention, free_response_channels или любых других настроек.
Если родительский канал треда находится в этом списке, сообщения в этом треде также игнорируются.
discord.no_thread_channels
Тип: строка или список — По умолчанию:[]
ID каналов, где бот отвечает напрямую в канале вместо авто-создания треда. Это работает только когда auto_thread имеет значение true (по умолчанию). В этих каналах бот отвечает встроенно как обычное сообщение, а не создаёт новый тред.
discord:no_thread_channels:-1234567890# Бот отвечает встроенно здесь
Полезно для каналов, предназначенных для взаимодействия с ботом, где треды создавали бы лишний шум.
discord.channel_prompts
Тип: отображение — По умолчанию:{}
Временные системные промпты для каждого канала, которые внедряются на каждом шаге в соответствующем канале Discord или треде без сохранения в истории транскрипта.
discord:channel_prompts:"1234567890":|Этот канал для исследовательских задач. Предпочитай глубокие сравнения,цитирования и краткий синтез."9876543210":|Этот форум для поддержки в терапевтическом стиле. Будь тёплым,заземлённым и без осуждения.
Поведение:
Точное совпадение ID треда/канала имеет приоритет.
Если сообщение приходит внутри треда или сообщения на форуме, и у этого треда нет явной записи, Hermes использует родительский канал/ID форума.
Промпты применяются временно во время выполнения, поэтому их изменение влияет на будущие шаги немедленно, без перезаписи прошлой истории сессии.
group_sessions_per_user
Тип: boolean — По умолчанию:true
Это глобальная настройка шлюза (не специфичная для Discord), которая определяет, получают ли пользователи в одном канале изолированные истории сессий.
Когда true: Алиса и Боб, общающиеся в #research, каждый имеют свой отдельный разговор с Hermes. Когда false: весь канал использует один общий транскрипт разговора и один слот запущенного агента.
group_sessions_per_user:true
Смотрите раздел Модель сессий выше для полного описания последствий каждого режима.
display.tool_progress
Тип: строка — По умолчанию:"all" — Значения:off, new, all, verbose
Управляет тем, отправляет ли бот сообщения о прогрессе в чат во время обработки (например, "Чтение файла...", "Выполнение команды терминала..."). Это глобальная настройка шлюза, применяемая ко всем платформам.
display:tool_progress:"all"# off | new | all | verbose
off — нет сообщений о прогрессе
new — показывать только первый вызов инструмента за шаг
all — показывать все вызовы инструментов (сокращённые до 40 символов в сообщениях шлюза)
Когда включено, делает slash-команду /verbose доступной в шлюзе, позволяя вам переключаться между режимами прогресса инструментов (off → new → all → verbose → off) без редактирования config.yaml.
display:tool_progress_command:true
Интерактивный выбор модели
Отправьте /model без аргументов в канале Discord, чтобы открыть выбор модели с выпадающим списком:
Выбор провайдера — выпадающий список Select с доступными провайдерами (до 25).
Выбор модели — второй выпадающий список с моделями для выбранного провайдера (до 25).
Выбор автоматически отключается через 120 секунд. Только авторизованные пользователи (из DISCORD_ALLOWED_USERS) могут взаимодействовать с ним. Если вы знаете название модели, введите /model <имя> напрямую.
Нативные Slash-команды для навыков
Hermes автоматически регистрирует установленные навыки как нативные Discord Application Commands. Это означает, что навыки появляются в меню автодополнения Discord / рядом со встроенными командами.
Каждый навык становится Discord slash-командой (например, /code-review, /ascii-art)
Навыки принимают опциональный строковый параметр args
У Discord есть лимит в 100 application-команд на бота — если у вас больше навыков, чем доступных слотов, дополнительные навыки пропускаются с предупреждением в логах
Навыки регистрируются во время запуска бота вместе со встроенными командами, такими как /model, /reset и /background
Никакой дополнительной настройки не требуется — любой навык, установленный через hermes skills install, автоматически регистрируется как Discord slash-команда при следующем перезапуске шлюза.
Отключение регистрации slash-команд
Если вы запускаете несколько шлюзов Hermes для одного и того же Discord-приложения (например, staging + production), только один из них должен владеть глобальной регистрацией slash-команд — иначе последний запуск перезаписывает, и регистрации flapping. Выключите регистрацию slash-команд на "ведомом" шлюзе:
gateway:platforms:discord:extra:slash_commands:false# по умолчанию: true
Оставление true на "основном" шлюзе сохраняет нормальное поведение — глобальные команды меню / для встроенных и установленных навыков.
Отправка медиа (send_message + теги MEDIA:)
Адаптер Discord поддерживает нативную загрузку файлов для всех распространённых типов медиа через инструмент send_message и встроенные теги MEDIA:/путь/к/файлу, отправляемые агентом:
Тип
Как доставляется
Изображения (PNG/JPG/WebP)
Нативное вложение Discord с встроенным предпросмотром
Анимированные GIF
send_animation загружает как animation.gif, чтобы Discord воспроизводил его встроенно (а не как статическую миниатюру)
Видео (MP4/MOV)
send_video — нативный видео-плеер
Аудио / Голос
send_voice — нативное голосовое сообщение, когда возможно, иначе вложение файла
Документы (PDF/ZIP/docx и т.д.)
send_document — нативное вложение с кнопкой загрузки
Лимит размера одной загрузки Discord зависит от уровня буста сервера (25 MB бесплатно, до 500 MB). Если Hermes получает HTTP 413, адаптер вместо тихого отказа использует ссылку на локальный путь кэша.
Домашний канал
Вы можете назначить "домашний канал", куда бот отправляет проактивные сообщения (такие как вывод cron-задач, напоминания и уведомления). Есть два способа установить его:
Использование slash-команды
Введите /sethome в любом канале Discord, где присутствует бот. Этот канал становится домашним каналом.
Замените ID на фактический ID канала (правый клик → Copy Channel ID при включённом Developer Mode).
Голосовые сообщения
Hermes Agent поддерживает голосовые сообщения Discord:
Входящие голосовые сообщения автоматически транскрибируются с использованием настроенного STT-провайдера: локальный faster-whisper (без ключа), Groq Whisper (GROQ_API_KEY) или OpenAI Whisper (VOICE_TOOLS_OPENAI_KEY).
Text-to-Speech: Используйте /voice tts, чтобы бот отправлял голосовые ответы вместе с текстовыми.
Голосовые каналы Discord: Hermes также может подключиться к голосовому каналу, слушать говорящих пользователей и отвечать голосом в канале.
Полное руководство по настройке и эксплуатации смотрите в:
Форум-каналы Discord (тип 15) не принимают прямые сообщения — каждое сообщение на форуме должно быть тредом. Hermes автоматически определяет форум-каналы и создаёт новое сообщение-тред каждый раз, когда нужно туда отправить, поэтому send_message, TTS, изображения, голосовые сообщения и вложения файлов работают без специальной обработки со стороны агента.
Имя треда определяется из первой строки сообщения (префикс заголовка markdown удаляется, ограничение в 100 символов). Когда сообщение содержит только вложения, имя файла используется как запасное имя треда.
Вложения отправляются вместе со стартовым сообщением нового треда — без отдельного шага загрузки, без частичных отправок.
Один вызов, один тред: каждая отправка на форум создаёт новый тред. Последующие отправки на тот же форум будут создавать отдельные треды.
Определение трёхуровневое: сначала кэш каталога каналов, затем локальный кэш процесса и, как последнее средство, живой запрос GET /channels/{id} (результат которого затем запоминается на время жизни процесса).
Обновление каталога (/channels refresh на платформах, которые его предоставляют, или перезапуск шлюза) заполняет кэш любыми форум-каналами, созданными после запуска бота.
Причина: Ваш код запрашивает намерения, которые не включены на Портале разработчиков.
Решение: Включите все три привилегированных намерения шлюза (Presence, Server Members, Message Content) в настройках Bot, затем перезапустите.
Бот не видит сообщения в определённом канале
Причина: Роль бота не имеет разрешения на просмотр этого канала.
Решение: В Discord перейдите в настройки канала → Permissions → добавьте роль бота с включёнными разрешениями View Channel и Read Message History.
Ошибки 403 Forbidden
Причина: У бота отсутствуют необходимые разрешения.
Решение: Повторно пригласите бота с правильными разрешениями, используя URL из Шага 5, или вручную настройте разрешения роли бота в Server Settings → Roles.
Бот офлайн
Причина: Шлюз Hermes не запущен или токен неверный.
Решение: Проверьте, что hermes gateway запущен. Проверьте DISCORD_BOT_TOKEN в вашем файле .env. Если вы недавно сбрасывали токен, обновите его.
"User not allowed" / Бот игнорирует вас
Причина: Ваш User ID отсутствует в DISCORD_ALLOWED_USERS.
Решение: Добавьте ваш User ID в DISCORD_ALLOWED_USERS в ~/.hermes/.env и перезапустите шлюз.
Люди в одном канале неожиданно делят контекст
Причина: group_sessions_per_user отключён, или платформа не может предоставить ID пользователя для сообщений в этом контексте.
Решение: Установите это в ~/.hermes/config.yaml и перезапустите шлюз:
group_sessions_per_user:true
Если вы намеренно хотите общий разговор в комнате, оставьте это выключенным — просто ожидайте общую историю транскрипта и общее поведение прерываний.
Безопасность
Всегда устанавливайте `DISCORD_ALLOWED_USERS` (или `DISCORD_ALLOWED_ROLES`), чтобы ограничить, кто может взаимодействовать с ботом. Без любого из них шлюз по умолчанию отклоняет всех пользователей в качестве меры безопасности. Авторизуйте только тех, кому вы доверяете — авторизованные пользователи имеют полный доступ к возможностям агента, включая использование инструментов и доступ к системе.
Управление доступом на основе ролей
Для серверов, где доступ управляется ролями вместо списков отдельных пользователей (команды модераторов, сотрудники поддержки, внутренние инструменты), используйте DISCORD_ALLOWED_ROLES — список ID ролей через запятую. Любой участник с одной из этих ролей авторизован.
# ~/.hermes/.env — работает вместе с DISCORD_ALLOWED_USERS или вместо негоDISCORD_ALLOWED_ROLES=987654321098765432,876543210987654321
Семантика:
ИЛИ со списком пользователей. Пользователь авторизован, если его ID есть в DISCORD_ALLOWED_USERSили у него есть любая роль из DISCORD_ALLOWED_ROLES.
Server Members Intent автоматически включается. Когда DISCORD_ALLOWED_ROLES установлен, бот включает намерение Members при подключении — необходимо для отправки Discord информации о ролях с записями участников.
ID ролей, не названия. Получите их из Discord: User Settings → Advanced → Developer Mode ВКЛ, затем правый клик по любой роли → Copy Role ID.
Запасной вариант в ЛС. В личных сообщениях проверка ролей сканирует общие гильдии; пользователь с разрешённой ролью на любом общем сервере также авторизован в ЛС.
Это предпочтительный паттерн, когда состав команды модерации меняется — новые модераторы получают доступ в момент назначения роли, без редактирования .env или перезапуска шлюза.
Контроль упоминаний
По умолчанию Hermes блокирует боту возможность пинговать @everyone, @here и упоминания ролей, даже если его ответ содержит эти токены. Это предотвращает спам по всему серверу из-за неудачно сформулированного промпта или повторённого пользовательского контента. Индивидуальные пинги @user и пинги ответов-ссылок (чип "ответ пользователю...") остаются включёнными, чтобы обычный разговор продолжал работать.
Вы можете ослабить эти настройки по умолчанию через переменные окружения или config.yaml:
# ~/.hermes/config.yamldiscord:allow_mentions:everyone:false# разрешить боту пинговать @everyone / @hereroles:false# разрешить боту пинговать @roleusers:true# разрешить боту пинговать отдельных @usersreplied_user:true# пинговать автора при ответе на его сообщение
# ~/.hermes/.env — переменные окружения имеют приоритет над config.yamlDISCORD_ALLOW_MENTION_EVERYONE=falseDISCORD_ALLOW_MENTION_ROLES=falseDISCORD_ALLOW_MENTION_USERS=trueDISCORD_ALLOW_MENTION_REPLIED_USER=true
Оставьте `everyone` и `roles` в значении `false`, если вы точно не знаете, зачем они вам нужны. LLM очень легко может сгенерировать строку `@everyone` внутри обычного ответа; без этой защиты это уведомило бы каждого участника вашего сервера.
Для получения дополнительной информации о безопасности вашего развёртывания Hermes Agent смотрите Руководство по безопасности.