系列导航第一篇什么是 Agent一个成熟 Agent 平台的 8 个核心组件本篇工具系统设计 — 从全量绑定到按需加载第三篇五个核心中间件深度解析第四篇Agent 生命周期与状态管理摘要当 Agent 接入大量 MCP 工具时将所有工具的完整 JSON Schema 一次性绑定给模型会导致严重的 token 浪费和选择困难问题。本文分析 DeerFlow 如何通过tool_search延迟加载机制实现仅暴露名称、按需加载 schema的工具发现策略并讨论该方案在业界的独特性。一、三层工具架构DeerFlow 的工具系统采用三层来源架构由get_available_tools()函数统一合并1.1 Built-in Tools内置工具代码级内置提供 Agent 运行时的基础能力BUILTIN_TOOLS[present_file_tool,# 向用户展示文件ask_clarification_tool,# 向用户发起澄清提问]SUBAGENT_TOOLS[task_tool,# 委派任务给子 Agent]此外还有条件性内置工具view_image_tool仅当模型配置supports_vision: true时加载skill_manage_tool仅当skill_evolution.enabled时加载update_agent仅自定义 Agent非默认 Agent时加载1.2 Configured Tools配置工具通过config.yaml声明启动时通过反射加载tools:-name:web_searchuse:deerflow.community.search.duckduckgo:ddg_search_toolgroup:search-name:bashuse:deerflow.sandbox.tools:bash_toolgroup:bash-name:read_fileuse:deerflow.sandbox.tools:read_file_toolgroup:fileresolve_variable(cfg.use, BaseTool)将package.module:variable格式的字符串解析为实际的工具实例。DeerFlow 会校验配置中的name字段与工具实例的.name属性是否一致不一致时输出警告日志。1.3 MCP Tools协议工具通过 MCPModel Context Protocol服务器动态加载。MCP 服务器配置在extensions_config.json中{mcpServers:{github:{enabled:true,type:stdio,command:npx,args:[-y,modelcontextprotocol/server-github],env:{GITHUB_TOKEN:$GITHUB_TOKEN}}}}MCP 工具通过langchain-mcp-adapters库适配为 LangChain 的BaseTool接口支持 stdio、SSE、HTTP 三种传输方式。工具列表带有文件 mtime 缓存失效机制——当配置文件变更时自动重新初始化 MCP 客户端。1.4 工具合并与去重all_toolsloaded_toolsbuiltin_toolsmcp_toolsacp_tools# 按名称去重优先级config builtin MCP ACPseen_names:set[str]set()unique_tools:list[BaseTool][]fortinall_tools:ift.namenotinseen_names:unique_tools.append(t)seen_names.add(t.name)二、全量绑定的问题在标准的 LangChain/LangGraph 实现中所有可用工具的完整 JSON Schema 通过model.bind_tools(tools)一次性发送给模型。当工具数量较少时10 个以内这种方式没有问题。但当接入多个 MCP 服务器时GitHub、Postgres、Slack、Puppeteer 等每个服务器可能暴露 5-20 个工具总计可达 50-100 个。此时全量绑定面临三个问题2.1 Token 浪费每个工具的 JSON Schema 包含名称、描述、参数定义类型、必填、枚举值等平均占 200-500 token。50 个工具即占用 10000-25000 token 的上下文空间严重挤压实际对话内容的空间。2.2 模型选择困难研究表明当可选工具过多时LLM 的工具选择准确率会下降。模型可能会选择功能相似但不正确的工具产生幻觉调用——调用参数格式正确但逻辑错误的工具在多个候选工具之间犹豫增加推理 token 消耗2.3 前缀缓存失效LLM 推理服务通常支持 KV Cache 前缀缓存——如果系统提示词包含工具 schema不变则可复用先前的 KV Cache 计算结果。工具列表的频繁变动如 MCP 服务器重启后工具列表变化会导致缓存失效增加推理延迟。三、DeerFlow 的 tool_search 延迟加载方案DeerFlow 设计了一套完整的延迟加载机制由四个协作组件构成。3.1 构建时识别与分类在 Agent 构建阶段_make_lead_agent()经过技能策略过滤后调用build_deferred_tool_setup()对工具进行分类defbuild_deferred_tool_setup(filtered_tools,*,enabled:bool)-DeferredToolSetup:ifnotenabled:returnDeferredToolSetup(None,frozenset(),None)# 仅 MCP 工具被标记为延迟加载deferred[tfortinfiltered_toolsif_is_mcp_tool(t)]ifnotdeferred:returnDeferredToolSetup(None,frozenset(),None)catalogDeferredToolCatalog(tuple(deferred))returnDeferredToolSetup(tool_search_toolbuild_tool_search_tool(catalog),deferred_namescatalog.names,catalog_hashcatalog.hash)识别依据是工具的metadata标记——在get_available_tools()中MCP 来源的工具会被打上{deerflow_mcp: True}标签fortinmcp_tools:t.metadata{**(t.metadataor{}),deerflow_mcp:True}3.2 系统提示词仅列名称get_deferred_tools_prompt_section()生成一段包含在系统提示词中的内容available-deferred-toolsgithub_create_issue github_list_repos postgres_query slack_send_message/available-deferred-tools模型能看到这些工具的名称知道它们存在但没有参数 schema因此无法直接调用。3.3 运行时中间件拦截未授权调用DeferredToolFilterMiddleware承担两项职责职责一过滤模型绑定的工具 schemadef_filter_tools(self,request:ModelRequest)-ModelRequest:hideself._hidden(request.state)# 延迟集 - 已提升集active[tfortinrequest.toolsift.namenotinhide]returnrequest.override(toolsactive)即使 ToolNode 持有所有工具实例用于执行模型通过bind_tools()看到的 schema 只包含活跃工具和已提升工具。职责二拦截越权调用def_blocked_tool_message(self,request:ToolCallRequest)-ToolMessage|None:namerequest.tool_call.get(name)ifnameinself._hidden(request.state):returnToolMessage(contentfError: Tool {name} is deferred and has not been promoted yet. fCall tool_search first.,statuserror)如果模型凭记忆尝试直接调用未提升的工具系统返回错误而非执行引导模型先通过tool_search获取 schema。3.4 提升机制tool_search 解锁当模型调用tool_search工具时tooldeftool_search(query:str,tool_call_id:Annotated[str,InjectedToolCallId])-Command:matchedcatalog.search(query)[:MAX_RESULTS]contentjson.dumps([convert_to_openai_function(t)fortinmatched])names[t.namefortinmatched]returnCommand(update{promoted:{catalog_hash:catalog_hash,names:names},messages:[ToolMessage(contentcontent,tool_call_idtool_call_id)]})Command(update{promoted: ...})将提升记录写入图状态。ThreadState的merge_promotedreducer 处理合并逻辑defmerge_promoted(existing,new):ifexisting.get(catalog_hash)!new[catalog_hash]:returnnew# catalog 变更 → 替换防漂移return{catalog_hash:existing[catalog_hash],names:list(dict.fromkeys(existing[names]new[names]))# 去重合并}下一轮模型调用时中间件检测到该工具已提升不再隐藏其 schema模型即可正常调用。四、搜索能力设计DeferredToolCatalog支持三种查询模式4.1 精确选取select:github_create_issue,postgres_query直接按名称选取指定工具适合模型已明确知道需要哪个工具的场景。4.2 前缀 关键词排序slack send要求名称必须包含slack再按send关键词对候选排序。4.3 正则搜索notebook jupyter对工具名称和描述做正则匹配名称匹配权重2高于描述匹配1返回得分最高的前 5 个结果。defsearch(self,query:str)-list[BaseTool]:try:regexre.compile(query,re.IGNORECASE)exceptre.error:regexre.compile(re.escape(query),re.IGNORECASE)scored[]fortinself.tools:searchablef{t.name}{t.descriptionor}ifregex.search(searchable):scored.append((2ifregex.search(t.name)else1,t))scored.sort(keylambdax:x[0],reverseTrue)return[tfor_,tinscored][:MAX_RESULTS]五、安全设计5.1 Catalog Hash 防漂移每次构建目录时计算所有工具 schema 的 SHA256 哈希cached_propertydefhash(self)-str:canon[{name:t.name,schema:convert_to_openai_function(t)}fortinsorted(self.tools,keylambdat:t.name)]blobjson.dumps(canon,sort_keysTrue,ensure_asciiFalse,defaultstr)returnhashlib.sha256(blob.encode(utf-8)).hexdigest()[:16]merge_promoted在合并时校验 hash——如果 MCP 服务器重启后工具列表发生了变化名称相同但参数变了旧的 promoted 记录自动失效防止暴露已不存在或已变更的工具。5.2 Fail-closed 策略def_assemble_deferred(filtered_tools,*,enabled:bool):setupbuild_deferred_tool_setup(filtered_tools,enabledenabled)ifenabledandnotsetup.deferred_namesandany(_is_mcp_tool(t)fortinfiltered_tools):raiseRuntimeError(tool_search enabled and MCP tools survived policy filtering, but no deferred set was recovered — refusing to bind MCP schemas (fail-closed).)如果配置启用了 tool_search 但目录构建失败逻辑异常系统拒绝启动而非退化为全量暴露。5.3 每次最多 5 个MAX_RESULTS 5限制每次tool_search最多返回 5 个工具 schema避免模型通过一次搜索获取全量 schema绕过延迟加载的初衷。六、完整数据流┌────────────────────────────────────────────────────────────────┐ │ Agent 构建阶段 │ │ │ │ 所有工具config builtin MCP │ │ ↓ 技能策略过滤 │ │ filtered_tools │ │ ↓ build_deferred_tool_setup() │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ DeferredToolSetup: │ │ │ │ deferred_names {tool_a, tool_b, tool_c, ...} │ │ │ │ catalog_hash abc123... │ │ │ │ tool_search_tool closure over DeferredToolCatalog │ │ │ └─────────────────────────────────────────────────────────┘ │ │ ↓ │ │ final_tools filtered_tools [tool_search_tool] │ │ system_prompt 包含 available-deferred-tools 名称列表 │ └────────────────────────────────────────────────────────────────┘ │ ▼ ┌────────────────────────────────────────────────────────────────┐ │ 运行时 — 第 1 轮 │ │ │ │ DeferredToolFilterMiddleware: │ │ hidden deferred_names - promoted {tool_a, tool_b, ...} │ │ bind_tools → 只暴露非延迟工具 tool_search │ │ │ │ 模型看到系统提示词中的工具名称列表 │ │ 模型决定需要 tool_a → 调用 tool_search(select:tool_a) │ └────────────────────────────────────────────────────────────────┘ │ ▼ ┌────────────────────────────────────────────────────────────────┐ │ tool_search 执行 │ │ │ │ 1. catalog.search(select:tool_a) → 找到 tool_a 实例 │ │ 2. 序列化为 JSON Schema │ │ 3. Command(update{promoted: {hash, [tool_a]}}) │ │ → 写入 ThreadState.promoted │ │ 4. 返回 ToolMessage(content完整 schema JSON) │ └────────────────────────────────────────────────────────────────┘ │ ▼ ┌────────────────────────────────────────────────────────────────┐ │ 运行时 — 第 2 轮 │ │ │ │ DeferredToolFilterMiddleware: │ │ hidden deferred_names - {tool_a} {tool_b, tool_c, ...} │ │ bind_tools → 暴露非延迟工具 tool_search tool_a │ │ │ │ 模型正常调用: tool_a(param1xxx, param2yyy) │ │ ToolNode 执行 → 返回结果 │ └────────────────────────────────────────────────────────────────┘七、与业界方案的对比方案工具发现方式适用场景LangChain 标准全量 bind_tools工具数 15CrewAI全量绑定 角色分工减少每个 Agent 可见工具多 Agent 协作AutoGen全量注册工具数可控MCP 协议tools/list一次性返回所有工具协议层面无按需发现OpenAI function calling全量声明讨论过 pagination 但未公开实现DeerFlow tool_search名称暴露 按需搜索获取 schemaMCP 工具数量大DeerFlow 的 tool_search 方案在当前开源 Agent 框架中尚属独创。其本质类似操作系统的虚拟内存/页面置换——工具存在但不加载直到实际需要时才换入上下文窗口。八、配置与启用该机制通过config.yaml控制tool_search:enabled:true# 默认 false渐进推广中当前默认关闭enabled: false说明该特性仍在渐进推广阶段。对于 MCP 工具数量有限 15 个的部署场景全量绑定仍是更简单的选择。下一篇预告第三篇将深入分析 DeerFlow 的五个核心中间件SandboxMiddleware执行隔离、SummarizationMiddleware上下文管理、MemoryMiddleware长期记忆、ClarificationMiddleware澄清中断、SafetyFinishReasonMiddleware安全防护探讨每个中间件的设计动机、实现机制和关键决策。
从字节跳动 DeerFlow 源码看 Agent 平台设计(二):工具系统设计 — 从全量绑定到按需加载
系列导航第一篇什么是 Agent一个成熟 Agent 平台的 8 个核心组件本篇工具系统设计 — 从全量绑定到按需加载第三篇五个核心中间件深度解析第四篇Agent 生命周期与状态管理摘要当 Agent 接入大量 MCP 工具时将所有工具的完整 JSON Schema 一次性绑定给模型会导致严重的 token 浪费和选择困难问题。本文分析 DeerFlow 如何通过tool_search延迟加载机制实现仅暴露名称、按需加载 schema的工具发现策略并讨论该方案在业界的独特性。一、三层工具架构DeerFlow 的工具系统采用三层来源架构由get_available_tools()函数统一合并1.1 Built-in Tools内置工具代码级内置提供 Agent 运行时的基础能力BUILTIN_TOOLS[present_file_tool,# 向用户展示文件ask_clarification_tool,# 向用户发起澄清提问]SUBAGENT_TOOLS[task_tool,# 委派任务给子 Agent]此外还有条件性内置工具view_image_tool仅当模型配置supports_vision: true时加载skill_manage_tool仅当skill_evolution.enabled时加载update_agent仅自定义 Agent非默认 Agent时加载1.2 Configured Tools配置工具通过config.yaml声明启动时通过反射加载tools:-name:web_searchuse:deerflow.community.search.duckduckgo:ddg_search_toolgroup:search-name:bashuse:deerflow.sandbox.tools:bash_toolgroup:bash-name:read_fileuse:deerflow.sandbox.tools:read_file_toolgroup:fileresolve_variable(cfg.use, BaseTool)将package.module:variable格式的字符串解析为实际的工具实例。DeerFlow 会校验配置中的name字段与工具实例的.name属性是否一致不一致时输出警告日志。1.3 MCP Tools协议工具通过 MCPModel Context Protocol服务器动态加载。MCP 服务器配置在extensions_config.json中{mcpServers:{github:{enabled:true,type:stdio,command:npx,args:[-y,modelcontextprotocol/server-github],env:{GITHUB_TOKEN:$GITHUB_TOKEN}}}}MCP 工具通过langchain-mcp-adapters库适配为 LangChain 的BaseTool接口支持 stdio、SSE、HTTP 三种传输方式。工具列表带有文件 mtime 缓存失效机制——当配置文件变更时自动重新初始化 MCP 客户端。1.4 工具合并与去重all_toolsloaded_toolsbuiltin_toolsmcp_toolsacp_tools# 按名称去重优先级config builtin MCP ACPseen_names:set[str]set()unique_tools:list[BaseTool][]fortinall_tools:ift.namenotinseen_names:unique_tools.append(t)seen_names.add(t.name)二、全量绑定的问题在标准的 LangChain/LangGraph 实现中所有可用工具的完整 JSON Schema 通过model.bind_tools(tools)一次性发送给模型。当工具数量较少时10 个以内这种方式没有问题。但当接入多个 MCP 服务器时GitHub、Postgres、Slack、Puppeteer 等每个服务器可能暴露 5-20 个工具总计可达 50-100 个。此时全量绑定面临三个问题2.1 Token 浪费每个工具的 JSON Schema 包含名称、描述、参数定义类型、必填、枚举值等平均占 200-500 token。50 个工具即占用 10000-25000 token 的上下文空间严重挤压实际对话内容的空间。2.2 模型选择困难研究表明当可选工具过多时LLM 的工具选择准确率会下降。模型可能会选择功能相似但不正确的工具产生幻觉调用——调用参数格式正确但逻辑错误的工具在多个候选工具之间犹豫增加推理 token 消耗2.3 前缀缓存失效LLM 推理服务通常支持 KV Cache 前缀缓存——如果系统提示词包含工具 schema不变则可复用先前的 KV Cache 计算结果。工具列表的频繁变动如 MCP 服务器重启后工具列表变化会导致缓存失效增加推理延迟。三、DeerFlow 的 tool_search 延迟加载方案DeerFlow 设计了一套完整的延迟加载机制由四个协作组件构成。3.1 构建时识别与分类在 Agent 构建阶段_make_lead_agent()经过技能策略过滤后调用build_deferred_tool_setup()对工具进行分类defbuild_deferred_tool_setup(filtered_tools,*,enabled:bool)-DeferredToolSetup:ifnotenabled:returnDeferredToolSetup(None,frozenset(),None)# 仅 MCP 工具被标记为延迟加载deferred[tfortinfiltered_toolsif_is_mcp_tool(t)]ifnotdeferred:returnDeferredToolSetup(None,frozenset(),None)catalogDeferredToolCatalog(tuple(deferred))returnDeferredToolSetup(tool_search_toolbuild_tool_search_tool(catalog),deferred_namescatalog.names,catalog_hashcatalog.hash)识别依据是工具的metadata标记——在get_available_tools()中MCP 来源的工具会被打上{deerflow_mcp: True}标签fortinmcp_tools:t.metadata{**(t.metadataor{}),deerflow_mcp:True}3.2 系统提示词仅列名称get_deferred_tools_prompt_section()生成一段包含在系统提示词中的内容available-deferred-toolsgithub_create_issue github_list_repos postgres_query slack_send_message/available-deferred-tools模型能看到这些工具的名称知道它们存在但没有参数 schema因此无法直接调用。3.3 运行时中间件拦截未授权调用DeferredToolFilterMiddleware承担两项职责职责一过滤模型绑定的工具 schemadef_filter_tools(self,request:ModelRequest)-ModelRequest:hideself._hidden(request.state)# 延迟集 - 已提升集active[tfortinrequest.toolsift.namenotinhide]returnrequest.override(toolsactive)即使 ToolNode 持有所有工具实例用于执行模型通过bind_tools()看到的 schema 只包含活跃工具和已提升工具。职责二拦截越权调用def_blocked_tool_message(self,request:ToolCallRequest)-ToolMessage|None:namerequest.tool_call.get(name)ifnameinself._hidden(request.state):returnToolMessage(contentfError: Tool {name} is deferred and has not been promoted yet. fCall tool_search first.,statuserror)如果模型凭记忆尝试直接调用未提升的工具系统返回错误而非执行引导模型先通过tool_search获取 schema。3.4 提升机制tool_search 解锁当模型调用tool_search工具时tooldeftool_search(query:str,tool_call_id:Annotated[str,InjectedToolCallId])-Command:matchedcatalog.search(query)[:MAX_RESULTS]contentjson.dumps([convert_to_openai_function(t)fortinmatched])names[t.namefortinmatched]returnCommand(update{promoted:{catalog_hash:catalog_hash,names:names},messages:[ToolMessage(contentcontent,tool_call_idtool_call_id)]})Command(update{promoted: ...})将提升记录写入图状态。ThreadState的merge_promotedreducer 处理合并逻辑defmerge_promoted(existing,new):ifexisting.get(catalog_hash)!new[catalog_hash]:returnnew# catalog 变更 → 替换防漂移return{catalog_hash:existing[catalog_hash],names:list(dict.fromkeys(existing[names]new[names]))# 去重合并}下一轮模型调用时中间件检测到该工具已提升不再隐藏其 schema模型即可正常调用。四、搜索能力设计DeferredToolCatalog支持三种查询模式4.1 精确选取select:github_create_issue,postgres_query直接按名称选取指定工具适合模型已明确知道需要哪个工具的场景。4.2 前缀 关键词排序slack send要求名称必须包含slack再按send关键词对候选排序。4.3 正则搜索notebook jupyter对工具名称和描述做正则匹配名称匹配权重2高于描述匹配1返回得分最高的前 5 个结果。defsearch(self,query:str)-list[BaseTool]:try:regexre.compile(query,re.IGNORECASE)exceptre.error:regexre.compile(re.escape(query),re.IGNORECASE)scored[]fortinself.tools:searchablef{t.name}{t.descriptionor}ifregex.search(searchable):scored.append((2ifregex.search(t.name)else1,t))scored.sort(keylambdax:x[0],reverseTrue)return[tfor_,tinscored][:MAX_RESULTS]五、安全设计5.1 Catalog Hash 防漂移每次构建目录时计算所有工具 schema 的 SHA256 哈希cached_propertydefhash(self)-str:canon[{name:t.name,schema:convert_to_openai_function(t)}fortinsorted(self.tools,keylambdat:t.name)]blobjson.dumps(canon,sort_keysTrue,ensure_asciiFalse,defaultstr)returnhashlib.sha256(blob.encode(utf-8)).hexdigest()[:16]merge_promoted在合并时校验 hash——如果 MCP 服务器重启后工具列表发生了变化名称相同但参数变了旧的 promoted 记录自动失效防止暴露已不存在或已变更的工具。5.2 Fail-closed 策略def_assemble_deferred(filtered_tools,*,enabled:bool):setupbuild_deferred_tool_setup(filtered_tools,enabledenabled)ifenabledandnotsetup.deferred_namesandany(_is_mcp_tool(t)fortinfiltered_tools):raiseRuntimeError(tool_search enabled and MCP tools survived policy filtering, but no deferred set was recovered — refusing to bind MCP schemas (fail-closed).)如果配置启用了 tool_search 但目录构建失败逻辑异常系统拒绝启动而非退化为全量暴露。5.3 每次最多 5 个MAX_RESULTS 5限制每次tool_search最多返回 5 个工具 schema避免模型通过一次搜索获取全量 schema绕过延迟加载的初衷。六、完整数据流┌────────────────────────────────────────────────────────────────┐ │ Agent 构建阶段 │ │ │ │ 所有工具config builtin MCP │ │ ↓ 技能策略过滤 │ │ filtered_tools │ │ ↓ build_deferred_tool_setup() │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ DeferredToolSetup: │ │ │ │ deferred_names {tool_a, tool_b, tool_c, ...} │ │ │ │ catalog_hash abc123... │ │ │ │ tool_search_tool closure over DeferredToolCatalog │ │ │ └─────────────────────────────────────────────────────────┘ │ │ ↓ │ │ final_tools filtered_tools [tool_search_tool] │ │ system_prompt 包含 available-deferred-tools 名称列表 │ └────────────────────────────────────────────────────────────────┘ │ ▼ ┌────────────────────────────────────────────────────────────────┐ │ 运行时 — 第 1 轮 │ │ │ │ DeferredToolFilterMiddleware: │ │ hidden deferred_names - promoted {tool_a, tool_b, ...} │ │ bind_tools → 只暴露非延迟工具 tool_search │ │ │ │ 模型看到系统提示词中的工具名称列表 │ │ 模型决定需要 tool_a → 调用 tool_search(select:tool_a) │ └────────────────────────────────────────────────────────────────┘ │ ▼ ┌────────────────────────────────────────────────────────────────┐ │ tool_search 执行 │ │ │ │ 1. catalog.search(select:tool_a) → 找到 tool_a 实例 │ │ 2. 序列化为 JSON Schema │ │ 3. Command(update{promoted: {hash, [tool_a]}}) │ │ → 写入 ThreadState.promoted │ │ 4. 返回 ToolMessage(content完整 schema JSON) │ └────────────────────────────────────────────────────────────────┘ │ ▼ ┌────────────────────────────────────────────────────────────────┐ │ 运行时 — 第 2 轮 │ │ │ │ DeferredToolFilterMiddleware: │ │ hidden deferred_names - {tool_a} {tool_b, tool_c, ...} │ │ bind_tools → 暴露非延迟工具 tool_search tool_a │ │ │ │ 模型正常调用: tool_a(param1xxx, param2yyy) │ │ ToolNode 执行 → 返回结果 │ └────────────────────────────────────────────────────────────────┘七、与业界方案的对比方案工具发现方式适用场景LangChain 标准全量 bind_tools工具数 15CrewAI全量绑定 角色分工减少每个 Agent 可见工具多 Agent 协作AutoGen全量注册工具数可控MCP 协议tools/list一次性返回所有工具协议层面无按需发现OpenAI function calling全量声明讨论过 pagination 但未公开实现DeerFlow tool_search名称暴露 按需搜索获取 schemaMCP 工具数量大DeerFlow 的 tool_search 方案在当前开源 Agent 框架中尚属独创。其本质类似操作系统的虚拟内存/页面置换——工具存在但不加载直到实际需要时才换入上下文窗口。八、配置与启用该机制通过config.yaml控制tool_search:enabled:true# 默认 false渐进推广中当前默认关闭enabled: false说明该特性仍在渐进推广阶段。对于 MCP 工具数量有限 15 个的部署场景全量绑定仍是更简单的选择。下一篇预告第三篇将深入分析 DeerFlow 的五个核心中间件SandboxMiddleware执行隔离、SummarizationMiddleware上下文管理、MemoryMiddleware长期记忆、ClarificationMiddleware澄清中断、SafetyFinishReasonMiddleware安全防护探讨每个中间件的设计动机、实现机制和关键决策。