From 55ab4ae70ffb7de87891f19fdba1956d91bdcb87 Mon Sep 17 00:00:00 2001 From: NamH Date: Tue, 19 Dec 2023 10:51:41 +0700 Subject: [PATCH] fix(thread): #1043 default model to prefer active model (#1070) Signed-off-by: James Co-authored-by: James --- web/containers/DropdownListSidebar/index.tsx | 59 ++++------ web/hooks/useActiveModel.ts | 7 +- web/hooks/useGetDownloadedModels.ts | 9 +- web/hooks/useRecommendedModel.ts | 110 +++++++++++++++++++ 4 files changed, 137 insertions(+), 48 deletions(-) create mode 100644 web/hooks/useRecommendedModel.ts diff --git a/web/containers/DropdownListSidebar/index.tsx b/web/containers/DropdownListSidebar/index.tsx index 84f1fc828..a389e8314 100644 --- a/web/containers/DropdownListSidebar/index.tsx +++ b/web/containers/DropdownListSidebar/index.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react' +import { useCallback, useEffect, useState } from 'react' import { InferenceEngine, Model } from '@janhq/core' import { @@ -20,12 +20,12 @@ import { twMerge } from 'tailwind-merge' import { MainViewState } from '@/constants/screens' -import { useActiveModel } from '@/hooks/useActiveModel' import { useEngineSettings } from '@/hooks/useEngineSettings' -import { getDownloadedModels } from '@/hooks/useGetDownloadedModels' import { useMainViewState } from '@/hooks/useMainViewState' +import useRecommendedModel from '@/hooks/useRecommendedModel' + import { toGigabytes } from '@/utils/converter' import { activeThreadAtom, threadStatesAtom } from '@/helpers/atoms/Thread.atom' @@ -33,13 +33,12 @@ import { activeThreadAtom, threadStatesAtom } from '@/helpers/atoms/Thread.atom' export const selectedModelAtom = atom(undefined) export default function DropdownListSidebar() { - const [downloadedModels, setDownloadedModels] = useState([]) const setSelectedModel = useSetAtom(selectedModelAtom) + const threadStates = useAtomValue(threadStatesAtom) const activeThread = useAtomValue(activeThreadAtom) const [selected, setSelected] = useState() const { setMainViewState } = useMainViewState() - const { activeModel, stateModel } = useActiveModel() - const [opeenAISettings, setOpenAISettings] = useState< + const [openAISettings, setOpenAISettings] = useState< { api_key: string } | undefined >(undefined) const { readOpenAISettings, saveOpenAISettings } = useEngineSettings() @@ -50,43 +49,27 @@ export default function DropdownListSidebar() { }) }, []) - useEffect(() => { - getDownloadedModels().then((downloadedModels) => { - setDownloadedModels( - downloadedModels.sort((a, b) => - a.engine !== InferenceEngine.nitro && - b.engine === InferenceEngine.nitro - ? 1 - : -1 - ) - ) - if (downloadedModels.length > 0) { - setSelected( - downloadedModels.filter( - (x) => x.id === activeThread?.assistants[0].model.id - )[0] || downloadedModels[0] - ) - setSelectedModel( - downloadedModels.filter( - (x) => x.id === activeThread?.assistants[0].model.id - )[0] || downloadedModels[0] - ) - } - }) - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [activeThread, activeModel, stateModel.loading]) + const { recommendedModel, downloadedModels } = useRecommendedModel() + + useEffect(() => { + setSelected(recommendedModel) + setSelectedModel(recommendedModel) + }, [recommendedModel, setSelectedModel]) + + const onValueSelected = useCallback( + (modelId: string) => { + const model = downloadedModels.find((m) => m.id === modelId) + setSelected(model) + setSelectedModel(model) + }, + [downloadedModels, setSelectedModel] + ) - const threadStates = useAtomValue(threadStatesAtom) if (!activeThread) { return null } const finishInit = threadStates[activeThread.id].isFinishInit ?? true - const onValueSelected = (value: string) => { - setSelected(downloadedModels.filter((x) => x.id === value)[0]) - setSelectedModel(downloadedModels.filter((x) => x.id === value)[0]) - } - return ( <>