feat(ai): refine model deployment UI and support GB10 upgrades (#14295)

This commit is contained in:
ssongliu
2026-11-04 12:28:30 +08:00
committed by GitHub
parent 5b9aaa7d7a
commit 89787a55ee
19 changed files with 163 additions and 172 deletions
+5 -2
View File
@@ -136,8 +136,8 @@ func upgradeInstall(req request.AppInstallUpgrade) error {
if err = checkVllmVersionAccess(install.App.Key, detail.Version); err != nil {
return err
}
if install.App.Key == vllmAppKeyForUpgrade && !isVllmUpgradeVersionAllowed(install.Version, detail.Version, loadVllmImageFromEnv(install.Env)) {
return errors.New("vLLM can only upgrade within the same image type")
if install.App.Key == vllmAppKeyForUpgrade && !isVllmUpgradeCandidate(install.Version, detail.Version, loadVllmImageFromEnv(install.Env)) {
return errors.New("vLLM upgrade version is not supported")
}
if install.Version == detail.Version {
return errors.New("two version is same")
@@ -271,6 +271,9 @@ func (u *appUpgradeContext) prepare(t *task.Task) error {
}
image := buildVllmUpgradeImage(loadVllmImageFromEnv(stagedInstall.Env), u.original.Version, u.detail.Version)
envs[vllmImageEnvKey] = image
if strings.HasPrefix(strings.ToLower(strings.TrimSpace(u.detail.Version)), vllmGB10VersionPrefix) {
envs["DSPARK_VLLM_IMAGE"] = image
}
paramBytes, marshalErr := json.Marshal(envs)
if marshalErr != nil {
return marshalErr
+12 -1
View File
@@ -58,6 +58,9 @@ func resolveVllmVersionFamily(version, image string) string {
func trimVllmVersionFamily(version string) string {
trimmed := strings.TrimSpace(version)
normalized := strings.ToLower(trimmed)
if strings.HasPrefix(normalized, vllmGB10VersionPrefix) {
return strings.TrimSpace(trimmed[len(vllmGB10VersionPrefix):])
}
for _, family := range []string{vllmImageTypeNvidia, vllmImageTypeIntel, vllmImageTypeAscend} {
prefix := family + "-"
if strings.HasPrefix(normalized, prefix) {
@@ -69,6 +72,9 @@ func trimVllmVersionFamily(version string) string {
func buildDefaultVllmImageByVersion(version string) string {
tag := trimVllmVersionFamily(version)
if strings.HasPrefix(strings.ToLower(strings.TrimSpace(version)), vllmGB10VersionPrefix) {
return "1panel/vllm-gb10-dspark:" + tag
}
family := resolveVllmVersionFamily(version, "")
if family == vllmImageTypeIntel {
return "intel/llm-scaler-vllm:" + tag
@@ -83,6 +89,11 @@ func buildDefaultVllmImageByVersion(version string) string {
}
func isVllmUpgradeVersionAllowed(currentVersion, targetVersion, currentImage string) bool {
currentGB10 := strings.HasPrefix(strings.ToLower(strings.TrimSpace(currentVersion)), vllmGB10VersionPrefix)
targetGB10 := strings.HasPrefix(strings.ToLower(strings.TrimSpace(targetVersion)), vllmGB10VersionPrefix)
if currentGB10 != targetGB10 {
return false
}
currentFamily := resolveVllmVersionFamily(currentVersion, currentImage)
targetFamily := resolveVllmVersionFamily(targetVersion, "")
return currentFamily == targetFamily
@@ -102,7 +113,7 @@ func isVllmUpgradeCandidate(currentVersion, targetVersion, currentImage string)
if !isVllmUpgradeVersionAllowed(currentVersion, targetVersion, currentImage) {
return false
}
if common.CompareVersion(targetVersion, currentVersion) {
if common.CompareVersion(trimVllmVersionFamily(targetVersion), trimVllmVersionFamily(currentVersion)) {
return true
}
return !hasVllmVersionFamilyPrefix(currentVersion) &&
+10 -6
View File
@@ -1071,8 +1071,8 @@ const message = {
deploy: 'Deploy',
approxWeightSize: 'Approx. {0} GB',
services: 'Model services',
addInstance: 'Add instance',
addService: 'Add model service',
addEngine: 'Add inference engine',
onlineModel: 'Online models',
instanceDeployment: 'Deploy by instance',
engines: 'Local inference engines',
@@ -1084,18 +1084,21 @@ const message = {
files: 'Model preparation',
connectExternal: 'Connect external service',
recipes: 'vLLM Recipes',
recipeConfig: 'Recipe configuration',
selectRecipe: 'Select Recipe',
createRecipe: 'Create Recipe',
recipeHelper:
'Recipe = model + hardware + launch arguments. Import from {link} or create from a downloaded model.',
recipeFormHelper: 'Paste a command from {link}, or fill in the fields manually.',
'A Recipe describes how to launch a model on specific hardware, including the model, hardware, and launch arguments. Commands can be imported from {link}.',
recipeFormHelper:
'Go to {link}, select the model provider, then select the target model. Configure the hardware, quantization variant, deployment strategy, and other options to generate the final launch command.',
recipeArguments: 'Launch arguments',
recipeImportCommand: 'Import command',
recipeImportPlaceholder: 'Paste Docker, pip/uv or vllm serve commands to fill in the Recipe automatically',
recipeImportPlaceholder:
'Paste a pip/uv or Docker launch command here. 1Panel will automatically parse it and fill in the Recipe.',
recipeVariablesNotSupported:
'Variable references are not supported in commands. Use explicit values; configure environment variables in the environment field.',
recipeImportError:
'Unable to convert. Include a Docker or vllm serve launch command with a model; paste pip/uv installation commands together with the launch command.',
deploymentTemplates: 'vLLM startup command templates',
engineProvider: 'Engine / Provider',
endpoint: 'Endpoint',
cloudAccount: 'Cloud account',
@@ -1121,13 +1124,14 @@ const message = {
vllmDeployProfile: 'Deployment model',
vllmProfileFlash0731: 'DeepSeek V4 Flash 0731',
vllmProfileVisionExp: 'DeepSeek V4 Flash Vision Exp',
ascendVisibleDevices: 'Ascend visible devices (ASCEND_RT_VISIBLE_DEVICES)',
syncModelAccount: 'Sync to model service',
modelAccountAddressHelper:
'Container address is for agent containers; 127.0.0.1, system IP, or custom address is for AI Gateway or external services.',
containerAddress: 'Container address',
customAddress: 'Custom address',
downloader: 'Downloads',
modelDirectoryHelper:
'The model list defaults to the model directory configured in Model Preparation > Settings and shows models downloaded to that directory.',
modelDirectoryPlaceholder: 'Search models or enter a full path',
selectModelDirectory: 'Select directory',
modelDir: 'Model directory',
+9 -6
View File
@@ -1073,8 +1073,8 @@ const message = {
deploy: 'Desplegar',
approxWeightSize: 'Aprox. {0} GB',
services: 'Servicios de modelos',
addInstance: 'Añadir instancia',
addService: 'Añadir servicio de modelo',
addEngine: 'Añadir motor de inferencia',
onlineModel: 'Modelos en línea',
instanceDeployment: 'Despliegue por instancia',
engines: 'Motores de inferencia locales',
@@ -1086,19 +1086,21 @@ const message = {
files: 'Preparación de modelos',
connectExternal: 'Conectar servicio externo',
recipes: 'vLLM Recipes',
recipeConfig: 'Configuración de Recipe',
selectRecipe: 'Seleccionar Recipe',
createRecipe: 'Crear Recipe',
recipeHelper:
'Recipe = modelo + hardware + argumentos de inicio. Importe desde {link} o cree una a partir de un modelo descargado.',
recipeFormHelper: 'Pegue un comando de {link} o complete los campos manualmente.',
'Una Recipe describe cómo iniciar un modelo en un hardware específico e incluye el modelo, el hardware y los argumentos de inicio. Permite importar comandos desde {link}.',
recipeFormHelper:
'Vaya a {link}, seleccione el proveedor del modelo y luego el modelo de destino. Configure el hardware, la variante de cuantización, la estrategia de despliegue y otras opciones para generar el comando de inicio final.',
recipeArguments: 'Argumentos de inicio',
recipeImportCommand: 'Importar comando',
recipeImportPlaceholder:
'Pegue comandos Docker, pip/uv o vllm serve para completar la Recipe automáticamente',
'Pegue aquí un comando de inicio en formato pip/uv o Docker. 1Panel lo analizará y completará la Recipe automáticamente.',
recipeVariablesNotSupported:
'No se admiten referencias a variables en los comandos. Use valores concretos; configure las variables de entorno en su campo correspondiente.',
recipeImportError:
'No se puede convertir. Incluya un comando de inicio Docker o vllm serve con un modelo; pegue los comandos de instalación pip/uv junto con el comando de inicio.',
deploymentTemplates: 'Plantillas de comandos de inicio de vLLM',
engineProvider: 'Motor / Proveedor',
endpoint: 'Punto de conexión',
cloudAccount: 'Cuenta en la nube',
@@ -1125,13 +1127,14 @@ const message = {
vllmDeployProfile: 'Modelo de despliegue',
vllmProfileFlash0731: 'DeepSeek V4 Flash 0731',
vllmProfileVisionExp: 'DeepSeek V4 Flash Vision Exp',
ascendVisibleDevices: 'Dispositivos Ascend visibles (ASCEND_RT_VISIBLE_DEVICES)',
syncModelAccount: 'Sincronizar con servicio de modelo',
modelAccountAddressHelper:
'La dirección del contenedor es para contenedores de agentes; 127.0.0.1, IP del sistema o dirección personalizada es para AI Gateway o servicios externos.',
containerAddress: 'Dirección del contenedor',
customAddress: 'Dirección personalizada',
downloader: 'Gestión de descargas',
modelDirectoryHelper:
'La lista muestra de forma predeterminada los modelos descargados en el directorio configurado en Preparación de modelos > Configuración.',
modelDirectoryPlaceholder: 'Buscar modelos o introducir una ruta completa',
selectModelDirectory: 'Seleccionar directorio',
modelDir: 'Directorio del modelo',
+9 -6
View File
@@ -1054,8 +1054,8 @@ const message = {
deploy: 'استقرار',
approxWeightSize: 'حدود {0} گیگابایت',
services: 'سرویس‌های مدل',
addInstance: 'افزودن نمونه',
addService: 'افزودن سرویس مدل',
addEngine: 'افزودن موتور استنتاج',
onlineModel: 'مدل‌های آنلاین',
instanceDeployment: 'استقرار بر اساس نمونه',
engines: 'موتورهای استنتاج محلی',
@@ -1067,19 +1067,21 @@ const message = {
files: 'آماده‌سازی مدل',
connectExternal: 'اتصال به سرویس خارجی',
recipes: 'vLLM Recipes',
recipeConfig: 'پیکربندی Recipe',
selectRecipe: 'انتخاب Recipe',
createRecipe: 'ایجاد Recipe',
recipeHelper:
'Recipe = مدل + سخت‌افزار + آرگومان‌های راه‌اندازی. از {link} وارد کنید یا از مدل دانلودشده بسازید.',
recipeFormHelper: 'فرمان را از {link} جای‌گذاری کنید یا فیلدها را دستی پر کنید.',
'Recipe نحوه اجرای مدل روی سخت‌افزار مشخص را توصیف می‌کند و شامل مدل، سخت‌افزار و آرگومان‌های اجرا است؛ وارد کردن فرمان از {link} پشتیبانی می‌شود.',
recipeFormHelper:
'به {link} بروید، ابتدا ارائه‌دهنده مدل و سپس مدل موردنظر را انتخاب کنید. سخت‌افزار، نسخه کوانتیزه‌سازی، راهبرد استقرار و سایر گزینه‌ها را تنظیم کنید تا فرمان نهایی اجرا تولید شود.',
recipeArguments: 'آرگومان‌های راه‌اندازی',
recipeImportCommand: 'وارد کردن فرمان',
recipeImportPlaceholder:
'فرمان‌های Docker، pip/uv یا vllm serve را برای تکمیل خودکار Recipe جای‌گذاری کنید',
'فرمان اجرا را با قالب pip/uv یا Docker اینجا جای‌گذاری کنید تا 1Panel آن را به‌طور خودکار تحلیل و Recipe را تکمیل کند.',
recipeVariablesNotSupported:
'ارجاع به متغیرها در دستور پشتیبانی نمی‌شود. مقادیر مشخص وارد کنید؛ متغیرهای محیطی را در بخش مربوط به آن‌ها تنظیم کنید.',
recipeImportError:
'تبدیل ممکن نیست. فرمان راه‌اندازی Docker یا vllm serve همراه با مدل را وارد کنید؛ فرمان‌های نصب pip/uv را همراه با فرمان راه‌اندازی جای‌گذاری کنید.',
deploymentTemplates: 'الگوهای فرمان راه‌اندازی vLLM',
engineProvider: 'موتور / ارائه‌دهنده',
endpoint: 'نقطه پایانی',
cloudAccount: 'حساب ابری',
@@ -1105,13 +1107,14 @@ const message = {
vllmDeployProfile: 'مدل استقرار',
vllmProfileFlash0731: 'DeepSeek V4 Flash 0731',
vllmProfileVisionExp: 'DeepSeek V4 Flash Vision Exp',
ascendVisibleDevices: 'دستگاه‌های قابل مشاهده Ascend (ASCEND_RT_VISIBLE_DEVICES)',
syncModelAccount: 'همگام‌سازی با سرویس مدل',
modelAccountAddressHelper:
'آدرس کانتینر برای کانتینرهای عامل است؛ 127.0.0.1، IP سیستم یا آدرس سفارشی برای دروازه AI یا خدمات خارجی است.',
containerAddress: 'آدرس کانتینر',
customAddress: 'آدرس سفارشی',
downloader: 'مدیریت دانلودها',
modelDirectoryHelper:
'فهرست مدل‌ها به‌طور پیش‌فرض مدل‌های دانلودشده در پوشه تنظیم‌شده در «آماده‌سازی مدل > تنظیمات» را نمایش می‌دهد.',
modelDirectoryPlaceholder: 'جستجوی مدل یا وارد کردن مسیر کامل',
selectModelDirectory: 'انتخاب پوشه',
modelDir: 'دایرکتوری مدل',
+10 -6
View File
@@ -1058,8 +1058,8 @@ const message = {
deploy: 'デプロイ',
approxWeightSize: '約 {0} GB',
services: 'モデルサービス',
addInstance: 'インスタンスを追加',
addService: 'モデルサービスを追加',
addEngine: '推論エンジンを追加',
onlineModel: 'オンラインモデル',
instanceDeployment: 'インスタンス単位でデプロイ',
engines: 'ローカル推論エンジン',
@@ -1071,18 +1071,21 @@ const message = {
files: 'モデル準備',
connectExternal: '外部サービスに接続',
recipes: 'vLLM Recipes',
recipeConfig: 'Recipe 設定',
selectRecipe: 'Recipe を選択',
createRecipe: 'Recipe を作成',
recipeHelper:
'Recipe = モデル + ハードウェア + 起動引数。{link} からインポートするか、ダウンロード済みモデルから作成できます。',
recipeFormHelper: '{link} のコマンドを貼り付けるか、手動で入力してください。',
'Recipe は、指定したハードウェアでモデルを起動する方法を記述し、モデル、ハードウェア、起動引数を含みます。{link} からコマンドをインポートできます。',
recipeFormHelper:
'{link} にアクセスし、モデルの提供元を選択してから、対象のモデルを選択します。 ハードウェア、量子化バージョン、デプロイ戦略などを設定すると、最終的な起動コマンドが生成されます。',
recipeArguments: '起動引数',
recipeImportCommand: 'コマンドをインポート',
recipeImportPlaceholder: 'Docker、pip/uv、または vllm serve コマンドを貼り付けて Recipe に自動入力',
recipeImportPlaceholder:
'ここに pip/uv または Docker 形式の起動コマンドを貼り付けると、1Panel が自動的に解析し、Recipe に入力します。',
recipeVariablesNotSupported:
'コマンド内の変数参照はサポートされていません。具体的な値を入力し、環境変数は環境変数欄で設定してください。',
recipeImportError:
'変換できません。モデルを含む Docker または vllm serve の起動コマンドを入力してください。pip/uv のインストールコマンドは起動コマンドと一緒に貼り付けてください。',
deploymentTemplates: 'vLLM 起動コマンドテンプレート',
engineProvider: 'エンジン / プロバイダー',
endpoint: 'エンドポイント',
cloudAccount: 'クラウドアカウント',
@@ -1109,13 +1112,14 @@ const message = {
vllmDeployProfile: 'デプロイモデル',
vllmProfileFlash0731: 'DeepSeek V4 Flash 0731',
vllmProfileVisionExp: 'DeepSeek V4 Flash Vision Exp',
ascendVisibleDevices: 'Ascend 可視デバイス(ASCEND_RT_VISIBLE_DEVICES)',
syncModelAccount: 'モデルサービスに同期',
modelAccountAddressHelper:
'コンテナアドレスはエージェントコンテナ向けです。127.0.0.1、システム IP、カスタムアドレスは AI Gateway または外部サービス向けです。',
containerAddress: 'コンテナアドレス',
customAddress: 'カスタムアドレス',
downloader: 'ダウンロード管理',
modelDirectoryHelper:
'モデル一覧には、デフォルトで「モデル準備 > 設定」で指定したモデルディレクトリにダウンロード済みのモデルが表示されます。',
modelDirectoryPlaceholder: 'モデルを検索するかフルパスを入力',
selectModelDirectory: 'ディレクトリを選択',
modelDir: 'モデルディレクトリ',
+10 -6
View File
@@ -1048,8 +1048,8 @@ const message = {
deploy: '배포',
approxWeightSize: '약 {0} GB',
services: '모델 서비스',
addInstance: '인스턴스 추가',
addService: '모델 서비스 추가',
addEngine: '추론 엔진 추가',
onlineModel: '온라인 모델',
instanceDeployment: '인스턴스별 배포',
engines: '로컬 추론 엔진',
@@ -1061,18 +1061,21 @@ const message = {
files: '모델 준비',
connectExternal: '외부 서비스 연결',
recipes: 'vLLM Recipes',
recipeConfig: 'Recipe 설정',
selectRecipe: 'Recipe 선택',
createRecipe: 'Recipe 만들기',
recipeHelper:
'Recipe = 모델 + 하드웨어 + 시작 인수. {link}에서 가져오거나 다운로드한 모델로 만들 수 있습니다.',
recipeFormHelper: '{link}의 명령을 붙여넣거나 직접 입력하세요.',
'Recipe는 특정 하드웨어에서 모델을 실행하는 방법을 설명하며 모델, 하드웨어 및 실행 인수를 포함합니다. {link}에서 명령을 가져올 수 있습니다.',
recipeFormHelper:
'{link}에서 모델 제공업체를 먼저 선택한 다음 대상 모델을 선택하세요. 하드웨어, 양자화 버전, 배포 전략 등을 설정하면 최종 실행 명령이 생성됩니다.',
recipeArguments: '시작 인수',
recipeImportCommand: '명령 가져오기',
recipeImportPlaceholder: 'Docker, pip/uv 또는 vllm serve 명령을 붙여넣어 Recipe 자동 입력',
recipeImportPlaceholder:
'여기에 pip/uv 또는 Docker 형식의 실행 명령을 붙여넣으면 1Panel이 자동으로 분석하여 Recipe를 채웁니다.',
recipeVariablesNotSupported:
'명령에서 변수 참조는 지원되지 않습니다. 구체적인 값을 입력하고 환경 변수는 환경 변수 필드에서 설정하세요.',
recipeImportError:
'변환할 수 없습니다. 모델이 포함된 Docker 또는 vllm serve 시작 명령을 입력하세요. pip/uv 설치 명령은 시작 명령과 함께 붙여넣으세요.',
deploymentTemplates: 'vLLM 시작 명령 템플릿',
engineProvider: '엔진 / 공급자',
endpoint: '엔드포인트',
cloudAccount: '클라우드 계정',
@@ -1098,13 +1101,14 @@ const message = {
vllmDeployProfile: '배포 모델',
vllmProfileFlash0731: 'DeepSeek V4 Flash 0731',
vllmProfileVisionExp: 'DeepSeek V4 Flash Vision Exp',
ascendVisibleDevices: 'Ascend 표시 장치 (ASCEND_RT_VISIBLE_DEVICES)',
syncModelAccount: '모델 서비스에 동기화',
modelAccountAddressHelper:
'컨테이너 주소는 에이전트 컨테이너 호출에 적합합니다. 127.0.0.1, 시스템 IP 또는 사용자 지정 주소는 AI Gateway 또는 외부 서비스 호출에 적합합니다.',
containerAddress: '컨테이너 주소',
customAddress: '사용자 지정 주소',
downloader: '다운로드 관리',
modelDirectoryHelper:
'모델 목록은 기본적으로 “모델 준비 > 설정”에서 구성한 모델 디렉터리에 다운로드된 모델을 표시합니다.',
modelDirectoryPlaceholder: '모델 검색 또는 전체 경로 입력',
selectModelDirectory: '디렉터리 선택',
modelDir: '모델 디렉토리',
+10 -6
View File
@@ -1045,8 +1045,8 @@ const message = {
deploy: 'ນຳໃຊ້',
approxWeightSize: 'ປະມານ {0} GB',
services: 'ບໍລິການໂມເດວ',
addInstance: 'ເພີ່ມອິນສະແຕນ',
addService: 'ເພີ່ມບໍລິການໂມເດວ',
addEngine: 'ເພີ່ມເຄື່ອງຈັກອະນຸມານ',
onlineModel: 'ໂມເດວອອນລາຍ',
instanceDeployment: 'ນຳໃຊ້ຕາມອິນສະແຕນ',
engines: 'ເຄື່ອງຈັກອະນຸມານພາຍໃນ',
@@ -1058,18 +1058,21 @@ const message = {
files: 'ການກະກຽມໂມເດວ',
connectExternal: 'ເຊື່ອມຕໍ່ບໍລິການພາຍນອກ',
recipes: 'vLLM Recipes',
recipeConfig: 'ການຕັ້ງຄ່າ Recipe',
selectRecipe: 'ເລືອກ Recipe',
createRecipe: 'ສ້າງ Recipe',
recipeHelper:
'Recipe = ໂມເດວ + ຮາດແວ + ພາລາມິເຕີເລີ່ມຕົ້ນ. ນຳເຂົ້າຈາກ {link} ຫຼືສ້າງຈາກໂມເດວທີ່ດາວໂຫຼດແລ້ວ.',
recipeFormHelper: 'ວາງຄຳສັ່ງຈາກ {link} ຫຼືປ້ອນຂໍ້ມູນເອງ.',
'Recipe ອະທິບາຍວິທີເລີ່ມຕົ້ນໂມເດວເທິງຮາດແວທີ່ກຳນົດ ໂດຍປະກອບມີໂມເດວ, ຮາດແວ ແລະພາລາມິເຕີເລີ່ມຕົ້ນ; ຮອງຮັບການນຳເຂົ້າຄຳສັ່ງຈາກ {link}.',
recipeFormHelper:
'ໄປທີ່ {link}, ເລືອກຜູ້ໃຫ້ບໍລິການໂມເດວກ່ອນ ແລ້ວເລືອກໂມເດວທີ່ຕ້ອງການ. ກຳນົດຮາດແວ, ຮຸ່ນການຫຼຸດຄວາມລະອຽດ, ກົນລະຍຸດການນຳໃຊ້ ແລະຕົວເລືອກອື່ນໆ ເພື່ອສ້າງຄຳສັ່ງເລີ່ມຕົ້ນສຸດທ້າຍ.',
recipeArguments: 'ພາລາມິເຕີເລີ່ມຕົ້ນ',
recipeImportCommand: 'ນຳເຂົ້າຄຳສັ່ງ',
recipeImportPlaceholder: 'ວາງຄຳສັ່ງ Docker, pip/uv ຫຼື vllm serve ເພື່ອຕື່ມ Recipe ອັດຕະໂນມັດ',
recipeImportPlaceholder:
'ວາງຄຳສັ່ງເລີ່ມຕົ້ນໃນຮູບແບບ pip/uv ຫຼື Docker ທີ່ນີ້. 1Panel ຈະວິເຄາະແລະຕື່ມ Recipe ອັດຕະໂນມັດ.',
recipeVariablesNotSupported:
'ຄຳສັ່ງບໍ່ຮອງຮັບການອ້າງອີງຕົວແປ. ກະລຸນາປ້ອນຄ່າໂດຍກົງ ແລະຕັ້ງຄ່າຕົວແປສະພາບແວດລ້ອມໃນຊ່ອງທີ່ກ່ຽວຂ້ອງ.',
recipeImportError:
'ບໍ່ສາມາດແປງໄດ້. ກະລຸນາໃສ່ຄຳສັ່ງເລີ່ມຕົ້ນ Docker ຫຼື vllm serve ທີ່ມີໂມເດວ; ວາງຄຳສັ່ງຕິດຕັ້ງ pip/uv ພ້ອມກັບຄຳສັ່ງເລີ່ມຕົ້ນ.',
deploymentTemplates: 'ແມ່ແບບຄຳສັ່ງເລີ່ມຕົ້ນ vLLM',
engineProvider: 'ເຄື່ອງຈັກ / ຜູ້ໃຫ້ບໍລິການ',
endpoint: 'ຈຸດເຊື່ອມຕໍ່',
cloudAccount: 'ບັນຊີຄລາວ',
@@ -1095,13 +1098,14 @@ const message = {
vllmDeployProfile: 'ໂມເດວສຳລັບຕິດຕັ້ງ',
vllmProfileFlash0731: 'DeepSeek V4 Flash 0731',
vllmProfileVisionExp: 'DeepSeek V4 Flash Vision Exp',
ascendVisibleDevices: 'ອຸປະກອນ Ascend ທີ່ເຫັນໄດ້ (ASCEND_RT_VISIBLE_DEVICES)',
syncModelAccount: 'ຊິ້ງຄ໌ໄປຍັງບໍລິການໂມເດວ',
modelAccountAddressHelper:
'ທີ່ຢູ່ຄອນເທນເນີແມ່ນສຳລັບຄອນເທນເນີຕົວແທນ; 127.0.0.1, IP ລະບົບ, ຫຼື ທີ່ຢູ່ກຳນົດເອງແມ່ນສຳລັບ AI Gateway ຫຼື ບໍລິການພາຍນອກ.',
containerAddress: 'ທີ່ຢູ່ຄອນເທນເນີ',
customAddress: 'ທີ່ຢູ່ກຳນົດເອງ',
downloader: 'ຈັດການການດາວໂຫຼດ',
modelDirectoryHelper:
'ໂດຍຄ່າເລີ່ມຕົ້ນ ລາຍຊື່ໂມເດວຈະສະແດງໂມເດວທີ່ດາວໂຫຼດໄວ້ໃນໄດເຣັກທໍຣີທີ່ກຳນົດໃນ “ການກະກຽມໂມເດວ > ການຕັ້ງຄ່າ”.',
modelDirectoryPlaceholder: 'ຄົ້ນຫາໂມເດວ ຫຼື ປ້ອນເສັ້ນທາງເຕັມ',
selectModelDirectory: 'ເລືອກໄດເຣັກທໍຣີ',
modelDir: 'ໄດເຣັກທໍຣີໂມເດວ',
+9 -6
View File
@@ -1081,8 +1081,8 @@ const message = {
deploy: 'Kerahkan',
approxWeightSize: 'Kira-kira {0} GB',
services: 'Perkhidmatan model',
addInstance: 'Tambah instans',
addService: 'Tambah perkhidmatan model',
addEngine: 'Tambah enjin inferens',
onlineModel: 'Model dalam talian',
instanceDeployment: 'Pengerahan mengikut instans',
engines: 'Enjin inferens setempat',
@@ -1094,19 +1094,21 @@ const message = {
files: 'Penyediaan model',
connectExternal: 'Sambungkan perkhidmatan luaran',
recipes: 'vLLM Recipes',
recipeConfig: 'Konfigurasi Recipe',
selectRecipe: 'Pilih Recipe',
createRecipe: 'Cipta Recipe',
recipeHelper:
'Recipe = model + perkakasan + argumen pelancaran. Import daripada {link} atau cipta daripada model yang dimuat turun.',
recipeFormHelper: 'Tampal arahan daripada {link} atau isi medan secara manual.',
'Recipe menerangkan cara melancarkan model pada perkakasan tertentu, termasuk model, perkakasan dan argumen pelancaran. Arahan boleh diimport daripada {link}.',
recipeFormHelper:
'Pergi ke {link}, pilih penyedia model, kemudian pilih model sasaran. Konfigurasikan perkakasan, varian pengkuantuman, strategi penggunaan dan pilihan lain untuk menjana arahan pelancaran akhir.',
recipeArguments: 'Argumen pelancaran',
recipeImportCommand: 'Import arahan',
recipeImportPlaceholder:
'Tampal arahan Docker, pip/uv atau vllm serve untuk mengisi Recipe secara automatik',
'Tampal arahan pelancaran dalam format pip/uv atau Docker di sini. 1Panel akan menghuraikan dan mengisi Recipe secara automatik.',
recipeVariablesNotSupported:
'Rujukan pemboleh ubah tidak disokong dalam arahan. Masukkan nilai khusus; tetapkan pemboleh ubah persekitaran dalam medan yang berkenaan.',
recipeImportError:
'Tidak dapat menukar. Sertakan arahan pelancaran Docker atau vllm serve dengan model; tampal arahan pemasangan pip/uv bersama arahan pelancaran.',
deploymentTemplates: 'Templat arahan permulaan vLLM',
engineProvider: 'Enjin / Pembekal',
endpoint: 'Titik akhir',
cloudAccount: 'Akaun awan',
@@ -1132,13 +1134,14 @@ const message = {
vllmDeployProfile: 'Model penggunaan',
vllmProfileFlash0731: 'DeepSeek V4 Flash 0731',
vllmProfileVisionExp: 'DeepSeek V4 Flash Vision Exp',
ascendVisibleDevices: 'Peranti Ascend boleh dilihat (ASCEND_RT_VISIBLE_DEVICES)',
syncModelAccount: 'Segerakkan ke perkhidmatan model',
modelAccountAddressHelper:
'Alamat kontena sesuai untuk kontena agen; 127.0.0.1, IP sistem, atau alamat tersuai sesuai untuk AI Gateway atau perkhidmatan luaran.',
containerAddress: 'Alamat kontena',
customAddress: 'Alamat tersuai',
downloader: 'Pengurusan muat turun',
modelDirectoryHelper:
'Secara lalai, senarai model memaparkan model yang dimuat turun dalam direktori yang dikonfigurasi di Persediaan Model > Tetapan.',
modelDirectoryPlaceholder: 'Cari model atau masukkan laluan penuh',
selectModelDirectory: 'Pilih direktori',
modelDir: 'Direktori Model',
+9 -6
View File
@@ -1077,8 +1077,8 @@ const message = {
deploy: 'Implantar',
approxWeightSize: 'Aprox. {0} GB',
services: 'Serviços de modelos',
addInstance: 'Adicionar instância',
addService: 'Adicionar serviço de modelo',
addEngine: 'Adicionar mecanismo de inferência',
onlineModel: 'Modelos online',
instanceDeployment: 'Implantação por instância',
engines: 'Mecanismos de inferência locais',
@@ -1090,19 +1090,21 @@ const message = {
files: 'Preparação de modelos',
connectExternal: 'Conectar serviço externo',
recipes: 'vLLM Recipes',
recipeConfig: 'Configuração de Recipe',
selectRecipe: 'Selecionar Recipe',
createRecipe: 'Criar Recipe',
recipeHelper:
'Recipe = modelo + hardware + argumentos de inicialização. Importe de {link} ou crie a partir de um modelo baixado.',
recipeFormHelper: 'Cole um comando de {link} ou preencha os campos manualmente.',
'Uma Recipe descreve como iniciar um modelo em um hardware específico, incluindo o modelo, o hardware e os argumentos de inicialização. É possível importar comandos de {link}.',
recipeFormHelper:
'Acesse {link}, selecione o provedor do modelo e depois o modelo desejado. Configure o hardware, a variante de quantização, a estratégia de implantação e outras opções para gerar o comando final de inicialização.',
recipeArguments: 'Argumentos de inicialização',
recipeImportCommand: 'Importar comando',
recipeImportPlaceholder:
'Cole comandos Docker, pip/uv ou vllm serve para preencher a Recipe automaticamente',
'Cole um comando de inicialização no formato pip/uv ou Docker aqui. O 1Panel irá analisar e preencher a Recipe automaticamente.',
recipeVariablesNotSupported:
'Referências a variáveis não são aceitas nos comandos. Use valores explícitos; configure as variáveis de ambiente no campo correspondente.',
recipeImportError:
'Não foi possível converter. Inclua um comando de inicialização Docker ou vllm serve com um modelo; cole os comandos de instalação pip/uv junto com o comando de inicialização.',
deploymentTemplates: 'Modelos de comandos de inicialização do vLLM',
engineProvider: 'Mecanismo / Provedor',
endpoint: 'Endpoint',
cloudAccount: 'Conta na nuvem',
@@ -1128,13 +1130,14 @@ const message = {
vllmDeployProfile: 'Modelo de implantação',
vllmProfileFlash0731: 'DeepSeek V4 Flash 0731',
vllmProfileVisionExp: 'DeepSeek V4 Flash Vision Exp',
ascendVisibleDevices: 'Dispositivos Ascend visíveis (ASCEND_RT_VISIBLE_DEVICES)',
syncModelAccount: 'Sincronizar com serviço de modelo',
modelAccountAddressHelper:
'Use o endereço do contêiner para agentes; 127.0.0.1, IP do sistema ou endereço personalizado para AI Gateway ou serviços externos.',
containerAddress: 'Endereço do contêiner',
customAddress: 'Endereço personalizado',
downloader: 'Gerenciamento de downloads',
modelDirectoryHelper:
'Por padrão, a lista exibe os modelos baixados no diretório configurado em Preparação de modelos > Configurações.',
modelDirectoryPlaceholder: 'Buscar modelos ou inserir um caminho completo',
selectModelDirectory: 'Selecionar diretório',
modelDir: 'Diretório do modelo',
+9 -6
View File
@@ -1070,8 +1070,8 @@ const message = {
deploy: 'Развернуть',
approxWeightSize: 'Около {0} ГБ',
services: 'Сервисы моделей',
addInstance: 'Добавить экземпляр',
addService: 'Добавить сервис модели',
addEngine: 'Добавить движок инференса',
onlineModel: 'Онлайн-модели',
instanceDeployment: 'Развертывание по экземплярам',
engines: 'Локальные движки инференса',
@@ -1083,19 +1083,21 @@ const message = {
files: 'Подготовка моделей',
connectExternal: 'Подключить внешний сервис',
recipes: 'vLLM Recipes',
recipeConfig: 'Настройка Recipe',
selectRecipe: 'Выбрать Recipe',
createRecipe: 'Создать Recipe',
recipeHelper:
'Recipe = модель + оборудование + параметры запуска. Импортируйте с {link} или создайте из загруженной модели.',
recipeFormHelper: 'Вставьте команду с {link} или заполните поля вручную.',
'Recipe описывает способ запуска модели на определённом оборудовании и включает модель, оборудование и параметры запуска. Поддерживается импорт команд с {link}.',
recipeFormHelper:
'Перейдите на {link}, выберите поставщика модели, затем нужную модель. Укажите оборудование, вариант квантования, стратегию развёртывания и другие параметры, чтобы получить итоговую команду запуска.',
recipeArguments: 'Параметры запуска',
recipeImportCommand: 'Импорт команды',
recipeImportPlaceholder:
'Вставьте команды Docker, pip/uv или vllm serve для автоматического заполнения Recipe',
'Вставьте сюда команду запуска в формате pip/uv или Docker. 1Panel автоматически разберёт её и заполнит Recipe.',
recipeVariablesNotSupported:
'Ссылки на переменные в командах не поддерживаются. Укажите конкретные значения; переменные окружения настройте в соответствующем поле.',
recipeImportError:
'Не удалось преобразовать. Добавьте команду запуска Docker или vllm serve с моделью; вставляйте команды установки pip/uv вместе с командой запуска.',
deploymentTemplates: 'Шаблоны команд запуска vLLM',
engineProvider: 'Движок / Поставщик',
endpoint: 'Конечная точка',
cloudAccount: 'Облачная учетная запись',
@@ -1122,13 +1124,14 @@ const message = {
vllmDeployProfile: 'Модель развертывания',
vllmProfileFlash0731: 'DeepSeek V4 Flash 0731',
vllmProfileVisionExp: 'DeepSeek V4 Flash Vision Exp',
ascendVisibleDevices: 'Видимые устройства Ascend (ASCEND_RT_VISIBLE_DEVICES)',
syncModelAccount: 'Синхронизировать с сервисом модели',
modelAccountAddressHelper:
'Адрес контейнера подходит для контейнеров агентов; 127.0.0.1, системный IP или пользовательский адрес подходит для AI Gateway или внешних сервисов.',
containerAddress: 'Адрес контейнера',
customAddress: 'Пользовательский адрес',
downloader: 'Управление загрузками',
modelDirectoryHelper:
'По умолчанию список показывает модели, загруженные в каталог, указанный в разделе «Подготовка моделей > Настройки».',
modelDirectoryPlaceholder: 'Найти модель или ввести полный путь',
selectModelDirectory: 'Выбрать каталог',
modelDir: 'Каталог модели',
+9 -6
View File
@@ -1079,8 +1079,8 @@ const message = {
deploy: 'Dağıt',
approxWeightSize: 'Yaklaşık {0} GB',
services: 'Model hizmetleri',
addInstance: 'Örnek ekle',
addService: 'Model hizmeti ekle',
addEngine: 'Çıkarım motoru ekle',
onlineModel: 'Çevrimiçi modeller',
instanceDeployment: 'Örnek bazında dağıtım',
engines: 'Yerel çıkarım motorları',
@@ -1092,19 +1092,21 @@ const message = {
files: 'Model hazırlığı',
connectExternal: 'Harici hizmete bağlan',
recipes: 'vLLM Recipes',
recipeConfig: 'Recipe yapılandırması',
selectRecipe: 'Recipe seç',
createRecipe: 'Recipe oluştur',
recipeHelper:
'Recipe = model + donanım + başlatma parametreleri. {link} üzerinden içe aktarın veya indirilen bir modelden oluşturun.',
recipeFormHelper: '{link} üzerinden bir komut yapıştırın veya alanları elle doldurun.',
'Recipe, bir modelin belirli bir donanımda nasıl başlatılacağını açıklar; model, donanım ve başlatma parametrelerini içerir. {link} üzerinden komut içe aktarılabilir.',
recipeFormHelper:
'{link} adresine gidin, önce model sağlayıcısını, ardından hedef modeli seçin. Son başlatma komutunu oluşturmak için donanımı, kuantizasyon sürümünü, dağıtım stratejisini ve diğer seçenekleri yapılandırın.',
recipeArguments: 'Başlatma parametreleri',
recipeImportCommand: 'Komut içe aktar',
recipeImportPlaceholder:
'Recipe alanlarını otomatik doldurmak için Docker, pip/uv veya vllm serve komutlarını yapıştırın',
'pip/uv veya Docker biçimindeki başlatma komutunu buraya yapıştırın. 1Panel komutu otomatik olarak ayrıştırıp Recipe alanlarını doldurur.',
recipeVariablesNotSupported:
'Komutlarda değişken başvuruları desteklenmez. Açık değerler girin; ortam değişkenlerini ilgili alanda yapılandırın.',
recipeImportError:
'Dönüştürülemedi. Model içeren bir Docker veya vllm serve başlatma komutu ekleyin; pip/uv kurulum komutlarını başlatma komutuyla birlikte yapıştırın.',
deploymentTemplates: 'vLLM başlatma komutu şablonları',
engineProvider: 'Motor / Sağlayıcı',
endpoint: 'Uç nokta',
cloudAccount: 'Bulut hesabı',
@@ -1130,13 +1132,14 @@ const message = {
vllmDeployProfile: 'Dağıtım modeli',
vllmProfileFlash0731: 'DeepSeek V4 Flash 0731',
vllmProfileVisionExp: 'DeepSeek V4 Flash Vision Exp',
ascendVisibleDevices: 'Görünür Ascend cihazları (ASCEND_RT_VISIBLE_DEVICES)',
syncModelAccount: 'Model hizmetine senkronize et',
modelAccountAddressHelper:
'Konteyner adresi ajan konteynerleri içindir; 127.0.0.1, sistem IP veya özel adres AI Gateway ya da harici servisler içindir.',
containerAddress: 'Konteyner adresi',
customAddress: 'Özel adres',
downloader: 'İndirme yönetimi',
modelDirectoryHelper:
'Model listesi varsayılan olarak Model Hazırlığı > Ayarlar bölümünde yapılandırılan dizine indirilen modelleri gösterir.',
modelDirectoryPlaceholder: 'Model arayın veya tam yol girin',
selectModelDirectory: 'Dizin seç',
modelDir: 'Model dizini',
+9 -6
View File
@@ -1009,8 +1009,8 @@ const message = {
deploy: '部署',
approxWeightSize: '約 {0} GB',
services: '模型服務',
addInstance: '新增實例',
addService: '新增模型服務',
addEngine: '新增推理引擎',
onlineModel: '線上模型',
instanceDeployment: '按執行個體部署',
engines: '本機推理引擎',
@@ -1022,16 +1022,19 @@ const message = {
files: '模型準備',
connectExternal: '接入外部服務',
recipes: 'vLLM Recipes',
recipeConfig: 'Recipe 配置',
selectRecipe: '選擇 Recipe',
createRecipe: '建立 Recipe',
recipeHelper: 'Recipe = 模型 + 硬體 + 啟動參數。支援從 {link} 匯入或從已下載模型建立。',
recipeFormHelper: '從 {link} 複製命令匯入,或手動填寫。',
recipeHelper:
'Recipe 用於描述模型在指定硬體上的啟動方式,包含模型、硬體和啟動參數;支援從 {link} 匯入命令。',
recipeFormHelper:
'前往 {link},依序選擇模型提供商和目標模型,再根據硬體、量化版本及部署策略等選項產生啟動命令。',
recipeArguments: '啟動參數',
recipeImportCommand: '匯入命令',
recipeImportPlaceholder: '貼上 Docker、pip/uv 或 vllm serve 命令,自動填入 Recipe',
recipeImportPlaceholder: '貼上 pip/uv 或 Docker 格式的啟動命令,1Panel 將自動解析並填入 Recipe。',
recipeVariablesNotSupported: '命令中不支援變數引用,請填寫具體值;環境變數請在環境變數欄設定。',
recipeImportError:
'無法轉換,請提供包含模型的 Docker 或 vllm serve 啟動命令;pip/uv 安裝命令需要與啟動命令一起貼上。',
deploymentTemplates: 'vLLM 啟動命令範本',
engineProvider: '引擎 / 供應商',
endpoint: '端點',
cloudAccount: '雲端帳號',
@@ -1057,13 +1060,13 @@ const message = {
vllmDeployProfile: '部署模型',
vllmProfileFlash0731: 'DeepSeek V4 Flash 0731',
vllmProfileVisionExp: 'DeepSeek V4 Flash Vision Exp',
ascendVisibleDevices: 'Ascend 可見裝置(ASCEND_RT_VISIBLE_DEVICES)',
syncModelAccount: '同步到模型服務',
modelAccountAddressHelper:
'容器地址適合智能體容器呼叫;127.0.0.1、本機 IP 或自訂地址適合 AI 閘道或外部服務呼叫。',
containerAddress: '容器地址',
customAddress: '自訂地址',
downloader: '下載管理',
modelDirectoryHelper: '模型列表預設來自「模型準備 > 設定」中配置的模型目錄,顯示該目錄下已下載的模型。',
modelDirectoryPlaceholder: '搜尋模型或輸入完整路徑',
selectModelDirectory: '選擇目錄',
modelDir: '模型目錄',
+9 -6
View File
@@ -1022,8 +1022,8 @@ const message = {
deploy: '部署',
approxWeightSize: '约 {0} GB',
services: '模型服务',
addInstance: '新增实例',
addService: '添加模型服务',
addEngine: '添加推理引擎',
onlineModel: '在线模型',
instanceDeployment: '按实例部署',
engines: '本地推理引擎',
@@ -1035,16 +1035,19 @@ const message = {
files: '模型准备',
connectExternal: '接入外部服务',
recipes: 'vLLM Recipes',
recipeConfig: 'Recipe 配置',
selectRecipe: '选择 Recipe',
createRecipe: '创建 Recipe',
recipeHelper: 'Recipe = 模型 + 硬件 + 启动参数。支持从 {link} 导入或从已下载模型创建。',
recipeFormHelper: '从 {link} 复制命令导入,或手动填写。',
recipeHelper:
'Recipe 用于描述模型在指定硬件上的启动方式,包含模型、硬件和启动参数;支持从 {link} 导入命令。',
recipeFormHelper:
'前往 {link},依次选择模型提供商和目标模型,再根据硬件、量化版本及部署策略等选项生成启动命令。',
recipeArguments: '启动参数',
recipeImportCommand: '导入命令',
recipeImportPlaceholder: '粘贴 Docker、pip/uv 或 vllm serve 命令,自动填充 Recipe',
recipeImportPlaceholder: '粘贴 pip/uv 或 Docker 格式的启动命令,1Panel 将自动解析并填充 Recipe。',
recipeVariablesNotSupported: '命令中不支持变量引用,请填写具体值;环境变量请在环境变量栏配置。',
recipeImportError:
'无法转换,请提供包含模型的 Docker 或 vllm serve 启动命令;pip/uv 安装命令需要与启动命令一起粘贴。',
deploymentTemplates: 'vLLM 启动命令模板',
engineProvider: '引擎 / 供应商',
endpoint: '端点',
cloudAccount: '云端账号',
@@ -1070,13 +1073,13 @@ const message = {
vllmDeployProfile: '部署模型',
vllmProfileFlash0731: 'DeepSeek V4 Flash 0731',
vllmProfileVisionExp: 'DeepSeek V4 Flash Vision Exp',
ascendVisibleDevices: 'Ascend 可见设备(ASCEND_RT_VISIBLE_DEVICES)',
syncModelAccount: '同步到模型服务',
modelAccountAddressHelper:
'容器地址适合智能体容器调用;127.0.0.1、本机 IP 或自定义地址适合 AI 网关或外部服务调用。',
containerAddress: '容器地址',
customAddress: '自定义地址',
downloader: '下载管理',
modelDirectoryHelper: '模型列表默认来自“模型准备 > 设置”中配置的模型目录,展示该目录下已下载的模型。',
modelDirectoryPlaceholder: '搜索模型或输入完整路径',
selectModelDirectory: '选择目录',
modelDir: '模型目录',
@@ -1,7 +1,7 @@
<template>
<DialogPro
<DrawerPro
v-model="drawerVisible"
:title="$t(engine === 'vllm' ? 'aiTools.model.serviceDetails' : 'database.databaseConnInfo')"
:header="$t(engine === 'vllm' ? 'aiTools.model.serviceDetails' : 'database.databaseConnInfo')"
:size="isMobile ? 'full' : 'normal'"
@close="handleClose"
>
@@ -67,32 +67,24 @@
</div>
<p class="detail-help">{{ $t('database.remoteConnHelper2') }}</p>
</section>
<el-button v-if="engine === 'ollama'" @click="openWebUI">OpenWebUI</el-button>
</div>
<template #footer>
<el-button @click="handleClose">
{{ $t('commons.button.close') }}
</el-button>
</template>
</DialogPro>
<PortJumpDialog ref="portRef" />
</DrawerPro>
</template>
<script lang="ts" setup>
import { computed, reactive, ref } from 'vue';
import { Connection, FolderOpened, Link } from '@element-plus/icons-vue';
import i18n from '@/lang';
import { ElMessageBox } from 'element-plus';
import { getAppPort } from '@/api/modules/app';
import { useRouter } from 'vue-router';
import PortJumpDialog from '@/components/port-jump/index.vue';
import { getAgentSettingInfo } from '@/api/modules/setting';
import { getBindDomain } from '@/api/modules/ai';
import { useGlobalStore } from '@/composables/useGlobalStore';
const { currentNode, isMobile } = useGlobalStore();
const emit = defineEmits(['close']);
const router = useRouter();
const portRef = ref();
const engine = ref<'ollama' | 'vllm'>('ollama');
const drawerVisible = ref(false);
@@ -141,22 +133,6 @@ const acceptParams = (param: DialogProps): void => {
drawerVisible.value = true;
};
const openWebUI = async () => {
const node = currentNode.value;
const { data } = await getAppPort('ollama-webui', '');
if (node !== currentNode.value || !drawerVisible.value) return;
if (data) {
portRef.value.acceptParams({ port: data });
return;
}
await ElMessageBox.confirm(i18n.global.t('app.checkInstalledWarn', ['OpenWebUI']), 'OpenWebUI', {
confirmButtonText: i18n.global.t('database.goInstall'),
cancelButtonText: i18n.global.t('commons.button.cancel'),
});
if (node !== currentNode.value || !drawerVisible.value) return;
await router.push({ name: 'AppAll', query: { install: 'ollama-webui' } });
};
const handleClose = () => {
drawerVisible.value = false;
emit('close');
@@ -1,7 +1,7 @@
<template>
<DrawerPro
v-model="visible"
:header="$t(enginesOnly ? 'commons.button.add' : 'aiTools.model.addService')"
:header="$t(enginesOnly ? 'aiTools.model.addInstance' : 'aiTools.model.addService')"
:size="isMobile ? 'full' : '50%'"
>
<DockerStatus
@@ -53,7 +53,7 @@ const form = reactive({
hostPort: 0,
containerPort: '',
hostMode: false,
modelAccountBaseURLType: 'container' as AI.ModelAccountSync['modelAccountBaseURLType'],
modelAccountBaseURLType: 'systemIP' as AI.ModelAccountSync['modelAccountBaseURLType'],
modelAccountBaseURL: '',
});
let request = 0;
@@ -90,7 +90,7 @@ const open = async (row: Deployment) => {
modelAccountBaseURLType:
hostMode && item.modelAccountBaseURLType === 'container'
? 'systemIP'
: item.modelAccountBaseURLType || (hostMode ? 'systemIP' : 'container'),
: item.modelAccountBaseURLType || 'systemIP',
modelAccountBaseURL: item.modelAccountBaseURL || '',
});
} finally {
+8 -2
View File
@@ -6,7 +6,7 @@
<LayoutContent v-loading="loading">
<template #leftToolBar>
<el-button v-permission type="primary" @click="createRef.open()">
{{ $t(isLocal ? 'commons.button.add' : 'aiTools.model.addService') }}
{{ $t(isLocal ? 'aiTools.model.addInstance' : 'aiTools.model.addService') }}
</el-button>
</template>
<template #rightToolBar>
@@ -162,7 +162,13 @@
width="220"
/>
</ComplexTable>
<ComplexTable v-else :data="deployments" :pagination-config="pagination" @search="search">
<ComplexTable
v-else
:data="deployments"
:pagination-config="pagination"
:row-style="{ height: '63px' }"
@search="search"
>
<el-table-column :label="$t('commons.table.name')" min-width="190">
<template #default="{ row }">
<el-button link type="primary" @click="manageRef.open(row, 'connection', true)">
+20 -65
View File
@@ -38,10 +38,7 @@
<div class="gpu-grid">
<article v-for="device in visibleDevices" :key="device.key" class="gpu-card">
<div class="device-header">
<div class="device-identity">
<span class="device-id">{{ device.id }}</span>
<h3 :title="device.name">{{ device.name }}</h3>
</div>
<h3 class="device-id">{{ device.id }}</h3>
<el-popover :width="360" trigger="click" popper-class="dashboard-gpu-popover">
<el-descriptions :title="device.name" :column="1" size="small">
<el-descriptions-item
@@ -62,14 +59,14 @@
</el-button>
</div>
<div class="device-metrics">
<div class="device-metric metric-utilization">
<div class="device-metric">
<div class="metric-heading">
<span class="metric-label">
{{ device.type === 'NPU' ? $t('aiTools.gpu.aiCore') : $t('aiTools.gpu.gpuUtil') }}
</span>
<strong>{{ device.utilization === null ? '—' : `${device.utilization}%` }}</strong>
</div>
<el-progress :percentage="device.utilization ?? 0" :show-text="false" :stroke-width="5" />
<el-progress :percentage="device.utilization ?? 0" :show-text="false" :stroke-width="3" />
</div>
<div class="device-metric">
<div class="metric-heading">
@@ -87,7 +84,7 @@
<el-progress
:percentage="device.memoryPercent ?? 0"
:show-text="false"
:stroke-width="5"
:stroke-width="3"
color="var(--el-color-primary)"
/>
</div>
@@ -280,6 +277,9 @@ const usedMemory = computed(() =>
gap: 4px 16px;
font-size: 14px;
}
.device-counts > strong {
font-weight: 500;
}
.summary-memory {
display: flex;
align-items: baseline;
@@ -289,7 +289,8 @@ const usedMemory = computed(() =>
}
.summary-memory > strong {
font-size: 13px;
font-weight: 600;
font-weight: 400;
color: var(--el-text-color-regular);
}
.gpu-grid {
display: grid;
@@ -310,26 +311,14 @@ const usedMemory = computed(() =>
gap: 12px;
margin-bottom: 10px;
}
.device-identity {
flex: 1;
min-width: 0;
}
.device-id {
display: block;
margin-bottom: 2px;
font-size: 12px;
color: var(--el-text-color-secondary);
}
.device-header h3 {
flex: 1;
min-width: 0;
margin: 0;
font-size: 14px;
line-height: 20px;
font-weight: 600;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-weight: 500;
color: var(--el-text-color-regular);
}
.device-header .el-button {
flex-shrink: 0;
@@ -352,14 +341,12 @@ const usedMemory = computed(() =>
margin-bottom: 6px;
}
.metric-heading strong {
font-size: 15px;
line-height: 24px;
font-weight: 600;
font-size: 14px;
line-height: 20px;
font-weight: 400;
color: var(--el-text-color-regular);
font-variant-numeric: tabular-nums;
}
.metric-utilization strong {
font-size: 22px;
}
.metric-total {
font-size: 12px;
font-weight: 400;
@@ -382,7 +369,8 @@ const usedMemory = computed(() =>
}
.device-footer strong {
font-size: 12px;
font-weight: 500;
font-weight: 400;
color: var(--el-text-color-secondary);
}
.gpu-status-single {
.gpu-grid {
@@ -392,9 +380,8 @@ const usedMemory = computed(() =>
.gpu-card {
display: grid;
grid-template-columns: minmax(0, 2.4fr) minmax(0, 1.35fr);
gap: 24px;
min-height: 174px;
padding: 18px 20px;
gap: 16px;
padding: 12px 16px;
}
.device-header {
@@ -402,30 +389,11 @@ const usedMemory = computed(() =>
margin-bottom: 0;
}
.device-identity {
display: flex;
align-items: center;
gap: 12px;
}
.device-id {
flex-shrink: 0;
margin-bottom: 0;
padding: 4px 7px;
border-radius: 4px;
background: var(--el-fill-color-light);
}
.device-metrics {
grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr);
gap: 24px;
}
.metric-heading strong {
font-size: 23px;
line-height: 32px;
}
.device-footer {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -446,8 +414,7 @@ const usedMemory = computed(() =>
}
.device-footer strong {
font-size: 23px;
line-height: 32px;
line-height: 20px;
font-variant-numeric: tabular-nums;
overflow-wrap: anywhere;
}
@@ -468,14 +435,6 @@ const usedMemory = computed(() =>
flex-wrap: wrap;
}
.device-identity {
flex: 0 0 100%;
}
.metric-heading strong {
font-size: 18px;
}
.device-footer {
padding-top: 12px;
border-top: 1px solid var(--el-border-color-extra-light);
@@ -485,10 +444,6 @@ const usedMemory = computed(() =>
padding-left: 0;
border-left: 0;
}
.device-footer strong {
font-size: 18px;
}
}
}
</style>