Каналы и интеграции
Канал — это способ доставить сообщение в Велес и получить ответ обратно. Каналом может быть интерфейс Велеса, командная строка, Telegram, ВКонтакте, WhatsApp, Discord, Feishu, Slack, почта, QQ, Matrix, DingTalk, WeCom, Mochat или интеграция-расширение.Общая модель
Канал отвечает за доставку сообщений. Цикл работы Велеса остаётся общим: Это значит, что инструменты, память, модель и правила Велеса применяются независимо от того, пришло сообщение из интерфейса, CLI или Telegram.Общие настройки channels
Для внешних каналов подсказки об инструментах лучше включать осторожно: они могут раскрывать имена файлов, команды или внутреннюю структуру задачи.
allowFrom
Большинство каналов поддерживает whitelist отправителей:[]— запретить всем;["*"]— разрешить всем;- список id — разрешить только указанным отправителям.
["*"] для публичного Велеса с включёнными файловыми инструментами, оболочкой или MCP.
Telegram
Telegram обычно требует токен Велеса Telegram иallowFrom.
ВКонтакте
Каналvk принимает сообщения сообщества через долгий опрос для сообществ (Bots Long Poll API). Веб-адрес с публичным доступом для этого не нужен.
Перед настройкой Велеса подготовьте сообщество ВКонтакте:
- Разрешите пользователям отправлять сообщения сообществу.
- В разделе работы с API включите долгий опрос.
- В типах событий включите новые входящие сообщения (
message_new). - Создайте ключ доступа сообщества с правом работы с сообщениями.
- Запишите числовой идентификатор сообщества без знака минус.
channels.vk в config.json:
channels.vk.token. Не записывайте его открытым текстом в репозиторий или сообщения чата.
Значения в
allowFrom должны быть строками с идентификаторами пользователей ВКонтакте. Значение [] запрещает доступ всем, а ["*"] разрешает всем; для открытого сообщества последнее значение небезопасно.
После запуска veles gateway канал сам восстанавливает соединение:
- при коде
failed=1принимает новый указатель событийts; - при
failed=2получает новые сервер и ключ, сохраняя текущийts; - при
failed=3заново получает сервер, ключ иts; - при сетевых ошибках повторяет запросы с увеличивающейся задержкой и после
maxRetriesполностью пересоздаёт состояние долгого опроса.
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 console и включите Cloud Messaging.
- Добавьте web-приложение для каждого домена/инстанса — каждое получает свой
appId(остальные значения проекта общие). - В Cloud Messaging → Web configuration сгенерируйте пару ключей Web Push (VAPID) — публичный ключ идет в
vapidKey. - В Project settings → Service accounts скачайте JSON сервисного аккаунта и сохраните его строкой в секрет
channels.push.serviceAccount.
~/.veles/push_subscriptions.json, каждый сервер знает только свои подписки. Учтите, что при общем Firebase-проекте сервисный аккаунт технически способен отправлять на токены любого инстанса этого проекта; для полной изоляции используйте отдельные проекты.
Подписка устройств выполняется веб-интерфейсом (Nerve) автоматически: при открытии приложения запрашивается разрешение на уведомления (на Safari/iOS — через баннер с одним нажатием), затем FCM-токен регистрируется через POST /push/subscriptions. Недействительные токены (UNREGISTERED) удаляются автоматически при отправке.
WhatsApp и мост
Для WhatsApp используется мост. Вход запускается командой:Каналы-расширения
Велес поддерживает архитектуру расширений для каналов.veles onboard добавляет конфигурацию по умолчанию для обнаруженных встроенных каналов и каналов-расширений, не перетирая существующие значения.
Для разработки канала читайте Руководство по плагинам каналов.
Сессии по каналам
Обычно ключ сессии строится так:Каналы и безопасность
Перед включением внешнего канала проверьте:allowFromне пустой случайно и не["*"]без причины;tools.restrictToWorkspaceвключён;execвыключен или ограничен;- секреты не лежат в рабочей области открытым текстом;
- токен интерфейса и сервера Велеса не опубликован;
- прогресс и подсказки об инструментах не раскрывают лишнего.
