fix: backend edit format
This commit is contained in:
@@ -127,6 +127,7 @@ const SealTextArea: React.FC<InputTextareaProps & SealFormItemProps> = (
|
||||
>
|
||||
<Input.TextArea
|
||||
{...rest}
|
||||
placeholder={placeholder}
|
||||
spellCheck={rest.spellCheck ?? false}
|
||||
autoSize={autoSize}
|
||||
ref={inputRef}
|
||||
|
||||
@@ -11,7 +11,7 @@ export default {
|
||||
'backend.builtin': 'Built-in',
|
||||
'backend.custom': 'Custom',
|
||||
'backend.isDefault': 'Default',
|
||||
'backend.availableFrameworks': 'Available Frameworks',
|
||||
'backend.availableFrameworks': 'Supported Frameworks',
|
||||
'backend.addVersion': 'Add Version',
|
||||
'backend.filter.framework': 'Filter by Framework',
|
||||
'backend.export.yaml': 'Export YAML',
|
||||
|
||||
@@ -187,5 +187,7 @@ export default {
|
||||
'models.form.extendedkvcache': 'Enable Extended KV Cache',
|
||||
'models.form.chunkSize': 'Size Of Cache Chunks',
|
||||
'models.form.maxCPUSize': 'Maximum CPU Cache Size (GiB)',
|
||||
'models.form.remoteURL': 'Remote Storage URL'
|
||||
'models.form.remoteURL': 'Remote Storage URL',
|
||||
'models.form.runCommandPlaceholder':
|
||||
'e.g., vllm serve Qwen/Qwen2.5-1.5B-Instruct'
|
||||
};
|
||||
|
||||
@@ -11,7 +11,7 @@ export default {
|
||||
'backend.builtin': 'Built-in',
|
||||
'backend.custom': 'Custom',
|
||||
'backend.isDefault': 'Default',
|
||||
'backend.availableFrameworks': 'Available Frameworks',
|
||||
'backend.availableFrameworks': 'Supported Frameworks',
|
||||
'backend.addVersion': 'Add Version',
|
||||
'backend.filter.framework': 'Filter by Framework',
|
||||
'backend.export.yaml': 'Export YAML',
|
||||
|
||||
@@ -184,7 +184,9 @@ export default {
|
||||
'models.form.extendedkvcache': 'Enable Extended KV Cache',
|
||||
'models.form.chunkSize': 'Size Of Cache Chunks',
|
||||
'models.form.maxCPUSize': 'Maximum CPU Cache Size (GiB)',
|
||||
'models.form.remoteURL': 'Remote Storage URL'
|
||||
'models.form.remoteURL': 'Remote Storage URL',
|
||||
'models.form.runCommandPlaceholder':
|
||||
'e.g., vllm serve Qwen/Qwen2.5-1.5B-Instruct'
|
||||
};
|
||||
|
||||
// ========== To-Do: Translate Keys (Remove After Translation) ==========
|
||||
@@ -212,6 +214,7 @@ export default {
|
||||
// 22. 'models.form.extendedkvcache': 'Enable Extended KV Cache',
|
||||
// 23. 'models.form.chunkSize': 'Size Of Cache Chunks',
|
||||
// 24. 'models.form.maxCPUSize': 'Maximum CPU Cache Size (GiB)',
|
||||
// 25. 'models.form.remoteURL': 'Remote Storage URL'
|
||||
// 25. 'models.form.remoteURL': 'Remote Storage URL',
|
||||
// 26. 'models.form.runCommandPlaceholder': 'e.g., vllm serve Qwen/Qwen2.5-1.5B-Instruct'
|
||||
|
||||
// ========== End of To-Do List ==========
|
||||
|
||||
@@ -11,7 +11,7 @@ export default {
|
||||
'backend.builtin': 'Built-in',
|
||||
'backend.custom': 'Custom',
|
||||
'backend.isDefault': 'Default',
|
||||
'backend.availableFrameworks': 'Available Frameworks',
|
||||
'backend.availableFrameworks': 'Supported Frameworks',
|
||||
'backend.addVersion': 'Add Version',
|
||||
'backend.filter.framework': 'Filter by Framework',
|
||||
'backend.export.yaml': 'Export YAML',
|
||||
|
||||
@@ -187,7 +187,9 @@ export default {
|
||||
'models.form.extendedkvcache': 'Enable Extended KV Cache',
|
||||
'models.form.chunkSize': 'Size Of Cache Chunks',
|
||||
'models.form.maxCPUSize': 'Maximum CPU Cache Size (GiB)',
|
||||
'models.form.remoteURL': 'Remote Storage URL'
|
||||
'models.form.remoteURL': 'Remote Storage URL',
|
||||
'models.form.runCommandPlaceholder':
|
||||
'e.g., vllm serve Qwen/Qwen2.5-1.5B-Instruct'
|
||||
};
|
||||
|
||||
// ========== To-Do: Translate Keys (Remove After Translation) ==========
|
||||
@@ -207,5 +209,6 @@ export default {
|
||||
// 14. 'models.form.extendedkvcache': 'Enable Extended KV Cache',
|
||||
// 15. 'models.form.chunkSize': 'Size Of Cache Chunks',
|
||||
// 16. 'models.form.maxCPUSize': 'Maximum CPU Cache Size (GiB)',
|
||||
// 17. 'models.form.remoteURL': 'Remote Storage URL'
|
||||
// 17. 'models.form.remoteURL': 'Remote Storage URL',
|
||||
// 18. 'models.form.runCommandPlaceholder': 'e.g., vllm serve Qwen/Qwen2.5-1.5B-Instruct';
|
||||
// ========== End of To-Do List ==========
|
||||
|
||||
@@ -11,7 +11,7 @@ export default {
|
||||
'backend.builtin': '内置',
|
||||
'backend.custom': '自定义',
|
||||
'backend.isDefault': '默认',
|
||||
'backend.availableFrameworks': '可用框架',
|
||||
'backend.availableFrameworks': '支持框架',
|
||||
'backend.addVersion': '添加版本',
|
||||
'backend.filter.framework': '按框架过滤',
|
||||
'backend.export.yaml': '导出 YAML',
|
||||
|
||||
@@ -177,5 +177,7 @@ export default {
|
||||
'models.form.extendedkvcache': '启用扩展 KV 缓存',
|
||||
'models.form.chunkSize': '缓存分块大小',
|
||||
'models.form.maxCPUSize': 'CPU 缓存最大占用 (GiB)',
|
||||
'models.form.remoteURL': '远程存储地址'
|
||||
'models.form.remoteURL': '远程存储地址',
|
||||
'models.form.runCommandPlaceholder':
|
||||
'例如,vllm serve Qwen/Qwen2.5-1.5B-Instruct'
|
||||
};
|
||||
|
||||
@@ -57,10 +57,7 @@ const AddModal: React.FC<AddModalProps> = (props) => {
|
||||
const onOk = () => {
|
||||
if (activeKey === 'yaml') {
|
||||
const content = editorRef.current?.getContent();
|
||||
const valid = editorRef.current?.validate();
|
||||
if (valid) {
|
||||
onSubmitYaml({ content: content });
|
||||
}
|
||||
onSubmitYaml({ content: content });
|
||||
} else {
|
||||
formRef.current?.submit();
|
||||
}
|
||||
@@ -104,30 +101,40 @@ const AddModal: React.FC<AddModalProps> = (props) => {
|
||||
);
|
||||
|
||||
const builtInVersions = Object.keys(
|
||||
values.build_in_version_configs || {}
|
||||
values.built_in_version_configs || {}
|
||||
).map((key) => ({
|
||||
version_no: key,
|
||||
image_name: values.build_in_version_configs?.[key]?.image_name,
|
||||
run_command: values.build_in_version_configs?.[key]?.run_command,
|
||||
image_name: values.built_in_version_configs?.[key]?.image_name,
|
||||
run_command: values.built_in_version_configs?.[key]?.run_command,
|
||||
is_default: key === values.default_version,
|
||||
build_in_frameworks:
|
||||
values.build_in_version_configs?.[key]?.build_in_frameworks || [],
|
||||
built_in_frameworks:
|
||||
values.built_in_version_configs?.[key]?.built_in_frameworks || [],
|
||||
is_built_in: true
|
||||
}));
|
||||
|
||||
return {
|
||||
...values,
|
||||
version_configs: versionConfigs,
|
||||
build_in_version_configs: builtInVersions
|
||||
built_in_version_configs: builtInVersions
|
||||
};
|
||||
};
|
||||
|
||||
// built-in backend does not allow to edit default_version
|
||||
const initYamlContent = (values: any) => {
|
||||
const copyValues = structuredClone(values);
|
||||
copyValues.version_configs = _.mapValues(
|
||||
copyValues.version_configs || {},
|
||||
(v: any) => {
|
||||
return _.omit(v, ['built_in_frameworks']);
|
||||
}
|
||||
);
|
||||
|
||||
if (currentData?.is_built_in) {
|
||||
return json2Yaml(_.pick(values, backendFields));
|
||||
return json2Yaml(_.pick(copyValues, backendFields));
|
||||
}
|
||||
return json2Yaml(_.pick(values, [...backendFields, 'default_version']));
|
||||
return json2Yaml(
|
||||
_.pick(copyValues, [...backendFields, 'default_version'])
|
||||
);
|
||||
};
|
||||
|
||||
if (action === PageAction.EDIT && open) {
|
||||
|
||||
@@ -20,8 +20,8 @@ const VersionInfoModal: React.FC<VersionInfoModalProps> = ({
|
||||
|
||||
useEffect(() => {
|
||||
if (open && currentData) {
|
||||
// add is_built_in field to build_in_version_configs
|
||||
const builtInVersions = currentData.build_in_version_configs || {};
|
||||
// add is_built_in field to built_in_version_configs
|
||||
const builtInVersions = currentData.built_in_version_configs || {};
|
||||
|
||||
for (const key in builtInVersions) {
|
||||
if (builtInVersions?.hasOwnProperty(key)) {
|
||||
@@ -41,7 +41,7 @@ const VersionInfoModal: React.FC<VersionInfoModalProps> = ({
|
||||
run_command: value.run_command,
|
||||
is_default: key === currentData.default_version,
|
||||
availableFrameworks: [
|
||||
...(value.build_in_frameworks || []),
|
||||
...(value.built_in_frameworks || []),
|
||||
...(value.custom_framework ? [value.custom_framework] : [])
|
||||
],
|
||||
is_built_in: value.is_built_in || false
|
||||
|
||||
@@ -114,7 +114,7 @@ export const backendFields = [
|
||||
'health_check_path',
|
||||
'default_run_command',
|
||||
'version_configs',
|
||||
'default_backend_parameters'
|
||||
'default_backend_param'
|
||||
];
|
||||
export const frameworks = [
|
||||
{
|
||||
@@ -148,6 +148,8 @@ backend_name: SGLang
|
||||
description: SGLang backend
|
||||
default_version: v0.5.1
|
||||
health_check_path: /health
|
||||
default_backend_param:
|
||||
- --host
|
||||
default_run_command: run sglang
|
||||
version_configs:
|
||||
v0.0.1:
|
||||
@@ -158,6 +160,4 @@ version_configs:
|
||||
image_name: lm/sglang
|
||||
run_command:
|
||||
custom_framework:
|
||||
default_backend_parameters:
|
||||
- --host
|
||||
`;
|
||||
|
||||
@@ -14,6 +14,17 @@
|
||||
"type": "string",
|
||||
"description": "default backend version"
|
||||
},
|
||||
"is_built_in": {
|
||||
"type": "boolean",
|
||||
"description": "is built-in backend"
|
||||
},
|
||||
"default_backend_param": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "default backend parameter"
|
||||
},
|
||||
"default_run_command": {
|
||||
"type": ["string", "null"],
|
||||
"description": "default start command"
|
||||
@@ -48,12 +59,51 @@
|
||||
"additionalProperties": false,
|
||||
"description": "multiple backend versions"
|
||||
},
|
||||
"default_backend_parameters": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
"built_in_version_configs": {
|
||||
"type": "object",
|
||||
"patternProperties": {
|
||||
"^[a-zA-Z0-9._-]+$": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"image_name": {
|
||||
"type": "string",
|
||||
"description": "image name"
|
||||
},
|
||||
"run_command": {
|
||||
"type": ["string", "null"],
|
||||
"description": "start command"
|
||||
},
|
||||
"custom_framework": {
|
||||
"type": ["string", "null"],
|
||||
"description": "custom framework"
|
||||
},
|
||||
"built_in_frameworks": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "built-in frameworks"
|
||||
}
|
||||
},
|
||||
"required": ["image_name", "run_command"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"description": "default backend parameters"
|
||||
"additionalProperties": false,
|
||||
"description": "multiple backend versions"
|
||||
},
|
||||
"framework_index_map": {
|
||||
"type": "object",
|
||||
"patternProperties": {
|
||||
"^[a-zA-Z0-9._-]+$": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"additionalProperties": false,
|
||||
"description": "framework to version mapping"
|
||||
}
|
||||
},
|
||||
"required": ["backend_name", "default_version", "version_configs"],
|
||||
|
||||
@@ -5,6 +5,13 @@
|
||||
"type": ["string", "null"],
|
||||
"description": "backend description"
|
||||
},
|
||||
"default_backend_param": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "default backend parameter"
|
||||
},
|
||||
"default_run_command": {
|
||||
"type": ["string", "null"],
|
||||
"description": "default start command"
|
||||
@@ -38,13 +45,6 @@
|
||||
},
|
||||
"additionalProperties": false,
|
||||
"description": "multiple backend versions"
|
||||
},
|
||||
"default_backend_parameters": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "default backend parameters"
|
||||
}
|
||||
},
|
||||
"required": ["version_configs"],
|
||||
|
||||
@@ -9,6 +9,13 @@
|
||||
"type": "string",
|
||||
"description": "default backend version"
|
||||
},
|
||||
"default_backend_param": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "default backend parameter"
|
||||
},
|
||||
"default_run_command": {
|
||||
"type": ["string", "null"],
|
||||
"description": "default start command"
|
||||
@@ -42,13 +49,6 @@
|
||||
},
|
||||
"additionalProperties": false,
|
||||
"description": "multiple backend versions"
|
||||
},
|
||||
"default_backend_parameters": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "default backend parameters"
|
||||
}
|
||||
},
|
||||
"required": ["default_version", "version_configs"],
|
||||
|
||||
@@ -2,7 +2,7 @@ export interface VersionConfigs {
|
||||
image_name: string;
|
||||
run_command: string;
|
||||
is_default: boolean;
|
||||
build_in_frameworks?: string[];
|
||||
built_in_frameworks?: string[];
|
||||
custom_framework?: string;
|
||||
version_no?: string;
|
||||
is_built_in?: boolean;
|
||||
@@ -29,6 +29,6 @@ export interface ListItem extends FormData {
|
||||
is_built_in?: boolean;
|
||||
created_at?: string;
|
||||
updated_at?: string;
|
||||
build_in_version_configs?: Record<string, VersionConfigs>;
|
||||
built_in_version_configs?: Record<string, VersionConfigs>;
|
||||
framework_index_map?: Record<string, string[]>;
|
||||
}
|
||||
|
||||
@@ -90,6 +90,15 @@ export const VersionItem: React.FC<VersionItemProps> = ({ data }) => {
|
||||
{intl.formatMessage({ id: 'backend.builtin' })}
|
||||
</ThemeTag>
|
||||
)}
|
||||
{!data.is_built_in && data.is_default && (
|
||||
<ThemeTag
|
||||
color="geekblue"
|
||||
className="font-400"
|
||||
style={{ marginRight: 0 }}
|
||||
>
|
||||
{intl.formatMessage({ id: 'backend.isDefault' })}
|
||||
</ThemeTag>
|
||||
)}
|
||||
</div>
|
||||
<RowWrapper>
|
||||
{data.image_name && (
|
||||
|
||||
@@ -62,7 +62,7 @@ const BackendList = () => {
|
||||
currentData?: Partial<ListItem>;
|
||||
}>({ open: false });
|
||||
|
||||
// build_in_version_configs is read-only, but needs to be included when updating
|
||||
// built_in_version_configs is read-only, but needs to be included when updating
|
||||
const handleOnSubmit = async (values: FormData) => {
|
||||
try {
|
||||
if (openModalStatus.action === 'create') {
|
||||
@@ -70,9 +70,10 @@ const BackendList = () => {
|
||||
} else {
|
||||
await updateBackend(openModalStatus.currentData!.id!, {
|
||||
data: {
|
||||
build_in_version_configs:
|
||||
openModalStatus.currentData?.build_in_version_configs,
|
||||
..._.omit(values, ['build_in_version_configs'])
|
||||
built_in_version_configs:
|
||||
openModalStatus.currentData?.built_in_version_configs,
|
||||
..._.omit(values, ['built_in_version_configs']),
|
||||
health_check_path: values.health_check_path || null
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -85,7 +86,7 @@ const BackendList = () => {
|
||||
} catch (error) {}
|
||||
};
|
||||
|
||||
// build_in_version_configs needs to be included when updating from YAML, but not allowed to be changed
|
||||
// built_in_version_configs needs to be included when updating from YAML, but not allowed to be changed
|
||||
const handleOnSubmitYaml = async (values: { content: string }) => {
|
||||
try {
|
||||
if (openModalStatus.action === 'create') {
|
||||
@@ -95,8 +96,8 @@ const BackendList = () => {
|
||||
const yamlContent = json2Yaml({
|
||||
backend_name: openModalStatus.currentData?.backend_name,
|
||||
default_version: openModalStatus.currentData?.default_version,
|
||||
build_in_version_configs:
|
||||
openModalStatus.currentData?.build_in_version_configs,
|
||||
built_in_version_configs:
|
||||
openModalStatus.currentData?.built_in_version_configs,
|
||||
...jsonData
|
||||
});
|
||||
await updateBackendFromYAML(openModalStatus.currentData!.id!, {
|
||||
@@ -122,7 +123,6 @@ const BackendList = () => {
|
||||
};
|
||||
|
||||
const handleOnSelect = (item: any) => {
|
||||
console.log('selected item:', item);
|
||||
if (item.action === 'edit') {
|
||||
setOpenModalStatus({
|
||||
open: true,
|
||||
@@ -134,8 +134,16 @@ const BackendList = () => {
|
||||
name: item.data.backend_name
|
||||
});
|
||||
} else if (item.action === 'export') {
|
||||
// Export YAML action
|
||||
exportYAML(item.data);
|
||||
const currentData = structuredClone(item.data);
|
||||
|
||||
currentData.version_configs = _.mapValues(
|
||||
currentData.version_configs,
|
||||
(v: any) => {
|
||||
return _.omit(v, ['built_in_frameworks']);
|
||||
}
|
||||
);
|
||||
|
||||
exportYAML(_.omit(currentData, ['id', 'created_at', 'updated_at']));
|
||||
} else if (item.action === 'view_versions') {
|
||||
setOpenVersionInfoModal({
|
||||
open: true,
|
||||
|
||||
@@ -143,6 +143,9 @@ const BackendFields: React.FC = () => {
|
||||
scaleSize={true}
|
||||
allowClear
|
||||
label={intl.formatMessage({ id: 'backend.runCommand' })}
|
||||
placeholder={intl.formatMessage({
|
||||
id: 'models.form.runCommandPlaceholder'
|
||||
})}
|
||||
></SealInput.TextArea>
|
||||
</Form.Item>
|
||||
</>
|
||||
|
||||
Reference in New Issue
Block a user