8.2 工作区物理隔离
想象一下这个场景:
公司里有五个部门:研发、销售、运营、财务、人事。
如果所有人都挤在一个大办公室里,会发生什么?
研发在讨论代码,销售在打电话,运营在吵架...一片混乱。
所以公司给每个部门独立的办公室。各有各的档案柜,各有各的会议记录。
多 Agent 的核心也是这样——物理隔离。每个 Agent 有自己的办公室、自己的档案柜、自己的记忆。这一节,我们用15分钟,理解多Agent的物理隔离机制。
每个Agent独立工作区
在 OpenClaw 里,一个 Agent 是一个完全独立作用域的“大脑”:
Workspace(工作区)
存放文件、AGENTS.md、SOUL.md、本地笔记、人设规则。就像员工的办公桌和文件柜。
AgentDir(状态目录)
存放认证配置文件、模型注册表、每 Agent 配置。就像员工的工牌和系统账号。
Sessions(会话存储)
独立的聊天记录,位于 ~/.openclaw/agents/<agentId>/sessions。就像员工的邮件历史。
认证配置文件是每 Agent 独立的。每个 Agent 从自己的位置读取:
~/.openclaw/agents/<agentId>/agent/auth-profiles.json⚠️ 重要:主 Agent 凭证不会自动共享。切勿在 Agent 之间重用
agentDir,这会导致认证/会话冲突。
工作区目录结构
单Agent模式
~/.openclaw/
├── openclaw.json # 全局配置
├── workspace/ # 主工作区
│ ├── AGENTS.md # 行为规则
│ ├── SOUL.md # 人格定义
│ ├── USER.md # 用户信息
│ ├── MEMORY.md # 长期记忆
│ ├── TOOLS.md # 工具使用指南
│ ├── HEARTBEAT.md # 定时任务监控
│ └── memory/ # 每日日志
└── agents/
└── main/
├── agent/ # 认证配置
└── sessions/ # 会话记录多Agent模式
~/.openclaw/
├── openclaw.json
├── workspace-main/ # 主Agent工作区
├── workspace-research/ # 研究Agent工作区
├── workspace-writer/ # 写作Agent工作区
├── skills/ # 全局共享技能
└── agents/
├── main/
├── research/
└── writer/每个 Agent 有自己的一套文件,互不干扰。
试一试:创建你的第二个Agent
用命令行快速创建:
# 添加新Agent
openclaw agents add research \
--model zai/glm-4.7 \
--workspace ~/.openclaw/workspace-research
# 设置身份
openclaw agents set-identity --agent research \
--name "研究员" \
--emoji "🔍"验证创建成功:
openclaw agents list --bindings你应该看到 agents.list 里多了一个 research 条目。
AGENT ID NAME WORKSPACE main 主助手 ~/.openclaw/workspace research 研究员 ~/.openclaw/workspace-research
子Agent能看到什么?
当你用 sessions_spawn 创建子任务时,子 Agent 的可见范围是受限的。
主会话能看到
全部文件(AGENTS.md、SOUL.md、IDENTITY.md、USER.md、TOOLS.md、MEMORY.md、HEARTBEAT.md、BOOTSTRAP.md)
子Agent/Cron只能看到
白名单 5 个文件:
| 文件 | 说明 |
|---|---|
| AGENTS.md | 行为规则 |
| TOOLS.md | 工具指南 |
| SOUL.md | 人格定义 |
| IDENTITY.md | 身份信息 |
| USER.md | 用户信息 |
被过滤掉的
| 文件 | 为什么过滤 |
|---|---|
| MEMORY.md | 防止子任务污染长期记忆 |
| HEARTBEAT.md | 定时任务配置不需要给子任务 |
| BOOTSTRAP.md | 启动配置不需要给子任务 |
这意味着:子 Agent 看不到主 Agent 的长期记忆。如果需要历史背景,要在 task 描述里显式提供。
实践建议
spawn 时在 task 里显式给路径:
前置必读: 1. read prompts/content-guidelines.md — 内容创作规范 2. read memory/2026-03-10.md — 今日背景
隔离的好处和风险
好处
| 好处 | 说明 |
|---|---|
| 记忆隔离 | 写代码的 Agent 不会干扰写文案的 Agent |
| 安全隔离 | 可以给不同 Agent 设置不同的工具权限 |
| 资源控制 | 沙箱隔离特定 Agent,其他 Agent 不受影响 |
| 独立演进 | 每个 Agent 的记忆文件独立增长,互不拖累 |
风险
| 风险 | 说明 |
|---|---|
| 信息孤岛 | Agent 之间默认不能通信,需要额外配置 |
| 重复配置 | 每个 Agent 都要单独设置认证、模型、工具权限 |
| 协调成本 | 任务需要在 Agent 之间流转时,需要设计好交接机制 |
文件协作模式
Agent 之间怎么共享信息?最简单的办法:文件。
workspace-main/
├── intel/
│ ├── DAILY-INTEL.md # 研究员写入
│ └── data/
│ └── 2026-03-10.json
└── agents/
├── writer/ # 写作Agent读取intel/
└── twitter/协作原则
| 原则 | 说明 |
|---|---|
| 一写多读 | 避免多个 Agent 同时写同一个文件 |
| 显式读取 | 在 AGENTS.md 里写明“从哪读、写到哪” |
| 数据双份 | JSON 存结构化数据,Markdown 存人类可读版本 |
每Agent独立配置
从 v2026.1.6 开始,每个 Agent 可以有自己的沙箱和工具限制:
{
agents: {
list: [
{
id: "personal",
workspace: "~/.openclaw/workspace-personal",
sandbox: {
mode: "off", // 个人Agent无沙箱
},
// 无工具限制
},
{
id: "family",
workspace: "~/.openclaw/workspace-family",
sandbox: {
mode: "all", // 始终沙箱隔离
scope: "agent", // 每Agent一个容器
},
tools: {
allow: ["read"],
deny: ["exec", "write", "edit"],
},
},
],
},
}这样,personal Agent 可以执行任意命令,而 family Agent 只能读取文件。
故障排查
Agent创建失败
| 检查项 | 操作 |
|---|---|
| workspace 路径 | 确保目录存在且有写权限 |
| 模型名称 | 确认模型 ID 正确(如 zai/glm-5) |
| 配置语法 | 运行 openclaw config validate 检查 |
子Agent找不到文件
| 检查项 | 操作 |
|---|---|
| 文件是否在白名单 | 子 Agent 只能看到 5 个白名单文件 |
| 路径是否正确 | 使用相对于 workspace 的路径 |
| task 是否显式指定 | 在 task 里用 read 命令指定文件 |
Agent之间文件不共享
| 检查项 | 操作 |
|---|---|
| workspace 是否独立 | 每个 Agent 有自己的 workspace 目录 |
| 是否需要共享 | 使用公共目录(如 ~/.openclaw/skills/) |
这一节,你做了什么
| 学了什么 | 核心理解 |
|---|---|
| 物理隔离 | Workspace、AgentDir、Sessions 各自独立 |
| 目录结构 | 多 Agent 模式下每个 Agent 有自己的工作区 |
| 子Agent限制 | 只能看到 5 个白名单文件,看不到 MEMORY.md |
| 协作模式 | 通过文件系统实现“一写多读” |
| 独立配置 | 每 Agent 可设置不同的沙箱和工具权限 |
下一节
物理隔离让每个 Agent 有了自己的“办公室”。但它们之间怎么通信呢?
8.3 Agent间通信。