Technical Guide

08. Tools 源码:工具是怎么注册和调用的

从 deerflow/tools 目录看工具注册、内置工具、MCP 工具转换和工具调用的关键文件。

这一篇看哪些文件

工具源码主要在:

backend/packages/harness/deerflow/tools/

建议先看这些文件:

tools.py
types.py
sync.py
mcp_metadata.py
skill_manage_tool.py
builtins/

不要一上来把所有 builtins 都读完。先看工具的结构,再看具体工具。

types.py:先看工具长什么样

types.py 通常会定义工具相关的数据结构。

读源码时先找这些问题:

工具输入怎么描述?
工具输出怎么描述?
是否有 metadata?
错误信息怎么表达?

这比直接看某个工具实现更有效。

tools.py:工具怎么组织

tools.py 通常是工具集合和注册逻辑的核心位置。

你要看:

内置工具在哪里加载
外部工具怎么并入
工具列表如何提供给 Agent

如果以后要加一个自定义 Tool,大概率会从这里找到入口。

builtins:内置工具参考实现

内置工具目录:

backend/packages/harness/deerflow/tools/builtins/

这里的文件适合作为模板。

例如:

clarification_tool.py
task_tool.py
tool_search.py
view_image_tool.py
present_file_tool.py

读这些工具时,不要只看函数体。重点看它们如何定义参数、如何返回结果、如何把错误交给 Agent。

MCP 工具转换

MCP 不是直接变成 Agent 能用的 Python 函数。

中间需要转换和 metadata 处理。相关文件包括:

mcp_metadata.py
backend/packages/harness/deerflow/mcp/tools.py

这也是为什么 18、19 两篇会单独讲 MCP。

实践:源码定位练习

这次不改代码,只沿着一个内置工具走一遍。建议选择 clarification_tool.py,完成下面几项:

  • builtins/ 中找到它的实现;
  • 找到工具的名称、输入参数和返回值;
  • 回到 tools.py,确认它怎样进入工具集合;
  • 找到工具最终提供给 Agent 的位置;
  • 记下一个失败或异常分支。

完成标准

不看本文,你仍然能重新说出这条线:

具体工具实现
→ 工具聚合
→ Agent 获得工具列表
→ 模型发起调用
→ 工具结果返回

路径名称不必背,但你要能在仓库里重新找到它们。

多走一步

再选一个实现方式明显不同的工具,例如 view_image_tool.py。比较两个工具的输入、输出和错误处理,写下它们为什么不能共用同一种返回结构。

这一篇你要记住

加工具前,先弄清工具系统的三层:

类型定义
|
注册/聚合
|
具体工具实现

下一篇会动手设计一个给研究型 Agent 用的工具能力。