Настройка ЛИНИИ
Запустите 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
- Перейдите в Консоль разработчика LINE.
- Создайте провайдера, а затем под ним канал Messaging API.
- На вкладке Основные настройки канала скопируйте Секрет канала.
- На вкладке API обмена сообщениями прокрутите до Токен доступа к каналу (долгосрочный) и нажмите Выдать. Скопируйте токен.
- На вкладке 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:
- Откройте свой канал → вкладка API обмена сообщениями.
- В разделе Настройки вебхука → URL вебхука вставьте
https://<ваш-туннель>/line/webhook(обратите внимание на путь/line/webhook— адаптер слушает там). - Нажмите Подтвердить. LINE отправляет пинг на URL; увидеть нужно 200.
- Переключите Использовать веб-перехватчик в положение Вкл..
Шаг 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. Остановите другой шлюз или воспользуйтесь отдельным каналом.
Ограничения
- Один пузырёк на чанк. Каждый текстовый пузырёк LINE ограничен 5000 символами, и не более 5 пузырьков отправляются за один вызов Reply/Push. Более длинные ответы обрезаются с многоточием.
- Нет нативного редактирования сообщений. У LINE нет API для редактирования сообщений — потоковые ответы всегда отправляют новые пузырьки, никогда не редактируют сообщения.
- Нет рендеринга Markdown. Жирный (
**), курсив (*), блоки кода и заголовки в виде буквенных символов. Адаптер сохраняет их перед отправкой; URL-адрес ([label](url)становитсяlabel (url)). - Индикатор загрузки только для личных сообщений. LINE отклоняет чат/загрузку API для групп и комнат, поэтому текст набора индикаторов отображается только в чатах 1:1.