import ModalFooter from '@/components/modal-footer'; import GSDrawer from '@/components/scroller-modal/gs-drawer'; import { useIntl } from '@umijs/max'; import { debounce } from 'lodash'; import React, { useCallback, useEffect, useRef, useState } from 'react'; 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; workersList: Global.BaseOption[]; workerOptions: any[]; onOk: (values: FormData) => void; onCancel: () => void; }; const DownloadModel: React.FC = (props) => { const { title, workersList, open, onOk, onCancel, hasLinuxWorker, source, width = 600, workerOptions } = 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 handleSelectModelFile = useCallback((item: any) => { setFileName(item.fakeName); }, []); 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 handleCancel = useCallback(() => { onCancel?.(); }, [onCancel]); useEffect(() => { handleSelectModelFile({ fakeName: '' }); }, [selectedModel]); useEffect(() => { if (!open) { setIsGGUF(false); } else if (source === modelSourceMap.ollama_library_value) { setIsGGUF(true); } if (open) { form.current?.form?.setFieldValue( 'worker_id', workersList[0]?.value || '' ); } return () => { setSelectedModel({}); }; }, [open, source]); return (
{SEARCH_SOURCE.includes(props.source) && ( <>
{isGGUF && ( )}
)}
} > <> {SEARCH_SOURCE.includes(source) && ( {intl.formatMessage({ id: 'resources.modelfiles.selecttarget' })} )}
); }; export default DownloadModel;