数据截至 (上游 commit 8d6cbee1b527)
工具、技能与沙箱:让 agent 动手且不越界
30 秒导读: 前面几章讲的是"消息怎么进来、模型怎么转"。这一章讲 agent 的手脚——它能调哪些工具,以及围在手脚外面的栏杆——谁批准、能碰哪些文件、跑在宿主机还是容器里。核心结论一句话:OpenClaw 的工具表是每次运行现搭出来的,装配、过滤、规范化、包壳四步之后才交给模型。
本章位置:01 网关 讲进程形态,02 插件化内核 讲工具怎么被插件注册,03 入站与会话 讲会话从哪来,04 回复流水线 讲结果怎么投递,05 智能体运行时 讲工具结果怎么回流进上下文。本章只讲工具本身和它的围栏。
1. 这一章讲什么(零基础也能懂)
一句话定义: 工具(tool)是模型能调用的函数。模型说"我要调 exec,参数是 ls -la",运行时真的去执行,再把结果喂回去。
OpenClaw 的特别之处在于工具的"射程"。 普通编码 agent 的工具止步于本地文件和 shell;OpenClaw 的 agent 还能往聊天频道发消息、读自己的配置、调你手机的摄像头、给自己排定时任务。
射程一大,"能不能干"就必须和"会不会干"分开管。所以本章有两条主线:
| 主线 | 是什么 | 代表模块 |
|---|---|---|
| 手脚 | 工具族、schema 适配、技能、MCP | src/agents/tools/、src/skills/ |
| 栏杆 | 按会话生效的 allow/deny、执行前审批钩子、沙箱 | src/agents/tool-policy*.ts、src/agents/sandbox/ |
用起来什么样。 运维侧的手感基本就是一份配置——选一个工具档位、划一条沙箱线:
// 示意,非源码;对应 src/agents/tool-catalog.ts 与 src/agents/sandbox/config.ts
{
"tools": { "profile": "coding" }, // 只放行编码族工具
"agents": {
"defaults": {
"sandbox": {
"mode": "non-main", // main 会话留在宿主机,其余进容器
"workspaceAccess": "ro", // 容器里只读挂载工作区
"tools": { "deny": ["gateway", "nodes"] } // 沙箱内额外禁用两个高权工具
}
}
}
}
一句话心智模型: 别把工具表想成"启动时注册好的全局清单"。它更像每次开会前现发的工牌——这次会议(这个会话、这个模型、这个发送者、这次触发)决定了你手上有哪几张卡。