Documentação oficial desta página · v0.20.6
Instalação do LINE
Rode o Hermes Agent como bot do LINE pela API oficial de mensagens (Messaging API) do LINE. O adaptador vive como um plugin de plataforma embutido em plugins/platforms/line/ — sem editar o núcleo, basta habilitar como qualquer outra plataforma.
O LINE é o aplicativo de mensagens dominante no Japão, em Taiwan e na Tailândia. Se os seus usuários moram lá, é assim que eles chegam até você.
Rode
hermes gateway setupe escolha LINE para um passo a passo guiado.
Como o bot responde
| Contexto | Comportamento |
|---|---|
Conversa 1:1 (IDs com U) | Responde a toda mensagem |
Grupo (IDs com C) | Responde quando o grupo está na lista de permissões |
Sala com vários usuários (IDs com R) | Responde quando a sala está na lista de permissões |
Texto, imagens, áudio, vídeo, arquivos, figurinhas e localizações de entrada são todos tratados. O texto de saída usa primeiro o token de resposta gratuito (de uso único, janela de ~60s) e recorre à Push API tarifada quando o token já expirou.
Passo 1: crie um canal Messaging API no LINE
- Vá ao LINE Developers Console.
- Crie um Provider e, dentro dele, um canal Messaging API.
- Na aba Basic settings do canal, copie o Channel secret.
- Na aba Messaging API, role até Channel access token (long-lived) e clique em Issue. Copie o token.
- Ainda na aba Messaging API, desative também Auto-reply messages e Greeting messages para que eles não briguem com as respostas do seu bot.
Passo 2: exponha a porta do webhook
O LINE entrega webhooks por HTTPS público. A porta padrão é 8646 — mude com LINE_PORT se precisar.
# Cloudflare Tunnel (recomendado para produção — hostname fixo)
cloudflared tunnel --url http://localhost:8646
# ngrok (bom para desenvolvimento)
ngrok http 8646
# devtunnel
devtunnel create hermes-line --allow-anonymous
devtunnel port create hermes-line -p 8646 --protocol https
devtunnel host hermes-line
Copie a URL https://... — você vai defini-la como URL de webhook logo abaixo. Deixe o túnel rodando durante os testes. Em produção, configure um túnel nomeado fixo do Cloudflare para que a URL do webhook não mude a cada reinício.
Passo 3: configure o Hermes
Acrescente ao ~/.hermes/.env:
LINE_CHANNEL_ACCESS_TOKEN=SEU_TOKEN_DE_LONGA_DURACAO
LINE_CHANNEL_SECRET=SEU_CHANNEL_SECRET
# Lista de permissões — pelo menos uma destas (ou LINE_ALLOW_ALL_USERS=true para desenvolvimento)
LINE_ALLOWED_USERS=U1234567890abcdef... # IDs com prefixo U, separados por vírgula
LINE_ALLOWED_GROUPS=C1234567890abcdef... # IDs de grupo, opcional
LINE_ALLOWED_ROOMS=R1234567890abcdef... # IDs de sala, opcional
# Obrigatório para envio de imagem / áudio / vídeo — a URL base HTTPS pública
# para a qual o túnel resolve. Sem ela, send_image/voice/video vão recusar.
LINE_PUBLIC_URL=https://meu-tunel.exemplo.com
Depois, no ~/.hermes/config.yaml:
gateway:
platforms:
line:
enabled: true
É o bastante — a varredura de plugins embutidos em gateway/config.py encontra plugins/platforms/line/ automaticamente. Sem editar o enum Platform.LINE, sem registro em _create_adapter.
Passo 4: defina a URL do webhook
De volta ao console do LINE:
- Abra o seu canal → aba Messaging API.
- Em Webhook settings → Webhook URL, cole
https://<seu-tunel>/line/webhook(repare no caminho/line/webhook— é onde o adaptador escuta). - Clique em Verify. O LINE faz um ping na URL; você deve ver um 200.
- Ligue Use webhook em On.
Passo 5: rode o gateway
hermes gateway
O log do agente mostra:
LINE: webhook listening on * (all interfaces, IPv4+IPv6):8646/line/webhook (public: https://my-tunnel.example.com)
Adicione o bot como amigo pelo aplicativo do LINE (leia o QR na aba Messaging API do canal) e mande uma mensagem para ele.
Respostas lentas do LLM
O token de resposta do LINE é de uso único e expira mais ou menos 60 segundos depois do evento de entrada. LLMs lentos não conseguem responder a tempo, o que normalmente forçaria uma chamada paga à Push API.
Quando o LLM ainda está rodando depois de LINE_SLOW_RESPONSE_THRESHOLD segundos (padrão 45), o adaptador consome o token de resposta original para enviar um balão Template Buttons:
🤔 Ainda pensando. Toque abaixo para buscar a resposta quando ela estiver pronta.
[ Obter resposta ]
O usuário toca em Obter resposta quando lhe convém — esse postback entrega um token de resposta novo, que o adaptador usa para enviar a resposta em cache (ainda de graça).
Máquina de estados: PENDING → READY → DELIVERED, mais ERROR para execuções canceladas (o PENDING órfão vira "Run was interrupted before completion." depois de /stop, para que o botão persistente não fique em laço).
Para desativar o botão de postback e sempre cair no Push:
LINE_SLOW_RESPONSE_THRESHOLD=0
Para que o fluxo de postback dispare de forma confiável, silencie o falatório que consumiria o token de resposta antes do limite:
# ~/.hermes/config.yaml
display:
interim_assistant_messages: false
platforms:
line:
tool_progress: off
Entrega de cron e notificações
LINE_HOME_CHANNEL=Uxxxxxxxxxxxxxxxxxxxx # alvo de entrega padrão
Tarefas de cron com deliver: line vão para o LINE_HOME_CHANNEL. O adaptador traz um remetente independente, só de Push, para que as tarefas de cron funcionem mesmo quando o cron roda em um processo separado do gateway.
Referência de variáveis de ambiente
| Variável | Obrigatória | Padrão | Descrição |
|---|---|---|---|
LINE_CHANNEL_ACCESS_TOKEN | sim | — | Token de acesso ao canal, de longa duração |
LINE_CHANNEL_SECRET | sim | — | Segredo do canal (verificação de webhook por HMAC-SHA256) |
LINE_HOST | não | sem valor (pilha dupla: todas as interfaces, IPv4+IPv6) | Host em que o webhook escuta |
LINE_PORT | não | 8646 | Porta em que o webhook escuta |
LINE_PUBLIC_URL | para mídia | — | URL base HTTPS pública; obrigatória para enviar imagem/voz/vídeo |
LINE_ALLOWED_USERS | uma delas | — | IDs de usuário separados por vírgula (prefixo U) |
LINE_ALLOWED_GROUPS | uma delas | — | IDs de grupo separados por vírgula (prefixo C) |
LINE_ALLOWED_ROOMS | uma delas | — | IDs de sala separados por vírgula (prefixo R) |
LINE_ALLOW_ALL_USERS | só em desenvolvimento | false | Ignora a lista de permissões por completo |
LINE_HOME_CHANNEL | não | — | Alvo padrão de entrega de cron e notificações |
LINE_SLOW_RESPONSE_THRESHOLD | não | 45 | Segundos até o botão de postback disparar (0 = desativado) |
LINE_PENDING_TEXT | não | "🤔 Still thinking…" | Texto do balão que acompanha o botão de postback |
LINE_BUTTON_LABEL | não | "Get answer" | Rótulo do botão |
LINE_DELIVERED_TEXT | não | "Already replied ✅" | Resposta quando um botão já entregue é tocado de novo |
LINE_INTERRUPTED_TEXT | não | "Run was interrupted before completion." | Resposta quando um botão órfão de /stop é tocado |
Solução de problemas
"invalid signature" na verificação do webhook. O Channel secret foi copiado errado, ou o seu túnel reescreveu o corpo da requisição. Confira antes com curl -i https://<tunel>/line/webhook/health — isso deve devolver {"status":"ok","platform":"line"}.
O bot não recebe nada em grupos. Verifique se LINE_ALLOWED_GROUPS inclui o ID C... do grupo. Para descobrir o ID de um grupo, mande uma mensagem de teste e procure em ~/.hermes/logs/gateway.log por LINE: rejecting unauthorized source — o dicionário da origem rejeitada traz os IDs.
send_image falha com "LINE_PUBLIC_URL must be set". A Messaging API do LINE não aceita upload binário — imagens, áudio e vídeo precisam ser URLs HTTPS acessíveis. Defina LINE_PUBLIC_URL com o hostname público do túnel e o adaptador serve os arquivos em /line/media/<token>/<nome-do-arquivo> automaticamente.
O botão de postback nunca aparece. Ou o LLM respondeu mais rápido que LINE_SLOW_RESPONSE_THRESHOLD, ou outro balão (progresso de ferramenta, streaming) consumiu o token de resposta antes. Veja o bloco de silenciamento em "Respostas lentas do LLM".
"already in use by another profile". O mesmo token de acesso ao canal está vinculado a outro perfil do Hermes em execução. Pare o outro gateway ou use um canal separado.
Limitações
- Limites de balão e de tamanho. Cada balão de texto do LINE tem teto de 5000 caracteres. Respostas mais longas são fatiadas de forma inteligente em torno de 4500 caracteres, em até 5 balões por chamada de Reply/Push, quebrando em fronteiras naturais sempre que dá.
- Sem edição nativa de mensagem. O LINE não tem API de editar mensagem — respostas em streaming sempre mandam balões novos, nunca editam os anteriores.
- Sem renderização de Markdown. Negrito (
**), itálico (*), blocos de código e títulos aparecem como caracteres literais. O adaptador remove tudo isso antes de enviar; as URLs são preservadas ([rótulo](url)virarótulo (url)). - Indicador de carregamento só em DM. O LINE recusa a API de chat/loading em grupos e salas, então o indicador de digitação só aparece em conversas 1:1.