6.4 KiB
6.4 KiB
扩展模块修复说明
问题描述
- 数据库错误:点击扩展配置时报错
ERROR: relation "ai_extension_settings" does not exist - UI 不符合预期:原来是表格式,用户希望是折叠面板式(类似原版 SillyTavern)
修复内容
1. 简化数据库设计
问题:原设计使用独立的 ai_extension_settings 表存储用户配置,导致表不存在时报错。
解决方案:取消 ai_extension_settings 表,直接将配置存储在 ai_extensions 表的 settings 字段中。
修改文件:
server/model/app/ai_extension.go- 注释掉AIExtensionSettings结构体server/initialize/gorm.go- 移除AIExtensionSettings表注册server/service/app/extension.go- 简化配置获取和更新逻辑
2. 重新设计 UI 为折叠面板式
新界面特点:
- ✅ 折叠面板布局(类似原版 SillyTavern)
- ✅ 每个扩展可展开查看详情和配置
- ✅ 启用/禁用开关在标题栏
- ✅ 配置项根据 manifest.json 动态生成
- ✅ 支持多种配置类型:
- 文本输入(text/string)
- 数字输入(number)
- 布尔开关(boolean/checkbox)
- 下拉选择(select)
- 文本域(textarea)
- 滑块(slider)
新文件:
web-app-vue/src/views/extension/ExtensionListNew.vue- 全新的折叠面板式界面
修改文件:
web-app-vue/src/router/index.ts- 更新路由指向新界面
3. 优化配置处理逻辑
后端改进:
// GetExtensionSettings - 改进版
func (es *ExtensionService) GetExtensionSettings(userID, extensionID uint) (map[string]interface{}, error) {
// 1. 验证扩展存在
// 2. 返回扩展的 settings 字段
// 3. 如果为空,从 manifestData 中提取默认配置
// 4. 确保总是返回有效的配置对象(至少是空对象)
}
// UpdateExtensionSettings - 简化版
func (es *ExtensionService) UpdateExtensionSettings(userID, extensionID uint, settings map[string]interface{}) error {
// 直接更新扩展表的 settings 字段
}
使用说明
安装扩展
支持三种安装方式:
- 从文件导入:上传
manifest.json文件 - 从 Git 安装:输入 Git 仓库 URL(支持 GitHub、GitLab、Gitee 等)
- 从 URL 安装:直接输入
manifest.json文件的 URL
管理扩展
- 启用/禁用:点击扩展标题栏的开关
- 查看详情:点击扩展面板展开
- 配置扩展:展开后直接编辑配置项,自动保存
- 导出扩展:点击"导出"按钮下载
manifest.json - 卸载扩展:点击删除按钮(系统扩展不可卸载)
配置项说明
扩展的配置项根据 manifest.json 中的 settings 定义自动生成。例如:
{
"name": "example-extension",
"settings": {
"apiKey": {
"type": "text",
"label": "API 密钥",
"description": "请输入您的 API 密钥",
"placeholder": "sk-..."
},
"maxRetries": {
"type": "number",
"label": "最大重试次数",
"min": 1,
"max": 10,
"step": 1
},
"enabled": {
"type": "boolean",
"label": "启用此功能"
}
}
}
manifest.json 配置项类型
支持的配置项类型:
| 类型 | 说明 | 示例 |
|---|---|---|
text / string |
文本输入框 | API 密钥、URL 等 |
number |
数字输入框 | 重试次数、超时时间等 |
boolean / checkbox |
开关 | 启用/禁用功能 |
select |
下拉选择 | 选择模型、语言等 |
textarea |
多行文本 | 提示词、说明文字等 |
slider |
滑块 | 温度、概率等 |
测试步骤
- 重启后端服务:确保新的代码生效
- 访问扩展管理页面:
/extension - 安装一个测试扩展:
- 创建一个简单的
manifest.json - 从文件导入或 Git URL 安装
- 创建一个简单的
- 测试配置功能:
- 点击扩展面板展开
- 修改配置项
- 刷新页面确认配置已保存
- 测试启用/禁用:
- 点击开关切换状态
- 确认状态已保存
示例 manifest.json
{
"name": "example-extension",
"display_name": "示例扩展",
"version": "1.0.0",
"description": "这是一个示例扩展",
"author": "Your Name",
"type": "ui",
"category": "utilities",
"settings": {
"enabled": {
"type": "boolean",
"label": "启用扩展",
"description": "是否启用此扩展的功能",
"default": true
},
"apiEndpoint": {
"type": "text",
"label": "API 端点",
"description": "API 服务器地址",
"placeholder": "https://api.example.com"
},
"timeout": {
"type": "number",
"label": "超时时间(秒)",
"min": 1,
"max": 300,
"step": 1,
"default": 30
},
"model": {
"type": "select",
"label": "选择模型",
"options": [
{ "label": "GPT-4", "value": "gpt-4" },
{ "label": "GPT-3.5", "value": "gpt-3.5-turbo" }
],
"default": "gpt-3.5-turbo"
},
"prompt": {
"type": "textarea",
"label": "系统提示词",
"rows": 5,
"placeholder": "输入系统提示词..."
},
"temperature": {
"type": "slider",
"label": "温度",
"min": 0,
"max": 2,
"step": 0.1,
"default": 1.0
}
}
}
技术细节
数据库字段
扩展配置存储在 ai_extensions 表的以下字段:
manifest_data(JSONB):完整的manifest.json内容,包含settings定义settings(JSONB):用户的实际配置值
配置加载顺序
- 从
ai_extensions.settings读取用户配置 - 如果为空,从
ai_extensions.manifest_data.settings提取默认值 - 合并配置,用户配置优先
配置保存
用户修改配置后,直接更新 ai_extensions.settings 字段。
注意事项
- 配置格式:
manifest.json中的settings字段是配置项的定义(schema),而不是配置值 - 默认值:可以在配置项定义中指定
default字段 - 验证:前端会根据类型自动验证(如
min、max、step等) - 自动保存:修改配置后会自动保存,无需手动点击保存按钮
未来改进
- 支持更多配置项类型(颜色选择器、文件选择器等)
- 配置项分组和标签页
- 配置导入/导出
- 配置重置到默认值
- 配置历史记录
- 扩展依赖检查和冲突提示