系统插件项目构建

通过三个机制实现插件项目快速构建

1. 零配置机制

两个核心机制:

  • 约定优于配置
  • 自动发现机制

实现细节:

  • 系统启动: 系统启动时调用initTools, 包含initBuiltInTools和refreshUploadedTools两部分
  • 自动发现: 判断是开发环境还是生产环境, 扫描对应的路径目录, 得到工具目录数组, 对于工具目录数组的每一个元素(工具目录), 调用LoadToolsByFilename, Filename即目录名称
  • 动态加载: 动态导入插件, 识别是工具还是工具集, 约定默认toolId和icon, 加载工具(或副工具集下的所有子工具)
  • 自动注册: 将加载的工具添加到全局插件列表, 实现插件自动可用, 无需手动配置

2. 脚本一键生成模板

  • 使用nodejs全局变量: __dirname, process
  • 提前创建好工具和工具集模板
  • copyTemplate函数: 如果是文件夹则递归调用, 如果是文件则复制, 这样就把模板变成能实际开发的代码结构

3. 插件热插拔

系统插件分为内置插件和用户自定义插件两部分, 插件热插拔针对的是用户自定义插件这一部分

本质: 插件刷新机制, 分为通知, 检查, 执行三部分, 其中通知发生在用户上传/删除插件请求, 检查和执行发生在获取插件列表请求

  • 通知: refreshVersionKey 刷新版本键

    • 版本键存储在redis中, 用户每一次添加或删除自定义插件, 都生成新的uuid作为新的版本键, 解决分布式环境下数据一致性的问题(不同服务实例发现版本键更新, 就会重新加载系统插件)
    • 用于通知系统, 下一次刷新时, 插件有变化
  • 检测: getCachedData 封装好的获取缓存函数

    • 下一次请求时, 要获取插件列表, 在获取前先调用getCachedData, 检测缓存中的版本键是否变化
    • 检测到版本键变化, 调用refreshUploadedTools, 重新加载插件
  • 执行: refreshUploadedTools 刷新插件

    • 实现: 获取当前内存中的插件和数据库中的插件, 比较差异, 找出需要删除和需要新增的插件, 并行删除和新增, 并重新初始化”用户自定义插件”列表

4. 插件热插拔的拓展: 插件的存储方式

  • S3: 存储插件的具体文件内容
  • MongoDB: 存储插件的元数据, 便于管理, 查找
  • 本地文件: 内置插件和用户自定义插件的本地缓存(其实是存在磁盘而不是内存中), 避免每次执行都要网络请求, 加快执行速度

主线程与子线程

系统插件支持主线程运行和子线程运行两种模式, 通过在插件中配置isWorkerRun字段即可指定
某些插件涉及网络请求或者复杂计算, 放在子线程中执行能有效防止主线程阻塞导致的工作流整体阻塞

流程: HTTP请求运行插件, 检查isWorkerRun, false则主线程执行插件, true则创建子线程Worker, 执行子线程

HTTP流响应实现: 主线程传递一个回调函数给子线程, 子线程产生了流式数据后, 调用回调函数, 将数据传给主线程, 主线程再包装成HTTP响应发送出去

原因: 主线程response对象无法跨线程传递, HTTP连接绑定的是主线程的Socket, 子线程有独立的事件循环, 无法访问主线程的事件循环

插件生态贡献

贡献了15个系统插件, 丰富了整个插件生态, 尤其是多模态领域

15个插件有: base64转图片, 墨迹天气每日天气查询, chatppt文生ppt, nano banana文生图, base64转文件, minimax tts, md转ppt, 阿里云百炼通义千问图像编辑, 豆包seedream图像编辑, 豆包音乐生成模型, 36kr新闻热榜, 每日新闻热榜, gpt-image图像编辑, whisper stt, sora2

分类:

  • 多模态: chatppt文生ppt, nano banana文生图, minimax tts, 阿里云百炼通义千问图像编辑, 豆包seedream图像编辑, 豆包音乐生成模型, gpt-image图像编辑, whisper stt, sora2
  • 工具类: base64转图片, base64转文件, md转ppt
  • 实用类: 墨迹天气每日天气查询, 36kr新闻热榜, 每日新闻热榜