为什么需要「动态工具」
很多 OpenClaw 老用户以为,AI 能用的工具是系统启动时一次性塞进提示词的固定清单。其实不完全是。
OpenClaw 有一类叫 deferred tool(延迟工具)的能力:它们的名字和一句话描述会出现在工具目录里,但完整 schema(参数结构、返回值)按需加载。这套机制的存在,是为了让插件、MCP、客户端工具能在不污染每次对话上下文的前提下,被 AI 在真正需要时拉出来用。
本机 tool_search 返回的就是这样一个目录:它只给你 id、name、label、description、input(参数签名)。注意 input 对部分工具是 unknown 或极简签名——这时候你不能直接硬调,得先 tool_describe 把完整 schema 拉出来。
三件套怎么配合
1. tool_search —— 按能力检索,而不是背名字
tool_search 接受英文查询(lexical 匹配工具名与描述,描述多为英文,所以中文查询通常命中为 0)。一次可以传多个独立 query,也可以传单个 query。
# 我想「在 catalog 里动态搜工具」
tool_search(query="search catalog of available tools dynamically")
返回结构(节选真实字段):
{
"id": "openclaw:browser:browser",
"source": "openclaw",
"sourceName": "browser",
"name": "browser",
"label": "Browser",
"description": "Control the browser via OpenClaw's browser control server...",
"input": "{ action: string; accept?: boolean; ... }"
}
注意 id 的格式:<source>:<sourceName>:<name>。后面 tool_call 既可以用这个 id,也可以用 name。
2. tool_describe —— 拿到完整参数 schema 再动手
当你要调一个没见过的工具,尤其 input 是 unknown 时,先 tool_describe:
tool_describe(id="openclaw:core:sessions")
它会返回该工具的完整 JSON schema 和元数据,告诉你每个参数是必填还是可选、取值范围、返回结构。这一步是「严禁编造参数」纪律的技术保障——你不必猜,直接读。
3. tool_call —— 原样透传,结果回这里
tool_call(id="openclaw:core:sessions", args={ "action": "list" })
args 是一个对象,把 tool_describe 看到的 schema 原样填进去即可。返回值(含可能的错误对象)会回到本次调用,由 AI 综合成最终答复,不会产生第二次子 agent 回合。
实战踩坑提醒:tool_search的query必须是英文。我实测用中文「搜索可用工具」去查,结果几乎为空;换成英文search catalog of available tools dynamically立刻返回一排相关工具。这是 lexical 匹配的语言限制,不是你工具坏了。
一个真实的最小闭环
场景:Agent 想查「当前会话的配置/用量/时间」,但记忆里没有这个工具的精确参数。
tool_search(query="session status model usage time")→ 命中openclaw:core:session_status,签名显示有sessionKey、model等可选参数。
- 直接
tool_call(id="openclaw:core:session_status", args={ "sessionKey": "current" })。
- 拿到
{ model, usage, time, cost, tasks }之类的结果,合成回复。
全程没有编造参数,因为签名和 tool_describe 都摆在眼前。
和普通工具调用的区别
| 维度 | 普通工具(read/exec/...) | deferred 工具(tool_search/describe/call) |
| --- | --- | --- |
| 出现时机 | 提示词常驻 | 目录常驻,schema 按需 |
| 参数来源 | AI 已知 | 先 search→describe 再 call |
| 典型用途 | 直接干活 | 发现并调用插件/MCP/客户端工具 |
| 返回 | 直接结果 | 经 tool_call 回当前回合 |
简单说:普通工具是「我会」,deferred 工具是「我现在去学」。后者让 Agent 面对未知插件时不会因为「没背过」就罢工。
实战踩坑提醒
- 别跳过 describe 硬调 unknown 参数工具。 像
sessions这类input: unknown的工具,直接tool_call容易填错字段。先tool_describe看清楚。
- query 用英文,且要具体。 笼统的
tools会返回整页目录,噪声大;用动词+名词组合(如search catalog of available tools)更准。
- tool_call 的结果可能被层层包装。 很多外部工具返回
{ kind, provider, results }这类结构,取数前先看一眼真实返回,别假设它是扁平数组。
- 批量查询有总量上限。 多个 query 合并后有效 limit 加起来至多 50,单 query 默认 8。需要更多命中时,分开多查几次。
小结
tool_search + tool_describe + tool_call 是 OpenClaw 的「元工具」三件套:
- search 解决「有哪些工具能帮我」;
- describe 解决「这个工具怎么用、参数长啥样」;
- call 解决「按 schema 原样调,把结果拿回来」。
它把「AI 只能干预设好的活」升级成「AI 能现学现用插件生态里的任何工具」,而且整个过程参数可见、可核对,从源头杜绝编造 API。下次你接入一个新 MCP 或装了个插件却不想改提示词,记得让 Agent 自己搜、自己读、自己调。
扫码关注公众号,获取更多 OpenClaw 实操技巧:
