/* * @Author: 赵伟 * @Date: 2024-04-16 13:58:08 * @Description: 创建模型部署 */ import KFIcon from '@/components/KFIcon'; import PageTitle from '@/components/PageTitle'; import ResourceSelect, { requiredValidator, type ParameterInputObject, } from '@/components/ResourceSelect'; import SubAreaTitle from '@/components/SubAreaTitle'; import { CommonTabKeys } from '@/enums'; import { useComputingResource } from '@/hooks/resource'; import { ResourceSelectorType } from '@/pages/Pipeline/components/ResourceSelectorModal'; import { createModelDeploymentReq, restartModelDeploymentReq, updateModelDeploymentReq, } from '@/services/modelDeployment'; import { camelCaseToUnderscore, underscoreToCamelCase } from '@/utils'; import { to } from '@/utils/promise'; import { getSessionStorageItem, modelDeploymentInfoKey, removeSessionStorageItem, } from '@/utils/sessionStorage'; import { modalConfirm } from '@/utils/ui'; import { useNavigate } from '@umijs/max'; import { App, Button, Col, Flex, Form, Input, Row, Select } from 'antd'; import { omit, pick } from 'lodash'; import { useEffect, useState } from 'react'; import { ModelDeploymentData, ModelDeploymentOperationType } from '../types'; import styles from './index.less'; // 表单数据 export type FormData = { serviceName: string; // 服务名称 description: string; // 描述 model: ParameterInputObject; // 模型 image: ParameterInputObject; // 镜像 resource: string; // 资源规格 replicas: string; // 副本数量 modelPath: string; // 模型路径 env: { key: string; value: string }[]; // 环境变量 }; function ModelDeploymentCreate() { const navigate = useNavigate(); const [form] = Form.useForm(); const [resourceStandardList, filterResourceStandard] = useComputingResource(); const [operationType, setOperationType] = useState(ModelDeploymentOperationType.Create); const [modelDeploymentInfo, setModelDeploymentInfo] = useState( undefined, ); const { message } = App.useApp(); useEffect(() => { const res = getSessionStorageItem(modelDeploymentInfoKey, true); if (res) { setOperationType(res.operationType); setModelDeploymentInfo(res); const formData = underscoreToCamelCase(res) as FormData; form.setFieldsValue(formData); } return () => { removeSessionStorageItem(modelDeploymentInfoKey); }; }, []); // 创建 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', 'image', 'model']), replicas: Number(formData.replicas), env, image: image.value, model: pick(model, ['id', 'version', 'path', 'showValue']), }); const params = operationType === ModelDeploymentOperationType.Create ? object : { ...pick(modelDeploymentInfo, ['service_id', 'service_ins_id']), update_model: { ...pick(object, ['description', 'env', 'replicas', 'resource', 'image']), }, }; let request = createModelDeploymentReq; if (operationType === ModelDeploymentOperationType.Restart) { request = restartModelDeploymentReq; } else if (operationType === ModelDeploymentOperationType.Update) { request = updateModelDeploymentReq; } const [res] = await to(request(params)); if (res) { message.success('操作成功'); navigate(-1); } }; // 提交 const handleSubmit = (values: FormData) => { createModelDeployment(values); }; // 取消 const cancel = () => { navigate(-1); }; const disabled = operationType !== ModelDeploymentOperationType.Create; let buttonText = '新建'; if (operationType === ModelDeploymentOperationType.Update) { buttonText = '更新'; } else if (operationType === ModelDeploymentOperationType.Restart) { buttonText = '重启'; } return (
{(fields, { add, remove }) => ( <> {fields.map(({ key, name, ...restField }) => ( = ))} )}
); } export default ModelDeploymentCreate;