Files
gpustack-ui/src/pages/llmodels/config/index.ts
T
2026-02-03 18:21:08 +08:00

487 lines
12 KiB
TypeScript

import IconFont from '@/components/icon-font';
import { StatusMaps } from '@/config';
import {
AudioOutlined,
EditOutlined,
PictureOutlined,
WechatWorkOutlined
} from '@ant-design/icons';
import React from 'react';
import { backendOptionsMap } from './backend-parameters';
export const backendTipsList = [
{
title: backendOptionsMap.vllm,
tips: 'models.form.backend.vllm'
},
{
title: backendOptionsMap.SGLang,
tips: 'models.form.backend.sglang'
},
{
title: backendOptionsMap.ascendMindie,
tips: 'models.form.backend.mindie'
},
{
title: backendOptionsMap.voxBox,
tips: 'models.form.backend.voxbox'
}
];
export const localPathTipsList = [
{
title: {
text: 'models.localpath.gguf.tips.title',
locale: true
},
tips: 'models.localpath.gguf.tips'
},
{
title: {
text: 'models.localpath.shared.tips.title',
locale: true
},
tips: 'models.localpath.chunks.tips'
},
{
title: {
text: 'models.localpat.safe.tips.title',
locale: true
},
tips: 'models.localpath.safe.tips'
}
];
export const backendLabelMap = {
[backendOptionsMap.llamaBox]: 'llama-box',
[backendOptionsMap.vllm]: 'vLLM',
[backendOptionsMap.voxBox]: 'vox-box',
[backendOptionsMap.ascendMindie]: 'Ascend MindIE',
[backendOptionsMap.custom]: 'Custom'
};
export const backendParamsHolderTips = {
[backendOptionsMap.llamaBox]: {
holder: 'models.form.backend_parameters.llamabox.placeholder',
tooltip: 'models.form.backend_parameters.vllm.tips'
},
[backendOptionsMap.vllm]: {
holder: 'models.form.backend_parameters.vllm.placeholder',
tooltip: 'models.form.backend_parameters.vllm.tips'
},
[backendOptionsMap.SGLang]: {
holder: 'models.form.backend_parameters.sglang.placeholder',
tooltip: ''
},
[backendOptionsMap.voxBox]: null
};
export const modelTaskMap = {
textToSpeech: 'text-to-speech',
speechToText: 'speech-to-text',
textToText: 'text-to-text',
textToImage: 'text-to-image',
audio: 'audio',
image: 'image'
};
export const ModelscopeTaskMap = {
[modelTaskMap.textToSpeech]: 'text-to-speech',
[modelTaskMap.speechToText]: 'auto-speech-recognition',
[modelTaskMap.textToText]: 'TextToText',
[modelTaskMap.textToImage]: 'text-to-image',
audio: ['text-to-speech', 'auto-speech-recognition']
};
export const HuggingFaceTaskMap = {
[modelTaskMap.textToSpeech]: 'text-to-speech',
[modelTaskMap.speechToText]: 'automatic-speech-recognition',
[modelTaskMap.textToText]: 'text-2-text',
[modelTaskMap.textToImage]: 'text-to-image',
audio: ['text-to-speech', 'automatic-speech-recognition']
};
export const AudioModeTypeMap = {
FunASR: ['FunASR', 'funasr', 'fun-asr', 'fun_asr'],
Bark: ['Bark', 'bark'],
Whisper: ['Whisper', 'whisper'],
CosyVoice: ['CosyVoice', 'cosyvoice', 'cosy-voice', 'cosy_voice']
};
interface ModelSource {
huggingface: string;
huggingface_value: string;
ollama_library: string;
ollama_library_value: string;
modelScope: string;
modelscope_value: string;
local_path: string;
local_path_value: string;
model_scope: string;
}
export const modelSourceMap: ModelSource = {
huggingface: 'Hugging Face',
huggingface_value: 'huggingface',
ollama_library: 'Ollama Library',
ollama_library_value: 'ollama_library',
modelScope: 'ModelScope',
modelscope_value: 'model_scope',
model_scope: 'ModelScope',
local_path: 'Local Path',
local_path_value: 'local_path'
};
export const modelSourceValueMap = {
[modelSourceMap.huggingface_value]: modelSourceMap.huggingface,
[modelSourceMap.ollama_library_value]: modelSourceMap.ollama_library,
[modelSourceMap.modelscope_value]: modelSourceMap.modelScope,
[modelSourceMap.local_path_value]: modelSourceMap.local_path
};
export const sourceOptions = [
{
label: 'Hugging Face',
value: modelSourceMap.huggingface_value,
key: 'huggingface'
},
{
label: 'ModelScope',
value: modelSourceMap.modelscope_value,
key: 'model_scope'
},
{
label: 'models.form.localPath',
locale: true,
value: modelSourceMap.local_path_value,
key: 'local_path'
}
];
export const InstanceStatusMap = {
Initializing: 'initializing',
Starting: 'starting',
Pending: 'pending',
Running: 'running',
Scheduled: 'scheduled',
Error: 'error',
Downloading: 'downloading',
Unknown: 'unknown',
Analyzing: 'analyzing',
Unreachable: 'unreachable'
};
export const InstanceRealtimeLogStatus = [
InstanceStatusMap.Downloading,
InstanceStatusMap.Initializing,
InstanceStatusMap.Starting
];
export const InstanceStatusMapValue = {
[InstanceStatusMap.Initializing]: 'Initializing',
[InstanceStatusMap.Pending]: 'Pending',
[InstanceStatusMap.Running]: 'Running',
[InstanceStatusMap.Scheduled]: 'Scheduled',
[InstanceStatusMap.Error]: 'Error',
[InstanceStatusMap.Downloading]: 'Downloading',
[InstanceStatusMap.Unknown]: 'Unknown',
[InstanceStatusMap.Analyzing]: 'Analyzing',
[InstanceStatusMap.Starting]: 'Starting',
[InstanceStatusMap.Unreachable]: 'Unreachable'
};
export const status: any = {
[InstanceStatusMap.Running]: StatusMaps.success,
[InstanceStatusMap.Pending]: StatusMaps.transitioning,
[InstanceStatusMap.Initializing]: StatusMaps.transitioning,
[InstanceStatusMap.Scheduled]: StatusMaps.transitioning,
[InstanceStatusMap.Error]: StatusMaps.error,
[InstanceStatusMap.Downloading]: StatusMaps.transitioning,
[InstanceStatusMap.Unknown]: StatusMaps.inactive,
[InstanceStatusMap.Analyzing]: StatusMaps.transitioning,
[InstanceStatusMap.Starting]: StatusMaps.transitioning,
[InstanceStatusMap.Unreachable]: StatusMaps.error
};
export const MyModelsStatusValueMap = {
Inactive: 'stopped',
Degrade: 'not_ready',
Active: 'ready'
};
export const MyModelsStatusMap = {
[MyModelsStatusValueMap.Inactive]: StatusMaps.inactive,
[MyModelsStatusValueMap.Degrade]: StatusMaps.error,
[MyModelsStatusValueMap.Active]: StatusMaps.success
};
export const MyModelsStatusLabelMap = {
[MyModelsStatusValueMap.Inactive]: 'models.mymodels.status.inactive',
[MyModelsStatusValueMap.Degrade]: 'models.mymodels.status.degrade',
[MyModelsStatusValueMap.Active]: 'models.mymodels.status.active'
};
export const ScheduleValueMap = {
Auto: 'auto',
Manual: 'manual',
SpecificGPUType: 'specific_gpu_type'
};
export const scheduleList = [
{
label: 'models.form.scheduletype.auto',
locale: true,
value: ScheduleValueMap.Auto
},
{
label: 'models.form.scheduletype.manual',
value: ScheduleValueMap.Manual,
locale: true
}
// {
// label: 'models.form.scheduletype.gpuType',
// value: ScheduleValueMap.SpecificGPUType,
// locale: true
// }
];
export const ActionList = [
{
label: 'common.button.edit',
key: 'edit',
icon: EditOutlined
},
{
label: 'models.openinplayground',
key: 'chat',
icon: EditOutlined
},
{
label: 'common.button.delete',
key: 'delete',
icon: EditOutlined
}
];
export const ModelSortType = {
trendingScore: 'trendingScore',
likes: 'likes',
downloads: 'downloads',
lastModified: 'lastModified'
};
export const ModelScopeSortType = {
[ModelSortType.trendingScore]: 'Default',
[ModelSortType.likes]: 'StarsCount',
[ModelSortType.downloads]: 'DownloadsCount',
[ModelSortType.lastModified]: 'GmtModified'
};
export const placementStrategyOptions = [
{
label: 'Spread',
value: 'spread'
},
{
label: 'Binpack',
value: 'binpack'
}
];
export const modelCategoriesMap = {
image: 'image',
text_to_speech: 'text_to_speech',
speech_to_text: 'speech_to_text',
embedding: 'embedding',
reranker: 'reranker',
llm: 'llm'
};
export const categoryOptions = [
{
label: 'LLM',
value: modelCategoriesMap.llm,
icon: React.createElement(WechatWorkOutlined, { style: { color: 'green' } })
},
{
label: 'Embedding',
value: modelCategoriesMap.embedding,
icon: React.createElement(IconFont, {
type: 'icon-cube',
style: { color: 'magenta' }
})
},
{
label: 'Reranker',
value: modelCategoriesMap.reranker,
icon: React.createElement(IconFont, {
type: 'icon-rank1',
style: { color: 'cyan' }
})
},
{
label: 'Image',
value: modelCategoriesMap.image,
icon: React.createElement(PictureOutlined, { style: { color: 'orange' } })
},
{
label: 'Text-to-Speech',
value: modelCategoriesMap.text_to_speech,
icon: React.createElement(IconFont, {
type: 'icon-sound-wave',
style: { color: 'geekblue' }
})
},
{
label: 'Speech-to-Text',
value: modelCategoriesMap.speech_to_text,
icon: React.createElement(AudioOutlined, { style: { color: 'processing' } })
}
];
export const modelCategories = [
{ label: 'common.options.auto', value: null, locale: true },
...categoryOptions
];
export const getbackendParameters = (data: any) => {
const backendParameters = data.backend_parameters || {};
const result: string[] = [];
Object.keys(backendParameters)?.forEach((key: string) => {
result.push(`${key}=${backendParameters[key]}`);
});
return result;
};
export const setbackendParameters = (data: any) => {
const result: Record<string, string> = {};
const backendParameters = data.backend_parameters || [];
backendParameters.forEach((item: string) => {
const [key, value] = item.split('=');
result[key] = value;
});
return result;
};
export const modelLabels = [
{ label: 'Image', value: 'image_only' },
{ label: 'Text-to-speech', value: 'text_to_speech' },
{ label: 'Speech-to-text', value: 'speech_to_text' },
{ label: 'reranker', value: 'reranker' },
{ label: 'Embedding', value: 'embedding_only' }
];
// do not trigger form check compatibility when these fields change, maybe triggered manually
export const DO_NOT_TRIGGER_CHECK_COMPATIBILITY = [
'model_scope_model_id',
'huggingface_repo_id',
'huggingface_filename',
'model_scope_file_path',
'name',
'description',
'env',
'source',
'cluster_id',
'quantization',
'size',
'restart_on_error',
'worker_selector',
'backend_parameters',
'local_path',
'backend_version',
'ollama_library_model_name',
'scheduleType',
'placement_strategy',
'backend',
'gpu_selector.gpu_ids',
'run_command',
'image_name',
'extended_kv_cache.enabled',
'extended_kv_cache.ram_size',
'speculative_config.enabled',
'speculative_config.draft_model',
'max_context_len'
];
// ignore to compare old and new data when these fields change in updating model
export const DO_NOT_NOTIFY_RECREATE = ['categories', 'replicas', 'description'];
export const defaultFormValues = {
replicas: 1,
description: '',
categories: null,
env: {},
scheduleType: ScheduleValueMap.Auto,
placement_strategy: 'spread',
gpu_ids: null,
gpu_selector: {},
worker_selector: {},
backend_parameters: [],
backend_version: null
};
export const getBackendParamsTips = (backend: string) => {
if (backend === backendOptionsMap.llamaBox) {
return {
backend: 'llama-box',
releases: 'https://github.com/gpustack/llama-box/releases',
link: 'https://github.com/gpustack/llama-box?tab=readme-ov-file#usage',
version: 'v0.0.140'
};
}
if (backend === backendOptionsMap.vllm) {
return {
backend: 'vLLM',
releases: 'https://github.com/vllm-project/vllm/releases',
link: 'https://docs.vllm.ai/en/stable/cli/serve.html',
version: 'v0.8.5'
};
}
if (backend === backendOptionsMap.ascendMindie) {
return {
backend: 'Ascend MindIE',
releases: '',
link: 'http://docs.gpustack.ai/latest/user-guide/inference-backends/#parameters-reference_2',
version: '1.0.0'
};
}
if (backend === backendOptionsMap.SGLang) {
return {
backend: 'SGLang',
releases: '',
link: 'https://docs.sglang.ai/advanced_features/server_arguments.html',
version: 'v0.5.4'
};
}
return {
backend: 'vox-box',
releases: 'https://github.com/gpustack/vox-box/releases',
link: '',
version: 'v0.0.13'
};
};
export const scheduleTypeTips = [
{
title: {
text: 'models.form.scheduletype.auto',
locale: true
},
tips: 'models.form.scheduletype.auto.tips'
},
{
title: {
text: 'models.form.scheduletype.manual',
locale: true
},
tips: 'models.form.scheduletype.manual.tips'
}
];
// transform to enum type
export enum DeployFormKeyMap {
DEPLOYMENT = 'deployment',
CATALOG = 'catalog'
}