字节笔记本
2026年6月21日
hermes教程-Signal
Signal 设置
Hermes 通过以 HTTP 模式运行的 signal-cli 守护进程连接到 Signal。该适配器通过 SSE(服务器发送事件)实时流式传输消息,并通过 JSON-RPC 发送响应。
Signal 是最注重隐私的主流即时通讯工具——默认端到端加密、开源协议、最小化元数据收集。这使得它非常适合对安全性敏感的代理工作流。
信息——无需新的 Python 依赖
Signal 适配器使用
httpx(已经是 Hermes 的核心依赖)进行所有通信。不需要额外的 Python 包。你只需在外部安装 signal-cli。
前提条件
- signal-cli — 基于 Java 的 Signal 客户端(GitHub)
- Java 17+ 运行时 — signal-cli 所需
- 一个已安装 Signal 的手机号码(用于作为辅助设备链接)
安装 signal-cli
## macOS
brew install signal-cli
## Linux(下载最新版本)
VERSION=$(curl -Ls -o /dev/null -w %{url_effective} \
https://github.com/AsamK/signal-cli/releases/latest | sed 's/^.*\/v//')
curl -L -O "https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz"
sudo tar xf "signal-cli-${VERSION}.tar.gz" -C /opt
sudo ln -sf "/opt/signal-cli-${VERSION}/bin/signal-cli" /usr/local/bin/注意
signal-cli 不在 apt 或 snap 仓库中。上述 Linux 安装方法直接从 GitHub 发布页 下载。
步骤 1:链接你的 Signal 账户
Signal-cli 作为一个链接设备工作——类似于 WhatsApp Web,但用于 Signal。你的手机保持为主设备。
## 生成一个链接 URI(显示二维码或链接)
signal-cli link -n "HermesAgent"- 在手机上打开 Signal
- 进入 设置 → 已链接设备
- 点击 链接新设备
- 扫描二维码或输入 URI
步骤 2:启动 signal-cli 守护进程
## 将 +1234567890 替换为你的 Signal 手机号码(E.164 格式)
signal-cli --account +1234567890 daemon --http 127.0.0.1:8080提示
让此进程在后台保持运行。你可以使用
systemd、tmux、screen,或将其作为服务运行。
验证它是否正在运行:
curl http://127.0.0.1:8080/api/v1/check
## 应返回:{"versions":{"signal-cli":...}}步骤 3:配置 Hermes
最简单的方法:
hermes gateway setup从平台菜单中选择 Signal。向导将:
- 检查 signal-cli 是否已安装
- 提示输入 HTTP URL(默认:
http://127.0.0.1:8080) - 测试与守护进程的连接
- 询问你的账户手机号码
- 配置允许的用户和访问策略
手动配置
添加到 ~/.hermes/.env:
## 必需
SIGNAL_HTTP_URL=http://127.0.0.1:8080
SIGNAL_ACCOUNT=+1234567890
## 安全(推荐)
SIGNAL_ALLOWED_USERS=+1234567890,+0987654321 # 逗号分隔的 E.164 号码或 UUID
## 可选
SIGNAL_GROUP_ALLOWED_USERS=groupId1,groupId2 # 启用群组(省略则禁用,* 表示所有)
SIGNAL_HOME_CHANNEL=+1234567890 # 定时任务的默认投递目标然后启动网关:
hermes gateway # 前台运行
hermes gateway install # 安装为用户服务
sudo hermes gateway install --system # 仅限 Linux:开机自启系统服务访问控制
私信访问
私信访问遵循与所有其他 Hermes 平台相同的模式:
- 设置了
SIGNAL_ALLOWED_USERS→ 只有这些用户可以发送消息 - 未设置允许列表 → 未知用户会收到一个私信配对码(通过
hermes pairing approve signal CODE批准) SIGNAL_ALLOW_ALL_USERS=true→ 任何人都可以发送消息(请谨慎使用)
群组访问
群组访问由 SIGNAL_GROUP_ALLOWED_USERS 环境变量控制:
| 配置 | 行为 |
|---|---|
| 未设置(默认) | 忽略所有群组消息。机器人仅响应私信。 |
| 设置为群组 ID | 仅监控列出的群组(例如 groupId1,groupId2)。 |
设置为 * | 机器人在其所属的任何群组中响应。 |
功能
附件
适配器支持双向发送和接收媒体。
接收(用户 → 代理):
- 图片 — PNG、JPEG、GIF、WebP(通过魔数自动检测)
- 音频 — MP3、OGG、WAV、M4A(如果配置了 Whisper,则转录音频消息)
- 文档 — PDF、ZIP 和其他文件类型
发送(代理 → 用户):
代理可以通过响应中的 MEDIA: 标签发送媒体文件。支持以下投递方式:
- 图片 —
send_multiple_images和send_image_file将 PNG、JPEG、GIF、WebP 作为原生 Signal 附件发送 - 语音 —
send_voice将音频文件(OGG、MP3、WAV、M4A、AAC)作为附件发送 - 视频 —
send_video发送 MP4 视频文件 - 文档 —
send_document发送任何文件类型(PDF、ZIP 等)
所有外发媒体都通过 Signal 的标准附件 API 发送。与某些平台不同,Signal 在协议层面不区分语音消息和文件附件。
附件大小限制:100 MB(双向)。
警告
Signal 服务器会对附件上传进行速率限制,适配器使用调度器进行多图片发送,将图片按 32 张一组分批,并限制上传速度以匹配 Signal 服务器策略。
原生格式化、回复引用和反应
Signal 消息以原生格式呈现,而不是显示字面的 Markdown 字符。适配器将 Markdown(**粗体**、*斜体*、`代码`、~~删除线~~、||剧透||、标题)转换为 Signal 的 bodyRanges,因此文本在接收方客户端上以真实样式显示,而不是可见的 ** / ` 字符。
回复引用。 当 Hermes 回复特定消息时,它会发布一个原生回复,引用原始消息——与 Signal 用户自己使用“回复”时看到的 UI 效果相同。对于响应入站消息而生成的回复,这是自动的。
反应。 代理可以通过标准反应 API 对消息做出反应;反应在 Signal 中显示为对引用消息的表情反应,而不是额外的文本。
这些都不需要额外配置——在最近的 signal-cli 构建中默认启用。如果你的 signal-cli 版本太旧,Hermes 会回退到纯文本投递并记录一次性警告。
输入指示器
机器人在处理消息时发送输入指示器,每 8 秒刷新一次。
工具进度显示
Signal 不支持编辑已发送的消息。因此,Hermes 在 Signal 上抑制了网关工具进度气泡,即使启用了 /verbose 并且平台保存了非 off 模式。
你仍然可以在 CLI 中看到工具活动,最终的 Signal 回复可以包含正常的助手输出。如果你需要在聊天中实时查看每个工具的进度,请使用支持消息编辑的通讯平台。
电话号码脱敏
所有电话号码在日志中自动脱敏:
+15551234567→+155****4567- 这适用于 Hermes 网关日志和全局脱敏系统
自我备注(单号码设置)
如果你将 signal-cli 作为自己手机号码的链接辅助设备(而不是单独的机器人号码),你可以通过 Signal 的“自我备注”功能与 Hermes 交互。
只需从你的手机向自己发送一条消息——signal-cli 会捕获它,Hermes 会在同一对话中回复。
工作原理:
- “自我备注”消息以
syncMessage.sentMessage信封形式到达 - 适配器检测到这些消息是发送给机器人自己的账户,并将其作为常规入站消息处理
- 回显保护(发送时间戳跟踪)防止无限循环——机器人自己的回复会被自动过滤掉
无需额外配置。 只要 SIGNAL_ACCOUNT 与你的手机号码匹配,这就会自动工作。
健康监控
适配器监控 SSE 连接,并在以下情况下自动重新连接:
- 连接断开(使用指数退避:2 秒 → 60 秒)
- 120 秒内未检测到活动(向 signal-cli 发送 ping 以验证)
故障排除
| 问题 | 解决方案 |
|---|---|
| 设置期间“无法访问 signal-cli” | 确保 signal-cli 守护进程正在运行:signal-cli --account +YOUR_NUMBER daemon --http 127.0.0.1:8080 |
| 未收到消息 | 检查 SIGNAL_ALLOWED_USERS 是否包含发送者的 E.164 格式号码(带 + 前缀) |
| “PATH 中未找到 signal-cli” | 安装 signal-cli 并确保它在 PATH 中,或使用 Docker |
| 连接频繁断开 | 检查 signal-cli 日志中的错误。确保已安装 Java 17+。 |
| 群组消息被忽略 | 使用特定群组 ID 配置 SIGNAL_GROUP_ALLOWED_USERS,或使用 * 允许所有群组。 |
| 机器人不响应任何人 | 配置 SIGNAL_ALLOWED_USERS,使用私信配对,或通过网关策略显式允许所有用户(如果你需要更广泛的访问权限)。 |
| 重复消息 | 确保只有一个 signal-cli 实例在监听你的手机号码 |
安全
警告
始终配置访问控制。 机器人默认具有终端访问权限。如果没有
SIGNAL_ALLOWED_USERS或私信配对,网关会拒绝所有入站消息作为安全措施。
- 电话号码在所有日志输出中脱敏
- 使用私信配对或显式允许列表安全地引入新用户
- 除非你特别需要群组支持,否则保持群组禁用,或仅允许你信任的群组
- Signal 的端到端加密保护传输中的消息内容
~/.local/share/signal-cli/中的 signal-cli 会话数据包含账户凭据——请像保护密码一样保护它
环境变量参考
| 变量 | 必需 | 默认值 | 描述 |
|---|---|---|---|
SIGNAL_HTTP_URL | 是 | — | signal-cli HTTP 端点 |
SIGNAL_ACCOUNT | 是 | — | 机器人手机号码(E.164) |
SIGNAL_ALLOWED_USERS | 否 | — | 逗号分隔的手机号码/UUID |
SIGNAL_GROUP_ALLOWED_USERS | 否 | — | 要监控的群组 ID,或 * 表示所有(省略则禁用群组) |
SIGNAL_ALLOW_ALL_USERS | 否 | false | 允许任何用户交互(跳过允许列表) |
SIGNAL_HOME_CHANNEL | 否 | — | 定时任务的默认投递目标 |