Skip to content

Commit 45765b7

Browse files
committed
feat(llm): refactor LLM settings for improved user experience and add GitHub Copilot model support
1 parent 6c332a7 commit 45765b7

18 files changed

+2406
-159
lines changed

CHECKBOX_DELAY_FIX.md

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
# 复选框延时刷新问题修复
2+
3+
## 问题描述
4+
5+
`SimplifiedLLMSettingComponent` 中,当用户点击 "Use default model for all categories" 复选框时,会出现延时刷新的问题。
6+
7+
## 原因分析
8+
9+
### 原始实现问题
10+
```kotlin
11+
private fun updateCategoryDropdownsVisibility() {
12+
// 这会重新构建整个面板,导致延时
13+
applySettings(settings)
14+
}
15+
```
16+
17+
**问题根源**
18+
1. 每次复选框状态改变时,都会调用 `applySettings(settings)`
19+
2. `applySettings` 方法会重新构建整个UI面板
20+
3. 重建过程包括:
21+
- 清空面板 (`panel.removeAll()`)
22+
- 重新加载所有下拉框数据 (`updateAllDropdowns()`)
23+
- 重新加载表格数据 (`updateLLMTable()`)
24+
- 重新构建整个FormBuilder结构
25+
- 调用 `panel.invalidate()``panel.repaint()`
26+
27+
这个过程非常耗时,特别是当需要从GitHub Copilot加载模型数据时。
28+
29+
## 解决方案
30+
31+
### 优化后的实现
32+
33+
#### 1. 添加独立的分类面板
34+
```kotlin
35+
// Category section panel for dynamic visibility
36+
private var categoryPanel: JPanel? = null
37+
```
38+
39+
#### 2. 创建独立的分类面板方法
40+
```kotlin
41+
private fun createCategoryPanel(): JPanel {
42+
val categoryFormBuilder = FormBuilder.createFormBuilder()
43+
.addLabeledComponent(JBLabel("Category-Specific Models"), JPanel(), 1, false)
44+
.addLabeledComponent(JBLabel("Plan:"), planLLMDropdown, 1, false)
45+
.addLabeledComponent(JBLabel("Act:"), actLLMDropdown, 1, false)
46+
.addLabeledComponent(JBLabel("Completion:"), completionLLMDropdown, 1, false)
47+
.addLabeledComponent(JBLabel("Embedding:"), embeddingLLMDropdown, 1, false)
48+
.addLabeledComponent(JBLabel("FastApply:"), fastApplyLLMDropdown, 1, false)
49+
.addSeparator()
50+
51+
return categoryFormBuilder.panel
52+
}
53+
```
54+
55+
#### 3. 优化可见性控制
56+
```kotlin
57+
private fun updateCategoryDropdownsVisibility() {
58+
// 只切换面板可见性,不重建UI
59+
categoryPanel?.isVisible = !useDefaultForAllCheckbox.isSelected
60+
61+
// 轻量级的布局更新
62+
panel.revalidate()
63+
panel.repaint()
64+
}
65+
```
66+
67+
#### 4. 修改主面板构建逻辑
68+
```kotlin
69+
// 在applySettings中
70+
// Create category panel separately for dynamic visibility
71+
categoryPanel = createCategoryPanel()
72+
73+
formBuilder
74+
// ... 其他组件 ...
75+
76+
// Add category panel (visibility controlled dynamically)
77+
formBuilder.addComponent(categoryPanel!!)
78+
79+
// Set initial visibility
80+
updateCategoryDropdownsVisibility()
81+
```
82+
83+
## 性能对比
84+
85+
### 原始方案
86+
- ❌ 重建整个UI面板
87+
- ❌ 重新加载所有数据
88+
- ❌ 重新创建所有组件
89+
- ❌ 延时明显(特别是有网络请求时)
90+
91+
### 优化方案
92+
- ✅ 只切换面板可见性
93+
- ✅ 保持现有数据和组件
94+
- ✅ 轻量级布局更新
95+
- ✅ 即时响应,无延时
96+
97+
## 技术要点
98+
99+
### 1. 组件复用
100+
- 分类下拉框组件只创建一次
101+
- 通过可见性控制显示/隐藏
102+
- 避免重复创建和销毁组件
103+
104+
### 2. 布局更新
105+
- `panel.revalidate()`: 重新计算布局
106+
- `panel.repaint()`: 重绘界面
107+
- 这两个操作比重建整个面板快得多
108+
109+
### 3. 状态保持
110+
- 用户在分类下拉框中的选择得以保持
111+
- 不会因为UI重建而丢失状态
112+
113+
## 适用场景
114+
115+
这种优化方案适用于:
116+
- 需要动态显示/隐藏UI组件的场景
117+
- 包含大量数据加载的复杂面板
118+
- 对用户交互响应速度有要求的界面
119+
120+
## 注意事项
121+
122+
1. **初始化顺序**:确保在设置事件监听器之前创建好所有组件
123+
2. **空指针检查**:使用 `categoryPanel?.isVisible` 进行安全调用
124+
3. **布局更新**:必须调用 `revalidate()``repaint()` 来更新布局
125+
126+
这个修复彻底解决了复选框点击时的延时问题,提供了流畅的用户体验。

