OpenClaw从入门到应用——Agent:多Agent(Multi-Agent)

张开发
2026/4/19 18:15:27 15 分钟阅读

分享文章

OpenClaw从入门到应用——Agent:多Agent(Multi-Agent)
通过OpenClaw实现副业收入《OpenClaw赚钱实录从“养龙虾“到可持续变现的实践指南》什么是“单代理”一个代理是一个拥有完整作用域的“大脑”具有以下独立部分工作区文件、AGENTS.md/SOUL.md/USER.md、本地笔记、人格规则。状态目录agentDir用于存放认证配置文件、模型注册表和每个代理的配置。会话存储聊天历史 路由状态位于~/.openclaw/agents/agentId/sessions下。认证配置文件是每个代理独立的。每个代理从自己的以下路径读取配置~/.openclaw/agents/agentId/agent/auth-profiles.json主代理的凭据不会自动共享。切勿在多个代理之间复用agentDir这会导致认证/会话冲突。如果你想共享凭据请将auth-profiles.json复制到其他代理的agentDir中。每个代理的技能Skills通过各自工作区的skills/文件夹进行管理同时也可以使用~/.openclaw/skills中的共享技能。请参阅 技能每个代理 vs 共享链接已修改。Gateway 可以托管单个代理默认或多个代理并行运行。工作区说明每个代理的工作区是默认的当前工作目录cwd而不是一个强制的沙箱。相对路径会在工作区内解析但除非启用了沙箱功能绝对路径可以访问主机的其他位置。请参阅 沙箱链接已修改。路径快速映射配置~/.openclaw/openclaw.json或OPENCLAW_CONFIG_PATH状态目录~/.openclaw或OPENCLAW_STATE_DIR工作区~/.openclaw/workspace或~/.openclaw/workspace-profile代理目录~/.openclaw/agents/agentId/agent或agents.list[].agentDir会话~/.openclaw/agents/agentId/sessions单代理模式默认如果你不进行任何配置OpenClaw 将运行单个代理agentId默认为main。会话的键为agent:main:。工作区默认为~/.openclaw/workspace当设置了OPENCLAW_PROFILE环境变量时默认为~/.openclaw/workspace-profile。状态默认为~/.openclaw/agents/main/agent。代理助手使用代理向导添加一个新的隔离代理openclaw agentsaddwork然后添加bindings或者让向导自动完成来路由接收到的消息。使用以下命令验证openclaw agents list--bindings快速开始使用向导或手动创建工作区 bash theme{theme:{light:min-light,dark:min-dark}} openclaw agents add coding openclaw agents add social 每个代理都会获得自己的工作区其中包含 SOUL.md、AGENTS.md 和可选的 USER.md 文件以及位于 ~/.openclaw/agents/ 下的专用 agentDir 和会话存储。 在你偏好的通讯平台上为每个代理创建一个账号 * Discord每个代理一个机器人启用“消息内容意图”复制每个令牌。 * Telegram通过 BotFather 为每个代理创建一个机器人复制每个令牌。 * WhatsApp为每个账号关联一个手机号码。 bash theme{theme:{light:min-light,dark:min-dark}} openclaw channels login --channel whatsapp --account work 请参阅各平台指南[Discord](/channels/discord)链接已修改、[Telegram](/channels/telegram)链接已修改、[WhatsApp](/channels/whatsapp)链接已修改。 在 agents.list 下添加代理在 channels.channel.accounts 下添加渠道账户并使用 bindings 将它们连接起来示例见下文。 bash theme{theme:{light:min-light,dark:min-dark}} openclaw gateway restart openclaw agents list --bindings openclaw channels status --probe 多代理 多人格、多角色使用多个代理时每个agentId都会成为一个完全隔离的角色不同的手机号码/账户每个渠道的accountId。不同的个性每个代理工作区中的文件如AGENTS.md和SOUL.md。独立的认证与会话除非明确启用否则不会相互干扰。这使得多个人可以共享一个 Gateway 服务器同时保持他们各自的 AI “大脑”和数据相互隔离。一个 WhatsApp 号码多人使用私聊分流你可以在一个 WhatsApp 账户上将不同的 WhatsApp 私聊路由到不同的代理。通过发送者的 E.164 格式号码例如15551234567与peer.kind: direct进行匹配。回复仍然来自同一个 WhatsApp 号码没有每个代理独立的发送者身份。重要细节私聊会合并到代理的主会话键main session key下因此真正的隔离需要每个代理服务于一个人。示例{ 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], }, }, }说明私聊的访问控制是每个 WhatsApp 账户全局的配对/白名单而不是每个代理单独控制。对于共享群组请将群组绑定到一个代理或者使用广播群组链接已修改。路由规则消息如何选择代理绑定Bindings的匹配是确定性的并且遵循最具体匹配优先的原则peer匹配精确的私聊/群组/频道 IDparentPeer匹配会话继承guildId rolesDiscord 角色路由guildIdDiscordteamIdSlack针对某个渠道的accountId匹配渠道级别的匹配accountId: *回退到默认代理agents.list[].default否则回退到列表中的第一个条目默认为main如果多个绑定在同一匹配层级中匹配则配置顺序中靠前的优先。如果一个绑定设置了多个匹配字段例如peerguildId则所有指定的字段都必须满足AND语义。重要的账户作用域细节省略了accountId的绑定仅匹配默认账户。使用accountId: *可以在所有账户上实现某个渠道的全局回退。如果你后来为同一个代理添加了带有明确账户 ID 的相同绑定OpenClaw 会将现有的仅渠道绑定升级为账户作用域绑定而不是重复添加。多账户 / 多手机号码支持多账户的渠道例如 WhatsApp使用accountId来标识每个登录。每个accountId可以路由到不同的代理因此一台服务器可以托管多个手机号码而不会混淆会话。如果你想在省略accountId时使用某个渠道的默认账户可以设置channels.channel.defaultAccount可选。如果未设置OpenClaw 会回退到名为default的账户如果存在否则回退到配置的第一个账户 ID按排序。支持此模式的常见渠道包括whatsapptelegramdiscordslacksignalimessageirclinegooglechatmattermostmatrixnextcloud-talkbluebubbleszalozalousernostrfeishu概念agentId一个“大脑”工作区、每个代理的认证、每个代理的会话存储。accountId一个渠道账户实例例如 WhatsApp 账户personal与biz。binding通过(channel, accountId, peer)以及可选的服务器/团队 ID将接收到的消息路由到一个agentId。私聊会合并到agent::agentId每个代理的“主”会话session.mainKey。平台示例每个代理使用独立的 Discord 机器人每个 Discord 机器人账户映射到一个唯一的accountId。将每个账户绑定到一个代理并为每个机器人维护独立的白名单。{ 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: { groupPolicy: allowlist, accounts: { default: { token: DISCORD_BOT_TOKEN_MAIN, guilds: { 123456789012345678: { channels: { 222222222222222222: { allow: true, requireMention: false }, }, }, }, }, coding: { token: DISCORD_BOT_TOKEN_CODING, guilds: { 123456789012345678: { channels: { 333333333333333333: { allow: true, requireMention: false }, }, }, }, }, }, }, }, }说明将每个机器人邀请到服务器并启用“消息内容意图”。令牌存放在channels.discord.accounts.accountId.token中默认账户可以使用DISCORD_BOT_TOKEN环境变量。每个代理使用独立的 Telegram 机器人{ agents: { list: [ { id: main, workspace: ~/.openclaw/workspace-main }, { id: alerts, workspace: ~/.openclaw/workspace-alerts }, ], }, bindings: [ { agentId: main, match: { channel: telegram, accountId: default } }, { agentId: alerts, match: { channel: telegram, accountId: alerts } }, ], channels: { telegram: { accounts: { default: { botToken: 123456:ABC..., dmPolicy: pairing, }, alerts: { botToken: 987654:XYZ..., dmPolicy: allowlist, allowFrom: [tg:123456789], }, }, }, }, }说明通过 BotFather 为每个代理创建一个机器人并复制每个令牌。令牌存放在channels.telegram.accounts.accountId.botToken中默认账户可以使用TELEGRAM_BOT_TOKEN环境变量。每个代理使用独立的 WhatsApp 号码在启动 Gateway 之前分别关联每个账户openclaw channels login--channelwhatsapp--accountpersonal openclaw channels login--channelwhatsapp--accountbiz~/.openclaw/openclaw.json(JSON5 格式){agents:{list:[{id:home,default:true,name:Home,workspace:~/.openclaw/workspace-home,agentDir:~/.openclaw/agents/home/agent,},{id:work,name:Work,workspace:~/.openclaw/workspace-work,agentDir:~/.openclaw/agents/work/agent,},],},// 确定性路由第一个匹配项优先最具体的放在前面。bindings:[{agentId:home,match:{channel:whatsapp,accountId:personal}},{agentId:work,match:{channel:whatsapp,accountId:biz}},// 可选的按对端覆盖示例将特定群组发送给 work 代理。{agentId:work,match:{channel:whatsapp,accountId:personal,peer:{kind:group,id:1203630...g.us},},},],// 默认关闭代理间消息传递必须显式启用并加入白名单。tools:{agentToAgent:{enabled:false,allow:[home,work],},},channels:{whatsapp:{accounts:{personal:{// 可选覆盖。默认为~/.openclaw/credentials/whatsapp/personal// authDir: ~/.openclaw/credentials/whatsapp/personal,},biz:{// 可选覆盖。默认为~/.openclaw/credentials/whatsapp/biz// authDir: ~/.openclaw/credentials/whatsapp/biz,},},},},}示例WhatsApp 日常聊天 Telegram 深度工作按渠道分流将 WhatsApp 路由到一个快速的日常代理将 Telegram 路由到一个 Opus 代理。{ agents: { list: [ { id: chat, name: Everyday, workspace: ~/.openclaw/workspace-chat, model: anthropic/claude-sonnet-4-5, }, { id: opus, name: Deep Work, workspace: ~/.openclaw/workspace-opus, model: anthropic/claude-opus-4-6, }, ], }, bindings: [ { agentId: chat, match: { channel: whatsapp } }, { agentId: opus, match: { channel: telegram } }, ], }说明如果你为一个渠道配置了多个账户请在绑定中添加accountId例如{ channel: whatsapp, accountId: personal }。若要将单个私聊/群组路由到 Opus而其余消息仍保留在 chat 代理请为该对端添加一个带有match.peer的绑定对端匹配总是优先于渠道级别的规则。示例同一渠道将单个对端路由到 Opus保持 WhatsApp 在快速代理上但将某一个私聊路由到 Opus{ agents: { list: [ { id: chat, name: Everyday, workspace: ~/.openclaw/workspace-chat, model: anthropic/claude-sonnet-4-5, }, { id: opus, name: Deep Work, workspace: ~/.openclaw/workspace-opus, model: anthropic/claude-opus-4-6, }, ], }, bindings: [ { agentId: opus, match: { channel: whatsapp, peer: { kind: direct, id: 15551234567 } }, }, { agentId: chat, match: { channel: whatsapp } }, ], }对端绑定始终优先因此请将它们放在渠道级别规则的上方。将家庭代理绑定到一个 WhatsApp 群组将一个专用的家庭代理绑定到一个 WhatsApp 群组并启用 提及 门控和更严格的工具策略{ agents: { list: [ { id: family, name: Family, workspace: ~/.openclaw/workspace-family, identity: { name: Family Bot }, groupChat: { mentionPatterns: [family, familybot, Family Bot], }, sandbox: { mode: all, scope: agent, }, tools: { allow: [ exec, read, sessions_list, sessions_history, sessions_send, sessions_spawn, session_status, ], deny: [write, edit, apply_patch, browser, canvas, nodes, cron], }, }, ], }, bindings: [ { agentId: family, match: { channel: whatsapp, peer: { kind: group, id: 120363999999999999g.us }, }, }, ], }说明工具的允许/拒绝列表是工具tools而不是技能skills。如果一个技能需要运行一个二进制文件请确保exec被允许并且该二进制文件存在于沙箱中。要实现更严格的门控请设置agents.list[].groupChat.mentionPatterns并为该渠道保持群组白名单启用状态。每个代理的沙箱和工具配置从 v2026.1.6 版本开始每个代理可以拥有自己的沙箱和工具限制{agents:{list:[{id:personal,workspace:~/.openclaw/workspace-personal,sandbox:{mode:off,// 个人代理不使用沙箱},// 没有工具限制 - 所有工具都可用},{id:family,workspace:~/.openclaw/workspace-family,sandbox:{mode:all,// 始终使用沙箱scope:agent,// 每个代理一个容器docker:{// 容器创建后可选的一次性设置命令setupCommand:apt-get update apt-get install -y git curl,},},tools:{allow:[read],// 只允许 read 工具deny:[exec,write,edit,apply_patch],// 拒绝其他工具},},],},}注意setupCommand位于sandbox.docker下并且在容器创建时运行一次。当解析出的作用域为shared时每个代理的sandbox.docker.*覆盖配置将被忽略。优点安全隔离为不受信任的代理限制工具。资源控制对特定代理使用沙箱同时让其他代理在主机上运行。灵活的策略每个代理可以有不同的权限。注意tools.elevated是全局的且基于发送者它不能按代理配置。如果你需要按代理的边界控制请使用agents.list[].tools来拒绝exec。对于群组定位请使用agents.list[].groupChat.mentionPatterns以便 提及 能够清晰地映射到目标代理。详细示例请参阅多代理沙箱与工具链接已修改。

更多文章