| 160 | } |
| 161 | |
| 162 | const handleSave = () => { |
| 163 | try { |
| 164 | const { provider, providerSettings, temperature } = settings |
| 165 | const currentSettings = providerSettings[provider] |
| 166 | const trimmedKey = currentSettings.apiKey.trim() |
| 167 | const trimmedBaseURL = currentSettings.baseURL.trim() |
| 168 | const trimmedModel = currentSettings.model.trim() |
| 169 | |
| 170 | // 简单验证 |
| 171 | if (!trimmedBaseURL) { |
| 172 | toast({ |
| 173 | title: "基础 URL 不能为空", |
| 174 | description: "请输入有效的 API 端点 URL", |
| 175 | variant: "destructive", |
| 176 | }) |
| 177 | return |
| 178 | } |
| 179 | |
| 180 | if (!trimmedModel) { |
| 181 | toast({ |
| 182 | title: "模型名称不能为空", |
| 183 | description: "请输入有效的模型名称", |
| 184 | variant: "destructive", |
| 185 | }) |
| 186 | return |
| 187 | } |
| 188 | |
| 189 | if (!trimmedKey) { |
| 190 | toast({ |
| 191 | title: "API 密钥不能为空", |
| 192 | description: "请输入有效的 API 密钥", |
| 193 | variant: "destructive", |
| 194 | }) |
| 195 | return |
| 196 | } |
| 197 | |
| 198 | // 更新设置 |
| 199 | const updatedSettings = { |
| 200 | ...settings, |
| 201 | providerSettings: { |
| 202 | ...settings.providerSettings, |
| 203 | [provider]: { |
| 204 | ...settings.providerSettings[provider], |
| 205 | baseURL: trimmedBaseURL, |
| 206 | model: trimmedModel, |
| 207 | apiKey: trimmedKey, |
| 208 | }, |
| 209 | }, |
| 210 | } |
| 211 | |
| 212 | // 保存到 localStorage |
| 213 | localStorage.setItem("model_settings", JSON.stringify(updatedSettings)) |
| 214 | |
| 215 | // 清除旧版设置 |
| 216 | localStorage.removeItem("openai_api_key") |
| 217 | |
| 218 | // 关闭对话框 |
| 219 | setIsOpen(false) |