diff --git a/web/containers/Checkbox/index.tsx b/web/containers/Checkbox/index.tsx index 8cb2f5d70..de18ca052 100644 --- a/web/containers/Checkbox/index.tsx +++ b/web/containers/Checkbox/index.tsx @@ -1,48 +1,33 @@ -import { FieldValues, UseFormRegister } from 'react-hook-form' +import React from 'react' -import { ModelRuntimeParams } from '@janhq/core' import { Switch } from '@janhq/uikit' import { useAtomValue } from 'jotai' import useUpdateModelParameters from '@/hooks/useUpdateModelParameters' -import { - getActiveThreadIdAtom, - getActiveThreadModelRuntimeParamsAtom, -} from '@/helpers/atoms/Thread.atom' +import { getActiveThreadIdAtom } from '@/helpers/atoms/Thread.atom' type Props = { name: string title: string checked: boolean - register: UseFormRegister } -const Checkbox: React.FC = ({ name, title, checked, register }) => { +const Checkbox: React.FC = ({ name, title, checked }) => { const { updateModelParameter } = useUpdateModelParameters() const threadId = useAtomValue(getActiveThreadIdAtom) - const activeModelParams = useAtomValue(getActiveThreadModelRuntimeParamsAtom) const onCheckedChange = (checked: boolean) => { - if (!threadId || !activeModelParams) return + if (!threadId) return - const updatedModelParams: ModelRuntimeParams = { - ...activeModelParams, - [name]: checked, - } - - updateModelParameter(threadId, updatedModelParams) + updateModelParameter(threadId, name, checked) } return (
- - +

{title}

+
) } diff --git a/web/containers/DropdownListSidebar/index.tsx b/web/containers/DropdownListSidebar/index.tsx index 6448363d9..e40599344 100644 --- a/web/containers/DropdownListSidebar/index.tsx +++ b/web/containers/DropdownListSidebar/index.tsx @@ -28,14 +28,22 @@ import useRecommendedModel from '@/hooks/useRecommendedModel' import { toGigabytes } from '@/utils/converter' -import { activeThreadAtom, threadStatesAtom } from '@/helpers/atoms/Thread.atom' +import { + activeThreadAtom, + getActiveThreadIdAtom, + setThreadModelParamsAtom, + threadStatesAtom, +} from '@/helpers/atoms/Thread.atom' export const selectedModelAtom = atom(undefined) export default function DropdownListSidebar() { - const setSelectedModel = useSetAtom(selectedModelAtom) - const threadStates = useAtomValue(threadStatesAtom) + 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< @@ -54,15 +62,39 @@ export default function DropdownListSidebar() { useEffect(() => { setSelected(recommendedModel) setSelectedModel(recommendedModel) - }, [recommendedModel, setSelectedModel]) + + 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, setSelectedModel] + [downloadedModels, activeThreadId, setSelectedModel, setThreadModelParams] ) if (!activeThread) { diff --git a/web/containers/ModelConfigInput/index.tsx b/web/containers/ModelConfigInput/index.tsx new file mode 100644 index 000000000..caa4f7fa3 --- /dev/null +++ b/web/containers/ModelConfigInput/index.tsx @@ -0,0 +1,43 @@ +import { Textarea } from '@janhq/uikit' + +import { useAtomValue } from 'jotai' + +import useUpdateModelParameters from '@/hooks/useUpdateModelParameters' + +import { getActiveThreadIdAtom } from '@/helpers/atoms/Thread.atom' + +type Props = { + title: string + name: string + placeholder: string + value: string +} + +const ModelConfigInput: React.FC = ({ + title, + name, + value, + placeholder, +}) => { + const { updateModelParameter } = useUpdateModelParameters() + const threadId = useAtomValue(getActiveThreadIdAtom) + + const onValueChanged = (e: React.ChangeEvent) => { + if (!threadId) return + + updateModelParameter(threadId, name, e.target.value) + } + + return ( +
+

{title}

+