Hermes Agent интегрируется с Telegram как полнофункциональный диалоговый бот. После подключения вы можете связаться с агентом на любом устройстве, передать голосовые сообщения для автоматического расшифровки, получить результаты запланированных задач и использовать агента в групповых чатах. Интеграция построена на python-telegram-bot и поддерживает приложения для текста, голоса, изображения и файлов.
Шаг 1: Создание бота через BotFather
Каждому Telegram-боту требуется выданный API-токен @BotFather — возможности управления ботами Telegram.
Откройте Telegram и зайдите @BotFather, или задержитесь по ссылке t.me/BotFather
Отправьте /newbot
Выберите отображаемое имя (например, «Агент Hermes») — может быть любое.
Выберите имя пользователя — необходимо добиться успеха и завершить работу с bot (например, my_hermes_bot).
BotFather отвечает за ваш API-токен. Он выглядит так:
help - Показать справку
new - Начать новый разговор
sethome - Установить этот чат как домашний канал
```
Шаг 3: Режим конфиденциальности (критично для группы)
Telegram-боты имеют режим конфиденциальности, который включен по умолчанию. Это самая частная причина путаницы при использовании ботов в группах.
С включенным режимом конфиденциальности ваш бот может видеть только:
- Сообщения, начинающиеся с командой /
- Ответы непосредственно на сообщения бота
- Служебные сообщения (вход/выход участников, закрепленные сообщения и т.д.)
- Сообщения на каналах, где бот является администратором
С выключенным режимом конфиденциальности бот получает каждое сообщение в группе.
Как отключить режим конфиденциальности
Напишите @BotFather
Отправьте /mybots
Выберите свою обувь
Перейдите в ** Настройки бота → Конфиденциальность группы → Выключить.
⚠️ Warning
.
Вы должны удалить и заново добавить бота в группу после изменения настроек конфиденциальности. Telegram кэширует состояние конфиденциальности, когда бот присоединяется к группе, и оно не обновится, пока бот не будет удален и добавлен полностью.:::
💡 Tip
Альтернатива отключению режима конфиденциальности: сделайте бота администратором группы**. Боты-администраторы всегда получают все сообщения независимо от настроек конфиденциальности, и это позволяет избежать глобального глобального режима.
Шаг 4: Поиск вашего идентификатора пользователя
Агент Hermes использует числовые идентификаторы пользователя Telegram для контроля доступа. Ваш идентификатор пользователя — не ваше имя пользователя, это число, например 123456789.
Метод 1 (рекомендуемый): Напишите @userinfobot — он мгновенно ответит на ваш идентификатор пользователя.
Метод 2: Напишите @get_id_bot — еще один надежный вариант.
Сохраните это число; это понадобится на следующем шаге.
Шаг 5: Настройка Hermesа
Вариант A: Интерактивная настройка (рекомендуется)
hermesgatewaysetup
При запросе выберите Telegram. Мастерит запрос токена бота и разрешенные идентификаторы пользователя, а затем записывает их для вашей конфигурации.
Вариант Б: Ручная настройка
Добавьте следующее в ~/.hermes/.env:
TELEGRAM_BOT_TOKEN=123456789:ABCdefGHIjklMNOpqrSTUvwxYZ
TELEGRAM_ALLOWED_USERS=123456789# Разделенные запятыми для нескольких пользователей
Запуск шлюза
hermesgateway
Бот должен появиться онлайн через несколько секунд. Отправьте ему сообщение в Telegram для проверки.
Отправка сгенерированных файлов из терминалов на базе Docker
Если ваш бэкенд-терминал — «докер», имейте в виду, что приложения Telegram отправляются процессом шлюза, а не из контейнера. Это означает, что конечный путь MEDIA:/... должен быть прочитан на хосте, где работает шлюз.
Частая ошибка:
агент записывает файл внутри Docker в /workspace/report.txt
модель выдает MEDIA:/workspace/report.txt
доставка в Telegram не осуществляется, так как /workspace/report.txt существует только внутри контейнера, а не на хосте.
указывайте видимый на хосте путь в MEDIA:, например:
МЕДИА:/home/user/.hermes/cache/documents/report.txt
Если у вас уже есть раздел docker_volumes:, страницы новый монтируемый том в том же списке. Дублирующиеся ключи YAML молча переопределяют звук.
Поддерживаемые расширения файлов MEDIA:
Шлюз извлекает теги MEDIA:/path/to/file из ответов агента и отправляет указанный файл как родное вложение платформы. Поддерживаемые расширения для всех платформенных шлюзов:
Все, что есть в этом списке, представляет собой родное приложение на платформах, которые применяются (Telegram, Discord, Signal, Slack, WhatsApp, Feishu, Matrix и т.д.); на платформах без родной поддержки используется запасной вариант в виде видеоссылок или текстового индикатора. Жирные категории были добавлены в последних релизах — если вы указали, что модель говорила «вот файл: /path/to/report.docx», замените на «MEDIA:/path/to/report.docx» для родной доставки.
Режим вебхука
По умолчанию Hermes подключается к Telegram через длинный опрос — шлюз отправляет исходящие запросы к серверам Telegram для получения новых обновлений. Это хорошо работает для локальных и постоянно работающих развертываний.
Для облачных развертываний (Fly.io, Railway, Render и т.д.) режим вебхука более экономичен. Эта платформа может автоматически активировать беспроводные машины при передаче HTTP-трафика, но не при исходящих соединениях. Поскольку опрос исходит, опрашивающий бот никогда не сможет «уснуть». Режим вебхука меняет направление — Telegram отправляет обновления по HTTPS URL вашего бота, что позволяет развертываниям «заливать» в режиме ожидания.
Опрос (по умолчанию)
Вебхук
Направление
Шлюз → Telegram (приходит)
Telegram → Шлюз (в ближайшее время)
Лучше всего для
Локальные, постоянно работающие серверы
Облачные платформы с автопробуждением
Настройка
Нет дополнительной конфигурации
Установить TELEGRAM_WEBHOOK_URL
Стоимость простоя
Машина значит включенной
Машина может спать между сообщениями
Конфигурация
Добавьте следующее в ~/.hermes/.env:
TELEGRAM_WEBHOOK_URL=https://my-app.fly.dev/telegram
TELEGRAM_WEBHOOK_SECRET="$(opensslrand-hex32)"# обязательно# TELEGRAM_WEBHOOK_PORT=8443 # опционально, по умолчанию 8443
Переменная
Обязательно
Описание
TELEGRAM_WEBHOOK_URL
Да
Публичный URL-адрес HTTPS, куда Telegram будет публиковать обновления. Путь URL извлекается автоматически (например, /telegram из примера выше).
TELEGRAM_WEBHOOK_SECRET
Да (когда установлен TELEGRAM_WEBHOOK_URL)
Секретный токен, который Telegram повторяет при каждом запросе вебхуки для проверки. Шлюз отказывается запускаться без него — см. GHSA-3vpc-7q5r-276h. Сгенерируйте с помощью openssl rand -hex 32.
TELEGRAM_WEBHOOK_PORT
Нет
Локальный порт, на котором слушает сервер вебхука (по умолчанию: 8443).
Когда установлен TELEGRAM_WEBHOOK_URL, шлюз запускает HTTP-сервер вебхука вместо опроса. Если не выбрано, используется режим опроса — поведение не изменяется по сравнению с физическими версиями.
Пример облачного развертывания (Fly.io)
Добавьте переменные окружения в секреты вашего приложения на Fly.io:
В логе шлюза должно появиться: [telegram] Connected to Telegram (режим веб-перехватчика).
Поддержка прокси
Если API Telegram заблокирован или вам нужно направлять трафик через прокси, установите URL-прокси, специально для Telegram. Он имеет приоритет над общими переменными окружениями HTTPS_PROXY/HTTP_PROXY.
Прокси применяется как к главному соединению Telegram, так и к запасному IP-транспорту. Если прокси, специальный для Telegram, не установлен, шлюз использует HTTPS_PROXY / HTTP_PROXY / ALL_PROXY (или процент определения системного прокси macOS).
Домашний канал
Используйте команду /sethome в любом Telegram-чате (личном или групповом), чтобы назначить его домашним каналом. Запланированные задачи (cron) публикуют свои результаты на этом канале.
Вы также можете установить его вручную в ~/.hermes/.env:
Без ffmpeg аудио Edge TTS воспроизводится как обычный аудиофайл (все еще воспроизводится, но вместо голосового пузырька используется прямоугольный плеер).
Настройте TTS-провайдера в config.yaml под ключом tts.provider.
Использование в групповых чатах
Hermes Agent работает в групповых чатах Telegram с некоторыми особенностями:
Режим конфиденциальности Устанавливает, какие сообщения может видеть бот (см. Шаг 3)
TELEGRAM_ALLOWED_USERS по-прежнему применяется — только авторизованные пользователи могут активировать боту, даже в группах.
Вы можете запретить боту в обычном групповом чате с помощью telegram.require_mention: true
С telegram.require_mention: true групповые сообщения принимаются, если они:
это ответы на одно из сообщений бота
содержит упоминание @botusername
это /command@botusername (форма команды из меню бота, включающая имя бота)
Соответствует одному из настроенных регулярных выражений-пробудителей в telegram.mention_patterns
Используйте telegram.ignored_threads, чтобы заставить Hermesа молчать в определенных темах форума Telegram, даже если группа в проигрышном случае разрешила свободные ответы или ответы по упоминанию.
Если telegram.require_mention не установлен или имеет значение false, Hermes сохраняет предыдущее поведение открытой группы и отвечает за обычные групповые сообщения, которые видит
Устранение неполадок: работает в личных сообщениях, но не в группах
Если бот отвечает в личном чате, молчит в группе, проверьте эти барьеры в порядке:
Доставка Telegram: отключите режим конфиденциальности в BotFather, сделайте бота администратором или упомяните бота напрямую. Hermes не может использовать в групповых сообщениях, которые Telegram никогда не доставляет.
Повторное добавление после изменения конфиденциальности: удалить бота из групп и страниц снова после изменения настроек конфиденциальности в BotFather. Telegram может сохранить старое качество доставки для нынешних участников.
Авторизация Hermes: убедитесь, что отправитель задан в TELEGRAM_ALLOWED_USERS или TELEGRAM_GROUP_ALLOWED_USERS, или разрешите с помощью группового чата с TELEGRAM_GROUP_ALLOWED_CHATS.
Фильтры упоминаний: если найдены telegram.require_mention: true, обычно групповой чат меняется, если сообщение не является слэш-командой, ответом боту, упоминанием @botusername или совпадением с настроенными mention_patterns.
Отрицательные ID чатов нормальны для групп и супергрупп Telegram. Если вы используете авторизацию на уровне чата, поместите эти идентификаторы в TELEGRAM_GROUP_ALLOWED_CHATS, а не в список разрешенных пользователей-отправителей.
Этот пример разрешает все обычные прямые триггеры, а также сообщения, начинающим с chompy, даже если они не используют @упоминание.
Сообщения в темах Telegram 31 и 42 всегда игнорируются ссылки на ссылки и ответы.
Примечания к mention_patterns
Шаблоны использования регулярных выражений Python
Сравнение нечувствительности к регистру
Шаблоны проверяются как для текстовых сообщений, так и для подписей медиа.
Некорректированные регулярные выражения-шаблоны отключаются с предупреждением в логах шлюза и не отсылают на сайт бота.
Если вы хотите, чтобы шаблон совпадал только в начале сообщения, используйте привязку ^
Темы личных чатов (API бота 9.4)
Bot API Telegram 9.4 (февраль 2026 г.) Представлены темы личных чатов — боты могут создавать темы-форумы непосредственно в индивидуальных чатах 1-на-1, без необходимости в супергруппе. Это позволяет включить несколько изолированных рабочих помещений в существующем личном чате с Hermesом.
Сценарий использования
Если вы работаете над несколькими долгосрочными проектами, темы содержат их контекстный раздел:
Тема «Вебсайт» — работа над вашим продакшн-веб-сервисом
Тема «Исследования» — обзор литературы и научных статей.
Тема «Общее» — разносторонние задачи и быстрые решения.
каждая тема получает свой собственный сеанс разговора, истории и контекста — полностью изолированный от других.
Конфигурация:::Внимание Предварительные требования
Перед добавлением темы в конфигурацию пользователь должен переключить режим в личном чате с низом:
Откройте свой личный чат с ботом Hermes в Telegram.
Нажмите на имя бота вверх, чтобы открыть информацию о чате.
Включите Темы (переключатель, превращающий чат в форум)
Без этого Hermes при запуске запишет Чат не является форумом и пропустит создание темы. Эта настройка на стороне клиента Telegram — бот не может включить ее программно.
Добавьте темы в раздел platforms.telegram.extra.dm_topics в ~/.hermes/config.yaml:
platforms:telegram:extra:dm_topics:-chat_id:123456789# Ваш Telegram user IDtopics:-name:Общееicon_color:7322096-name:Вебсайтicon_color:9367192-name:Исследованияicon_color:16766590skill:arxiv# Автоматически загружать навык в этой теме
Поля:
Поле
Обязательно
Описание
name
Да
Отображаемое имя темы
icon_color
Нет
Код цвета иконки Telegram (целое число)
icon_custom_emoji_id
Нет
ID пользовательского эмодзи для иконки темы
skill
Нет
Навык для автоматической загрузки при новых сессиях в этой теме
thread_id
Нет
Автоматически заполняется после создания темы — не устанавливать вручную
Как это работает
При запуске шлюза Hermes вызывает createForumTopic для каждой темы, у которой еще нет thread_id
thread_id автоматически сохраняется обратно в config.yaml — последующие перезапуски пропускают вызов API
Каждая тема сопоставляется с изолированным ключом сессии: agent:main:telegram:dm:{chat_id}:{thread_id}
Сообщения в каждой теме имеют свою историю разговора, сброс памяти и контекстное окно
Привязка навыка
Темы с полем skill автоматически загружают этот навык при запуске новой сессии в теме. Это работает точно так же, как ввод /skill-name в начале разговора — содержимое навыка внедряется в первое сообщение, а последующие сообщения видят его в истории разговора.
Например, тема с skill: arxiv будет иметь предварительно загруженный навык arxiv всякий раз, когда ее сессия сбрасывается (из-за таймаута бездействия, ежедневного сброса или ручного /reset).
💡 Tip
Темы, созданные вне конфигурации (например, ручным вызовом API Telegram), обнаруживаются автоматически, когда приходит служебное сообщение forum_topic_created. Вы также можете добавлять темы в конфигурацию, пока шлюз работает — они будут подхвачены при следующем промахе кэша.
Режим мультисессионного DM (/topic)
Мультисессионный DM в стиле ChatGPT — один бот, много параллельных разговоров. В отличие от управляемых оператором extra.dm_topics выше, этот режим управляется пользователем: никакой конфигурации, никаких предварительно объявленных имен тем. Конечный пользователь включает его с помощью /topic, затем нажимает кнопку + в Telegram, чтобы создать столько тем, сколько захочет, каждая из которых является полностью независимой сессией Hermes.
Подкоманды /topic
Форма
Контекст
Эффект
/topic
Корневой DM, еще не включен
Проверить возможности BotFather, включить мультисессионный режим, создать закрепленную системную тему
/topic
Корневой DM, уже включен
Показать статус: несвязанные сессии, доступные для восстановления
/topic
Внутри темы
Показать текущую привязку сессии темы
/topic help
Любой
Встроенное использование
/topic off
Корневой DM
Отключить мультисессионный режим и очистить все привязки тем для этого чата
/topic <session-id>
Внутри темы
Восстановить предыдущую сессию Telegram в текущей теме
Только авторизованные пользователи (белый список через TELEGRAM_ALLOWED_USERS / конфигурация авторизации платформы) могут выполнять /topic. Неавторизованный отправитель получает отказ вместо активации.
DM темы vs мультисессионный DM режим
extra.dm_topics (на основе конфигурации)
/topic (управляется пользователем)
Кто активирует
Оператор в config.yaml
Конечный пользователь, отправив /topic
Список тем
Фиксированный набор, объявленный в конфиге
Пользователь свободно создает/удаляет темы
Имена тем
Выбраны оператором
Выбраны пользователем; автоматически переименовываются в соответствии с названием сессии Hermes
Поведение корневого DM
Без изменений — обычный чат
Становится системным лобби (некомандные сообщения отклоняются)
Основной вариант использования
Постоянные рабочие пространства с опциональной привязкой навыков
Обе функции могут сосуществовать на одном боте — вы запускаете /topic из DM пользователя, а extra.dm_topics продолжает управлять объявленными оператором темами для других чатов.
Предварительные требования
В @BotFather откройте своего бота → Bot Settings → Threads Settings:
Не отключайте возможность пользователям создавать темы (оставляет allows_users_to_create_topics включенным)
Когда пользователь впервые запускает /topic, Hermes вызывает getMe для проверки обоих флагов. Если хотя бы один выключен, Hermes отправляет скриншот страницы Threads Settings BotFather и объясняет, что нужно переключить — активация не происходит, пока не выполнены предварительные условия.
Процесс активации
Из корневого DM отправьте:
/topic
Hermes:
Проверьте getMe().has_topics_enabled и allows_users_to_create_topics
Если оба истинны, включите мультисессионный темный режим для этого в DM.
Создаст и закрепит Системную тему для воздействий/команд (наилучшим образом)
Ответить списком предыдущих несвязанных сессий Telegram, которые пользователь может восстановить
После активации корневой DM является лоббистом: обычный запрос отклоняется с надписью Все сообщения. Системные команды (/status, /sessions, /usage, /help и т.д.) все еще работают в корневом чате.
Создание новой темы (пользовательский процесс)
Откройте DM бота в Telegram.
Нажмите Все сообщения вверх по интерфейсу бота, а затем отредактируйте любое сообщение.
Telegram предлагает новую тему для этих сообщений.
Hermes отвечает за эту тему — теперь это отдельная сессия.
каждая тема получает свою собственную историю разговора, состояние модели, инструменты выполнения и идентификатор сеанса. Ключ выполнения: agent:main:telegram:dm:{chat_id}:{thread_id} — идентичен выполнению DM темы на основе структуры.
Автоматическое переименование темы
Когда Hermes выдает название сессии для темы (через конвейер автоназвания, после первого обмена), сама тема Telegram переименовывается в соответствии с ним — например, «Новая тема» становится «План ограничений базы данных». Результат переименования по возможности: регистрируются ошибки, но не нарушают работу сессии.
/new внутри темы
Сбрасывает сессию текущей темы (новый идентификатор сессии, свежая история), не затрагивая другие темы. Hermes отвечает напоминаниям, что для параллельной работы обычно лучше создать другую тему (через Все сообщения).
Восстановление предыдущей сессии
Внутри темы отредактировать:
/topic <session-id>
Это привязывает текущую тему к параллельной сессии Hermesа вместо начала нового. Полезно для продолжения разговора, который переключается на включение режима тем. Ограничения:
Целевая сессия должна быть частной для такого же клиента Telegram
Целевая сессия не должна быть уже вынесена по другой теме.
Hermes поддерживает название сессии и воспроизводит последнее сообщение ассистента для контекста.
Чтобы узнать ID сессий, отправьте /topic (без аргументов) в корневом DM — Hermes перечислит несвязанные сессии Telegram пользователя.
/topic внутри темы (без аргументов)
Показывает текущую привязку темы: название сессии, идентификатор сессии и подсказки для /new vs создание другой темы.
Как это работает под капотом
Активация сохраняется в telegram_dm_topic_mode(chat_id, user_id, Enabled,...) в state.db
Ваша привязка темы сохраняется в telegram_dm_topic_bindings(chat_id, thread_id, session_id,...) с ON DELETE CASCADE по session_id — удаление сессии автоматически очищает ее привязку темы
Миграция SQLite для режима опциональный: она прогрессирует при первом вызове /topic, никогда при запуске шлюза. Пока пользователь не запустил /topic в этом профиле, state.db не меняется.
Каждое входящее сообщение DM ищет свою привязку (chat_id, thread_id). Если он есть, поиск направляет сообщение к связанной сессии через SessionStore.switch_session(), чтобы включить переключаемую сессию в идентификаторе сеанса, сохраняя согласованным на диске.
/new внутри темы перезаписывает текст привязки, указывая на определение нового идентификатора сессии, чтобы следующее сообщение оставалось на свежей сессии.
Темы, объявленные в extra.dm_topics, никогда не переименовываются автоматически — имя, выбранное оператором, сохраняется, даже если включен мультисессионный режим
Общая (закрепленная сверху) тема в DM с форумом, как корневое лобби, независимо от того, доставляет ли свои сообщения Telegram с message_thread_id=1 или без thread_id
Напоминания об ограниченности корневого лобби: одно сообщение за 30 секунд в чате — пользователь, который забыл о включенном режиме тем и набрал десять запросов в корне, не получил десять ответов
Скриншоты настройки BotFather ограничены ресурсом: одна отправка на 5 минут в чате — повторные запросы /topic, пока настройки тем все еще отключены, не загружать то же самое изображение заново.
/background <prompt>, запущенный внутри темы, выдает результаты обратно в ту же тему; фоновые сессии не вызывают переименование темы владельца
Сам /topic защищен проверкой авторизации пользователя бота — неавторизованные DM получают отказ вместо активации
Отключение мультисессионного режима
Отправьте /topic off в корневой DM. Hermes переключает сигнал в выключенное состояние, очищает привязки (thread_id → session_id) для чата, и корневой DM возвращается к обычному чату Hermesа. Существующие темы в Telegram не удаляются — они просто перестают управляться как независимая сессия. Повторный запуск /topic позже снова включает режим.
Если необходимо удалить порошок вручную (например, слить массу для многих чатов), удалите смесь напрямую:
sqlite3~/.hermes/state.db\"UPDATE telegram_dm_topic_mode SET enabled = 0 WHERE chat_id = '<your_chat_id>'; \ DELETE FROM telegram_dm_topic_bindings WHERE chat_id = '<your_chat_id>';"
Понижение версии Hermes
Если вы понизите версию Hermes до той, которая была до /topic, функция просто перестанет работать — таблицы telegram_dm_topic_mode и telegram_dm_topic_bindings будут выполняться в state.db, но это будут альтернативные стандартные коды. DM возвращается к родному отправке по потоку (каждый message_thread_id все еще получает свою сессию через build_session_key), поэтому ваши временные темы Telegram продолжают работать как виртуальная сессия. Корневой ДМ больше не является лоббистом — сообщения там обращаются к агенту как раньше. Повторное обновление новой версии возобновляет мультисессионный режим ровно в том состоянии, в котором находился.
Привязка навыка к теме форума группы
Супергруппы с включенным режимом темы (также называемые «темами форума») уже имеют изоляцию сессий по темам — каждый thread_id сопоставляется со своим разговором. Но вы можете захотеть автоматически загрузить навыки, когда приходят сообщения по определенной теме группы, точно так же, как работает привязка навыков к теме DM.
Сценарий использования
Командная супергруппа с темами форума для разных рабочих потоков:
Тема Инженерия → автоматически загружает навыки разработка программного обеспечения
Тема Исследования → автоматически загружает навыки arxiv
Тема Общее → без навыков, ассистент общего назначения
Конфигурация
Добавьте привязки тем в раздел platforms.telegram.extra.group_topics в ~/.hermes/config.yaml:
platforms:telegram:extra:group_topics:-chat_id:-1001234567890# ID супергруппыtopics:-name:Инженерияthread_id:5skill:software-development-name:Исследованияthread_id:12skill:arxiv-name:Общееthread_id:1# Нет навыка — общего назначения
Поля:
Поле
Обязательно
Описание
chat_id
Да
Числовой ID супергруппы (отрицательное число, начинающееся с -100)
имя
Нет
Человекочитаемая метка для темы (только информация)
thread_id
Да
ID темы форума Telegram — виден в ссылках вида t.me/c/<group_id>/<thread_id>
умение
Нет
Навык для автоматической загрузки при новых сессиях в этой теме
Как это работает
Когда сообщение приходит в парламентскую группу по теме, Hermes ищет chat_id и thread_id в конфиге group_topics
Если соответствующая запись имеет поле skill, этот навык автоматически загружается для сессии — идентично привязке навыка к теме в DM.
Темы без ключа skill получают только изоляционные сессии (существующее поведение, без изменений)
Несопоставленные значения thread_id или chat_id молчание о результате — без ошибок, без функций
Отличия от DM тем
DM темы
Темы группы
Ключ конфига
extra.dm_topics
extra.group_topics
Создание темы
Hermes создает темы через API, если thread_id отсутствует
Чтобы найти тему thread_id, внедрите тему в Telegram Web или Desktop и просмотрите URL-адрес: https://t.me/c/1234567890/5 — последнее число (5) и есть thread_id. chat_id для супергрупп — это идентификатор группы с префиксом -100 (например, группа 1234567890 становится -1001234567890).
## Последние функции API ботов
Bot API 9.4 (февраль 2026 г.): Темы личных чатов — боты могут создавать темы форума в личных чатах 1-на-1 через createForumTopic. Hermes использует это для двух разных функций: управляемые оператором Темы личных чатов (на основе конфигурации, фиксированный список тем) и управляемый пользователь Режим мультисессионного DM (активируется /topic, неограниченное количество созданных тем пользователем).
Политика конфиденциальности: Telegram теперь, чтобы у ботов была политика конфиденциальности. Настройте ее через BotFather с помощью /setprivacy_policy, иначе Telegram может автоматически генерировать заполнение. Это особенно важно, если ваш бот является публичным.
Bot API 9.5 (март 2026 г.): Нативная потоковая передача через sendMessageDraft. Hermes использует собственный API-интерфейс черновиков потоковой передачи Telegram для отображения анимированных изображений, просмотр ответа агента по мере поступления токенов в личных чатах. Устраняет прерывистость каждого редактирования, которое вы видели раньше в офисе с помощью опроса editMessageText на медленных моделях.
Транспорт потоковой передачи (gateway.streaming.transport)
Когда потоковая передача включена (gateway.streaming.enabled: true), Hermes выбирает один из четырех транспортов:
Значение
Поведение
авто (по умолчанию)
Нативная потоковая связь черновиков в терапевтических чатах (в настоящее время Telegram в DM); окончательный путь на основе редактирования в прошедшем случае. Изящно переключается, если кадр черновика не требуется.
черновик
Принудительно вручать родные черновики. Логирует понижение и переключается на редактирование, если чат не поддерживает черновики (например, группы/темы).
редактировать
Устаревший прогрессивный опрос editMessageText для каждого типа чата.
выключено
Полностью отключите потоковую передачу (только финальный ответ, без прогрессивных обновлений).
В ~/.hermes/config.yaml:
gateway:streaming:enabled:truetransport:auto# auto | draft | edit | off
Что вы показываете в DM с auto (по умолчанию) — при ответе агента Telegram показывает анимированный предварительный просмотр черновика, который обновляется по токену за токеном. Когда ответ будет завершен, он будет представлен, как обычное сообщение, и предварительный просмотр черновика будет очищаться клиентом таким образом. У Черновикова нет идентификатора сообщения, поэтому окончательный ответ остается в истории чата.
А как насчет группы, супергруппы, тем форума? Telegram ограничивает sendMessageDraft личными чатами (DM). Шлюз прозрачности переключается на путь создания основ для всего остального — такого же UX, как и раньше.
Что, если кадр черновика не возник? Любая ошибка (временная сетевая ошибка, отклонение на стороне сервера, старая версия python-telegram-bot) переключает этот ответ обратно на путь на основе редактирования на оставшуюся часть потока. Следующий ответ получает новый город.
Рендеринг: таблицы и предварительные просмотры ссылок
MarkdownV2 Telegram не имеет родного синтаксиса таблиц — таблицы с разделителями (табличными элементами) представляют собой зашумленный текст с обратной косой чертой, если передаются как есть. Hermes автоматически нормализует markdown-таблицы:
Небольшие таблицы преобразуются в маркированные таблицы по строкам — следующая строка становится читаемым пунктом списка под заголовками столбцов. Хорошо для 2–4 столбцов и сохранения ячеек.
Большие или самые большие таблицы возвращаются к фрагменту кода (огороженный блок-код) с выровненными столбцами, чтобы ничего не схлопнулось. Добавляется подсказка в одну таблицу, чтобы агент знал, что в Telegram лучше предпочесть прозу вместо новых таблиц.
Нечего настраивать — адаптер подбирает подходящий запасной вариант для каждого сообщения. Если вы хотите старое поведение «всегда код-блок», отключите нормализацию таблицы, установив telegram.pretty_tables: false в config.yaml (по умолчанию: true).
** Предварительный просмотр ссылок.** Telegram автоматически включает предварительный просмотр ссылок для URL в сообщениях бота. Если вы хотите отключить их (длинный вывод /tools, ответ агента, упоминающий десять ссылок и т.д.):
Когда это включено, Hermes прикрепляет LinkPreviewOptions(is_disabled=True) к каждому обращению к сообщению и возвращает постоянный параметр disable_web_page_preview в старой версии python-telegram-bot.
Белый список группы
Telegram-группы и чаты форума имеют два ортогональных барьера, которые вы можете настроить:
ID пользователей-отправителей (group_allow_from / TELEGRAM_GROUP_ALLOWED_USERS) — белый список для отправителей, применяется только к сообщениям групп/форумов. Используйте его, когда хотите управлять настройками доступа бота в группах без добавления их в TELEGRAM_ALLOWED_USERS (что также дало бы им доступ к DM).
ID чатов (group_allowed_chats / TELEGRAM_GROUP_ALLOWED_CHATS) — белый список для чатов. Любой участник этих групп/форумов может взаимодействовать с ботом. Полезно для командных/поддерживающих ботов, где само членство в группе является сигналом доступа.
gateway:platforms:telegram:extra:# Глобальный доступ (DM + группы). Пользователи здесь могут всегда вызывать бота.allow_from:-"123456789"# ID отправителей, разрешенных только в группах/форумах. НЕ предоставляет доступ к DM.group_allow_from:-"987654321"# Целые группы/форумы — любой участник авторизован.group_allowed_chats:-"-1001234567890"
TELEGRAM_ALLOWED_USERS соответствует всем типам чатов (DM, группы, форумы).
TELEGRAM_GROUP_ALLOWED_USERS авторизуется только представителями отправителей в группах/форумах. Они все еще не могут писать боту в DM, если не указано в TELEGRAM_ALLOWED_USERS.
Чат из TELEGRAM_GROUP_ALLOWED_CHATS авторизует каждого участника этого чата независимо от отправителя.
Используйте * в любом из этих параметров, чтобы разрешить любому отправителю/чату.
Это применяется на поверхности существующих триггеров упоминаний/шаблонов и на поверхности group_topics + ignored_threads.
Миграция с версии до PR #17686
В этом разделе TELEGRAM_GROUP_ALLOWED_USERS был один параметр, и пользователи сохраняли его ID чатов. Для обратной совместимости в виде ID чата (начинающиеся с -) в TELEGRAM_GROUP_ALLOWED_USERS все еще воспринимаются как ID чата, и один раз регистрируется предупреждение об устаревании. Миграция:
# Старое (все еще работает, но устарело)TELEGRAM_GROUP_ALLOWED_USERS="-1001234567890"# НовоеTELEGRAM_GROUP_ALLOWED_CHATS="-1001234567890"
Контроль доступа к слеш-командам
По умолчанию каждый разрешенный пользователь может настроить любую слеш-команду. Чтобы просмотреть список администраторов (полный доступ к слэш-командам) и обычных пользователей (только команды, которые вы явно разрешили), разделите allow_admin_from и user_allowed_commands в блоке extra платформы:
gateway:platforms:telegram:extra:# Существующие белые списки (без изменений)allow_from:-"123456789"# администратор-"555555555"# обычный пользователь-"777777777"# обычный пользователь# НОВОЕ — администраторы получают все слеш-команды (встроенные + плагинов)allow_admin_from:-"123456789"# НОВОЕ — неадминистративные разрешенные пользователи могут выполнять только эти слеш-команды.# /help и /whoami всегда разрешены, чтобы пользователи могли видеть свой доступ.user_allowed_commands:-status-model-history# Опционально: отдельные списки администраторов/команд для группgroup_allow_admin_from:-"123456789"group_user_allowed_commands:-status
Поведение:
Пользователь, указанный в allow_admin_from для области (DM или группы), может выполнять каждую зарегистрированную слеш-команду — как встроенные команды, так и зарегистрированные плагины — через живой реестр.
Пользователь из allow_from, но не из allow_admin_from, может выполнять только команды, перечисленные в user_allowed_commands, плюс всегда разрешенный минимум: /help и /whoami.
Обычные сообщения (не слеш-команды) не затрагиваются. Неадминистративные пользователи могут нормально общаться с агентом, они просто не могут оставить произвольные команды.
Обратная связь: если allow_admin_from не установлен для области, блокировка слеш-команд для этой области отключена. Существующие установки продолжают работать без изменений.
Статус администратора в ДМ не подразумевает статус администратора в группе. У нашей области есть свой собственный список администраторов.
Если выбрано только group_allow_admin_from, область DM остается в неограниченном режиме (обратная настройка).
Используйте /whoami, чтобы увидеть активную область, ваш уровень (администратор/пользователь/неограниченный) и какие слеш-команды вы можете настроить.
Интерактивный выбор моделей
Когда вы отправляете /model без аргументов в Telegram-чат, Hermes показывает встроенную интерактивную клавиатуру для переключения моделей:
Выбор провайдера — кнопки, показывающие каждого доступного провайдера с указанием модели (например, «OpenAI(15)», «✓ Anthropic(12)» для конкретного провайдера).
Выбор модели — постраничный список моделей с навигацией Предыдущая/Следующая, нажмите Назад для возврата провайдерам и Отмена.
Текущая модель и поставщик представлены вверху. Вся навигация происходит путем редактирования того же сообщения на месте (без засорения чата).
💡 Tip
Если вы знаете точное имя модели, введите /model <имя> напрямую, чтобы проголосовать за выбор. Вы также можете ввести /model <name> --global, чтобы сохранить изменения для всех сессий.
Запасные IP-адреса через DNS-over-HTTPS
В некоторых ограниченных сетях api.telegram.org может быть разрешено использование IP, что является недоступен. Адаптер Telegram включает механизм запасных IP, который четко повторяет соединения с альтернативными IP, сохраняя правильное имя хоста TLS и SNI.
Как это работает
Если установлен TELEGRAM_FALLBACK_IPS, эти IP используются напрямую.
В противном случае адаптер автоматически запрашивает Google DNS и Cloudflare DNS через DNS-over-HTTPS (DoH) для определения альтернативных IP-адресов для api.telegram.org.
IP-адреса, возвращенные DoH, которые соответствуют результатам системного DNS и используются как резервные.
Если DoH также заблокирован, жестко заданный запасной IP (149.154.167.220) используется в качестве средства.
Как только реализуется запасной IP, он становится «липким» — источник запроса использует его напрямую, без повторной попытки основного пути.
Конфигурация
# Явные запасные IP (через запятую)TELEGRAM_FALLBACK_IPS=149.154.167.220,149.154.167.221
Или в ~/.hermes/config.yaml:
platforms:telegram:extra:fallback_ips:-"149.154.167.220"```<div class="admonition admonition-tip"><p class="admonition-title">💡 Tip</p>Обычно вам не нужно настраивать это вручную. Автообнаружение через DoH осуществляется в большинстве случаев в ограниченных сетях. Переменное окружение `TELEGRAM_FALLBACK_IPS` потребуется только в том случае, если DoH также заблокирован в вашей сети.</div>## Поддержка проксиЕсли вашей сети требуется HTTP-прокси для доступа в Интернет (обычно в корпоративной среде), адаптер Telegram автоматически считывает стандартные переменные прокси-серверы в окружении и направляет все соединения через прокси.### Поддерживаемые переменныеАдаптер впоследствии этих включений окружения по порядку, с помощью первого, который установил:1. `HTTPS_PROXY`2. `HTTP_PROXY`3. `ALL_PROXY`4. `https_proxy` / `http_proxy` / `all_proxy` (строчные варианты)### КонфигурацияУстановите прокси-сервер перед запуском шлюза:```bashexport HTTPS_PROXY=http://proxy.example.com:8080hermes gateway
Или добавьте в ~/.hermes/.env:
HTTPS_PROXY=http://proxy.example.com:8080
Прокси применяется как к сетевому транспорту, так и ко всем запасным IP-транспортам. Никакой дополнительной конфигурации Hermes не требуется — если установлена переменная окружность, она используется автоматически.
📝 Note
Это закрывает пользовательский запас транспортного средства, который Hermes использует для подключения Telegram. Стандартный клиент httpx, прогноз в других точках, уже поддерживает переменные прокси-окружения.
Реакции на сообщения
Бот может добавлять эмодзи-реакции на сообщения в виде визуальной обратной связи при обработке:
👀 когда бот начнет обрабатывать ваше сообщение
✅ когда ответ успешно доставлен
❌ если во время обработки произойдет ошибка
Реакции отключены по умолчанию. Включите их в config.yaml:
Ключи — это ID чатов (группы/супергруппы) или ID тем форума. Для групп-форумов промпты уровней темы переопределяют промпты уровней группы:
Сообщение в теме 42 внутри группы -1001234567890 → использует подсказку темы 42
Сообщение в теме 99 (нет явных записей) → возвращается к промпту группы -1001234567890
Сообщение в группе без записей → сообщение о канале не применяется
Несколько ключей YAML автоматически нормализуются в строках.
Устранение неполадок
Проблема
Решение
Бот вообще не отвечает
Проверьте, что TELEGRAM_BOT_TOKEN верен. Проверьте наличие логи гермес шлюз на наличие ошибок.
Бот отвечает «несанкционировано»
Ваш идентификатор пользователя отсутствует в TELEGRAM_ALLOWED_USERS. Перепроверьте с помощью @userinfobot.
Бот игнорирует групповые сообщения
Скорее всего, включен режим конфиденциальности. Отключите его (Шаг 3) или сделайте бота администратором группы. Не забудьте удалить и заново добавить бота после изменения конфиденциальности.
Голосовые сообщения не расшифровываются
Проверьте, что STT доступен: установите faster-whisper для локальной расшифровки или установите GROQ_API_KEY / VOICE_TOOLS_OPENAI_KEY в ~/.hermes/.env.
Голосовые ответы — файлы, а не пузырьки
Установите ffmpeg (нужен для конвертации Opus в Edge TTS).
Токен бота отозван/недействителен
Сгенерируйте новый токен через /revoke, затем /newbot или /token в BotFather. Обновите файл .env.
Вебхук не получает обновлений
Проверьте, что TELEGRAM_WEBHOOK_URL общедоступен (проверьте с помощью curl). Убедитесь, что ваша платформа/обратный прокси направляет входящий HTTPS-трафик с URL-адресом порта на локальный порт, настроенный в TELEGRAM_WEBHOOK_PORT (они не обязательно должны совпадать). Убедитесь, что SSL/TLS активирован — Telegram отправляет данные только по URL-адресу HTTPS. Ознакомьтесь с правилами брандмауэра.
Подтверждение выполнения
Когда агент сможет выполнить проверку опасной команды, он запросит ваше подтверждение в чате:
⚠️ Эта команда контролирует опасность (рекурсивное удаление). Ответьте «да», чтобы быть надежным.
Ответьте «да»/«y», чтобы исправить, или «no»/«n», чтобы отклонить.
Интерактивные запросы (уточнение)
Когда агент предлагает инструмент «уточнить» — чтобы узнать, какой подход вы предпочитаете, получить обратную связь после задачи или проверить перед нетривиальным решением — Telegram отображает вопрос с кнопками встроенной розетки:
❓ Какой фреймворк мне использовать для панели управления?
[1. Next.js] [2. Ремикс] [3. Астро]
[✏️ Другое (ввести ответ)]
Нажмите кнопку, чтобы ответить, или нажмите Другое, чтобы ввести свободный ответ (следующее отправленное вам сообщение станет ответом). Открытые вызовы clarify (без предустановленных опций) пропускают кнопку и просто перехватывают ваше следующее сообщение.
Настроить таймаут ответа через agent.clarify_timeout в ~/.hermes/config.yaml (по умолчанию 600 секунд). Если вы не ответите в течение таймаута, агент разблокируется с сообщением-маркером и адаптируется, и это не зависит.
Безопасность
⚠️ Warning
Всегда устанавливайте TELEGRAM_ALLOWED_USERS, чтобы узнавать, кто может взаимодействовать с вами. Без этого шлюза в целях безопасности отклоняет всех пользователей по умолчанию.
Никогда не делитесь токеном бота публично. Если он скомпрометирован, немедленно отзовите его с помощью команды /revoke в BotFather.
Для получения дополнительной информации см. Документация по безопасности. Вы также можете использовать Сопряжение DM для более динамичного режима авторизации пользователей.