diff --git a/src/components/echarts/line-chart.tsx b/src/components/echarts/line-chart.tsx index cef8c2ac..1ba39e14 100644 --- a/src/components/echarts/line-chart.tsx +++ b/src/components/echarts/line-chart.tsx @@ -28,6 +28,16 @@ const LineChart: React.FC = (props) => { yAxis } = useChartConfig(); + const axisLabelFormatter = (value: string, index: number) => { + if (labelFormatter) { + return labelFormatter(value, index); + } + if (index === xAxisData.length - 1) { + return ''; + } + return value; + }; + const options = { title: { text: '' @@ -45,7 +55,7 @@ const LineChart: React.FC = (props) => { ...xAxis, axisLabel: { ...xAxis.axisLabel, - formatter: labelFormatter + formatter: axisLabelFormatter } }, yAxis, diff --git a/src/components/echarts/mix-line-bar.tsx b/src/components/echarts/mix-line-bar.tsx index 136f89ed..d0a31b8e 100644 --- a/src/components/echarts/mix-line-bar.tsx +++ b/src/components/echarts/mix-line-bar.tsx @@ -45,6 +45,7 @@ const MixLineBarChart: React.FC< }, grid: { ...grid, + right: 0, top: 20, bottom: 10 }, diff --git a/src/components/echarts/types.ts b/src/components/echarts/types.ts index c10e6353..1910832e 100644 --- a/src/components/echarts/types.ts +++ b/src/components/echarts/types.ts @@ -4,7 +4,7 @@ export interface ChartProps { showEmpty?: boolean; xAxisData: string[]; legendData?: LegendComponentOption['data']; - labelFormatter?: (val?: any) => string; + labelFormatter?: (val?: any, index?: number) => string; tooltipValueFormatter?: (val: any) => string; height: string | number; width?: string | number; diff --git a/src/pages/dashboard/components/resource-utilization.tsx b/src/pages/dashboard/components/resource-utilization.tsx index 006eb09a..5ff682d2 100644 --- a/src/pages/dashboard/components/resource-utilization.tsx +++ b/src/pages/dashboard/components/resource-utilization.tsx @@ -41,6 +41,7 @@ const UtilizationOvertime: React.FC = () => { const tooltipValueFormatter = (value: any) => { return !value ? value : `${value}%`; }; + const generateData = useMemo(() => { const legendData: string[] = []; const xAxisData: string[] = []; diff --git a/src/pages/llmodels/components/data-form.tsx b/src/pages/llmodels/components/data-form.tsx index 956d2dbd..7fb05715 100644 --- a/src/pages/llmodels/components/data-form.tsx +++ b/src/pages/llmodels/components/data-form.tsx @@ -21,7 +21,6 @@ import { FormData, SourceType } from '../config/types'; import CatalogFrom from '../forms/catalog'; import HuggingFaceForm from '../forms/hugging-face'; import LocalPathForm from '../forms/local-path'; -import OllamaForm from '../forms/ollama_library'; import AdvanceConfig from './advance-config'; interface DataFormProps { @@ -253,7 +252,6 @@ const DataForm: React.FC = forwardRef((props, ref) => { }} > - diff --git a/src/pages/llmodels/components/deploy-builtin-modal.tsx b/src/pages/llmodels/components/deploy-builtin-modal.tsx index 3c1834e0..6493d39a 100644 --- a/src/pages/llmodels/components/deploy-builtin-modal.tsx +++ b/src/pages/llmodels/components/deploy-builtin-modal.tsx @@ -25,6 +25,8 @@ import ColumnWrapper from './column-wrapper'; import CompatibilityAlert from './compatible-alert'; import DataForm from './data-form'; +const pickFieldsFromSpec = ['backend_version', 'backend_parameters', 'env']; + type AddModalProps = { title: string; action: PageActionType; @@ -202,7 +204,7 @@ const AddModal: React.FC = (props) => { }); selectSpecRef.current = spec; return { - ..._.omit(spec, ['name']), + ..._.pick(spec, pickFieldsFromSpec), categories: _.get(current, 'categories.0', null) }; }; diff --git a/src/pages/llmodels/components/deploy-modal.tsx b/src/pages/llmodels/components/deploy-modal.tsx index e30bcc31..c987b223 100644 --- a/src/pages/llmodels/components/deploy-modal.tsx +++ b/src/pages/llmodels/components/deploy-modal.tsx @@ -33,13 +33,9 @@ import SearchModel from './search-model'; import Separator from './separator'; import TitleWrapper from './title-wrapper'; -const resetFieldsByModel = [ - 'cpu_offloading', - 'distributed_inference_across_workers', - 'backend_version', - 'backend_parameters', - 'env' -]; +const resetFieldsByModel = ['backend_version', 'backend_parameters', 'env']; +const pickFieldsFromSpec = ['backend_version', 'backend_parameters', 'env']; +const dropFieldsFromForm = ['name', 'file_name', 'repo_id', 'backend']; const resetFieldsByFile = [ 'cpu_offloading', @@ -187,11 +183,10 @@ const AddModal: FC = (props) => { }; const getDefaultSpec = (item: any) => { - const defaultSpec = _.get(item.evaluateResult?.default_spec, [ - 'backend_version', - 'backend_parameters', - 'env' - ]); + const defaultSpec = _.pick( + item.evaluateResult?.default_spec, + pickFieldsFromSpec + ); return defaultSpec; }; @@ -205,7 +200,7 @@ const AddModal: FC = (props) => { }; const { run: onSelectFile } = useDeferredRequest( - async (item: any, modelInfo: any) => { + async (item: any, modelInfo: any, manual?: boolean) => { unlockWarningStatus(); const evaluateRes = await handleOnValuesChangeBefore?.({ @@ -227,29 +222,34 @@ const AddModal: FC = (props) => { /** * do not reset backend_parameters when select a model file */ - const formBackendParameters = - form.current?.getFieldValue?.('backend_parameters') || []; + const formValues = form.current?.getFieldsValue?.(pickFieldsFromSpec); form.current?.setFieldsValue?.({ - ...defaultSpec, ..._.omit(modelInfo, ['name']), file_name: item.fakeName, backend_parameters: - formBackendParameters.length > 0 - ? formBackendParameters + formValues.backend_parameters?.length > 0 + ? formValues.backend_parameters : defaultSpec.backend_parameters || [], + backend_version: + formValues.backend_version || defaultSpec.backend_version, + env: formValues.env || defaultSpec.env, categories: getCategory(item) }); }, 100 ); - const handleSelectModelFile = async (item: any, requestModelId: number) => { + const handleSelectModelFile = async ( + item: any, + options: { requestModelId: number; manual?: boolean } + ) => { + const { requestModelId, manual } = options || {}; if (requestModelId !== getRequestId()) { return; } console.log('handleSelectModelFile:', item, selectedModel); - form.current?.form?.resetFields(resetFieldsByFile); + const modelInfo = onSelectModel(selectedModel, props.source); form.current?.setFieldsValue?.({ @@ -260,7 +260,7 @@ const AddModal: FC = (props) => { // evaluate the form data when select a model file if (item.fakeName) { - onSelectFile(item, modelInfo); + onSelectFile(item, modelInfo, manual); } }; @@ -304,6 +304,10 @@ const AddModal: FC = (props) => { const modelInfo = onSelectModel(item, props.source); form.current?.setFieldsValue?.({ ...modelInfo, + ..._.omit(form.current?.form?.getFieldsValue?.(), [ + ...dropFieldsFromForm, + ...pickFieldsFromSpec + ]), categories: getCategory(item) }); @@ -332,13 +336,6 @@ const AddModal: FC = (props) => { }; const handleOnSelectModelAfterEvaluate = (item: any, manual?: boolean) => { - console.log( - 'handleOnSelectModelAfterEvaluate:', - item.name, - currentSelectedModel.current.name, - warningStatus.type, - currentModelDuringEvaluate(item) - ); if (currentModelDuringEvaluate(item)) { return; } @@ -357,11 +354,23 @@ const AddModal: FC = (props) => { item.evaluated ) { handleShowCompatibleAlert(item.evaluateResult); - form.current?.setFieldsValue?.({ + const newFormValues = { ...getDefaultSpec(item), ...modelInfo, + ..._.omit(form.current?.form?.getFieldsValue?.(), [ + ...dropFieldsFromForm, + ...pickFieldsFromSpec + ]), name: generateNameValue(item, modelInfo.name, manual), categories: getCategory(item) + }; + + form.current?.setFieldsValue?.(newFormValues); + + handleOnValuesChangeBefore({ + changedValues: {}, + allValues: newFormValues, + source: props.source }); } }; diff --git a/src/pages/llmodels/components/hf-model-file.tsx b/src/pages/llmodels/components/hf-model-file.tsx index 24385a74..a4d81bbb 100644 --- a/src/pages/llmodels/components/hf-model-file.tsx +++ b/src/pages/llmodels/components/hf-model-file.tsx @@ -42,7 +42,10 @@ interface HFModelFileProps { modelSource: string; ref: any; gpuOptions?: any[]; - onSelectFile?: (file: any, flagId: number) => void; + onSelectFile?: ( + file: any, + options: { requestModelId: number; manual?: boolean } + ) => void; updateEvaluteState: (state: 'model' | 'form' | 'file') => number; onSelectFileAfterEvaluate?: (file: any) => void; } @@ -85,8 +88,11 @@ const HFModelFile: React.FC = forwardRef((props, ref) => { const timer = useRef(null); const parentRequestModelId = useRef(0); - const handleSelectModelFile = (item: any) => { - props.onSelectFile?.(item, parentRequestModelId.current); + const handleSelectModelFile = (item: any, manual?: boolean) => { + props.onSelectFile?.(item, { + requestModelId: parentRequestModelId.current, + manual: manual + }); setCurrent(item.path); currentPathRef.current = item.path; }; @@ -397,7 +403,9 @@ const HFModelFile: React.FC = forwardRef((props, ref) => { data={item} isEvaluating={isEvaluating} active={item.path === current} - handleSelectModelFile={handleSelectModelFile} + handleSelectModelFile={(data) => + handleSelectModelFile(data, true) + } > ); })} diff --git a/src/pages/llmodels/components/search-model.tsx b/src/pages/llmodels/components/search-model.tsx index f32de4c5..650249e9 100644 --- a/src/pages/llmodels/components/search-model.tsx +++ b/src/pages/llmodels/components/search-model.tsx @@ -142,10 +142,10 @@ const SearchModel: React.FC = (props) => { const handleOnSelectModel = (model: any, manual?: boolean) => { const item = model || {}; - if (item.evaluated && !item.isGGUF) { - onSelectModelAfterEvaluate(item, manual); - } else { + if (!item.evaluated || item.isGGUF) { onSelectModel(item, manual); + } else { + onSelectModelAfterEvaluate(item, manual); } setCurrent(item.id); currentRef.current = item.id;