← Back to Plugins
Tools

Feishu A2a

langyuhero By langyuhero ⭐ 1 stars 👁 37 views ▲ 0 votes

OpenClaw plugin for Feishu group chat A2A collaboration | 飞书群聊多Agent协作插件

GitHub

Configuration Example

{
  "plugins": {
    "entries": {
      "openclaw-feishu-a2a": {
        "enabled": true,
        "config": {
          "botRegistry": {
            "agent-id": {
              "accountId": "feishu-account-id",
              "botOpenId": "ou_xxxxxxxxxxxxxxxx",
              "botName": "显示名称"
            }
          }
        }
      }
    }
  }
}

README

# OpenClaw Feishu A2A Plugin v0.1.0

OpenClaw 插件,实现飞书群聊中多个 Bot 之间的 A2A(Agent-to-Agent)协作通信,带任务状态跟踪和自动 @ 回兜底。

## 核心能力

| 能力 | 说明 |
|------|------|
| **自动发现** | 自动识别群内所有 Bot 及其 open_id,零配置 |
| **任务状态跟踪** | 自动记录谁派发了什么任务给谁,完成没有 |
| **自动 @ 回兜底** | Worker 忘了 @ 回 Host 时,插件自动补上 `<at>` 标签 |
| **角色感知** | Host 看到协作进度,Worker 看到任务提醒 |
| **格式转换** | `@botName` 文本自动转为飞书 `<at>` 标签 |
| **消息过滤** | 过滤非 @ 的 Bot 消息,避免无关触发 |
| **群成员过滤** | 只展示当前群内实际存在的 Bot |

## 前置条件

每个参与协作的 Bot 应用需要在飞书开发者后台开通:

**`im:message.group_at_msg.include_bot:readonly`**(接收群聊中机器人 @机器人的消息)

路径:开发者后台 → 应用 → 权限管理 → 搜索上述权限 → 开通

## 安装

```bash
# 克隆到 OpenClaw 扩展目录
cd ~/.openclaw/extensions
git clone https://github.com/langyuhero/openclaw-feishu-a2a.git feishu-bot-chat

# 重启 gateway 生效
openclaw gateway restart
```

插件会自动发现所有绑定了飞书 account 的 agent,无需额外配置。

## 工作原理

```
用户 @ 主持者 → 主持者拆解任务 @ Worker
                         ↓
              飞书原生投递:Worker 收到任务
                         ↓
              Worker 完成任务,@ 回主持者(插件自动兜底)
                         ↓
              主持者收到结果,汇总回复用户
```

### 三个 Hook

| Hook | 基础能力 | v0.1.0 新增 |
|------|--------|------------|
| `before_prompt_build` | 注入 Bot 列表和协作规则 | + 角色检测(Host/Worker)、进度注入、任务提醒、调度指引 |
| `message_sending` | `@name` → `<at>` 标签替换 | + 任务派发检测、**Worker 自动 @ 回兜底** |
| `inbound_claim` | 过滤非 @ 消息、注入发送者信息 | + 任务创建、完成检测、进度状态注入 |

### 任务状态跟踪

插件在 `~/.openclaw/fbc-registry/sessions.json` 中维护协作状态:

- Host @ Worker → 自动创建 session + task(状态:dispatched)
- Worker @ 回 Host → 自动标记 task completed
- 所有 task 完成 → 提示 Host 汇总结果
- 2 小时无活动 → 自动过期清理

### 自动 @ 回兜底(核心改进)

飞书的 mention-only 投递模式下,Bot 不加 `<at>` 标签就等于消息丢失。插件在 `message_sending` 中检测:如果 Worker 有未完成的任务但回复中没有 @ Host,自动在消息开头补上 `<at>` 标签,确保 Host 收到回传。

## 配置(可选)

默认零配置即可工作。如需手动指定 Bot 列表,可在 `openclaw.json` 中配置:

```json
{
  "plugins": {
    "entries": {
      "openclaw-feishu-a2a": {
        "enabled": true,
        "config": {
          "botRegistry": {
            "agent-id": {
              "accountId": "feishu-account-id",
              "botOpenId": "ou_xxxxxxxxxxxxxxxx",
              "botName": "显示名称"
            }
          }
        }
      }
    }
  }
}
```

## 使用案例

### 案例 1:调研 + 写作(串行协作)

> 场景:用户想写一篇关于某行业的公众号文章

```
👤 用户:@维嘉 帮我写一篇关于有机蔬菜行业发展的公众号文章

🤖 维嘉:收到!我先确认几个关键点:
         1. 目标读者是消费者还是从业者?
         2. 篇幅大概多少字?
         3. 有没有需要突出的重点方向?

👤 用户:写给普通消费者看,1500字左右的短文,公众号风格

🤖 维嘉:明白了。我的分工计划:
         1. 先让司南调研有机蔬菜行业最新数据和趋势
         2. 再让灵犀基于调研结果撰写公众号文章
         确认后我开始派发?

👤 用户:可以,开始吧

🤖 维嘉:@司南 请调研有机蔬菜行业最新发展趋势……
         完成后请 @ 回我汇报结果。

🤖 司南:@维嘉 调研完成!以下是关键发现:
         1. 2025年有机蔬菜市场规模达XXX亿……
         2. 社区团购和即时零售成为新渠道……
         ……

🤖 维嘉:(收到司南调研结果,继续派发)
         @灵犀 请基于以下调研材料,写一篇公众号短文……
         {附上司南的调研结果}

🤖 灵犀:@维嘉 文章已完成!标题《你吃的有机菜,真的有机吗?》
         ……(完整文章内容)

🤖 维嘉:(所有任务完成,汇总回复用户)
         文章写好了!基于司南的行业调研,灵犀产出了这篇文章:
         ……
```

