🎪 refactor: Allow Last Model Spec Selection without Prioritizing (#10258)

* refactor: Default Model Spec Retrieval Logic, allowing last selected spec on new chat if last selection was a spec

* chore: Replace hardcoded 'new' conversation ID with Constants.NEW_CONVO for consistency

* chore: remove redundant condition for model spec preset selection in useNewConvo hook
This commit is contained in:
Danny Avila 2025-10-26 21:37:55 -04:00 committed by GitHub
parent cbbbde3681
commit 90e610ceda
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 22 additions and 12 deletions

View file

@ -252,18 +252,20 @@ const useNewConvo = (index = 0) => {
}; };
let preset = _preset; let preset = _preset;
const defaultModelSpec = getDefaultModelSpec(startupConfig); const result = getDefaultModelSpec(startupConfig);
const defaultModelSpec = result?.default ?? result?.last;
if ( if (
!preset && !preset &&
startupConfig && startupConfig &&
(startupConfig.modelSpecs?.prioritize === true || (startupConfig.modelSpecs?.prioritize === true ||
(startupConfig.interface?.modelSelect ?? true) !== true) && (startupConfig.interface?.modelSelect ?? true) !== true ||
(result?.last != null && Object.keys(_template).length === 0)) &&
defaultModelSpec defaultModelSpec
) { ) {
preset = getModelSpecPreset(defaultModelSpec); preset = getModelSpecPreset(defaultModelSpec);
} }
if (conversation.conversationId === 'new' && !modelsData) { if (conversation.conversationId === Constants.NEW_CONVO && !modelsData) {
const filesToDelete = Array.from(files.values()) const filesToDelete = Array.from(files.values())
.filter( .filter(
(file) => (file) =>

View file

@ -66,7 +66,8 @@ export default function ChatRoute() {
} }
if (conversationId === Constants.NEW_CONVO && endpointsQuery.data && modelsQuery.data) { 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); logger.log('conversation', 'ChatRoute, new convo effect', conversation);
newConversation({ newConversation({
modelsData: modelsQuery.data, modelsData: modelsQuery.data,
@ -90,7 +91,8 @@ export default function ChatRoute() {
assistantListMap[EModelEndpoint.assistants] && assistantListMap[EModelEndpoint.assistants] &&
assistantListMap[EModelEndpoint.azureAssistants] 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); logger.log('conversation', 'ChatRoute new convo, assistants effect', conversation);
newConversation({ newConversation({
modelsData: modelsQuery.data, modelsData: modelsQuery.data,

View file

@ -176,11 +176,17 @@ export function getConvoSwitchLogic(params: ConversationInitParams): InitiatedTe
}; };
} }
/** Gets the default spec by order. /**
* * Gets default model spec from config and user preferences.
* First, the admin defined default, then last selected spec, followed by first spec * 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 { modelSpecs, interface: interfaceConfig } = startupConfig ?? {};
const { list, prioritize } = modelSpecs ?? {}; const { list, prioritize } = modelSpecs ?? {};
if (!list) { if (!list) {
@ -190,9 +196,9 @@ export function getDefaultModelSpec(startupConfig?: t.TStartupConfig) {
if (prioritize === true || !interfaceConfig?.modelSelect) { if (prioritize === true || !interfaceConfig?.modelSelect) {
const lastSelectedSpecName = localStorage.getItem(LocalStorageKeys.LAST_SPEC); const lastSelectedSpecName = localStorage.getItem(LocalStorageKeys.LAST_SPEC);
const lastSelectedSpec = list?.find((spec) => spec.name === lastSelectedSpecName); const lastSelectedSpec = list?.find((spec) => spec.name === lastSelectedSpecName);
return defaultSpec || lastSelectedSpec || list?.[0]; return { default: defaultSpec || lastSelectedSpec || list?.[0] };
} else if (defaultSpec) { } else if (defaultSpec) {
return defaultSpec; return { default: defaultSpec };
} }
const lastConversationSetup = JSON.parse( const lastConversationSetup = JSON.parse(
localStorage.getItem(LocalStorageKeys.LAST_CONVO_SETUP + '_0') ?? '{}', localStorage.getItem(LocalStorageKeys.LAST_CONVO_SETUP + '_0') ?? '{}',
@ -200,7 +206,7 @@ export function getDefaultModelSpec(startupConfig?: t.TStartupConfig) {
if (!lastConversationSetup.spec) { if (!lastConversationSetup.spec) {
return; return;
} }
return list?.find((spec) => spec.name === lastConversationSetup.spec); return { last: list?.find((spec) => spec.name === lastConversationSetup.spec) };
} }
export function getModelSpecPreset(modelSpec?: t.TModelSpec) { export function getModelSpecPreset(modelSpec?: t.TModelSpec) {