ToolSearch先加载工具再发起工具调用
1 Claude Code CLI 请求
tools 数组
AgentBashEdit ··· ToolSearch
system 系统提示词 · 23 个 Deferred tools
AskUserQuestion WebSearch TaskCreate CronCreate ···
user: 「我好无聊,用交互式的方式给我 3 个出去玩的选项」
2 Opus 大模型响应
加载工具:把 AskUserQuestion 的说明书发过来
{ "type": "tool_use", "name": "ToolSearch", "input": { "query": "select:AskUserQuestion" } }
⚙ 客户端:用 select:AskUserQuestion 匹配本地所有工具定义,读取命中工具的完整定义信息
3 Claude Code CLI 请求
tools 数组
AgentBashEdit ··· ToolSearch + AskUserQuestion
{ "name": "AskUserQuestion", "description": "Use this tool when …", "input_schema": { "type": "object", "properties": {…} }, "defer_loading": true }
messages 末尾 tool_result = { tool_reference, tool_name: "AskUserQuestion" }
4 Opus 大模型响应
工具到位:正常发起 AskUserQuestion 调用
{ "type": "tool_use", "name": "AskUserQuestion", "input": { "questions": [{ "question": "今天想怎么出去玩?", "options": [ { "label": "城市 Citywalk + 咖啡馆" }, { "label": "郊野徒步 / 公园骑行" }, { "label": "看场展览 / 看场电影" } ] }] } }
缓存前缀不变·新工具展开放入用户消息
1 服务端处理 1:defer_loading 标记
新工具加入 tools 数组,但定义里带 defer_loading=true 字段:
{ "name": "AskUserQuestion", "description": "…", "input_schema": { }, "defer_loading": true }
defer_loading 的工具跳过 cache 前缀 hash 计算
2 服务端处理 2:tool_reference 展开
客户端 messages 里发轻量 tool_reference(只有名字):
{ "type": "tool_reference", "tool_name": "AskUserQuestion" }
自动展开 tool_reference 完整工具定义注入 messages
第 3 轮
tools10 个完整定义
system23 个 deferred 名字
user[0]"我好无聊…"
第 4 轮
tools没动 ✓
system没动 ✓
user[0]没动 ✓
asstToolSearch
+ AskUserQuestion新工具 · tool_reference
✓ tools 保持不变
→ 新工具只追加在末尾