mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2026-11-04 08:05:20 +00:00
feat(ai): refine model deployment UI and support GB10 upgrades (#14295)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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) &&
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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: 'دایرکتوری مدل',
|
||||
|
||||
@@ -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: 'モデルディレクトリ',
|
||||
|
||||
@@ -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: '모델 디렉토리',
|
||||
|
||||
@@ -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: 'ໄດເຣັກທໍຣີໂມເດວ',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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: 'Каталог модели',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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: '模型目錄',
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)">
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user