多智能体沙箱隔离与工具配置
在多智能体设置中,每个智能体都可以覆盖全局沙箱隔离和工具 策略。本页介绍按智能体的配置、优先级规则以及 示例。- 沙箱后端和模式:参见 沙箱隔离。
- 调试被阻止的工具:参见 沙箱 vs 工具策略 vs Elevated 和
openclaw sandbox explain。 - Elevated exec:参见 Elevated Mode。
agentDir 认证存储读取,
路径为 ~/.openclaw/agents/<agentId>/agent/auth-profiles.json。
凭据不会在智能体之间共享。绝不要在多个智能体之间复用 agentDir。
如果你想共享凭据,请将 auth-profiles.json 复制到另一个智能体的 agentDir 中。
配置示例
示例 1:个人智能体 + 受限家庭智能体
main智能体:在主机上运行,具有完整工具访问权限family智能体:在 Docker 中运行(每个智能体一个容器),仅有read工具
示例 2:使用共享沙箱的工作智能体
示例 2b:全局 coding 配置 + 仅限消息的智能体
- 默认智能体会获得 coding 工具
support智能体仅限消息功能(+ Slack 工具)
示例 3:每个智能体使用不同的沙箱模式
配置优先级
当同时存在全局(agents.defaults.*)和按智能体(agents.list[].*)配置时:
沙箱配置
按智能体设置会覆盖全局设置:- 对于该智能体,
agents.list[].sandbox.{docker,browser,prune}.*会覆盖agents.defaults.sandbox.{docker,browser,prune}.*(当沙箱范围解析为"shared"时会被忽略)。
工具限制
过滤顺序为:- 工具 profile(
tools.profile或agents.list[].tools.profile) - 提供商工具 profile(
tools.byProvider[provider].profile或agents.list[].tools.byProvider[provider].profile) - 全局工具策略(
tools.allow/tools.deny) - 提供商工具策略(
tools.byProvider[provider].allow/deny) - 按智能体的工具策略(
agents.list[].tools.allow/deny) - 智能体提供商策略(
agents.list[].tools.byProvider[provider].allow/deny) - 沙箱工具策略(
tools.sandbox.tools或agents.list[].tools.sandbox.tools) - Subagent 工具策略(
tools.subagents.tools,如果适用)
agents.list[].tools.sandbox.tools,它会替换该智能体的 tools.sandbox.tools。
如果设置了 agents.list[].tools.profile,它会覆盖该智能体的 tools.profile。
提供商工具键可以接受 provider(例如 google-antigravity)或 provider/model(例如 openai/gpt-5.4)。
工具策略支持 group:* 简写,可展开为多个工具。完整列表参见 工具组。
按智能体的 Elevated 覆盖(agents.list[].tools.elevated)还可以进一步限制特定智能体的 elevated exec。详情参见 Elevated Mode。
从单智能体迁移
之前(单智能体):agent.* 配置会由 openclaw doctor 迁移;今后请优先使用 agents.defaults + agents.list。
工具限制示例
只读智能体
安全执行智能体(不允许文件修改)
仅通信智能体
sessions_history 仍然返回有界、已净化的 recall
视图,而不是原始 transcript 倾倒。助手 recall 会剥离 thinking 标签、
<relevant-memories> 脚手架、纯文本工具调用 XML 载荷
(包括 <tool_call>...</tool_call>、
<function_call>...</function_call>、<tool_calls>...</tool_calls>、
<function_calls>...</function_calls> 以及被截断的工具调用块)、
降级后的工具调用脚手架、泄露的 ASCII/全角模型控制
token,以及格式错误的 MiniMax 工具调用 XML,然后才进行脱敏/截断。
常见陷阱:“non-main”
agents.defaults.sandbox.mode: "non-main" 基于 session.mainKey(默认值为 "main"),
而不是智能体 id。群组/渠道会话始终拥有自己的 key,因此它们
会被视为 non-main,并进入沙箱。如果你希望某个智能体永不进入
沙箱,请设置 agents.list[].sandbox.mode: "off"。
测试
配置好多智能体沙箱隔离和工具后:-
检查智能体解析:
-
验证沙箱容器:
-
测试工具限制:
- 发送一条需要受限工具的消息
- 验证该智能体无法使用被拒绝的工具
-
监控日志:
故障排除
尽管设置了 mode: "all",智能体仍未进入沙箱
- 检查是否存在覆盖它的全局
agents.defaults.sandbox.mode - 按智能体配置优先级更高,因此请设置
agents.list[].sandbox.mode: "all"
尽管在拒绝列表中,工具仍然可用
- 检查工具过滤顺序:全局 → 智能体 → 沙箱 → subagent
- 每一层只能进一步限制,不能重新授予
- 通过日志验证:
[tools] filtering tools for agent:${agentId}
容器没有按智能体隔离
- 在按智能体的沙箱配置中设置
scope: "agent" - 默认值是
"session",这会为每个会话创建一个容器
另见
- 沙箱隔离 — 完整的沙箱参考(模式、范围、后端、镜像)
- 沙箱 vs 工具策略 vs Elevated — 调试“为什么这个被阻止了?”
- Elevated Mode
- 多智能体路由
- 沙箱配置
- 会话管理