feat: store last use model (#5201)
This commit is contained in:
parent
a84034c552
commit
ac8a3b4f96
@ -16,4 +16,5 @@ export const localStorageKey = {
|
|||||||
toolApproval: 'tool-approval',
|
toolApproval: 'tool-approval',
|
||||||
toolAvailability: 'tool-availability',
|
toolAvailability: 'tool-availability',
|
||||||
mcpGlobalPermissions: 'mcp-global-permissions',
|
mcpGlobalPermissions: 'mcp-global-permissions',
|
||||||
|
lastUsedModel: 'last-used-model',
|
||||||
}
|
}
|
||||||
|
|||||||
@ -402,7 +402,10 @@ const ChatInput = ({
|
|||||||
{model?.provider === 'llama.cpp' && loadingModel ? (
|
{model?.provider === 'llama.cpp' && loadingModel ? (
|
||||||
<ModelLoader />
|
<ModelLoader />
|
||||||
) : (
|
) : (
|
||||||
<DropdownModelProvider model={model} />
|
<DropdownModelProvider
|
||||||
|
model={model}
|
||||||
|
useLastUsedModel={initialMessage}
|
||||||
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{/* File attachment - always available */}
|
{/* File attachment - always available */}
|
||||||
|
|||||||
@ -15,9 +15,11 @@ import { useThreads } from '@/hooks/useThreads'
|
|||||||
import { ModelSetting } from '@/containers/ModelSetting'
|
import { ModelSetting } from '@/containers/ModelSetting'
|
||||||
import ProvidersAvatar from '@/containers/ProvidersAvatar'
|
import ProvidersAvatar from '@/containers/ProvidersAvatar'
|
||||||
import { Fzf } from 'fzf'
|
import { Fzf } from 'fzf'
|
||||||
|
import { localStorageKey } from '@/constants/localStorage'
|
||||||
|
|
||||||
type DropdownModelProviderProps = {
|
type DropdownModelProviderProps = {
|
||||||
model?: ThreadModel
|
model?: ThreadModel
|
||||||
|
useLastUsedModel?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
interface SearchableModel {
|
interface SearchableModel {
|
||||||
@ -28,7 +30,32 @@ interface SearchableModel {
|
|||||||
highlightedId?: string
|
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 {
|
const {
|
||||||
providers,
|
providers,
|
||||||
getProviderByName,
|
getProviderByName,
|
||||||
@ -51,11 +78,39 @@ const DropdownModelProvider = ({ model }: DropdownModelProviderProps) => {
|
|||||||
// Auto select model when existing thread is passed
|
// Auto select model when existing thread is passed
|
||||||
if (model) {
|
if (model) {
|
||||||
selectModelProvider(model?.provider as string, model?.id as string)
|
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 {
|
} else {
|
||||||
// default model, we should add from setting
|
// default model, we should add from setting
|
||||||
selectModelProvider('llama.cpp', 'llama3.2:3b')
|
selectModelProvider('llama.cpp', 'llama3.2:3b')
|
||||||
}
|
}
|
||||||
}, [model, selectModelProvider, updateCurrentThreadModel])
|
} else {
|
||||||
|
// default model for non-new-chat contexts
|
||||||
|
selectModelProvider('llama.cpp', 'llama3.2:3b')
|
||||||
|
}
|
||||||
|
}, [
|
||||||
|
model,
|
||||||
|
selectModelProvider,
|
||||||
|
updateCurrentThreadModel,
|
||||||
|
providers,
|
||||||
|
useLastUsedModel,
|
||||||
|
])
|
||||||
|
|
||||||
// Update display model when selection changes
|
// Update display model when selection changes
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -181,10 +236,17 @@ const DropdownModelProvider = ({ model }: DropdownModelProviderProps) => {
|
|||||||
id: searchableModel.model.id,
|
id: searchableModel.model.id,
|
||||||
provider: searchableModel.provider.provider,
|
provider: searchableModel.provider.provider,
|
||||||
})
|
})
|
||||||
|
// Store the selected model as last used
|
||||||
|
if (useLastUsedModel) {
|
||||||
|
setLastUsedModel(
|
||||||
|
searchableModel.provider.provider,
|
||||||
|
searchableModel.model.id
|
||||||
|
)
|
||||||
|
}
|
||||||
setSearchValue('')
|
setSearchValue('')
|
||||||
setOpen(false)
|
setOpen(false)
|
||||||
},
|
},
|
||||||
[selectModelProvider, updateCurrentThreadModel]
|
[selectModelProvider, updateCurrentThreadModel, useLastUsedModel]
|
||||||
)
|
)
|
||||||
|
|
||||||
const currentModel = selectedModel?.id
|
const currentModel = selectedModel?.id
|
||||||
|
|||||||
@ -52,9 +52,6 @@ const DialogAppUpdater = () => {
|
|||||||
|
|
||||||
if (appUpdateState.remindMeLater) return null
|
if (appUpdateState.remindMeLater) return null
|
||||||
|
|
||||||
console.log(appUpdateState)
|
|
||||||
console.log(updateState)
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{appUpdateState.isUpdateAvailable && (
|
{appUpdateState.isUpdateAvailable && (
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user