diff --git a/.gitignore b/.gitignore index e9abe303..0bf14f9a 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,5 @@ dist-ssr .env.test.local .env.production.local -.vscode \ No newline at end of file +.vscode +.vercel diff --git a/README.md b/README.md index 43f1f820..b95396ac 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,18 @@ npm run build 构建后的文件将生成在 `dist` 目录下 +### 发布到vercel +```bash +# 第一次使用需要安装vercel +npm install -g vercel +# 登录vercel +vercel login + +# 发布项目 +vercel --prod + +``` + ## 使用说明 1. 首次使用需要配置 API 密钥: diff --git a/src/components/ModelManager.vue b/src/components/ModelManager.vue index 1f5ec43d..4cc11042 100644 --- a/src/components/ModelManager.vue +++ b/src/components/ModelManager.vue @@ -221,19 +221,23 @@ const cancelEdit = () => { // 保存编辑 const saveEdit = () => { try { + // 获取原始配置 + const originalConfig = modelManager.getModel(editingModel.value.key); + if (!originalConfig) { + throw new Error('找不到原始配置'); + } + + // 构建更新配置,保留原有的 apiKey const config = { name: editingModel.value.name, baseURL: editingModel.value.baseURL, models: [editingModel.value.defaultModel], - defaultModel: editingModel.value.defaultModel + defaultModel: editingModel.value.defaultModel, + apiKey: editingModel.value.apiKey.trim() || originalConfig.apiKey // 如果没有新的 apiKey,保留原有的 }; + // 更新配置 modelManager.updateModel(editingModel.value.key, config); - - // 如果提供了新的 API 密钥,则更新 - if (editingModel.value.apiKey) { - modelManager.setApiKey(editingModel.value.key, editingModel.value.apiKey); - } loadModels(); isEditing.value = false; diff --git a/src/services/model/defaults.ts b/src/services/model/defaults.ts index add3e666..42fc301f 100644 --- a/src/services/model/defaults.ts +++ b/src/services/model/defaults.ts @@ -20,8 +20,8 @@ export const defaultModels: Record = { gemini: { name: 'Google Gemini', baseURL: 'https://geminiapi.always200.com/v1beta/openai', - models: ['gemini-2.0-flash-001'], - defaultModel: 'gemini-2.0-flash-001', + models: ['gemini-2.0-flash'], + defaultModel: 'gemini-2.0-flash', apiKey: GEMINI_API_KEY, enabled: !!GEMINI_API_KEY, provider: 'gemini' diff --git a/src/services/model/manager.ts b/src/services/model/manager.ts index 98b92df4..dd73f00f 100644 --- a/src/services/model/manager.ts +++ b/src/services/model/manager.ts @@ -96,8 +96,8 @@ export class ModelManager implements IModelManager { throw new ModelConfigError(`未知的模型: ${key}`); } - // 验证配置完整性 - this.validateConfig(this.models[key]); + // 使用完整验证 + this.validateEnableConfig(this.models[key]); this.models[key].enabled = true; this.saveToStorage(); @@ -119,16 +119,35 @@ export class ModelManager implements IModelManager { * 验证模型配置 */ private validateConfig(config: ModelConfig): void { - if ( - !config.name || - !config.baseURL || - !config.apiKey || - !Array.isArray(config.models) || - config.models.length === 0 || - !config.defaultModel || - !config.models.includes(config.defaultModel) - ) { - throw new ModelConfigError('无效的模型配置:配置不完整或缺少必要字段'); + const errors: string[] = []; + + if (!config.name) { + errors.push('缺少模型名称(name)'); + } + if (!config.baseURL) { + errors.push('缺少基础URL(baseURL)'); + } + if (!Array.isArray(config.models)) { + errors.push('模型列表(models)必须是数组'); + } else if (config.models.length === 0) { + errors.push('模型列表(models)不能为空'); + } + if (!config.defaultModel) { + errors.push('缺少默认模型(defaultModel)'); + } else if (!config.models?.includes(config.defaultModel)) { + errors.push('默认模型必须在模型列表中'); + } + + if (errors.length > 0) { + throw new ModelConfigError('无效的模型配置:' + errors.join('、')); + } + } + + private validateEnableConfig(config: ModelConfig): void { + this.validateConfig(config); + + if (!config.apiKey) { + throw new ModelConfigError('启用模型需要提供API密钥'); } }