在 JSON Schema 基础上扩展一个保留字段:
x-ui 的内容决定用什么组件、怎么展示、怎么动态联动。
1. 基础字段
2. 数据源相关
3. 验证与交互
4. 特殊组件约定
modelProviderSelect
- 用于选择模型提供商(OpenAI、Anthropic、Azure、Ollama 等)
dataSource = "system.providers"
modelSelect
- 用于选择具体模型
- 需要依赖
provider dataSource = "system.models"dependency = "provider"
promptEditor
- 用于编辑 Prompt,支持多行、语法高亮、变量插值
jsonEditor
- 用于编辑 JSON 对象,带格式校验
codeEditor
- 用于编辑代码(支持语言高亮,如 js, ts, python)
5. 示例 Schema
这样一来:
- 前端 UI 渲染器只需要识别
x-ui.component,其余逻辑由x-ui字段驱动。 - 插件开发者只需写 schema,就能自动获得智能化配置体验。
- 扩展性强,可以统一适配未来的 Embedding、OCR、VLM、VectorStore 插件。
如何表示 SECRET 的input 字段
好问题 👍,SECRET 类型的字段(比如 API Key、Token、密码)在 schema UI 里需要特殊处理:- 前端渲染时要显示为密码输入框(
type="password"或遮罩)。 - 存储时需要区分:不回显原始值,而是用
"******"或空值占位。 - Schema 中可以显式标记,让前端 UI 渲染器知道这是一个密钥字段。
扩展规范方案
在x-ui 里增加 component: "secretInput",并支持以下属性:
示例 Schema
前端渲染效果
apiKey显示为 密码输入框,默认遮罩显示。- 如果
revealable: true,UI 上有 👁 按钮,用户可切换显示/隐藏。 - 编辑配置时,如果后端返回
"******"代表已有值,用户不改就继续使用原值。
额外安全考虑
- 前端表单提交时,如果
apiKey === "******",表示不修改,后端应保留旧值。 - 如果提交了新值,则后端替换旧值。
- 日志、导出配置时跳过 SECRET 字段。
要不要我帮你把 SECRET 字段 再抽象成一个通用接口(比如
ISchemaSecretField),这样和普通字段区分得更清晰?
抽象成一个通用接口
👌好的,我们把 SECRET 字段抽象成一个通用接口,既能和普通字段保持一致,又能明确标识“这是一个需要特殊处理的敏感字段”。🔐 通用接口设计
🔧 使用示例
🔒 前端处理规范
-
渲染时:
secretInput渲染为密码框(type=password)。- 如果
revealable: true,增加 👁 切换按钮。
-
加载配置时:
- 后端返回
******代表已有值,前端不展示真实内容。
- 后端返回
-
保存配置时:
- 如果提交的值仍为
******→ 保持旧值不变。 - 如果提交了新值 → 更新存储并覆盖旧值。
- 如果提交的值仍为
-
导出配置/日志:
- 忽略 SECRET 字段或输出
******,避免泄露。
- 忽略 SECRET 字段或输出
这样以后
secretInput 就是一个 一级公民 UI 组件,和 textInput、select 一样可以被 schema 统一驱动。
要不要我再帮你定义一个 完整的 ISchemaUIComponent 联合类型,把所有 x-ui 组件(select、slider、secretInput、promptEditor 等)都规范起来?