OpenClaw 支持在一个 Gateway 进程内运行多个代理,每个代理都可以像自己的助手一样运行,拥有自己的文件、内存、身份验证和工具。
本指南从实际角度介绍多智能体设置。您将看到两种容易混淆的模式:
- 持久代理程序会'永久'存在,通常映射到某个频道、机器人帐户或家庭成员。
- 在后台运行执行特定任务并自动归档的子代理
您可以同时运行这两个代理。常见的设置是:一个主'协调器'代理负责处理主要聊天,并生成子代理来执行并行任务。同时,您还可以将其他持久代理绑定到不同的频道,使它们能够独立运行。
OpenClaw 多智能体系统的配置方法,涵盖持久代理与子代理两种核心模式。文章阐述了如何在工作区、内存、模型及工具权限上实现隔离,并通过 CLI 命令或手动配置文件创建代理。重点讲解了消息绑定与路由规则,包括 WhatsApp、Telegram、Discord 和 Slack 的具体配置示例。此外,还涉及了沙箱安全设置、代理间通信机制、成本控制策略以及常见故障排查方案,旨在帮助用户构建高效、安全的多智能体协作环境。
OpenClaw 支持在一个 Gateway 进程内运行多个代理,每个代理都可以像自己的助手一样运行,拥有自己的文件、内存、身份验证和工具。
本指南从实际角度介绍多智能体设置。您将看到两种容易混淆的模式:
您可以同时运行这两个代理。常见的设置是:一个主'协调器'代理负责处理主要聊天,并生成子代理来执行并行任务。同时,您还可以将其他持久代理绑定到不同的频道,使它们能够独立运行。
OpenClaw 可以在单个 Gateway 进程内运行多个完全隔离的代理。'隔离'并非营销噱头。每个代理都可以拥有自己的:
它们仍然共享同一个服务器进程和同一个主配置文件,所以你不需要运行十个网关。你只需要运行一个网关和多个位于其中的'大脑'。
如果你目前只在几个渠道上运行一个助手,可能不需要多代理。一个配置良好的单代理可以同时处理 Slack、Telegram 和 Discord,并保持上下文一致。只有当需要真正的隔离、不同的工具策略或互不干扰的独立内存时,多代理才真正有用。
持久代理是指那些长期存在的代理。您可以在配置中定义它们,也可以使用代理向导创建它们。这些代理会被绑定到频道和聊天中。
合理的例子:
子代理是从正在进行的对话中派生的后台工作进程。它们在自己的会话中运行,执行任务并将结果返回。OpenClaw 在两处地方对此进行了说明,建议阅读一遍:
子代理非常适合并行研究和执行耗时较长的工具任务。如果主代理使用成本较高的模型,而子代理使用成本较低的模型或本地模型,那么子代理也有助于控制成本。
多智能体并非只需勾选一个复选框即可。它会增加一些动态组件。关键在于,添加智能体时要有明确的理由。
这是最重要的原因。例如,您希望您的个人助理拥有执行权限和文件系统访问权限,但您不希望您的公共 Discord 机器人拥有执行权限。通过使用不同的代理,您可以为每个代理设置允许和拒绝列表来强制执行此操作。
如果您需要 OpenClaw 部署的安全上下文,请参考相关安全最佳实践指南。
记忆功能固然有用,但也容易造成'信息交叉'。如果你的工作助手学习了一套偏好设置,而你的私人助手学习了另一套,最终你会发现语气、提醒或细节方面出现奇怪的混淆。使用独立的智能助手可以避免这种情况。
如果你还没有深入了解内存,请阅读 OpenClaw 内存详解。
有些人希望使用速度快的模型进行日常聊天,而使用速度慢但功能强大的模型进行深度工作。多智能体架构可以轻松实现这一点,因为每个智能体都可以拥有自己的默认模型。子智能体也可以默认使用单独的模型,这可以轻松降低成本。
如果您在 OpenClaw 中需要帮助选择 Claude 和 OpenAI 模型,我们这里有一个指南。
OpenClaw 将每个代理的状态单独存储。即使你现在只运行一个代理,了解这种结构仍然很有帮助,因为它能简化调试过程。
<workspace>/skills/大多数时候,你只会与工作区进行交互。你可以在这里调整 SOUL.md 和 AGENTS.md 文件,以及存放一些辅助文件。
在单代理模式下,OpenClaw 默认使用一个主代理和一个默认工作区。这足以满足大多数配置需求。您可以将多个通道连接到同一个代理,其行为将保持一致。
在组建代理'团队'之前,我建议您先确保有一个代理在所有渠道上都能稳定工作。如果您在 WhatsApp 上运行 OpenClaw,请阅读 OpenClaw WhatsApp 生产环境配置指南。如果您使用多个渠道,OpenClaw 多渠道配置指南将对您大有帮助。
代理向导是最简便的方法,因为它会自动搭建工作区并创建一个干净的代理目录。它还能降低'两个代理意外共享一个目录'的风险,这种风险可能会导致身份验证和会话历史记录中断。
openclaw agents add work openclaw agents add coding openclaw agents add alerts
然后列出它们:
openclaw agents list --bindings
这个 --bindings 标志很有用,因为路由错误通常是绑定错误。
如果您更喜欢直接编写配置,以下是一个最小示例。尽量保持简洁明了,这在以后会很有帮助。
agents: { list: [ { id: "main", default: true, name: "Personal Assistant", workspace: "~/.openclaw/workspace", }, { id: "coding", name: "Coding Agent", workspace: "~/.openclaw/workspace-coding", model: { primary: "anthropic/claude-sonnet-4-5" }, }, { id: "alerts", name: "Alerts", workspace: "~/.openclaw/workspace-alerts", model: { primary: "openai/gpt-5.2-mini" }, }, ], }
编辑配置后,重启网关,然后 openclaw agents list --bindings 再次运行。
绑定是确定性的路由规则,它告诉 OpenClaw 哪个代理应该处理传入的消息。绑定匹配规则非常严格,通常遵循'最具体优先'的原则,这正是我们所需要的。
您需要关注的常用绑定字段:
避免意外情况的一般原则是:将最具体的绑定放在首位。例如,如果您定义了'所有 WhatsApp 消息都发送到主页面',并且还定义了'某个特定群组消息发送到工作群组',那么请将群组绑定放在渠道级绑定之上。
如果你既有个人号码又有公司号码,这是一种简洁的模式。
openclaw channels login --channel whatsapp --account personal
openclaw channels login --channel whatsapp --account biz
agents: { list: [ { id: "home", default: true, name: "Home", workspace: "~/.openclaw/workspace-home" }, { id: "work", name: "Work", workspace: "~/.openclaw/workspace-work" }, ], }, bindings: [ { agentId: "home", match: { channel: "whatsapp", accountId: "personal" } }, { agentId: "work", match: { channel: "whatsapp", accountId: "biz" } }, ]
如果您希望个人帐户上的某个特定组路由到工作地址,请在通道范围的绑定之上添加对等绑定。
这是一种非常常见的家庭设置。你将每个 DM 对等 ID 绑定到一个单独的代理,这样每个人都能获得独立的内存。
agents: { list: [ { id: "alex", workspace: "~/.openclaw/workspace-alex" }, { id: "mia", workspace: "~/.openclaw/workspace-mia" }, ], }, bindings: [ { agentId: "alex", match: { channel: "whatsapp", peer: { kind: "direct", id: "+15551230001" } } }, { agentId: "mia", match: { channel: "whatsapp", peer: { kind: "direct", id: "+15551230002" } } }, ], channels: { whatsapp: { dmPolicy: "allowlist", allowFrom: ["+15551230001", "+15551230002"], }, }
允许列表很重要。如果没有它,你基本上就是在用私人号码运行公共机器人。这很快就会变得很奇怪。
Telegram 非常适合将'聊天'和'提醒'分开,因为机器人令牌的管理成本低廉,而且路由也很简单。
channels: { telegram: { accounts: { default: { botToken: "123456:ABC...", dmPolicy: "pairing" }, alerts: { botToken: "987654:XYZ...", dmPolicy: "allowlist", allowFrom: ["tg:123456789"] }, }, }, }, bindings: [ { agentId: "main", match: { channel: "telegram", accountId: "default" } }, { agentId: "alerts", match: { channel: "telegram", accountId: "alerts" } }, ]
如果您需要帮助设置 Telegram 本身,以下两个工具可以一起使用:将 OpenClaw 连接到 Telegram BotFather 和 OpenClaw 的 BotFather 命令。
Discord 多代理通常意味着多个机器人令牌。这比尝试将所有请求都路由到一个机器人中更简洁,因为它可以在频道帐户级别实现隔离。
如果你想了解 Discord 频道的基础知识,本指南是一个很好的起点:将 OpenClaw 连接到 Discord。
从概念上讲,配置如下所示:
agents: { list: [ { id: "main", workspace: "~/.openclaw/workspace-main" }, { id: "coding", workspace: "~/.openclaw/workspace-coding" }, ], }, bindings: [ { agentId: "main", match: { channel: "discord", accountId: "default" } }, { agentId: "coding", match: { channel: "discord", accountId: "coding" } }, ], channels: { discord: { accounts: { default: { token: "DISCORD_BOT_TOKEN_MAIN" }, coding: { token: "DISCORD_BOT_TOKEN_CODING" }, }, }, }
然后,您可以为每个机器人账号设置允许访问的公会和频道范围。这样,您的编程机器人就只能看到编程房间。这是一种简单有效的安全措施。
Slack 非常适合绑定一个仅用于工作的代理,因为您可以保持其专业性,限制其记忆内容仅与工作相关,并锁定其使用的工具。如果您之前没有连接过 Slack,请使用 OpenClaw Slack 集成。
对许多用户来说,多智能体之所以物有所值,关键在于可以为每个智能体设置不同的工具权限。它允许你分别指定'此智能体可以读取和总结数据'以及'此智能体可以运行命令',而不会将它们混淆。
每个代理的配置通常如下所示:
agents: { list: [ { id: "personal", workspace: "~/.openclaw/workspace-personal", sandbox: { mode: "off" }, }, { id: "family", name: "Family Bot", workspace: "~/.openclaw/workspace-family", sandbox: { mode: "all", scope: "agent", docker: { setupCommand: "apt-get update && apt-get install -y git curl", }, }, tools: { allow: ["read", "exec"], deny: ["write", "edit", "apply_patch", "browser", "cron"], }, }, ], }
三点实用建议:
如果启用代理间通信工具,持久代理之间就可以相互通信。默认情况下,这并非'多代理'功能,而是需要用户选择启用。这是一个明智的设计选择,否则代理可能会意外地成为数据桥梁。
启用后,主要构建模块是 sessions_send 乒乓通信和允许列表,用于限制可以作为目标的代理 ID。关于代理消息传递的社区讨论提到,默认情况下,代理之间的通信轮次有限,并且由允许列表控制。
例子:
tools: { agentToAgent: { enabled: true, allow: ["home", "work", "coding"], }, }
我的建议很简单:只有当你的工作流程明确且确实需要时才启用此功能。对于大多数设置而言,子代理就足够了。
子代理是由持久代理在后台运行的进程。它们在隔离的会话中运行,并在完成后将结果返回。此行为在 OpenClaw 会话工具页面中有详细说明 sessions_spawn。
OpenClaw 还记录了面向用户的该命令,/subagents spawn 并阐明它会启动一个后台子代理,并将最终完成更新发送回请求者。OpenClaw 子代理。
我喜欢子代理的一点是,它们能保持主会话的整洁。如果某个子代理产生了噪声,这些噪声只会保留在它自己的会话记录中。
这是'手动'版本。当您想要将工作委托给专家时,它非常有用。
/subagents spawn main "Summarize the last 7 days of changelog entries and propose release notes"
如果您的子代理命令在您的环境中支持模型覆盖,您可以为本次运行设置一个更经济的模型。会话工具文档列出了 OpenClaw 会话工具 sessions_spawn 的相关参数 model。
这就是编排器模式的工作原理。代理决定生成工作进程。在配置和工具中,这由 sessions_spawn 工具表示。文档将其描述为在隔离会话中生成一个子代理并向请求者通道发布消息。OpenClaw 会话工具。
从概念上讲,它看起来是这样的:
sessions_spawn({ task: "Analyze disk usage logs and find anomalies for the past 24 hours", label: "Disk analysis", model: "anthropic/claude-sonnet-4-5", thinking: "medium", runTimeoutSeconds: 300 })
如果要在生产环境中使用此功能,请设置超时。失控的子代理不断循环调用工具既烦人又耗费资源。
子代理并非总是继承您期望的一切。在许多情况下,它们获得的上下文集比主代理要小。实际上,这意味着:如果您依赖于个性规则或冗长的偏好设置文件,则应该将关键信息放入 AGENTS.md 文件中,或者将其包含在子代理的任务提示中。
这也是我喜欢使用一个协调代理的原因,它的任务是'分解任务并生成工作进程',并在 AGENTS.md 文件中保存一组关于工作进程所需内容的简短指令。这样一来,整个过程就变得可预测了。
有些用户希望构建类似主程序 → 写入程序 → 检查程序 → 重写程序这样的流水线。常见的问题是,默认情况下子代理并非总能生成其他子代理。最近的一个社区帖子详细描述了这一限制及其原因。
OpenClaw 支持有限嵌套,但需要进行配置。如果启用最大嵌套深度为 2,则可以创建一个深度为 1 的编排器,该编排器可以生成深度为 2 的工作节点。嵌套深度超过 2 通常会增加复杂性,而不会提高结果。
一个常见的默认设置块如下所示:
agents: { defaults: { subagents: { maxSpawnDepth: 2, maxChildrenPerAgent: 5, maxConcurrent: 8, }, }, }
初期应保持保守的并发策略。很容易造成网关 CPU、本地模型运行时或服务提供商速率限制方面的瓶颈。
如果你的主代理运行高级模型,并生成一些成本较低的工人,成本就会迅速下降。主代理负责规划和合成,而工人则并行执行一些基础性工作。
基本模式:
agents: { defaults: { subagents: { model: "anthropic/claude-sonnet-4-5", thinking: "low", }, }, list: [ { id: "main", model: { primary: "anthropic/claude-opus-4-6" }, }, ], }
如果运行本地模型,子代理可以运行在 Ollama 上,而主代理则出于某种复杂原因保留在云端模型上。我们已经在另一篇指南中介绍了本地模型的设置,因此这里不再赘述。
每个代理都拥有一个域名,您可以按渠道或帐户路由消息。这种方式最容易理解,因为您可以指出某条消息并解释其路由到该位置的原因。
agents: { list: [ { id: "main", default: true, workspace: "~/.openclaw/workspace" }, { id: "coding", workspace: "~/.openclaw/workspace-coding" }, { id: "writing", workspace: "~/.openclaw/workspace-writing" }, ], }, bindings: [ { agentId: "coding", match: { channel: "discord", accountId: "coding-bot" } }, { agentId: "writing", match: { channel: "telegram", accountId: "writer-bot" } }, { agentId: "main", match: { channel: "whatsapp" } }, ]
一个代理与你对话。它会生成子代理来并行执行任务。当人们既想要速度又想要控制成本时,最终都会采用这种模式。
在这种模式下,你还需要考虑权限边界问题。如果编排器可以生成拥有比自身更强大工具的工作节点,就可能导致意外的权限提升。云安全联盟最近发布了一份威胁模型讨论,其中包含了多代理串谋和工具边界方面的风险。OpenClaw 威胁模型分析。
你无需为此惊慌。但你需要仔细设计你的工具使用策略。
这是一个'枯燥但有效'的方案。将每个渠道分配给一位专业客服人员,并且禁止客服人员之间互相发送消息。如果您需要更换客服人员,可以通过切换渠道或机器人账号来联系他们。
对于复杂的任务,它的速度较慢,但调试起来非常容易。
Discord 讨论串非常适合长时间运行的工作,因为你可以将子代理的运行绑定到一个讨论串中,并将后续讨论都集中在该讨论串内。这样可以避免繁忙的服务器频道变成日志的海洋。
这取决于 Discord 的线程绑定设置以及频道配置。如果您经常使用 Discord,建议尽早进行正确设置。
这几乎总是绑定特异性问题。列出所有绑定的代理,然后重新排列绑定顺序,使最具体的对等规则排在宽泛的通道规则之前。
openclaw agents list --bindings
这种情况通常发生在用户手动复制代理目录时。请勿重复使用代理状态目录。请使用向导或创建独立的工作区,并让 OpenClaw 创建单独的代理目录。
子代理会将结果通知请求者。如果通知被跳过或发送失败,您将看到结果缺失。子代理文档中描述了子代理会将最终完成更新发送回请求者的聊天窗口。OpenClaw 子代理。
如果送货不稳定,请检查:
这可能是版本不匹配或工具绑定限制导致的。目前有一个未解决的问题,讨论了子代理在提示文本中看到会话工具名称,但实际上并未绑定到该工具的情况。GitHub 上有一个关于子代理和会话工具的问题。
如果遇到此问题,请先升级 OpenClaw。如果问题仍然存在,请避免设计需要会话自省的子代理,并将它们设置为一次性工作进程。
多代理架构虽然更容易实现隔离,但也增加了攻击面。你会拥有更多的机器人令牌、技能和身份验证配置文件。通常的'审查第三方技能'建议仍然适用,而且在这里尤为重要,因为你可能会不小心将某个技能安装到共享目录中,从而使所有代理都能访问该技能。
近期安全报告涵盖了公共注册表中的恶意技能,并解释了为什么审查 SKILL.md 文件和脚本是必不可少的。Tom's Hardware 对 OpenClaw 技能恶意软件的报告就是一个例子。恶意技能报告。
在生产端,我们将面向公众的代理视为不可信接口。我们会锁定工具、锁定通道,并保留所有已启用功能的审计跟踪记录。
openclaw agents list --bindings 每次路由更改后运行
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online