From 8c759676d9ceebb339e80a47d5818dff7fa7da87 Mon Sep 17 00:00:00 2001 From: Louis Date: Wed, 30 Oct 2024 10:34:42 +0700 Subject: [PATCH] chore: fix responsible issue when importing models (cortex.cpp does not support download in parallel yet) --- web/containers/ModelDropdown/index.tsx | 9 +++- web/hooks/useImportModel.ts | 41 ++++++++++--------- .../ModelDownloadRow/index.tsx | 11 +++-- web/screens/Settings/MyModels/index.tsx | 7 +++- web/utils/converter.ts | 2 +- 5 files changed, 44 insertions(+), 26 deletions(-) diff --git a/web/containers/ModelDropdown/index.tsx b/web/containers/ModelDropdown/index.tsx index abd9af247..4ff8edac5 100644 --- a/web/containers/ModelDropdown/index.tsx +++ b/web/containers/ModelDropdown/index.tsx @@ -261,8 +261,13 @@ const ModelDropdown = ({ }, []) const findByEngine = filteredDownloadedModels - .filter((x) => !inActiveEngineProvider.includes(x.engine)) - .map((x) => x.engine) + .map((x) => { + // Legacy engine support - they will be grouped under Cortex LlamaCPP + if (x.engine === InferenceEngine.nitro) + return InferenceEngine.cortex_llamacpp + return x.engine + }) + .filter((x) => !inActiveEngineProvider.includes(x)) const groupByEngine = findByEngine .filter(function (item, index) { diff --git a/web/hooks/useImportModel.ts b/web/hooks/useImportModel.ts index 5650c73bd..951e93bef 100644 --- a/web/hooks/useImportModel.ts +++ b/web/hooks/useImportModel.ts @@ -18,7 +18,11 @@ import { snackbar } from '@/containers/Toast' import { FilePathWithSize } from '@/utils/file' import { extensionManager } from '@/extension' -import { importingModelsAtom } from '@/helpers/atoms/Model.atom' +import { + addDownloadingModelAtom, + importingModelsAtom, + removeDownloadingModelAtom, +} from '@/helpers/atoms/Model.atom' export type ImportModelStage = | 'NONE' @@ -49,11 +53,25 @@ export type ModelUpdate = { const useImportModel = () => { const setImportModelStage = useSetAtom(setImportModelStageAtom) const setImportingModels = useSetAtom(importingModelsAtom) + const addDownloadingModel = useSetAtom(addDownloadingModelAtom) + const removeDownloadingModel = useSetAtom(removeDownloadingModelAtom) const importModels = useCallback( - (models: ImportingModel[], optionType: OptionType) => - localImportModels(models, optionType), - [] + (models: ImportingModel[], optionType: OptionType) => { + models + .filter((e) => !!e.modelId) + .map((model) => { + if (model.modelId) { + const modelId = model.modelId + addDownloadingModel(modelId) + extensionManager + .get(ExtensionTypeEnum.Model) + ?.importModel(model.modelId, model.path) + .finally(() => removeDownloadingModel(modelId)) + } + }) + }, + [addDownloadingModel, removeDownloadingModel] ) const updateModelInfo = useCallback( @@ -101,21 +119,6 @@ const useImportModel = () => { return { importModels, updateModelInfo, sanitizeFilePaths } } -const localImportModels = async ( - models: ImportingModel[], - // TODO: @louis - We will set this option when cortex.cpp supports it - optionType: OptionType -): Promise => { - await models - .filter((e) => !!e.modelId) - .map((model) => { - if (model.modelId) - extensionManager - .get(ExtensionTypeEnum.Model) - ?.importModel(model.modelId, model.path) - }) -} - const localUpdateModelInfo = async ( modelInfo: Partial ): Promise => diff --git a/web/screens/Settings/HuggingFaceRepoDetailModal/ModelDownloadRow/index.tsx b/web/screens/Settings/HuggingFaceRepoDetailModal/ModelDownloadRow/index.tsx index ccb966829..bd9f67ebb 100644 --- a/web/screens/Settings/HuggingFaceRepoDetailModal/ModelDownloadRow/index.tsx +++ b/web/screens/Settings/HuggingFaceRepoDetailModal/ModelDownloadRow/index.tsx @@ -21,7 +21,10 @@ import { mainViewStateAtom } from '@/helpers/atoms/App.atom' import { assistantsAtom } from '@/helpers/atoms/Assistant.atom' import { importHuggingFaceModelStageAtom } from '@/helpers/atoms/HuggingFace.atom' -import { downloadedModelsAtom } from '@/helpers/atoms/Model.atom' +import { + downloadedModelsAtom, + getDownloadingModelAtom, +} from '@/helpers/atoms/Model.atom' type Props = { index: number @@ -42,11 +45,13 @@ const ModelDownloadRow: React.FC = ({ const { downloadModel, abortModelDownload } = useDownloadModel() const allDownloadStates = useAtomValue(modelDownloadStateAtom) const downloadState: DownloadState | undefined = allDownloadStates[fileName] + const downloadingModels = useAtomValue(getDownloadingModelAtom) const { requestCreateNewThread } = useCreateNewThread() const setMainViewState = useSetAtom(mainViewStateAtom) const assistants = useAtomValue(assistantsAtom) const downloadedModel = downloadedModels.find((md) => md.id === fileName) + const isDownloading = downloadingModels.some((md) => md === fileName) const setHfImportingStage = useSetAtom(importHuggingFaceModelStageAtom) @@ -114,7 +119,7 @@ const ModelDownloadRow: React.FC = ({ > Use - ) : downloadState != null ? ( + ) : isDownloading ? ( diff --git a/web/screens/Settings/MyModels/index.tsx b/web/screens/Settings/MyModels/index.tsx index 547e6153b..ba42d12c2 100644 --- a/web/screens/Settings/MyModels/index.tsx +++ b/web/screens/Settings/MyModels/index.tsx @@ -116,7 +116,12 @@ const MyModels = () => { getAllSettings() }, []) - const findByEngine = filteredDownloadedModels.map((x) => x.engine) + const findByEngine = filteredDownloadedModels.map((x) => { + // Legacy engine support - they will be grouped under Cortex LlamaCPP + if (x.engine === InferenceEngine.nitro) + return InferenceEngine.cortex_llamacpp + return x.engine + }) const groupByEngine = findByEngine .filter(function (item, index) { if (findByEngine.indexOf(item) === index) return item diff --git a/web/utils/converter.ts b/web/utils/converter.ts index 9991fb5d7..017a05d1a 100644 --- a/web/utils/converter.ts +++ b/web/utils/converter.ts @@ -19,7 +19,7 @@ export const formatDownloadPercentage = ( options?: { hidePercentage?: boolean } ) => { if (options?.hidePercentage) return input <= 1 ? input * 100 : input - return (input <= 1 ? input * 100 : input).toFixed(2) + '%' + return (input <= 1 ? input * 100 : (input ?? 0)).toFixed(2) + '%' } export const formatDownloadSpeed = (input: number | undefined) => {