diff --git a/web/containers/Layout/TopPanel/index.tsx b/web/containers/Layout/TopPanel/index.tsx index bed3ea6042..7cb264f471 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 925531a6e2..63a2512bf1 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 4b53f7c552..4c2519e86c 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 24d657b91d..0392fc5048 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 978f346776..9c6630ed09 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':