import { useCallback, useEffect, useState } from 'react' import { InferenceEngine, Model } from '@janhq/core' import { Button, Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, Input, } from '@janhq/uikit' import { atom, useAtomValue, useSetAtom } from 'jotai' import { MonitorIcon } from 'lucide-react' import { twMerge } from 'tailwind-merge' import { MainViewState } from '@/constants/screens' import { useEngineSettings } from '@/hooks/useEngineSettings' import { useMainViewState } from '@/hooks/useMainViewState' import useRecommendedModel from '@/hooks/useRecommendedModel' import { toGibibytes } from '@/utils/converter' import { activeThreadAtom, getActiveThreadIdAtom, setThreadModelParamsAtom, threadStatesAtom, } from '@/helpers/atoms/Thread.atom' export const selectedModelAtom = atom(undefined) export default function DropdownListSidebar() { const activeThreadId = useAtomValue(getActiveThreadIdAtom) const activeThread = useAtomValue(activeThreadAtom) const threadStates = useAtomValue(threadStatesAtom) const setSelectedModel = useSetAtom(selectedModelAtom) const setThreadModelParams = useSetAtom(setThreadModelParamsAtom) const [selected, setSelected] = useState() const { setMainViewState } = useMainViewState() const [openAISettings, setOpenAISettings] = useState< { api_key: string } | undefined >(undefined) const { readOpenAISettings, saveOpenAISettings } = useEngineSettings() useEffect(() => { readOpenAISettings().then((settings) => { setOpenAISettings(settings) }) }, []) const { recommendedModel, downloadedModels } = useRecommendedModel() useEffect(() => { setSelected(recommendedModel) setSelectedModel(recommendedModel) if (activeThread) { const finishInit = threadStates[activeThread.id].isFinishInit ?? true if (finishInit) return const modelParams = { ...recommendedModel?.parameters, ...recommendedModel?.settings, } setThreadModelParams(activeThread.id, modelParams) } }, [ recommendedModel, activeThread, setSelectedModel, setThreadModelParams, threadStates, ]) const onValueSelected = useCallback( (modelId: string) => { const model = downloadedModels.find((m) => m.id === modelId) setSelected(model) setSelectedModel(model) if (activeThreadId) { const modelParams = { ...model?.parameters, ...model?.settings, } setThreadModelParams(activeThreadId, modelParams) } }, [downloadedModels, activeThreadId, setSelectedModel, setThreadModelParams] ) if (!activeThread) { return null } return ( <> {selected?.engine === InferenceEngine.openai && (
{ saveOpenAISettings({ apiKey: e.target.value }) }} />
)} ) }