From 47cae0134cfc2c433c7bf7df41080e5b250dc20e Mon Sep 17 00:00:00 2001 From: jialin Date: Tue, 25 Nov 2025 15:58:50 +0800 Subject: [PATCH] feat: display deprecated backend versions group --- src/locales/en-US/models.ts | 3 +- src/locales/ja-JP/models.ts | 6 +- src/locales/ru-RU/models.ts | 178 ++++++++++++------ src/locales/zh-CN/models.ts | 3 +- .../components/support-gpus.tsx | 1 + .../llmodels/components/search-model.tsx | 9 +- src/pages/llmodels/config/types.ts | 7 +- src/pages/llmodels/forms/backend.tsx | 137 ++++++++++---- .../llmodels/hooks/use-query-backends.ts | 3 +- 9 files changed, 244 insertions(+), 103 deletions(-) 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$/, '') })) };