diff --git a/packages/ui/src/components/chat/ModelControls.tsx b/packages/ui/src/components/chat/ModelControls.tsx index 4fc705cb..62cfe0d0 100644 --- a/packages/ui/src/components/chat/ModelControls.tsx +++ b/packages/ui/src/components/chat/ModelControls.tsx @@ -618,6 +618,7 @@ export const ModelControls: React.FC = ({ ]; const prevAgentNameRef = React.useRef(undefined); + const explicitAgentSwitchRef = React.useRef(null); const latestLoadedUserChoiceRestoreRef = React.useRef(null); const currentSessionDirectory = currentSessionId ? getDirectoryForSession(currentSessionId) : undefined; @@ -1007,6 +1008,9 @@ export const ModelControls: React.FC = ({ prevAgentNameRef.current = currentAgentName; if (currentAgentName && currentSessionId) { + const shouldPreferAgentModel = explicitAgentSwitchRef.current === currentAgentName; + explicitAgentSwitchRef.current = null; + await new Promise((resolve) => { const timer = setTimeout(resolve, 50); abortController.signal.addEventListener('abort', () => { @@ -1019,6 +1023,33 @@ export const ModelControls: React.FC = ({ return; } + const selectedAgent = shouldPreferAgentModel + ? agents.find((agent) => agent.name === currentAgentName) + : undefined; + if (selectedAgent?.model?.providerID && selectedAgent.model.modelID) { + const result = tryApplyModelSelection( + selectedAgent.model.providerID, + selectedAgent.model.modelID, + currentAgentName, + ); + if (result === 'applied' || result === 'provider-missing') { + if (result === 'applied') { + saveSessionModelSelection( + currentSessionId, + selectedAgent.model.providerID, + selectedAgent.model.modelID, + ); + saveAgentModelForSession( + currentSessionId, + currentAgentName, + selectedAgent.model.providerID, + selectedAgent.model.modelID, + ); + } + return; + } + } + const persistedChoice = getAgentModelForSession(currentSessionId, currentAgentName); if (persistedChoice) { @@ -1043,7 +1074,16 @@ export const ModelControls: React.FC = ({ return () => { abortController.abort(); }; - }, [currentAgentName, currentSessionId, getAgentModelForSession, tryApplyModelSelection, contextHydrated]); + }, [ + agents, + currentAgentName, + currentSessionId, + getAgentModelForSession, + saveAgentModelForSession, + saveSessionModelSelection, + tryApplyModelSelection, + contextHydrated, + ]); React.useEffect(() => { if (!contextHydrated || !currentAgentName) { @@ -1119,6 +1159,7 @@ export const ModelControls: React.FC = ({ const handleAgentChange = React.useCallback((agentName: string, options?: { closeModelSelector?: boolean }) => { try { + explicitAgentSwitchRef.current = agentName; setAgent(agentName); addRecentAgent(agentName); if (options?.closeModelSelector ?? true) { diff --git a/packages/ui/src/stores/useConfigStore.ts b/packages/ui/src/stores/useConfigStore.ts index 9661d0b0..3758b713 100644 --- a/packages/ui/src/stores/useConfigStore.ts +++ b/packages/ui/src/stores/useConfigStore.ts @@ -1739,6 +1739,20 @@ export const useConfigStore = create()( }); }; + // Prefer the selected agent's configured model when switching agents. + const agent = agents.find((candidate) => candidate.name === agentName); + const agentModelSelection = agent?.model; + if (agentModelSelection?.providerID && agentModelSelection?.modelID) { + const { providerID, modelID } = agentModelSelection; + const agentProvider = providers.find((provider) => provider.id === providerID); + const agentModel = agentProvider?.models.find((model) => model.id === modelID); + + if (agentModel) { + applyResolvedModelSelection(providerID, modelID, undefined); + return; + } + } + if (currentSessionId) { const existingAgentModel = useSelectionStore.getState().getAgentModelForSession(currentSessionId, agentName); if (existingAgentModel && hasProviderModel(providers, existingAgentModel.providerId, existingAgentModel.modelId)) { @@ -1759,11 +1773,7 @@ export const useConfigStore = create()( } } - if (hasProviderModel(providers, currentProviderId, currentModelId)) { - return; - } - - // If settings has a default model, use it instead of agent's preferred + // If the agent has no preferred model, use settings default. if (settingsDefaultModel) { const parsed = parseModelString(settingsDefaultModel); if (parsed) { @@ -1784,18 +1794,7 @@ export const useConfigStore = create()( } } - // Fall back to agent's preferred model - const agent = agents.find((candidate) => candidate.name === agentName); - const agentModelSelection = agent?.model; - if (agentModelSelection?.providerID && agentModelSelection?.modelID) { - const { providerID, modelID } = agentModelSelection; - const agentProvider = providers.find((provider) => provider.id === providerID); - const agentModel = agentProvider?.models.find((model) => model.id === modelID); - - if (agentModel) { - applyResolvedModelSelection(providerID, modelID, undefined); - } - } + // Otherwise keep the current valid model selection unchanged. } },