是看到了这个文档,但尝试了几种写法似乎都不生效
Dynamic:动态类型 | Koishi
文档里提到通过可以通过服务来动态获取并设置它 ctx.schema.set(),我尝试了额外新加个插件服务。
然后在需要使用这个动态构型的插件 Schema.dynamic() 它并依赖那个服务,可是在 koishi 的配置页里对应的配置项是不生效的
现在用的是两个配置项,一个 list 和 choice ,插件加载后执行异步函数去从线上获取数组,然后用 this.ctx.scope.update(this.cfg) 的方式重载,再第二次同样的函数里再检查 choice 的字符串在不在数组里面()
2 个赞
感谢指路!
我可能需要帮助,使用了手机和PC的不同浏览器,包括照着插件的方式写一个和直接配置 ChatLuna 和它所需的依赖,KOISHI 的插件配置页的确不会出现展开选项()
类似这样(也可能是可选依赖未全部配置好,之后会去获取其它平台的key试试)
(值是有效的,只是配置页不会随之更新)
也许应该采用邪道办法 XD
打算将获取到的数据先保存到文件里,然后在插件开始前就读取并当作配置类型()
然后用update或restart强行重载()
2 个赞
总而言之言而总之,邪道方法be like:
const models: Array<string> = eval(readModels())
export const Config: Schema<Config> = Schema.object({
api: Schema.object({
key: Schema.string().description('密钥').required().default('password'),
url: Schema.object({
base: Schema.string().required().description('主机地址'),
path: Schema.string().required().description('接口路径')
}).description('地址').collapse(),
model: Schema.union([
Schema.string().description('自定义').required(),
Schema.union(models).description('线上值').required(),
]).description('使用的模型'),
models: Schema.array(String).role('table').description('拉取到的模型列表'),
test: Schema.boolean().description('允许使用未知模型').default(false).experimental(),
stream: Schema.boolean().description('流式传输').default(false).experimental(),
provider: Schema.union(providers).description('供应模式').default('OpenAI API Compatible'),
}).description('基础'),
dev: Schema.object({
info: Schema.boolean().default(false).description('启用调试输出')
}).description('开发')
})
function readModels(): string {
if (fs.existsSync(path.join('.', Global.config.modelsDataPath)) === false) {
Global.logger.info('不存在模型列表数据,需手动输入模型名称')
return ''
}
try {
return fs.readFileSync(path.join('.', Global.config.modelsDataPath)).toString()
} catch (error) {
throw error
}
}