From f882fe2c32f83d471829d581176e5cb0554a94ff Mon Sep 17 00:00:00 2001 From: jialin Date: Tue, 25 Mar 2025 16:37:52 +0800 Subject: [PATCH] fix: deploy from model files source incorrect --- config/theme.ts | 5 + src/global.less | 7 ++ src/hooks/use-table-fetch.ts | 22 ++-- src/locales/en-US/resources.ts | 2 +- src/locales/ru-RU/resources.ts | 2 +- src/locales/zh-CN/resources.ts | 2 +- src/pages/llmodels/components/data-form.tsx | 26 +--- .../llmodels/components/deploy-modal.tsx | 112 +++++++++--------- src/pages/llmodels/components/instances.tsx | 58 --------- src/pages/llmodels/download/target-form.tsx | 12 +- .../resources/components/model-files.tsx | 47 ++++---- 11 files changed, 113 insertions(+), 182 deletions(-) diff --git a/config/theme.ts b/config/theme.ts index 7e7132ae..5229762e 100644 --- a/config/theme.ts +++ b/config/theme.ts @@ -32,6 +32,11 @@ export default { colorBgSpotlight: '#3e3e3e' // sizePopupArrow: 0 }, + Button: { + primaryShadow: 'none', + defaultShadow: 'none', + dangerShadow: 'none' + }, Cascader: { dropdownHeight: 240 }, diff --git a/src/global.less b/src/global.less index 05a2045f..6c969a32 100644 --- a/src/global.less +++ b/src/global.less @@ -923,3 +923,10 @@ body { .ant-notification .ant-notification-notice-close { width: fit-content !important; } + +.desc-block { + border-radius: var(--border-radius-2px); + background-color: rgb(89 89 89); + font-weight: var(--font-weight-bold); + padding: 2px; +} diff --git a/src/hooks/use-table-fetch.ts b/src/hooks/use-table-fetch.ts index b5c30066..ab063fd4 100644 --- a/src/hooks/use-table-fetch.ts +++ b/src/hooks/use-table-fetch.ts @@ -106,13 +106,16 @@ export default function useTableFetch(options: { } }; - const handlePageChange = (page: number, pageSize: number) => { + const handleQueryChange = (params: any) => { setQueryParams({ ...queryParams, - page: page, - perPage: pageSize || 10 + ...params }); - fetchData({ query: { ...queryParams, page, perPage: pageSize || 10 } }); + fetchData({ query: { ...queryParams, ...params } }); + }; + + const handlePageChange = (page: number, pageSize: number) => { + handleQueryChange({ page, perPage: pageSize || 10 }); }; const handleTableChange = (pagination: any, filters: any, sorter: any) => { @@ -124,18 +127,10 @@ export default function useTableFetch(options: { }; const debounceUpdateFilter = _.debounce((e: any) => { - setQueryParams({ - ...queryParams, + handleQueryChange({ page: 1, search: e.target.value }); - fetchData({ - query: { - ...queryParams, - page: 1, - search: e.target.value - } - }); createModelsChunkRequest({ ...queryParams, search: e.target.value @@ -198,6 +193,7 @@ export default function useTableFetch(options: { handlePageChange, handleTableChange, handleSearch, + handleQueryChange, handleNameChange }; } diff --git a/src/locales/en-US/resources.ts b/src/locales/en-US/resources.ts index b84e3411..6c956ba4 100644 --- a/src/locales/en-US/resources.ts +++ b/src/locales/en-US/resources.ts @@ -63,7 +63,7 @@ export default { 'resources.modelfiles.selecttarget': 'Select Target', 'resources.modelfiles.form.localdir': 'Local Directory', 'resources.modelfiles.form.localdir.tips': - 'The default storage directory is /var/lib/gpustack/cache.', + 'The default storage directory is /var/lib/gpustack/cache or the directory specified with --data-dir.', 'resources.modelfiles.retry.download': 'Retry Download', 'resources.modelfiles.storagePath.holder': 'Waiting for download to complete...', diff --git a/src/locales/ru-RU/resources.ts b/src/locales/ru-RU/resources.ts index ab907e84..c45920ba 100644 --- a/src/locales/ru-RU/resources.ts +++ b/src/locales/ru-RU/resources.ts @@ -63,7 +63,7 @@ export default { 'resources.modelfiles.selecttarget': 'Select Target', 'resources.modelfiles.form.localdir': 'Local Directory', 'resources.modelfiles.form.localdir.tips': - 'The default storage directory is /var/lib/gpustack/cache.', + 'The default storage directory is --data-dir.', 'resources.modelfiles.retry.download': 'Retry Download', 'resources.modelfiles.storagePath.holder': 'Waiting for download to complete...', diff --git a/src/locales/zh-CN/resources.ts b/src/locales/zh-CN/resources.ts index d4106b28..1731b7df 100644 --- a/src/locales/zh-CN/resources.ts +++ b/src/locales/zh-CN/resources.ts @@ -62,7 +62,7 @@ export default { 'resources.modelfiles.selecttarget': '选择目标位置', 'resources.modelfiles.form.localdir': '本地目录', 'resources.modelfiles.form.localdir.tips': - '默认存储目录为 /var/lib/gpustack/cache', + '默认存储目录为 /var/lib/gpustack/cache,或使用 --data-dir 指定的目录', 'resources.modelfiles.retry.download': '重新下载', 'resources.modelfiles.storagePath.holder': '等待下载完成...', 'resources.filter.worker': '按 worker 筛选', diff --git a/src/pages/llmodels/components/data-form.tsx b/src/pages/llmodels/components/data-form.tsx index 911dd140..3493c6f4 100644 --- a/src/pages/llmodels/components/data-form.tsx +++ b/src/pages/llmodels/components/data-form.tsx @@ -99,6 +99,7 @@ const DataForm: React.FC = forwardRef((props, ref) => { ref, () => { return { + form: form, submit: handleSumit, setFieldsValue: (values: FormData) => { form.setFieldsValue(values); @@ -288,30 +289,6 @@ const DataForm: React.FC = forwardRef((props, ref) => { label={intl.formatMessage({ id: 'models.form.filePath' })} description={} > - {/* } - expandTrigger="hover" - multiple={false} - onSearch={handleOnSearch} - popupClassName="cascader-popup-wrapper gpu-selector" - maxTagCount={1} - label={intl.formatMessage({ id: 'models.form.gpuselector' })} - options={modelFileOptions} - showCheckedStrategy="SHOW_CHILD" - value={form.getFieldValue('local_path')} - getPopupContainer={(triggerNode) => triggerNode.parentNode} - displayRender={() => ( - - )} - > */} ); @@ -488,7 +465,6 @@ const DataForm: React.FC = forwardRef((props, ref) => { useEffect(() => { handleOnSelectModel(); }, [props.selectedModel.name]); - return (
void; onCancel: () => void; }; @@ -39,6 +40,7 @@ const AddModal: FC = (props) => { source, action, width = 600, + deploymentType = 'modelList', initialValues } = props || {}; const SEARCH_SOURCE = [ @@ -147,8 +149,10 @@ const AddModal: FC = (props) => { } else if (source === modelSourceMap.ollama_library_value) { form.current?.setFieldValue?.('backend', backendOptionsMap.llamaBox); setIsGGUF(true); - } else { - form.current?.setFieldsValue({ + } + + if (props.deploymentType === 'modelFiles' && open) { + form.current?.form?.setFieldsValue({ ...props.initialValues }); setIsGGUF(props.isGGUF || false); @@ -157,7 +161,7 @@ const AddModal: FC = (props) => { return () => { setSelectedModel({}); }; - }, [open, source, props.isGGUF, props.initialValues]); + }, [open, source, props.isGGUF, props.initialValues, props.deploymentType]); return ( = (props) => { footer={false} >
- {SEARCH_SOURCE.includes(props.source) && ( - <> -
- - - - -
-
- - - {isGGUF && ( - +
+ + + + +
+
+ + - )} - - -
- - )} + modelSource={props.source} + setIsGGUF={handleSetIsGGUF} + > + {isGGUF && ( + + )} +
+ +
+ + )}
= (props) => { } > <> - {SEARCH_SOURCE.includes(source) && ( - - {intl.formatMessage({ id: 'models.form.configurations' })} - - - )} + {SEARCH_SOURCE.includes(source) && + deploymentType === 'modelList' && ( + + {intl.formatMessage({ id: 'models.form.configurations' })} + + + )} = forwardRef((props, ref) => { ]} > + } label={intl.formatMessage({ id: 'resources.modelfiles.form.localdir' })} diff --git a/src/pages/resources/components/model-files.tsx b/src/pages/resources/components/model-files.tsx index c5032aec..21a23896 100644 --- a/src/pages/resources/components/model-files.tsx +++ b/src/pages/resources/components/model-files.tsx @@ -15,7 +15,8 @@ import DeployModal from '@/pages/llmodels/components/deploy-modal'; import { backendOptionsMap, getSourceRepoConfigValue, - modelSourceMap + modelSourceMap, + setSourceRepoConfigValue } from '@/pages/llmodels/config'; import { identifyModelTask } from '@/pages/llmodels/config/audio-catalog'; import { @@ -66,8 +67,7 @@ import { ListItem as WorkerListItem } from '../config/types'; -const pattern = /^(.*)-(\d+)-of-(\d+)\.(.*)$/; -const filterPattern = /^(.*)-\d+-of-\d+(\.gguf)?$/; +const filterPattern = /^(.*?)(?:-\d+-of-\d+)?(\.gguf)?$/; const getWorkerName = ( id: number, @@ -122,7 +122,7 @@ const ModelFiles = () => { handleTableChange, handleSearch, handleNameChange, - setQueryParams + handleQueryChange } = useTableFetch({ fetchAPI: queryModelFilesList, deleteAPI: deleteModelFile, @@ -198,18 +198,10 @@ const ModelFiles = () => { }; const handleWorkerChange = (value: number) => { - setQueryParams({ - ...queryParams, + handleQueryChange({ page: 1, worker_id: value }); - fetchData({ - query: { - ...queryParams, - page: 1, - worker_id: value - } - }); }; const generateInitialValues = (record: ListItem) => { const isGGUF = _.includes(record.resolved_paths?.[0], 'gguf'); @@ -229,9 +221,12 @@ const ModelFiles = () => { ).pop() ); + const result = setSourceRepoConfigValue(record.source, record); + return { - source: modelSourceMap.local_path_value, - local_path: record.resolved_paths?.[0], + ...result.values, + source: record.source, + local_path: record.local_path, name: extractFileName(name), backend: isGGUF || isOllama @@ -248,17 +243,7 @@ const ModelFiles = () => { if (!parts.length) { return null; } - const partsList = parts.map((item: string) => { - const match = item.match(pattern); - if (!match) { - return null; - } - return { - part: parseInt(match[2], 10), - total: parseInt(match[3], 10), - name: _.split(match[1], '/').pop() - }; - }); + return ( { ]); const dataList = generateModelFileOptions(modelFileList, workersList); const initialValues = generateInitialValues(record); + console.log('initialValues:', initialValues); setOpenDeployModal({ ...openDeployModal, + source: record.source, + width: 600, modelFileOptions: dataList, gpuOptions: gpuList, initialValues: initialValues, @@ -393,7 +381,11 @@ const ModelFiles = () => { dataIndex: 'source', render: (text: string, record: ListItem) => ( - {generateSource(record)} + {record.source === modelSourceMap.local_path_value ? ( + intl.formatMessage({ id: 'models.form.localPath' }) + ) : ( + {generateSource(record)} + )} ) }, @@ -581,6 +573,7 @@ const ModelFiles = () => { workersList={workersList} >