从零开发DeepBot自定义工具:ToolPlugin接口与TypeBox参数定义开发者指南
从零开发DeepBot自定义工具ToolPlugin接口与TypeBox参数定义开发者指南【免费下载链接】deepbotDeepBot is a system-level AI assistant built for both personal productivity and enterprise workflows — one-click setup, seamless experience, and native Feishu integration.项目地址: https://gitcode.com/gh_mirrors/de/deepbot 想给DeepBot这个系统级 AI 助手加一个专属能力吗DeepBot 是面向个人效率与企业工作流的 AI 助理支持一键配置、飞书原生集成。它的可扩展核心在于ToolPlugin 工具插件接口只需实现一个接口 用TypeBox定义参数 SchemaAI 就能自动理解并调用你的自定义工具。本文将带你从零走通「命名 → 定义 Schema → 实现 execute → 加载验证」四步流程。为什么选择 DeepBot 工具开发DeepBot 的所有内置工具Web 搜索、文件读写、邮件、飞书文档……都遵循同一套架构这意味着✅统一接口一个 ToolPlugin 接口覆盖所有工具✅AI 可理解参数用 TypeBox 描述大模型依据 description 自动填充✅配置与依赖解耦配置文件放~/.deepbot/tools/tool-name/config.json外部依赖按需动态加载✅可中断可追踪execute 支持AbortSignal用户随时可停止所有工具源码位于src/main/tools/目录官方开发指南见 TOOL-DEVELOPMENT-GUIDE.md。工具开发整体架构一览DeepBot 自定义工具由三部分构成见 tool-interface.ts 顶部注释组成部分位置说明工具代码src/main/tools/my-tool.ts实现 ToolPlugin 接口配置文件可选~/.deepbot/tools/my-tool/config.json运行时读取外部依赖可选~/.deepbot/tools/my-tool/node_modules/动态require()加载第一步在 tool-names.ts 注册工具名称工具名是 AI 调用时的唯一标识需要集中管理。打开 tool-names.ts在TOOL_NAMES常量中按UPPER_SNAKE_CASE添加一行export const TOOL_NAMES { // ...已有工具 MY_TOOL: my_tool, };命名规范速查来自官方指南字段规范示例metadata.idkebab-case不带-tool后缀web-searchmetadata.name中文显示名Web 搜索TOOL_NAMES常量UPPER_SNAKE_CASEWEB_SEARCHAgentTool.namesnake_caseAI 调用用web_searchplugin 变量名camelCase Plugin后缀webSearchToolPlugin第二步创建工具文件并定义 TypeBox 参数在src/main/tools/下新建my-tool.ts。TypeBox 参数定义是整个开发中最关键的部分——AI 全靠description决定传什么参数。ToolPlugin 接口核心字段完整接口定义见 tool-interface.tsimport { Type } from sinclair/typebox; import type { ToolPlugin } from ./registry/tool-interface; import { TOOL_NAMES } from ./tool-names; export const myToolPlugin: ToolPlugin { metadata: { id: my-tool, name: 我的工具, description: 我的自定义工具, version: 1.0.0, author: DeepBot, category: custom, // file | network | system | ai | custom tags: [custom], }, create: (options) ({ name: TOOL_NAMES.MY_TOOL, label: 我的工具, description: 执行自定义操作, parameters: Type.Object({ action: Type.Union([ Type.Literal(search), Type.Literal(create), ], { description: 操作类型 }), query: Type.String({ description: 搜索关键词 }), limit: Type.Optional(Type.Number({ description: 最大结果数 })), }), execute: async (toolCallId, params, signal) { return { content: [{ type: text, text: 执行成功 }], details: { success: true }, }; }, }), };TypeBox 常用类型速查表写法用途Type.String({ description })字符串参数Type.Number({ description })数字参数Type.Boolean({ description })布尔参数Type.Optional(Type.String(...))可选参数Type.Union([Type.Literal(a), Type.Literal(b)])枚举小技巧每个参数的description都尽量写清楚「何时用、取值范围」AI 填充参数的准确率会显著提高。可参考 example-tool.ts 中ExampleToolSchema的多操作枚举写法。execute 返回值说明content返回给AI的内容AI 基于它决定下一步动作details结构化数据用于UI 渲染或日志AI 不可见signalAbortSignal用户点击停止时触发长耗时任务务必响应第三步在 tool-loader.ts 中加载工具实现好插件后需要在 tool-loader.ts 的loadTools()方法中导入并注册import { myToolPlugin } from ../my-tool; // 在 loadTools() 方法中添加 tools.push(...await resolvePluginTools(myToolPlugin.create(pluginOpts)));进阶用法需要配置如 API Key在create中检查options.configStore并在 loader 中条件加载参考 web-search-tool.ts一个插件返回多个工具create直接返回数组即可参考 connector-tool.ts 返回 3 个工具的写法带外部依赖使用动态require()加载参考 email-tool.ts 及其 README第四步验证与最佳实践运行类型检查确认无误pnpm run type-check最后附上官方推荐的示例文件对照表来自 开发指南文件适用场景registry/example-tool.ts基础工具模板直接复制起步web-fetch-tool.ts简单工具无配置web-search-tool.ts需要 configStore 的工具connector-tool.ts返回多个工具的插件email-tool.ts带外部依赖的完整示例更多工具管理细节启用/禁用逻辑可阅读 tool-registry.ts。总结DeepBot 自定义工具开发四步走️ 在 tool-names.ts 注册名称 实现ToolPlugin接口 TypeBox 参数 Schema⚙️ 在 tool-loader.ts 中加载✅ 运行pnpm run type-check验证得益于统一的 ToolPlugin 架构与 TypeBox 声明式参数定义哪怕你只写过一点 TypeScript也能在半天内为 DeepBot 贡献一个实用的新工具。快去src/main/tools/里看看内置工具的实现找到你的灵感吧【免费下载链接】deepbotDeepBot is a system-level AI assistant built for both personal productivity and enterprise workflows — one-click setup, seamless experience, and native Feishu integration.项目地址: https://gitcode.com/gh_mirrors/de/deepbot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考