Skip to content

Commit 86cf62f

Browse files
committed
feat(llm): optimize LLM list display and management with simplified UI, delete functionality, and improved editing experience
1 parent 43e3ba8 commit 86cf62f

File tree

9 files changed

+1244
-81
lines changed

9 files changed

+1244
-81
lines changed

LLM_LIST_OPTIMIZATION_SUMMARY.md

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
# LLM列表优化总结
2+
3+
## 优化目标
4+
5+
根据您的要求,对LLM模型列表进行以下优化:
6+
1. **简化显示**:列表项只显示Name和ID
7+
2. **添加删除功能**:为自定义模型提供删除按钮
8+
3. **双击编辑**:双击列表项可弹出修改对话框
9+
4. **修改状态跟踪**:修改后设置项标记为modified状态
10+
11+
## 实现方案
12+
13+
### 1. 简化表格结构
14+
15+
#### 原始表格(5列)
16+
```
17+
| Name | Type | URL | Status | Actions |
18+
```
19+
20+
#### 优化后表格(3列)
21+
```
22+
| Name | ID | Delete |
23+
```
24+
25+
#### 代码实现
26+
```kotlin
27+
private val llmTableModel = object : DefaultTableModel(arrayOf("Name", "ID", "Delete"), 0) {
28+
override fun isCellEditable(row: Int, column: Int): Boolean {
29+
return column == 2 // Only delete column is "editable" (clickable)
30+
}
31+
}
32+
```
33+
34+
### 2. 智能删除按钮
35+
36+
#### 自定义渲染器
37+
```kotlin
38+
private inner class DeleteButtonRenderer : DefaultTableCellRenderer() {
39+
override fun getTableCellRendererComponent(...): Component {
40+
val modelName = table?.getValueAt(row, 0) as? String
41+
val isCustomModel = isCustomLLM(modelName ?: "")
42+
43+
if (isCustomModel) {
44+
return deleteButton // 显示删除按钮
45+
} else {
46+
return emptyLabel // GitHub Copilot模型显示空白
47+
}
48+
}
49+
}
50+
```
51+
52+
#### 功能特点
53+
- **只对自定义模型显示删除按钮**
54+
- **GitHub Copilot模型为只读**,不显示删除按钮
55+
- **确认对话框**:删除前弹出确认提示
56+
57+
### 3. 双击编辑功能
58+
59+
#### 鼠标事件监听
60+
```kotlin
61+
llmTable.addMouseListener(object : java.awt.event.MouseAdapter() {
62+
override fun mouseClicked(e: java.awt.event.MouseEvent) {
63+
if (e.clickCount == 2) {
64+
val row = llmTable.rowAtPoint(e.point)
65+
val column = llmTable.columnAtPoint(e.point)
66+
67+
// 只允许在Name或ID列双击(不包括Delete列)
68+
if (row >= 0 && column < 2) {
69+
editLLMAtRow(row)
70+
}
71+
}
72+
}
73+
})
74+
```
75+
76+
#### 编辑逻辑
77+
- **自定义模型**:双击打开编辑对话框
78+
- **GitHub Copilot模型**:显示"只读模型"提示
79+
- **列限制**:只在Name和ID列响应双击
80+
81+
### 4. 修改状态跟踪
82+
83+
#### 状态管理
84+
```kotlin
85+
// Track if settings have been modified
86+
private var isModified = false
87+
88+
private fun markAsModified() {
89+
isModified = true
90+
}
91+
```
92+
93+
#### 触发时机
94+
- **添加/编辑/删除LLM**`markAsModified()`
95+
- **更改下拉框选择**:所有下拉框都添加了监听器
96+
- **更改复选框状态**`useDefaultForAllCheckbox`
97+
98+
#### 状态检查
99+
```kotlin
100+
fun isModified(settings: AutoDevSettingsState): Boolean {
101+
return isModified || // 新增的修改标记
102+
settings.maxTokenLength != maxTokenLengthParam.value ||
103+
// ... 其他字段检查
104+
}
105+
```
106+
107+
### 5. 表格布局优化
108+
109+
#### 列宽设置
110+
```kotlin
111+
llmTable.columnModel.getColumn(0).preferredWidth = 200 // Name
112+
llmTable.columnModel.getColumn(1).preferredWidth = 300 // ID
113+
llmTable.columnModel.getColumn(2).preferredWidth = 80 // Delete
114+
llmTable.columnModel.getColumn(2).maxWidth = 80 // 固定删除列宽度
115+
```
116+
117+
#### 数据显示
118+
- **GitHub Copilot模型**:显示`model.name``model.id`
119+
- **自定义模型**:显示`llm.name``llm.name`(作为ID)
120+
121+
## 用户体验提升
122+
123+
### 1. 简洁的界面
124+
- **减少信息冗余**:从5列减少到3列
125+
- **突出重要信息**:只显示Name和ID
126+
- **清晰的操作区域**:删除按钮独立一列
127+
128+
### 2. 直观的交互
129+
- **双击编辑**:符合用户习惯的编辑方式
130+
- **智能按钮显示**:只对可操作的模型显示删除按钮
131+
- **即时反馈**:删除前确认,编辑后立即更新
132+
133+
### 3. 状态感知
134+
- **修改跟踪**:任何更改都会标记为modified
135+
- **保存提示**:IDE会提示用户保存更改
136+
- **一致性**:与IDE的设置管理保持一致
137+
138+
## 技术实现亮点
139+
140+
### 1. 自定义表格组件
141+
- **继承DefaultTableModel**:保持与Swing的兼容性
142+
- **自定义渲染器**:实现条件显示删除按钮
143+
- **事件处理**:优雅处理双击和按钮点击
144+
145+
### 2. 状态管理
146+
- **细粒度跟踪**:精确跟踪每个更改
147+
- **统一接口**:通过`isModified()`方法统一检查
148+
- **自动重置**:保存后自动重置修改状态
149+
150+
### 3. 用户安全
151+
- **确认对话框**:防止误删除
152+
- **只读保护**:GitHub Copilot模型不可删除/编辑
153+
- **错误处理**:优雅处理删除失败的情况
154+
155+
## 编译状态
156+
157+
**编译成功**:所有代码通过编译验证
158+
🔧 **功能完整**:实现了所有要求的功能
159+
🎯 **用户体验**:提供了直观、安全的操作界面
160+
161+
## 使用说明
162+
163+
### 查看模型
164+
- 表格显示所有可用的LLM模型
165+
- Name列显示模型名称
166+
- ID列显示模型标识符
167+
168+
### 编辑模型
169+
- **双击**Name或ID列可编辑自定义模型
170+
- GitHub Copilot模型双击会显示只读提示
171+
172+
### 删除模型
173+
- 点击Delete列的删除按钮
174+
- 只有自定义模型显示删除按钮
175+
- 删除前会弹出确认对话框
176+
177+
### 修改状态
178+
- 任何更改都会标记设置为modified状态
179+
- IDE会在适当时候提示保存更改
180+
181+
这次优化彻底简化了LLM列表的显示和操作,提供了更好的用户体验,同时保持了功能的完整性和安全性。

