Настройка LINE
Запустите VibeOS как бота LINE через официальный LINE Messaging API. Адаптер находится как встроенный плагин платформы в plugins/platforms/line/ — никаких правок ядра, просто включите его как любую другую платформу.
LINE — доминирующее приложение для обмена сообщениями в Японии, Тайване и Таиланде. Если ваши пользователи живут там, это то, как они до вас доберутся.
Выполните
vibeos gateway setupи выберите LINE для пошаговой настройки.
Как бот отвечает
| Контекст | Поведение |
|---|---|
Чат 1:1 (ID с U) | Отвечает на каждое сообщение |
Групповой чат (ID с C) | Отвечает, если группа есть в белом списке |
Многопользовательская комната (ID с R) | Отвечает, если комната есть в белом списке |
Обрабатываются входящие текст, изображения, аудио, видео, файлы, стикеры и местоположения. Исходящий текст сначала использует бесплатный токен ответа (одноразовый, окно ~60 секунд) и переключается на тарифицируемый Push API, когда токен истёк.
Шаг 1: Создайте канал LINE Messaging API
- Перейдите в LINE Developers Console.
- Создайте провайдера, затем под ним канал Messaging API.
- На вкладке Basic settings канала скопируйте Channel secret.
- На вкладке Messaging API прокрутите до Channel access token (long-lived) и нажмите Issue. Скопируйте токен.
- На вкладке Messaging API также отключите Auto-reply messages и Greeting messages, чтобы они не мешали ответам вашего бота.
Шаг 2: Откройте порт вебхука
LINE доставляет вебхуки через публичный HTTPS. Порт по умолчанию — 8646; переопределите с помощью LINE_PORT, если необходимо.
# Cloudflare Tunnel (рекомендуется для продакшена — фиксированное имя хоста)
cloudflared tunnel --url http://localhost:8646
# ngrok (хорошо для разработки)
ngrok http 8646
# devtunnel
devtunnel create vibeos-line --allow-anonymous
devtunnel port create vibeos-line -p 8646 --protocol https
devtunnel host vibeos-line
Скопируйте URL https://... — вы установите его как URL вебхука ниже. Оставьте туннель запущенным во время тестирования. Для продакшена настройте фиксированный именованный туннель Cloudflare, чтобы URL вебхука не менялся при перезапуске.
Шаг 3: Настройте VibeOS
Добавьте в ~/.vibeos/.env:
LINE_CHANNEL_ACCESS_TOKEN=YOUR_LONG_LIVED_TOKEN
LINE_CHANNEL_SECRET=YOUR_CHANNEL_SECRET
# Белый список — хотя бы один из этих (или LINE_ALLOW_ALL_USERS=true для разработки)
LINE_ALLOWED_USERS=U1234567890abcdef... # ID с префиксом U, разделённые запятыми
LINE_ALLOWED_GROUPS=C1234567890abcdef... # ID групп (опционально)
LINE_ALLOWED_ROOMS=R1234567890abcdef... # ID комнат (опционально)
# Требуется для отправки изображений / аудио / видео — публичный базовый URL HTTPS,
# на который указывает туннель. Без него send_image/voice/video откажутся работать.
LINE_PUBLIC_URL=https://my-tunnel.example.com
Затем в ~/.vibeos/config.yaml:
gateway:
platforms:
line:
enabled: true
Этого достаточно — сканирование встроенных плагинов в gateway/config.py автоматически подхватывает plugins/platforms/line/. Никаких правок перечисления Platform.LINE, никакой регистрации _create_adapter.
Шаг 4: Установите URL вебхука
Вернитесь в консоль LINE:
- Откройте ваш канал → вкладка Messaging API.
- В разделе Webhook settings → Webhook URL вставьте
https://<ваш-туннель>/line/webhook(обратите внимание на путь/line/webhook— адаптер слушает там). - Нажмите Verify. LINE пингует URL; вы должны увидеть 200.
- Переключите Use webhook в положение On.
Шаг 5: Запустите шлюз
vibeos gateway
В логе агента появится:
LINE: webhook listening on 0.0.0.0:8646/line/webhook (public: https://my-tunnel.example.com)
Добавьте бота в друзья из приложения LINE (отсканируйте QR-код на вкладке Messaging API канала) и отправьте ему сообщение.
Медленные ответы LLM
Токен ответа LINE одноразовый и истекает примерно через 60 секунд после входящего события. Медленные LLM не успевают ответить вовремя, что обычно приводит к платному вызову Push API.
Когда LLM всё ещё работает дольше LINE_SLOW_RESPONSE_THRESHOLD секунд (по умолчанию 45), адаптер потребляет исходный токен ответа, чтобы отправить пузырь с Template Buttons:
🤔 Всё ещё думаю. Нажмите ниже, чтобы получить ответ, когда он будет готов.
[ Получить ответ ]
Пользователь нажимает Получить ответ, когда удобно — этот постбэк доставляет свежий токен ответа, который адаптер использует для отправки кешированного ответа (всё ещё бесплатно).
Машина состояний: PENDING → READY → DELIVERED, плюс ERROR для отменённых запусков (осиротевший PENDING разрешается в «Запуск был прерван до завершения.» после /stop, чтобы постоянная кнопка не зацикливалась).
Чтобы отключить кнопку постбэка и всегда использовать Push-запасной вариант:
LINE_SLOW_RESPONSE_THRESHOLD=0
Чтобы поток постбэка срабатывал надёжно, подавите болтовню, которая израсходует токен ответа до порога:
# ~/.vibeos/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 | только для разработки | false | Полностью пропустить белый список |
LINE_HOME_CHANNEL | нет | — | Цель доставки уведомлений / cron по умолчанию |
LINE_SLOW_RESPONSE_THRESHOLD | нет | 45 | Секунд до срабатывания кнопки постбэка (0 = отключено) |
LINE_PENDING_TEXT | нет | «🤔 Всё ещё думаю…» | Текст пузыря, показываемый рядом с кнопкой постбэка |
LINE_BUTTON_LABEL | нет | «Получить ответ» | Текст кнопки |
LINE_DELIVERED_TEXT | нет | «Уже ответил ✅» | Ответ при повторном нажатии уже доставленной кнопки |
LINE_INTERRUPTED_TEXT | нет | «Запуск был прерван до завершения.» | Ответ при нажатии осиротевшей кнопки после /stop |
Устранение неполадок
«invalid signature» при проверке вебхука. Channel secret скопирован неправильно, или ваш туннель перезаписал тело запроса. Сначала проверьте с помощью curl -i https://<туннель>/line/webhook/health — должно вернуть {"status":"ok","platform":"line"}.
Бот ничего не получает в группах. Проверьте, что LINE_ALLOWED_GROUPS включает ID группы C.... Чтобы найти ID группы, отправьте тестовое сообщение и выполните grep ~/.vibeos/logs/gateway.log по LINE: rejecting unauthorized source — словарь отклонённого источника содержит ID.
send_image завершается ошибкой «LINE_PUBLIC_URL must be set». LINE Messaging API не принимает бинарные загрузки — изображения, аудио и видео должны быть доступны по URL HTTPS. Установите LINE_PUBLIC_URL на публичное имя хоста туннеля, и адаптер будет автоматически обслуживать файлы из /line/media/<token>/<filename>.
Кнопка постбэка никогда не появляется. Либо LLM ответила быстрее LINE_SLOW_RESPONSE_THRESHOLD, либо другой пузырь (прогресс инструмента, стриминг) израсходовал токен ответа первым. См. блок подавления в разделе «Медленные ответы LLM».
«already in use by another profile». Тот же токен доступа канала привязан к другому запущенному профилю VibeOS. Остановите другой шлюз или используйте отдельный канал.
Ограничения
- Ограничения пузырей и длины. Каждый текстовый пузырь LINE ограничен 5000 символов. Более длинные ответы разбиваются на части примерно по 4500 символов, до 5 пузырей на вызов Reply/Push, с разделением по естественным границам, где это возможно.
- Нет нативного редактирования сообщений. У LINE нет API для редактирования сообщений — стриминговые ответы всегда отправляют новые пузыри, никогда не редактируют предыдущие.
- Нет рендеринга Markdown. Жирный (
**), курсив (*), блоки кода и заголовки отображаются как буквальные символы. Адаптер удаляет их перед отправкой; URL сохраняются ([label](url)становитсяlabel (url)). - Индикатор загрузки только в личных сообщениях. LINE отклоняет API chat/loading для групп и комнат, поэтому индикатор набора текста показывается только в чатах 1:1.