- 独立的工作目录:每个 Agent 拥有自己的
SOUL.md(人格设定)、AGENTS.md(行为规则)、MEMORY.md(长期记忆)等文件。 - 独立的会话历史:不同 Agent 的聊天记录互不共享。
- 独立的认证配置:API 密钥、OAuth 令牌等服务凭据各自管理。
- 独立的工具权限:每个 Agent 可使用或禁用的工具(如文件读写、代码执行、浏览器操作)可以精确控制。
openclaw.json)的 bindings部分设定规则,系统会根据消息来源的渠道(channel)、账号(accountId)或特定的群组/用户(peer)来决定由哪个 Agent 处理消息。匹配遵循“精确优先”原则:peer匹配 > accountId匹配 > channel匹配 > 默认Agent。allow(白名单)和 deny(黑名单)列表来实现的。例如,家庭群的 Agent 可以只允许读取文件和查看会话列表,而禁止所有执行、写入、浏览等操作,从而从根源上防止越权行为。SOUL.md等文件实现的。这意味着虽然底层是同一个 AI 模型,但不同的 Agent 可以根据其角色(如温和的家庭助手、专业的工作助手)展现出完全不同的性格和对话边界。从0到AI,每天分享 AI 工具的真实用法和落地经验。全文约 2900 字,建议收藏慢读。

