diff --git a/src/pages/gpu-service/instances/components/instance-type-cell.tsx b/src/pages/gpu-service/instances/components/instance-type-cell.tsx index 135a63f5..cc7dd231 100644 --- a/src/pages/gpu-service/instances/components/instance-type-cell.tsx +++ b/src/pages/gpu-service/instances/components/instance-type-cell.tsx @@ -24,7 +24,6 @@ const InstanceTypeCell: React.FC<{ }> = ({ title, name, sections }) => { const specInfo = (
- {name &&
{name}
} {sections.map((sec) => { const rows = sec.rows.filter(([, v]) => v && v !== '-'); if (!rows.length) return null; diff --git a/src/pages/gpu-service/instances/config/index.ts b/src/pages/gpu-service/instances/config/index.ts index 5c76182d..de968623 100644 --- a/src/pages/gpu-service/instances/config/index.ts +++ b/src/pages/gpu-service/instances/config/index.ts @@ -153,11 +153,7 @@ export const rowActionList: InstanceRowAction[] = [ icon: icons.DeleteOutlined, show: (record: ListItem) => { const phase = record.status?.phase; - return [ - ...GPUStackFailedStatuses, - InstanceStatusValueMap.Ready, - InstanceStatusValueMap.Unknown - ].includes(phase as string); + return true; }, props: { danger: true diff --git a/src/pages/llmodels/components/deployment/deploy-builtin-modal.tsx b/src/pages/llmodels/components/deployment/deploy-builtin-modal.tsx index 9349a525..575bc215 100644 --- a/src/pages/llmodels/components/deployment/deploy-builtin-modal.tsx +++ b/src/pages/llmodels/components/deployment/deploy-builtin-modal.tsx @@ -8,7 +8,11 @@ import _ from 'lodash'; import React, { useEffect, useMemo, useRef, useState } from 'react'; import styled from 'styled-components'; import { queryCatalogItemSpec } from '../../apis'; -import { DeployFormKeyMap, sourceOptions } from '../../config'; +import { + DeployFormKeyMap, + mergeBackendParameters, + sourceOptions +} from '../../config'; import { CatalogFormContext } from '../../config/form-context'; import { CatalogSpec, @@ -280,10 +284,10 @@ const AddModal: React.FC = (props) => { setSourceList(sources); initFormDataBySource({ ...defaultSpec, - backend_parameters: [ - ...defaultBackendParams, - ...(defaultSpec.backend_parameters || []) - ], + backend_parameters: mergeBackendParameters( + defaultBackendParams, + defaultSpec.backend_parameters || [] + ), cluster_id: clusterId }); diff --git a/src/pages/llmodels/components/deployment/deploy-modal.tsx b/src/pages/llmodels/components/deployment/deploy-modal.tsx index 820ee692..aebd9804 100644 --- a/src/pages/llmodels/components/deployment/deploy-modal.tsx +++ b/src/pages/llmodels/components/deployment/deploy-modal.tsx @@ -13,6 +13,7 @@ import ColumnWrapper from '../../../_components/column-wrapper'; import { defaultFormValues, DeployFormKeyMap, + mergeBackendParameters, modelSourceMap } from '../../config'; import { FormData, SourceType } from '../../config/types'; @@ -406,10 +407,10 @@ const AddModal: FC = (props) => { ...modelInfo.env, ...defaultSpec.env }, - backend_parameters: [ - ...modelInfo.backend_parameters, - ...(defaultSpec.backend_parameters || []) - ], + backend_parameters: mergeBackendParameters( + modelInfo.backend_parameters, + defaultSpec.backend_parameters + ), name: generateNameValue(item, modelInfo.name, manual), categories: getCategory(item) }; diff --git a/src/pages/llmodels/config/index.ts b/src/pages/llmodels/config/index.ts index 3f993f50..61263eeb 100644 --- a/src/pages/llmodels/config/index.ts +++ b/src/pages/llmodels/config/index.ts @@ -340,6 +340,31 @@ export const setbackendParameters = (data: any) => { return result; }; +// extract the key of a backend parameter. +// supported formats: '--key', '--key=value', '--key value' +export const getBackendParameterKey = (param: string): string => { + const trimmed = String(param).trim(); + const matched = trimmed.match(/^([^=\s]+)/); + return matched ? matched[1] : trimmed; +}; + +// merge two backend_parameters lists and dedupe by key. +// params from `priorityParams` (e.g. defaultSpec) win over `baseParams`. +export const mergeBackendParameters = ( + baseParams: string[] = [], + priorityParams: string[] = [] +): string[] => { + const priorityKeys = new Set( + priorityParams.map((param) => getBackendParameterKey(param)) + ); + + const filteredBase = baseParams.filter( + (param) => !priorityKeys.has(getBackendParameterKey(param)) + ); + + return [...filteredBase, ...priorityParams]; +}; + export const modelLabels = [ { label: 'Image', value: 'image_only' }, { label: 'Text-to-speech', value: 'text_to_speech' },