agentDir)和基于 SQLite 的会话历史,以及多个通道账户(例如两个 WhatsApp 号码)。传入消息通过绑定路由到正确的代理。
代理是完整的按人格划分的作用域:工作区文件、认证配置文件、模型注册表和会话存储。绑定将一个通道账户(如一个 Slack 工作区、一个 WhatsApp 号码等)映射到这些代理中的某一个。
有关账户和对话示例的专门设置指南,请参阅代理绑定。
什么是一个 agent
每个 agent 都有自己的:- 工作区:文件、
AGENTS.md/SOUL.md/USER.md、本地笔记、角色规则。 - 状态目录 (
agentDir):认证配置文件、模型注册表、每个 agent 的配置。 - 会话存储:聊天历史和路由状态,位于
~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite。
sessions_history 是更安全的跨会话回忆路径:它返回的是一个有边界、已去敏的视图,而不是原始转录的完整转储。它会去除 thinking-block 签名、工具结果载荷细节、<relevant-memories> 脚手架、工具调用 XML 标签(<tool_call>、<function_call> 及其复数/降级形式),以及 MiniMax 工具调用 XML,然后按字节大小对输出进行截断和上限控制。~/.openclaw/skills 之类的共享根目录加载,然后再根据实际生效的 agent 技能允许列表进行过滤。共享基线请使用 agents.defaults.skills,而按 agent 的替换请使用 agents.entries.*.skills(显式条目会替换默认值,不会进行合并)。另请参见 技能:按 agent 划分与共享 和 技能:agent 允许列表。
插件拥有的存储遵循该插件自身的配置;添加第二个 agent 不会自动把所有全局插件存储拆分开。例如,当不同角色不能共享已编译的 wiki 知识时,请配置 按 agent 划分的 Memory Wiki 保管库。
工作区说明: 每个 agent 的工作区都是默认 cwd,而不是硬性沙箱。相对路径会在工作区内解析,但只要未启用沙箱,绝对路径仍可访问其他主机位置。参见 沙箱。
路径
单 agent 模式(默认)
如果你不进行任何配置,OpenClaw 会运行一个 agent:agentId默认值为main。- 会话键为
agent:main:<mainKey>(mainKey的默认值为main)。 - 工作区默认是
~/.openclaw/workspace(如果OPENCLAW_PROFILE设置为default之外的其他值,则为workspace-<profile>)。 - 状态默认是
~/.openclaw/agents/main/agent。
代理助手
添加一个新的隔离代理:--workspace <dir>、--model <id>、--agent-dir <dir>、--bind <channel[:accountId]>(可重复)、--non-interactive(需要 --workspace)。
添加 bindings 以路由传入消息(向导会为你提供此操作),然后验证:
快速开始
1
创建每个智能体工作区
SOUL.md、AGENTS.md 和可选的 USER.md,以及位于 ~/.openclaw/agents/<agentId> 下的专用 agentDir 和会话存储。2
3
添加智能体、账户和绑定
在
agents.entries 下添加智能体,在 channels.<channel>.accounts 下添加通道账户,并使用 bindings 将它们连接起来(示例见下文)。4
重启并验证
多个代理,多个角色
每个配置的agentId 都是核心代理状态的独立角色边界:
- 每个频道使用不同的账户(通过
accountId区分)。 - 不同的个性(通过代理的
AGENTS.md/SOUL.md区分)。 - 独立的身份验证和会话,只有在通过明确的功能或插件配置启用后,才允许跨代理访问。
每个代理的 Memory Wiki 保管库
Memory Wiki 默认使用一个全局保管库。为了将支持代理的 编译知识与营销代理的知识分开,请将plugins.entries.memory-wiki.config.vault.scope 设置为 agent:
~/.openclaw/wiki/support 和
~/.openclaw/wiki/marketing 这样的路径。当配置了多个代理时,
作用域为代理的 CLI 和 Gateway 操作需要显式指定代理。有关桥接
过滤、迁移以及信任边界的详细信息,请参见
每个代理的 Memory Wiki 保管库。
跨代理记忆搜索
QMD 跨代理搜索路径已被移除。内置记忆不会搜索其他代理的记录语料库;每个代理仅搜索其自身配置的记忆和符合条件的同一代理会话来源。如果同一参考材料应由多个代理建立索引,请将有意共享的 Markdown 放入显式共享的memory.search.extraPaths 目录中。有关完整的升级路径,请参阅从 QMD 迁移。
一个 WhatsApp 号码,多个人(DM 拆分)
通过将发送者的 E.164(+15551234567)与 peer.kind: "direct" 匹配,把不同的 WhatsApp 私信路由给同一个 WhatsApp 账户上的不同代理。回复仍然来自同一个 WhatsApp 号码——不存在按代理区分的发送者身份。
直接聊天默认会折叠到代理的主会话键,因此要实现真正隔离,每个人都需要一个代理。
路由规则
绑定是确定性的,且最具体的规则优先。完整的层级顺序请参见 通道路由(精确 peer、父级 peer、peer 通配符、guild+roles、guild、team、account、channel、默认代理)。这里有几条值得特别指出的规则:- 如果同一层级中有多个绑定匹配,则配置顺序中的第一个生效。
- 如果某个绑定设置了多个匹配字段(例如
peer+guildId),则所有指定字段都必须匹配(AND语义)。 - 省略
accountId的绑定只匹配默认账户,而不是所有账户。使用accountId: "*"表示整个通道的回退规则,或使用accountId: "<name>"表示某一个账户。再次添加相同绑定并显式指定账户 ID,会将现有的仅通道绑定升级,而不是创建重复项。
openclaw doctor --fix 会将旧的环境默认路由具体化为通道级绑定,并显式设置心跳、Custodian 和 Talk 目标。单代理配置不受影响。
多个账户 / 电话号码
支持多个账户的渠道(例如 WhatsApp)使用accountId 来标识每个登录。每个 accountId 都会路由到其对应的 agent,因此一台服务器可以托管多个电话号码,而不会混淆会话。
设置 channels.<channel>.defaultAccount 可在省略 accountId 时选择要使用的账户。如果未设置,OpenClaw 会先回退到 default(如果存在),否则会使用第一个已配置的账户 id(按排序顺序)。
支持多个账户的渠道:discord、feishu、googlechat、imessage、irc、line、mattermost、matrix、nextcloud-talk、nostr、signal、slack、telegram、whatsapp、zalo、zalouser。
概念
agentId:一个“脑袋”(工作区、每个 agent 的认证、每个 agent 的会话存储)。accountId:一个频道账号实例(例如 WhatsApp 账号personalvsbiz)。binding:通过(channel, accountId, peer)将传入消息路由到某个agentId,并可选地包含公会/团队 ID。- 直接聊天会折叠为
agent:<agentId>:<mainKey>(每个 agent 的“主会话”;见session.mainKey)。
平台示例
每个 agent 一个 Discord bot
每个 agent 一个 Discord bot
每个 Discord bot 账号映射到唯一的
accountId。将每个账号绑定到一个 agent,并为每个 bot 保持 allowlist。- 将每个 bot 邀请到 guild,并启用消息内容 Intent。
- 令牌存放在
channels.discord.accounts.<id>.token中(默认账号可以使用DISCORD_BOT_TOKEN)。
每个 agent 一个 Telegram bot
每个 agent 一个 Telegram bot
- 使用 BotFather 为每个 agent 创建一个 bot,并复制每个 token。
- Token 存放在
channels.telegram.accounts.<id>.botToken中(默认账号可以使用TELEGRAM_BOT_TOKEN)。 - 对于同一个 Telegram 群组中的多个 bot,邀请每个 bot,并提及应该响应的那个。
- 为每个群组 bot 关闭 BotFather Privacy Mode(
/setprivacy-> Disable),然后移除并重新添加该 bot,以便 Telegram 应用该设置。 - 使用
channels.telegram.groups允许群组,或者仅在受信任的群组部署中使用groupPolicy: "open"。 - 将发送者用户 ID 放入
groupAllowFrom。群组和超级群组 ID 应放在channels.telegram.groups中,而不是groupAllowFrom。 - 按
accountId进行绑定,以便每个 bot 路由到自己的 agent。
每个 agent 一个 WhatsApp 号码
每个 agent 一个 WhatsApp 号码
在启动网关之前先链接每个账号:
~/.openclaw/openclaw.json(JSON5):常见模式
- WhatsApp 日常 + Telegram 深度工作
- 同一频道,将一个 peer 路由到 Opus
- 绑定到 WhatsApp 群组的家庭 agent
按频道拆分:将 WhatsApp 路由到一个快速的日常 agent,将 Telegram 路由到一个 Opus agent。这些示例使用
accountId: "*", 因此即使你以后添加账号,绑定规则仍然有效。若要在保持其余消息走 chat 的同时,把某个单独的 DM/群组路由到 Opus,可以为该 peer 添加一个 match.peer 绑定——peer 匹配始终优先于按频道的规则。每个 agent 的沙箱和工具配置
每个 agent 都可以拥有自己的沙箱和工具限制:setupCommand 位于 sandbox.docker 下,并在容器创建时运行一次。若解析后的 scope 为 "shared",则会忽略每个 agent 的 sandbox.docker.* 覆盖项。- 安全隔离:限制不受信任 agent 的工具。
- 资源控制:对特定 agent 使用沙箱,同时让其他 agent 继续在主机上运行。
- 灵活策略:为不同 agent 提供不同权限。
tools.elevated 同时具有全局门控(tools.elevated.enabled/allowFrom)和每个 agent 的门控(agents.entries.*.tools.elevated.enabled/allowFrom)。每个 agent 的门控只能进一步收紧全局设置——两者都必须允许某个发送者,提权命令才能运行。对于组目标,请使用 agents.entries.*.groupChat.mentionPatterns,这样 @提及 就能正确映射到目标 agent。