**插件在背后做了什么:**
- 维嘉 @司南 时 → 自动创建 session,记录任务状态
- 司南完成后即使忘了 @ 维嘉 → 插件自动补上 `<at>` 标签
- 维嘉收到回传 → 系统注入"✅ 司南已完成,还有 0 个待完成任务"
- 维嘉的 prompt 中始终可见当前协作进度

---

### 案例 2:单人任务(直接派发)

> 场景:用户想写一句广告语,不需要调研

```
👤 用户:@维嘉 帮我想一句咖啡品牌的广告语,年轻人喜欢的风格

🤖 维嘉:@灵犀 帮忙为一个咖啡品牌想广告语,目标受众是年轻人,
         要求有活力、有态度,可以给3-5个方案。
         完成后请 @ 回我汇报结果。

🤖 灵犀:@维嘉 搞定!给你5个方案:
         1.「这一杯,醒着做梦」
         2.「别等灵感,灵感在杯底」
         ……

🤖 维嘉:给你几个广告语方案,灵犀帮你想的:
         ……
```

**要点:** 纯创意任务不需要调研,维嘉直接 @ 灵犀,不走确认流程。

---

### 案例 3:多人并行(互不依赖的子任务)

> 场景:用户要做一个产品方案,需要多个角色同时输出

```
👤 用户:@维嘉 我们要做一个会员积分系统,帮我出个初步方案

🤖 维嘉:我先确认下——这个积分系统是面向电商用户的对吧?
         积分主要用途是抵扣消费还是兑换礼品?

👤 用户:电商用户,消费积分可以抵扣也可以兑换

🤖 维嘉:好的,分工计划:
         1. 谋远负责积分体系的策略设计(积累规则、消耗规则、等级体系)
         2. 码力负责技术方案设计(数据库、接口、并发处理)
         两个任务互不依赖,我会依次派发。确认?

👤 用户:ok

🤖 维嘉:@谋远 请设计会员积分体系的策略方案……

🤖 谋远:@维嘉 策略方案如下:
         积分获取:消费1元=1积分,评价+10积分……
         ……

🤖 维嘉:@码力 请设计积分系统的技术方案,
         参考策略顾问的方案:{附上谋远的策略方案}
         ……

🤖 码力:@维嘉 技术方案完成:
         数据库设计:points_account 表 + points_log 表……
         ……

🤖 维嘉:积分系统方案出来了,给你汇总:

         【策略方案】(谋远)
         ……

         【技术方案】(码力)
         ……

         两边方案已对齐,接口设计覆盖了所有策略规则。
```

---

### 案例 4:中途取消

> 场景:用户改变需求,需要停止正在进行的协作

```
👤 用户:@维嘉 等一下,积分方案先不做了,优先级变了

🤖 维嘉:收到,已停止协作。当前进度:
         ✅ 谋远 — 策略方案已完成
         ⏳ 码力 — 技术方案进行中

         🔕仅通知 @码力 积分系统的技术方案任务已取消,无需继续。

         谋远的策略方案已经出来了,需要我保存吗?
```

**要点:** 用 🔕仅通知 告知正在工作的 Agent,不会触发对方 @ 回。

## 内置 Skills

| Skill | 说明 |
|-------|------|
| `a2a-host-protocol` | 主持者协议:需求澄清 → 规划确认 → 派发 → 跟踪 → 汇总 |
| `a2a-worker-protocol` | 执行者协议:接收任务 → 执行 → @ 回汇报 |
| `a2a-message-format` | 消息格式规范、中断处理、模式切换 |

## 调试

```bash
# 查看实时日志
tail -f ~/.openclaw/extensions/openclaw-feishu-a2a/logs/a2a-debug-$(date +%Y-%m-%d).log

# 查看任务状态
cat ~/.openclaw/fbc-registry/sessions.json | python3 -m json.tool
```

## 文件结构

```
openclaw-feishu-a2a/
├── index.js                 # 主插件(3 个 hooks)
├── lib/
│   └── session-store.js     # 任务状态持久化
├── openclaw.plugin.json     # 插件清单
├── package.json
├── skills/
│   ├── a2a-host-protocol/   # 主持者协议
│   ├── a2a-worker-protocol/ # 执行者协议
│   └── a2a-message-format/  # 消息格式规范
└── HOOK.md                  # Hook 说明文档
```

## Credits

- **Leochens** — 原始 [feishu-bot-chat-plugin](https://github.com/Leochens/feishu-bot-chat-plugin) 作者,实现了自动发现、@ 标签替换、消息过滤等核心功能。[GitHub](https://github.com/Leochens) | [B站](https://space.bilibili.com/351188457)
- **langyuhero** — v0.1.0(本仓库),基于原始插件大幅重写,新增任务状态跟踪、自动 @ 回兜底、角色感知等协作闭环能力

## License

MIT
tools

Comments

Sign in to leave a comment

Loading comments...