From fdab8af057f80cf1ccaae0dc42c4e5161925f51e Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Mon, 12 Aug 2024 17:49:21 +0700 Subject: [PATCH] feat: allow user configure remote model from my model (#3348) * feat: allow user configure remote model from my model * chore: fix linter * chore: fix linter * chore: add dedpendecies useCallback model item --- web/containers/Layout/TopPanel/index.tsx | 2 +- web/containers/ModelDropdown/ModelSection.tsx | 3 +- web/hooks/useGetModelsByEngine.ts | 2 +- .../Settings/MyModels/ModelGroup/index.tsx | 169 ++++++++++++++++++ .../Settings/MyModels/ModelItem/index.tsx | 59 +++++- web/screens/Settings/MyModels/index.tsx | 27 +-- web/utils/model-engine.ts | 6 + 7 files changed, 240 insertions(+), 28 deletions(-) create mode 100644 web/screens/Settings/MyModels/ModelGroup/index.tsx diff --git a/web/containers/Layout/TopPanel/index.tsx b/web/containers/Layout/TopPanel/index.tsx index bed3ea604..7cb264f47 100644 --- a/web/containers/Layout/TopPanel/index.tsx +++ b/web/containers/Layout/TopPanel/index.tsx @@ -69,7 +69,7 @@ const TopPanel = () => { }, [activeThread?.id, setActiveThread, threads]) const onCreateThreadClicked = useCallback(async () => { - if (!assistants || assistants.length) { + if (!assistants || !assistants.length) { toaster({ title: 'No assistant available.', description: `Could not create a new thread. Please add an assistant.`, diff --git a/web/containers/ModelDropdown/ModelSection.tsx b/web/containers/ModelDropdown/ModelSection.tsx index 925531a6e..63a2512bf 100644 --- a/web/containers/ModelDropdown/ModelSection.tsx +++ b/web/containers/ModelDropdown/ModelSection.tsx @@ -129,7 +129,7 @@ const ModelSection: React.FC = ({ {engineName} -
+
{isRemoteEngine && ( + )} + {!showModel ? ( + + ) : ( + + )} +
+
+
+ {models.map((model) => { + if (!showModel) return null + + return + })} +
+ + ) +} + +export default ModelGroup diff --git a/web/screens/Settings/MyModels/ModelItem/index.tsx b/web/screens/Settings/MyModels/ModelItem/index.tsx index 4b53f7c55..4c2519e86 100644 --- a/web/screens/Settings/MyModels/ModelItem/index.tsx +++ b/web/screens/Settings/MyModels/ModelItem/index.tsx @@ -1,6 +1,12 @@ import { memo, useCallback, useMemo, useState } from 'react' -import { LocalEngines, Model } from '@janhq/core' +import { + EngineStatus, + LocalEngines, + Model, + RemoteEngine, + RemoteEngines, +} from '@janhq/core' import { Badge, Button, useClickOutside } from '@janhq/joi' import { useAtomValue, useSetAtom } from 'jotai' @@ -12,12 +18,19 @@ import { } from 'lucide-react' import { twMerge } from 'tailwind-merge' +import { toaster } from '@/containers/Toast' + +import useAssistantQuery from '@/hooks/useAssistantQuery' +import useEngineQuery from '@/hooks/useEngineQuery' import useModelStart from '@/hooks/useModelStart' import useModelStop from '@/hooks/useModelStop' import useModels from '@/hooks/useModels' +import useThreadCreateMutation from '@/hooks/useThreadCreateMutation' + import { showWarningMultipleModelModalAtom } from '@/screens/HubScreen2/components/WarningMultipleModelModal' +import { MainViewState, mainViewStateAtom } from '@/helpers/atoms/App.atom' import { activeModelsAtom } from '@/helpers/atoms/Model.atom' type Props = { @@ -33,6 +46,14 @@ const ModelItem: React.FC = ({ model }) => { const stopModel = useModelStop() const [more, setMore] = useState(false) const { deleteModel } = useModels() + const { data: engineData } = useEngineQuery() + const createThreadMutation = useThreadCreateMutation() + const { data: assistants } = useAssistantQuery() + const setMainViewState = useSetAtom(mainViewStateAtom) + const isRemoteEngine = RemoteEngines.includes(model.engine as RemoteEngine) + const isEngineReady = + engineData?.find((e) => e.name === model.engine)?.status === + EngineStatus.Ready const [menu, setMenu] = useState(null) const [toggle, setToggle] = useState(null) @@ -82,6 +103,33 @@ const ModelItem: React.FC = ({ model }) => { (e) => model.engine != null && e === model.engine ) + const onClickCloudModel = useCallback(async () => { + if (!isRemoteEngine) return null + if (!model || !engineData) return + if (!assistants || !assistants.length) { + toaster({ + title: 'No assistant available.', + description: `Could not create a new thread. Please add an assistant.`, + type: 'error', + }) + return + } + + await createThreadMutation.mutateAsync({ + modelId: model.model, + assistant: assistants[0], + }) + + setMainViewState(MainViewState.Thread) + }, [ + assistants, + createThreadMutation, + engineData, + isRemoteEngine, + model, + setMainViewState, + ]) + return (
@@ -89,11 +137,14 @@ const ModelItem: React.FC = ({ model }) => {
{model.model}
diff --git a/web/screens/Settings/MyModels/index.tsx b/web/screens/Settings/MyModels/index.tsx index 24d657b91..0392fc504 100644 --- a/web/screens/Settings/MyModels/index.tsx +++ b/web/screens/Settings/MyModels/index.tsx @@ -18,7 +18,7 @@ import useDropModelBinaries from '@/hooks/useDropModelBinaries' import { setImportModelStageAtom } from '@/hooks/useImportModel' -import ModelItem from './ModelItem' +import ModelGroup from './ModelGroup' import { MainViewState, mainViewStateAtom } from '@/helpers/atoms/App.atom' import { downloadedModelsAtom } from '@/helpers/atoms/Model.atom' @@ -123,27 +123,14 @@ const MyModels = () => { )} ) : ( -
+
{LlmEngines.map((engine) => { - const modelByEngine = filteredDownloadedModels.filter( - (x) => x.engine === engine - ) - - if (modelByEngine.length === 0) return null - return ( -
-
-
- {engine} -
-
-
- {modelByEngine.map((model) => ( - - ))} -
-
+ ) })}
diff --git a/web/utils/model-engine.ts b/web/utils/model-engine.ts index 978f34677..9c6630ed0 100644 --- a/web/utils/model-engine.ts +++ b/web/utils/model-engine.ts @@ -7,6 +7,12 @@ export const getTitleByCategory = (category: ModelHubCategory) => { switch (category) { case 'cortex.llamacpp': return 'llama.cpp' + case 'cortex.onnx': + return 'Onnx' + case 'cortex.tensorrt-llm': + return 'Tensorrt-llm' + case 'triton_trtllm': + return 'Triton-trtllm' case 'BuiltInModels': return 'Built-in Models' case 'HuggingFace':