229 lines
6.4 KiB
Markdown
229 lines
6.4 KiB
Markdown
# 扩展模块修复说明
|
||
|
||
## 问题描述
|
||
|
||
1. **数据库错误**:点击扩展配置时报错 `ERROR: relation "ai_extension_settings" does not exist`
|
||
2. **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. 优化配置处理逻辑
|
||
|
||
**后端改进**:
|
||
|
||
```go
|
||
// 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 字段
|
||
}
|
||
```
|
||
|
||
## 使用说明
|
||
|
||
### 安装扩展
|
||
|
||
支持三种安装方式:
|
||
|
||
1. **从文件导入**:上传 `manifest.json` 文件
|
||
2. **从 Git 安装**:输入 Git 仓库 URL(支持 GitHub、GitLab、Gitee 等)
|
||
3. **从 URL 安装**:直接输入 `manifest.json` 文件的 URL
|
||
|
||
### 管理扩展
|
||
|
||
1. **启用/禁用**:点击扩展标题栏的开关
|
||
2. **查看详情**:点击扩展面板展开
|
||
3. **配置扩展**:展开后直接编辑配置项,自动保存
|
||
4. **导出扩展**:点击"导出"按钮下载 `manifest.json`
|
||
5. **卸载扩展**:点击删除按钮(系统扩展不可卸载)
|
||
|
||
### 配置项说明
|
||
|
||
扩展的配置项根据 `manifest.json` 中的 `settings` 定义自动生成。例如:
|
||
|
||
```json
|
||
{
|
||
"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` | 滑块 | 温度、概率等 |
|
||
|
||
## 测试步骤
|
||
|
||
1. **重启后端服务**:确保新的代码生效
|
||
2. **访问扩展管理页面**:`/extension`
|
||
3. **安装一个测试扩展**:
|
||
- 创建一个简单的 `manifest.json`
|
||
- 从文件导入或 Git URL 安装
|
||
4. **测试配置功能**:
|
||
- 点击扩展面板展开
|
||
- 修改配置项
|
||
- 刷新页面确认配置已保存
|
||
5. **测试启用/禁用**:
|
||
- 点击开关切换状态
|
||
- 确认状态已保存
|
||
|
||
## 示例 manifest.json
|
||
|
||
```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):用户的实际配置值
|
||
|
||
### 配置加载顺序
|
||
|
||
1. 从 `ai_extensions.settings` 读取用户配置
|
||
2. 如果为空,从 `ai_extensions.manifest_data.settings` 提取默认值
|
||
3. 合并配置,用户配置优先
|
||
|
||
### 配置保存
|
||
|
||
用户修改配置后,直接更新 `ai_extensions.settings` 字段。
|
||
|
||
## 注意事项
|
||
|
||
1. **配置格式**:`manifest.json` 中的 `settings` 字段是配置项的**定义**(schema),而不是配置值
|
||
2. **默认值**:可以在配置项定义中指定 `default` 字段
|
||
3. **验证**:前端会根据类型自动验证(如 `min`、`max`、`step` 等)
|
||
4. **自动保存**:修改配置后会自动保存,无需手动点击保存按钮
|
||
|
||
## 未来改进
|
||
|
||
- [ ] 支持更多配置项类型(颜色选择器、文件选择器等)
|
||
- [ ] 配置项分组和标签页
|
||
- [ ] 配置导入/导出
|
||
- [ ] 配置重置到默认值
|
||
- [ ] 配置历史记录
|
||
- [ ] 扩展依赖检查和冲突提示
|