配置构型的动态类型(#dynamic-动态类型)应该如何使用?

是看到了这个文档,但尝试了几种写法似乎都不生效
Dynamic:动态类型 | Koishi

文档里提到通过可以通过服务来动态获取并设置它 ctx.schema.set(),我尝试了额外新加个插件服务。
然后在需要使用这个动态构型的插件 Schema.dynamic() 它并依赖那个服务,可是在 koishi 的配置页里对应的配置项是不生效的

现在用的是两个配置项,一个 list 和 choice ,插件加载后执行异步函数去从线上获取数组,然后用 this.ctx.scope.update(this.cfg) 的方式重载,再第二次同样的函数里再检查 choice 的字符串在不在数组里面()

2 个赞

你可以参考一些已经使用了这个功能的插件

1 个赞

感谢指路!

我可能需要帮助,使用了手机和PC的不同浏览器,包括照着插件的方式写一个和直接配置 ChatLuna 和它所需的依赖,KOISHI 的插件配置页的确不会出现展开选项()

类似这样(也可能是可选依赖未全部配置好,之后会去获取其它平台的key试试)


image


(值是有效的,只是配置页不会随之更新)

也许应该采用邪道办法 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
        }
}