feat: display deprecated backend versions group

This commit is contained in:
jialin
2025-11-25 16:04:27 +08:00
parent 33defab7df
commit 47cae0134c
9 changed files with 244 additions and 103 deletions
+2 -1
View File
@@ -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 <span class="bold-text">X-GPUStack-Model</span> 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 <span class="bold-text">X-GPUStack-Model</span> 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'
};
+4 -2
View File
@@ -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 <span class="bold-text">X-GPUStack-Model</span> 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 <span class="bold-text">X-GPUStack-Model</span> 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 ==========
+119 -59
View File
@@ -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': 'Введите <kbd>/</kbd> для поиска моделей',
'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': 'Больше моделей в библиотеке <a href="https://www.ollama.com/library" target="_blank">Ollama</a>',
'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} см. <a href={link} target="_blank">здесь</a>.',
'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':
'Больше моделей в библиотеке <a href="https://www.ollama.com/library" target="_blank">Ollama</a>',
'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} см. <a href={link} target="_blank">здесь</a>.',
'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': '<span style="margin-right: 5px;font-size: 13px;">Начните работу с</span> <span style="font-size: 14px;font-weight: 700">DeepSeek-R1-Distill-Qwen-1.5B</span>',
'models.table.list.getStart':
'<span style="margin-right: 5px;font-size: 13px;">Начните работу с</span> <span style="font-size: 14px;font-weight: 700">DeepSeek-R1-Distill-Qwen-1.5B</span>',
'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 , укажите полный путь к файлу модели (например,<span style="font-weight: 700">/data/models/model.gguf</span>). Для шардированных моделей укажите путь к первому шарду (например,<span style="font-weight: 700">/data/models/model-00001-of-00004.gguf</span>).',
'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 , укажите полный путь к файлу модели (например,<span style="font-weight: 700">/data/models/model.gguf</span>). Для шардированных моделей укажите путь к первому шарду (например,<span style="font-weight: 700">/data/models/model-00001-of-00004.gguf</span>).',
'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': '<span class="bold-text">Текущая версия (v0.6.1): </span>Модели Ollama в настоящее время доступны для использования.',
'models.ollama.deprecated.upcoming': '<span class="bold-text">Предстоящая версия (v0.7.0): </span>Источник моделей Ollama будет удалён из интерфейса.',
'models.ollama.deprecated.following': '<span class="bold-text">После обновления до версии (v0.7.0),</span> все ранее развёрнутые модели продолжат работать в обычном режиме.',
'models.ollama.deprecated.issue': 'См. связанную проблему: <a href="https://github.com/gpustack/gpustack/issues/1979" target="_blank">#1979 on GitHub</a>.',
'models.ollama.deprecated.notice': 'Источник моделей Ollama объявлен устаревшим начиная с версии v0.6.1. Подробности см. в <a href="https://github.com/gpustack/gpustack/issues/1979" target="_blank">соответствующем issue на GitHub</a>.',
'models.backend.mindie.310p': 'Ascend 310P поддерживает только FP16, поэтому необходимо установить --dtype=float16.',
'models.ollama.deprecated.current':
'<span class="bold-text">Текущая версия (v0.6.1): </span>Модели Ollama в настоящее время доступны для использования.',
'models.ollama.deprecated.upcoming':
'<span class="bold-text">Предстоящая версия (v0.7.0): </span>Источник моделей Ollama будет удалён из интерфейса.',
'models.ollama.deprecated.following':
'<span class="bold-text">После обновления до версии (v0.7.0),</span> все ранее развёрнутые модели продолжат работать в обычном режиме.',
'models.ollama.deprecated.issue':
'См. связанную проблему: <a href="https://github.com/gpustack/gpustack/issues/1979" target="_blank">#1979 on GitHub</a>.',
'models.ollama.deprecated.notice':
'Источник моделей Ollama объявлен устаревшим начиная с версии v0.6.1. Подробности см. в <a href="https://github.com/gpustack/gpustack/issues/1979" target="_blank">соответствующем issue на GitHub</a>.',
'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': 'Подробности см. в <a href="https://docs.lmcache.ai/api_reference/configurations.html" target="_blank">документации по конфигурации</a>.',
'models.form.runCommandPlaceholder': 'напр., vllm serve Qwen/Qwen2.5-1.5B-Instruct',
'models.form.remoteURL.tips':
'Подробности см. в <a href="https://docs.lmcache.ai/api_reference/configurations.html" target="_blank">документации по конфигурации</a>.',
'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). Переключите бэкенд в <span class="bold-text">Расширенных</span> настройках, чтобы включить их.',
'models.form.kvCache.tips2': 'Поддерживается только при использовании встроенных бэкендов вывода (vLLM или SGLang).',
'models.form.kvCache.tips':
'Расширенный KV-кэш и спекулятивное декодирование доступны только со встроенными бэкендами (vLLM / SGLang). Переключите бэкенд в <span class="bold-text">Расширенных</span> настройках, чтобы включить их.',
'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': 'Используйте следующий префикс пути и укажите имя модели либо в заголовке запроса <span class="bold-text">X-GPUStack-Model</span>, либо в поле model в теле запроса. Все запросы с этим префиксом пути будут перенаправлены в бэкенд вывода.'
'models.table.genericProxy':
'Используйте следующий префикс пути и укажите имя модели либо в заголовке запроса <span class="bold-text">X-GPUStack-Model</span>, либо в поле model в теле запроса. Все запросы с этим префиксом пути будут перенаправлены в бэкенд вывода.',
'models.form.backendVersion.deprecated': 'Устаревший'
};
+2 -1
View File
@@ -247,5 +247,6 @@ export default {
'models.form.generic_proxy.button': '通用代理',
'models.accessControlModal.includeusers': '显示用户',
'models.table.genericProxy':
'使用以下路径前缀,并在请求头 <span class="bold-text">X-GPUStack-Model</span> 或请求体中的 model 字段设置模型名称后访问该模型。该路径的所有子路径请求会被转发到推理后端。'
'使用以下路径前缀,并在请求头 <span class="bold-text">X-GPUStack-Model</span> 或请求体中的 model 字段设置模型名称后访问该模型。该路径的所有子路径请求会被转发到推理后端。',
'models.form.backendVersion.deprecated': '已弃用'
};
@@ -131,6 +131,7 @@ const SupportedHardware: React.FC<SupportedHardwareProps> = ({
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: <ProviderImage src={metaxLogo} showBg />
}
@@ -580,7 +580,14 @@ const SearchModel: React.FC<SearchInputProps> = (props) => {
return (
<div style={{ width: '100%' }}>
<div className={SearchStyle['search-bar']}>{renderHFSearch()}</div>
<ColumnWrapper maxHeight={'calc(100vh - 210px)'}>
<ColumnWrapper
maxHeight={'calc(100vh - 210px)'}
styles={{
container: {
paddingTop: 0
}
}}
>
<SearchResult
loading={dataSource.loading}
resultList={dataSource.dataList}
+6 -1
View File
@@ -307,7 +307,12 @@ export interface BackendOption {
default_backend_param: string[];
default_version: string;
isBuiltIn: boolean;
versions: { label: string; value: string; title?: string }[];
versions: {
label: string;
value: string;
title?: string;
is_deprecated: boolean;
}[];
}
export interface AccessControlFormData {
+100 -37
View File
@@ -1,19 +1,34 @@
import SealSelect from '@/components/seal-form/seal-select';
import TooltipList from '@/components/tooltip-list';
import useAppUtils from '@/hooks/use-app-utils';
import { CaretDownOutlined } from '@ant-design/icons';
import { useIntl } from '@umijs/max';
import { Form } from 'antd';
import { Form, Select } from 'antd';
import React, { useMemo } from 'react';
import styled from 'styled-components';
import { backendTipsList } from '../config';
import { backendOptionsMap } from '../config/backend-parameters';
import { useFormContext } from '../config/form-context';
const CaretDownWrapper = styled.span`
display: flex;
align-items: center;
gap: 4px;
cursor: pointer;
&:hover {
.anticon {
color: var(--ant-color-text);
}
}
`;
const BackendFields: React.FC = () => {
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<boolean>(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 ? (
<span>
{data.title}
<span className="text-tertiary m-l-4">[Deprecated]</span>
</span>
) : (
<span>{data.title}</span>
const labelRender = (option: any) => {
return option.title;
};
const renderVersionOptions = (values: any[], label: string) => {
if (!values || values.length === 0) {
return null;
}
return (
<Select.OptGroup label={label}>
{values.map((item) => (
<Select.Option key={item.value} value={item.value} label={item.label}>
{item.label}
</Select.Option>
))}
</Select.OptGroup>
);
};
const labelRender = (option: any) => {
return option.title;
const renderDeprecatedVersionOptions = (values: any[]) => {
if (!values || values.length === 0) {
return null;
}
return (
<Select.OptGroup
label={
<CaretDownWrapper onClick={() => setShowDeprecated(!showDeprecated)}>
{intl.formatMessage({
id: 'models.form.backendVersion.deprecated'
})}
<CaretDownOutlined rotate={showDeprecated ? 0 : -90} />
</CaretDownWrapper>
}
>
{showDeprecated &&
values.map((item) => (
<Select.Option
key={item.value}
value={item.value}
label={item.label}
>
{item.label}
</Select.Option>
))}
</Select.OptGroup>
);
};
return (
@@ -132,15 +186,24 @@ const BackendFields: React.FC = () => {
<Form.Item name="backend_version">
<SealSelect
allowClear
options={backendVersions}
optionRender={versionOptionRender}
showSearch
labelRender={labelRender}
placeholder={intl.formatMessage({
id: 'models.form.backendVersion.holder'
})}
onChange={handleBackendVersionOnChange}
label={intl.formatMessage({ id: 'models.form.backendVersion' })}
></SealSelect>
>
{renderVersionOptions(
backendVersions.builtIn,
intl.formatMessage({ id: 'backend.builtin' })
)}
{renderVersionOptions(
backendVersions.custom,
intl.formatMessage({ id: 'models.form.backend.custom' })
)}
{renderDeprecatedVersionOptions(backendVersions.deprecated)}
</SealSelect>
</Form.Item>
)}
</>
@@ -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$/, '')
}))
};