飞书 / Lark 配置#
Hermes Agent 可作为全功能机器人与飞书和 Lark 集成。连接后,你可以在私信或群聊中与 Agent 对话,在 home chat 中接收 cron job 结果,并通过标准 gateway 流程发送文本、图片、音频和文件附件。websocket — 推荐;Hermes 主动建立出站连接,无需公开 webhook 端点
webhook — 适用于已将 Hermes 部署在可访问 HTTP 端点后的场景
Hermes 的行为方式#
| 场景 | 行为 |
|---|
| 私信 | Hermes 回复每一条消息。 |
| 群聊 | Hermes 仅在被 @提及 时回复。 |
| 共享群聊 | 默认情况下,每位用户在共享群聊中的会话历史相互隔离。 |
仅当你明确希望每个群聊共享同一个对话时,才将其设为 false。第一步:创建飞书 / Lark 应用#
推荐:扫码创建(一条命令)#
选择 飞书 / Lark,用飞书或 Lark 手机端扫描二维码。Hermes 将自动创建具有正确权限的机器人应用并保存凭据。备选:手动配置#
3.
在 凭证与基础信息 中,复制 App ID 和 App Secret。
5.
运行 hermes gateway setup,选择 飞书 / Lark,并在提示时输入凭据。
请妥善保管 App Secret。任何持有它的人都可以冒充你的应用。
第二步:选择连接模式#
推荐:WebSocket 模式#
当 Hermes 运行在你的笔记本、工作站或私有服务器上时,使用 WebSocket 模式。无需公开 URL。官方 Lark SDK 会建立并维护一个持久的出站 WebSocket 连接,并支持自动重连。依赖: 必须安装 websockets Python 包。SDK 在内部处理连接生命周期、心跳和自动重连。工作原理: 适配器在后台 executor 线程中运行 Lark SDK 的 WebSocket 客户端。入站事件(消息、表情回应、卡片操作)被分发到主 asyncio 循环。断开连接时,SDK 将自动尝试重连。可选:Webhook 模式#
仅当 Hermes 已部署在可访问的 HTTP 端点后时,才使用 webhook 模式。在 webhook 模式下,Hermes 启动一个 HTTP 服务器(通过 aiohttp),并在以下路径提供飞书端点:依赖: 必须安装 aiohttp Python 包。你可以自定义 webhook 服务器的绑定地址和路径:当飞书发送 URL 验证挑战(type: url_verification)时,webhook 会自动响应,以便你在飞书开发者控制台完成订阅配置。当设置了 FEISHU_VERIFICATION_TOKEN 时,挑战响应会进行 token 校验——token 缺失或不匹配的挑战请求将被拒绝,防止未经认证的远端通过回显攻击者控制的挑战数据来证明端点控制权。第三步:配置 Hermes#
方式 A:交互式配置#
方式 B:手动配置#
在 ~/.hermes/.env 中添加以下内容:第四步:启动 Gateway#
然后从飞书/Lark 向机器人发送消息,确认连接已建立。Home Chat#
在飞书/Lark 聊天 中使用 /set-home 将其标记为 cron job 结果和跨平台通知的 home channel。用户白名单#
在生产环境中,请设置飞书 Open ID 白名单:如果白名单为空,任何能访问机器人的人都可能使用它。在群聊中,消息处理前会根据发送者的 open_id 检查白名单。Webhook 加密密钥#
在 webhook 模式下运行时,设置加密密钥以启用入站 webhook payload 的签名 验证:该密钥可在飞书应用配置的 事件订阅 部分找到。设置后,适配器使用以下签名算法验证每个 webhook 请求:SHA256(timestamp + nonce + encrypt_key + body)
计算出的哈希值与 x-lark-signature 请求头进行时序安全比较。签名无效或缺失的请求将被拒绝,返回 HTTP 401。在 WebSocket 模式下,签名验证由 SDK 自身处理,因此 FEISHU_ENCRYPT_KEY 是可选的。在 webhook 模式下,生产环境强烈推荐设置。
验证 Token#
对 webhook payload 中 token 字段进行检查的额外认证层:该 token 同样可在飞书应用的 事件订阅 部分找到。设置后,每个入站 webhook payload 的 header 对象中必须包含匹配的 token。token 不匹配的请求将被拒绝,返回 HTTP 401。FEISHU_ENCRYPT_KEY 和 FEISHU_VERIFICATION_TOKEN 可同时使用,实现纵深防御。群消息策略#
FEISHU_GROUP_POLICY 环境变量控制 Hermes 是否以及如何在群聊中响应:| 值 | 行为 |
|---|
open | Hermes 响应任意群中任意用户的 @提及。 |
allowlist | Hermes 仅响应 FEISHU_ALLOWED_USERS 中列出的用户的 @提及。 |
disabled | Hermes 完全忽略所有群消息。 |
在所有模式下,消息处理前机器人必须被明确 @提及(或 @all)。私信始终绕过此限制。设置 FEISHU_REQUIRE_MENTION=false 可让 Hermes 读取所有群消息而无需 @提及:如需按群控制,在 group_rules 条目中设置 require_mention——参见下方按群访问控制。机器人身份#
Hermes 在启动时自动检测机器人的 open_id 和显示名称。仅当自动检测无法访问飞书 API,或你的应用使用租户范围用户 ID 时,才需要手动设置:机器人间消息传递#
默认情况下,Hermes 忽略其他机器人发送的消息。当你希望 Hermes 参与 A2A 编排或接收同一群中其他机器人的通知时,可启用机器人间消息传递。| 值 | 行为 |
|---|
none | 忽略所有其他机器人的消息(默认)。 |
mentions | 仅当对端机器人 @提及 Hermes 时接受。 |
all | 接受所有对端机器人消息。 |
也可在 config.yaml 中配置为 feishu.allow_bots(两者同时设置时,环境变量优先)。对端机器人无需加入 FEISHU_ALLOWED_USERS——该白名单仅适用于人类发送者。授予 application:bot.basic_info:read 权限范围可显示对端机器人名称;未授权时,对端机器人仍可正常路由,但显示为其 open_id。交互式卡片操作#
当用户点击机器人发送的交互式卡片上的按钮或与其交互时,适配器将这些操作路由为合成的 /card 命令事件:按钮点击变为:/card button {"key": "value", ...}
卡片定义中操作的 value payload 以 JSON 形式包含在内。
Gateway 驱动的更新提示使用原生飞书 Yes / No 卡片,而非回退到纯文本回复。当 hermes update --gateway 需要确认时,适配器将所选答案记录到 Hermes 的 .update_response 文件中,并将卡片内联替换为已解决状态。卡片操作事件以 MessageType.COMMAND 分发,因此流经标准命令处理管道。命令审批也通过此机制实现——当 Agent 需要执行危险命令时,会发送一张带有「允许一次 / 本次会话 / 始终允许 / 拒绝」按钮的交互式卡片。用户点击按钮后,卡片操作回调将审批决定传回 Agent。飞书应用所需配置#
交互式卡片需要在飞书开发者控制台完成三项配置。缺少任何一项,用户点击卡片按钮时将出现错误 200340。1.
订阅卡片操作事件:
在 事件订阅 中,将 card.action.trigger 添加到已订阅事件。
2.
启用交互式卡片能力:
在 应用功能 > 机器人 中,确保 交互式卡片 开关已启用。这告知飞书你的应用可以接收卡片操作回调。
3.
配置卡片请求 URL(仅 webhook 模式):
在 应用功能 > 机器人 > 消息卡片请求网址 中,将 URL 设置为与事件 webhook 相同的端点(例如 https://your-server:8765/feishu/webhook)。WebSocket 模式下,SDK 会自动处理此项。
缺少以上任意一步,飞书将成功发送交互式卡片(发送仅需 im:message:send 权限),但点击任意按钮将返回错误 200340。卡片看起来正常——错误仅在用户与其交互时才会出现。
文档评论智能回复#
除聊天外,适配器还可以回复飞书/Lark 文档中的 @ 提及。当用户在文档中评论(局部文本选区或全文评论)并 @提及机器人时,Hermes 读取文档内容及周围的评论线程,并在线程中内联发布 LLM 回复。由 drive.notice.comment_add_v1 事件驱动,处理器:并行获取文档内容和评论时间线(全文线程取 20 条消息,局部选区线程取 12 条)。
以 feishu_doc + feishu_drive 工具集运行 Agent,范围限定于该单次评论会话。