← Блог

Как перевести Hermes-бота на подписку Anthropic

Сережа Рис · 4 August 2026

hermesanthropicclaude-codetelegramвайбкодинг

Сразу важное: официальный Telegram-плагин Anthropic не подключается внутрь Hermes. Я остановил Telegram gateway Hermes и запустил вместо него Claude Code Telegram Channel на токене того же бота. Имя бота осталось прежним. Модель, подписка и ответы теперь идут через Claude Code.

Контекст тоже потребовал миграции. Я отдельно перенёс нужные инструкции, один скилл и рабочий репозиторий. История сессий и память Hermes автоматически в Claude Code не переехали. Это замена runtime с выборочным переносом артефактов.

Схему проверил на живом боте с Opus и подпиской Claude Max. Личка отвечает, проверенный private topic отвечает, сервис переживает рестарт. Extra Usage выключен.

Что именно меняется

Пользователь продолжает писать тому же Telegram-боту. Под капотом работает другой gateway.

Часть Что с ней происходит
Telegram-бот Сохраняются username и токен
Hermes gateway Останавливается и остаётся готовым для rollback
Claude Code Становится новым runtime для модели и Telegram
Инструкции и репозитории Переносятся выборочно в новый workspace
Скиллы Ставятся отдельно в каталог Claude Code
Память Hermes Требует отдельного экспорта и адаптации
Оплата модели Идёт через авторизованную подписку Anthropic

Поэтому фраза “подключить подписку к Hermes” немного обманчива. Рабочая схема переводит существующего Hermes-бота на Claude Code Channel. Сам процесс Hermes больше не обрабатывает сообщения.

Почему смена провайдера Hermes не подходит

У Hermes есть собственный Anthropic OAuth. Документация Hermes предупреждает, что этот маршрут использует кредиты Extra Usage. Обычный подписочный лимит через него не расходуется.

Для подписки я использую Claude Code Channels. Claude Code авторизован в аккаунте Anthropic, а официальный Telegram Channel подключён к его живой сессии. В моём тесте тариф был Max, алиас opus выбрал claude-opus-5. Для другого тарифа сначала стоит проверить доступность Claude Code в аккаунте.

Связка выглядит так:

Telegram-бот
официальный Telegram Channel
Claude Code + подписка Anthropic
новый workspace
инструкции · рабочие репозитории

каталог Claude Code
выбранные скиллы

Hermes gateway: остановлен, сохранён для rollback

Официальный плагин запускается внутри сессии Claude Code. Hermes с ним напрямую не связан. Связь сохраняется на уровне бот-токена, имени бота и тех рабочих артефактов, которые агент перенёс в новый workspace.

Промпт для серверного агента

Всю миграцию я отдал агенту. Вот исправленная версия промпта, которая учитывает реальную архитектуру и баг Telegram topics:

Переведи существующего Hermes Telegram-бота на мою подписку Anthropic через официальный Claude Code Telegram Channel.

Это миграция gateway. Не меняй провайдера внутри Hermes. Сначала сделай резервную копию текущего контейнера, конфигов Hermes и Telegram gateway. Зафиксируй точный rollback.

Проверь официальную установку и авторизацию Claude Code. Установи Bun и telegram@claude-plugins-official. Создай отдельный workspace для Claude Code. Перенеси туда только нужные инструкции и рабочие репозитории. Нужные скиллы установи в каталог Claude Code отдельно. Не заявляй перенос памяти Hermes без отдельной проверки.

Возьми существующий Telegram bot token из защищённого конфига. Не печатай его. Создай access.json с mode 0600: owner-only DM allowlist, а для нужной группы укажи её ID, groups.<id>.allowFrom с ID владельца и requireMention. Перед запуском нового gateway останови старый poller: один токен должен обслуживать ровно один процесс.

Проверь исходник и точную версию установленного Telegram-плагина. Если он не передаёт message_thread_id, сохрани backup server.ts и versioned patch. Сначала выполни patch --dry-run, затем примени hotfix в cache установленной версии: добавь ID topic во входящий channel meta, схему инструмента reply, sendMessage, отправку файлов и typing action. В инструкциях Claude Code потребуй возвращать тот же message_thread_id в каждом ответе внутри topic. reply_to оставь для quote reply. После update плагина снова проверь и при необходимости повторно примени patch.

