在过去的实践中,QChatGPT 直接从 plugins
目录下加载所有.py
文件,这些文件中可以自由自定义类和函数,并通过 QChatGPT 提供的 API 注册插件类。但在实践中,我们发现此种加载方式存在以下问题:
- 插件类命名和插件包(目录)命名不符,造成混乱。
- 一个插件内实际上可以注册多个插件类,未强制限定。
- 插件需要的依赖由 QChatGPT 动态安装,这对网络环境较差的用户以及使用 Docker 的情况很不友好。
- 通过源代码发布的插件代码,管理松散,不利于分发。
- 遍历插件目录下所有py模块,无统一的入口
- QChatGPT 可能会以可执行文件的形式发布,这时动态安装依赖将不再可行。
- 插件的发布和管理需要更加规范和统一的方式。
在新的扩展方案中,插件仍然是存储在plugins
目录下,下载的插件
以zip包形式存放,正在开发的插件直接以源码形式存放。
树状图:
- main.py
- plugins/
- __init__.py
- PluginA/
- __init__.py
- plugin_a.py
- PluginB/
- __init__.py
- plugin_b.py
- PluginC.zip
- PluginD.zip
插件zip包内部结构:
# PluginC.zip
- PluginC.zip
- plugins/
- PluginC/
- __init__.py
- plugin_c.py
- PyMySQL/
- __init__.py
- ...
QChatGPT 将各个插件的zip包添加到 sys.path
。此时,无论是开发中的插件还是下载的插件,都可以通过import plugins.PluginC
的方式导入自身的模块。
同时,先添加各个插件包,再添加plugins
目录,可以保证开发中的插件优先于下载的插件。
插件的额外依赖(非QChatGPT的依赖)直接被打包到插件的zip包中,同时,基于上述的导入路径,插件可以直接导入自己的依赖。
计划提供一个插件管理的命令行工具,用于打包、测试、上传(在GitHub Actions中自动打包)和下载插件。
插件的注册、调用等 API 将额外设计。