LLM_MODEL_PARAMETERS_REDESIGN.md

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
# LLM模型参数重新设计
2+
3+
## 设计目标
4+
5+
根据您的建议,重新设计LLM模型的参数结构,简化配置并提高灵活性:
6+
7+
### 新的参数结构
8+
- **url**: API端点URL
9+
- **token**: API密钥(可选,因为GitHub Copilot是动态刷新)
10+
- **maxTokens**: 最大Token数量
11+
- **customRequest**: 自定义请求配置(包含headers和body)
12+
- **移除responseResolver**: 根据customRequest的stream参数自动决定
13+
14+
## 实现方案
15+
16+
### 1. 新的数据模型
17+
18+
#### CustomRequest类
19+
```kotlin
20+
@Serializable
21+
data class CustomRequest(
22+
val headers: Map<String, String> = emptyMap(), // 自定义请求头
23+
val body: Map<String, @Contextual Any> = emptyMap(), // 自定义请求体
24+
val stream: Boolean = true // 是否使用流式响应
25+
)
26+
```
27+
28+
#### 更新的LlmConfig类
29+
```kotlin
30+
@Serializable
31+
data class LlmConfig(
32+
val name: String,
33+
val description: String = "",
34+
val url: String,
35+
val auth: Auth = Auth("Bearer"), // Token可选
36+
val maxTokens: Int = 4096, // 最大Token数
37+
val customRequest: CustomRequest = CustomRequest(), // 自定义请求配置
38+
val modelType: ModelType = ModelType.Default,
39+
40+
// 保留旧字段用于向后兼容
41+
@Deprecated("Use customRequest instead")
42+
val requestFormat: String = "",
43+
@Deprecated("Use customRequest.stream to determine response format")
44+
val responseFormat: String = ""
45+
)
46+
```
47+
48+
### 2. 智能响应格式处理
49+
50+
#### 自动响应格式决定
51+
```kotlin
52+
fun getResponseFormatByStream(): String {
53+
return if (customRequest.stream) {
54+
"\$.choices[0].delta.content" // 流式格式
55+
} else {
56+
"\$.choices[0].message.content" // 非流式格式
57+
}
58+
}
59+
```
60+
61+
#### 向后兼容转换
62+
```kotlin
63+
fun toLegacyRequestFormat(): String {
64+
return buildJsonObject {
65+
if (customRequest.headers.isNotEmpty()) {
66+
put("customHeaders", buildJsonObject {
67+
customRequest.headers.forEach { (key, value) ->
68+
put(key, value)
69+
}
70+
})
71+
}
72+
put("customFields", buildJsonObject {
73+
customRequest.body.forEach { (key, value) ->
74+
when (value) {
75+
is String -> put(key, value)
76+
is Number -> put(key, JsonPrimitive(value))
77+
is Boolean -> put(key, value)
78+
else -> put(key, value.toString())
79+
}
80+
}
81+
})
82+
}.toString()
83+
}
84+
```
85+
86+
### 3. 增强的UI界面
87+
88+
#### 新的配置对话框字段
89+
- **Name**: 模型名称
90+
- **Description**: 模型描述
91+
- **URL**: API端点
92+
- **Token (optional)**: API密钥(标注为可选)
93+
- **Max Tokens**: 最大Token数量
94+
- **Use streaming response**: 流式响应复选框
95+
- **Custom Headers (JSON)**: 自定义请求头(JSON格式)
96+
- **Request Body (JSON)**: 请求体配置(JSON格式)
97+
98+
#### 预设模板支持
99+
为常用服务商提供预设配置:
100+
- **OpenAI**: 标准OpenAI API配置
101+
- **Azure OpenAI**: Azure特定配置
102+
- **Anthropic Claude**: Claude API配置
103+
- **Google Gemini**: Gemini API配置
104+
- **Ollama (Local)**: 本地Ollama配置
105+
106+
### 4. 向后兼容性
107+
108+
#### 自动迁移
109+
```kotlin
110+
companion object {
111+
fun fromLegacyFormat(requestFormat: String): CustomRequest {
112+
// 解析旧的requestFormat JSON
113+
// 转换为新的CustomRequest结构
114+
// 自动检测stream参数
115+
}
116+
}
117+
```
118+
119+
#### 废弃字段标记
120+
- 使用`@Deprecated`注解标记旧字段
121+
- 保留字段以确保现有配置不会丢失
122+
- 提供迁移提示和工具
123+
124+
## 主要优势
125+
126+
### 1. 简化配置
127+
- **统一参数**: 所有配置集中在CustomRequest中
128+
- **智能默认**: 根据stream参数自动决定响应格式
129+
- **可选Token**: 支持GitHub Copilot等动态刷新场景
130+
131+
### 2. 增强灵活性
132+
- **自定义Headers**: 支持任意HTTP头部
133+
- **灵活Body**: 支持复杂的请求体结构
134+
- **流式控制**: 简单的布尔值控制流式/非流式
135+
136+
### 3. 更好的用户体验
137+
- **可视化配置**: JSON编辑器替代复杂的文本框
138+
- **实时验证**: 配置时即时验证JSON格式
139+
- **预设模板**: 快速配置常用服务商
140+
141+
### 4. 技术优势
142+
- **类型安全**: 使用Kotlin数据类确保类型安全
143+
- **序列化支持**: 完整的JSON序列化/反序列化
144+
- **向后兼容**: 平滑迁移路径
145+
146+
## 使用示例
147+
148+
### OpenAI配置
149+
```json
150+
{
151+
"headers": {},
152+
"body": {
153+
"model": "gpt-3.5-turbo",
154+
"temperature": 0.0,
155+
"max_tokens": 4096
156+
},
157+
"stream": true
158+
}
159+
```
160+
161+
### 带自定义Headers的配置
162+
```json
163+
{
164+
"headers": {
165+
"X-Custom-Header": "value",
166+
"Authorization-Extra": "extra-token"
167+
},
168+
"body": {
169+
"model": "custom-model",
170+
"temperature": 0.7,
171+
"top_p": 0.9
172+
},
173+
"stream": false
174+
}
175+
```
176+
177+
### Ollama本地配置
178+
```json
179+
{
180+
"headers": {},
181+
"body": {
182+
"model": "llama2",
183+
"temperature": 0.0,
184+
"stream": true
185+
},
186+
"stream": true
187+
}
188+
```
189+
190+
## 迁移指南
191+
192+
### 自动迁移
193+
1. 检测旧的requestFormat配置
194+
2. 解析JSON结构
195+
3. 提取headers和body
196+
4. 检测stream参数
197+
5. 创建新的CustomRequest对象
198+
199+
### 手动迁移
200+
1. 打开LLM配置对话框
201+
2. 查看自动填充的配置
202+
3. 根据需要调整参数
203+
4. 保存新配置
204+
205+
## 编译状态
206+
207+
**编译成功**: 所有新代码已通过编译验证
208+
⚠️ **废弃警告**: 预期的向后兼容警告
209+
🔄 **功能完整**: 支持完整的CRUD操作和测试
210+
211+
这次重新设计彻底简化了LLM模型的参数结构,提供了更好的灵活性和用户体验,同时保持了完整的向后兼容性。

0 commit comments

Comments
 (0)