今天把跨群感知插件里一个挺烦的配置问题彻底处理了一遍:别人下载安装插件后,会看到我本机已经配置过的模型列表;而且模型下拉经常要重启 AstrBot 才会刷新出来。
这两个问题本质上是连在一起的。
问题一:插件包把本机模型配置一起带出去了
最开始为了让配置页里的模型下拉自动出现可选项,我在插件启动时读取 AstrBot 当前 provider 列表,然后把它写回插件目录下的 _conf_schema.json。
这样做短期看很方便:
- 配置页能直接看到模型下拉
- 不需要手动输入 provider id
但副作用也很明显:
_conf_schema.json被污染成了“当前机器的本地状态”- 一旦把插件目录打包、上传 GitHub、或者别人直接从仓库拉取
- 这些模型名就会跟着插件一起发出去
结果就是:别人下载插件后,会直接看到我本地已经配置过的模型列表。
这显然不对。
问题二:模型下拉只能重启后刷新
把模型列表改成只在运行时刷新、不再写回磁盘之后,泄露问题是解决了,但新的问题又暴露出来:
- AstrBot 整体启动时,模型下拉能刷新
- 但只是安装/重载插件时,经常还是不刷新
- 最后还得重启整个 AstrBot,体验很差
一开始我把刷新逻辑挂在 on_astrbot_loaded,后来测试区日志证明了一个关键事实:
on_astrbot_loaded 只会在 AstrBot 整体启动完成时触发,不会在单独重载插件时再次触发。
这就是为什么“删掉模型后重载插件没反应,只有重启 AstrBot 才恢复”的根因。
最终修法
这次正式版做了三件事:
1)不再把运行时模型列表写回 _conf_schema.json
彻底去掉了把 provider 列表落盘的逻辑。
也就是说,插件运行时可以知道当前有哪些模型,但这些信息只存在于运行时内存里,不会再写回插件目录。
这样别人下载插件时,拿到的就是干净版本,不会再看到我本机的模型配置。
2)把仓库里的 _conf_schema.json 清回默认值
把这两个字段的 options 都清回了默认空值:
summarize_provider_idvision_provider_id
这样 GitHub 仓库本身也恢复成了“干净包”。
3)把自动刷新时机补到插件加载/重载
除了保留 on_astrbot_loaded,又补上了:
on_plugin_loaded- 延迟 5 秒再补刷一次
这样现在的行为变成:
- AstrBot 整体启动时会自动刷新
- 插件安装完成时会自动刷新
- 插件重载时也会自动刷新
- 如果 provider 初始化稍慢,延迟补刷还能兜底一次
这个版本在测试区实测已经可用。
这次修复后的结果
现在正式版已经具备下面这些特性:
- 下载插件时不会再携带本机模型列表
- 模型下拉不再依赖把 schema 写回磁盘
- 插件安装/重载后,大多数情况下不需要重启整个 AstrBot 就能刷新模型选项
这类问题本质上不是功能难,而是很容易把“运行时状态”和“发布包内容”混在一起。开发时图省事写回文件,发布时就会把本地环境一起带出去。
这次算是把这个坑填平了。
部分信息可能已经过时