fix: gpu instance always show delete, dedupe params

This commit is contained in:
jialin
2026-06-09 19:01:32 +08:00
committed by jialin
parent ac800a303a
commit a2e9f69b96
5 changed files with 40 additions and 15 deletions
@@ -24,7 +24,6 @@ const InstanceTypeCell: React.FC<{
}> = ({ title, name, sections }) => { }> = ({ title, name, sections }) => {
const specInfo = ( const specInfo = (
<div style={{ minWidth: 200 }}> <div style={{ minWidth: 200 }}>
{name && <div style={{ fontWeight: 600, marginBottom: 8 }}>{name}</div>}
{sections.map((sec) => { {sections.map((sec) => {
const rows = sec.rows.filter(([, v]) => v && v !== '-'); const rows = sec.rows.filter(([, v]) => v && v !== '-');
if (!rows.length) return null; if (!rows.length) return null;
@@ -153,11 +153,7 @@ export const rowActionList: InstanceRowAction[] = [
icon: icons.DeleteOutlined, icon: icons.DeleteOutlined,
show: (record: ListItem) => { show: (record: ListItem) => {
const phase = record.status?.phase; const phase = record.status?.phase;
return [ return true;
...GPUStackFailedStatuses,
InstanceStatusValueMap.Ready,
InstanceStatusValueMap.Unknown
].includes(phase as string);
}, },
props: { props: {
danger: true danger: true
@@ -8,7 +8,11 @@ import _ from 'lodash';
import React, { useEffect, useMemo, useRef, useState } from 'react'; import React, { useEffect, useMemo, useRef, useState } from 'react';
import styled from 'styled-components'; import styled from 'styled-components';
import { queryCatalogItemSpec } from '../../apis'; import { queryCatalogItemSpec } from '../../apis';
import { DeployFormKeyMap, sourceOptions } from '../../config'; import {
DeployFormKeyMap,
mergeBackendParameters,
sourceOptions
} from '../../config';
import { CatalogFormContext } from '../../config/form-context'; import { CatalogFormContext } from '../../config/form-context';
import { import {
CatalogSpec, CatalogSpec,
@@ -280,10 +284,10 @@ const AddModal: React.FC<AddModalProps> = (props) => {
setSourceList(sources); setSourceList(sources);
initFormDataBySource({ initFormDataBySource({
...defaultSpec, ...defaultSpec,
backend_parameters: [ backend_parameters: mergeBackendParameters(
...defaultBackendParams, defaultBackendParams,
...(defaultSpec.backend_parameters || []) defaultSpec.backend_parameters || []
], ),
cluster_id: clusterId cluster_id: clusterId
}); });
@@ -13,6 +13,7 @@ import ColumnWrapper from '../../../_components/column-wrapper';
import { import {
defaultFormValues, defaultFormValues,
DeployFormKeyMap, DeployFormKeyMap,
mergeBackendParameters,
modelSourceMap modelSourceMap
} from '../../config'; } from '../../config';
import { FormData, SourceType } from '../../config/types'; import { FormData, SourceType } from '../../config/types';
@@ -406,10 +407,10 @@ const AddModal: FC<AddModalProps> = (props) => {
...modelInfo.env, ...modelInfo.env,
...defaultSpec.env ...defaultSpec.env
}, },
backend_parameters: [ backend_parameters: mergeBackendParameters(
...modelInfo.backend_parameters, modelInfo.backend_parameters,
...(defaultSpec.backend_parameters || []) defaultSpec.backend_parameters
], ),
name: generateNameValue(item, modelInfo.name, manual), name: generateNameValue(item, modelInfo.name, manual),
categories: getCategory(item) categories: getCategory(item)
}; };
+25
View File
@@ -340,6 +340,31 @@ export const setbackendParameters = (data: any) => {
return result; 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 = [ export const modelLabels = [
{ label: 'Image', value: 'image_only' }, { label: 'Image', value: 'image_only' },
{ label: 'Text-to-speech', value: 'text_to_speech' }, { label: 'Text-to-speech', value: 'text_to_speech' },