diff --git a/src/components/seal-form/wrapper/index.tsx b/src/components/seal-form/wrapper/index.tsx index 47b478b4..d3f3dae9 100644 --- a/src/components/seal-form/wrapper/index.tsx +++ b/src/components/seal-form/wrapper/index.tsx @@ -170,9 +170,13 @@ const Extra = styled.div` const AddAfter = styled.div` position: relative; - color: var(--ant-color-text-quaternary); + color: var(--ant-color-text-tertiary); font-size: var(--font-size-base); - padding-right: calc(var(--ant-padding-sm) - 1px); + padding-inline: calc(var(--ant-padding-sm) - 1px); + height: 100%; + display: flex; + align-items: center; + background-color: var(--ant-color-fill-secondary); `; // for wrapper diff --git a/src/locales/en-US/backends.ts b/src/locales/en-US/backends.ts index 91d96a6a..f2c0ba31 100644 --- a/src/locales/en-US/backends.ts +++ b/src/locales/en-US/backends.ts @@ -19,6 +19,8 @@ export default { 'backend.mode.yaml': 'YAML Mode', 'backend.form.healthCheckPath': 'Health Check Path', 'backend.form.defaultExecuteCommand': 'Default Execution Command', + 'backend.form.defaultExecuteCommand.tips': + '{{model_path}} is the model path, and {{port}} is the service port. These variable names cannot be modified.', 'backend.form.defaultBackendParameters': 'Default Backend Parameters', 'backend.form.versionConfig': 'Versions Config', 'backend.form.addParameter': 'Add Parameter', @@ -27,5 +29,5 @@ export default { 'backend.versionInfo.autoImage': 'Automatically selected at runtime', 'backend.version.rules.builtin': 'Must end with "-custom"', 'backend.version.no.tips': - 'Built-in backend versions must end with "-custom".' + 'The name of a custom version must end with "-custom."' }; diff --git a/src/locales/ja-JP/backends.ts b/src/locales/ja-JP/backends.ts index 91d96a6a..f2c0ba31 100644 --- a/src/locales/ja-JP/backends.ts +++ b/src/locales/ja-JP/backends.ts @@ -19,6 +19,8 @@ export default { 'backend.mode.yaml': 'YAML Mode', 'backend.form.healthCheckPath': 'Health Check Path', 'backend.form.defaultExecuteCommand': 'Default Execution Command', + 'backend.form.defaultExecuteCommand.tips': + '{{model_path}} is the model path, and {{port}} is the service port. These variable names cannot be modified.', 'backend.form.defaultBackendParameters': 'Default Backend Parameters', 'backend.form.versionConfig': 'Versions Config', 'backend.form.addParameter': 'Add Parameter', @@ -27,5 +29,5 @@ export default { 'backend.versionInfo.autoImage': 'Automatically selected at runtime', 'backend.version.rules.builtin': 'Must end with "-custom"', 'backend.version.no.tips': - 'Built-in backend versions must end with "-custom".' + 'The name of a custom version must end with "-custom."' }; diff --git a/src/locales/ru-RU/backends.ts b/src/locales/ru-RU/backends.ts index 63b38d0a..be367c0a 100644 --- a/src/locales/ru-RU/backends.ts +++ b/src/locales/ru-RU/backends.ts @@ -19,6 +19,8 @@ export default { 'backend.mode.yaml': 'Режим YAML', 'backend.form.healthCheckPath': 'Путь проверки здоровья', 'backend.form.defaultExecuteCommand': 'Команда выполнения по умолчанию', + 'backend.form.defaultExecuteCommand.tips': + '{{model_path}} is the model path, and {{port}} is the service port. These variable names cannot be modified.', 'backend.form.defaultBackendParameters': 'Параметры бэкенда по умолчанию', 'backend.form.versionConfig': 'Конфигурация версий', 'backend.form.addParameter': 'Добавить параметр', @@ -27,9 +29,10 @@ export default { 'backend.versionInfo.autoImage': 'Автоматически выбор во время запуска', 'backend.version.rules.builtin': 'Должен заканчиваться на "-custom"', 'backend.version.no.tips': - 'Built-in backend versions must end with "-custom".' + 'The name of a custom version must end with "-custom."' }; // ========== To-Do: Translate Keys (Remove After Translation) ========== -// 1. 'backend.version.no.tips': 'Built-in backend versions must end with "-custom".' +// 1. 'backend.form.defaultExecuteCommand.tips': '{{model_path}} is the model path, and {{port}} is the service port. These variable names cannot be modified.' +// 2. 'backend.version.no.tips': 'The name of a custom version must end with "-custom."' // ========== End of To-Do List ========== diff --git a/src/locales/zh-CN/backends.ts b/src/locales/zh-CN/backends.ts index 2917f969..e3b2fa31 100644 --- a/src/locales/zh-CN/backends.ts +++ b/src/locales/zh-CN/backends.ts @@ -19,6 +19,8 @@ export default { 'backend.mode.yaml': 'YAML 模式', 'backend.form.healthCheckPath': '健康检查路径', 'backend.form.defaultExecuteCommand': '默认执行命令', + 'backend.form.defaultExecuteCommand.tips': + '{{model_path}} 为模型文件路径,{{port}} 为服务端口,这两个变量名不可更改。', 'backend.form.defaultBackendParameters': '默认后端参数', 'backend.form.versionConfig': '版本配置', 'backend.form.addParameter': '添加参数', @@ -26,5 +28,5 @@ export default { 'backend.noVersion': '未找到版本', 'backend.versionInfo.autoImage': '运行时自动选择', 'backend.version.rules.builtin': '须以 "-custom" 结尾', - 'backend.version.no.tips': '内置的后端版本须以 "-custom" 结尾。' + 'backend.version.no.tips': '自定义版本名称必须以 "-custom" 结尾。' }; diff --git a/src/pages/backends/components/add-modal.tsx b/src/pages/backends/components/add-modal.tsx index 0fe25685..7a6e48c9 100644 --- a/src/pages/backends/components/add-modal.tsx +++ b/src/pages/backends/components/add-modal.tsx @@ -53,6 +53,20 @@ const AddModal: React.FC = (props) => { const [yamlContent, setYamlContent] = useState(''); const [formContent, setFormContent] = useState({} as FormData); + const genertateCurrentData = (values: ListItem): ListItem => { + const data = { ...values }; + data.version_configs = Object.entries(data.version_configs || {}).reduce( + (acc, [key, value]) => { + const version = key.replace(/-custom$/, ''); + acc[version] = { ...value }; + return acc; + }, + {} as any + ); + + return data; + }; + const onOk = () => { if (activeKey === 'yaml') { const content = editorRef.current?.getContent(); @@ -90,9 +104,12 @@ const AddModal: React.FC = (props) => { }; useEffect(() => { - const iniFormContent = (values: any) => { + const iniFormContent = (data: ListItem) => { + const values: any = genertateCurrentData(data); + + // custom versions const versionConfigs = Object.keys(values.version_configs || {}).map( - (key) => ({ + (key: string) => ({ version_no: key, image_name: values.version_configs?.[key]?.image_name, run_command: values.version_configs?.[key]?.run_command, @@ -101,6 +118,7 @@ const AddModal: React.FC = (props) => { }) ); + // built-in versions const builtInVersions = Object.keys( values.built_in_version_configs || {} ).map((key) => ({ diff --git a/src/pages/backends/components/import-yaml.tsx b/src/pages/backends/components/import-yaml.tsx index ebe5dbfb..8bf43472 100644 --- a/src/pages/backends/components/import-yaml.tsx +++ b/src/pages/backends/components/import-yaml.tsx @@ -101,17 +101,17 @@ const ImportYAML: React.FC = forwardRef( const getContent = () => { try { const content = editorRef.current?.getValue(); - if (actionStatus.isBuiltIn) { - const jsonData = yaml2Json(content); - const exsistingVersions = Object.keys(jsonData.version_configs || {}); - const invalidVersion = exsistingVersions.find( - (v) => !v.endsWith('-custom') - ); - if (invalidVersion) { - setError(intl.formatMessage({ id: 'backend.version.no.tips' })); - return false; - } + + const jsonData = yaml2Json(content); + const exsistingVersions = Object.keys(jsonData.version_configs || {}); + const invalidVersion = exsistingVersions.find( + (v) => !v.endsWith('-custom') + ); + if (invalidVersion) { + setError(intl.formatMessage({ id: 'backend.version.no.tips' })); + return false; } + return content; } catch (error) { return false; diff --git a/src/pages/backends/config/index.ts b/src/pages/backends/config/index.ts index c38d6b92..a3824e3c 100644 --- a/src/pages/backends/config/index.ts +++ b/src/pages/backends/config/index.ts @@ -150,13 +150,13 @@ default_version: v0.5.1 health_check_path: /v1/models default_backend_param: - --host -default_run_command: myBackend serve {{model}} --port {{port}} +default_run_command: myBackend serve {{model_path}} --port {{port}} version_configs: - v0.0.1: + v0.0.1-custom: image_name: lm/mybackend:latest - run_command: myBackend serve {{model}} --port {{port}} + run_command: myBackend serve {{model_path}} --port {{port}} custom_framework: cuda - v0.0.2: + v0.0.2-custom: image_name: lm/mybackend:test run_command: custom_framework: diff --git a/src/pages/backends/forms/basic.tsx b/src/pages/backends/forms/basic.tsx index a08449e8..31b67108 100644 --- a/src/pages/backends/forms/basic.tsx +++ b/src/pages/backends/forms/basic.tsx @@ -53,9 +53,12 @@ const BasicForm: React.FC = ({ action }) => { = forwardRef( } }; + const handleOnFinish = (values: FormData) => { + const data = { ...values }; + data.version_configs = data.version_configs?.map((item) => { + if (item.version_no) { + return { + ...item, + version_no: `${item.version_no}-custom` + }; + } + return item; + }); + + onFinish(data); + }; + useEffect(() => { if (currentData) { form.setFieldsValue(currentData); @@ -61,7 +76,7 @@ const BackendForm: React.FC = forwardRef(
= ({ { required: true, message: getRuleMessage(`input`, 'backend.version') - }, - currentData?.is_built_in - ? { - pattern: pattern, - message: intl.formatMessage({ - id: 'backend.version.rules.builtin' - }) - } - : {} + } ]} > = (props) => { onOk={handleOk} ref={form} isGGUF={isGGUF} - formKey={deployFormKeyMap.catalog} + formKey={DeployFormKeyMap.CATALOG} sourceDisable={false} sourceList={sourceList} clusterList={clusterList} diff --git a/src/pages/llmodels/components/deploy-modal.tsx b/src/pages/llmodels/components/deploy-modal.tsx index 2f1f2151..a303c08c 100644 --- a/src/pages/llmodels/components/deploy-modal.tsx +++ b/src/pages/llmodels/components/deploy-modal.tsx @@ -11,15 +11,15 @@ import _ from 'lodash'; import { FC, useEffect, useMemo, useRef, useState } from 'react'; import styled from 'styled-components'; import ColumnWrapper from '../../_components/column-wrapper'; -import { defaultFormValues, deployFormKeyMap, modelSourceMap } from '../config'; +import { defaultFormValues, DeployFormKeyMap, modelSourceMap } from '../config'; import { backendOptionsMap } from '../config/backend-parameters'; import { FormData, SourceType } from '../config/types'; import DataForm from '../forms'; import { MessageStatus, - WarningStausOptions, useCheckCompatibility, - useSelectModel + useSelectModel, + WarningStausOptions } from '../hooks'; import useCheckBackend from '../hooks/use-check-backend'; import CompatibilityAlert from './compatible-alert'; @@ -635,7 +635,7 @@ const AddModal: FC = (props) => { )} = (props) => { } > = { - deployment: 'deployment', - catalog: 'catalog' -}; +// transform to enum type +export enum DeployFormKeyMap { + DEPLOYMENT = 'deployment', + CATALOG = 'catalog' +} diff --git a/src/pages/llmodels/forms/catalog.tsx b/src/pages/llmodels/forms/catalog.tsx index 243c704f..40bdcb4a 100644 --- a/src/pages/llmodels/forms/catalog.tsx +++ b/src/pages/llmodels/forms/catalog.tsx @@ -2,7 +2,7 @@ import SealSelect from '@/components/seal-form/seal-select'; import useAppUtils from '@/hooks/use-app-utils'; import { Form } from 'antd'; import React from 'react'; -import { deployFormKeyMap } from '../config'; +import { DeployFormKeyMap } from '../config'; import { useCatalogFormContext, useFormContext } from '../config/form-context'; import { FormData } from '../config/types'; @@ -19,7 +19,7 @@ const CatalogForm: React.FC = () => { } = catalogFormCtx; if ( - formKey !== deployFormKeyMap.catalog && + formKey !== DeployFormKeyMap.CATALOG && !sizeOptions?.length && !quantizationOptions?.length ) { diff --git a/src/pages/llmodels/forms/index.tsx b/src/pages/llmodels/forms/index.tsx index a7a7c1cc..bda7cea9 100644 --- a/src/pages/llmodels/forms/index.tsx +++ b/src/pages/llmodels/forms/index.tsx @@ -7,7 +7,7 @@ import _ from 'lodash'; import React, { forwardRef, useImperativeHandle, useMemo } from 'react'; import styled from 'styled-components'; import { - deployFormKeyMap, + DeployFormKeyMap, DO_NOT_NOTIFY_RECREATE, DO_NOT_TRIGGER_CHECK_COMPATIBILITY, modelSourceMap, @@ -132,7 +132,7 @@ const DataForm: React.FC = forwardRef((props, ref) => { if ( modelSourceMap.local_path_value === source || action === PageAction.EDIT || - formKey === deployFormKeyMap.catalog + formKey === DeployFormKeyMap.CATALOG ) { return { top: 0, diff --git a/src/pages/llmodels/forms/local-path-source.tsx b/src/pages/llmodels/forms/local-path-source.tsx index 9087f955..69b2bd86 100644 --- a/src/pages/llmodels/forms/local-path-source.tsx +++ b/src/pages/llmodels/forms/local-path-source.tsx @@ -5,7 +5,7 @@ import { useIntl } from '@umijs/max'; import { Form } from 'antd'; import _ from 'lodash'; import React, { useRef } from 'react'; -import { deployFormKeyMap, localPathTipsList, modelSourceMap } from '../config'; +import { DeployFormKeyMap, localPathTipsList, modelSourceMap } from '../config'; import { backendOptionsMap } from '../config/backend-parameters'; import { useFormContext } from '../config/form-context'; import { FormData } from '../config/types'; @@ -28,7 +28,7 @@ const LocalPathForm: React.FC = () => { if ( ![modelSourceMap.local_path_value].includes(source) || - formKey === deployFormKeyMap.catalog + formKey === DeployFormKeyMap.CATALOG ) { return null; } diff --git a/src/pages/llmodels/forms/online-source.tsx b/src/pages/llmodels/forms/online-source.tsx index 62560ddc..d8741566 100644 --- a/src/pages/llmodels/forms/online-source.tsx +++ b/src/pages/llmodels/forms/online-source.tsx @@ -4,7 +4,7 @@ import useAppUtils from '@/hooks/use-app-utils'; import { useIntl } from '@umijs/max'; import { Form } from 'antd'; import React from 'react'; -import { deployFormKeyMap, modelSourceMap } from '../config'; +import { DeployFormKeyMap, modelSourceMap } from '../config'; import { useFormContext } from '../config/form-context'; import { FormData } from '../config/types'; @@ -21,7 +21,7 @@ const HuggingFaceForm: React.FC = () => { modelSourceMap.huggingface_value, modelSourceMap.modelscope_value ].includes(source) || - formKey === deployFormKeyMap.catalog + formKey === DeployFormKeyMap.CATALOG ) { return null; }