Настройка ЛИНИИ

Запустите Hermes Agent как бота LINE через официальный LINE Messaging API. Адаптер находится в виде встроенного плагина платформы в каталоге plugins/platforms/line/ — никаких изменений ядра, просто его как любую другую платформу.

LINE — это приложение для обмена сообщениями с Японией, Тайванем и Таиландом. Если ваши пользователи там находятся, это то же самое, как они с вами свяжутся.

Как отвечает бот

Контекст Поведение
Чат 1:1 (ID типа U) Отвечает на каждое сообщение
Групповой чат (ID типа C) Отвечает, когда группа находится в белом списке
Комната с несколькими пользователями (ID типа R) Отвечает, когда комната находится в белом списке

Обрабатывается прилагаемый текст, изображения, аудио, видео, файлы, стикеры и местоположение. В следующем тексте используется сначала стандартный токен-ответ (одноразовый, окно ~60 с) и переключается на тарифицируемый Push API, когда токен истёк.


Шаг 1: Создание канала LINE Messaging API

  1. Перейдите в Консоль разработчика LINE.
  2. Создайте провайдера, а затем под ним канал Messaging API.
  3. На вкладке Основные настройки канала скопируйте Секрет канала.
  4. На вкладке API обмена сообщениями прокрутите до Токен доступа к каналу (долгосрочный) и нажмите Выдать. Скопируйте токен.
  5. На вкладке API обмена сообщениями также отключите Сообщения автоответа и Приветственные сообщения, чтобы они не мешали ответу вашего бота.

Шаг 2: Откройте порт вебхука

LINE предоставляет вебхуки через общедоступный HTTPS. Порт по умолчанию — 8646 — переопределите с помощью LINE_PORT при необходимости.

# Cloudflare Tunnel (рекомендуется для продакшена — фиксированное имя хоста)
cloudflared tunnel --url http://localhost:8646

# ngrok (хорошо для разработки)
ngrok http 8646

# devtunnel
devtunnel create hermes-line --allow-anonymous
devtunnel port create hermes-line -p 8646 --protocol https
devtunnel host hermes-line

Скопируйте URL вида https://... — вы зададите его как URL вебхука ниже. Оставьте рабочий туннель во время тестирования. Для продакшена был установлен стационарный именованный туннель Cloudflare, чтобы URL-адрес вебхука не менялся при перезапуске.


Шаг 3: Настраиваем Гермес

Добавьте в ~/.hermes/.env:

LINE_CHANNEL_ACCESS_TOKEN=ВАШ_ДОЛГОЖИВУЩИЙ_ТОКЕН
LINE_CHANNEL_SECRET=ВАШ_СЕКРЕТ_КАНАЛА

# Белый список — хотя бы один из этих параметров (или LINE_ALLOW_ALL_USERS=true для разработки)
LINE_ALLOWED_USERS=U1234567890abcdef...           # ID с префиксом U через запятую
LINE_ALLOWED_GROUPS=C1234567890abcdef...          # опционально ID групп
LINE_ALLOWED_ROOMS=R1234567890abcdef...           # опционально ID комнат

# Обязательно для отправки изображений / аудио / видео — публичный HTTPS base URL,
# на который разрешается туннель. Без него send_image/voice/video откажут.
LINE_PUBLIC_URL=https://my-tunnel.example.com

Затем в ~/.hermes/config.yaml:

gateway:
  platforms:
    line:
      enabled: true

Этого достаточно — проверка встроенных плагинов в gateway/config.py автоматически подхватывает plugins/platforms/line/. Не нужно сохранять Platform.LINE или регистрировать _create_adapter.


Шаг 4: Установите URL-адрес вебхука

Вернитесь в консоль LINE:

  1. Откройте свой канал → вкладка API обмена сообщениями.
  2. В разделе Настройки вебхукаURL вебхука вставьте https://<ваш-туннель>/line/webhook (обратите внимание на путь /line/webhook — адаптер слушает там).
  3. Нажмите Подтвердить. LINE отправляет пинг на URL; увидеть нужно 200.
  4. Переключите Использовать веб-перехватчик в положение Вкл..

Шаг 5: Запустите шлюз

hermes gateway

Лог агента показывает:

