feat: 优化模型管理和配置验证逻辑
本次提交主要改进了模型管理器的配置处理和验证机制: - 更新 ModelManager 中的配置验证方法,提供更详细的错误信息 - 修改模型编辑逻辑,支持保留原有 API Key - 调整 Gemini 模型默认配置 - 增加配置验证的严格性和错误处理 - 优化模型更新和启用流程的健壮性
This commit is contained in:
1 parent
0563ece5bc
commit
6cb24a352d
5 files changed
+57
-21
No files matched your search
+2
-1
@@ -30,4 +30,5 @@ dist-ssr
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
.vscode
|
||||
.vscode
|
||||
.vercel
|
||||
@@ -106,6 +106,18 @@ npm run build
|
||||
|
||||
构建后的文件将生成在 `dist` 目录下
|
||||
|
||||
### 发布到vercel
|
||||
```bash
|
||||
# 第一次使用需要安装vercel
|
||||
npm install -g vercel
|
||||
# 登录vercel
|
||||
vercel login
|
||||
|
||||
# 发布项目
|
||||
vercel --prod
|
||||
|
||||
```
|
||||
|
||||
## 使用说明
|
||||
|
||||
1. 首次使用需要配置 API 密钥:
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -20,8 +20,8 @@ export const defaultModels: Record<string, ModelConfig> = {
|
||||
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'
|
||||
|
||||
@@ -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密钥');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user