diff --git a/web-app/src/constants/localStorage.ts b/web-app/src/constants/localStorage.ts index 2c11ee7c9..0c1137219 100644 --- a/web-app/src/constants/localStorage.ts +++ b/web-app/src/constants/localStorage.ts @@ -16,4 +16,5 @@ export const localStorageKey = { toolApproval: 'tool-approval', toolAvailability: 'tool-availability', mcpGlobalPermissions: 'mcp-global-permissions', + lastUsedModel: 'last-used-model', } diff --git a/web-app/src/containers/ChatInput.tsx b/web-app/src/containers/ChatInput.tsx index 1fe0d413c..806e613a5 100644 --- a/web-app/src/containers/ChatInput.tsx +++ b/web-app/src/containers/ChatInput.tsx @@ -402,7 +402,10 @@ const ChatInput = ({ {model?.provider === 'llama.cpp' && loadingModel ? ( ) : ( - + )} {/* File attachment - always available */} diff --git a/web-app/src/containers/DropdownModelProvider.tsx b/web-app/src/containers/DropdownModelProvider.tsx index 5fb332687..f179cede8 100644 --- a/web-app/src/containers/DropdownModelProvider.tsx +++ b/web-app/src/containers/DropdownModelProvider.tsx @@ -15,9 +15,11 @@ import { useThreads } from '@/hooks/useThreads' import { ModelSetting } from '@/containers/ModelSetting' import ProvidersAvatar from '@/containers/ProvidersAvatar' import { Fzf } from 'fzf' +import { localStorageKey } from '@/constants/localStorage' type DropdownModelProviderProps = { model?: ThreadModel + useLastUsedModel?: boolean } interface SearchableModel { @@ -28,7 +30,32 @@ interface SearchableModel { highlightedId?: string } -const DropdownModelProvider = ({ model }: DropdownModelProviderProps) => { +// Helper functions for localStorage +const getLastUsedModel = (): { provider: string; model: string } | null => { + try { + const stored = localStorage.getItem(localStorageKey.lastUsedModel) + return stored ? JSON.parse(stored) : null + } catch (error) { + console.debug('Failed to get last used model from localStorage:', error) + return null + } +} + +const setLastUsedModel = (provider: string, model: string) => { + try { + localStorage.setItem( + localStorageKey.lastUsedModel, + JSON.stringify({ provider, model }) + ) + } catch (error) { + console.debug('Failed to set last used model in localStorage:', error) + } +} + +const DropdownModelProvider = ({ + model, + useLastUsedModel = false, +}: DropdownModelProviderProps) => { const { providers, getProviderByName, @@ -51,11 +78,39 @@ const DropdownModelProvider = ({ model }: DropdownModelProviderProps) => { // Auto select model when existing thread is passed if (model) { selectModelProvider(model?.provider as string, model?.id as string) + } else if (useLastUsedModel) { + // Try to use last used model only when explicitly requested (for new chat) + const lastUsed = getLastUsedModel() + if (lastUsed) { + // Verify the last used model still exists + const provider = providers.find( + (p) => p.provider === lastUsed.provider && p.active + ) + const modelExists = provider?.models.find( + (m) => m.id === lastUsed.model + ) + + if (provider && modelExists) { + selectModelProvider(lastUsed.provider, lastUsed.model) + } else { + // Fallback to default model if last used model no longer exists + selectModelProvider('llama.cpp', 'llama3.2:3b') + } + } else { + // default model, we should add from setting + selectModelProvider('llama.cpp', 'llama3.2:3b') + } } else { - // default model, we should add from setting + // default model for non-new-chat contexts selectModelProvider('llama.cpp', 'llama3.2:3b') } - }, [model, selectModelProvider, updateCurrentThreadModel]) + }, [ + model, + selectModelProvider, + updateCurrentThreadModel, + providers, + useLastUsedModel, + ]) // Update display model when selection changes useEffect(() => { @@ -181,10 +236,17 @@ const DropdownModelProvider = ({ model }: DropdownModelProviderProps) => { id: searchableModel.model.id, provider: searchableModel.provider.provider, }) + // Store the selected model as last used + if (useLastUsedModel) { + setLastUsedModel( + searchableModel.provider.provider, + searchableModel.model.id + ) + } setSearchValue('') setOpen(false) }, - [selectModelProvider, updateCurrentThreadModel] + [selectModelProvider, updateCurrentThreadModel, useLastUsedModel] ) const currentModel = selectedModel?.id diff --git a/web-app/src/containers/dialogs/AppUpdater.tsx b/web-app/src/containers/dialogs/AppUpdater.tsx index c9393099f..02a84accb 100644 --- a/web-app/src/containers/dialogs/AppUpdater.tsx +++ b/web-app/src/containers/dialogs/AppUpdater.tsx @@ -52,9 +52,6 @@ const DialogAppUpdater = () => { if (appUpdateState.remindMeLater) return null - console.log(appUpdateState) - console.log(updateState) - return ( <> {appUpdateState.isUpdateAvailable && (