Сначала запусти Claude Code интерактивно в целевом workspace и сохрани UUID проверенной сессии. Затем создай постоянный user service с явными HOME, PATH и рабочим каталогом. В ExecStart зафиксируй --resume <UUID> --model opus --channels plugin:telegram@claude-plugins-official. Для Claude Code выдели псевдо-TTY через /usr/bin/script -qefc, включи linger и systemctl --user enable --now. Закрой SSH и только после этого повтори smoke.

Проверь отдельными nonce: личное сообщение, private topic, ответ после рестарта сервиса. Для topic сравни входящий и исходящий message_thread_id, затем проверь через Telegram-клиент, что ответ имеет тот же forum topic. Покажи статусы без токенов и приватных ID.

При ошибке сначала останови Claude gateway, затем верни прежний Hermes gateway. Никогда не запускай оба poller одновременно.

Авторизацию Anthropic лучше пройти самому. Агенту достаточно увидеть статус успешного входа. Пароль, OAuth-код и содержимое файла с credentials ему отправлять не нужно.

Почему бот ставил реакцию и молчал

После первой миграции личка отвечала. В новом private topic бот ставил реакцию 👀 и замолкал. В логах всё выглядело успешно: входящее сообщение дошло, Claude вызвал reply, Telegram вернул sent.

Причина оказалась в официальном плагине версии 0.0.6. Во входящем событии были chat_id и message_id, инструмент reply принимал reply_to, а message_thread_id отсутствовал в обоих направлениях. Реакция работала, потому что она ставится на существующее сообщение. Новый ответ уходил за пределы открытого topic.

reply_to и message_thread_id решают разные задачи. Первый создаёт quote reply. Второй выбирает topic для нового сообщения. Общий пробел описан в issue #1158.

Отдельное наблюдение по private topics есть в issue #4349.

Поле для topic определено в Telegram Bot API.

Я добавил локальный hotfix и повторил E2E дважды. Во втором прогоне сервис был предварительно перезапущен. В обоих случаях входящий event и вызов reply содержали одинаковый message_thread_id, а Telegram-клиент подтвердил ответ внутри исходного topic.

Как проверить результат

Я считаю миграцию рабочей после шести проверок:

  1. Claude Code видит активную подписочную авторизацию.
  2. Запущен один Telegram poller.
  3. Личное сообщение получает точный ответ.
  4. Topic-сообщение и ответ имеют одинаковый message_thread_id.
  5. После рестарта сервиса topic-тест проходит ещё раз.
  6. Claude читает перенесённые инструкции и видит каждый заявленный скилл.

Проверка номер шесть особенно важна. Работающий Telegram ещё не означает, что память и возможности Hermes приехали вместе с токеном. Каждый артефакт нужно проверять отдельно.

Что получилось

Снаружи это прежний Hermes-бот. Внутри сообщения теперь обслуживает Claude Code на подписке Anthropic. Hermes gateway остановлен и хранится как rollback.

Opus отвечает в личке и проверенном private topic. После рестарта связь сохраняется. Для topics пока нужен локальный hotfix поверх официального плагина 0.0.6; после обновления плагина его придётся проверить заново.

Похожие серверные связки и агентские отделы я собираю в Personal Corp. Посмотреть, как это устроено.


Частые вопросы

Можно оставить Hermes runtime активным?

Для одного Telegram token нужен один poller. Во время работы Claude Channel процесс Hermes gateway должен быть остановлен. Его конфиг можно сохранить для rollback.

Нужен Anthropic API key?

Для этой схемы ключ не нужен. Модель запускается внутри авторизованной сессии Claude Code и использует лимит подписки.

Переносится память Hermes?

Автоматически нет. Можно перенести совместимые инструкции, файлы и скиллы. Историю сессий и внутреннюю память нужно экспортировать и адаптировать отдельно.

Hotfix для topics останется навсегда?

Локальный patch может исчезнуть после обновления плагина. После каждого обновления стоит проверить исходник и повторить private-topic E2E. Если Anthropic добавит message_thread_id upstream, локальный patch станет не нужен.

Что почитать дальше

Подписаться на обновления — @sereja_tech