diff --git a/client/src/hooks/useNewConvo.ts b/client/src/hooks/useNewConvo.ts index 22ea5f327c..63b442b83a 100644 --- a/client/src/hooks/useNewConvo.ts +++ b/client/src/hooks/useNewConvo.ts @@ -252,18 +252,20 @@ const useNewConvo = (index = 0) => { }; let preset = _preset; - const defaultModelSpec = getDefaultModelSpec(startupConfig); + const result = getDefaultModelSpec(startupConfig); + const defaultModelSpec = result?.default ?? result?.last; if ( !preset && startupConfig && (startupConfig.modelSpecs?.prioritize === true || - (startupConfig.interface?.modelSelect ?? true) !== true) && + (startupConfig.interface?.modelSelect ?? true) !== true || + (result?.last != null && Object.keys(_template).length === 0)) && defaultModelSpec ) { preset = getModelSpecPreset(defaultModelSpec); } - if (conversation.conversationId === 'new' && !modelsData) { + if (conversation.conversationId === Constants.NEW_CONVO && !modelsData) { const filesToDelete = Array.from(files.values()) .filter( (file) => diff --git a/client/src/routes/ChatRoute.tsx b/client/src/routes/ChatRoute.tsx index d81cbc075c..240b5583b9 100644 --- a/client/src/routes/ChatRoute.tsx +++ b/client/src/routes/ChatRoute.tsx @@ -66,7 +66,8 @@ export default function ChatRoute() { } if (conversationId === Constants.NEW_CONVO && endpointsQuery.data && modelsQuery.data) { - const spec = getDefaultModelSpec(startupConfig); + const result = getDefaultModelSpec(startupConfig); + const spec = result?.default ?? result?.last; logger.log('conversation', 'ChatRoute, new convo effect', conversation); newConversation({ modelsData: modelsQuery.data, @@ -90,7 +91,8 @@ export default function ChatRoute() { assistantListMap[EModelEndpoint.assistants] && assistantListMap[EModelEndpoint.azureAssistants] ) { - const spec = getDefaultModelSpec(startupConfig); + const result = getDefaultModelSpec(startupConfig); + const spec = result?.default ?? result?.last; logger.log('conversation', 'ChatRoute new convo, assistants effect', conversation); newConversation({ modelsData: modelsQuery.data, diff --git a/client/src/utils/endpoints.ts b/client/src/utils/endpoints.ts index 60585132d4..c98680843a 100644 --- a/client/src/utils/endpoints.ts +++ b/client/src/utils/endpoints.ts @@ -176,11 +176,17 @@ export function getConvoSwitchLogic(params: ConversationInitParams): InitiatedTe }; } -/** Gets the default spec by order. - * - * First, the admin defined default, then last selected spec, followed by first spec +/** + * Gets default model spec from config and user preferences. + * Priority: admin default → last selected → first spec (when prioritize=true or modelSelect disabled). + * Otherwise: admin default or last conversation spec. */ -export function getDefaultModelSpec(startupConfig?: t.TStartupConfig) { +export function getDefaultModelSpec(startupConfig?: t.TStartupConfig): + | { + default?: t.TModelSpec; + last?: t.TModelSpec; + } + | undefined { const { modelSpecs, interface: interfaceConfig } = startupConfig ?? {}; const { list, prioritize } = modelSpecs ?? {}; if (!list) { @@ -190,9 +196,9 @@ export function getDefaultModelSpec(startupConfig?: t.TStartupConfig) { if (prioritize === true || !interfaceConfig?.modelSelect) { const lastSelectedSpecName = localStorage.getItem(LocalStorageKeys.LAST_SPEC); const lastSelectedSpec = list?.find((spec) => spec.name === lastSelectedSpecName); - return defaultSpec || lastSelectedSpec || list?.[0]; + return { default: defaultSpec || lastSelectedSpec || list?.[0] }; } else if (defaultSpec) { - return defaultSpec; + return { default: defaultSpec }; } const lastConversationSetup = JSON.parse( localStorage.getItem(LocalStorageKeys.LAST_CONVO_SETUP + '_0') ?? '{}', @@ -200,7 +206,7 @@ export function getDefaultModelSpec(startupConfig?: t.TStartupConfig) { if (!lastConversationSetup.spec) { return; } - return list?.find((spec) => spec.name === lastConversationSetup.spec); + return { last: list?.find((spec) => spec.name === lastConversationSetup.spec) }; } export function getModelSpecPreset(modelSpec?: t.TModelSpec) {