@@ -230,64 +167,46 @@ function EditorCreate() {
- selectResource('image', ResourceSelectorType.Mirror)}
/>
-
-
-
- selectResource('model', ResourceSelectorType.Model)}
/>
-
-
-
@@ -296,29 +215,20 @@ function EditorCreate() {
name="dataset"
rules={[
{
- required: true,
+ validator: requiredValidator,
message: '请选择数据集',
},
]}
+ required
>
- selectResource('dataset', ResourceSelectorType.Dataset)}
/>
-
-
-
diff --git a/react-ui/src/pages/DevelopmentEnvironment/List/index.tsx b/react-ui/src/pages/DevelopmentEnvironment/List/index.tsx
index c7b22c6a..38a98e6a 100644
--- a/react-ui/src/pages/DevelopmentEnvironment/List/index.tsx
+++ b/react-ui/src/pages/DevelopmentEnvironment/List/index.tsx
@@ -1,7 +1,7 @@
/*
* @Author: 赵伟
* @Date: 2024-04-16 13:58:08
- * @Description: 开发环境
+ * @Description: 开发环境列表
*/
import CommonTableCell from '@/components/CommonTableCell';
import DateTableCell from '@/components/DateTableCell';
diff --git a/react-ui/src/pages/ModelDeployment/Create/index.tsx b/react-ui/src/pages/ModelDeployment/Create/index.tsx
index d9836195..0fa85fcf 100644
--- a/react-ui/src/pages/ModelDeployment/Create/index.tsx
+++ b/react-ui/src/pages/ModelDeployment/Create/index.tsx
@@ -5,22 +5,20 @@
*/
import KFIcon from '@/components/KFIcon';
import PageTitle from '@/components/PageTitle';
-import ParameterInput, { requiredValidator } from '@/components/ParameterInput';
+import ResourceSelect, {
+ requiredValidator,
+ type ParameterInputObject,
+} from '@/components/ResourceSelect';
import SubAreaTitle from '@/components/SubAreaTitle';
import { CommonTabKeys } from '@/enums';
import { useComputingResource } from '@/hooks/resource';
-import ResourceSelectorModal, {
- ResourceSelectorResponse,
- ResourceSelectorType,
- selectorTypeConfig,
-} from '@/pages/Pipeline/components/ResourceSelectorModal';
+import { ResourceSelectorType } from '@/pages/Pipeline/components/ResourceSelectorModal';
import {
createModelDeploymentReq,
restartModelDeploymentReq,
updateModelDeploymentReq,
} from '@/services/modelDeployment';
import { camelCaseToUnderscore, underscoreToCamelCase } from '@/utils';
-import { openAntdModal } from '@/utils/modal';
import { to } from '@/utils/promise';
import {
getSessionStorageItem,
@@ -39,13 +37,8 @@ import styles from './index.less';
export type FormData = {
serviceName: string; // 服务名称
description: string; // 描述
- model: {
- id: number;
- version: string;
- value: string;
- showValue: string;
- }; // 模型
- image: string; // 镜像
+ model: ParameterInputObject; // 模型
+ image: ParameterInputObject; // 镜像
resource: string; // 资源规格
replicas: string; // 副本数量
modelPath: string; // 模型路径
@@ -56,16 +49,10 @@ function ModelDeploymentCreate() {
const navgite = useNavigate();
const [form] = Form.useForm();
const [resourceStandardList, filterResourceStandard] = useComputingResource();
- const [selectedModel, setSelectedModel] = useState(
- undefined,
- ); // 选择的模型,为了再次打开时恢复原来的选择
const [operationType, setOperationType] = useState(ModelDeploymentOperationType.Create);
const [modelDeploymentInfo, setModelDeploymentInfo] = useState(
undefined,
);
- const [selectedMirror, setSelectedMirror] = useState(
- undefined,
- ); // 选择的镜像,为了再次打开时恢复原来的选择
const { message } = App.useApp();
useEffect(() => {
@@ -81,78 +68,23 @@ function ModelDeploymentCreate() {
};
}, []);
- // 获取选择数据集、模型后面按钮 icon
- const getSelectBtnIcon = (type: ResourceSelectorType) => {
- return ;
- };
-
- // 选择模型、镜像
- const selectResource = (formItemName: string, type: ResourceSelectorType) => {
- let resource: ResourceSelectorResponse | undefined;
- switch (type) {
- case ResourceSelectorType.Model:
- resource = selectedModel;
- break;
- default:
- resource = selectedMirror;
- break;
- }
- const { close } = openAntdModal(ResourceSelectorModal, {
- type,
- defaultExpandedKeys: resource ? [resource.id] : [],
- defaultCheckedKeys: resource ? [`${resource.id}-${resource.version}`] : [],
- defaultActiveTab: resource?.activeTab,
- onOk: (res) => {
- if (res) {
- if (type === ResourceSelectorType.Mirror) {
- form.setFieldValue(formItemName, res.path);
- setSelectedMirror(res);
- } else {
- const { activeTab, id, name, version, path } = res;
- const jsonObj = {
- id,
- version,
- path,
- };
- const value = JSON.stringify(jsonObj);
- const showValue = `${name}:${version}`;
- form.setFieldValue(formItemName, {
- value,
- showValue,
- fromSelect: true,
- activeTab,
- expandedKeys: [id],
- checkedKeys: [`${id}-${version}`],
- ...jsonObj,
- });
- setSelectedModel(res);
- }
- } else {
- if (type === ResourceSelectorType.Model) {
- setSelectedModel(undefined);
- } else {
- setSelectedMirror(undefined);
- }
- form.setFieldValue(formItemName, '');
- }
- form.validateFields([formItemName]);
- close();
- },
- });
- };
-
// 创建
const createModelDeployment = async (formData: FormData) => {
const envList = formData['env'] ?? [];
+ const image = formData['image'];
+ const model = formData['model'];
const env = envList.reduce((acc, cur) => {
acc[cur.key] = cur.value;
return acc;
}, {} as Record);
+ // 根据后台要求,修改表单数据
const object = camelCaseToUnderscore({
- ...omit(formData, ['replicas', 'env']),
+ ...omit(formData, ['replicas', 'env', 'image', 'model']),
replicas: Number(formData.replicas),
env,
+ image: image.value,
+ model: pick(model, ['id', 'version', 'path', 'showValue']),
});
const params =
@@ -277,27 +209,15 @@ function ModelDeploymentCreate() {
]}
required
>
- selectResource('model', ResourceSelectorType.Model)}
- onChange={() => setSelectedModel(undefined)}
/>
-
-
-
@@ -312,25 +232,14 @@ function ModelDeploymentCreate() {
]}
required
>
- selectResource('image', ResourceSelectorType.Mirror)}
- onChange={() => setSelectedMirror(undefined)}
/>
-
-
-
diff --git a/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/config.tsx b/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/config.tsx
index 66562e13..01e30ab0 100644
--- a/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/config.tsx
+++ b/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/config.tsx
@@ -37,6 +37,7 @@ export type SelectorTypeInfo = {
litReqParamKey: 'available_range' | 'image_type'; // 表示是公开还是私有的参数名称,获取资源列表接口使用
fileReqParamKey: 'models_id' | 'dataset_id'; // 文件请求参数名称,获取文件列表接口使用
tabItems: TabsProps['items']; // tab 列表
+ buttontTitle: string; // 按钮 title
};
// 获取镜像文件列表,为了兼容数据集和模型
@@ -77,6 +78,7 @@ export const selectorTypeConfig: Record
label: '公开模型',
},
],
+ buttontTitle: '选择模型',
},
[ResourceSelectorType.Dataset]: {
getList: getDatasetList,
@@ -98,6 +100,7 @@ export const selectorTypeConfig: Record
label: '公开数据集',
},
],
+ buttontTitle: '选择数据集',
},
[ResourceSelectorType.Mirror]: {
getList: getMirrorListReq,
@@ -121,5 +124,6 @@ export const selectorTypeConfig: Record
label: '公开镜像',
},
],
+ buttontTitle: '选择镜像',
},
};
diff --git a/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.tsx b/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.tsx
index 92b9e0b8..f4caf03a 100644
--- a/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.tsx
+++ b/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.tsx
@@ -39,7 +39,7 @@ export interface ResourceSelectorModalProps extends Omit {
defaultExpandedKeys?: React.Key[];
defaultCheckedKeys?: React.Key[];
defaultActiveTab?: CommonTabKeys;
- onOk?: (params: ResourceSelectorResponse | null) => void;
+ onOk?: (params: ResourceSelectorResponse | undefined) => void;
}
type TreeRef = GetRef>;
@@ -279,7 +279,7 @@ function ResourceSelectorModal({
};
onOk?.(res);
} else {
- onOk?.(null);
+ onOk?.(undefined);
}
};