LINE 设置
通过官方的 LINE Messaging API 将 Hermes Agent 运行为 LINE 机器人。该适配器作为捆绑的平台插件存在于 plugins/platforms/line/ 下——无需修改核心代码,只需像任何其他平台一样启用它。
LINE 是日本、台湾和泰国占主导地位的消息应用。如果您的用户在这些地区,这就是他们联系您的方式。
机器人如何响应
| 上下文 | 行为 |
|---|---|
1:1 聊天(U ID) | 响应每条消息 |
群聊(C ID) | 当群在白名单中时响应 |
多用户房间(R ID) | 当房间在白名单中时响应 |
入站文本、图片、音频、视频、文件、贴纸和位置消息均可处理。出站文本优先使用免费回复令牌(单次使用,约60秒窗口),并在令牌过期时回退到计量的 Push API。
第一步:创建 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,以免它们与机器人的回复冲突。
第二步:暴露 webhook 端口
LINE 通过公共 HTTPS 投递 webhook。默认端口为 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复制 https://... URL——您将在下面将其设置为 webhook URL。**测试期间保持隧道运行。**对于生产环境,设置固定的 Cloudflare 命名隧道,以便 webhook URL 在重启后保持不变。
第三步:配置 Hermes
添加到 ~/.hermes/.env:
LINE_CHANNEL_ACCESS_TOKEN=YOUR_LONG_LIVED_TOKEN
LINE_CHANNEL_SECRET=YOUR_CHANNEL_SECRET
# 白名单——至少设置其中一项(或开发时设置 LINE_ALLOW_ALL_USERS=true)
LINE_ALLOWED_USERS=U1234567890abcdef... # 逗号分隔的 U 前缀 ID
LINE_ALLOWED_GROUPS=C1234567890abcdef... # 可选的群 ID
LINE_ALLOWED_ROOMS=R1234567890abcdef... # 可选的房间 ID
# 图片/音频/视频发送所需——隧道解析到的公共 HTTPS 基础 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。
第四步:设置 webhook URL
回到 LINE 控制台:
- 打开您的频道 → Messaging API 标签页。
- 在 Webhook settings → Webhook URL 下,粘贴
https://<your-tunnel>/line/webhook(注意/line/webhook路径——适配器在此监听)。 - 点击 Verify。LINE 会 ping 该 URL;您应该看到 200。
- 将 Use webhook 切换为 On。
第五步:运行网关
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 气泡:
🤔 仍在思考。准备好后点击下方获取答案。
[ 获取答案 ]
用户在方便时点击获取答案——该回传会提供一个新的回复令牌,适配器用它来发送缓存的答案(仍然是免费的)。
状态机: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定时任务/通知投递
LINE_HOME_CHANNEL=Uxxxxxxxxxxxxxxxxxxxx # 默认投递目标带有 deliver: line 的定时任务路由到 LINE_HOME_CHANNEL。适配器附带一个独立的仅 Push 发送器,因此即使定时任务在与网关分离的进程中运行,也能正常工作。
环境变量参考
| 变量 | 必填 | 默认值 | 描述 |
|---|---|---|---|
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 | 否 | ”🤔 仍在思考…” | 回传按钮旁显示的气泡文本 |
LINE_BUTTON_LABEL | 否 | ”获取答案” | 按钮标签 |
LINE_DELIVERED_TEXT | 否 | ”已回复 ✅“ | 已投递按钮被再次点击时的回复 |
LINE_INTERRUPTED_TEXT | 否 | ”运行在完成前被中断。“ | /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 中搜索 LINE: rejecting unauthorized source——被拒绝的源字典中有 ID。
send_image 失败,提示”必须设置 LINE_PUBLIC_URL”。 LINE 的 Messaging API 不接受二进制上传——图片、音频和视频必须可通过 HTTPS URL 访问。设置 LINE_PUBLIC_URL 为隧道的公共主机名,适配器会自动从 /line/media/<token>/<filename> 提供文件服务。
回传按钮从未出现。 LLM 响应速度快于 LINE_SLOW_RESPONSE_THRESHOLD,或者其他气泡(工具进度、流式)先消耗了回复令牌。请参见”慢速 LLM 响应”下的抑制说明。
“已与另一个配置文件关联使用”。 同一频道访问令牌已绑定到另一个正在运行的 Hermes 配置文件。停止其他网关或使用单独的频道。
限制
- 每块单气泡。 每个 LINE 文本气泡限制为 5000 字符,每次 Reply/Push 调用最多发送 5 个气泡。较长的回复会被截断并加省略号。
- 无原生消息编辑。 LINE 没有编辑消息的 API——流式回复始终发送新气泡,从不编辑之前的气泡。
- 无 Markdown 渲染。 加粗(
**)、斜体(*)、代码围栏和标题会作为原义字符渲染。适配器在发送前去除它们;URL 会被保留([label](url)变为label (url))。 - 加载指示器仅限私聊。 LINE 拒绝群聊和房间的 chat/loading API,因此输入指示器仅在 1:1 聊天中显示。