LINE: webhook слушает на 0.0.0.0:8646/line/webhook (публичный: https://my-tunnel.example.com)

Добавьте бота в друзья из приложения LINE (отсканируйте QR-код на вкладке Канал Messaging API) и отправьте ему сообщение.


Медленные ответы LLM

Токен ответа LINE одноразовый и истекает примерно через 60 секунд после входящих событий. Медленные LLM не помогают вовремя ответить, что обычно требует использования платного Push API.

Когда LLM ещё работает по состоянию LINE_SLOW_RESPONSE_THRESHOLD секунд (по умолчанию 45), адаптер потребляет исходный токен ответа, чтобы отправить пузырёк Кнопки шаблона:

🤔 Всё ещё думаю. Нажмите ниже, чтобы получить ответ, когда он будет готов.

[ Получить ответ ]

Пользователь нажимает Получить ответ, когда удобно — эта обратная передача доставляет новый токен ответа, который использует адаптер для отправки кэшированного ответа (всё ещё бесплатно).

Конечный автомат: PENDING → READY → DELIVERED, плюс ERROR для отменённых запусков (осиротевший PENDING разрешается в "Выполнение было прервано до завершения." после /stop, чтобы постоянная кнопка не зацикливалась).

Чтобы отключить кнопку обратной передачи и всегда используйте вариант Push-запасной:

LINE_SLOW_RESPONSE_THRESHOLD=0

Чтобы постбэк-поток был организован надежно, подайте болтовню, которая потребляет токен ответа до достижения порога:

# ~/.hermes/config.yaml
display:
  interim_assistant_messages: false
  platforms:
    line:
      tool_progress: off

Доставка Cron/регистрация

LINE_HOME_CHANNEL=Uxxxxxxxxxxxxxxxxxxxx     # целевой канал доставки по умолчанию

Задачи cron с deliver: line направляются в LINE_HOME_CHANNEL. Адаптер подает отдельному отправителю только через Push, поэтому задачи cron работают, даже когда cron запускается отдельно от шлюза.


Справочник окружения

Переменная Обязательно По умолчанию Описание
LINE_CHANNEL_ACCESS_TOKEN да Долгоживущий токен доступа к каналу
LINE_CHANNEL_SECRET да Секретный канал (HMAC-SHA256 проверка вебхука)
LINE_HOST нет 0.0.0.0 Хост-привязки вебхука
LINE_PORT нет 8646 Порт привязки вебхука
LINE_PUBLIC_URL для медиа Публичный базовый URL-адрес HTTPS; требуется для отправки изображений/голоса/видео
LINE_ALLOWED_USERS один из ID пользователей через запятую (с префиксом U)
LINE_ALLOWED_GROUPS один из ID группы через запятую (с префиксом C)
LINE_ALLOWED_ROOMS один из ID комнаты через запятую (с префиксом R)
LINE_ALLOW_ALL_USERS только разработка ложь Полностью пропустить белый список
LINE_HOME_CHANNEL нет Целевой канал для cron / уведомление по умолчанию
LINE_SLOW_RESPONSE_THRESHOLD нет 45 Секунды до активации кнопки обратной передачи (0 = отключено)
LINE_PENDING_TEXT нет "🤔 Всё ещё думаю…" Текст пузырька рядом с ключом обратная передача
LINE_BUTTON_LABEL нет "Получить ответ" Надпись на ключ
LINE_DELIVERED_TEXT нет "Уже ответил ✅" Ответ при повторном нажатии на уже предоставленную кнопку
LINE_INTERRUPTED_TEXT нет «Выполнение было прервано до завершения». Ответ на нажатие осиротевшей кнопки после /stop

Устранение неполадок

"неверная подпись" при взгляде на вебхука. Секретный канал скопирован неверно, или ваш туннель перезаписал тело запроса. Сначала проверьте с помощью curl -i https://<туннель>/line/webhook/health — необходимо вернуть {"status":"ok","platform":"line"}.

Бот ничего не получает в группах. Проверьте, что LINE_ALLOWED_GROUPS включает идентификатор группы вида C.... Чтобы найти ID группы, отформатируйте тестовое сообщение и выполните grep в ~/.hermes/logs/gateway.log на LINE: отклонение неавторизованного источника — в словаре отклонённого источника есть ID.

send_image завершается ошибкой «Необходимо установить LINE_PUBLIC_URL». API LINE Messaging не принимает двоичные загрузки — изображения, аудио и видео должны быть доступны по URL-адресу HTTPS. Установите LINE_PUBLIC_URL на публичное имя хоста туннеля, и адаптер будет автоматически обслуживать файлы по пути /line/media/<токен>/<имя_файла>.

Кнопка постбека никогда не появляется. Либо LLM ответил быстрее, чем LINE_SLOW_RESPONSE_THRESHOLD, либо другой пузырёк (инструменты прогресса, потоковая передача) израсходовал токен ответа первым. См. заблокировать подавления в разделе «Медленные ответы LLM».

"уже используется другим профилем". Тот же токен доступа к каналу разрешения к запущенному профилю Hermes. Остановите другой шлюз или воспользуйтесь отдельным каналом.


Ограничения