Files
st/docs/扩展模块修复说明.md
2026-02-11 23:44:09 +08:00

229 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 扩展模块修复说明
## 问题描述
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. **自动保存**:修改配置后会自动保存,无需手动点击保存按钮
## 未来改进
- [ ] 支持更多配置项类型(颜色选择器、文件选择器等)
- [ ] 配置项分组和标签页
- [ ] 配置导入/导出
- [ ] 配置重置到默认值
- [ ] 配置历史记录
- [ ] 扩展依赖检查和冲突提示