import ModalFooter from '@/components/modal-footer'; import GSDrawer from '@/components/scroller-modal/gs-drawer'; import { ProviderValueMap } from '@/pages/cluster-management/config'; import { useIntl } from '@umijs/max'; import { debounce } from 'lodash'; import React, { useCallback, useEffect, useRef, useState } from 'react'; import styled from 'styled-components'; import ColumnWrapper from '../../_components/column-wrapper'; import HFModelFile from '../components/hf-model-file'; import ModelCard from '../components/model-card'; import SearchModel from '../components/search-model'; import Separator from '../components/separator'; import TitleWrapper from '../components/title-wrapper'; import { modelSourceMap } from '../config'; import { FormData } from '../config/types'; import TargetForm from './target-form'; type AddModalProps = { title: string; open: boolean; source: string; width?: string | number; hasLinuxWorker?: boolean; workerOptions: any[]; workersList?: any[]; onOk: (values: FormData) => void; onCancel: () => void; }; const ColWrapper = styled.div` display: flex; flex: 1; max-width: 33.33%; `; const FormWrapper = styled.div` display: flex; flex: 1; maxwidth: 100%; `; const DownloadModel: React.FC = (props) => { const { title, open, onOk, onCancel, hasLinuxWorker, source, width = 600, workerOptions, workersList } = props || {}; const SEARCH_SOURCE = [ modelSourceMap.huggingface_value, modelSourceMap.modelscope_value ]; const form = useRef({}); const intl = useIntl(); const [selectedModel, setSelectedModel] = useState({}); const [collapsed, setCollapsed] = useState(false); const [isGGUF, setIsGGUF] = useState(false); const [fileName, setFileName] = useState(''); const modelFileRef = useRef(null); const generateModelInfo = () => { if (source === modelSourceMap.huggingface_value) { const huggingFaceModel = { huggingface_repo_id: selectedModel.name, huggingface_filename: fileName || null }; return huggingFaceModel; } if (source === modelSourceMap.modelscope_value) { const modelScopeModel = { model_scope_model_id: selectedModel.name, model_scope_file_path: fileName || null }; return modelScopeModel; } return {}; }; const handleOnSelectModel = (item: any) => { setSelectedModel(item); }; const handleOk = (values: any) => { onOk({ ...values, source: source, ...generateModelInfo() }); }; const handleSumit = () => { form.current?.form?.submit?.(); }; const debounceFetchModelFiles = debounce(() => { modelFileRef.current?.fetchModelFiles?.(); }, 300); const handleSetIsGGUF = (flag: boolean) => { setIsGGUF(flag); if (flag) { debounceFetchModelFiles(); } }; const handleSelectModelFile = useCallback((item: any) => { setFileName(item.fakeName); }, []); const handleCancel = useCallback(() => { onCancel?.(); }, [onCancel]); const initDefaultWorker = () => { if (!workerOptions || workerOptions.length === 0) { form.current?.form?.setFieldValue('worker_id', []); return; } const getWorkerId = (worker: any) => [ worker?.value ?? '', worker?.children?.[0]?.value ?? '' ]; const customWorker = workerOptions.find( (item) => item.provider === ProviderValueMap.Docker ); const worker_id = getWorkerId(customWorker || workerOptions[0]); form.current?.form?.setFieldValue('worker_id', worker_id); }; useEffect(() => { if (!open) { setIsGGUF(false); } if (open) { initDefaultWorker(); } return () => { setSelectedModel({}); }; }, [open, source]); return (
{SEARCH_SOURCE.includes(props.source) && ( <> {isGGUF && ( )} )} } > <> {SEARCH_SOURCE.includes(source) && ( {intl.formatMessage({ id: 'resources.modelfiles.selecttarget' })} )}
); }; export default DownloadModel;