From 07560d82e60ddf98f3d0a24dced7f10369be6074 Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Tue, 10 Mar 2026 22:35:43 +0000 Subject: [PATCH] feat(AI Assistant): remember last model used --- admin/constants/kv_store.ts | 2 +- admin/inertia/components/chat/index.tsx | 21 ++++++++++++++++++--- admin/types/kv_store.ts | 1 + 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/admin/constants/kv_store.ts b/admin/constants/kv_store.ts index 4f4196d..7cae751 100644 --- a/admin/constants/kv_store.ts +++ b/admin/constants/kv_store.ts @@ -1,3 +1,3 @@ import { KVStoreKey } from "../types/kv_store.js"; -export const SETTINGS_KEYS: KVStoreKey[] = ['chat.suggestionsEnabled', 'ui.hasVisitedEasySetup', 'system.earlyAccess', 'ai.assistantCustomName']; \ No newline at end of file +export const SETTINGS_KEYS: KVStoreKey[] = ['chat.suggestionsEnabled', 'chat.lastModel', 'ui.hasVisitedEasySetup', 'system.earlyAccess', 'ai.assistantCustomName']; \ No newline at end of file diff --git a/admin/inertia/components/chat/index.tsx b/admin/inertia/components/chat/index.tsx index 20a7ae1..994a0ae 100644 --- a/admin/inertia/components/chat/index.tsx +++ b/admin/inertia/components/chat/index.tsx @@ -10,6 +10,7 @@ import { ChatMessage } from '../../../types/chat' import classNames from '~/lib/classNames' import { IconX } from '@tabler/icons-react' import { DEFAULT_QUERY_REWRITE_MODEL } from '../../../constants/ollama' +import { useSystemSetting } from '~/hooks/useSystemSetting' interface ChatProps { enabled: boolean @@ -51,6 +52,8 @@ export default function Chat({ const activeSession = sessions.find((s) => s.id === activeSessionId) + const { data: lastModelSetting } = useSystemSetting({ key: 'chat.lastModel', enabled }) + const { data: installedModels = [], isLoading: isLoadingModels } = useQuery({ queryKey: ['installedModels'], queryFn: () => api.getInstalledModels(), @@ -127,12 +130,24 @@ export default function Chat({ }, }) - // Set first model as selected by default + // Set default model: prefer last used model, fall back to first installed if last model not available useEffect(() => { if (installedModels.length > 0 && !selectedModel) { - setSelectedModel(installedModels[0].name) + const lastModel = lastModelSetting?.value as string | undefined + if (lastModel && installedModels.some((m) => m.name === lastModel)) { + setSelectedModel(lastModel) + } else { + setSelectedModel(installedModels[0].name) + } } - }, [installedModels, selectedModel]) + }, [installedModels, selectedModel, lastModelSetting]) + + // Persist model selection + useEffect(() => { + if (selectedModel) { + api.updateSetting('chat.lastModel', selectedModel) + } + }, [selectedModel]) const handleNewChat = useCallback(() => { // Just clear the active session and messages - don't create a session yet diff --git a/admin/types/kv_store.ts b/admin/types/kv_store.ts index 5b9dccd..557091b 100644 --- a/admin/types/kv_store.ts +++ b/admin/types/kv_store.ts @@ -1,6 +1,7 @@ export const KV_STORE_SCHEMA = { 'chat.suggestionsEnabled': 'boolean', + 'chat.lastModel': 'string', 'rag.docsEmbedded': 'boolean', 'system.updateAvailable': 'boolean', 'system.latestVersion': 'string',