fix: #2191,#2227

This commit is contained in:
jialin
2025-06-19 13:36:49 +08:00
parent df85284a60
commit 175b83dd68
3 changed files with 67 additions and 25 deletions
+43 -14
View File
@@ -124,8 +124,12 @@ const AddModal: FC<AddModalProps> = (props) => {
const [collapsed, setCollapsed] = useState<boolean>(false); const [collapsed, setCollapsed] = useState<boolean>(false);
const [isGGUF, setIsGGUF] = useState<boolean>(false); const [isGGUF, setIsGGUF] = useState<boolean>(false);
const modelFileRef = useRef<any>(null); const modelFileRef = useRef<any>(null);
const evaluateStateRef = useRef<{ state: EvaluateProccessType }>({ const evaluateStateRef = useRef<{
state: 'form' state: EvaluateProccessType;
requestModelId: number;
}>({
state: 'form',
requestModelId: 0
}); });
const requestModelIdRef = useRef<number>(0); const requestModelIdRef = useRef<number>(0);
@@ -143,8 +147,20 @@ const AddModal: FC<AddModalProps> = (props) => {
* @param state target to distinguish the evaluate state, current evaluate state * @param state target to distinguish the evaluate state, current evaluate state
* can be 'model', 'file' or 'form'. * can be 'model', 'file' or 'form'.
*/ */
const setEvaluteState = (state: EvaluateProccessType) => { const setEvaluteState = (state: {
evaluateStateRef.current.state = state; state: EvaluateProccessType;
requestModelId: number;
}) => {
evaluateStateRef.current = state;
};
const updateEvaluateState = (state: EvaluateProccessType) => {
const currentRequestModelId = evaluateStateRef.current.requestModelId;
setEvaluteState({
...evaluateStateRef.current,
state
});
return currentRequestModelId;
}; };
const handleOnValuesChange = (data: { const handleOnValuesChange = (data: {
@@ -152,7 +168,10 @@ const AddModal: FC<AddModalProps> = (props) => {
allValues: any; allValues: any;
source: SourceType; source: SourceType;
}) => { }) => {
setEvaluteState(EvaluateProccess.form); setEvaluteState({
state: EvaluateProccess.form,
requestModelId: updateRequestModelId()
});
handleOnValuesChangeBefore(data); handleOnValuesChangeBefore(data);
}; };
@@ -172,7 +191,13 @@ const AddModal: FC<AddModalProps> = (props) => {
return categories || null; return categories || null;
}; };
const handleSelectModelFile = async (item: any) => { const handleSelectModelFile = async (item: any, requestModelId: number) => {
if (
evaluateStateRef.current.state !== EvaluateProccess.file ||
requestModelId !== evaluateStateRef.current.requestModelId
) {
return;
}
form.current?.form?.resetFields(resetFieldsByFile); form.current?.form?.resetFields(resetFieldsByFile);
const modelInfo = onSelectModel(selectedModel, props.source); const modelInfo = onSelectModel(selectedModel, props.source);
@@ -193,8 +218,6 @@ const AddModal: FC<AddModalProps> = (props) => {
// evaluate the form data when select a model file // evaluate the form data when select a model file
if (item.fakeName) { if (item.fakeName) {
unlockWarningStatus(); unlockWarningStatus();
const currentModelId = updateRequestModelId();
setEvaluteState(EvaluateProccess.file);
const evaluateRes = await handleOnValuesChangeBefore?.({ const evaluateRes = await handleOnValuesChangeBefore?.({
changedValues: {}, changedValues: {},
@@ -202,11 +225,6 @@ const AddModal: FC<AddModalProps> = (props) => {
source: props.source source: props.source
}); });
if (currentModelId !== requestModelIdRef.current) {
// if the request model id has changed, do not update the form
return;
}
const defaultSpec = getDefaultSpec({ const defaultSpec = getDefaultSpec({
evaluateResult: evaluateRes evaluateResult: evaluateRes
}); });
@@ -233,6 +251,7 @@ const AddModal: FC<AddModalProps> = (props) => {
const handleOnSelectModel = async (item: any) => { const handleOnSelectModel = async (item: any) => {
// If the item is empty or the same as the selected model, do nothing // If the item is empty or the same as the selected model, do nothing
console.log('handleOnSelectModel', item, selectedModel); console.log('handleOnSelectModel', item, selectedModel);
modelFileRef.current?.cancelRequest();
if ( if (
_.isEmpty(item) || _.isEmpty(item) ||
(item.isGGUF === selectedModel.isGGUF && item.name === selectedModel.name) (item.isGGUF === selectedModel.isGGUF && item.name === selectedModel.name)
@@ -242,7 +261,10 @@ const AddModal: FC<AddModalProps> = (props) => {
setIsGGUF(item.isGGUF); setIsGGUF(item.isGGUF);
clearCahceFormValues(); clearCahceFormValues();
unlockWarningStatus(); unlockWarningStatus();
setEvaluteState(EvaluateProccess.model); setEvaluteState({
state: EvaluateProccess.model,
requestModelId: updateRequestModelId()
});
setSelectedModel(item); setSelectedModel(item);
form.current?.form?.resetFields(resetFieldsByModel); form.current?.form?.resetFields(resetFieldsByModel);
@@ -278,7 +300,13 @@ const AddModal: FC<AddModalProps> = (props) => {
const handleOnSelectModelAfterEvaluate = (item: any) => { const handleOnSelectModelAfterEvaluate = (item: any) => {
setIsGGUF(item.isGGUF); setIsGGUF(item.isGGUF);
setSelectedModel(item); setSelectedModel(item);
setEvaluteState({
state: EvaluateProccess.model,
requestModelId: updateRequestModelId()
});
modelFileRef.current?.cancelRequest();
const modelInfo = onSelectModel(item, props.source); const modelInfo = onSelectModel(item, props.source);
if ( if (
evaluateStateRef.current.state === EvaluateProccess.model && evaluateStateRef.current.state === EvaluateProccess.model &&
item.evaluateResult item.evaluateResult
@@ -473,6 +501,7 @@ const AddModal: FC<AddModalProps> = (props) => {
selectedModel={selectedModel} selectedModel={selectedModel}
modelSource={props.source} modelSource={props.source}
onSelectFile={handleSelectModelFile} onSelectFile={handleSelectModelFile}
updateEvaluteState={updateEvaluateState}
collapsed={collapsed} collapsed={collapsed}
gpuOptions={props.gpuOptions} gpuOptions={props.gpuOptions}
></HFModelFile> ></HFModelFile>
+23 -10
View File
@@ -41,7 +41,8 @@ interface HFModelFileProps {
modelSource: string; modelSource: string;
ref: any; ref: any;
gpuOptions?: any[]; gpuOptions?: any[];
onSelectFile?: (file: any) => void; onSelectFile?: (file: any, flagId: number) => void;
updateEvaluteState: (state: 'model' | 'form' | 'file') => number;
onSelectFileAfterEvaluate?: (file: any) => void; onSelectFileAfterEvaluate?: (file: any) => void;
} }
@@ -52,8 +53,13 @@ const includeReg = /\.(safetensors|gguf)$/i;
const filterRegGGUF = /\.(gguf)$/i; const filterRegGGUF = /\.(gguf)$/i;
const HFModelFile: React.FC<HFModelFileProps> = forwardRef((props, ref) => { const HFModelFile: React.FC<HFModelFileProps> = forwardRef((props, ref) => {
const { collapsed, modelSource, isDownload, onSelectFileAfterEvaluate } = const {
props; collapsed,
modelSource,
isDownload,
updateEvaluteState,
onSelectFileAfterEvaluate
} = props;
const intl = useIntl(); const intl = useIntl();
const [isEvaluating, setIsEvaluating] = useState(false); const [isEvaluating, setIsEvaluating] = useState(false);
const [dataSource, setDataSource] = useState<any>({ const [dataSource, setDataSource] = useState<any>({
@@ -76,9 +82,10 @@ const HFModelFile: React.FC<HFModelFileProps> = forwardRef((props, ref) => {
const axiosTokenRef = useRef<any>(null); const axiosTokenRef = useRef<any>(null);
const checkTokenRef = useRef<any>(null); const checkTokenRef = useRef<any>(null);
const timer = useRef<any>(null); const timer = useRef<any>(null);
const parentRequestModelId = useRef<number>(0);
const handleSelectModelFile = (item: any) => { const handleSelectModelFile = (item: any) => {
props.onSelectFile?.(item); props.onSelectFile?.(item, parentRequestModelId.current);
setCurrent(item.path); setCurrent(item.path);
currentPathRef.current = item.path; currentPathRef.current = item.path;
}; };
@@ -276,6 +283,7 @@ const HFModelFile: React.FC<HFModelFileProps> = forwardRef((props, ref) => {
handleSelectModelFile({}); handleSelectModelFile({});
return; return;
} }
parentRequestModelId.current = updateEvaluteState?.('file');
checkTokenRef.current?.cancel?.(); checkTokenRef.current?.cancel?.();
axiosTokenRef.current?.abort?.(); axiosTokenRef.current?.abort?.();
axiosTokenRef.current = new AbortController(); axiosTokenRef.current = new AbortController();
@@ -311,8 +319,17 @@ const HFModelFile: React.FC<HFModelFileProps> = forwardRef((props, ref) => {
setDataSource({ ...dataSource, fileList: list }); setDataSource({ ...dataSource, fileList: list });
}; };
const cancelRequest = () => {
axiosTokenRef.current?.abort?.();
checkTokenRef.current?.cancel?.();
if (timer.current) {
clearTimeout(timer.current);
}
};
useImperativeHandle(ref, () => ({ useImperativeHandle(ref, () => ({
fetchModelFiles: handleFetchModelFiles fetchModelFiles: handleFetchModelFiles,
cancelRequest: cancelRequest
})); }));
useEffect(() => { useEffect(() => {
@@ -324,11 +341,7 @@ const HFModelFile: React.FC<HFModelFileProps> = forwardRef((props, ref) => {
useEffect(() => { useEffect(() => {
return () => { return () => {
axiosTokenRef.current?.abort?.(); cancelRequest();
checkTokenRef.current?.cancel?.();
if (timer.current) {
clearTimeout(timer.current);
}
}; };
}, []); }, []);
+1 -1
View File
@@ -607,7 +607,7 @@ export const useCheckCompatibility = () => {
unlockWarningStatus, unlockWarningStatus,
cancelEvaluate, cancelEvaluate,
handleBackendChangeBefore, handleBackendChangeBefore,
handleOnValuesChange: debounceHandleValuesChange, handleOnValuesChange: handleOnValuesChange,
handleEvaluateOnChange: handleOnValuesChange, handleEvaluateOnChange: handleOnValuesChange,
clearCahceFormValues, clearCahceFormValues,
warningStatus, warningStatus,