自定义工具开发

📎 引用文件

本文引用的文件 - agent/src/agent/tools.py - agent/src/tools/__init__.py - agent/src/tools/market_data_tool.py - agent/src/tools/web_search_tool.py - agent/src/tools/skill_writer_tool.py - agent/src/tools/trade_journal_tool.py - agent/tests/test_web_search_tool.py - agent/tests/test_institutional_holdings_tool.py

目录

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

简介

本指南面向希望在本项目中扩展“工具”能力的开发者。你将学习如何继承 BaseTool 创建可被自动发现与注册的工具,如何编写符合 JSON Schema 的参数定义,如何实现 execute 方法以完成输入校验、业务逻辑与结果格式化,以及如何测试、调试和优化你的工具。文末提供从简单数据处理到复杂多步骤工作流的完整示例路径与最佳实践建议。

项目结构

工具系统位于 agent 子模块中: - 基础框架与注册机制:BaseTool、ToolRegistry、自动发现与构建器 - 具体工具实现:市场数据、网络搜索、技能管理、交易记录分析等 - 测试:覆盖参数校验、错误处理、重试与回退策略等

graph TB subgraph "工具基础设施" A["BaseTool<br/>抽象基类"] B["ToolRegistry<br/>工具注册表"] C["build_registry<br/>自动发现与装配"] end subgraph "具体工具" D["MarketDataTool"] E["WebSearchTool"] F["SaveSkillTool / SkillFileTool"] G["TradeJournalTool"] end A --> B C --> B C --> D C --> E C --> F C --> G

图表来源 - 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:33-245

核心组件

关键要点 - 新增工具只需在 src/tools 下新建一个包含 BaseTool 子类的模块,即可被自动发现。 - 通过 parameters 声明 JSON Schema,由 to_openai_schema 暴露给上层 LLM 调用。 - execute 必须返回 JSON 字符串;ToolRegistry.execute 会捕获异常并包装为错误信封。

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

架构总览

下图展示了工具从定义到执行的端到端流程:

sequenceDiagram participant Dev as "开发者" participant Reg as "ToolRegistry" participant Tool as "具体工具(BaseTool子类)" participant LLM as "上层调用方" Dev->>Reg : 定义工具类(继承BaseTool) Note over Dev,Reg : 将类放入src/tools/*.py Reg->>Reg : build_registry() 自动发现 Reg-->>LLM : get_definitions() 输出OpenAI函数定义 LLM->>Reg : execute(name, params) Reg->>Tool : tool.execute(**params) Tool-->>Reg : 返回JSON字符串 Reg-->>LLM : 标准化结果(成功或错误信封)

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

详细组件分析

BaseTool 与 ToolRegistry

classDiagram class BaseTool { +string name +string description +object parameters +bool repeatable +bool is_readonly +check_available() bool +execute(**kwargs) string +to_openai_schema() object } class ToolRegistry { -dict _tools +register(tool) void +get(name) BaseTool +get_definitions() list +execute(name, params) string +tool_names list } ToolRegistry --> BaseTool : "持有并调用"

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

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

自动发现与注册机制

flowchart TD Start(["开始"]) --> Scan["扫描src/tools下模块"] Scan --> Collect["收集BaseTool子类"] Collect --> Filter{"check_available?"} Filter --> |False| Skip["跳过该工具"] Filter --> |True| Inject["按需注入依赖(session_id/memory等)"] Inject --> Register["注册到ToolRegistry"] Register --> End(["结束"])

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

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

JSON Schema 参数编写规范

参考实现 - MarketDataTool:codes(数组)、source(枚举)、interval(字符串默认值)、max_rows(整数默认值) - WebSearchTool:query(字符串必填)、max_results(整数默认值与上限约束) - SaveSkillTool/SkillFileTool:action(枚举)、skill_name/path/content 等组合必填

章节来源 - agent/src/tools/market_data_tool.py:20-91 - agent/src/tools/web_search_tool.py:155-169 - agent/src/tools/skill_writer_tool.py:57-74 - agent/src/tools/skill_writer_tool.py:246-268

execute 方法实现要求

参考实现 - MarketDataTool:直接委托给 fetch_market_data_json,返回 JSON 字符串 - WebSearchTool:严格校验 query,限制 max_results,多后端重试与回退,最终返回统一信封 - TradeJournalTool:封装 analyze_trade_journal,透传参数并返回 JSON

章节来源 - agent/src/tools/market_data_tool.py:94-103 - agent/src/tools/web_search_tool.py:172-200 - agent/src/tools/trade_journal_tool.py:530-535

工具测试方法

参考测试 - test_web_search_tool:多后端回退、重试、无结果、持久失败提示、CN 回退、max_results 上限 - test_institutional_holdings_tool:schema 字段完整性、枚举值、自动发现、错误参数返回信封

章节来源 - agent/tests/test_web_search_tool.py:1-199 - agent/tests/test_institutional_holdings_tool.py:1634-1664

调试技巧

章节来源 - agent/src/tools/__init__.py:136-154

性能优化建议

章节来源 - agent/src/tools/market_data_tool.py:84-88 - agent/src/tools/web_search_tool.py:25-31

依赖关系分析

graph LR Base["BaseTool"] --> Reg["ToolRegistry"] Tools["各工具实现"] --> Reg Build["build_registry"] --> Reg Ext["外部依赖<br/>网络/第三方库"] --> Tools

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

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

性能考虑

故障排查指南

章节来源 - agent/src/tools/__init__.py:136-154 - agent/src/tools/web_search_tool.py:172-200

结论

通过继承 BaseTool 并遵循 JSON Schema 规范与 execute 契约,你可以快速开发出可被自动发现、注册和调用的工具。结合完善的测试、调试与性能优化策略,能够保证工具在生产环境中的稳定性与可维护性。建议在开发过程中充分利用项目的自动发现机制与统一错误处理,使工具生态更加健壮。

附录

从零到一:创建一个简单的数据处理工具

复杂多步骤工作流工具

工具打包、分发与版本管理最佳实践