diff --git a/src/locales/en-US/models.ts b/src/locales/en-US/models.ts
index f20c069c..fdfbd0b8 100644
--- a/src/locales/en-US/models.ts
+++ b/src/locales/en-US/models.ts
@@ -260,5 +260,6 @@ export default {
'models.form.generic_proxy.button': 'Generic Proxy',
'models.accessControlModal.includeusers': 'Include Users',
'models.table.genericProxy':
- 'Use the following path prefix, and set the model name in either the X-GPUStack-Model request header or the model field in the request body. All requests under this path prefix will be forwarded to the inference backend.'
+ 'Use the following path prefix, and set the model name in either the X-GPUStack-Model request header or the model field in the request body. All requests under this path prefix will be forwarded to the inference backend.',
+ 'models.form.backendVersion.deprecated': 'Deprecated'
};
diff --git a/src/locales/ja-JP/models.ts b/src/locales/ja-JP/models.ts
index 3d1a8436..740676d7 100644
--- a/src/locales/ja-JP/models.ts
+++ b/src/locales/ja-JP/models.ts
@@ -260,7 +260,8 @@ export default {
'models.form.generic_proxy.button': 'Generic Proxy',
'models.accessControlModal.includeusers': 'Include Users',
'models.table.genericProxy':
- 'Use the following path prefix, and set the model name in either the X-GPUStack-Model request header or the model field in the request body. All requests under this path prefix will be forwarded to the inference backend.'
+ 'Use the following path prefix, and set the model name in either the X-GPUStack-Model request header or the model field in the request body. All requests under this path prefix will be forwarded to the inference backend.',
+ 'models.form.backendVersion.deprecated': 'Deprecated'
};
// ========== To-Do: Translate Keys (Remove After Translation) ==========
@@ -347,5 +348,6 @@ export default {
// 64. 'models.table.userSelection.tips': 'Admin users can access all models by default.',
// 65. 'models.form.partialoffload.tips': `When CPU offloading is enabled, GPUStack will allocate CPU memory if GPU resources are insufficient. You must correctly configure the inference backend to use hybrid CPU+GPU or full CPU inference.`,
// 66. 'models.form.backend.warning': 'The selected backend does not support GGUF models. Please add a backend with GGUF support in the Inference Backend.',
-// 67. 'models.form.backend.warning.gguf': 'Please ensure that the selected custom backend supports GGUF models.',
+// 67. 'models.form.backend.warning.gguf': 'Please ensure that the selected custom backend supports GGUF models.',,
+// 68. 'models.form.backendVersion.deprecated': 'Deprecated'
// ========== End of To-Do List ==========
diff --git a/src/locales/ru-RU/models.ts b/src/locales/ru-RU/models.ts
index 365c7d0c..ed09f113 100644
--- a/src/locales/ru-RU/models.ts
+++ b/src/locales/ru-RU/models.ts
@@ -13,8 +13,10 @@ export default {
'models.form.env': 'Переменные окружения',
'models.form.configurations': 'Конфигурации',
'models.form.s3address': 'S3-адрес',
- 'models.form.partialoffload.tips': 'При включении CPU оффлоудинга GPUStack будет выделять оперативную память, если ресурсов GPU недостаточно. Вы должны правильно настроить бэкенд вывода для использования гибридного CPU+GPU или полного CPU вывода.',
- 'models.form.distribution.tips': 'Позволяет переносить часть слоёв модели на один или несколько удалённых воркеров, когда ресурсов текущего воркера недостаточно.',
+ 'models.form.partialoffload.tips':
+ 'При включении CPU оффлоудинга GPUStack будет выделять оперативную память, если ресурсов GPU недостаточно. Вы должны правильно настроить бэкенд вывода для использования гибридного CPU+GPU или полного CPU вывода.',
+ 'models.form.distribution.tips':
+ 'Позволяет переносить часть слоёв модели на один или несколько удалённых воркеров, когда ресурсов текущего воркера недостаточно.',
'models.openinplayground': 'Открыть в Песочнице',
'models.instances': 'инстансы',
'models.table.replicas.edit': 'Редактировать реплики',
@@ -22,7 +24,8 @@ export default {
'model.form.ollamaholder': 'Выберите или введите название модели',
'model.deploy.sort': 'Сортировка',
'model.deploy.search.placeholder': 'Введите / для поиска моделей',
- 'model.form.ollamatips': 'Подсказка: ниже представлены предустановленные модели Ollama в GPUStack. Выберите нужную или введите модель для развертывания в поле 【{name}】 справа.',
+ 'model.form.ollamatips':
+ 'Подсказка: ниже представлены предустановленные модели Ollama в GPUStack. Выберите нужную или введите модель для развертывания в поле 【{name}】 справа.',
'models.sort.name': 'По имени',
'models.sort.size': 'По размеру',
'models.sort.likes': 'По лайкам',
@@ -39,15 +42,18 @@ export default {
'models.search.nofiles': 'Нет доступных файлов',
'models.search.networkerror': 'Ошибка сетевого подключения!',
'models.search.hfvisit': 'Убедитесь, что доступен',
- 'models.search.unsupport': 'Модель не поддерживается и может быть нефункциональна после развертывания.',
+ 'models.search.unsupport':
+ 'Модель не поддерживается и может быть нефункциональна после развертывания.',
'models.form.scheduletype': 'Тип планирования',
'models.form.categories': 'Категория модели',
'models.form.scheduletype.auto': 'Авто',
'models.form.scheduletype.manual': 'Ручной',
'models.form.scheduletype.gpu': 'Указать GPU',
'models.form.scheduletype.gpuType': 'Указать тип GPU',
- 'models.form.scheduletype.auto.tips': 'Автоматическое развертывание инстансов модели на подходящие GPU в зависимости от текущих ресурсов.',
- 'models.form.scheduletype.manual.tips': 'Позволяет вручную указать GPU для развертывания инстансов модели.',
+ 'models.form.scheduletype.auto.tips':
+ 'Автоматическое развертывание инстансов модели на подходящие GPU в зависимости от текущих ресурсов.',
+ 'models.form.scheduletype.manual.tips':
+ 'Позволяет вручную указать GPU для развертывания инстансов модели.',
'models.form.manual.schedule': 'Ручное распределение',
'models.table.gpuindex': 'Индекс GPU',
'models.table.backend': 'Бэкенды',
@@ -56,14 +62,22 @@ export default {
'models.table.layers': 'Слои',
'models.form.backend': 'Бэкенд',
'models.form.backend_parameters': 'Параметры бэкенда',
- 'models.search.gguf.tips': 'GGUF-модели используют llama-box (поддерживает Linux, macOS и Windows).',
- 'models.search.vllm.tips': 'Не-GGUF модели используют vox-box для аудио и vLLM (только x86 Linux) для остальных.',
- 'models.search.voxbox.tips': 'Для развертывания аудиомодели снимите отметку GGUF.',
- 'models.form.ollamalink': 'Больше моделей в библиотеке Ollama',
- 'models.form.backend_parameters.llamabox.placeholder': 'например: --ctx-size=8192(параметр и значение разделены знаком =)',
- 'models.form.backend_parameters.vllm.placeholder': 'например: --max-model-len=8192(параметр и значение разделены знаком =)',
- 'models.form.backend_parameters.sglang.placeholder': 'например: --context-length=8192(параметр и значение разделены знаком =)',
- 'models.form.backend_parameters.vllm.tips': 'Для получения подробной информации о параметрах {backend} см. здесь.',
+ 'models.search.gguf.tips':
+ 'GGUF-модели используют llama-box (поддерживает Linux, macOS и Windows).',
+ 'models.search.vllm.tips':
+ 'Не-GGUF модели используют vox-box для аудио и vLLM (только x86 Linux) для остальных.',
+ 'models.search.voxbox.tips':
+ 'Для развертывания аудиомодели снимите отметку GGUF.',
+ 'models.form.ollamalink':
+ 'Больше моделей в библиотеке Ollama',
+ 'models.form.backend_parameters.llamabox.placeholder':
+ 'например: --ctx-size=8192(параметр и значение разделены знаком =)',
+ 'models.form.backend_parameters.vllm.placeholder':
+ 'например: --max-model-len=8192(параметр и значение разделены знаком =)',
+ 'models.form.backend_parameters.sglang.placeholder':
+ 'например: --context-length=8192(параметр и значение разделены знаком =)',
+ 'models.form.backend_parameters.vllm.tips':
+ 'Для получения подробной информации о параметрах {backend} см. здесь.',
'models.logs.pagination.prev': 'Предыдущие {lines} строк',
'models.logs.pagination.next': 'Следующие {lines} строк',
'models.logs.pagination.last': 'Последняя страница',
@@ -71,14 +85,19 @@ export default {
'models.form.localPath': 'Локальный путь',
'models.form.filePath': 'Путь к модели',
'models.form.backendVersion': 'Версия бэкенда',
- 'models.form.backendVersion.tips': 'Чтобы использовать желаемую версию {backend} {version}, система автоматически создаст виртуальную среду в онлайн-окружении для установки соответствующей версии. После обновления GPUStack версия бэкенда останется зафиксированной. {link}',
+ 'models.form.backendVersion.tips':
+ 'Чтобы использовать желаемую версию {backend} {version}, система автоматически создаст виртуальную среду в онлайн-окружении для установки соответствующей версии. После обновления GPUStack версия бэкенда останется зафиксированной. {link}',
'models.form.gpuselector': 'Селектор GPU',
- 'models.form.backend.llamabox': 'Для моделей формата GGUF. Поддержка Linux, macOS и Windows.',
- 'models.form.backend.vllm': 'Встроенная поддержка устройств NVIDIA, AMD, Ascend, Hygon, Iluvatar и MetaX.',
+ 'models.form.backend.llamabox':
+ 'Для моделей формата GGUF. Поддержка Linux, macOS и Windows.',
+ 'models.form.backend.vllm':
+ 'Встроенная поддержка устройств NVIDIA, AMD, Ascend, Hygon, Iluvatar и MetaX.',
'models.form.backend.voxbox': 'Поддерживает только GPU NVIDIA и CPU.',
'models.form.backend.mindie': 'Поддерживает только Ascend NPU.',
- 'models.form.backend.sglang': 'Встроенная поддержка GPU NVIDIA/AMD и Ascend NPU.',
- 'models.form.search.gguftips': 'Для воркеров на macOS/Windows отметьте GGUF (для аудиомоделей снимите).',
+ 'models.form.backend.sglang':
+ 'Встроенная поддержка GPU NVIDIA/AMD и Ascend NPU.',
+ 'models.form.search.gguftips':
+ 'Для воркеров на macOS/Windows отметьте GGUF (для аудиомоделей снимите).',
'models.form.button.addlabel': 'Добавить метку',
'models.filter.category': 'Фильтр по категориям',
'models.list.more.logs': 'Показать больше',
@@ -86,38 +105,52 @@ export default {
'models.localpath.gguf.tips.title': 'Модель формата GGUF',
'models.localpat.safe.tips.title': 'Модель формата Safetensors',
'models.localpath.shared.tips.title': 'Шардированная GGUF-модель',
- 'models.localpath.gguf.tips': 'Укажите файл модели, например: /data/models/model.gguf.',
- 'models.localpath.safe.tips': 'Укажите директорию модели с файлами .safetensors и config.json.',
- 'models.localpath.chunks.tips': 'Укажите первый шард модели, например: /data/models/model-00001-of-00004.gguf.',
- 'models.form.replicas.tips': 'Несколько реплик обеспечивают балансировку нагрузки для { api } запросов.',
+ 'models.localpath.gguf.tips':
+ 'Укажите файл модели, например: /data/models/model.gguf.',
+ 'models.localpath.safe.tips':
+ 'Укажите директорию модели с файлами .safetensors и config.json.',
+ 'models.localpath.chunks.tips':
+ 'Укажите первый шард модели, например: /data/models/model-00001-of-00004.gguf.',
+ 'models.form.replicas.tips':
+ 'Несколько реплик обеспечивают балансировку нагрузки для { api } запросов.',
'models.table.list.empty': 'Модели отсутствуют!',
- 'models.table.list.getStart': 'Начните работу с DeepSeek-R1-Distill-Qwen-1.5B',
+ 'models.table.list.getStart':
+ 'Начните работу с DeepSeek-R1-Distill-Qwen-1.5B',
'models.table.llamaAcrossworker': 'Llama-box между воркерами',
'models.table.vllmAcrossworker': 'vLLM между воркерами',
'models.form.releases': 'Релизы',
'models.form.moreparameters': 'Описание параметров',
'models.table.vram.allocated': 'Выделенная VRAM',
- 'models.form.backend.warning': 'Выбранный бэкенд не поддерживает модели GGUF. Пожалуйста, добавьте бэкенд с поддержкой GGUF в разделе Бэкенды вывода.',
- 'models.form.backend.warning.gguf': 'Пожалуйста, убедитесь, что выбранный пользовательский бэкенд поддерживает модели GGUF.',
- 'models.form.ollama.warning': 'Чтобы развернуть бэкенд для моделей Ollama с использованием llama-box , выполните следующие шаги.',
- 'models.form.backend.warning.llamabox': 'Чтобы использовать бэкенд llama-box , укажите полный путь к файлу модели (например,/data/models/model.gguf). Для шардированных моделей укажите путь к первому шарду (например,/data/models/model-00001-of-00004.gguf).',
- 'models.form.keyvalue.paste': 'Вставьте несколько строк текста, где каждая строка содержит пару ключ-значение. Ключ и значение разделяются знаком равенства (=), а разные пары — символами новой строки.',
+ 'models.form.backend.warning':
+ 'Выбранный бэкенд не поддерживает модели GGUF. Пожалуйста, добавьте бэкенд с поддержкой GGUF в разделе Бэкенды вывода.',
+ 'models.form.backend.warning.gguf':
+ 'Пожалуйста, убедитесь, что выбранный пользовательский бэкенд поддерживает модели GGUF.',
+ 'models.form.ollama.warning':
+ 'Чтобы развернуть бэкенд для моделей Ollama с использованием llama-box , выполните следующие шаги.',
+ 'models.form.backend.warning.llamabox':
+ 'Чтобы использовать бэкенд llama-box , укажите полный путь к файлу модели (например,/data/models/model.gguf). Для шардированных моделей укажите путь к первому шарду (например,/data/models/model-00001-of-00004.gguf).',
+ 'models.form.keyvalue.paste':
+ 'Вставьте несколько строк текста, где каждая строка содержит пару ключ-значение. Ключ и значение разделяются знаком равенства (=), а разные пары — символами новой строки.',
'models.form.files': 'Файлы',
'models.table.status': 'Статус',
'models.form.submit.anyway': 'Отправить в любом случае',
'models.form.evaluating': 'Анализ совместимости модели',
'models.form.incompatible': 'Обнаружена несовместимость',
'models.form.restart.onerror': 'Автоперезапуск при ошибке',
- 'models.form.restart.onerror.tips': 'При возникновении ошибки система автоматически попытается перезапуститься.',
+ 'models.form.restart.onerror.tips':
+ 'При возникновении ошибки система автоматически попытается перезапуститься.',
'models.form.check.params': 'Проверка конфигурации...',
'models.form.check.passed': 'Проверка совместимости пройдена',
- 'models.form.check.claims': 'Модель требует примерно {vram} VRAM и {ram} RAM.',
+ 'models.form.check.claims':
+ 'Модель требует примерно {vram} VRAM и {ram} RAM.',
'models.form.check.claims2': 'Модель требует примерно {vram} VRAM.',
'models.form.check.claims3': 'Модель требует примерно {ram} RAM.',
- 'models.form.update.tips': 'Изменения вступят в силу только после удаления и повторного создания инстанса.',
+ 'models.form.update.tips':
+ 'Изменения вступят в силу только после удаления и повторного создания инстанса.',
'models.table.download.progress': 'Прогресс',
'models.table.button.apiAccessInfo': 'Доступ к API',
- 'models.table.button.apiAccessInfo.tips': 'Для интеграции этой модели со сторонними приложениями используйте следующие данные: URL доступа, имя модели и ключ API. Эти учетные данные необходимы для обеспечения правильного подключения и использования сервиса модели.',
+ 'models.table.button.apiAccessInfo.tips':
+ 'Для интеграции этой модели со сторонними приложениями используйте следующие данные: URL доступа, имя модели и ключ API. Эти учетные данные необходимы для обеспечения правильного подключения и использования сервиса модели.',
'models.table.apiAccessInfo.endpoint': 'URL доступа',
'models.table.apiAccessInfo.modelName': 'Имя модели',
'models.table.apiAccessInfo.apikey': 'Ключ API',
@@ -127,24 +160,34 @@ export default {
'models.search.parts': '{n} частей',
'models.search.evaluate.error': 'Возникла ошибка при вычислении: ',
'models.ollama.deprecated.title': 'Объявление об устаревании',
- 'models.ollama.deprecated.current': 'Текущая версия (v0.6.1): Модели Ollama в настоящее время доступны для использования.',
- 'models.ollama.deprecated.upcoming': 'Предстоящая версия (v0.7.0): Источник моделей Ollama будет удалён из интерфейса.',
- 'models.ollama.deprecated.following': 'После обновления до версии (v0.7.0), все ранее развёрнутые модели продолжат работать в обычном режиме.',
- 'models.ollama.deprecated.issue': 'См. связанную проблему: #1979 on GitHub.',
- 'models.ollama.deprecated.notice': 'Источник моделей Ollama объявлен устаревшим начиная с версии v0.6.1. Подробности см. в соответствующем issue на GitHub.',
- 'models.backend.mindie.310p': 'Ascend 310P поддерживает только FP16, поэтому необходимо установить --dtype=float16.',
+ 'models.ollama.deprecated.current':
+ 'Текущая версия (v0.6.1): Модели Ollama в настоящее время доступны для использования.',
+ 'models.ollama.deprecated.upcoming':
+ 'Предстоящая версия (v0.7.0): Источник моделей Ollama будет удалён из интерфейса.',
+ 'models.ollama.deprecated.following':
+ 'После обновления до версии (v0.7.0), все ранее развёрнутые модели продолжат работать в обычном режиме.',
+ 'models.ollama.deprecated.issue':
+ 'См. связанную проблему: #1979 on GitHub.',
+ 'models.ollama.deprecated.notice':
+ 'Источник моделей Ollama объявлен устаревшим начиная с версии v0.6.1. Подробности см. в соответствующем issue на GitHub.',
+ 'models.backend.mindie.310p':
+ 'Ascend 310P поддерживает только FP16, поэтому необходимо установить --dtype=float16.',
'models.form.gpuCount': 'GPU на реплику',
'models.form.gpuType': 'Тип GPU',
'models.form.optimizeLongPrompt': 'Оптимизировать длинные промпты',
- 'models.form.enableSpeculativeDecoding': 'Включить спекулятивное декодирование',
+ 'models.form.enableSpeculativeDecoding':
+ 'Включить спекулятивное декодирование',
'models.form.check.clusterUnavailable': 'Текущий кластер недоступен',
- 'models.form.check.otherClustersAvailable': 'Доступные кластеры: {clusters}. Пожалуйста, переключитесь на другой кластер.',
+ 'models.form.check.otherClustersAvailable':
+ 'Доступные кластеры: {clusters}. Пожалуйста, переключитесь на другой кластер.',
'models.button.accessSettings': 'Настройки доступа',
'models.table.accessScope': 'Область доступа',
'models.table.accessScope.all': 'Все пользователи',
'models.table.userSelection': 'Выбор пользователей',
- 'models.button.accessSettings.tips': 'Изменения в настройках доступа вступают в силу через одну минуту.',
- 'models.table.userSelection.tips': 'Администраторы по умолчанию имеют доступ ко всем моделям.',
+ 'models.button.accessSettings.tips':
+ 'Изменения в настройках доступа вступают в силу через одну минуту.',
+ 'models.table.userSelection.tips':
+ 'Администраторы по умолчанию имеют доступ ко всем моделям.',
'models.table.filterByName': 'Фильтр по имени пользователя',
'models.table.admin': 'Администратор',
'models.table.noselected': 'Пользователи не выбраны',
@@ -157,30 +200,39 @@ export default {
'models.form.chunkSize': 'Размер чанков кэша',
'models.form.maxCPUSize': 'Максимальный размер CPU кэша (ГиБ)',
'models.form.remoteURL': 'URL удаленного хранилища',
- 'models.form.remoteURL.tips': 'Подробности см. в документации по конфигурации.',
- 'models.form.runCommandPlaceholder': 'напр., vllm serve Qwen/Qwen2.5-1.5B-Instruct',
+ 'models.form.remoteURL.tips':
+ 'Подробности см. в документации по конфигурации.',
+ 'models.form.runCommandPlaceholder':
+ 'напр., vllm serve Qwen/Qwen2.5-1.5B-Instruct',
'models.accessSettings.public': 'Публичный',
'models.accessSettings.authed': 'Аутентифицированный',
'models.accessSettings.allowedUsers': 'Разрешенные пользователи',
- 'models.accessSettings.public.tips': 'При публичном доступе любой пользователь может получить доступ к модели без аутентификации, что может привести к риску утечки данных.',
+ 'models.accessSettings.public.tips':
+ 'При публичном доступе любой пользователь может получить доступ к модели без аутентификации, что может привести к риску утечки данных.',
'models.table.button.deploy': 'Развернуть сейчас',
'models.form.backendVersion.holder': 'Введите или выберите версию',
'models.form.gpusperreplica': 'GPU на реплику',
'models.form.gpusAllocationType': 'Тип распределения GPU',
'models.form.gpusAllocationType.auto': 'Авто',
'models.form.gpusAllocationType.custom': 'Вручную',
- 'models.form.gpusAllocationType.auto.tips': 'Система автоматически вычисляет количество GPU на реплику, по умолчанию используя степени двойки и ограничиваясь выбранными GPU.',
- 'models.form.gpusAllocationType.custom.tips': 'Вы можете указать точное количество GPU на реплику.',
+ 'models.form.gpusAllocationType.auto.tips':
+ 'Система автоматически вычисляет количество GPU на реплику, по умолчанию используя степени двойки и ограничиваясь выбранными GPU.',
+ 'models.form.gpusAllocationType.custom.tips':
+ 'Вы можете указать точное количество GPU на реплику.',
'models.mymodels.status.inactive': 'Остановлен',
'models.mymodels.status.degrade': 'Аномальный',
'models.mymodels.status.active': 'Активен',
- 'models.form.kvCache.tips': 'Расширенный KV-кэш и спекулятивное декодирование доступны только со встроенными бэкендами (vLLM / SGLang). Переключите бэкенд в Расширенных настройках, чтобы включить их.',
- 'models.form.kvCache.tips2': 'Поддерживается только при использовании встроенных бэкендов вывода (vLLM или SGLang).',
+ 'models.form.kvCache.tips':
+ 'Расширенный KV-кэш и спекулятивное декодирование доступны только со встроенными бэкендами (vLLM / SGLang). Переключите бэкенд в Расширенных настройках, чтобы включить их.',
+ 'models.form.kvCache.tips2':
+ 'Поддерживается только при использовании встроенных бэкендов вывода (vLLM или SGLang).',
'models.form.scheduling': 'Планирование',
'models.form.ramRatio': 'Соотношение ОЗУ к VRAM',
'models.form.ramSize': 'Максимальный размер ОЗУ (ГиБ)',
- 'models.form.ramRatio.tips': 'Соотношение системной оперативной памяти к видеопамяти GPU, используемое для KV-кэша. Например, 2.0 означает, что кэш в ОЗУ может быть в два раза больше, чем в видеопамяти GPU.',
- 'models.form.ramSize.tips': 'Максимальный размер KV-кэша, хранящегося в системной памяти (ГиБ). Если задано, это значение переопределяет "{content}".',
+ 'models.form.ramRatio.tips':
+ 'Соотношение системной оперативной памяти к видеопамяти GPU, используемое для KV-кэша. Например, 2.0 означает, что кэш в ОЗУ может быть в два раза больше, чем в видеопамяти GPU.',
+ 'models.form.ramSize.tips':
+ 'Максимальный размер KV-кэша, хранящегося в системной памяти (ГиБ). Если задано, это значение переопределяет "{content}".',
'models.form.chunkSize.tips': 'Количество токенов на чанк KV-кэша.',
'models.form.mode': 'Режим',
'models.form.algorithm': 'Алгоритм',
@@ -191,20 +243,28 @@ export default {
'models.form.mode.throughput': 'Пропускная способность',
'models.form.mode.latency': 'Задержка',
'models.form.mode.baseline': 'Стандартный',
- 'models.form.mode.throughput.tips': 'оптимизировано для высокой пропускной способности при высокой конкурентности запросов.',
- 'models.form.mode.latency.tips': 'оптимизировано для низкой задержки при низкой конкурентности запросов.',
- 'models.form.mode.baseline.tips': 'наиболее совместимый вариант с полной точностью.',
+ 'models.form.mode.throughput.tips':
+ 'оптимизировано для высокой пропускной способности при высокой конкурентности запросов.',
+ 'models.form.mode.latency.tips':
+ 'оптимизировано для низкой задержки при низкой конкурентности запросов.',
+ 'models.form.mode.baseline.tips':
+ 'наиболее совместимый вариант с полной точностью.',
'models.form.draftModel.placeholder': 'Выберите или введите черновую модель',
- 'models.form.draftModel.tips': 'Вы можете ввести локальный путь (например, /path/to/model) или выбрать модель из Hugging Face или ModelScope (например, Tengyunw/qwen3_8b_eagle3). Система автоматически сопоставит модель на основе источника основной модели.',
+ 'models.form.draftModel.tips':
+ 'Вы можете ввести локальный путь (например, /path/to/model) или выбрать модель из Hugging Face или ModelScope (например, Tengyunw/qwen3_8b_eagle3). Система автоматически сопоставит модель на основе источника основной модели.',
'models.form.quantization': 'Квантование',
'models.form.backend.custom': 'Пользовательский',
- 'models.form.rules.name': 'До 63 символов; только буквы, цифры, точки (.), подчёркивания (_) и дефисы (-); должно начинаться и заканчиваться буквенно-цифровым символом.',
+ 'models.form.rules.name':
+ 'До 63 символов; только буквы, цифры, точки (.), подчёркивания (_) и дефисы (-); должно начинаться и заканчиваться буквенно-цифровым символом.',
'models.catalog.button.explore': 'Исследовать больше моделей',
'models.catalog.precision': 'Точность',
'models.form.gpuPerReplica.tips': 'Введите произвольное число',
'models.form.generic_proxy': 'Включить универсальный прокси',
- 'models.form.generic_proxy.tips': 'После включения универсального прокси вы можете получать доступ к URI-путям, которые не следуют стандарту OpenAI API.',
+ 'models.form.generic_proxy.tips':
+ 'После включения универсального прокси вы можете получать доступ к URI-путям, которые не следуют стандарту OpenAI API.',
'models.form.generic_proxy.button': 'Универсальный прокси',
'models.accessControlModal.includeusers': 'Включить пользователей',
- 'models.table.genericProxy': 'Используйте следующий префикс пути и укажите имя модели либо в заголовке запроса X-GPUStack-Model, либо в поле model в теле запроса. Все запросы с этим префиксом пути будут перенаправлены в бэкенд вывода.'
+ 'models.table.genericProxy':
+ 'Используйте следующий префикс пути и укажите имя модели либо в заголовке запроса X-GPUStack-Model, либо в поле model в теле запроса. Все запросы с этим префиксом пути будут перенаправлены в бэкенд вывода.',
+ 'models.form.backendVersion.deprecated': 'Устаревший'
};
diff --git a/src/locales/zh-CN/models.ts b/src/locales/zh-CN/models.ts
index 51069d44..b95db55c 100644
--- a/src/locales/zh-CN/models.ts
+++ b/src/locales/zh-CN/models.ts
@@ -247,5 +247,6 @@ export default {
'models.form.generic_proxy.button': '通用代理',
'models.accessControlModal.includeusers': '显示用户',
'models.table.genericProxy':
- '使用以下路径前缀,并在请求头 X-GPUStack-Model 或请求体中的 model 字段设置模型名称后访问该模型。该路径的所有子路径请求会被转发到推理后端。'
+ '使用以下路径前缀,并在请求头 X-GPUStack-Model 或请求体中的 model 字段设置模型名称后访问该模型。该路径的所有子路径请求会被转发到推理后端。',
+ 'models.form.backendVersion.deprecated': '已弃用'
};
diff --git a/src/pages/cluster-management/components/support-gpus.tsx b/src/pages/cluster-management/components/support-gpus.tsx
index a88be623..ca177d3d 100644
--- a/src/pages/cluster-management/components/support-gpus.tsx
+++ b/src/pages/cluster-management/components/support-gpus.tsx
@@ -131,6 +131,7 @@ const SupportedHardware: React.FC = ({
value: GPUDriverMap.METAX,
key: GPUDriverMap.METAX,
locale: false,
+ link: 'https://docs.gpustack.ai/latest/installation/metax/installation/?h=meta#prerequisites',
notes: AddWorkerDockerNotes[GPUDriverMap.METAX],
icon:
}
diff --git a/src/pages/llmodels/components/search-model.tsx b/src/pages/llmodels/components/search-model.tsx
index 96da2c8e..ebb8f45d 100644
--- a/src/pages/llmodels/components/search-model.tsx
+++ b/src/pages/llmodels/components/search-model.tsx
@@ -580,7 +580,14 @@ const SearchModel: React.FC = (props) => {
return (
{renderHFSearch()}
-
+
{
const intl = useIntl();
const { getRuleMessage } = useAppUtils();
const form = Form.useFormInstance();
const { onValuesChange, backendOptions, onBackendChange } = useFormContext();
const backend = Form.useWatch('backend', form);
+ const [showDeprecated, setShowDeprecated] = React.useState(false);
const handleBackendVersionOnChange = (value: any) => {
onValuesChange?.({}, form.getFieldsValue());
@@ -45,9 +60,17 @@ const BackendFields: React.FC = () => {
return options;
}, [backendOptions, intl]);
- const backendVersions = useMemo(() => {
+ const backendVersions = useMemo((): {
+ builtIn: any[];
+ custom: any[];
+ deprecated: any[];
+ } => {
if (!backend || backend === backendOptionsMap.custom) {
- return [];
+ return {
+ builtIn: [],
+ custom: [],
+ deprecated: []
+ };
}
// find the backend item from backendOptions
@@ -57,54 +80,85 @@ const BackendFields: React.FC = () => {
// if it's a custom backend,
if (backendItem && !backendItem.isBuiltIn) {
- return versions;
+ return {
+ builtIn: [],
+ custom: versions.filter((item) => !item.is_deprecated),
+ deprecated: versions.filter((item) => item.is_deprecated)
+ };
}
// check the value if endts with '-custom', if true, remove the suffix add to "Cutom" group, if not , add to "Built-in" group
+
+ // ============ Built-in Versions ============
const builtInVersions = versions.filter(
- (item) => !item.value?.endsWith('-custom')
- );
- const customVersions = versions.filter((item) =>
- item.value?.endsWith('-custom')
+ (item) => !item.value?.endsWith('-custom') && !item.is_deprecated
);
- const options = [];
+ // ============ Custom Versions ============
+ const customVersions = versions.filter(
+ (item) => item.value?.endsWith('-custom') && !item.is_deprecated
+ );
- if (builtInVersions.length > 0) {
- options.push({
- label: intl.formatMessage({ id: 'backend.builtin' }),
- options: builtInVersions
- });
- }
+ // ============ Deprecated Versions ============
+ const deprecatedVersions = versions.filter((item) => item.is_deprecated);
- if (customVersions.length > 0) {
- options.push({
- label: intl.formatMessage({ id: 'models.form.backend.custom' }),
- options: customVersions
- });
- }
-
- return options;
+ return {
+ builtIn: builtInVersions,
+ custom: customVersions,
+ deprecated: deprecatedVersions
+ };
}, [backend, backendOptions, intl]);
const optionRender = (option: any) => {
return option.data.title;
};
- const versionOptionRender = (option: any) => {
- const { data } = option;
- return data.is_deprecated ? (
-
- {data.title}
- [Deprecated]
-
- ) : (
- {data.title}
+ const labelRender = (option: any) => {
+ return option.title;
+ };
+
+ const renderVersionOptions = (values: any[], label: string) => {
+ if (!values || values.length === 0) {
+ return null;
+ }
+ return (
+
+ {values.map((item) => (
+
+ {item.label}
+
+ ))}
+
);
};
- const labelRender = (option: any) => {
- return option.title;
+ const renderDeprecatedVersionOptions = (values: any[]) => {
+ if (!values || values.length === 0) {
+ return null;
+ }
+ return (
+ setShowDeprecated(!showDeprecated)}>
+ {intl.formatMessage({
+ id: 'models.form.backendVersion.deprecated'
+ })}
+
+
+ }
+ >
+ {showDeprecated &&
+ values.map((item) => (
+
+ {item.label}
+
+ ))}
+
+ );
};
return (
@@ -132,15 +186,24 @@ const BackendFields: React.FC = () => {
+ >
+ {renderVersionOptions(
+ backendVersions.builtIn,
+ intl.formatMessage({ id: 'backend.builtin' })
+ )}
+ {renderVersionOptions(
+ backendVersions.custom,
+ intl.formatMessage({ id: 'models.form.backend.custom' })
+ )}
+ {renderDeprecatedVersionOptions(backendVersions.deprecated)}
+
)}
>
diff --git a/src/pages/llmodels/hooks/use-query-backends.ts b/src/pages/llmodels/hooks/use-query-backends.ts
index 3673dc00..e0726f0f 100644
--- a/src/pages/llmodels/hooks/use-query-backends.ts
+++ b/src/pages/llmodels/hooks/use-query-backends.ts
@@ -26,9 +26,10 @@ export default function useQueryBackends() {
default_backend_param: item.default_backend_param || [],
default_version: item.default_version,
isBuiltIn: item.is_built_in,
- versions: (item.versions || []).map((vItem) => ({
+ versions: (item.versions || []).map((vItem, index) => ({
label: vItem.version,
value: vItem.version,
+ is_deprecated: vItem.is_deprecated,
title: vItem.version.replace(/-custom$/, '')
}))
};