“多 agent 不是多开几个对话框,而是让不同的 AI 真正活在不同的’身份’里。” “工作群里的 AI 不该知道你家庭群在聊什么。” “一台服务器,五个 AI,各自有自己的记忆、风格和权限。”
我之前写过一篇多 Agent 协作的文章,讲的是 Content、Social、Dev 这几个助手怎么分工干活。
那篇文章关注的是”协作”——Agent 之间怎么传任务、怎么配合。
这篇聊的是另一件事:隔离。
当你有多个 AI 角色跑在同一台服务器上,你怎么确保它们互不干扰?你家庭群的 AI 不会知道你工作群在聊什么?给同事用的助手不会有你的个人日历权限?
这就是 OpenClaw 多 Agent 路由系统要解决的问题。
从一个真实的需求说起
我现在跑着五个 Agent:
personal:我的私人助手,什么都能做,跑在 Telegram 主账号上 work:工作助手,连着公司的 Google Workspace,跑在 WhatsApp 工作号上 family:家庭群专用,只能读文件、不能执行命令,跑在家庭 WhatsApp 群里 coding:开发助手,有完整的代码执行权限,跑在 Discord 开发服务器 alerts:只推送通知的机器人,跑在 Telegram 另一个 bot 账号上
这五个角色,跑在同一台 VPS 上,但彼此之间完全隔离——不同的聊天历史、不同的工具权限、不同的性格设定。
做到这一切,只需要一个 OpenClaw 配置文件。
核心概念:Agent 是什么?
在 OpenClaw 里,一个 Agent 不是一个对话,而是一整套独立的”身份”:
独立的工作目录:有自己的 SOUL.md、AGENTS.md、MEMORY.md独立的会话历史:不同 Agent 的聊天记录完全分开 独立的认证配置:API key、OAuth token、外部服务登录,各管各的 独立的工具权限:可以精确控制这个 Agent 能用哪些工具
你和 personal Agent 说的每一句话,work Agent 完全不知道。这不是”对话隔离”,而是真正意义上的身份隔离。
一份完整的配置
先看整体结构,再一块一块解释:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line{"agents": {"list": [{"id": "personal","name": "Personal Assistant","default": true,"workspace": "~/.openclaw/workspace-personal"},{"id": "work","name": "Work Assistant","workspace": "~/.openclaw/workspace-work"},{"id": "family","name": "Family Bot","workspace": "~/.openclaw/workspace-family","tools": {"allow": ["read", "sessions_list"],"deny": ["exec", "write", "edit", "browser"]}},{"id": "coding","name": "Coding Agent","workspace": "~/.openclaw/workspace-coding"},{"id": "alerts","name": "Alerts Bot","workspace": "~/.openclaw/workspace-alerts"}]},"bindings": [{ "agentId": "personal", "match": { "channel": "telegram", "accountId": "default" } },{ "agentId": "work", "match": { "channel": "whatsapp", "accountId": "biz" } },{"agentId": "family","match": {"channel": "whatsapp","peer": { "kind": "group", "id": "120363xxxxxxxx@g.us" }}},{ "agentId": "coding", "match": { "channel": "discord", "accountId": "coding-bot" } },{ "agentId": "alerts", "match": { "channel": "telegram", "accountId": "alerts" } }]}
路由是怎么决定的?
每条消息进来,OpenClaw 会自动找最匹配的 binding 来决定由哪个 Agent 处理。
匹配的优先级从高到低:
精确匹配特定群/用户( peer字段)——最优先账号级别匹配( accountId字段)渠道级别匹配(只写了 channel)默认 Agent(没有匹配时,用 default: true的那个)
实际效果:
家庭群的消息来了 → 精确匹配到家庭群的 peer id → 交给 family Agent WhatsApp 工作号收到消息 → 匹配到 biz accountId → 交给 work Agent Telegram 主 bot 收到私信 → 匹配 default 账号 → 交给 personal Agent alerts bot 收到消息 → 匹配 alerts accountId → 交给 alerts Agent
每条路由都是确定性的,没有歧义,没有”猜”。
工具权限怎么配?
家庭群的 AI,我不希望它能执行命令或者写文件。
配置很直接:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line{"id": "family","workspace": "~/.openclaw/workspace-family","tools": {"allow": ["read", "sessions_list"],"deny": ["exec", "write", "edit", "browser", "canvas"]}}
allow 是白名单,deny 是黑名单。配了 deny 之后,就算有人在群里说”帮我执行这段脚本”,Agent 也做不到——工具根本不在它的可用列表里。
coding Agent 则相反,需要完整的执行能力:
ounter(lineounter(lineounter(lineounter(line{"id": "coding","workspace": "~/.openclaw/workspace-coding"}
不设限制,默认所有工具都可用。
每个 Agent 有自己的人格
每个 workspace 目录里放的是这个 Agent 的”灵魂文件”:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line~/.openclaw/workspace-personal/├── SOUL.md ← 性格、角色设定├── AGENTS.md ← 行为规则├── USER.md ← 用户信息└── MEMORY.md ← 长期记忆~/.openclaw/workspace-family/├── SOUL.md ← 温和、简洁、不涉及工作话题├── AGENTS.md ← 只回答家庭相关问题└── MEMORY.md ← 家庭共同记忆
family Agent 的 SOUL.md 可以是:
ounter(lineounter(lineounter(lineounter(lineounter(line你是家庭群的助手。- 语气温和,适合所有年龄段- 只讨论生活相关话题,不讨论工作- 遇到技术问题,引导家人联系 Victor- 不执行任何代码或文件操作
work Agent 的 SOUL.md 是另一套:
ounter(lineounter(lineounter(lineounter(line你是工作助手。- 专业、简洁、重点导向- 熟悉公司项目背景(见 projects/)- 邮件草稿直接给出,不需要确认
同一套 AI 底层,完全不同的人格和行为边界。
多账号怎么处理?
以 WhatsApp 为例,我有两个号:个人号和工作号。登录的时候分别给不同的 accountId:
ounter(lineounter(lineopenclaw channels login --channel whatsapp --account personalopenclaw channels login --channel whatsapp --account biz
然后在 bindings 里,personal 的 WhatsApp 给 personal Agent,biz 的给 work Agent:
ounter(lineounter(lineounter(lineounter(line"bindings": [{ "agentId": "personal", "match": { "channel": "whatsapp", "accountId": "personal" } },{ "agentId": "work", "match": { "channel": "whatsapp", "accountId": "biz" } }]
Telegram 同理——两个 bot token,两个 accountId,两个 Agent:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line"channels": {"telegram": {"accounts": {"default": { "botToken": "主 bot 的 token" },"alerts": { "botToken": "alerts bot 的 token" }}}}
部署完之后,验证一下
配置改完,重启 Gateway:
ounter(lineopenclaw gateway restart
然后检查路由是否正确:
ounter(lineopenclaw agents list --bindings
输出会显示每个 Agent 绑定了哪些渠道/账号/群组。如果哪条规则不对,可以直接在 openclaw.json 里调整,再重启。
一个常见的小坑:peer 匹配要精确
家庭群的 binding 需要填群的 peer id:
ounter(line{ "agentId": "family", "match": { "channel": "whatsapp", "peer": { "kind": "group", "id": "120363xxxxxxxx@g.us" } } }
这个 id 在哪找?第一次收到群消息后,OpenClaw 的日志里会打出来。或者运行:
ounter(lineopenclaw sessions --json | grep group
找到对应的群 session,里面有 peer id。
另外要注意顺序:更精确的 binding 要排在前面。同一个 WhatsApp 个人号,我可能既有”默认给 personal Agent”的规则,又有”这个特定的群给 family Agent”的规则——群规则要放在前面,否则会被默认规则拦截。
多 Agent 之间能互相通信吗?
默认不能,这是安全设计。
如果你需要 Agent 之间传递任务(比如 personal Agent 让 coding Agent 去跑一段代码),需要在配置里显式开启:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line{"tools": {"agentToAgent": {"enabled": true,"allow": ["personal", "coding"]}}}
只有 allow 列表里的 Agent 组合才能互发消息。不在列表里的,即使你告诉 Agent “去联系 work Agent”,它也做不到。
实际用下来的感受
这套多 Agent 路由系统最值得称道的地方,不是”功能强大”,而是边界清晰。
以前我试过用一个 AI 处理所有事,结果它什么都知道一点,每件事都做得凑合。你问它工作上的事,它可能会联想到你家里的话题;你在家庭群里问它,它会给出过于专业的答复。
隔离之后就不一样了。家庭群的 AI 就是朴实地答家庭问题,工作助手就是专注在工作语境里,互不打扰。
这种”各司其职”的感觉,比一个万能助手更顺手。
写在最后
多 Agent 隔离路由,看起来是个配置问题,背后其实是一个设计选择:你想要一个什么样的 AI 使用边界?
几个核心点回顾:
Agent = 独立身份:工作目录、历史、认证、工具权限,全部隔离 Binding = 路由规则:根据渠道、账号、群组,精确分发到对应 Agent 精确优先:peer 匹配 > accountId 匹配 > channel 匹配 > 默认 Agent 工具限制:按 Agent 配置 allow/deny,细粒度控制能力边界 互通需显式开启:默认 Agent 之间是隔离的,需要通信要单独配置
一台服务器,五个性格各异、各有边界的 AI 角色。你需要的,可能比想象中少。