跳转到主要内容
当 Agent 可用的工具达到几十上百个时,不要把所有工具定义一次性放进请求——它们会占掉大量上下文,还会让模型更容易选错工具。本页介绍一套在 Kimi K3 上的工具编排方式:先用一个搜索工具检索候选工具,再按需把工具定义动态注入对话。

先声明一个搜索工具,而不是全部工具

会话开始时,在请求顶层 tools 中只声明一个由你后端实现的 search_tools 工具,以及少量每轮都可能用到的核心工具:
在 system prompt 中告知模型可搜索的领域标签(例如工具目录、业务域),引导它在需要工具时先调用 search_tools。这样无论工具总量多大,每轮请求里的工具声明都只有少量几个。

用 tool_choice 强制首轮检索

模型可以选择不调用任何工具、直接凭记忆作答。为了确保它先检索再回答,首轮请求设置 tool_choice: "required"
检索完成后,后续请求把 tool_choice 恢复为 "auto"。修改 tool_choice 不会破坏前缀缓存,可以按请求粒度调整。各取值含义见工具调用约束

按需注入工具定义

search_tools 返回候选工具后,由你的应用把对应工具的完整声明,通过一条携带 toolssystem 消息插入 messages。工具从该消息所在的位置开始对模型可见:
动态声明的格式与顶层 tools 完全一致,不需要维护两套 schema;注入的工具与顶层声明的全局工具并存。动态工具声明按请求生效,不会被服务端记住。下一轮可以继续携带原声明,让工具保持可用并复用前缀缓存;也可以移除该声明。如果工具未在其他位置声明,模型将无法调用这个工具,同时后续前缀可能无法命中缓存。完整用法见动态加载工具

按任务复杂度确定思考力度

思考力度当前仅支持 max 档位(默认);后续上线的更低档位可为简单问答、参数构造等轻量任务降本提速。 注意:当前 reasoning_effort 仅支持 "max",请在会话开始前确定该配置。在 messages 末尾追加动态工具声明,不会影响已有前缀的缓存;删除或修改之前的工具声明,可能影响变更位置之后的缓存命中。修改 tool_choice 不会破坏前缀缓存。取舍细节见思考力度
当前切换 effort 档位不会影响前缀缓存命中。 思考力度当前仅支持 max 档位。待更多档位上线后,切换档位可能导致缓存失效,仍建议在会话开始前确定 effort 档位,避免中途切换。

完整流程

  1. 会话开始:顶层 tools 只放 search_tools 和少量核心工具;
  2. 首轮检索:tool_choice: "required" 强制模型调用 search_tools
  3. 按需注入:按检索结果用 system 消息动态插入工具定义;
  4. 直接调用:模型在后续生成中调用已加载的工具;
  5. 成本权衡:会话开始前确定顶层 reasoning_effort 配置。

相关阅读