工具注册机制

📎 引用文件

本文引用的文件 - agent/src/agent/tools.py - agent/src/tools/__init__.py - agent/src/tools/bash_tool.py - agent/src/tools/remember_tool.py - agent/src/tools/fred_macro_tool.py - agent/src/tools/web_search_tool.py - agent/src/tools/skill_writer_tool.py - README_zh.md

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件系统性说明 Vibe-Trading 中“工具注册机制”的实现原理与使用方式,重点覆盖: - BaseTool 抽象类的设计模式与元数据约定(name、description、parameters、repeatable、is_readonly) - ToolRegistry 的核心能力(注册、查找、批量导出 OpenAI 函数调用定义、统一执行封装) - 自动发现与注册流程(包扫描、子类收集、依赖检查、特殊注入) - 自定义工具开发范式(继承 BaseTool、定义 JSON Schema、实现 execute) - 版本管理、依赖检查与冲突解决策略 - 热重载与动态更新支持现状

项目结构

工具基础设施位于 agent 子模块: - 基础抽象与注册表:agent/src/agent/tools.py - 自动发现与构建器:agent/src/tools/init.py - 具体工具实现:agent/src/tools/*.py(例如 bash_tool、remember_tool、web_search_tool 等)

graph TB A["BaseTool<br/>抽象基类"] --> B["ToolRegistry<br/>注册表"] C["自动发现<br/>build_registry()"] --> B D["具体工具实现<br/>BashTool / RememberTool / WebSearchTool ..."] --> C E["MCP 远程工具包装"] --> C

图表来源 - agent/src/agent/tools.py:13-95 - agent/src/tools/__init__.py:33-245

章节来源 - agent/src/agent/tools.py:13-95 - agent/src/tools/__init__.py:1-245

核心组件

章节来源 - agent/src/agent/tools.py:13-95 - agent/src/tools/__init__.py:33-245

架构总览

下图展示了从“工具类定义”到“注册表可用”的完整链路,包括自动发现、依赖检查、参数注入与 MCP 扩展。

sequenceDiagram participant Dev as "开发者" participant Reg as "build_registry()" participant Disc as "_discover_subclasses()" participant RT as "ToolRegistry" participant MCP as "MCP 包装器" Dev->>Reg : 调用 build_registry(...) Reg->>Disc : 扫描 src.tools 包并收集 BaseTool 子类 Disc-->>Reg : 返回候选工具类列表 loop 遍历每个工具类 Reg->>Reg : 检查是否启用 shell 工具策略 Reg->>Reg : 调用 cls.check_available() alt 依赖满足 Reg->>RT : 根据类型注入参数并 register(tool) else 依赖不满足 Reg->>Reg : 记录日志并跳过 end end opt 配置了 MCP 服务器 Reg->>MCP : 构建远程工具包装器 MCP-->>Reg : 返回工具实例列表 Reg->>RT : 批量 register(mcp tools) end Reg-->>Dev : 返回已就绪的 ToolRegistry

图表来源 - agent/src/tools/__init__.py:33-245 - agent/src/agent/tools.py:54-95

详细组件分析

BaseTool 抽象类

classDiagram class BaseTool { +string name +string description +dict parameters +bool repeatable +bool is_readonly +check_available() bool +execute(**kwargs) string +to_openai_schema() dict }

图表来源 - agent/src/agent/tools.py:13-52

章节来源 - agent/src/agent/tools.py:13-52

ToolRegistry 注册表

flowchart TD Start(["调用 registry.execute(name, params)"]) --> Lookup{"是否存在工具?"} Lookup --> |否| ErrNotFound["返回 {status:error, error:'未找到'}"] Lookup --> |是| TryExec["调用 tool.execute(**params)"] TryExec --> ExecOK{"执行成功?"} ExecOK --> |是| ReturnOK["返回工具输出(JSON字符串)"] ExecOK --> |否| LogErr["记录异常日志"] LogErr --> ReturnErr["返回 {status:error, tool:name, error:异常信息}"]

图表来源 - agent/src/agent/tools.py:72-84

章节来源 - agent/src/agent/tools.py:54-95

自动发现与注册流程(build_registry)

flowchart TD A["开始 build_registry"] --> B["_discover_subclasses() 扫描并缓存"] B --> C{"遍历工具类"} C --> D{"是否 shell 工具且未启用?"} D --> |是| SkipShell["跳过并记录"] D --> |否| E{"check_available() ?"} E --> |False| SkipDep["跳过并记录"] E --> |True| F{"是否需要注入参数?"} F --> |是| Inject["注入 session_id/memory/callback 等"] F --> |否| NewInst["构造默认实例"] Inject --> G["registry.register(tool)"] NewInst --> G G --> H{"是否配置 MCP 服务器?"} H --> |是| I["构建并注册 MCP 工具包装器"] H --> |否| J["结束"] I --> J

图表来源 - agent/src/tools/__init__.py:33-245

章节来源 - agent/src/tools/__init__.py:33-245

自定义工具开发示例

以下以 BashTool、RememberTool、WebSearchTool、SkillFileTool 为例,展示如何继承 BaseTool 并遵循规范: - 定义 name、description、parameters(JSON Schema)、repeatable、is_readonly - 实现 execute(**kwargs),返回 JSON 字符串 - 必要时重写 check_available() 声明依赖

classDiagram class BashTool { +name = "bash" +description +parameters +repeatable = True +is_readonly = False +execute(**kwargs) string } class RememberTool { +name = "remember" +description +parameters +repeatable = True +is_readonly = False +execute(**kwargs) string } class WebSearchTool { +name = "web_search" +check_available() bool +parameters +repeatable = True +execute(**kwargs) string } class SkillFileTool { +name = "skill_file" +parameters +repeatable = True +is_readonly = False +execute(**kwargs) string } BashTool --|> BaseTool RememberTool --|> BaseTool WebSearchTool --|> BaseTool SkillFileTool --|> BaseTool

图表来源 - agent/src/tools/bash_tool.py:16-84 - agent/src/tools/remember_tool.py:13-178 - agent/src/tools/web_search_tool.py:135-334 - agent/src/tools/skill_writer_tool.py:235-274

章节来源 - agent/src/tools/bash_tool.py:16-84 - agent/src/tools/remember_tool.py:13-178 - agent/src/tools/web_search_tool.py:135-334 - agent/src/tools/skill_writer_tool.py:235-274

依赖检查与可用性控制(check_available)

章节来源 - agent/src/agent/tools.py:29-36 - agent/src/tools/fred_macro_tool.py:99-107 - agent/src/tools/web_search_tool.py:139-150

版本管理与冲突解决

章节来源 - README_zh.md:1394-1416

热重载与动态更新支持

章节来源 - README_zh.md:1408-1416

依赖关系分析

graph LR BR["build_registry"] --> DS["_discover_subclasses"] BR --> TR["ToolRegistry"] BR --> MCPW["MCP 包装器"] Tools["具体工具类"] --> BR Tools --> TR

图表来源 - agent/src/tools/__init__.py:33-245 - agent/src/agent/tools.py:54-95

章节来源 - agent/src/tools/__init__.py:33-245 - agent/src/agent/tools.py:54-95

性能考量

[本节为通用指导,无需特定文件引用]

故障排查指南

章节来源 - agent/src/tools/__init__.py:136-153 - agent/src/agent/tools.py:72-84 - agent/src/tools/web_search_tool.py:232-334

结论

Vibe-Trading 的工具注册机制以 BaseTool 契约为核心,结合自动发现、依赖检查与参数注入,提供了可扩展、可插拔的工具生态。ToolRegistry 提供统一的注册、查询与执行接口,并保证错误可观测与可恢复。对于远程 MCP 工具,系统在命名冲突、授权门控与失败隔离方面做了完善设计。当前版本不支持热重载,需通过进程重启完成配置更新。

[本节为总结,无需特定文件引用]

附录