diff --git a/desktop/src/pages/Settings.tsx b/desktop/src/pages/Settings.tsx index e8f326fd..c9b390ad 100644 --- a/desktop/src/pages/Settings.tsx +++ b/desktop/src/pages/Settings.tsx @@ -51,6 +51,7 @@ import { normalizeImageModelFetchBaseURL, normalizeAiModelDescriptors, normalizeSourceModels, + isLikelyTranscriptionModel, parseAiSources, parseEnvText, parseMcpServers, @@ -1108,6 +1109,13 @@ export function Settings({ ? (sourceModelCapabilityDrafts[addModelModalSource.id] || 'chat') : 'chat'; + const resolveCandidateModelCapability = useCallback((model: AiModelDescriptor): ModelCapability => { + if (model.capabilities.includes('transcription') || isLikelyTranscriptionModel(model.id)) { + return 'transcription'; + } + return model.capabilities.find((capability) => capability !== 'chat') || model.capabilities[0] || 'chat'; + }, []); + const groupedAiPresets = useMemo(() => { const codingPlan = AI_SOURCE_PRESETS.filter((preset) => preset.group === 'coding-plan'); const general = AI_SOURCE_PRESETS.filter((preset) => preset.group !== 'coding-plan'); @@ -5860,7 +5868,7 @@ export function Settings({ setSourceModelDrafts((prev) => ({ ...prev, [addModelModalSource.id]: item.id })); setSourceModelCapabilityDrafts((prev) => ({ ...prev, - [addModelModalSource.id]: item.capabilities[0] || 'chat', + [addModelModalSource.id]: resolveCandidateModelCapability(item), })); }} className="px-2 py-1 text-[11px] rounded border border-border hover:bg-surface-secondary transition-colors flex items-center gap-1.5" diff --git a/desktop/src/pages/settings/shared.tsx b/desktop/src/pages/settings/shared.tsx index 9594b5b4..de3eb9e4 100644 --- a/desktop/src/pages/settings/shared.tsx +++ b/desktop/src/pages/settings/shared.tsx @@ -1460,12 +1460,15 @@ export const toAiModelDescriptor = ( ...(Array.isArray(model?.capabilities) ? model.capabilities : []), model?.capability, ]; - const capabilities = explicitCapabilities.some((value) => String(value || '').trim()) + const hasExplicitCapabilities = explicitCapabilities.some((value) => String(value || '').trim()); + const capabilities = hasExplicitCapabilities ? normalizeModelCapabilities(explicitCapabilities) : inferModelCapabilities(id); return { id, - capabilities: forcedCapabilities.length > 0 ? forcedCapabilities : capabilities, + capabilities: hasExplicitCapabilities + ? capabilities + : (forcedCapabilities.length > 0 ? forcedCapabilities : capabilities), inputCapabilities: getModelInputCapabilities(id), }; };