From e14c8783e59828b8c2c0e3f285614fadc68145d5 Mon Sep 17 00:00:00 2001 From: yyhhyyyyyy Date: Wed, 13 Aug 2025 17:59:51 +0800 Subject: [PATCH] feat: disable automatic model enabling for better UX --- src/main/presenter/configPresenter/index.ts | 4 +- .../llmProviderPresenter/baseProvider.ts | 10 ++- .../providers/geminiProvider.ts | 71 ++----------------- .../settings/ProviderModelManager.vue | 21 +++++- src/renderer/src/i18n/en-US/settings.json | 4 ++ src/renderer/src/i18n/fa-IR/settings.json | 4 ++ src/renderer/src/i18n/fr-FR/settings.json | 4 ++ src/renderer/src/i18n/ja-JP/settings.json | 4 ++ src/renderer/src/i18n/ko-KR/settings.json | 4 ++ src/renderer/src/i18n/ru-RU/settings.json | 4 ++ src/renderer/src/i18n/zh-CN/settings.json | 4 ++ src/renderer/src/i18n/zh-HK/settings.json | 4 ++ src/renderer/src/i18n/zh-TW/settings.json | 4 ++ 13 files changed, 66 insertions(+), 76 deletions(-) diff --git a/src/main/presenter/configPresenter/index.ts b/src/main/presenter/configPresenter/index.ts index 4d248ce53..291769dff 100644 --- a/src/main/presenter/configPresenter/index.ts +++ b/src/main/presenter/configPresenter/index.ts @@ -331,7 +331,7 @@ export class ConfigPresenter implements IConfigPresenter { // Cache miss: read from settings and cache the result const status = this.getSetting(statusKey) - const finalStatus = typeof status === 'boolean' ? status : true + const finalStatus = typeof status === 'boolean' ? status : false this.modelStatusCache.set(statusKey, finalStatus) return finalStatus @@ -359,7 +359,7 @@ export class ConfigPresenter implements IConfigPresenter { const modelId = uncachedModelIds[i] const statusKey = uncachedKeys[i] const status = this.getSetting(statusKey) - const finalStatus = typeof status === 'boolean' ? status : true + const finalStatus = typeof status === 'boolean' ? status : false // Cache the result and add to return object this.modelStatusCache.set(statusKey, finalStatus) diff --git a/src/main/presenter/llmProviderPresenter/baseProvider.ts b/src/main/presenter/llmProviderPresenter/baseProvider.ts index d7ccac177..5cb4befc0 100644 --- a/src/main/presenter/llmProviderPresenter/baseProvider.ts +++ b/src/main/presenter/llmProviderPresenter/baseProvider.ts @@ -130,13 +130,11 @@ export abstract class BaseLLMProvider { this.configPresenter.getModelStatus(providerId, model.id) ) - // 如果没有任何已启用的模型,则自动启用所有模型 - // 这部分后续应该改为启用推荐模型 + // 不再自动启用模型,让用户手动选择启用需要的模型 if (!hasEnabledModels) { - console.info(`Auto enabling all models for provider: ${this.provider.name}`) - this.models.forEach((model) => { - this.configPresenter.enableModel(providerId, model.id) - }) + console.info( + `Provider ${this.provider.name} models loaded, please manually enable the models you need` + ) } } diff --git a/src/main/presenter/llmProviderPresenter/providers/geminiProvider.ts b/src/main/presenter/llmProviderPresenter/providers/geminiProvider.ts index 3613a6f69..a01420db7 100644 --- a/src/main/presenter/llmProviderPresenter/providers/geminiProvider.ts +++ b/src/main/presenter/llmProviderPresenter/providers/geminiProvider.ts @@ -333,77 +333,14 @@ export class GeminiProvider extends BaseLLMProvider { this.configPresenter.getModelStatus(providerId, model.id) ) - // 如果没有任何已启用的模型,则自动启用推荐的模型 + // 不再自动启用模型,让用户手动选择启用需要的模型 if (!hasEnabledModels) { - // 提取推荐模型ID列表 - const recommendedModelIds = GeminiProvider.GEMINI_MODELS.map((model) => model.id) - - // 过滤出匹配推荐列表的模型 - const modelsToEnable = this.models.filter((model) => { - return this.isModelRecommended(model.id, recommendedModelIds) - }) - - if (modelsToEnable.length > 0) { - console.info( - `Auto enabling ${modelsToEnable.length} recommended models for provider: ${this.provider.name}` - ) - modelsToEnable.forEach((model) => { - console.info(`Enabling recommended model: ${model.id}`) - this.configPresenter.enableModel(providerId, model.id) - }) - } else { - console.warn(`No recommended models found for provider: ${this.provider.name}`) - } + console.info( + `Provider ${this.provider.name} models loaded, please manually enable the models you need` + ) } } - /** - * 检查模型ID是否与推荐模型列表匹配(模糊匹配) - * @param modelId 要检查的模型ID - * @param recommendedIds 推荐模型ID列表 - * @returns 是否匹配 - */ - private isModelRecommended(modelId: string, recommendedIds: string[]): boolean { - // 标准化模型ID,移除 models/ 前缀进行比较 - const normalizeId = (id: string) => id.replace(/^models\//, '') - const normalizedModelId = normalizeId(modelId) - - return recommendedIds.some((recommendedId) => { - const normalizedRecommendedId = normalizeId(recommendedId) - - // 精确匹配 - if (normalizedModelId === normalizedRecommendedId) { - return true - } - - // 模糊匹配:检查是否包含核心模型名称 - // 例如 "gemini-2.5-pro" 匹配 "gemini-2.5-pro-experimental" - if ( - normalizedModelId.includes(normalizedRecommendedId) || - normalizedRecommendedId.includes(normalizedModelId) - ) { - return true - } - - // 版本匹配:检查基础模型名称是否相同 - // 例如 "gemini-2.5-flash" 匹配 "gemini-2.5-flash-8b" - const getBaseModelName = (id: string) => { - // 移除版本号、实验标识等后缀 - return id - .replace(/-\d+$/, '') // 移除末尾数字 - .replace(/-latest$/, '') // 移除 -latest - .replace(/-exp.*$/, '') // 移除实验版本标识 - .replace(/-preview.*$/, '') // 移除预览版本标识 - .replace(/-\d{3,}$/, '') // 移除长数字版本号 - } - - const baseModelId = getBaseModelName(normalizedModelId) - const baseRecommendedId = getBaseModelName(normalizedRecommendedId) - - return baseModelId === baseRecommendedId - }) - } - // Helper function to get and format safety settings private async getFormattedSafetySettings(): Promise { const safetySettings: SafetySetting[] = [] diff --git a/src/renderer/src/components/settings/ProviderModelManager.vue b/src/renderer/src/components/settings/ProviderModelManager.vue index 8077e06c3..c5d8b6079 100644 --- a/src/renderer/src/components/settings/ProviderModelManager.vue +++ b/src/renderer/src/components/settings/ProviderModelManager.vue @@ -30,7 +30,10 @@ {{ t('settings.provider.modelsEnabled') }} -
+
+
+
+ +
+

+ {{ t('settings.provider.noModelsEnabled.title') }} +

+

+ {{ t('settings.provider.noModelsEnabled.description') }} +

+
+
+
diff --git a/src/renderer/src/i18n/en-US/settings.json b/src/renderer/src/i18n/en-US/settings.json index c5e4e09a7..6c0dc1069 100644 --- a/src/renderer/src/i18n/en-US/settings.json +++ b/src/renderer/src/i18n/en-US/settings.json @@ -239,6 +239,10 @@ "enableModels": "Enable Models", "disableAllModels": "Disable All Models", "modelsEnabled": "Models have been enabled", + "noModelsEnabled": { + "title": "No models enabled", + "description": "Please click the \"Enable Models\" button to manually select the models you want to use." + }, "verifyLink": "Verify Link", "syncModelsFailed": "Failed to sync models...", "addCustomProvider": "Add Custom Provider", diff --git a/src/renderer/src/i18n/fa-IR/settings.json b/src/renderer/src/i18n/fa-IR/settings.json index 01d9fedf0..ca458a804 100644 --- a/src/renderer/src/i18n/fa-IR/settings.json +++ b/src/renderer/src/i18n/fa-IR/settings.json @@ -239,6 +239,10 @@ "enableModels": "روشن کردن مدل‌ها", "disableAllModels": "خاموش کردن همه مدل‌ها", "modelsEnabled": "مدل‌ها روشن شده‌اند", + "noModelsEnabled": { + "title": "هیچ مدلی روشن نشده است", + "description": "لطفاً دکمه «روشن کردن مدل‌ها» را کلیک کنید تا مدل‌هایی که می‌خواهید استفاده کنید را به صورت دستی انتخاب کنید." + }, "verifyLink": "پیوند راستی‌آزمایی", "syncModelsFailed": "همگام‌سازی مدل‌ها ناموفق بود...", "addCustomProvider": "افزودن فراهم‌کننده دلخواه", diff --git a/src/renderer/src/i18n/fr-FR/settings.json b/src/renderer/src/i18n/fr-FR/settings.json index e757abd88..f4a506096 100644 --- a/src/renderer/src/i18n/fr-FR/settings.json +++ b/src/renderer/src/i18n/fr-FR/settings.json @@ -239,6 +239,10 @@ "enableModels": "Activer les modèles", "disableAllModels": "Désactiver tous les modèles", "modelsEnabled": "Les modèles ont été activés", + "noModelsEnabled": { + "title": "Aucun modèle activé", + "description": "Veuillez cliquer sur le bouton « Activer les modèles » pour sélectionner manuellement les modèles que vous souhaitez utiliser." + }, "verifyLink": "Vérifier le lien", "syncModelsFailed": "Échec de la synchronisation des modèles...", "addCustomProvider": "Ajouter un fournisseur personnalisé", diff --git a/src/renderer/src/i18n/ja-JP/settings.json b/src/renderer/src/i18n/ja-JP/settings.json index 8c8f5f36c..63726184b 100644 --- a/src/renderer/src/i18n/ja-JP/settings.json +++ b/src/renderer/src/i18n/ja-JP/settings.json @@ -239,6 +239,10 @@ "enableModels": "モデルを有効にする", "disableAllModels": "すべてのモデルを無効にする", "modelsEnabled": "モデルが有効になりました", + "noModelsEnabled": { + "title": "有効なモデルがありません", + "description": "「モデルを有効にする」ボタンをクリックして使用したいモデルを手動で選択してください。" + }, "verifyLink": "検証リンク", "syncModelsFailed": "モデルの同期に失敗しました...", "addCustomProvider": "カスタムプロバイダーを追加", diff --git a/src/renderer/src/i18n/ko-KR/settings.json b/src/renderer/src/i18n/ko-KR/settings.json index d54a2ed32..bc6e39eee 100644 --- a/src/renderer/src/i18n/ko-KR/settings.json +++ b/src/renderer/src/i18n/ko-KR/settings.json @@ -238,6 +238,10 @@ "enableModels": "모델 활성화", "disableAllModels": "모든 모델 비활성화", "modelsEnabled": "모델이 활성화되었습니다", + "noModelsEnabled": { + "title": "활성화된 모델이 없습니다", + "description": "「모델 활성화」 버튼을 클릭하여 사용할 모델을 수동으로 선택하십시오." + }, "verifyLink": "링크 확인", "syncModelsFailed": "모델 동기화 실패...", "addCustomProvider": "커스텀 제공자 추가", diff --git a/src/renderer/src/i18n/ru-RU/settings.json b/src/renderer/src/i18n/ru-RU/settings.json index 0f6539030..36fcccf08 100644 --- a/src/renderer/src/i18n/ru-RU/settings.json +++ b/src/renderer/src/i18n/ru-RU/settings.json @@ -238,6 +238,10 @@ "enableModels": "Включить модели", "disableAllModels": "Отключить все модели", "modelsEnabled": "Модели включены", + "noModelsEnabled": { + "title": "Нет активных моделей", + "description": "Нажмите кнопку «Включить модели», чтобы вручную выбрать модели для использования." + }, "verifyLink": "Проверить ссылку", "syncModelsFailed": "Не удалось синхронизировать модели...", "addCustomProvider": "Добавить пользовательский провайдер", diff --git a/src/renderer/src/i18n/zh-CN/settings.json b/src/renderer/src/i18n/zh-CN/settings.json index cbe60943d..a382ea852 100644 --- a/src/renderer/src/i18n/zh-CN/settings.json +++ b/src/renderer/src/i18n/zh-CN/settings.json @@ -240,6 +240,10 @@ "enableModels": "启用模型", "disableAllModels": "禁用全部", "modelsEnabled": "模型已经启用", + "noModelsEnabled": { + "title": "暂无已启用的模型", + "description": "请点击「启用模型」按钮手动选择需要使用的模型。" + }, "verifyLink": "验证链接", "syncModelsFailed": "同步模型失败...", "addCustomProvider": "添加自定义服务商", diff --git a/src/renderer/src/i18n/zh-HK/settings.json b/src/renderer/src/i18n/zh-HK/settings.json index c4e2752df..aa32af202 100644 --- a/src/renderer/src/i18n/zh-HK/settings.json +++ b/src/renderer/src/i18n/zh-HK/settings.json @@ -320,6 +320,10 @@ "noLocalModels": "沒有本地模型", "localModels": "本地模型", "modelsEnabled": "模型已經啟用", + "noModelsEnabled": { + "title": "暫無已啟用的模型", + "description": "請點擊「啟用模型」按鈕手動選擇需要使用的模型。" + }, "azureApiVersion": "API 版本", "safety": { "title": "安全設置", diff --git a/src/renderer/src/i18n/zh-TW/settings.json b/src/renderer/src/i18n/zh-TW/settings.json index 0f2db5188..ba2cb3100 100644 --- a/src/renderer/src/i18n/zh-TW/settings.json +++ b/src/renderer/src/i18n/zh-TW/settings.json @@ -239,6 +239,10 @@ "enableModels": "啟用模型", "disableAllModels": "全部停用", "modelsEnabled": "模型已啟用", + "noModelsEnabled": { + "title": "暫無已啟用的模型", + "description": "請點選「啟用模型」按鈕手動選擇需要使用的模型。" + }, "verifyLink": "驗證連結", "syncModelsFailed": "同步模型失敗...", "addCustomProvider": "新增自訂服務提供者",