工具注册表管理

📎 引用文件

本文引用的文件 - agent/src/agent/tools.py - agent/src/tools/__init__.py - agent/src/tools/bash_tool.py - agent/src/tools/remember_tool.py - agent/tests/test_tool_registry_security.py

目录

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

简介

本文件面向 Vibe-Trading 的工具注册表管理系统,聚焦 ToolRegistry 类及其在工具动态注册、查找与生命周期管理中的核心作用。文档将系统阐述: - 工具注册流程与名称冲突处理 - 内存管理与生命周期 - get_definitions 方法如何生成 OpenAI 兼容的工具定义列表 - execute 方法的安全执行机制(异常捕获与错误处理) - 工具发现算法的实现细节与扩展机制 - 最佳实践与性能优化建议

项目结构

Vibe-Trading 的工具基础设施由“基础抽象 + 自动发现 + 注册表”三部分构成: - 基础抽象:BaseTool 定义了工具的通用接口与 OpenAI 函数调用格式转换能力 - 自动发现:通过扫描 src/tools 包下的模块并收集 BaseTool 子类,完成本地工具的自动发现与实例化 - 注册表:ToolRegistry 提供统一的注册、查询、批量导出与统一执行入口

graph TB subgraph "工具基础设施" A["BaseTool<br/>抽象基类"] B["ToolRegistry<br/>注册表"] C["build_registry()<br/>自动发现与装配"] end subgraph "具体工具" D["BashTool"] E["RememberTool"] F["其他工具..."] end A --> B C --> B D --> C E --> C F --> C

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

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

核心组件

章节来源 - agent/src/agent/tools.py:13-94 - agent/src/tools/__init__.py:66-245

架构总览

下图展示了从构建到执行的端到端流程:自动发现本地工具、按策略过滤、按需注入依赖、可选接入 MCP 工具,最终形成 ToolRegistry;上层通过 execute(name, params) 安全调用工具。

sequenceDiagram participant Caller as "调用方" participant Builder as "build_registry()" participant Discover as "_discover_subclasses()" participant Reg as "ToolRegistry" participant Tool as "具体工具(BaseTool)" Caller->>Builder : 构建注册表(含参数) Builder->>Discover : 扫描并导入模块 Discover-->>Builder : 返回所有 BaseTool 子类 loop 遍历每个工具类 Builder->>Reg : register(实例化后的工具) end Note over Builder,Reg : 可注入共享依赖/应用策略(如禁用shell工具) Caller->>Reg : execute(name, params) Reg->>Tool : tool.execute(**params) Tool-->>Reg : 返回JSON字符串 Reg-->>Caller : 返回JSON字符串

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

详细组件分析

ToolRegistry 类

classDiagram class BaseTool { +string name +string description +dict parameters +bool repeatable +bool is_readonly +check_available() bool +execute(**kwargs) string +to_openai_schema() dict } class ToolRegistry { -_tools : Dict~string, BaseTool~ +register(tool) void +get(name) BaseTool? +get_definitions() dict[] +execute(name, params) string +tool_names : string[] +__len__() int +__contains__(name) bool } ToolRegistry --> BaseTool : "持有实例"

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

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

工具自动发现与装配(build_registry)

flowchart TD Start(["开始"]) --> Scan["扫描src/tools模块"] Scan --> Collect["收集BaseTool子类(缓存)"] Collect --> Loop{"遍历工具类"} Loop --> |Shell工具且未启用| SkipShell["跳过"] Loop --> |check_available=False| SkipAvail["跳过"] Loop --> |需要注入依赖| Inject["注入依赖/参数"] Loop --> |普通工具| NewInst["实例化工具"] Inject --> Register["注册到ToolRegistry"] NewInst --> Register SkipShell --> Next["下一个"] SkipAvail --> Next Register --> Next Next --> EndMCP{"是否配置MCP?"} EndMCP --> |否| Return["返回注册表"] EndMCP --> |是| AppendMCP["追加MCP工具包装"] AppendMCP --> Return

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

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

安全执行机制(execute)

flowchart TD S(["进入ToolRegistry.execute"]) --> Lookup["根据name查找工具"] Lookup --> Found{"找到工具?"} Found --> |否| ErrNotFound["返回JSON: {status:error, error:'not found'}"] Found --> |是| CallExec["调用tool.execute(**params)"] CallExec --> Ok{"成功?"} Ok --> |是| RetOK["返回工具执行结果的JSON字符串"] Ok --> |否| Catch["捕获异常并记录日志"] Catch --> RetErr["返回JSON: {status:error, tool:name, error:str(exc)}"]

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

章节来源 - agent/src/agent/tools.py:72-84

OpenAI 兼容定义生成(get_definitions)

章节来源 - agent/src/agent/tools.py:42-51 - agent/src/agent/tools.py:68-70

工具示例与最佳实践

BashTool(命令执行)

章节来源 - agent/src/tools/bash_tool.py:16-84 - agent/tests/test_tool_registry_security.py:10-27

RememberTool(持久记忆)

章节来源 - agent/src/tools/remember_tool.py:13-178 - agent/src/tools/__init__.py:116-151

依赖关系分析

graph LR ToolsInit["tools/__init__.py<br/>build_registry"] --> AgentTools["agent/tools.py<br/>BaseTool/ToolRegistry"] ToolsInit --> BashTool["bash_tool.py"] ToolsInit --> RememberTool["remember_tool.py"] ToolsInit -.可选.-> MCP["mcp 集成(条件导入)"]

图表来源 - agent/src/tools/__init__.py:66-245 - agent/src/agent/tools.py:13-94

章节来源 - agent/src/tools/__init__.py:66-245 - agent/src/agent/tools.py:13-94

性能考量

[本节为通用性能建议,无需特定文件引用]

故障排查指南

章节来源 - agent/src/tools/__init__.py:136-153 - agent/src/agent/tools.py:72-84 - agent/tests/test_tool_registry_security.py:10-27

结论

ToolRegistry 提供了简洁而强大的工具管理能力:通过 BaseTool 抽象统一工具契约,借助自动发现机制降低集成成本,配合策略化装配与安全的 execute 入口,使工具生态既灵活又可控。结合白名单过滤、依赖注入与 MCP 扩展,可在不同运行环境下精准控制可用工具集,保障安全性与可维护性。

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

附录

工具注册最佳实践

章节来源 - agent/src/tools/__init__.py:66-245 - agent/src/agent/tools.py:13-51

工具发现算法与扩展机制

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