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