Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/main/presenter/configPresenter/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ export class ConfigPresenter implements IConfigPresenter {

// Cache miss: read from settings and cache the result
const status = this.getSetting<boolean>(statusKey)
const finalStatus = typeof status === 'boolean' ? status : true
const finalStatus = typeof status === 'boolean' ? status : false
this.modelStatusCache.set(statusKey, finalStatus)

return finalStatus
Expand Down Expand Up @@ -359,7 +359,7 @@ export class ConfigPresenter implements IConfigPresenter {
const modelId = uncachedModelIds[i]
const statusKey = uncachedKeys[i]
const status = this.getSetting<boolean>(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)
Expand Down
10 changes: 4 additions & 6 deletions src/main/presenter/llmProviderPresenter/baseProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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`
)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<SafetySetting[] | undefined> {
const safetySettings: SafetySetting[] = []
Expand Down
21 changes: 20 additions & 1 deletion src/renderer/src/components/settings/ProviderModelManager.vue
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,10 @@
{{ t('settings.provider.modelsEnabled') }}
</span>
</div>
<div class="flex flex-col w-full border overflow-hidden rounded-lg">
<div
v-if="enabledModels.length > 0"
class="flex flex-col w-full border overflow-hidden rounded-lg"
>
<ModelConfigItem
v-for="model in enabledModels"
:key="model.id"
Expand All @@ -47,6 +50,22 @@
@config-changed="$emit('config-changed')"
/>
</div>
<div
v-else-if="totalModelsCount > 0"
class="flex flex-col w-full border border-dashed border-muted-foreground/30 rounded-lg p-4"
>
<div class="flex items-center gap-3 text-muted-foreground">
<Icon icon="lucide:info" class="w-5 h-5 text-blue-500" />
<div class="flex-1">
<p class="text-sm font-medium">
{{ t('settings.provider.noModelsEnabled.title') }}
</p>
<p class="text-xs mt-1">
{{ t('settings.provider.noModelsEnabled.description') }}
</p>
</div>
</div>
</div>
</div>
</template>

Expand Down
4 changes: 4 additions & 0 deletions src/renderer/src/i18n/en-US/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
4 changes: 4 additions & 0 deletions src/renderer/src/i18n/fa-IR/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,10 @@
"enableModels": "روشن کردن مدل‌ها",
"disableAllModels": "خاموش کردن همه مدل‌ها",
"modelsEnabled": "مدل‌ها روشن شده‌اند",
"noModelsEnabled": {
"title": "هیچ مدلی روشن نشده است",
"description": "لطفاً دکمه «روشن کردن مدل‌ها» را کلیک کنید تا مدل‌هایی که می‌خواهید استفاده کنید را به صورت دستی انتخاب کنید."
},
"verifyLink": "پیوند راستی‌آزمایی",
"syncModelsFailed": "همگام‌سازی مدل‌ها ناموفق بود...",
"addCustomProvider": "افزودن فراهم‌کننده دلخواه",
Expand Down
4 changes: 4 additions & 0 deletions src/renderer/src/i18n/fr-FR/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -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é",
Expand Down
4 changes: 4 additions & 0 deletions src/renderer/src/i18n/ja-JP/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,10 @@
"enableModels": "モデルを有効にする",
"disableAllModels": "すべてのモデルを無効にする",
"modelsEnabled": "モデルが有効になりました",
"noModelsEnabled": {
"title": "有効なモデルがありません",
"description": "「モデルを有効にする」ボタンをクリックして使用したいモデルを手動で選択してください。"
},
"verifyLink": "検証リンク",
"syncModelsFailed": "モデルの同期に失敗しました...",
"addCustomProvider": "カスタムプロバイダーを追加",
Expand Down
4 changes: 4 additions & 0 deletions src/renderer/src/i18n/ko-KR/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,10 @@
"enableModels": "모델 활성화",
"disableAllModels": "모든 모델 비활성화",
"modelsEnabled": "모델이 활성화되었습니다",
"noModelsEnabled": {
"title": "활성화된 모델이 없습니다",
"description": "「모델 활성화」 버튼을 클릭하여 사용할 모델을 수동으로 선택하십시오."
},
"verifyLink": "링크 확인",
"syncModelsFailed": "모델 동기화 실패...",
"addCustomProvider": "커스텀 제공자 추가",
Expand Down
4 changes: 4 additions & 0 deletions src/renderer/src/i18n/ru-RU/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,10 @@
"enableModels": "Включить модели",
"disableAllModels": "Отключить все модели",
"modelsEnabled": "Модели включены",
"noModelsEnabled": {
"title": "Нет активных моделей",
"description": "Нажмите кнопку «Включить модели», чтобы вручную выбрать модели для использования."
},
"verifyLink": "Проверить ссылку",
"syncModelsFailed": "Не удалось синхронизировать модели...",
"addCustomProvider": "Добавить пользовательский провайдер",
Expand Down
4 changes: 4 additions & 0 deletions src/renderer/src/i18n/zh-CN/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,10 @@
"enableModels": "启用模型",
"disableAllModels": "禁用全部",
"modelsEnabled": "模型已经启用",
"noModelsEnabled": {
"title": "暂无已启用的模型",
"description": "请点击「启用模型」按钮手动选择需要使用的模型。"
},
"verifyLink": "验证链接",
"syncModelsFailed": "同步模型失败...",
"addCustomProvider": "添加自定义服务商",
Expand Down
4 changes: 4 additions & 0 deletions src/renderer/src/i18n/zh-HK/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,10 @@
"noLocalModels": "沒有本地模型",
"localModels": "本地模型",
"modelsEnabled": "模型已經啟用",
"noModelsEnabled": {
"title": "暫無已啟用的模型",
"description": "請點擊「啟用模型」按鈕手動選擇需要使用的模型。"
},
"azureApiVersion": "API 版本",
"safety": {
"title": "安全設置",
Expand Down
4 changes: 4 additions & 0 deletions src/renderer/src/i18n/zh-TW/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,10 @@
"enableModels": "啟用模型",
"disableAllModels": "全部停用",
"modelsEnabled": "模型已啟用",
"noModelsEnabled": {
"title": "暫無已啟用的模型",
"description": "請點選「啟用模型」按鈕手動選擇需要使用的模型。"
},
"verifyLink": "驗證連結",
"syncModelsFailed": "同步模型失敗...",
"addCustomProvider": "新增自訂服務提供者",
Expand Down