Skip to content
2026-09-29 04:20541 字AIOpenClawTools工具系统布尔表达式

Tools System 工具系统 ​

源码路径:src/tools/

Tools System 是 OpenClaw 的工具能力抽象。管理所有可用于 Agent 的工具(核心/Shell/频道/插件/MCP),通过声明式描述符和布尔表达式实现灵活的可用性控制。

通俗类比:ToolExecution 是「工具间」 ​

AI 模型不能直接执行工具。工具调用分两步:

  1. AI 输出「我想调用 search(query="OpenClaw")」
  2. 系统执行调用,把结果返回给 AI

ToolExecution 负责第 2 步,以及第 1 步前的工具规划。

核心职责 ​

职责说明
工具描述声明式工具描述符(名称/描述/Schema/拥有者/执行器)
可用性评估布尔表达式树(AND/OR 嵌套)控制工具可见性
协议适配ToolDescriptor → 模型可理解的运行时负载
工具规划生成 visible/hidden 分离的 ToolPlan

核心类型 ​

工具拥有者 ​

typescript
type ToolOwnerRef = 
  | { type: "core" }
  | { type: "plugin"; pluginId: string }
  | { type: "channel"; channelId: string }
  | { type: "mcp"; serverId: string };

可用性条件(布尔表达式树) ​

typescript
type ToolAvailabilitySignal =
  | "always" | "auth" | "config" | "env" | "plugin-enabled" | "context";

type ToolAvailabilityExpression = {
  allOf?: ToolAvailabilityExpression[];  // AND
  anyOf?: ToolAvailabilityExpression[];  // OR
  signal?: ToolAvailabilitySignal;       // 原子条件
};

工具描述符 ​

typescript
type ToolDescriptor = {
  name: string;
  description: string;
  inputSchema: JSONSchema;
  owner: ToolOwnerRef;
  executor: ToolExecutorRef;
  availability: ToolAvailabilityExpression;
};

工具规划 ​

typescript
type ToolPlan = {
  visible: ToolDescriptor[];  // 对模型可见
  hidden: ToolDescriptor[];   // 对模型隐藏但可用
};

可用性评估 ​

ToolDescriptor.availability
  → 求值布尔表达式树
  → allOf: 所有子条件为真 → 工具可用
  → anyOf: 任一子条件为真 → 工具可用
  → signal: 检查单个信号
  → 决定是否包含在 ToolPlan 中

协议适配 ​

protocol.ts 将内部 ToolDescriptor 转换为 LLM 模型可理解的函数调用格式:

  • OpenAI:{"type": "function", "function": {...}}
  • Anthropic:[{"name": "...", "input_schema": {...}}]
  • Google:[{"function_declarations": [...]}]

设计模式 ​

模式应用
声明式描述符ToolDescriptor 描述工具而不指定实现
布尔表达式灵活嵌套的可用性条件
描述符驱动规划先生成 ToolPlan 再执行
协议适配内部描述符 → 模型运行时格式

每一篇文章,都是时间的标本