Telegram 设置#
Hermes Agent 与 Telegram 集成,作为功能完整的对话机器人。连接后,你可以从任何设备与 Agent 聊天、发送自动转录的语音备忘录、接收定时任务结果,并在群聊中使用 Agent。该集成基于 python-telegram-bot 构建,支持文本、语音、图片和文件附件。第一步:通过 BotFather 创建机器人#
每个 Telegram 机器人都需要由 @BotFather(Telegram 官方机器人管理工具)颁发的 API token(令牌)。3.
选择一个显示名称(例如 "Hermes Agent")——可以是任意名称
4.
选择一个用户名——必须唯一且以 bot 结尾(例如 my_hermes_bot)
5.
BotFather 会回复你的 API token,格式如下:
123456789:ABCdefGHIjklMNOpqrSTUvwxYZ
请妥善保管你的机器人 token。任何持有该 token 的人都可以控制你的机器人。如果泄露,请立即通过 BotFather 的 /revoke 命令撤销。
第二步:自定义机器人(可选)#
以下 BotFather 命令可改善用户体验。向 @BotFather 发送:| 命令 | 用途 |
|---|
/setdescription | 用户开始聊天前显示的"这个机器人能做什么?"文本 |
/setabouttext | 机器人个人资料页面上的简短文字 |
/setuserpic | 为机器人上传头像 |
/setcommands | 定义命令菜单(聊天中的 / 按钮) |
/setprivacy | 控制机器人是否能看到所有群消息(见第三步) |
对于 /setcommands,一个实用的初始命令集:help - Show help information
new - Start a new conversation
sethome - Set this chat as the home channel
第三步:隐私模式(群组关键设置)#
Telegram 机器人有一个隐私模式,默认启用。这是在群组中使用机器人时最常见的困惑来源。如何关闭隐私模式#
4.
进入 Bot Settings → Group Privacy → Turn off
更改隐私设置后,必须将机器人从所有群组中移除并重新添加。 Telegram 在机器人加入群组时会缓存隐私状态,在机器人被移除并重新添加之前不会更新。
禁用隐私模式的替代方案:将机器人提升为群组管理员。管理员机器人无论隐私设置如何都能接收所有消息,这样就无需切换全局隐私模式。
观察群组消息但不自动回复#
对于 OpenClaw/Yuanbao 风格的群组行为,可配置 Telegram 使机器人能看到普通群组消息,但只在被直接触发时响应:启用此模式后,来自明确白名单聊天/话题的未提及群组消息会作为观察上下文追加到共享聊天/话题会话记录中,但不会触发 Agent。allowed_chats 控制机器人在哪里响应;group_allowed_chats 授权用于观察上下文的共享群组会话,因此在此模式下使用相同的聊天 ID。同一白名单聊天/话题中后续的 @botname 提及、对机器人的回复或配置的提及模式可以使用该观察上下文。触发消息还会标记 [nickname|user_id],并获得每轮安全 prompt(提示词),使模型将之前观察到的内容视为上下文而非发给机器人的指令。这需要 Telegram 将普通群组消息传递给 gateway,因此请按上述说明禁用 BotFather 隐私模式或将机器人提升为群组管理员。第四步:获取你的用户 ID#
Hermes Agent 使用 Telegram 数字用户 ID 来控制访问权限。你的用户 ID 不是你的用户名——它是一个类似 123456789 的数字。第五步:配置 Hermes#
方式 A:交互式设置(推荐)#
在提示时选择 Telegram。向导会询问你的机器人 token 和允许的用户 ID,然后为你写入配置。方式 B:手动配置#
启动 Gateway#
机器人应在几秒内上线。在 Telegram 上向它发送消息以验证。从 Docker 后端终端发送生成的文件#
如果你的终端后端是 docker,请注意 Telegram 附件由 gateway 进程发送,而非从容器内部发送。这意味着最终的 MEDIA:/... 路径必须在运行 gateway 的宿主机上可 读。Agent 在 Docker 内将文件写入 /workspace/report.txt
模型发出 MEDIA:/workspace/report.txt
Telegram 投递失败,因为 /workspace/report.txt 只存在于容器内,而非宿主机上
在 Docker 内将文件写入 /output/...
在 MEDIA: 中使用宿主机可见的路径,例如:
MEDIA:/home/user/.hermes/cache/documents/report.txt
如果你已有 docker_volumes: 部分,将新挂载添加到同一列表中。YAML 重复键会静默覆盖之前的值。支持的 MEDIA: 文件扩展名#
gateway 从 Agent 回复中提取 MEDIA:/path/to/file 标签,并将引用的文件作为平台原生附件发送。所有 gateway 平台支持的扩展名 :| 类别 | 扩展名 |
|---|
| 图片 | png, jpg, jpeg, gif, webp, bmp, tiff, svg |
| 音频 | mp3, wav, ogg, m4a, opus, flac, aac |
| 视频 | mp4, mov, webm, mkv, avi |
| 文档 | pdf, txt, md, csv, json, xml, html, yaml, yml, log |
| Office | docx, xlsx, pptx, odt, ods, odp |
| 压缩包 | zip, rar, 7z, tar, gz, bz2 |
| 书籍/安装包 | epub, apk, ipa |
此列表中的任何内容都会在支持原生附件的平台(Telegram、Discord、Signal、Slack、WhatsApp、飞书、Matrix 等)上作为原生附件投递;在不支持原生附件的平台上,会回退为链接或纯文本指示。加粗类别是最近几个版本新增的——如果你之前依赖模型输出 here is the file: /path/to/report.docx,请改用 MEDIA:/path/to/report.docx 以实现原生投递。Webhook 模式#
默认情况下,Hermes 使用长轮询连接 Telegram——gateway 向 Telegram 服务器发出出站请求以获取新更新。这对本地和常驻部署效果良好。对于云部署(Fly.io、Railway、Render 等),webhook 模式更具成本效益。这些平台可以在入站 HTTP 流量时自动唤醒休眠的机器,但无法通过出站连接唤醒。由于轮询是出站的,轮询机器人永远无法休眠。Webhook 模式反转了方向——Telegram 将更新推送到你的机器人 HTTPS URL,从而实现空闲时休眠的部署。 | 轮询(默认) | Webhook |
|---|
| 方向 | Gateway → Telegram(出站) | Telegram → Gateway(入站) |
| 适用场景 | 本地、常驻服务器 | 支持自动唤醒的云平台 |
| 设置 | 无需额外配置 | 设置 TELEGRAM_WEBHOOK_URL |
| 空闲成本 | 机器必须保持运行 | 机器可在消息间隙休眠 |
| 变量 | 是否必填 | 说明 |
|---|
TELEGRAM_WEBHOOK_URL | 是 | Telegram 发送更新的公开 HTTPS URL。URL 路径会自动提取(例如上例中的 /telegram)。 |
TELEGRAM_WEBHOOK_SECRET | 是(设置 TELEGRAM_WEBHOOK_URL 时) | Telegram 在每个 webhook 请求中回显的密钥 token,用于验证。gateway 在没有该密钥时拒绝启动——参见 GHSA-3vpc-7q5r-276h。使用 openssl rand -hex 32 生成。 |
TELEGRAM_WEBHOOK_PORT | 否 | webhook 服务器监听的本地端口(默认:8443)。 |
设置 TELEGRAM_WEBHOOK_URL 后,gateway 会启动 HTTP webhook 服务器而非轮询。未设置时使用轮询模式——与之前版本行为无变化。云部署示例(Fly.io)#
2.
在 fly.toml 中暴露 webhook 端口:
[[services]]
internal_port = 8443
protocol = "tcp"
[[services.ports]]
handlers = ["tls", "http"]
port = 443
gateway 日志应显示:[telegram] Connected to Telegram (webhook mode)。代理支持