飞书 / Lark 机器人支持群聊 @ 触发,避免静默丢弃 chat_type=group 消息
- Dominant language
- TypeScript
- Stars
- 2.7k
- Forks
- 401
- Avg merge
- 21h 48m
- Merged PRs (30d)
- 776
Description
**提交人**: eric chan
**客户端版本**: 0.1.27
---
## 使用场景
用户已在 Cindy 中成功连接飞书机器人,私聊机器人可以正常触发 Agent。将同一个机器人加入飞书群聊后,希望通过真正的 `@Cindy` mention 在群内发起任务,让回复回到原群聊或原话题。
这适用于团队问答、群内资料整理、会议跟进和多人协作等场景;不要求普通群消息自动触发 Agent。
## 当前行为与证据
复现过程:
1. 在 Cindy 中连接飞书机器人,并通过私聊完成 Owner 绑定。
2. 私聊机器人,确认可以正常回复。
3. 将机器人添加到飞书群聊。
4. 使用飞书的 @ 选择器真正 `@Cindy` 并发送问题。
5. 群内没有任何回复或错误提示。
本机日志表明机器人已成功加入群聊,群消息事件也已到达 Cindy,但随后被客户端主动丢弃:
```text
[console] no im.chat.member.bot.added_v1 handle
[im:feishu] [feishu/wsClient] drop non-p2p chat_type=group
```
作为对照,私聊消息会继续进入正常处理链路:
```text
[im:feishu:msg] processOne ...
[im:feishu:turn] enqueued turn ...
```
当前 `packages/lizi-im/src/feishu/wsClient.ts` 的入站处理在解析 mention、检查发送者和启动 Agent 之前,对所有非 `p2p` 消息直接返回:
```ts
if (event.message.chat_type !== 'p2p') {
log.info(`[feishu/wsClient] drop non-p2p chat_type=${event.message.chat_type}`);
return;
}
```
因此这不是飞书权限不足或 @ 方式错误,而是当前实现只支持私聊。设置页和机器人连接状态没有明确说明这一限制,用户容易反复排查飞书权限和事件订阅。
## 诉求
1. 飞书和 Lark 机器人支持群聊中的真实 @ mention 触发 Agent。
2. 非 @、非回复机器人的普通群消息继续保持不触发,避免噪音和隐私扩大。
3. 回复发送回原 `chat_id`;如果来源是话题或线程,应尽量回到原话题/线程。
4. 群聊和私聊会话相互隔离,不同群聊之间也按 `chat_id` 隔离。
5. 明确定义安全边界。最小版本可以只允许已绑定 Owner 在群内 @ 触发;若允许其他群成员,应提供显式配置或授权机制。
6. 在群聊支持落地前,设置页或帮助文档明确标注“当前仅支持私聊”,不要静默表现为机器人故障。
## 建议方案
- 保持现有 `p2p` 流程不变。
- 对 `chat_type=group`:
- 检查消息是否真正 mention 当前机器人,或是否回复机器人消息;
- 检查发送者是否满足 Owner/allowlist 策略;
- 仅满足条件时进入统一 IM 编排;其余消息记录可诊断的忽略原因但不触发 Agent。
- 为群聊入站携带 `chat_id`、thread/topic 信息和触发消息 ID;出站按 `chat_id` 回复,而不是按个人 `open_id` 私发。
- 会话绑定键至少包含服务类型与 `chat_id`,避免群聊上下文串线。
- 增加回归测试覆盖:
- Owner 在群内 @ → 触发并回群;
- 普通群消息 → 不触发;
- 未授权成员 @ → 按策略拒绝或忽略;
- 两个群并行 → 会话隔离;
- 私聊行为不回归;
- Feishu 与 Lark 域名路由均保持一致行为。
## 验收标准
- [ ] 群聊中真正 @ 机器人可以触发一次 Agent turn。
- [ ] 最终回复发送到原群聊,并保留可用的话题/线程归属。
- [ ] 未 @ 的普通群消息不会启动 Agent。
- [ ] 未授权发送者不会绕过 Owner/allowlist 边界。
- [ ] 不同群聊及私聊之间不会共享错误的上下文或 binding。
- [ ] 现有私聊、附件、卡片和流式回复能力不回归。
- [ ] 不支持群聊的版本在 UI 或帮助中明确展示限制,而不是静默丢弃。
---
**OS**: darwin arm64 (25.3.0)
**界面语言**: zh-CN
Contributor guide
Research direction
Start with packages/lizi-im/src/feishu/wsClient.ts and trace the existing p2p processing path, including mention handling, authorization, session binding, and reply routing. Use the listed regression cases to define coverage for group mentions, ignored messages, authorization, isolation, private-chat compatibility, and Feishu/Lark routing. Done means authorized group mentions trigger one turn and reply in the original chat or thread without regressions, while unsupported versions state the limitation.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- api, backend, documentation, security, testing
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100