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.form.generic_proxy.button': 'Generic Proxy',
'models.accessControlModal.includeusers': 'Include Users', 'models.accessControlModal.includeusers': 'Include Users',
'models.table.genericProxy': '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.form.generic_proxy.button': 'Generic Proxy',
'models.accessControlModal.includeusers': 'Include Users', 'models.accessControlModal.includeusers': 'Include Users',
'models.table.genericProxy': '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) ========== // ========== 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.', // 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.`, // 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.', // 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 ========== // ========== End of To-Do List ==========
+119 -59
View File
@@ -13,8 +13,10 @@ export default {
'models.form.env': 'Переменные окружения', 'models.form.env': 'Переменные окружения',
'models.form.configurations': 'Конфигурации', 'models.form.configurations': 'Конфигурации',
'models.form.s3address': 'S3-адрес', 'models.form.s3address': 'S3-адрес',
'models.form.partialoffload.tips': 'При включении CPU оффлоудинга GPUStack будет выделять оперативную память, если ресурсов GPU недостаточно. Вы должны правильно настроить бэкенд вывода для использования гибридного CPU+GPU или полного CPU вывода.', 'models.form.partialoffload.tips':
'models.form.distribution.tips': 'Позволяет переносить часть слоёв модели на один или несколько удалённых воркеров, когда ресурсов текущего воркера недостаточно.', 'При включении CPU оффлоудинга GPUStack будет выделять оперативную память, если ресурсов GPU недостаточно. Вы должны правильно настроить бэкенд вывода для использования гибридного CPU+GPU или полного CPU вывода.',
'models.form.distribution.tips':
'Позволяет переносить часть слоёв модели на один или несколько удалённых воркеров, когда ресурсов текущего воркера недостаточно.',
'models.openinplayground': 'Открыть в Песочнице', 'models.openinplayground': 'Открыть в Песочнице',
'models.instances': 'инстансы', 'models.instances': 'инстансы',
'models.table.replicas.edit': 'Редактировать реплики', 'models.table.replicas.edit': 'Редактировать реплики',
@@ -22,7 +24,8 @@ export default {
'model.form.ollamaholder': 'Выберите или введите название модели', 'model.form.ollamaholder': 'Выберите или введите название модели',
'model.deploy.sort': 'Сортировка', 'model.deploy.sort': 'Сортировка',
'model.deploy.search.placeholder': 'Введите <kbd>/</kbd> для поиска моделей', 'model.deploy.search.placeholder': 'Введите <kbd>/</kbd> для поиска моделей',
'model.form.ollamatips': 'Подсказка: ниже представлены предустановленные модели Ollama в GPUStack. Выберите нужную или введите модель для развертывания в поле 【{name}】 справа.', 'model.form.ollamatips':
'Подсказка: ниже представлены предустановленные модели Ollama в GPUStack. Выберите нужную или введите модель для развертывания в поле 【{name}】 справа.',
'models.sort.name': 'По имени', 'models.sort.name': 'По имени',
'models.sort.size': 'По размеру', 'models.sort.size': 'По размеру',
'models.sort.likes': 'По лайкам', 'models.sort.likes': 'По лайкам',
@@ -39,15 +42,18 @@ export default {
'models.search.nofiles': 'Нет доступных файлов', 'models.search.nofiles': 'Нет доступных файлов',
'models.search.networkerror': 'Ошибка сетевого подключения!', 'models.search.networkerror': 'Ошибка сетевого подключения!',
'models.search.hfvisit': 'Убедитесь, что доступен', 'models.search.hfvisit': 'Убедитесь, что доступен',
'models.search.unsupport': 'Модель не поддерживается и может быть нефункциональна после развертывания.', 'models.search.unsupport':
'Модель не поддерживается и может быть нефункциональна после развертывания.',
'models.form.scheduletype': 'Тип планирования', 'models.form.scheduletype': 'Тип планирования',
'models.form.categories': 'Категория модели', 'models.form.categories': 'Категория модели',
'models.form.scheduletype.auto': 'Авто', 'models.form.scheduletype.auto': 'Авто',
'models.form.scheduletype.manual': 'Ручной', 'models.form.scheduletype.manual': 'Ручной',
'models.form.scheduletype.gpu': 'Указать GPU', 'models.form.scheduletype.gpu': 'Указать GPU',
'models.form.scheduletype.gpuType': 'Указать тип GPU', 'models.form.scheduletype.gpuType': 'Указать тип GPU',
'models.form.scheduletype.auto.tips': 'Автоматическое развертывание инстансов модели на подходящие GPU в зависимости от текущих ресурсов.', 'models.form.scheduletype.auto.tips':
'models.form.scheduletype.manual.tips': 'Позволяет вручную указать GPU для развертывания инстансов модели.', 'Автоматическое развертывание инстансов модели на подходящие GPU в зависимости от текущих ресурсов.',
'models.form.scheduletype.manual.tips':
'Позволяет вручную указать GPU для развертывания инстансов модели.',
'models.form.manual.schedule': 'Ручное распределение', 'models.form.manual.schedule': 'Ручное распределение',
'models.table.gpuindex': 'Индекс GPU', 'models.table.gpuindex': 'Индекс GPU',
'models.table.backend': 'Бэкенды', 'models.table.backend': 'Бэкенды',
@@ -56,14 +62,22 @@ export default {
'models.table.layers': 'Слои', 'models.table.layers': 'Слои',
'models.form.backend': 'Бэкенд', 'models.form.backend': 'Бэкенд',
'models.form.backend_parameters': 'Параметры бэкенда', 'models.form.backend_parameters': 'Параметры бэкенда',
'models.search.gguf.tips': 'GGUF-модели используют llama-box (поддерживает Linux, macOS и Windows).', 'models.search.gguf.tips':
'models.search.vllm.tips': 'Не-GGUF модели используют vox-box для аудио и vLLM (только x86 Linux) для остальных.', 'GGUF-модели используют llama-box (поддерживает Linux, macOS и Windows).',
'models.search.voxbox.tips': 'Для развертывания аудиомодели снимите отметку GGUF.', 'models.search.vllm.tips':
'models.form.ollamalink': 'Больше моделей в библиотеке <a href="https://www.ollama.com/library" target="_blank">Ollama</a>', 'Не-GGUF модели используют vox-box для аудио и vLLM (только x86 Linux) для остальных.',
'models.form.backend_parameters.llamabox.placeholder': 'например: --ctx-size=8192(параметр и значение разделены знаком =)', 'models.search.voxbox.tips':
'models.form.backend_parameters.vllm.placeholder': 'например: --max-model-len=8192(параметр и значение разделены знаком =)', 'Для развертывания аудиомодели снимите отметку GGUF.',
'models.form.backend_parameters.sglang.placeholder': 'например: --context-length=8192(параметр и значение разделены знаком =)', 'models.form.ollamalink':
'models.form.backend_parameters.vllm.tips': 'Для получения подробной информации о параметрах {backend} см. <a href={link} target="_blank">здесь</a>.', 'Больше моделей в библиотеке <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.prev': 'Предыдущие {lines} строк',
'models.logs.pagination.next': 'Следующие {lines} строк', 'models.logs.pagination.next': 'Следующие {lines} строк',
'models.logs.pagination.last': 'Последняя страница', 'models.logs.pagination.last': 'Последняя страница',
@@ -71,14 +85,19 @@ export default {
'models.form.localPath': 'Локальный путь', 'models.form.localPath': 'Локальный путь',
'models.form.filePath': 'Путь к модели', 'models.form.filePath': 'Путь к модели',
'models.form.backendVersion': 'Версия бэкенда', '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.gpuselector': 'Селектор GPU',
'models.form.backend.llamabox': 'Для моделей формата GGUF. Поддержка Linux, macOS и Windows.', 'models.form.backend.llamabox':
'models.form.backend.vllm': 'Встроенная поддержка устройств NVIDIA, AMD, Ascend, Hygon, Iluvatar и MetaX.', 'Для моделей формата GGUF. Поддержка Linux, macOS и Windows.',
'models.form.backend.vllm':
'Встроенная поддержка устройств NVIDIA, AMD, Ascend, Hygon, Iluvatar и MetaX.',
'models.form.backend.voxbox': 'Поддерживает только GPU NVIDIA и CPU.', 'models.form.backend.voxbox': 'Поддерживает только GPU NVIDIA и CPU.',
'models.form.backend.mindie': 'Поддерживает только Ascend NPU.', 'models.form.backend.mindie': 'Поддерживает только Ascend NPU.',
'models.form.backend.sglang': 'Встроенная поддержка GPU NVIDIA/AMD и Ascend NPU.', 'models.form.backend.sglang':
'models.form.search.gguftips': 'Для воркеров на macOS/Windows отметьте GGUF (для аудиомоделей снимите).', 'Встроенная поддержка GPU NVIDIA/AMD и Ascend NPU.',
'models.form.search.gguftips':
'Для воркеров на macOS/Windows отметьте GGUF (для аудиомоделей снимите).',
'models.form.button.addlabel': 'Добавить метку', 'models.form.button.addlabel': 'Добавить метку',
'models.filter.category': 'Фильтр по категориям', 'models.filter.category': 'Фильтр по категориям',
'models.list.more.logs': 'Показать больше', 'models.list.more.logs': 'Показать больше',
@@ -86,38 +105,52 @@ export default {
'models.localpath.gguf.tips.title': 'Модель формата GGUF', 'models.localpath.gguf.tips.title': 'Модель формата GGUF',
'models.localpat.safe.tips.title': 'Модель формата Safetensors', 'models.localpat.safe.tips.title': 'Модель формата Safetensors',
'models.localpath.shared.tips.title': 'Шардированная GGUF-модель', 'models.localpath.shared.tips.title': 'Шардированная GGUF-модель',
'models.localpath.gguf.tips': 'Укажите файл модели, например: /data/models/model.gguf.', 'models.localpath.gguf.tips':
'models.localpath.safe.tips': 'Укажите директорию модели с файлами .safetensors и config.json.', 'Укажите файл модели, например: /data/models/model.gguf.',
'models.localpath.chunks.tips': 'Укажите первый шард модели, например: /data/models/model-00001-of-00004.gguf.', 'models.localpath.safe.tips':
'models.form.replicas.tips': 'Несколько реплик обеспечивают балансировку нагрузки для { api } запросов.', 'Укажите директорию модели с файлами .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.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.llamaAcrossworker': 'Llama-box между воркерами',
'models.table.vllmAcrossworker': 'vLLM между воркерами', 'models.table.vllmAcrossworker': 'vLLM между воркерами',
'models.form.releases': 'Релизы', 'models.form.releases': 'Релизы',
'models.form.moreparameters': 'Описание параметров', 'models.form.moreparameters': 'Описание параметров',
'models.table.vram.allocated': 'Выделенная VRAM', 'models.table.vram.allocated': 'Выделенная VRAM',
'models.form.backend.warning': 'Выбранный бэкенд не поддерживает модели GGUF. Пожалуйста, добавьте бэкенд с поддержкой GGUF в разделе Бэкенды вывода.', 'models.form.backend.warning':
'models.form.backend.warning.gguf': 'Пожалуйста, убедитесь, что выбранный пользовательский бэкенд поддерживает модели GGUF.', 'Выбранный бэкенд не поддерживает модели GGUF. Пожалуйста, добавьте бэкенд с поддержкой GGUF в разделе Бэкенды вывода.',
'models.form.ollama.warning': 'Чтобы развернуть бэкенд для моделей Ollama с использованием llama-box , выполните следующие шаги.', 'models.form.backend.warning.gguf':
'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>).', 'Пожалуйста, убедитесь, что выбранный пользовательский бэкенд поддерживает модели GGUF.',
'models.form.keyvalue.paste': 'Вставьте несколько строк текста, где каждая строка содержит пару ключ-значение. Ключ и значение разделяются знаком равенства (=), а разные пары — символами новой строки.', '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.form.files': 'Файлы',
'models.table.status': 'Статус', 'models.table.status': 'Статус',
'models.form.submit.anyway': 'Отправить в любом случае', 'models.form.submit.anyway': 'Отправить в любом случае',
'models.form.evaluating': 'Анализ совместимости модели', 'models.form.evaluating': 'Анализ совместимости модели',
'models.form.incompatible': 'Обнаружена несовместимость', 'models.form.incompatible': 'Обнаружена несовместимость',
'models.form.restart.onerror': 'Автоперезапуск при ошибке', 'models.form.restart.onerror': 'Автоперезапуск при ошибке',
'models.form.restart.onerror.tips': 'При возникновении ошибки система автоматически попытается перезапуститься.', 'models.form.restart.onerror.tips':
'При возникновении ошибки система автоматически попытается перезапуститься.',
'models.form.check.params': 'Проверка конфигурации...', 'models.form.check.params': 'Проверка конфигурации...',
'models.form.check.passed': 'Проверка совместимости пройдена', '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.claims2': 'Модель требует примерно {vram} VRAM.',
'models.form.check.claims3': 'Модель требует примерно {ram} RAM.', 'models.form.check.claims3': 'Модель требует примерно {ram} RAM.',
'models.form.update.tips': 'Изменения вступят в силу только после удаления и повторного создания инстанса.', 'models.form.update.tips':
'Изменения вступят в силу только после удаления и повторного создания инстанса.',
'models.table.download.progress': 'Прогресс', 'models.table.download.progress': 'Прогресс',
'models.table.button.apiAccessInfo': 'Доступ к API', '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.endpoint': 'URL доступа',
'models.table.apiAccessInfo.modelName': 'Имя модели', 'models.table.apiAccessInfo.modelName': 'Имя модели',
'models.table.apiAccessInfo.apikey': 'Ключ API', 'models.table.apiAccessInfo.apikey': 'Ключ API',
@@ -127,24 +160,34 @@ export default {
'models.search.parts': '{n} частей', 'models.search.parts': '{n} частей',
'models.search.evaluate.error': 'Возникла ошибка при вычислении: ', 'models.search.evaluate.error': 'Возникла ошибка при вычислении: ',
'models.ollama.deprecated.title': 'Объявление об устаревании', 'models.ollama.deprecated.title': 'Объявление об устаревании',
'models.ollama.deprecated.current': '<span class="bold-text">Текущая версия (v0.6.1): </span>Модели Ollama в настоящее время доступны для использования.', 'models.ollama.deprecated.current':
'models.ollama.deprecated.upcoming': '<span class="bold-text">Предстоящая версия (v0.7.0): </span>Источник моделей Ollama будет удалён из интерфейса.', '<span class="bold-text">Текущая версия (v0.6.1): </span>Модели Ollama в настоящее время доступны для использования.',
'models.ollama.deprecated.following': '<span class="bold-text">После обновления до версии (v0.7.0),</span> все ранее развёрнутые модели продолжат работать в обычном режиме.', 'models.ollama.deprecated.upcoming':
'models.ollama.deprecated.issue': 'См. связанную проблему: <a href="https://github.com/gpustack/gpustack/issues/1979" target="_blank">#1979 on GitHub</a>.', '<span class="bold-text">Предстоящая версия (v0.7.0): </span>Источник моделей Ollama будет удалён из интерфейса.',
'models.ollama.deprecated.notice': 'Источник моделей Ollama объявлен устаревшим начиная с версии v0.6.1. Подробности см. в <a href="https://github.com/gpustack/gpustack/issues/1979" target="_blank">соответствующем issue на GitHub</a>.', 'models.ollama.deprecated.following':
'models.backend.mindie.310p': 'Ascend 310P поддерживает только FP16, поэтому необходимо установить --dtype=float16.', '<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.gpuCount': 'GPU на реплику',
'models.form.gpuType': 'Тип GPU', 'models.form.gpuType': 'Тип GPU',
'models.form.optimizeLongPrompt': 'Оптимизировать длинные промпты', 'models.form.optimizeLongPrompt': 'Оптимизировать длинные промпты',
'models.form.enableSpeculativeDecoding': 'Включить спекулятивное декодирование', 'models.form.enableSpeculativeDecoding':
'Включить спекулятивное декодирование',
'models.form.check.clusterUnavailable': 'Текущий кластер недоступен', 'models.form.check.clusterUnavailable': 'Текущий кластер недоступен',
'models.form.check.otherClustersAvailable': 'Доступные кластеры: {clusters}. Пожалуйста, переключитесь на другой кластер.', 'models.form.check.otherClustersAvailable':
'Доступные кластеры: {clusters}. Пожалуйста, переключитесь на другой кластер.',
'models.button.accessSettings': 'Настройки доступа', 'models.button.accessSettings': 'Настройки доступа',
'models.table.accessScope': 'Область доступа', 'models.table.accessScope': 'Область доступа',
'models.table.accessScope.all': 'Все пользователи', 'models.table.accessScope.all': 'Все пользователи',
'models.table.userSelection': 'Выбор пользователей', 'models.table.userSelection': 'Выбор пользователей',
'models.button.accessSettings.tips': 'Изменения в настройках доступа вступают в силу через одну минуту.', 'models.button.accessSettings.tips':
'models.table.userSelection.tips': 'Администраторы по умолчанию имеют доступ ко всем моделям.', 'Изменения в настройках доступа вступают в силу через одну минуту.',
'models.table.userSelection.tips':
'Администраторы по умолчанию имеют доступ ко всем моделям.',
'models.table.filterByName': 'Фильтр по имени пользователя', 'models.table.filterByName': 'Фильтр по имени пользователя',
'models.table.admin': 'Администратор', 'models.table.admin': 'Администратор',
'models.table.noselected': 'Пользователи не выбраны', 'models.table.noselected': 'Пользователи не выбраны',
@@ -157,30 +200,39 @@ export default {
'models.form.chunkSize': 'Размер чанков кэша', 'models.form.chunkSize': 'Размер чанков кэша',
'models.form.maxCPUSize': 'Максимальный размер CPU кэша (ГиБ)', 'models.form.maxCPUSize': 'Максимальный размер CPU кэша (ГиБ)',
'models.form.remoteURL': 'URL удаленного хранилища', 'models.form.remoteURL': 'URL удаленного хранилища',
'models.form.remoteURL.tips': 'Подробности см. в <a href="https://docs.lmcache.ai/api_reference/configurations.html" target="_blank">документации по конфигурации</a>.', 'models.form.remoteURL.tips':
'models.form.runCommandPlaceholder': 'напр., vllm serve Qwen/Qwen2.5-1.5B-Instruct', 'Подробности см. в <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.public': 'Публичный',
'models.accessSettings.authed': 'Аутентифицированный', 'models.accessSettings.authed': 'Аутентифицированный',
'models.accessSettings.allowedUsers': 'Разрешенные пользователи', 'models.accessSettings.allowedUsers': 'Разрешенные пользователи',
'models.accessSettings.public.tips': 'При публичном доступе любой пользователь может получить доступ к модели без аутентификации, что может привести к риску утечки данных.', 'models.accessSettings.public.tips':
'При публичном доступе любой пользователь может получить доступ к модели без аутентификации, что может привести к риску утечки данных.',
'models.table.button.deploy': 'Развернуть сейчас', 'models.table.button.deploy': 'Развернуть сейчас',
'models.form.backendVersion.holder': 'Введите или выберите версию', 'models.form.backendVersion.holder': 'Введите или выберите версию',
'models.form.gpusperreplica': 'GPU на реплику', 'models.form.gpusperreplica': 'GPU на реплику',
'models.form.gpusAllocationType': 'Тип распределения GPU', 'models.form.gpusAllocationType': 'Тип распределения GPU',
'models.form.gpusAllocationType.auto': 'Авто', 'models.form.gpusAllocationType.auto': 'Авто',
'models.form.gpusAllocationType.custom': 'Вручную', 'models.form.gpusAllocationType.custom': 'Вручную',
'models.form.gpusAllocationType.auto.tips': 'Система автоматически вычисляет количество GPU на реплику, по умолчанию используя степени двойки и ограничиваясь выбранными GPU.', 'models.form.gpusAllocationType.auto.tips':
'models.form.gpusAllocationType.custom.tips': 'Вы можете указать точное количество GPU на реплику.', 'Система автоматически вычисляет количество GPU на реплику, по умолчанию используя степени двойки и ограничиваясь выбранными GPU.',
'models.form.gpusAllocationType.custom.tips':
'Вы можете указать точное количество GPU на реплику.',
'models.mymodels.status.inactive': 'Остановлен', 'models.mymodels.status.inactive': 'Остановлен',
'models.mymodels.status.degrade': 'Аномальный', 'models.mymodels.status.degrade': 'Аномальный',
'models.mymodels.status.active': 'Активен', 'models.mymodels.status.active': 'Активен',
'models.form.kvCache.tips': 'Расширенный KV-кэш и спекулятивное декодирование доступны только со встроенными бэкендами (vLLM / SGLang). Переключите бэкенд в <span class="bold-text">Расширенных</span> настройках, чтобы включить их.', 'models.form.kvCache.tips':
'models.form.kvCache.tips2': 'Поддерживается только при использовании встроенных бэкендов вывода (vLLM или SGLang).', 'Расширенный KV-кэш и спекулятивное декодирование доступны только со встроенными бэкендами (vLLM / SGLang). Переключите бэкенд в <span class="bold-text">Расширенных</span> настройках, чтобы включить их.',
'models.form.kvCache.tips2':
'Поддерживается только при использовании встроенных бэкендов вывода (vLLM или SGLang).',
'models.form.scheduling': 'Планирование', 'models.form.scheduling': 'Планирование',
'models.form.ramRatio': 'Соотношение ОЗУ к VRAM', 'models.form.ramRatio': 'Соотношение ОЗУ к VRAM',
'models.form.ramSize': 'Максимальный размер ОЗУ (ГиБ)', 'models.form.ramSize': 'Максимальный размер ОЗУ (ГиБ)',
'models.form.ramRatio.tips': 'Соотношение системной оперативной памяти к видеопамяти GPU, используемое для KV-кэша. Например, 2.0 означает, что кэш в ОЗУ может быть в два раза больше, чем в видеопамяти GPU.', 'models.form.ramRatio.tips':
'models.form.ramSize.tips': 'Максимальный размер KV-кэша, хранящегося в системной памяти (ГиБ). Если задано, это значение переопределяет "{content}".', 'Соотношение системной оперативной памяти к видеопамяти GPU, используемое для KV-кэша. Например, 2.0 означает, что кэш в ОЗУ может быть в два раза больше, чем в видеопамяти GPU.',
'models.form.ramSize.tips':
'Максимальный размер KV-кэша, хранящегося в системной памяти (ГиБ). Если задано, это значение переопределяет "{content}".',
'models.form.chunkSize.tips': 'Количество токенов на чанк KV-кэша.', 'models.form.chunkSize.tips': 'Количество токенов на чанк KV-кэша.',
'models.form.mode': 'Режим', 'models.form.mode': 'Режим',
'models.form.algorithm': 'Алгоритм', 'models.form.algorithm': 'Алгоритм',
@@ -191,20 +243,28 @@ export default {
'models.form.mode.throughput': 'Пропускная способность', 'models.form.mode.throughput': 'Пропускная способность',
'models.form.mode.latency': 'Задержка', 'models.form.mode.latency': 'Задержка',
'models.form.mode.baseline': 'Стандартный', 'models.form.mode.baseline': 'Стандартный',
'models.form.mode.throughput.tips': 'оптимизировано для высокой пропускной способности при высокой конкурентности запросов.', 'models.form.mode.throughput.tips':
'models.form.mode.latency.tips': 'оптимизировано для низкой задержки при низкой конкурентности запросов.', 'оптимизировано для высокой пропускной способности при высокой конкурентности запросов.',
'models.form.mode.baseline.tips': 'наиболее совместимый вариант с полной точностью.', 'models.form.mode.latency.tips':
'оптимизировано для низкой задержки при низкой конкурентности запросов.',
'models.form.mode.baseline.tips':
'наиболее совместимый вариант с полной точностью.',
'models.form.draftModel.placeholder': 'Выберите или введите черновую модель', '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.quantization': 'Квантование',
'models.form.backend.custom': 'Пользовательский', 'models.form.backend.custom': 'Пользовательский',
'models.form.rules.name': 'До 63 символов; только буквы, цифры, точки (.), подчёркивания (_) и дефисы (-); должно начинаться и заканчиваться буквенно-цифровым символом.', 'models.form.rules.name':
'До 63 символов; только буквы, цифры, точки (.), подчёркивания (_) и дефисы (-); должно начинаться и заканчиваться буквенно-цифровым символом.',
'models.catalog.button.explore': 'Исследовать больше моделей', 'models.catalog.button.explore': 'Исследовать больше моделей',
'models.catalog.precision': 'Точность', 'models.catalog.precision': 'Точность',
'models.form.gpuPerReplica.tips': 'Введите произвольное число', 'models.form.gpuPerReplica.tips': 'Введите произвольное число',
'models.form.generic_proxy': 'Включить универсальный прокси', '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.form.generic_proxy.button': 'Универсальный прокси',
'models.accessControlModal.includeusers': 'Включить пользователей', '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.form.generic_proxy.button': '通用代理',
'models.accessControlModal.includeusers': '显示用户', 'models.accessControlModal.includeusers': '显示用户',
'models.table.genericProxy': '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, value: GPUDriverMap.METAX,
key: GPUDriverMap.METAX, key: GPUDriverMap.METAX,
locale: false, locale: false,
link: 'https://docs.gpustack.ai/latest/installation/metax/installation/?h=meta#prerequisites',
notes: AddWorkerDockerNotes[GPUDriverMap.METAX], notes: AddWorkerDockerNotes[GPUDriverMap.METAX],
icon: <ProviderImage src={metaxLogo} showBg /> icon: <ProviderImage src={metaxLogo} showBg />
} }
@@ -580,7 +580,14 @@ const SearchModel: React.FC<SearchInputProps> = (props) => {
return ( return (
<div style={{ width: '100%' }}> <div style={{ width: '100%' }}>
<div className={SearchStyle['search-bar']}>{renderHFSearch()}</div> <div className={SearchStyle['search-bar']}>{renderHFSearch()}</div>
<ColumnWrapper maxHeight={'calc(100vh - 210px)'}> <ColumnWrapper
maxHeight={'calc(100vh - 210px)'}
styles={{
container: {
paddingTop: 0
}
}}
>
<SearchResult <SearchResult
loading={dataSource.loading} loading={dataSource.loading}
resultList={dataSource.dataList} resultList={dataSource.dataList}
+6 -1
View File
@@ -307,7 +307,12 @@ export interface BackendOption {
default_backend_param: string[]; default_backend_param: string[];
default_version: string; default_version: string;
isBuiltIn: boolean; isBuiltIn: boolean;
versions: { label: string; value: string; title?: string }[]; versions: {
label: string;
value: string;
title?: string;
is_deprecated: boolean;
}[];
} }
export interface AccessControlFormData { export interface AccessControlFormData {
+100 -37
View File
@@ -1,19 +1,34 @@
import SealSelect from '@/components/seal-form/seal-select'; import SealSelect from '@/components/seal-form/seal-select';
import TooltipList from '@/components/tooltip-list'; import TooltipList from '@/components/tooltip-list';
import useAppUtils from '@/hooks/use-app-utils'; import useAppUtils from '@/hooks/use-app-utils';
import { CaretDownOutlined } from '@ant-design/icons';
import { useIntl } from '@umijs/max'; import { useIntl } from '@umijs/max';
import { Form } from 'antd'; import { Form, Select } from 'antd';
import React, { useMemo } from 'react'; import React, { useMemo } from 'react';
import styled from 'styled-components';
import { backendTipsList } from '../config'; import { backendTipsList } from '../config';
import { backendOptionsMap } from '../config/backend-parameters'; import { backendOptionsMap } from '../config/backend-parameters';
import { useFormContext } from '../config/form-context'; 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 BackendFields: React.FC = () => {
const intl = useIntl(); const intl = useIntl();
const { getRuleMessage } = useAppUtils(); const { getRuleMessage } = useAppUtils();
const form = Form.useFormInstance(); const form = Form.useFormInstance();
const { onValuesChange, backendOptions, onBackendChange } = useFormContext(); const { onValuesChange, backendOptions, onBackendChange } = useFormContext();
const backend = Form.useWatch('backend', form); const backend = Form.useWatch('backend', form);
const [showDeprecated, setShowDeprecated] = React.useState<boolean>(false);
const handleBackendVersionOnChange = (value: any) => { const handleBackendVersionOnChange = (value: any) => {
onValuesChange?.({}, form.getFieldsValue()); onValuesChange?.({}, form.getFieldsValue());
@@ -45,9 +60,17 @@ const BackendFields: React.FC = () => {
return options; return options;
}, [backendOptions, intl]); }, [backendOptions, intl]);
const backendVersions = useMemo(() => { const backendVersions = useMemo((): {
builtIn: any[];
custom: any[];
deprecated: any[];
} => {
if (!backend || backend === backendOptionsMap.custom) { if (!backend || backend === backendOptionsMap.custom) {
return []; return {
builtIn: [],
custom: [],
deprecated: []
};
} }
// find the backend item from backendOptions // find the backend item from backendOptions
@@ -57,54 +80,85 @@ const BackendFields: React.FC = () => {
// if it's a custom backend, // if it's a custom backend,
if (backendItem && !backendItem.isBuiltIn) { 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 // 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( const builtInVersions = versions.filter(
(item) => !item.value?.endsWith('-custom') (item) => !item.value?.endsWith('-custom') && !item.is_deprecated
);
const customVersions = versions.filter((item) =>
item.value?.endsWith('-custom')
); );
const options = []; // ============ Custom Versions ============
const customVersions = versions.filter(
(item) => item.value?.endsWith('-custom') && !item.is_deprecated
);
if (builtInVersions.length > 0) { // ============ Deprecated Versions ============
options.push({ const deprecatedVersions = versions.filter((item) => item.is_deprecated);
label: intl.formatMessage({ id: 'backend.builtin' }),
options: builtInVersions
});
}
if (customVersions.length > 0) { return {
options.push({ builtIn: builtInVersions,
label: intl.formatMessage({ id: 'models.form.backend.custom' }), custom: customVersions,
options: customVersions deprecated: deprecatedVersions
}); };
}
return options;
}, [backend, backendOptions, intl]); }, [backend, backendOptions, intl]);
const optionRender = (option: any) => { const optionRender = (option: any) => {
return option.data.title; return option.data.title;
}; };
const versionOptionRender = (option: any) => { const labelRender = (option: any) => {
const { data } = option; return option.title;
return data.is_deprecated ? ( };
<span>
{data.title} const renderVersionOptions = (values: any[], label: string) => {
<span className="text-tertiary m-l-4">[Deprecated]</span> if (!values || values.length === 0) {
</span> return null;
) : ( }
<span>{data.title}</span> 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) => { const renderDeprecatedVersionOptions = (values: any[]) => {
return option.title; 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 ( return (
@@ -132,15 +186,24 @@ const BackendFields: React.FC = () => {
<Form.Item name="backend_version"> <Form.Item name="backend_version">
<SealSelect <SealSelect
allowClear allowClear
options={backendVersions} showSearch
optionRender={versionOptionRender}
labelRender={labelRender} labelRender={labelRender}
placeholder={intl.formatMessage({ placeholder={intl.formatMessage({
id: 'models.form.backendVersion.holder' id: 'models.form.backendVersion.holder'
})} })}
onChange={handleBackendVersionOnChange} onChange={handleBackendVersionOnChange}
label={intl.formatMessage({ id: 'models.form.backendVersion' })} 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> </Form.Item>
)} )}
</> </>
@@ -26,9 +26,10 @@ export default function useQueryBackends() {
default_backend_param: item.default_backend_param || [], default_backend_param: item.default_backend_param || [],
default_version: item.default_version, default_version: item.default_version,
isBuiltIn: item.is_built_in, isBuiltIn: item.is_built_in,
versions: (item.versions || []).map((vItem) => ({ versions: (item.versions || []).map((vItem, index) => ({
label: vItem.version, label: vItem.version,
value: vItem.version, value: vItem.version,
is_deprecated: vItem.is_deprecated,
title: vItem.version.replace(/-custom$/, '') title: vItem.version.replace(/-custom$/, '')
})) }))
}; };