s03
工具系统
能力层三层工具汇聚
内置 + config.yaml + MCP Server 三层合一工具注册统一归口到 ToolNode,动态配置无需重启
三层工具汇聚
内置 + config.yaml + MCP Server 三层合一工具注册统一归口到 ToolNode,动态配置无需重启
Agent 的能力边界由可用工具决定。只有内置工具太死板,只靠配置文件无法接入第三方服务,只用 MCP 又增加运维复杂度。DeerFlow 设计了三层工具注册机制:内置工具保证基础能力,config.yaml 工具支持零代码扩展,MCP Server 工具实现动态服务发现——三层归一到 get_available_tools() 统一出口。
三层工具汇聚核心 — 内置 + config + MCP + ACP 四源合一
BUILTIN_TOOLS = [present_file_tool, ask_clarification_tool]
def get_available_tools(groups=None, include_mcp=True,
model_name=None, subagent_enabled=False):
# Layer 1: config.yaml 中声明的工具
tool_configs = [t for t in config.tools
if groups is None or t.group in groups]
loaded_tools = [resolve_variable(t.use, BaseTool)
for t in tool_configs]
# Layer 2: 内置工具 (视觉/子任务按需加入)
builtin_tools = BUILTIN_TOOLS.copy()
if subagent_enabled:
builtin_tools.extend(SUBAGENT_TOOLS)
if model_config.supports_vision:
builtin_tools.append(view_image_tool)
# Layer 3: MCP Server 动态工具
mcp_tools = get_cached_mcp_tools()
# 合并返回
return loaded_tools + builtin_tools + mcp_tools + acp_toolsresolve_variable — 将 config.yaml 中的字符串路径动态解析为 Python 对象
def resolve_variable(variable_path: str, expected_type=None):
"""'pkg.module:variable' → 实际 Python 对象"""
module_path, variable_name = variable_path.rsplit(":", 1)
module = import_module(module_path)
variable = getattr(module, variable_name)
if expected_type and not isinstance(variable, expected_type):
raise ValueError(f"not instance of {expected_type}")
return variable