第 24 章:插件系统

1 | 卷四:纵深 |
QwenPaw 有两种扩展机制——Skill(技能)和 Plugin(插件)。技能我们已经在第 14 章和第 16 章详细讲过。这一章看 Plugin 系统——它和 Skill 有什么区别?插件怎么被发现和加载?插件能注册什么?
Plugin vs Skill——两种扩展机制
1 | Skill(技能) |
Skill 是”文档”,Plugin 是”代码”。Skill 让 LLM 学会新能力,Plugin 让 QwenPaw 获得新功能。
插件的生命周期
1 | 1. 发现:PluginLoader.discover_plugins() 扫描插件目录 |
PluginManifest——插件的元数据
plugin.json 定义插件的元数据:1
2
3
4
5
6
7
8
9
10
11
12{
"id": "my-plugin",
"name": "My Plugin",
"version": "1.0.0",
"description": "Does something useful",
"author": "Developer",
"entry": {
"backend": "my_plugin/main.py"
},
"dependencies": [],
"min_version": "0.1.0"
}
插件注册 API
1 | # 插件代码示例 |
PluginRegistry——单例注册表
PluginRegistry 用单例模式管理所有注册:1
2
3
4
5class PluginRegistry:
_providers: Dict[str, ProviderRegistration]
_startup_hooks: List[HookRegistration]
_shutdown_hooks: List[HookRegistration]
_control_commands: List[ControlCommandRegistration]
钩子按 priority 排序——数字越小越早执行。
插件发现目录
PluginLoader 扫描的目录:
- 配置中指定的插件路径
~/.qwenpaw/plugins/- 其他自定义路径
每个包含 plugin.json 的子目录被视为一个插件。
工程权衡
为什么 Plugin 和 Skill 要分开?
Skill 是轻量级的——Markdown 文档,不需要编程能力。Plugin 是重量级的——Python 代码,能注册 Provider、钩子、命令。分开让两种用户群体都能扩展 QwenPaw:非程序员用 Skill,程序员用 Plugin。
为什么用动态 import 而非 pip 安装?
插件的代码量通常很小,放在目录里比发布到 PyPI 更简单。动态 import 让用户可以直接放文件到插件目录,不需要 pip install。但也支持 pip 安装——通过 entry_points 注册。
自检
- 知道 Plugin 扩展功能(注册 Provider、钩子),Skill 扩展知识(注入提示词)
- 知道插件通过
plugin.json+register(api)注册 - 知道 PluginRegistry 是单例,管理所有注册
- 知道钩子按 priority 排序执行
下一章我们看命令行与部署——从终端启动到 Docker 容器。