客户端内部实现(类加载与配置装配)
插件的架构与生命周期契约(流水线与插入点、扫描根、双轨分流、启用/禁用与互斥、依赖门禁) 以及安全红线都已在知识卡片各自成页,本页不再重复:
| 主题 | 卡片 |
|---|---|
| 流水线与插件插入点 · 扫描根 · 生命周期 · 双轨 · 启用禁用 · 依赖门禁 | 运行架构与生命周期 |
12 种 type 的分工与选型 | 类型总览与选型 |
| 安全红线 · 运行环境 · 私有依赖 | 运行环境与安全红线 |
| 全部卡片 | 插件开发文档 |
本页只讲客户端内部怎么把插件装起来:Python 类加载与配置装配。
1. Python 类加载
对 asr / mt / tts / middleware / assistant / interpretation / tool:
- 解析
entrypoint为相对路径.py:ClassName(没有冒号时ClassName = "Plugin") importlib从文件加载模块- 要求类继承
BasePlugin子类 cls(manifest)→initialize(config)- 实例缓存;卸载时调
shutdown()
数据类(
glossary/i18n/theme)不走这一步——它们只被当作数据挂载。entrypoint的完整规则见 目录结构与 mod.json。
外部插件(非内置)的 initialize() 跑在后台线程,宿主在真正需要前会等它收敛—— 所以 initialize 里阻塞几秒不会卡 UI,但也不要用它启动本地服务 (见 本地服务型引擎强制契约)。
2. 配置装配
| 情况 | 宿主怎么做 | 详见 |
|---|---|---|
| 普通字段 | 用 config_schema 渲染通用表单(工坊卡片内联 / 独立设置 Tab) | config_schema 声明式表单 |
| 定制 UX(去获取 Key / 测试连接 / 双通道 Base URL) | 优先加载插件的 ui_extensions.settings_view QML;不会仅凭 schema 自动生成 | 自定义设置页 |
| 持久化 | 存进 QSettings plugins_config/<id>;Python 侧读 self._config,变更走 update_config | 配置与私有数据 |
3. 安全模型
无沙箱:Python 插件与主程序同进程、同权限。数据类(theme / glossary / i18n)风险较低, 脚本类请审计后安装。完整红线(禁止运行时 pip、隐私、越权改配置等)见 运行环境与安全红线。
