Discord
VibeOS интегрируется с Discord в качестве бота, позволяя вам общаться с вашим AI-помощником через прямые сообщения или каналы сервера. Бот получает ваши сообщения, обрабатывает их через конвейер VibeOS (включая использование инструментов, память и рассуждения) и отвечает в режиме реального времени. Он поддерживает текстовые, голосовые сообщения, вложения файлов и slash-команды.
Прежде чем приступать к настройке, вот что большинство людей хотят знать: как ведет себя VibeOS, когда он оказывается на вашем сервере.
Как ведет себя VibeOS
| Контекст | Поведение |
|---|---|
| DM | VibeOS отвечает на каждое сообщение. @mention не требуется. У каждого DM есть своя сессия. |
| Серверные каналы | По умолчанию VibeOS отвечает только тогда, когда вы выполняете @mention. Если вы публикуете сообщение в канале, не упомянув его, VibeOS игнорирует сообщение. |
| Каналы с бесплатным ответом | Вы можете запретить упоминание определенных каналов с помощью DISCORD_FREE_RESPONSE_CHANNELS или запретить упоминания глобально с помощью DISCORD_REQUIRE_MENTION=false. На сообщения в этих каналах отвечают в режиме онлайн — автоматическая цепочка сообщений пропускается, поэтому канал остается простым чатом. |
| Темы | VibeOS отвечает в той же теме. Правила упоминаний по-прежнему применяются, если только эта тема или ее родительский канал не настроены как свободные ответы. Потоки остаются изолированными от родительского канала для истории сеансов. |
| Общие каналы с несколькими пользователями | По умолчанию VibeOS изолирует историю сеансов каждого пользователя внутри канала в целях безопасности и ясности. Два человека, разговаривающие по одному и тому же каналу, не будут использовать одну стенограмму, если вы явно не отключите ее. |
| Сообщения с упоминанием других пользователей | Если DISCORD_IGNORE_NO_MENTION равен true (по умолчанию), VibeOS сохраняет молчание, если в сообщении @упоминаются другие пользователи, но не упоминается бот. Это не позволяет боту вступать в разговоры, адресованные другим людям. Установите значение false, если вы хотите, чтобы бот отвечал на все сообщения независимо от того, кто упомянут. Это применимо только к каналам сервера, а не к личным сообщениям. |
Если вам нужен обычный канал помощи ботам, где люди смогут общаться с VibeOS, не отмечая его каждый раз, добавьте этот канал в DISCORD_FREE_RESPONSE_CHANNELS.
Модель шлюза Discord
VibeOS в Discord — это не вебхук, который отвечает без сохранения состояния. Он проходит через полный шлюз обмена сообщениями, что означает, что каждое входящее сообщение проходит:
- авторизация (
DISCORD_ALLOWED_USERS) - проверка упоминаний/свободных ответов
- поиск сеанса
- загрузка стенограммы сеанса
- нормальное выполнение агента VibeOS, включая инструменты, память и slash-команды.
- доставка ответа обратно в Discord
Это важно, поскольку поведение на загруженном сервере зависит как от маршрутизации Discord, так и от политики сеанса VibeOS.
Модель сеанса в Discord
По умолчанию:
- каждый DM получает свой сеанс
- каждый серверный поток получает собственное пространство имен сеанса
- каждый пользователь в общем канале получает свой собственный сеанс внутри этого канала
Таким образом, если Алиса и Боб оба разговаривают с VibeOS в #research, VibeOS по умолчанию рассматривает их как отдельные разговоры, даже если они используют один и тот же видимый канал Discord.
Это контролируется config.yaml:
group_sessions_per_user: true
Установите значение false, только если вы явно хотите, чтобы один общий разговор был для всей комнаты:
group_sessions_per_user: false
Общие сеансы могут быть полезны для совместной комнаты, но они также означают:
- пользователи разделяют рост контекста и стоимость токенов
- длительная и трудоемкая задача, выполняемая одним человеком, может раздуть контекст остальных
- бег одного человека в полете может прервать наблюдение другого человека в той же комнате
Прерывания и параллелизм
VibeOS отслеживает запущенные агенты по сеансовому ключу.
С group_sessions_per_user: true по умолчанию:
- Прерывание Алисой собственного запроса в полете влияет только на сеанс Алисы на этом канале.
- Боб может продолжать говорить на том же канале, не наследуя историю Алисы и не прерывая работу Алисы.
С group_sessions_per_user: false:
- вся комната использует один слот для запуска агента для этого канала/thread
- последующие сообщения от разных людей могут прерываться или стоять в очереди друг за другом
Это руководство проведет вас через весь процесс настройки — от создания бота на портале разработчиков Discord до отправки первого сообщения.
Шаг 1. Создайте приложение Discord
- Перейдите на Портал разработчиков Discord и войдите в свою учетную запись Discord.
- Нажмите Новое приложение в правом верхнем углу.
- Введите имя своего приложения (например, «VibeOS») и примите Условия обслуживания разработчика.
- Нажмите Создать.
Вы попадете на страницу Общая информация. Обратите внимание на Идентификатор приложения — он понадобится вам позже для создания приглашения URL.
Шаг 2: Создайте бота
- На левой боковой панели нажмите Бот.
- Discord автоматически создает пользователя-бота для вашего приложения. Вы увидите имя пользователя бота, которое вы можете настроить.
- В разделе Последовательность авторизации:
- Установите для Public Bot значение ON — необходимо для использования ссылки для приглашения, предоставленной Discord (рекомендуется). Это позволит на вкладке «Установка» сгенерировать авторизацию по умолчанию URL. – Оставьте для параметра Требовать предоставление кода OAuth2 значение OFF.
На этой странице вы можете установить собственный аватар и баннер для своего бота. Это то, что пользователи увидят в Discord.
Если вы предпочитаете, чтобы ваш бот оставался конфиденциальным (Public Bot = OFF), вы должны использовать метод Ручной URL на шаге 5 вместо вкладки «Установка». Ссылка, предоставленная Discord, требует включения Public Bot.
Шаг 3. Включите намерения привилегированного шлюза
Это самый важный шаг во всей настройке. Если не включены правильные намерения, ваш бот подключится к Discord, но не сможет читать содержимое сообщения.
На странице Бот прокрутите вниз до пункта Намерения привилегированного шлюза. Вы увидите три переключателя:
| Намерение | Цель | Необходимый? |
|---|---|---|
| Намерение присутствия | Посмотреть пользователя онлайн/offline статус | Необязательно |
| Намерение участников сервера | Доступ к списку участников, разрешение имен пользователей | Обязательно |
| Намерение содержимого сообщения | Читать текстовое содержимое сообщений | Обязательно |
Включите намерение участников сервера и намерение содержимого сообщения, переключив их в положение ВКЛ.
- Без Намерения содержимого сообщения ваш бот получает события сообщения, но текст сообщения пуст — бот буквально не может видеть то, что вы набрали.
- Без Намерения участников сервера бот не сможет разрешить имена пользователей для списка разрешенных пользователей и не сможет определить, кто отправляет ему сообщения.
Если ваш бот находится в сети, но никогда не отвечает на сообщения, Намерение содержимого сообщения почти наверняка отключено. Вернитесь на Портал разработчика, выберите свое приложение → Бот → Намерения привилегированного шлюза и убедитесь, что Намерение содержимого сообщения включено. Нажмите Сохранить изменения.
Что касается количества серверов:
- Если ваш бот находится на менее 100 серверах, вы можете просто свободно включать и выключать намерения.
- Если ваш бот находится на 100 или более серверах, Discord потребует от вас отправить заявку на проверку для использования привилегированных намерений. Для личного использования это не проблема.
Нажмите Сохранить изменения внизу страницы.
Шаг 4: Получите токен бота
Токен бота — это учетные данные, которые VibeOS использует для входа в систему в качестве вашего бота. Все еще на странице Бот:
- В разделе Токен нажмите Сбросить токен.
- Если в вашей учетной записи Discord включена двухфакторная аутентификация, введите код 2FA.
- Discord отобразит ваш новый токен. Скопируйте его немедленно.
Токен отображается только один раз. Если вы потеряете его, вам придется сбросить его и создать новый. Никогда не делитесь своим токеном публично и не передавайте его в Git — любой, у кого есть этот токен, имеет полный контроль над вашим ботом.
Сохраните токен в безопасном месте (например, в менеджере паролей). Он понадобится вам на шаге 8.
Шаг 5: Создайте приглашение URL
Вам понадобится OAuth2 URL, чтобы пригласить бота на ваш сервер. Есть два способа сделать это:
Вариант A: Использование вкладки «Установка» (рекомендуется)
Для этого метода необходимо, чтобы для Public Bot было установлено значение ON на шаге 2. Если для Public Bot установлено значение OFF, вместо этого используйте описанный ниже ручной метод URL.
- На левой боковой панели нажмите Установка.
- В разделе Контексты установки включите Гильдейскую установку.
- В поле Ссылка для установки выберите Ссылка, предоставленная Discord.
- В разделе Настройки установки по умолчанию для установки гильдии:
- Области применения: выберите
botиapplications.commands. - Разрешения: выберите разрешения, перечисленные ниже.
- Области применения: выберите
Вариант Б: Руководство URL
Вы можете создать приглашение URL напрямую, используя этот формат:
https://discord.com/oauth2/authorize?client_id=YOUR_APP_ID&scope=bot+applications.commands&permissions=274878286912
Замените YOUR_APP_ID на идентификатор приложения из шага 1.
Необходимые разрешения
Вот минимальные разрешения, необходимые вашему боту:
- Просмотр каналов — просмотр каналов, к которым у него есть доступ.
- Отправить сообщения — отвечайте на ваши сообщения.
- Встроить ссылки — форматируйте подробные ответы.
- Прикрепить файлы — отправлять изображения, аудио и выходные файлы.
- Читать историю сообщений — сохранять контекст разговора.
Рекомендуемые дополнительные разрешения
- Отправлять сообщения в темах — отвечать в обсуждениях в цепочках.
- Добавить реакции — реагировать на сообщения для подтверждения.
Целые числа разрешений
| Уровень | Разрешения Целое число | Что включено |
|---|---|---|
| Минимальный | 117760 | Просмотр каналов, отправка сообщений, чтение истории сообщений, прикрепление файлов |
| Рекомендуется | 274878286912 | Все вышеперечисленное, а также встраивание ссылок, отправка сообщений в темах, добавление реакций |
Шаг 6: Пригласите на свой сервер
- Откройте приглашение URL в своем браузере (на вкладке «Установка» или в созданном вами руководстве URL).
- В раскрывающемся списке Добавить на сервер выберите свой сервер.
- Нажмите Продолжить, затем Авторизовать.
- Заполните CAPTCHA, если будет предложено.
Чтобы пригласить бота, вам необходимо разрешение Управление сервером на сервере Discord. Если вы не видите свой сервер в раскрывающемся списке, попросите администратора сервера использовать ссылку для приглашения.
После авторизации бот появится в списке участников вашего сервера (он будет отображаться как оффлайн, пока вы не запустите шлюз VibeOS).
Шаг 7: Найдите свой идентификатор пользователя Discord
VibeOS использует ваш идентификатор пользователя Discord, чтобы контролировать, кто может взаимодействовать с ботом. Чтобы найти его:
- Откройте Discord (на рабочем столе или в веб-приложении).
- Откройте Настройки → Дополнительно → установите для параметра Режим разработчика значение ВКЛ.
- Закройте настройки.
- Щелкните правой кнопкой мыши свое имя пользователя (в сообщении, списке участников или вашем профиле) → Копировать идентификатор пользователя.
Ваш идентификатор пользователя — это длинное число, например 284102345871466496.
Режим разработчика также позволяет копировать Идентификаторы каналов и Идентификаторы серверов одним и тем же способом — щелкните правой кнопкой мыши имя канала или сервера и выберите «Копировать идентификатор». Вам понадобится идентификатор канала, если вы хотите установить домашний канал вручную.
Шаг 8: Настройте VibeOS
Вариант A: Интерактивная настройка (рекомендуется)
Запустите команду управляемой настройки:
vibeos gateway setup
При появлении запроса выберите Discord, а затем вставьте свой токен бота и идентификатор пользователя, когда вас спросят.
Вариант Б: Настройка вручную
Добавьте следующее в ваш файл ~/.vibeos/.env:
# Required
DISCORD_BOT_TOKEN=your-bot-token
DISCORD_ALLOWED_USERS=284102345871466496
# Multiple allowed users (comma-separated)
# DISCORD_ALLOWED_USERS=284102345871466496,198765432109876543
Затем запустите шлюз:
vibeos gateway
Бот должен подключиться к Discord в течение нескольких секунд. Отправьте ему сообщение — либо в DM, либо по каналу, который он видит — для проверки.
Вы можете запустить vibeos gateway в фоновом режиме или в качестве службы systemd для постоянной работы. Подробности см. в документации по развертыванию.
Справочник по конфигурации
Поведение Discord контролируется с помощью двух файлов: ~/.vibeos/.env для учетных данных и переключателей уровня среды и ~/.vibeos/config.yaml для структурированных настроек. Переменные среды всегда имеют приоритет над значениями config.yaml, если оба они установлены.
Переменные среды (.env)
| Переменная | Требуется | По умолчанию | Описание |
|---|---|---|---|
DISCORD_BOT_TOKEN | Да | — | Токен бота с Портала разработчиков Discord. |
DISCORD_ALLOWED_USERS | Да | — | Идентификаторы пользователей Discord, разделенные запятыми, позволяют взаимодействовать с ботом. Без этого или DISCORD_ALLOWED_ROLES шлюз запрещает доступ всем пользователям. |
DISCORD_ALLOWED_ROLES | Нет | — | Идентификаторы ролей Discord, разделенные запятыми. Авторизован любой участник с одной из этих ролей — ИЛИ семантика с DISCORD_ALLOWED_USERS. Автоматически включает Намерение участников сервера при подключении. Полезно, когда команды модераторов отменяются: новые моды получают доступ, как только роль предоставлена, не требуется никаких изменений конфигурации. |
DISCORD_HOME_CHANNEL | Нет | — | Идентификатор канала, по которому бот отправляет упреждающие сообщения (вывод cron, напоминания, уведомления). |
DISCORD_HOME_CHANNEL_NAME | Нет | "Home" | Отображаемое имя домашнего канала в журналах и выводе состояния. |
DISCORD_COMMAND_SYNC_POLICY | Нет | "safe" | Управляет встроенной синхронизацией Discord slash-команд. "safe" различает существующие глобальные команды и обновляет только то, что изменилось, воссоздавая команды, когда изменения метаданных Discord невозможно применить с помощью патча. "bulk" сохраняет старое поведение tree.sync(). "off" полностью пропускает синхронизацию при запуске. |
DISCORD_REQUIRE_MENTION | Нет | true | При true бот отвечает только в каналах сервера при @mentioned. Установите false, чтобы отвечать на все сообщения в каждом канале. |
DISCORD_THREAD_REQUIRE_MENTION | Нет | false | При использовании true ярлык упоминания внутри треда отключен — темы закрываются так же, как и каналы, поэтому требуется @mention даже после того, как бот уже принял участие. Используйте это, когда несколько ботов совместно используют поток, и вы хотите, чтобы каждый из них запускал только явный @mention. |
DISCORD_FREE_RESPONSE_CHANNELS | Нет | — | Идентификаторы каналов, разделенные запятыми, на которые бот отвечает, не требуя @mention, даже если DISCORD_REQUIRE_MENTION — это true. |
DISCORD_IGNORE_NO_MENTION | Нет | true | При использовании true бот молчит, если в сообщении @mentions другие пользователи не упоминают бот. Не позволяет боту вступать в разговоры, адресованные другим людям. Применяется только в каналах сервера, а не в личных сообщениях. |
DISCORD_AUTO_THREAD | Нет | true | При использовании true автоматически создается новый поток для каждого @mention в текстовом канале, поэтому каждый разговор изолируется (аналогично поведению Slack). Сообщения, уже находящиеся внутри тредов или личных сообщений, не затрагиваются. |
DISCORD_ALLOW_BOTS | Нет | "none" | Управляет тем, как бот обрабатывает сообщения от других ботов Discord. "none" — игнорировать всех остальных ботов. "mentions" — принимать только сообщения ботов, которые @mention VibeOS. "all" — принимать все сообщения бота. |
DISCORD_REACTIONS | Нет | true | При true бот добавляет эмодзи-реакции к сообщениям во время обработки (👀 при запуске, ✅ при успехе, ❌ при ошибке). Установите false, чтобы полностью отключить реакции. |
DISCORD_IGNORED_CHANNELS | Нет | — | Идентификаторы каналов, разделенные запятыми, на которые бот никогда не отвечает, даже если @mentioned. Имеет приоритет над всеми остальными настройками канала. |
DISCORD_ALLOWED_CHANNELS | Нет | — | Идентификаторы каналов, разделенные запятыми. Если этот параметр установлен, бот **отвечает только по этим каналам (плюс личные сообщения, если это разрешено). Переопределяет config.yaml discord.allowed_channels. Объедините с DISCORD_IGNORED_CHANNELS, чтобы выразить правилаallow/deny. |
DISCORD_NO_THREAD_CHANNELS | Нет | — | Идентификаторы каналов, разделенные запятыми, при которых бот отвечает непосредственно в канале, а не создает поток. Актуально только тогда, когда DISCORD_AUTO_THREAD равен true. |
DISCORD_HISTORY_BACKFILL | Нет | true | Если true, добавьте недавнюю прокрутку канала (с момента последнего ответа бота) к сообщению пользователя при упоминании бота. Восстанавливает контекст, который в противном случае бот пропустил бы с помощью require_mention. Пропускается в личных сообщениях и каналах с бесплатными ответами. Установите false для отключения. |
DISCORD_HISTORY_BACKFILL_LIMIT | Нет | 50 | Максимальное количество сообщений для сканирования назад при сборке блока обратной засыпки. На практике сканирование обычно останавливается раньше — на последнем сообщении бота в канале. |
DISCORD_REPLY_TO_MODE | Нет | "first" | Управляет поведением ссылки-ответа: "off" — никогда не отвечать на исходное сообщение, "first" — ссылка-ответ только на первый фрагмент сообщения (по умолчанию), "all" — ссылка-ответ на каждый фрагмент. |
DISCORD_ALLOW_MENTION_EVERYONE | Нет | false | При использовании false (по умолчанию) бот не может выполнить проверку связи с @everyone или @here, даже если его ответ содержит эти токены. Установите значение true, чтобы снова принять участие. См. Контроль упоминаний ниже. |
DISCORD_ALLOW_MENTION_ROLES | Нет | false | Если false (по умолчанию), бот не может пинговать @role, о котором упоминает @role. Установите true, чтобы разрешить. |
DISCORD_ALLOW_MENTION_USERS | Нет | true | Если true (по умолчанию), бот может пинговать отдельных пользователей по идентификатору. |
DISCORD_ALLOW_MENTION_REPLIED_USER | Нет | true | Когда true (по умолчанию), ответ на сообщение проверяет исходного автора. |
DISCORD_PROXY | Нет | — | Прокси URL для подключений Discord (HTTP, WebSocket, REST). Переопределяет HTTPS_PROXY/ALL_PROXY. Поддерживает схемы http://, https:// и socks5://. |
DISCORD_ALLOW_ANY_ATTACHMENT | Нет | false | При true бот принимает вложения любого типа файлов (а не только встроенный список разрешений PDF/text/zip/office). Неизвестные типы кэшируются на диске и доступны агенту как локальный путь с помощью application/octet-stream MIME, чтобы он мог проверить их с помощью terminal / read_file / ffprobe / и т. д. |
DISCORD_MAX_ATTACHMENT_BYTES | Нет | 33554432 | Максимальное количество байтов на вложение, которое шлюз загрузит и кэширует. По умолчанию 32 МБ. Установите значение 0 для отсутствия ограничения (вложения сохраняются в памяти во время записи, поэтому неограниченное количество требует реальных затрат памяти). |
VIBEOS_DISCORD_TEXT_BATCH_DELAY_SECONDS | Нет | 0.6 | Окно льготного периода, в котором адаптер ожидает перед очисткой текстового фрагмента, находящегося в очереди. Полезно для сглаживания потокового вывода. |
VIBEOS_DISCORD_TEXT_BATCH_SPLIT_DELAY_SECONDS | Нет | 2.0 | Задержка между разделенными частями, когда одно сообщение превышает ограничение длины Discord. |
DISCORD_ALLOW_BOTS существует для приема входных данных от определенного доверенного бота (например, ретранслятора или бота веб-перехватчика), а не для того, чтобы два профиля VibeOS разговаривали друг с другом. Значение по умолчанию "none" игнорирует всех других ботов и является безопасным параметром.
Подключение нескольких профилей VibeOS для ответа друг другу в общем канале — путем установки "mentions" или "all" для нескольких профилей — является неподдерживаемой топологией. Discord auto-@mentions является автором ответа на каждый ответ, поэтому под "mentions" два бота будут бесконечно удовлетворять друг друга шлюзом упоминаний и циклом подтверждения. Для этого нет автоматического выключателя, поскольку поддерживаемая конфигурация просто оставляет DISCORD_ALLOW_BOTS на "none". Если вам необходимо принять конкретного бота, ограничивайте принятие только одним агентом автоответчика.
Файл конфигурации (config.yaml)
Раздел discord в ~/.vibeos/config.yaml отражает приведенные выше переменные окружения. Настройки Config.yaml применяются по умолчанию — если эквивалентная переменная env уже установлена, побеждает переменная env.
# Discord-specific settings
discord:
require_mention: true # Require @mention in server channels
thread_require_mention: false # If true, require @mention in threads too (multi-bot threads)
free_response_channels: "" # Comma-separated channel IDs (or YAML list)
auto_thread: true # Auto-create threads on @mention
reactions: true # Add emoji reactions during processing
ignored_channels: [] # Channel IDs where bot never responds
no_thread_channels: [] # Channel IDs where bot responds without threading
history_backfill: true # Prepend recent channel scrollback on mention (default: true)
history_backfill_limit: 50 # Max messages to scan backwards (default: 50)
channel_prompts: {} # Per-channel ephemeral system prompts
allow_mentions: # What the bot is allowed to ping (safe defaults)
everyone: false # @everyone / @here pings (default: false)
roles: false # @role pings (default: false)
users: true # @user pings (default: true)
replied_user: true # reply-reference pings the author (default: true)
# Session isolation (applies to all gateway platforms, not just Discord)
group_sessions_per_user: true # Isolate sessions per user in shared channels
discord.require_mention
Тип: логическое значение — По умолчанию: true
При включении бот отвечает только в каналах сервера, если напрямую @mentioned. DM всегда получают ответ независимо от этого параметра.
discord.thread_require_mention
Тип: логическое значение — По умолчанию: false
По умолчанию, как только бот принял участие в потоке (автоматически созданном на @mention или ответив один раз), он продолжает отвечать на каждое последующее сообщение в этом потоке без необходимости снова быть @mentioned. Это правильный вариант по умолчанию для разговоров один на один.
В темах с несколькими ботами, когда пользователи обращаются к одному боту за ход, по умолчанию это становится «пуговым пистолетом» — каждый второй бот в ветке также стреляет по каждому сообщению, сжигая кредиты и рассылая спам по каналу. Установите thread_require_mention: true, чтобы отключить ярлык внутри потока и блокировать потоки так же, как закрываются каналы. Явный @mentions по-прежнему работает по-прежнему.
discord:
require_mention: true
thread_require_mention: true # multi-bot setup
discord.free_response_channels
Тип: строка или список — По умолчанию: ""
Идентификаторы каналов, по которым бот отвечает на все сообщения без необходимости использования @mention. Принимает либо строку, разделенную запятыми, либо список YAML:
# String format
discord:
free_response_channels: "1234567890,9876543210"
# List format
discord:
free_response_channels:
- 1234567890
- 9876543210
Если родительский канал потока находится в этом списке, поток также не подлежит упоминанию.
Каналы с бесплатными ответами также пропускают автоматическое создание цепочек — бот отвечает прямо в сети, а не создает новую цепочку для каждого сообщения. Это позволяет использовать канал в качестве облегченной поверхности для чата. Если вам нужно многопоточное поведение, не указывайте канал как свободный ответ (вместо этого используйте обычный поток @mention).
discord.auto_thread
Тип: логическое значение — По умолчанию: true
Если этот параметр включен, каждый @mention в обычном текстовом канале автоматически создает новую ветку для разговора. Это сохраняет основной канал чистым и дает каждому разговору собственную изолированную историю сеансов. После создания потока последующие сообщения в этом потоке не требуют @mention — бот знает, что он уже участвует. Установите для thread_require_mention значение true, чтобы отключить этот внутрипоточный ярлык для настроек нескольких ботов.
Этот параметр не влияет на сообщения, отправленные в существующих темах или личных сообщениях. Каналы, перечисленные в discord.free_response_channels или discord.no_thread_channels, также обходят автоматическую поточность и вместо этого получают встроенные ответы.
discord.reactions
Тип: логическое значение — По умолчанию: true
Определяет, добавляет ли бот эмодзи-реакции на сообщения в качестве визуальной обратной связи:
- 👀 добавляется, когда бот начинает обрабатывать ваше сообщение
- ✅ добавляется, когда ответ доставлен успешно
- ❌ добавляется, если при обработке возникает ошибка
Отключите эту функцию, если реакции вас отвлекают или если роль бота не имеет разрешения Добавлять реакции.
discord.ignored_channels
Тип: строка или список — По умолчанию: []
Идентификаторы каналов, на которые бот никогда не отвечает, даже если напрямую @mentioned. Это имеет высший приоритет — если канал есть в этом списке, бот молча игнорирует все сообщения там, независимо от require_mention, free_response_channels или любой другой настройки.
# String format
discord:
ignored_channels: "1234567890,9876543210"
# List format
discord:
ignored_channels:
- 1234567890
- 9876543210
Если родительский канал потока находится в этом списке, сообщения в этом потоке также игнорируются.
discord.no_thread_channels
Тип: строка или список — По умолчанию: []
Идентификаторы каналов, на которых бот отвечает непосредственно в канале, а не автоматически создает поток. Это имеет эффект только в том случае, если auto_thread равен true (по умолчанию). В этих каналах бот отвечает как обычное сообщение, а не создает новую ветку.
discord:
no_thread_channels:
- 1234567890 # Bot responds inline here
Полезно для каналов, посвященных взаимодействию с ботами, где потоки могут добавлять ненужный шум.
discord.channel_prompts
Тип: сопоставление — По умолчанию: {}
Поканальные эфемерные системные подсказки, которые вводятся на каждом этапе соответствующего канала или потока Discord и не сохраняются в истории расшифровки.
discord:
channel_prompts:
"1234567890": |
This channel is for research tasks. Prefer deep comparisons,
citations, and concise synthesis.
"9876543210": |
This forum is for therapy-style support. Be warm, grounded,
and non-judgmental.
Поведение:
- Точные совпадения идентификатора потока /channel.
- Если сообщение поступает в ветку или сообщение на форуме и эта ветка не имеет явной записи, VibeOS возвращается к идентификатору родительского канала /forum. — Подсказки применяются эфемерно во время выполнения, поэтому их изменение сразу же влияет на будущие ходы, не переписывая историю прошлых сеансов.
discord.history_backfill
Тип: логическое значение — По умолчанию: true
Если эта функция включена, бот восстанавливает пропущенные сообщения канала на каждом @mention. При использовании require_mention: true бот обрабатывает только те сообщения, которые помечают его напрямую — все остальное в канале невидимо для стенограммы сеанса. Заполнение истории при запуске сканирует недавнюю историю канала в обратном направлении, собирая сообщения между последним ответом бота и текущим упоминанием и включает их в качестве контекста.
Поведение по поверхности:
- Каналы сервера (с
require_mention: true): заполнение сканирует канал с момента последнего ответа бота. Полезно, когда другие участники публиковали сообщения, пока к боту не обращались. - Потоки: заполнение сканирует только поток —
channel.history()Discord в потоке возвращает только сообщения этого потока, а не родительский канал. Это правильная область применения, поскольку потоки обычно представляют собой автономные диалоги. - DM: пропущено. Каждое сообщение DM запускает бота, поэтому стенограмма сеанса уже завершена — нет необходимости заполнять пробелы в упоминаниях.
- Каналы с бесплатными ответами и собственные темы, созданные ботом: пропускаются по той же причине — отсутствие запрета на упоминание означает отсутствие пробелов.
Сеансы для каждого пользователя (group_sessions_per_user: true, по умолчанию) также имеют преимущество: в сеансе пользователя отсутствует контекст, опубликованный другими участниками канала, и собственные сообщения пользователя до того, как он пометил бота. Обратная засыпка заполняет оба пробела.
discord:
history_backfill: true # default
Чтобы отключить его:
discord:
history_backfill: false
Примечание. Сообщения, поступающие во время обработки ботом (между триггером и его ответом), не фиксируются. Это общепринятое упрощение — пользователь может повторно отправить сообщение или отметить его заново.
discord.history_backfill_limit
Тип: целое число — По умолчанию: 50
Максимальное количество сообщений для сканирования назад при восстановлении контекста канала. На практике сканирование обычно останавливается гораздо раньше — на последнем сообщении бота в канале, который является естественной границей между ходами. Этот предел представляет собой защитный предел для холодного запуска и длительных перерывов, когда в недавней истории не было предшествующего сообщения от бота.
discord:
history_backfill: true
history_backfill_limit: 50
group_sessions_per_user
Тип: логическое значение — По умолчанию: true
Это глобальная настройка шлюза (не специфичная для Discord), которая определяет, будут ли пользователи в одном канале получать изолированные истории сеансов.
Когда true: Алиса и Боб разговаривают в #research, каждый ведет отдельный разговор с VibeOS. Когда 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 символов)verbose— показать полную информацию о вызове инструмента (может выдавать длинные сообщения)
display.tool_progress_command
Тип: логическое значение — По умолчанию: false
Если этот параметр включен, команда slash /verbose становится доступной в шлюзе, позволяя циклически переключаться между режимами работы инструмента (off → new → all → verbose → off) без редактирования config.yaml.
display:
tool_progress_command: true
Контроль доступа slash-команд
По умолчанию любой пользователь из allowlist может запускать любую slash-команду. Чтобы разделить на админов (полный набор) и обычных пользователей (только явно разрешённые), добавьте allow_admin_from и user_allowed_commands в блок extra платформы Discord:
gateway:
platforms:
discord:
extra:
# Existing user allowlist (unchanged)
allow_from:
- "123456789012345678" # admin user ID
- "999888777666555444" # regular user ID
# NEW — admins get all slash commands (built-in + plugin)
allow_admin_from:
- "123456789012345678"
# NEW — non-admin allowed users can only run these slash commands.
# /help and /whoami are always allowed so users can see their access.
user_allowed_commands:
- status
- model
- history
# Optional: separate admin / command lists for server channels
group_allow_admin_from:
- "123456789012345678"
group_user_allowed_commands:
- status
Поведение:
- Пользователь в
allow_admin_fromдля области (DM или канал сервера) может запускать каждую зарегистрированную slash-команду — встроенную в AND, зарегистрированную в плагине — через реестр активных команд. - Пользователь, не зарегистрированный в
allow_admin_from, может запускать только команды, перечисленные вuser_allowed_commands, а также всегда разрешенный уровень:/helpи/whoami. - Обычный чат (сообщения без slash) не затрагивается. Пользователи, не являющиеся администраторами, по-прежнему могут нормально общаться с агентом; они просто не могут запускать произвольные команды.
- Обратная совместимость: если
allow_admin_fromне установлен для области, для этой области отключается slash-команда. Существующие установки продолжают работать без изменений. - Статус администратора DM не подразумевает статус администратора канала сервера. Каждая область имеет свой собственный список администраторов.
Используйте /whoami, чтобы увидеть активную область, ваш уровень (администратор/пользователь/неограниченный) и какие slash-команды вы можете запускать.
Интерактивный выбор моделей
Отправьте /model без аргументов в канал Discord, чтобы открыть раскрывающийся список моделей:
- Выбор поставщика — раскрывающийся список «Выбрать», в котором показаны доступные поставщики (до 25).
- Выбор модели — второй раскрывающийся список с моделями выбранного провайдера (до 25).
Тайм-аут сборщика истекает через 120 секунд. С ним могут взаимодействовать только авторизованные пользователи (в DISCORD_ALLOWED_USERS). Если вы знаете название модели, введите /model <name>` напрямую.
Собственные slash-команды для навыков
VibeOS автоматически регистрирует установленные навыки как собственные команды приложения Discord. Это означает, что навыки появляются в меню автозаполнения / Discord вместе со встроенными командами.
- Каждый навык становится slash-командой Discord (например,
/code-review,/ascii-art) - Навыки принимают необязательный строковый параметр
args. - В Discord есть ограничение в 100 команд приложения на одного бота — если у вас навыков больше, чем доступных слотов, дополнительные навыки пропускаются с предупреждением в журналах.
- Навыки регистрируются во время запуска бота вместе со встроенными командами, такими как
/model,/resetи/background.
Никакой дополнительной настройки не требуется — любой навык, установленный через vibeos skills install, автоматически регистрируется как slash-команда в Discord при следующем перезапуске шлюза.
Отключение регистрации slash-команд
Если вы запускаете несколько шлюзов VibeOS для одного и того же приложения Discord (например, промежуточное + производственное), только один из них должен владеть глобальной регистрацией slash-команды — в противном случае побеждает последний запуск, и регистрации отменяются. Отключите регистрацию slash на шлюзе «последователя»:
gateway:
platforms:
discord:
extra:
slash_commands: false # default: true
Если оставить это значение true на «основном» шлюзе, сохраняется нормальное поведение — глобальные команды меню / для встроенных модулей и установленных навыков.
Отправка мультимедиа (теги send_message + MEDIA:)
Адаптер Discord поддерживает загрузку файлов для каждого распространенного типа мультимедиа с помощью инструмента send_message и встроенных тегов MEDIA:/path/to/file, создаваемых агентом:
| Тип | Как это доставляется |
|---|---|
| Изображения (PNG/JPG/WebP) | Вложенное изображение Discord со встроенным предварительным просмотром |
| Анимированные GIF-файлы | send_animation загружается как animation.gif, поэтому Discord воспроизводит его онлайн (а не как статическую миниатюру) |
| Видео (MP4/MOV) | send_video — родной видеоплеер |
| Аудио/Голос | send_voice — если возможно, собственное голосовое сообщение, в противном случае вложение файла |
| Документы (PDF/ZIP/docx/etc.) | send_document — родной аттач с кнопкой скачивания |
Ограничение размера загрузки Discord зависит от уровня повышения сервера (25 МБ бесплатно, до 500 МБ). Если VibeOS получает HTTP 413, адаптер возвращается к ссылке, указывающей на путь локального кэша, вместо того, чтобы молча отказать.
Получение произвольных типов файлов
Принимаются любые типы файлов, загружаемые пользователем. Разрешение на отправку сообщения агенту является шлюзом, а не расширением файла. Каждая загрузка загружается, кэшируется под ~/.vibeos/cache/documents/ и отображается агенту как событие сообщения с типом DOCUMENT, чтобы он мог проверить файл с помощью terminal (ffprobe, unzip, file, strings и т. д.) или read_file.
- Известные типы (PDF, docx/xlsx/pptx, zip, images/audio/video и т. д.) сохраняют свой точный MIME.
- Неизвестные типы возвращаются к сообщаемому типу контента загрузки или
application/octet-stream, если ничего не указано. - Содержимое небольших декодируемых UTF-8 файлов (текст, код, конфигурация, HTML, CSS, JSON, YAML, ...) автоматически вставляется в командную строку размером до 100 КиБ. Двоичные файлы, которые не могут быть декодированы, отображаются только как контекстные примечания, указывающие путь (автоматически переведенные для изолированных терминалов Docker/Modal через
to_agent_visible_cache_path), поэтому они не разрушают контекстное окно.
Единственным входящим ограничением является ограничение размера каждого файла (по умолчанию 32 МБ):
discord:
# Optional — raise/disable the per-file size cap. Default is 32 MiB.
# The whole file is held in memory while being cached, so unlimited
# uploads carry a real memory cost.
max_attachment_bytes: 33554432 # bytes; 0 = unlimited
Эквивалентная переменная окружения: DISCORD_MAX_ATTACHMENT_BYTES=33554432 (или 0 без ограничения).
Устаревший флаг discord.allow_any_attachment теперь неактивен — всегда принимается любой тип файла — и сохраняется только для того, чтобы существующие конфигурации не вызывали ошибок.
Отключение ограничения размера (max_attachment_bytes: 0) означает, что пользователь может загрузить в бот файл размером несколько ГБ, и шлюз будет аккуратно буферизовать его в памяти при кэшировании на диск. Устанавливайте это значение только в доверенных однопользовательских установках. Для общих ботов оставьте значение по умолчанию 32 МБ или увеличьте его консервативно.
Интерактивные подсказки (уточните)
Когда агент вызывает инструмент clarify — чтобы спросить, какой подход вы предпочитаете, получить обратную связь после выполнения задачи или проверить перед принятием нетривиального решения — Discord отображает вопрос с помощью одной кнопки на выбор:
Какую структуру мне следует использовать для информационной панели?
[1. Next.js] [2. Ремикс] [3. Астро] [Другое (введите ответ)]
Нажмите кнопку с номером, чтобы ответить, или нажмите Другое, чтобы ввести ответ в свободной форме (следующее сообщение, которое вы отправите в этом канале, станет ответом). Открытые вызовы clarify (без предустановленных вариантов) пропускают кнопки и просто записывают следующее сообщение.
Кнопки отключаются после того, как сделан выбор, поэтому повторные нажатия не приводят к двойному разрешению запроса. Настройте таймаут ответа через agent.clarify_timeout в ~/.vibeos/config.yaml (по умолчанию 600 секунды). Если вы не ответите в течение тайм-аута, агент разблокируется с помощью дозорного сообщения и адаптируется, а не зависает.
Домашний канал
Вы можете назначить «домашний канал», куда бот будет отправлять упреждающие сообщения (например, выходные данные задания cron, напоминания и уведомления). Есть два способа установить его:
Использование slash-команды
Введите /sethome в любом канале Discord, где присутствует бот. Этот канал становится домашним каналом.
Ручная настройка
Добавьте это в свой ~/.vibeos/.env:
DISCORD_HOME_CHANNEL=123456789012345678
DISCORD_HOME_CHANNEL_NAME="#bot-updates"
Замените идентификатор фактическим идентификатором канала (щелкните правой кнопкой мыши → Копировать идентификатор канала с включенным режимом разработчика).
Голосовые сообщения
VibeOS поддерживает голосовые сообщения Discord:
- Входящие голосовые сообщения автоматически расшифровываются с использованием настроенного провайдера STT: локального
faster-whisper(без ключа), Groq Whisper (GROQ_API_KEY) или OpenAI Whisper (VOICE_TOOLS_OPENAI_KEY). - Преобразование текста в речь: используйте
/voice tts, чтобы бот отправлял голосовые аудиоответы вместе с текстовыми ответами. - Голосовые каналы Discord: VibeOS также может присоединиться к голосовому каналу, слушать речь пользователей и разговаривать в канале.
Полное руководство по настройке и эксплуатации см.:
Аудиоэффекты голосового канала (окружающий + словесные подтверждения)
Когда бот находится в голосовом канале, вы можете придать ему более разговорный вид: короткое словесное подтверждение («дайте мне разобраться») перед тем, как он начнет работать, и тонкая эмбиентная «мыслящая» кровать, которая играет внизу, пока работают инструменты — речь приглушает эмбиент и снова увеличивает его после завершения, аналогично голосовому режиму Грока.
discord.py воспроизводит только один аудиопоток на одно соединение, поэтому VibeOS устанавливает программный микшер на исходящий поток, который суммирует окружающий цикл, подтверждения и ответы TTS в один поток — они перекрываются, а не отсекают друг друга.
По умолчанию эта опция отключена. Включите его в config.yaml:
discord:
voice_fx:
enabled: true # master switch
ambient_enabled: true # idle "thinking" bed while tools run
ambient_path: "" # custom loop file (any audio format); "" = built-in synthesised pad
ambient_gain: 0.18 # idle bed loudness (0.0–1.0)
duck_gain: 0.06 # ambient loudness while the bot is speaking
speech_gain: 1.0 # TTS / acknowledgement loudness
ack_enabled: true # speak a short phrase before the first tool call of a turn
ack_phrases: # picked at random; set to [] to disable the spoken ack
- "Let me look into that."
- "One moment."
- "Checking on that now."
Примечания:
- Подтверждение срабатывает не чаще одного раза за ход, только когда бот находится в голосовом канале и микшер активен. Он использует настроенный вами провайдер TTS.
ambient_pathпринимает любой файл, который может декодироватьffmpeg; это зациклено без проблем. Оставьте это поле пустым, чтобы использовать встроенный синтезированный пэд (актив не требуется).- Все настройки хранятся в
config.yaml(не.env) — они поведенческие, а не секретные. - Если
voice_fx.enabledравенfalse, при воспроизведении голоса используется исходный одноразовый путь, и ничего не меняется.
Каналы форума
Каналы форума Discord (тип 15) не принимают прямые сообщения — каждое сообщение на форуме должно быть веткой. VibeOS автоматически определяет каналы форума и создает новое сообщение в теме всякий раз, когда его необходимо отправить туда, поэтому send_message, TTS, изображения, голосовые сообщения и вложения файлов работают без специальной обработки со стороны агента.
- Имя темы извлекается из первой строки сообщения (префикс заголовка markdown удален, его длина ограничена 100 символами). Если сообщение содержит только вложение, имя файла используется в качестве имени резервного потока.
- Вложения сопровождают стартовое сообщение новой ветки — без отдельного этапа загрузки или частичной отправки.
- Один звонок, одна тема: каждое сообщение на форуме создает новую тему. Поэтому последовательные отправки на один и тот же форум будут создавать отдельные темы.
- Обнаружение трехуровневое: сначала кэш каталога канала, затем локальный пробный кэш процесса и в крайнем случае действующая проба
GET /channels/{id}(результат которой затем запоминается на весь срок службы процесса).
Обновление каталога (/channels refresh на платформах, которые его предоставляют, или перезапуск шлюза) заполняет кеш всеми каналами форума, созданными после запуска бота.
Устранение неполадок
Бот онлайн, но не отвечает на сообщения
Причина: Цель содержимого сообщения отключена.
Исправление: перейдите на Портал разработчика → ваше приложение → Бот → Намерения привилегированного шлюза → включите Намерение содержимого сообщения → Сохранить изменения. Перезапустите шлюз.
Ошибка «Запрещенные намерения» при запуске
Причина: ваш код запрашивает намерения, которые не включены на портале разработчика.
Исправление: включите все три цели привилегированного шлюза (присутствие, участники сервера, содержимое сообщения) в настройках бота, а затем перезапустите.
Бот не видит сообщения в определенном канале
Причина: Роль бота не имеет разрешения на просмотр этого канала.
Исправление: в Discord перейдите в настройки канала → Разрешения → добавьте роль бота с включенными параметрами Просмотр канала и Чтение истории сообщений.
403 Запрещенные ошибки
Причина: у бота отсутствуют необходимые разрешения.
Исправление: повторно пригласите бота с правильными разрешениями, используя URL из шага 5, или вручную настройте разрешения роли бота в разделе «Настройки сервера» → «Роли».
Бот не в сети
Причина: шлюз VibeOS не работает или токен неверен.
Исправление: убедитесь, что vibeos gateway работает. Проверьте DISCORD_BOT_TOKEN в своем файле .env. Если вы недавно сбросили токен, обновите его.
«Пользователь не разрешен» / Бот вас игнорирует
Причина: вашего идентификатора пользователя нет в DISCORD_ALLOWED_USERS.
Исправление: добавьте свой идентификатор пользователя в DISCORD_ALLOWED_USERS в ~/.vibeos/.env и перезапустите шлюз.
Люди в одном канале неожиданно делятся контекстом
Причина: group_sessions_per_user отключен, или платформа не может предоставить идентификатор пользователя для сообщений в этом контексте.
Исправление: установите это в ~/.vibeos/config.yaml и перезапустите шлюз:
group_sessions_per_user: true
Если вы намеренно хотите провести разговор в общей комнате, отключите его — просто ожидайте общей истории стенограмм и общего поведения прерываний.
Безопасность
Всегда устанавливайте DISCORD_ALLOWED_USERS (или DISCORD_ALLOWED_ROLES), чтобы ограничить круг лиц, которые могут взаимодействовать с ботом. Без того и другого шлюз по умолчанию запрещает доступ всем пользователям в качестве меры безопасности. Авторизуйте только тех, кому вы доверяете: авторизованные пользователи имеют полный доступ к возможностям агента, включая использование инструментов и доступ к системе.
Управление доступом на основе ролей
Для серверов, где доступ управляется ролями, а не отдельными списками пользователей (группы модераторов, сотрудники службы поддержки, внутренние инструменты), используйте DISCORD_ALLOWED_ROLES — список идентификаторов ролей, разделенных запятыми. Любой участник с одной из этих ролей авторизован.
# ~/.vibeos/.env — works alongside or instead of DISCORD_ALLOWED_USERS
DISCORD_ALLOWED_ROLES=987654321098765432,876543210987654321
Семантика:
- ИЛИ со списком разрешенных пользователей. Пользователь авторизован, если его идентификатор находится в
DISCORD_ALLOWED_USERSили у него есть какая-либо роль вDISCORD_ALLOWED_ROLES. - Намерение участников сервера включается автоматически. Когда установлен
DISCORD_ALLOWED_ROLES, бот включает намерение участников подключиться — это необходимо для Discord для отправки информации о роли с записями участников. - Идентификаторы ролей, а не имена. Возьмите их из Discord: Настройки пользователя → Дополнительно → Режим разработчика ВКЛ, затем щелкните правой кнопкой мыши любую роль → Копировать идентификатор роли.
- Откат DM. В DM проверка ролей сканирует взаимные гильдии; пользователь с разрешенной ролью на любом общем сервере авторизуется и в DM.
Это предпочтительная схема при смене команды модераторов — новые модераторы получают доступ в момент предоставления роли, без необходимости редактирования .env или перезапуска шлюза.
Контроль упоминаний
По умолчанию VibeOS блокирует пинг @everyone, @here и упоминаний ролей, даже если его ответ содержит эти токены. Это предотвращает рассылку спама по всему серверу из-за плохо сформулированного приглашения или отраженного пользовательского контента. Отдельные пинги @user и пинги ссылки на ответ (маленькая микросхема «ответ на…») остаются включенными, поэтому нормальный разговор по-прежнему работает.
Вы можете ослабить эти значения по умолчанию с помощью env vars или config.yaml:
# ~/.vibeos/config.yaml
discord:
allow_mentions:
everyone: false # allow the bot to ping @everyone / @here
roles: false # allow the bot to ping @role mentions
users: true # allow the bot to ping individual @users
replied_user: true # ping the author when replying to their message
# ~/.vibeos/.env — env vars win over config.yaml
DISCORD_ALLOW_MENTION_EVERYONE=false
DISCORD_ALLOW_MENTION_ROLES=false
DISCORD_ALLOW_MENTION_USERS=true
DISCORD_ALLOW_MENTION_REPLIED_USER=true
Оставьте everyone и roles в false, если вы точно не знаете, зачем они вам нужны. Для LLM очень легко создать строку @everyone внутри нормально выглядящего ответа; без этой защиты это уведомило бы каждого члена вашего сервера.
Дополнительную информацию о защите развертывания VibeOS см. в Руководстве по безопасности.