LINE 设置
通过官方 LINE Messaging API 将 Hermes Agent 作为 LINE 机器人运行。该适配器以捆绑平台插件的形式位于 plugins/platforms/line/ 下——无需修改核心代码,只需像启用其他平台一样启用它即可。
LINE 是日本、台湾和泰国占主导地位的即时通讯应用。如果您的用户位于这些地区,这是他们联系您的方式。
运行
hermes gateway setup并选择 LINE 以获取引导式 walkthrough。
机器人如何响应
| 上下文 | 行为 |
|---|---|
1:1 聊天(U ID) | 响应每条消息 |
群聊(C ID) | 当群组在允许列表中时响应 |
多用户房间(R ID) | 当房间在允许列表中时响应 |
入站的文本、图片、音频、视频、文件、贴纸和位置信息均会被处理。出站文本优先使用免费回复令牌(单次使用,约 60 秒窗口期),当令牌过期后,则回退到计费的 Push API。
步骤 1:创建 LINE Messaging API 渠道
- 前往 LINE Developers Console。
- 创建一个 Provider,然后在其下创建一个 Messaging API 渠道。
- 从渠道的 Basic settings 选项卡中,复制 Channel secret。
- 从 Messaging API 选项卡中,滚动到 Channel access token (long-lived) 并点击 Issue。复制该令牌。
- 在 Messaging API 选项卡中,禁用 Auto-reply messages 和 Greeting messages,以免它们与机器人的回复冲突。
步骤 2:暴露 Webhook 端口
LINE 通过公共 HTTPS 交付 Webhook。默认端口为 8646——如有需要,可使用 LINE_PORT 进行覆盖。
# Cloudflare Tunnel (recommended for production — fixed hostname)
cloudflared tunnel --url http://localhost:8646
# ngrok (good for dev)
ngrok http 8646
# devtunnel
devtunnel create hermes-line --allow-anonymous
devtunnel port create hermes-line -p 8646 --protocol https
devtunnel host hermes-line
复制 https://... URL——您将在下面将其设置为 Webhook URL。在测试期间保持隧道运行。对于生产环境,请设置固定的 Cloudflare 命名隧道,以便 Webhook URL 在重启时不会更改。
步骤 3:配置 Hermes
添加到 ~/.hermes/.env:
LINE_CHANNEL_ACCESS_TOKEN=YOUR_LONG_LIVED_TOKEN
LINE_CHANNEL_SECRET=YOUR_CHANNEL_SECRET
# Allowlist — at least one of these (or LINE_ALLOW_ALL_USERS=true for dev)
LINE_ALLOWED_USERS=U1234567890abcdef... # comma-separated U-prefixed IDs
LINE_ALLOWED_GROUPS=C1234567890abcdef... # optional group IDs
LINE_ALLOWED_ROOMS=R1234567890abcdef... # optional room IDs
# Required for image / audio / video sends — the public HTTPS base URL
# the tunnel resolves to. Without it, send_image/voice/video will refuse.
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:设置 Webhook URL
回到 LINE 控制台:
- 打开您的渠道 → Messaging API 选项卡。
- 在 Webhook settings → Webhook URL 下,粘贴
https://<your-tunnel>/line/webhook(注意/line/webhook路径——适配器在此处监听)。 - 点击 Verify。LINE 会 ping 该 URL;您应该看到状态码 200。
- 将 Use webhook 切换为 On。
步骤 5:运行网关
hermes gateway
代理日志显示:
LINE: webhook listening on 0.0.0.0:8646/line/webhook (public: https://my-tunnel.example.com)
从 LINE 应用添加机器人为好友(扫描渠道 Messaging API 选项卡中的二维码)并向其发送消息。
LLM 响应缓慢
LINE 的回复令牌是单次使用的,并在入站事件发生后约 60 秒过期。缓慢的 LLM 无法及时回复,这通常会导致强制调用付费的 Push API。
当 LLM 运行时间超过 LINE_SLOW_RESPONSE_THRESHOLD 秒(默认 45)时,适配器会使用原始回复令牌发送一个 Template Buttons 气泡:
🤔 仍在思考。点击下方以便在答案准备好时获取。
[ 获取答案 ]
用户在方便时点击 获取答案——该 postback 会提供一个新的回复令牌,适配器使用该令牌发送缓存的答案(仍然免费)。
状态机:PENDING → READY → DELIVERED,以及用于取消运行的 ERROR(孤立的 PENDING 状态在 /stop 后会解析为“Run was interrupted before completion.”,以防止持久按钮陷入循环)。
要禁用 postback 按钮并始终回退到 Push:
LINE_SLOW_RESPONSE_THRESHOLD=0
为了使 postback 流程可靠触发,请抑制那些会在达到阈值前消耗回复令牌的闲聊:
# ~/.hermes/config.yaml
display:
interim_assistant_messages: false
platforms:
line:
tool_progress: off
Cron / 通知交付
LINE_HOME_CHANNEL=Uxxxxxxxxxxxxxxxxxxxx # default delivery target
带有 deliver: line 的 Cron 任务会路由到 LINE_HOME_CHANNEL。该适配器附带一个独立的仅 Push 发送器,因此即使 Cron 在与网关不同的进程中运行,Cron 任务也能正常工作。
环境变量参考
| 变量 | 是否必需 | 默认值 | 描述 |
|---|---|---|---|
LINE_CHANNEL_ACCESS_TOKEN | 是 | — | 长期有效的频道访问令牌 |
LINE_CHANNEL_SECRET | 是 | — | 频道密钥(用于 HMAC-SHA256 Webhook 验证) |
LINE_HOST | 否 | 0.0.0.0 | Webhook 绑定主机 |
LINE_PORT | 否 | 8646 | Webhook 绑定端口 |
LINE_PUBLIC_URL | 媒体发送必需 | — | 公共 HTTPS 基础 URL;发送图片/语音/视频时必需 |
LINE_ALLOWED_USERS | 三选一 | — | 逗号分隔的用户 ID(以 U 为前缀) |
LINE_ALLOWED_GROUPS | 三选一 | — | 逗号分隔的群组 ID(以 C 为前缀) |
LINE_ALLOWED_ROOMS | 三选一 | — | 逗号分隔的聊天室 ID(以 R 为前缀) |
LINE_ALLOW_ALL_USERS | 仅开发环境 | false | 完全跳过允许列表检查 |
LINE_HOME_CHANNEL | 否 | — | 默认定时任务/通知投递目标 |
LINE_SLOW_RESPONSE_THRESHOLD | 否 | 45 | 触发回传按钮前的等待秒数(0 = 禁用) |
LINE_PENDING_TEXT | 否 | "🤔 Still thinking…" | 与回传按钮一同显示的气泡文本 |
LINE_BUTTON_LABEL | 否 | "Get answer" | 按钮标签 |
LINE_DELIVERED_TEXT | 否 | "Already replied ✅" | 再次点击已投递按钮时的回复 |
LINE_INTERRUPTED_TEXT | 否 | "Run was interrupted before completion." | 点击孤立的 /stop 按钮时的回复 |
故障排除
Webhook 验证出现 "invalid signature"。 Channel secret 复制错误,或者你的隧道重写了请求体。首先使用 curl -i https://<tunnel>/line/webhook/health 进行验证——该命令应返回 {"status":"ok","platform":"line"}。
机器人在群组中收不到任何消息。 检查 LINE_ALLOWED_GROUPS 是否包含 C... 格式的群组 ID。要查找群组 ID,发送一条测试消息,并在 ~/.hermes/logs/gateway.log 中 grep 搜索 LINE: rejecting unauthorized source——被拒绝的来源字典中包含这些 ID。
send_image 失败并提示 "LINE_PUBLIC_URL must be set"。 LINE 的 Messaging API 不接受二进制上传——图片、音频和视频必须是可访问的 HTTPS URL。将 LINE_PUBLIC_URL 设置为隧道的公共主机名,适配器将自动从 /line/media/<token>/<filename> 提供文件服务。
回传按钮从未出现。 要么 LLM 响应速度快于 LINE_SLOW_RESPONSE_THRESHOLD,要么另一个气泡(工具进度、流式传输)先消耗了回复令牌。请参阅“LLM 响应缓慢”下的抑制块说明。
"already in use by another profile"。 相同的频道访问令牌已绑定到另一个正在运行的 Hermes 配置。停止另一个网关或使用单独的频道。
限制
- 气泡和长度上限。 每个 LINE 文本气泡上限为 5000 个字符。较长的响应会在每次 Reply/Push 调用中智能分块为约 4500 个字符,最多分为 5 个气泡,并尽可能在自然边界处分割。
- 不支持原生消息编辑。 LINE 没有编辑消息 API——流式响应始终发送新的气泡,从不编辑之前的气泡。
- 不支持 Markdown 渲染。 粗体(
**)、斜体(*)、代码块和标题会呈现为字面字符。适配器在发送前会去除这些格式;URL 会被保留([label](url)变为label (url))。 - 加载指示器仅限私聊。 LINE 拒绝群组和聊天室的聊天/加载 API,因此打字指示器仅在 1:1 私聊中显示。