LLM_SETTINGS_REFACTOR_SUMMARY.md

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
# LLM设置页面重构总结
2+
3+
## 重构目标
4+
5+
根据用户反馈,原有的LLM设置页面存在以下问题:
6+
- 允许设置默认LLM配置,又有根据不同类型(Act,Plan等)分别设置不同模型的UI
7+
- 冗余的JSON输入框
8+
- 模型列表较为混乱
9+
- 多种配置方式重叠,用户体验差
10+
11+
## 重构方案
12+
13+
采用**简化统一的设计**,重新组织UI结构:
14+
15+
### 1. 新的UI结构
16+
```
17+
┌─ 基础设置 ─┐
18+
│ - 语言设置 │
19+
│ - 最大Token │
20+
│ - 延迟设置 │
21+
└─────────────┘
22+
23+
┌─ 默认模型配置 ─┐
24+
│ - 默认模型选择 │
25+
│ - 使用默认模型 │
26+
└─────────────────┘
27+
28+
┌─ 分类应用 ─┐
29+
│ - Plan模型 │
30+
│ - Act模型 │
31+
│ - Completion │
32+
│ - Embedding │
33+
│ - FastApply │
34+
└─────────────┘
35+
36+
┌─ 模型管理 ─┐
37+
│ - 已配置模型列表 │
38+
│ - 添加/编辑/删除 │
39+
│ - 测试连接 │
40+
└─────────────────┘
41+
```
42+
43+
### 2. 主要改进
44+
45+
#### 数据模型优化
46+
- **新增字段**
47+
- `defaultModelId`: 默认模型ID
48+
- `useDefaultForAllCategories`: 是否对所有分类使用默认模型
49+
- **废弃字段**:标记旧的配置字段为`@Deprecated`,保持向后兼容
50+
51+
#### UI组件重构
52+
- **SimplifiedLLMSettingComponent**: 新的简化设置组件
53+
- **移除冗余**:删除JSON输入框,统一使用可视化界面
54+
- **统一管理**:GitHub Copilot模型和自定义模型在同一列表中显示
55+
- **条件显示**:分类模型选择只在不使用默认模型时显示
56+
57+
#### 新增功能
58+
- **配置向导**`LLMConfigurationWizard` - 帮助新用户快速配置第一个LLM
59+
- **迁移工具**`LegacyConfigMigration` - 自动迁移旧配置到新系统
60+
- **预设模板**:支持OpenAI、Azure、Claude、Gemini、Ollama等常用服务商
61+
62+
## 实现的文件
63+
64+
### 核心组件
65+
1. **SimplifiedLLMSettingComponent.kt** - 新的简化设置组件
66+
2. **AutoDevSettingsState.kt** - 更新的设置状态类
67+
3. **AutoDevSettingsConfigurable.kt** - 更新的配置提供者
68+
69+
### 辅助工具
70+
4. **LLMConfigurationWizard.kt** - 配置向导
71+
5. **LegacyConfigMigration.kt** - 迁移工具
72+
6. **SimplifiedAutoDevConfigurable.kt** - 备用配置类
73+
74+
### 模型增强
75+
7. **LlmConfig.kt** - 增强的模型配置类,新增`forCategory()`方法
76+
77+
### 测试
78+
8. **SimplifiedLLMSettingComponentTest.kt** - 单元测试
79+
80+
## 主要特性
81+
82+
### 1. 简化的用户体验
83+
- **一键配置**:通过向导快速设置第一个LLM
84+
- **默认模型**:设置一个默认模型,自动应用到所有分类
85+
- **按需定制**:可选择为特定分类设置专用模型
86+
87+
### 2. 向后兼容
88+
- 保留所有旧的配置字段(标记为废弃)
89+
- 自动迁移旧配置到新系统
90+
- 新旧系统可以并存
91+
92+
### 3. 统一管理
93+
- GitHub Copilot模型和自定义模型统一显示
94+
- 每个模型都可以独立测试连接
95+
- 简化的添加/编辑/删除操作
96+
97+
### 4. 智能默认
98+
- 新用户首次打开设置时自动显示配置向导
99+
- 检测到旧配置时提示迁移
100+
- 合理的默认值和预设模板
101+
102+
## 用户使用流程
103+
104+
### 新用户
105+
1. 首次打开设置 → 自动显示配置向导
106+
2. 选择LLM提供商 → 自动填充配置模板
107+
3. 输入API密钥 → 测试连接
108+
4. 完成配置 → 自动设为默认模型
109+
110+
### 现有用户
111+
1. 打开设置 → 检测到旧配置,提示迁移
112+
2. 确认迁移 → 自动转换为新格式
113+
3. 查看新界面 → 更简洁的配置选项
114+
4. 可选择使用默认模型或分类配置
115+
116+
## 技术亮点
117+
118+
### 1. 渐进式重构
119+
- 不破坏现有功能
120+
- 平滑的迁移路径
121+
- 可回退的设计
122+
123+
### 2. 模块化设计
124+
- 组件职责清晰
125+
- 易于测试和维护
126+
- 可扩展的架构
127+
128+
### 3. 用户体验优先
129+
- 减少配置复杂度
130+
- 提供智能默认值
131+
- 清晰的视觉层次
132+
133+
## 编译状态
134+
135+
✅ 代码编译成功,无错误
136+
⚠️ 有一些废弃API的警告(预期的,用于向后兼容)
137+
138+
## 下一步建议
139+
140+
1. **用户测试**:在实际环境中测试新的设置界面
141+
2. **文档更新**:更新用户文档,说明新的配置方式
142+
3. **逐步清理**:在几个版本后考虑移除废弃的字段
143+
4. **功能扩展**:根据用户反馈添加更多预设模板
144+
145+
这次重构彻底解决了原有设置页面的混乱问题,提供了更好的用户体验,同时保持了完整的向后兼容性。

core/src/233/main/resources/META-INF/autodev-core.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
<httpRequestHandler implementation="cc.unitmesh.devti.mcp.host.MCPService"/>
8181
<postStartupActivity implementation="cc.unitmesh.devti.update.AutoDevUpdateStartupActivity"/>
8282
<postStartupActivity implementation="cc.unitmesh.devti.mcp.MCPServerStartupValidator"/>
83+
<postStartupActivity implementation="cc.unitmesh.devti.llm2.GithubCopilotModelInitActivity"/>
8384
<notificationGroup id="UnitMesh.MCPServer" displayType="BALLOON"/>
8485
</extensions>
8586

0 commit comments

Comments
 (0)