先声明一个搜索工具,而不是全部工具
会话开始时,在请求顶层tools 中只声明一个由你后端实现的 search_tools 工具,以及少量每轮都可能用到的核心工具:
search_tools。这样无论工具总量多大,每轮请求里的工具声明都只有少量几个。
用 tool_choice 强制首轮检索
模型可以选择不调用任何工具、直接凭记忆作答。为了确保它先检索再回答,首轮请求设置tool_choice: "required":
tool_choice 恢复为 "auto"。修改 tool_choice 不会破坏前缀缓存,可以按请求粒度调整。各取值含义见工具调用约束。
按需注入工具定义
search_tools 返回候选工具后,由你的应用把对应工具的完整声明,通过一条携带 tools 的 system 消息插入 messages。工具从该消息所在的位置开始对模型可见:
tools 完全一致,不需要维护两套 schema;注入的工具与顶层声明的全局工具并存。动态工具声明按请求生效,不会被服务端记住。下一轮可以继续携带原声明,让工具保持可用并复用前缀缓存;也可以移除该声明。如果工具未在其他位置声明,模型将无法调用这个工具,同时后续前缀可能无法命中缓存。完整用法见动态加载工具。
按任务复杂度确定思考力度
思考力度当前仅支持max 档位(默认);后续上线的更低档位可为简单问答、参数构造等轻量任务降本提速。
注意:当前 reasoning_effort 仅支持 "max",请在会话开始前确定该配置。在 messages 末尾追加动态工具声明,不会影响已有前缀的缓存;删除或修改之前的工具声明,可能影响变更位置之后的缓存命中。修改 tool_choice 不会破坏前缀缓存。取舍细节见思考力度。
当前切换
effort 档位不会影响前缀缓存命中。 思考力度当前仅支持 max 档位。待更多档位上线后,切换档位可能导致缓存失效,仍建议在会话开始前确定 effort 档位,避免中途切换。完整流程
- 会话开始:顶层
tools只放search_tools和少量核心工具; - 首轮检索:
tool_choice: "required"强制模型调用search_tools; - 按需注入:按检索结果用
system消息动态插入工具定义; - 直接调用:模型在后续生成中调用已加载的工具;
- 成本权衡:会话开始前确定顶层
reasoning_effort配置。