diff --git a/components/settings/AiSections.tsx b/components/settings/AiSections.tsx index 74ce6a14..47e20eed 100644 --- a/components/settings/AiSections.tsx +++ b/components/settings/AiSections.tsx @@ -21,6 +21,7 @@ import { AdaptiveAiHardwarePanel } from './AdaptiveAiHardwarePanel'; import { AiProviderCard } from './AiProviderCard'; import { GpuMetricsPanel } from './GpuMetricsPanel'; import { LocalAiDownloadProgress } from './LocalAiDownloadProgress'; +import { OllamaDevicePull } from './OllamaDevicePull'; import { ToggleSwitch } from './SettingsShared'; const KNOWN_OLLAMA_MODELS = new Set([ @@ -334,10 +335,23 @@ export const AdvancedAiSection: FC = () => { {t('settings.advancedAi.modelDescription')}

{settings.advancedAi.provider === 'ollama' && ( -

- {t('settings.advancedAi.modelRecommendationsIntro')}{' '} - {RECOMMENDED_OLLAMA_MODEL_IDS.join(', ')} -

+ <> +

+ {t('settings.advancedAi.modelRecommendationsIntro')}{' '} + {RECOMMENDED_OLLAMA_MODEL_IDS.join(', ')} +

+ {/* QNBS-v3: device-aware recommendation + one-click pull (PR E). */} + { + handleSettingChange('advancedAi', { ...settings.advancedAi, model: tag }); + // QNBS-v3: recommended tags aren't in the known-options list, so applying one takes + // the custom-model path — sync the custom input so the selector isn't left stale. + if (isCustomOllamaModel(tag)) setCustomModelInput(tag.replace(/^ollama\//, '')); + }} + t={t} + /> + )}