OpenClaw 多 Agent 绑定不同飞书机器人实战教程
背景
最近在配置 OpenClaw 多 Agent 时遇到一个问题:我在 openclaw.json 里添加了多个飞书渠道和多个 Agent,但测试时发现所有消息都被路由到了 main Agent,其他 Agent 根本收不到消息。
排查后发现,问题出在没有配置 bindings。
这篇文章记录完整的配置过程,帮你避开这个坑。
问题复现
一开始的配置长这样(简化版):
```json
{
“agents”: {
“list”: [
{ “id”: “main”, “default”: true },
{ “id”: “blog-agent” },
{ “id”: “work-agent” }
]
},
“channels”: {
“feishu”: {
“accounts”: [
{ “id”: “feishu-1”, “appId”: “cli_xxx”, “appSecret”: “xxx” },
{ “id”: “feishu-2”, “appId”: “cli_yyy”, “appSecret”: “yyy” }
]
}
}
}
```
看起来没问题对吧?但实际测试时,不管发给哪个飞书机器人,消息都被 main Agent 接收了。
原因分析
OpenClaw 的路由机制是这样的:
- 消息进来 → 识别渠道和发送者
- 查找
bindings配置 → 匹配 Agent - 没有匹配的 binding → 走
defaultAgent
关键点:channels.feishu.accounts[] 只是定义了飞书机器人,但没有告诉 OpenClaw “哪个机器人对应哪个 Agent”。
这个映射关系,需要通过 bindings 来配置。
解决方案:配置 bindings
bindings 是一个数组,每条配置定义一个路由规则:满足什么条件 → 路由到哪个 Agent。
完整配置示例
```json
{
“agents”: {
“list”: [
{ “id”: “main”, “default”: true, “name”: “主助手” },
{ “id”: “blog-agent”, “name”: “博客运营” },
{ “id”: “work-agent”, “name”: “工作助手” }
]
},
“channels”: {
“feishu”: {
“accounts”: [
{ “id”: “feishu-blog”, “appId”: “cli_xxx”, “appSecret”: “xxx” },
{ “id”: “feishu-work”, “appId”: “cli_yyy”, “appSecret”: “yyy” }
]
}
},
“bindings”: [
{
“agentId”: “blog-agent”,
“match”: {
“provider”: “feishu”,
“accountId”: “feishu-blog”
}
},
{
“agentId”: “work-agent”,
“match”: {
“provider”: “feishu”,
“accountId”: “feishu-work”
}
}
]
}
```
配置说明
| 字段 | 说明 |
|---|---|
bindings[].agentId |
目标 Agent ID |
bindings[].match.provider |
渠道类型,飞书是 `feishu` |
bindings[].match.accountId |
飞书机器人账号 ID,对应 `channels.feishu.accounts[].id` |
这样配置后:
- 发给
feishu-blog机器人的消息 → 路由到blog-agent - 发给
feishu-work机器人的消息 → 路由到work-agent - 其他情况 → 走
main(因为是 default)
更精细的匹配
除了按机器人账号匹配,还可以按用户或群组匹配:
```json
{
“bindings”: [
{
“agentId”: “blog-agent”,
“match”: {
“provider”: “feishu”,
“accountId”: “feishu-blog”,
“peer”: {
“kind”: “user”,
“id”: “ou_xxx”
}
}
},
{
“agentId”: “work-agent”,
“match”: {
“provider”: “feishu”,
“accountId”: “feishu-work”,
“peer”: {
“kind”: “group”,
“id”: “oc_xxx”
}
}
}
]
}
```
peer.kind: `user`(私聊)或 `group`(群聊)peer.id: 用户 Open ID 或群组 ID
这可以实现:同一个机器人,不同用户/群组路由到不同 Agent。
验证配置
配置完成后,用命令验证:
```bash
openclaw agents list –bindings
```
输出会显示每个 Agent 绑定的路由规则。
然后发测试消息,观察日志:
```bash
tail -f ~/.openclaw/logs/gateway.log | grep -E “routing|agent”
```
如果路由正确,会看到类似:
```
[routing] message from feishu:feishu-blog → agent:blog-agent
```
常见问题
Q: 配置了 bindings 但还是走 default?
检查:
match.accountId是否和channels.feishu.accounts[].id一致- JSON 格式是否正确(注意逗号、引号)
- 重启 Gateway:`openclaw gateway restart`
Q: 同一个机器人想给不同 Agent 用怎么办?
用 `peer` 匹配,按用户/群组区分:
```json
{
“bindings”: [
{
“agentId”: “agent-a”,
“match”: { “provider”: “feishu”, “accountId”: “my-bot”, “peer”: { “kind”: “user”, “id”: “ou_user_a” } }
},
{
“agentId”: “agent-b”,
“match”: { “provider”: “feishu”, “accountId”: “my-bot”, “peer”: { “kind”: “user”, “id”: “ou_user_b” } }
}
]
}
```
Q: bindings 有优先级吗?
有的,从上到下匹配,第一个匹配生效。把更具体的规则放前面。
小结
OpenClaw 多 Agent 配置的关键点:
- `agents.list[]` 定义 Agent 列表
- `channels.feishu.accounts[]` 定义飞书机器人
- `bindings[]` 定义路由规则:哪个机器人 → 哪个 Agent
漏掉 `bindings`,所有消息都会走 default Agent。配置好之后,就能实现不同飞书机器人对应不同 Agent 的效果。