乐于分享
好东西不私藏

OpenClaw拆解:40+工具箱

OpenClaw拆解:40+工具箱

OpenClaw之所以能够轻松顺利地完成一些复杂任务,除了有合理且优秀的提示词外,还有另外一大功臣:丰富的工具箱。

一、工具总数

OpenClaw 共有 40+ 个工具,分为以下几个类别:

类别
数量
说明
核心工具
5 个
read, write, edit, exec, process
会话管理
7 个
sessions_list, sessions_history, sessions_send, sessions_spawn, sessions_yield, session_status, subagents
网络工具
4 个
web_search, web_fetch, browser, tavily
OpenClaw 核心
14 个
gateway, agents_list, cron, nodes, canvas, tts, message 等
媒体工具
3 个
image, image_generate, pdf
沙盒工具
3 个
sandboxed_read, sandboxed_write, sandboxed_edit
其他
5 个
apply_patch, host_workspace_edit, host_workspace_write,memory_search,memory_get

二、工具定义位置

外部依赖

import { codingTools, createReadTool, createWriteTool, createEditTool } from"@mariozechner/pi-coding-agent";

说明:基础工具(read, write, edit)来自外部库 @mariozechner/pi-coding-agent


三、工具定义结构

通用模式

functioncreateXxxTool(options) {return {name"xxx",           // 工具名称description"...",    // 工具描述parameters: {          // 参数定义(JSON Schema)type"object",properties: {...},required: [...]        },executeasync (toolCallId, params, signal, onUpdate) => {// 执行逻辑return result;        }    };}

示例:createExecTool

functioncreateExecTool(defaults) {return {name"exec",description"Run shell commands (pty available for TTY-required CLIs)",parameters: {type"object",properties: {command: { type"string"description"Command to execute" },background: { type"boolean"description"Run in background" },yieldMs: { type"number"description"Milliseconds to wait before backgrounding" },// ...            },required: ["command"]        },executeasync (toolCallId, params, signal, onUpdate) => {// 执行 shell 命令// 处理后台任务// 返回结果        }    };}

四、完整工具列表

核心工具(5 个)

工具名
函数
说明
readcreateReadTool
读取文件内容
writecreateWriteTool
创建或覆盖文件
editcreateEditTool
精确编辑文件
execcreateExecTool
执行 shell 命令
processcreateProcessTool
管理后台进程

会话管理工具(7 个)

工具名
函数
说明
sessions_listcreateSessionsListTool
列出其他会话
sessions_historycreateSessionsHistoryTool
获取会话历史
sessions_sendcreateSessionsSendTool
发送消息到其他会话
sessions_spawncreateSessionsSpawnTool
创建子代理会话
sessions_yieldcreateSessionsYieldTool
结束当前回合
session_statuscreateSessionStatusTool
显示会话状态
subagentscreateSubagentsTool
管理子代理

OpenClaw 核心工具(14 个)

工具名
函数
说明
browsercreateBrowserTool
控制浏览器
canvascreateCanvasTool
Canvas 操作
nodescreateNodesTool
节点管理
croncreateCronTool
定时任务管理
messagecreateMessageTool
发送消息
ttscreateTtsTool
语音合成
gatewaycreateGatewayTool
Gateway 管理
agents_listcreateAgentsListTool
列出可用代理
imagecreateImageTool
图像分析
image_generatecreateImageGenerateTool
图像生成
pdfcreatePdfTool
PDF 处理
web_searchcreateWebSearchTool
网络搜索
web_fetchcreateWebFetchTool
网页抓取
apply_patchcreateApplyPatchTool
应用代码补丁

沙盒工具(3 个)

工具名
函数
说明
sandboxed_readcreateSandboxedReadTool
沙盒中读取文件
sandboxed_writecreateSandboxedWriteTool
沙盒中写入文件
sandboxed_editcreateSandboxedEditTool
沙盒中编辑文件

五、工具创建流程

createOpenClawCodingTools 流程

functioncreateOpenClawCodingTools(options) {// 1. 解析配置const sandbox = options?.sandbox;const policy = resolveEffectiveToolPolicy(options);// 2. 创建基础工具(read, write, edit)const base = codingTools.flatMap((tool) => {if (tool.name === 'read') {return [createOpenClawReadTool(createReadTool(workspaceRoot))];        }// ...    });// 3. 创建 exec 和 process 工具const execTool = createExecTool({...defaults, cwd: workspaceRoot});const processTool = createProcessTool({scopeKey});// 4. 创建 OpenClaw 核心工具const openClawTools = createOpenClawTools({agentSessionKey: options?.sessionKey,workspaceDir: workspaceRoot,// ...    });// 5. 合并所有工具const tools = [        ...base,        execTool,        processTool,        ...openClawTools    ];// 6. 应用策略管道const withHooks = applyToolPolicyPipeline({tools: tools,policy: policy,// ...    });return withHooks;}

createOpenClawTools 流程

functioncreateOpenClawTools(options) {// 1. 创建媒体工具const imageTool = createImageTool({...});const imageGenerateTool = createImageGenerateTool({...});const pdfTool = createPdfTool({...});// 2. 创建网络工具const webSearchTool = createWebSearchTool({...});const webFetchTool = createWebFetchTool({...});// 3. 创建消息工具const messageTool = createMessageTool({...});// 4. 创建核心工具数组const tools = [createBrowserTool({...}),createCanvasTool({...}),createNodesTool({...}),createCronTool({...}),        ...messageTool ? [messageTool] : [],createTtsTool({...}),        ...imageGenerateTool ? [imageGenerateTool] : [],createGatewayTool({...}),createAgentsListTool({...}),createSessionsListTool({...}),createSessionsHistoryTool({...}),createSessionsSendTool({...}),createSessionsYieldTool({...}),createSessionsSpawnTool({...}),createSubagentsTool({...}),createSessionStatusTool({...}),        ...webSearchTool ? [webSearchTool] : [],        ...webFetchTool ? [webFetchTool] : [],        ...imageTool ? [imageTool] : [],        ...pdfTool ? [pdfTool] : []    ];// 5. 添加插件工具const pluginTools = resolvePluginTools({...});return [...tools, ...pluginTools];}

六、工具策略管道

applyToolPolicyPipeline

工具在返回前会经过策略管道处理:

const withHooks = applyToolPolicyPipeline({tools: tools,                          // 原始工具列表toolMeta(tool) =>getPluginToolMeta(tool),warn: logWarn,steps: [        {policy: profilePolicy,label"profile tools.allow"        },        {policy: globalPolicy,label"global tools.allow"        },        {policy: sandboxToolPolicy,label"sandbox tools.allow"        },// ...    ]});

策略类型

策略
说明
profilePolicy
用户配置策略
globalPolicy
全局策略
agentPolicy
代理策略
groupPolicy
群组策略
sandboxToolPolicy
沙盒策略
subagentPolicy
子代理策略

七、工具执行流程

1. before_tool_call Hook

工具执行前会经过 before_tool_call Hook:

asyncfunctionrunBeforeToolCallHook(args) {// 1. 检测工具调用循环const loopResult = detectToolCallLoop(sessionState, toolName, params);if (loopResult.stuck) {return { blockedtruereason"Loop detected" };    }// 2. 运行全局 Hookconst hookResult = await hookRunner.runBeforeToolCall({...});if (hookResult?.block) {return { blockedtruereason: hookResult.blockReason };    }return { blockedfalse, params };}

2. 工具执行

constexecute = async (toolCallId, params, signal, onUpdate) => {// 1. 运行 before_tool_call Hookconst outcome = awaitrunBeforeToolCallHook({toolName, params, toolCallId, ctx});if (outcome.blockedthrownewError(outcome.reason);// 2. 执行工具const result = awaitexecute(toolCallId, outcome.params, signal, onUpdate);// 3. 记录结果awaitrecordLoopOutcome({...});return result;};

八、工具命名规范

命名模式

模式
示例
说明
createXxxToolcreateExecTool
工具创建函数
xxxexec
工具名称(小写)
XxxToolExecTool
工具类名(大写)

工具名称规则

  1. 1. 小写execreadwrite
  2. 2. 下划线分隔web_searchapply_patch
  3. 3. 简洁明了:反映工具功能

九、工具参数定义

JSON Schema 格式

parameters: {type"object",properties: {command: {type"string",description"Command to execute"        },background: {type"boolean",description"Run in background",defaultfalse        },timeout: {type"number",description"Timeout in seconds"        }    },required: ["command"]}

十、总结

工具架构特点

  1. 1. 模块化:每个工具独立定义
  2. 2. 可组合:通过 createOpenClawCodingTools 组合
  3. 3. 可扩展:支持插件工具
  4. 4. 有策略:通过策略管道控制工具访问
  5. 5. 有监控:before_tool_call Hook 检测循环

工具数量统计

类别
数量
核心工具
5
会话管理
7
OpenClaw 核心
14
沙盒工具
3
媒体工具
3
网络工具
4
其他
5
总计40+