14.1 工具系统架构

生成模型:Claude Opus 4.6 (anthropic/claude-opus-4-6) Token 消耗:输入 ~900k tokens,输出 ~85k tokens(本章合计)


前几章我们深入分析了 OpenClaw 的通道层——消息如何进入系统、如何路由到 Agent、以及如何将回复分发回用户。但 Agent 的真正能力不仅来自对话,更来自工具调用(Tool Calling)。本章将全面解析 OpenClaw 的工具系统,从架构设计到运行时执行,再到权限控制。


14.1.1 TypeBox Schema → JSON Schema 映射

工具的核心数据结构

在 OpenClaw 中,每个工具都是一个 AgentTool 对象,定义来自底层的 pi-agent-core 库:

// @mariozechner/pi-agent-core — AgentTool 类型(简化)
type AgentTool<TParams = unknown, TResult = unknown> = {
  name: string;                        // 工具名称(如 "web_search")
  label?: string;                      // 人类可读标签
  description: string;                 // 给 LLM 看的工具描述
  parameters: TParams;                 // 参数 Schema
  execute: (params, onUpdate?) => Promise<AgentToolResult<TResult>>;
};

其中 parameters 字段需要被转换为 JSON Schema 格式,以便作为 LLM API 的 tools 参数发送。OpenClaw 使用 TypeBox 库来定义类型安全的 Schema。

衍生解释TypeBox 是一个 TypeScript JSON Schema 构建器。它用 TypeScript 函数生成 JSON Schema,同时自动推导出对应的 TypeScript 类型。例如 Type.String() 生成 { "type": "string" } JSON Schema,且在 TypeScript 中推导为 string 类型。这比手写 JSON Schema + 类型定义要安全得多。

TypeBox 定义示例

message 工具的部分参数为例:

TypeBox 的 Type.Object() 会生成如下 JSON Schema:

Schema 归一化

不同 LLM 提供者对 JSON Schema 的支持程度不同。OpenClaw 通过 normalizeToolParameters()cleanToolSchemaForGemini() 等函数处理兼容性:

对于 Google Gemini 系列模型,需要额外清理不支持的 Schema 属性(Gemini 的 JSON Schema 支持较为有限)。


14.1.2 工具注册表(src/agents/openclaw-tools.ts

工具分层

OpenClaw 的工具分为三个层次:

工具组装流程

createOpenClawTools() 是 OpenClaw 原生工具的工厂函数,它根据上下文参数组装工具集:

注意以下设计要点:

  1. 条件创建imageTool 需要 agentDirwebSearchTool 可能被配置禁用

  2. 上下文注入messageTool 需要知道当前通道、线程等上下文

  3. 去重合并:插件工具通过 existingToolNames 避免与内置工具同名

完整工具组装链

从顶层来看,工具的组装经过多步处理:


14.1.3 沙箱感知工具过滤

沙箱的概念

OpenClaw 支持在沙箱模式下运行 Agent,限制其对文件系统和命令执行的访问。沙箱通过 sandboxRoot 参数指定一个根目录,所有文件操作都限制在此目录下:

沙箱对工具的影响

不同的沙箱状态会导致不同的工具版本被使用:

工具
非沙箱
沙箱模式

read

可读取任意文件

仅限沙箱目录

write

可写入任意文件

仅限沙箱目录

edit

可编辑任意文件

仅限沙箱目录

exec

完整 shell 访问

工作目录限制为沙箱

web_search

完整访问

可能被策略禁用

browser

完整访问

使用 Bridge URL

子 Agent 工具过滤

当 Agent 派生子 Agent(Subagent)时,子 Agent 的工具集会被额外限制:

这个设计遵循最小权限原则——子 Agent 只需要完成被分配的具体任务,不需要系统级操作权限。


14.1.4 工具辅助函数

参数读取工具

common.ts 提供了一组类型安全的参数读取函数,被所有工具共用:

结果格式化工具

操作门控(Action Gate)

createActionGate() 提供了一种优雅的方式来控制工具的部分功能:

这个模式让配置变得非常灵活——管理员可以精确控制每个工具的每个操作是否可用。


本节小结

  1. 工具使用 TypeBox 定义参数 Schema,自动生成 JSON Schema 发送给 LLM,同时保持 TypeScript 类型安全。不同 LLM 的 Schema 兼容性差异由 normalizeToolParameters() 处理。

  2. 工具分三层组装:基础编码工具(read/write/edit/exec)→ OpenClaw 原生工具(15+ 种)→ 插件工具(通过 registerTool() 注册)。createOpenClawTools() 是组装的核心入口。

  3. 沙箱模式通过路径守卫限制文件访问,子 Agent 通过默认 deny 列表进一步限制工具集,遵循最小权限原则。

  4. common.ts 提供了统一的参数读取和结果格式化工具集,包括 readStringParam()jsonResult()imageResult()createActionGate() 等,被所有工具共享使用。

Last updated