Skip to main content

Каналы и интеграции

Канал — это способ доставить сообщение в Велес и получить ответ обратно. Каналом может быть интерфейс Велеса, командная строка, Telegram, ВКонтакте, WhatsApp, Discord, Feishu, Slack, почта, QQ, Matrix, DingTalk, WeCom, Mochat или интеграция-расширение.

Общая модель

Канал отвечает за доставку сообщений. Цикл работы Велеса остаётся общим: Это значит, что инструменты, память, модель и правила Велеса применяются независимо от того, пришло сообщение из интерфейса, CLI или Telegram.

Общие настройки channels

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

allowFrom

Большинство каналов поддерживает whitelist отправителей:
Правила:
  • [] — запретить всем;
  • ["*"] — разрешить всем;
  • список id — разрешить только указанным отправителям.
Не используйте ["*"] для публичного Велеса с включёнными файловыми инструментами, оболочкой или MCP.

Telegram

Telegram обычно требует токен Велеса Telegram и allowFrom.
После настройки запустите:
Подробнее: Команды Велеса в Telegram.

ВКонтакте

Канал vk принимает сообщения сообщества через долгий опрос для сообществ (Bots Long Poll API). Веб-адрес с публичным доступом для этого не нужен. Перед настройкой Велеса подготовьте сообщество ВКонтакте:
  1. Разрешите пользователям отправлять сообщения сообществу.
  2. В разделе работы с API включите долгий опрос.
  3. В типах событий включите новые входящие сообщения (message_new).
  4. Создайте ключ доступа сообщества с правом работы с сообщениями.
  5. Запишите числовой идентификатор сообщества без знака минус.
Пример раздела channels.vk в config.json:
Сам ключ сохраните через панель секретов Велеса как channels.vk.token. Не записывайте его открытым текстом в репозиторий или сообщения чата. Значения в allowFrom должны быть строками с идентификаторами пользователей ВКонтакте. Значение [] запрещает доступ всем, а ["*"] разрешает всем; для открытого сообщества последнее значение небезопасно. После запуска veles gateway канал сам восстанавливает соединение:
  • при коде failed=1 принимает новый указатель событий ts;
  • при failed=2 получает новые сервер и ключ, сохраняя текущий ts;
  • при failed=3 заново получает сервер, ключ и ts;
  • при сетевых ошибках повторяет запросы с увеличивающейся задержкой и после maxRetries полностью пересоздаёт состояние долгого опроса.
Обычный запрос к API ограничен 30 секундами. Ожидание событий ограничено значением longPollTimeout и дополнительным запасом 10 секунд, поэтому зависший запрос не должен надолго блокировать ответы. Сейчас канал отправляет во ВКонтакте только текст. Если ответ содержит файл или изображение вместе с текстом, файл будет пропущен с предупреждением в журнале. Ответ, состоящий только из файла, считается ошибкой доставки. Для проверки запуска смотрите журнал veles gateway --verbose. Успешное подключение содержит VK channel started и VK long poll initialized. Ошибки доступа содержат код и описание ответа API ВКонтакте; окончательная ошибка отправки больше не скрывается и попадает в журнал диспетчера каналов.

Другие встроенные каналы

В кодовой базе есть встроенные модули каналов для: Точные поля зависят от конфигурации канала. Общий принцип одинаковый: включить enabled, задать учётные данные, настроить allowFrom, запустить veles gateway.

Push-уведомления (Firebase Cloud Messaging)

Канал push доставляет исходящие сообщения агента как web push-уведомления на подписанные устройства: браузер и установленную PWA на Windows, Android и iPadOS/iOS (iOS 16.4+, PWA должна быть добавлена на домашний экран). Канал только исходящий: любое OutboundMessage с channel="push" рассылается на все зарегистрированные токены устройств (или на один токен, если chat_id совпадает с ним). Конфигурация в channels.push (config.json):
notifyOnReplies — зеркалирование ответов веб-чата в push. Когда включено, каждый финальный ответ агента в веб-сессии автоматически отправляется как push-уведомление, если ни одна вкладка/PWA сейчас не видима. Вкладки сообщают видимость через POST /push/presence; запись считается видимой в течение presenceTtlSeconds секунд после последней отметки. По умолчанию это 100 секунд, потому что Nerve повторяет видимую отметку примерно каждые 45 секунд. Это логика приложения, а не решение агента: прогресс-сообщения и повторы не зеркалируются. Переключается в Nerve → настройки конфигурации → каналы → push. presenceTtlSeconds — время в секундах, в течение которого последняя видимая вкладка/PWA подавляет push-уведомления с ответами веб-чата. Минимальное значение при чтении конфигурации — 1 секунда. Секреты хранятся в зашифрованном хранилище Велеса (см. Секреты):
  • channels.push.apiKey — web API key Firebase. Он в любом случае отдается браузеру (это публичное значение по модели Firebase), но по политике деплоя хранится в секретах.
  • channels.push.serviceAccount — полный JSON сервисного аккаунта Firebase. Это настоящий серверный секрет: им подписываются отправки через FCM HTTP v1.
Настройка Firebase (один раз на проект):
  1. Создайте проект в Firebase console и включите Cloud Messaging.
  2. Добавьте web-приложение для каждого домена/инстанса — каждое получает свой appId (остальные значения проекта общие).
  3. В Cloud Messaging → Web configuration сгенерируйте пару ключей Web Push (VAPID) — публичный ключ идет в vapidKey.
  4. В Project settings → Service accounts скачайте JSON сервисного аккаунта и сохраните его строкой в секрет channels.push.serviceAccount.
Изоляция инстансов: токены устройств хранятся per-instance в ~/.veles/push_subscriptions.json, каждый сервер знает только свои подписки. Учтите, что при общем Firebase-проекте сервисный аккаунт технически способен отправлять на токены любого инстанса этого проекта; для полной изоляции используйте отдельные проекты. Подписка устройств выполняется веб-интерфейсом (Nerve) автоматически: при открытии приложения запрашивается разрешение на уведомления (на Safari/iOS — через баннер с одним нажатием), затем FCM-токен регистрируется через POST /push/subscriptions. Недействительные токены (UNREGISTERED) удаляются автоматически при отправке.

WhatsApp и мост

Для WhatsApp используется мост. Вход запускается командой:
Команда готовит мост, запускает Node.js-процесс и показывает QR-код для привязки устройства. Полезные команды:

Каналы-расширения

Велес поддерживает архитектуру расширений для каналов. veles onboard добавляет конфигурацию по умолчанию для обнаруженных встроенных каналов и каналов-расширений, не перетирая существующие значения. Для разработки канала читайте Руководство по плагинам каналов.

Сессии по каналам

Обычно ключ сессии строится так:
Примеры:
Расписания и периодические проверки могут создавать отдельные служебные сессии, но доставка результата должна проходить через сервер Велеса, чтобы интерфейс и история видели тот же ответ, который получил пользователь.

Каналы и безопасность

Перед включением внешнего канала проверьте:
  • allowFrom не пустой случайно и не ["*"] без причины;
  • tools.restrictToWorkspace включён;
  • exec выключен или ограничен;
  • секреты не лежат в рабочей области открытым текстом;
  • токен интерфейса и сервера Велеса не опубликован;
  • прогресс и подсказки об инструментах не раскрывают лишнего.