style: add model selection tips in playground

This commit is contained in:
jialin
2025-04-09 17:46:18 +08:00
parent fe8ff2b180
commit 694ffb0a81
11 changed files with 97 additions and 42 deletions
@@ -32,6 +32,7 @@ const OverlayScroller: React.FC<any> = ({
return ( return (
<Wrapper <Wrapper
ref={scroller} ref={scroller}
className="overlay-scroller-wrapper"
$maxHeight={maxHeight || '100%'} $maxHeight={maxHeight || '100%'}
hidden={false} hidden={false}
as="div" as="div"
+3 -1
View File
@@ -149,5 +149,7 @@ export default {
'playground.image.origin': 'Original', 'playground.image.origin': 'Original',
'playground.image.mask': 'Mask', 'playground.image.mask': 'Mask',
'playground.image.negativeMask.tips': 'playground.image.negativeMask.tips':
'1. After selection, no further masking can be drawn; therefore, you should draw the mask first and then check the option.\n 2. Once a mask image is uploaded, no further masks can be generated.' '1. After selection, no further masking can be drawn; therefore, you should draw the mask first and then check the option.\n 2. Once a mask image is uploaded, no further masks can be generated.',
'playground.model.noavailable.tips2':
'If the expected model isnt showing up, make sure its running and correctly categorized. If the category is incorrect, you can manually adjust it in the models settings.'
}; };
+7 -1
View File
@@ -152,5 +152,11 @@ export default {
'playground.image.origin': 'オリジナル', 'playground.image.origin': 'オリジナル',
'playground.image.mask': 'マスク', 'playground.image.mask': 'マスク',
'playground.image.negativeMask.tips': 'playground.image.negativeMask.tips':
'1. 選択後は追加のマスクを描画できません。そのため、最初にマスクを描画してからオプションを選択してください。\n 2. マスク画像をアップロードすると、追加のマスクを生成することはできません。' '1. 選択後は追加のマスクを描画できません。そのため、最初にマスクを描画してからオプションを選択してください。\n 2. マスク画像をアップロードすると、追加のマスクを生成することはできません。',
'playground.model.noavailable.tips2':
'If the expected model isnt showing up, make sure its running and correctly categorized. If the category is incorrect, you can manually adjust it in the models settings.'
}; };
// ========== To-Do: Translate Keys (Remove After Translation) ==========
// 1. 'playground.model.noavailable.tips2'
// ========== End of To-Do List ==========
+39 -21
View File
@@ -9,7 +9,8 @@ export default {
'playground.viewcode': 'Посмотреть код', 'playground.viewcode': 'Посмотреть код',
'playground.model': 'Модель', 'playground.model': 'Модель',
'playground.parameters': 'Параметры', 'playground.parameters': 'Параметры',
'playground.viewcode.info': 'Используйте этот код для интеграции текущих настроек в ваше приложение.', 'playground.viewcode.info':
'Используйте этот код для интеграции текущих настроек в ваше приложение.',
'playground.completion': 'Завершение', 'playground.completion': 'Завершение',
'playground.prompt': 'Промпт', 'playground.prompt': 'Промпт',
'playground.timeToFirstToken': 'Время до первого токена', 'playground.timeToFirstToken': 'Время до первого токена',
@@ -17,12 +18,18 @@ export default {
'playground.tokenusage': 'Использование токенов', 'playground.tokenusage': 'Использование токенов',
'models.openinplayground': 'Открыть в Песочнице', 'models.openinplayground': 'Открыть в Песочнице',
'playground.tokenoutput': 'Вывод', 'playground.tokenoutput': 'Вывод',
'playground.params.temperature.tips': 'Контроль случайности: меньше значение — более предсказуемые результаты. При нуле модель становится детерминированной.', 'playground.params.temperature.tips':
'playground.params.maxtokens.tips': 'Максимальное количество генерируемых токенов. Ограничено длиной контекста модели.', 'Контроль случайности: меньше значение — более предсказуемые результаты. При нуле модель становится детерминированной.',
'playground.params.topp.tips': 'Контроль разнообразия через ядерную выборку: 0.5 означает рассмотрение половины вариантов.', 'playground.params.maxtokens.tips':
'playground.params.seed.tips': 'При указании seed система будет стараться генерировать детерминированные результаты.', 'Максимальное количество генерируемых токенов. Ограничено длиной контекста модели.',
'playground.params.stop.tips': 'Стоп-последовательность останавливает генерацию при её появлении в выводе.', 'playground.params.topp.tips':
'playground.viewcode.tips': 'Ваш API-ключ можно найти {here}. Используйте переменные окружения для его защиты.', 'Контроль разнообразия через ядерную выборку: 0.5 означает рассмотрение половины вариантов.',
'playground.params.seed.tips':
'При указании seed система будет стараться генерировать детерминированные результаты.',
'playground.params.stop.tips':
'Стоп-последовательность останавливает генерацию при её появлении в выводе.',
'playground.viewcode.tips':
'Ваш API-ключ можно найти {here}. Используйте переменные окружения для его защиты.',
'playground.viewcode.here': 'здесь', 'playground.viewcode.here': 'здесь',
'playground.delete.img': 'Удалить изображение', 'playground.delete.img': 'Удалить изображение',
'playground.img.upload': 'Загрузить изображение', 'playground.img.upload': 'Загрузить изображение',
@@ -42,7 +49,8 @@ export default {
'playground.compare.apply': 'Применить', 'playground.compare.apply': 'Применить',
'playground.compare.applytoall': 'Применить ко всем моделям', 'playground.compare.applytoall': 'Применить ко всем моделям',
'playground.model.noavailable': 'Нет доступных моделей', 'playground.model.noavailable': 'Нет доступных моделей',
'playground.model.noavailable.tips': 'Сначала разверните модель (не embedding-типа).', 'playground.model.noavailable.tips':
'Сначала разверните модель (не embedding-типа).',
'playground.params.counts': 'Количество', 'playground.params.counts': 'Количество',
'playground.params.quality': 'Качество', 'playground.params.quality': 'Качество',
'playground.params.style': 'Стиль', 'playground.params.style': 'Стиль',
@@ -74,14 +82,16 @@ export default {
'playground.audio.speechtotext': 'Речь в текст', 'playground.audio.speechtotext': 'Речь в текст',
'playground.audio.texttospeech.tips': 'Здесь появится сгенерированная речь', 'playground.audio.texttospeech.tips': 'Здесь появится сгенерированная речь',
'playground.audio.speechtotext.tips': 'Загрузите аудио или начните запись', 'playground.audio.speechtotext.tips': 'Загрузите аудио или начните запись',
'playground.audio.enablemic': 'Разрешите доступ к микрофону в настройках браузера.', 'playground.audio.enablemic':
'Разрешите доступ к микрофону в настройках браузера.',
'playground.audio.enablemic.doc': 'Инструкция', 'playground.audio.enablemic.doc': 'Инструкция',
'playground.audio.startrecord': 'Начать запись', 'playground.audio.startrecord': 'Начать запись',
'playground.audio.stoprecord': 'Остановить запись', 'playground.audio.stoprecord': 'Остановить запись',
'playground.audio.generating.tips': 'Здесь появится распознанный текст', 'playground.audio.generating.tips': 'Здесь появится распознанный текст',
'playground.audio.uploadfile.tips': 'Поддерживаемые форматы: {formats}', 'playground.audio.uploadfile.tips': 'Поддерживаемые форматы: {formats}',
'playground.input.multiplePaste': 'Пакетный ввод', 'playground.input.multiplePaste': 'Пакетный ввод',
'playground.input.multiplePaste.tips': 'Многострочный текст будет автоматически разделён на отдельные записи.', 'playground.input.multiplePaste.tips':
'Многострочный текст будет автоматически разделён на отдельные записи.',
'playground.audio.button.generate': 'Сгенерировать текст', 'playground.audio.button.generate': 'Сгенерировать текст',
'playground.multiple.on': 'Включить', 'playground.multiple.on': 'Включить',
'playground.multiple.off': 'Выключить', 'playground.multiple.off': 'Выключить',
@@ -96,8 +106,10 @@ export default {
'playground.image.params.custom.tips': 'Стиль API', 'playground.image.params.custom.tips': 'Стиль API',
'playground.image.params.openai': 'Совместимость с OpenAI', 'playground.image.params.openai': 'Совместимость с OpenAI',
'playground.embedding.handler.tips': 'Изменить высоту', 'playground.embedding.handler.tips': 'Изменить высоту',
'playground.embedding.pcatips1': 'PCA используется для визуализации эмбеддингов путём снижения размерности.', 'playground.embedding.pcatips1':
'playground.embedding.pcatips2': 'Близкие точки означают схожесть документов.', 'PCA используется для визуализации эмбеддингов путём снижения размерности.',
'playground.embedding.pcatips2':
'Близкие точки означают схожесть документов.',
'playground.audio.button.play': 'Воспроизвести', 'playground.audio.button.play': 'Воспроизвести',
'playground.audio.button.download': 'Скачать', 'playground.audio.button.download': 'Скачать',
'playground.audio.button.stop': 'Остановить', 'playground.audio.button.stop': 'Остановить',
@@ -105,13 +117,17 @@ export default {
'playground.audio.button.fast': 'Ускорить', 'playground.audio.button.fast': 'Ускорить',
'playground.audio.button.slow': 'Замедлить', 'playground.audio.button.slow': 'Замедлить',
'playground.audio.generating': 'Генерация', 'playground.audio.generating': 'Генерация',
'playgorund.audio.voice.error': 'Голоса недоступны. Модель инициализируется. Обновите через некоторое время.', 'playgorund.audio.voice.error':
'playground.params.size.description': 'Максимальный размер изображения зависит от параметров модели. <a href="https://github.com/gpustack/llama-box" target="_blank">Подробнее</a>', 'Голоса недоступны. Модель инициализируется. Обновите через некоторое время.',
'playground.params.size.description':
'Максимальный размер изображения зависит от параметров модели. <a href="https://github.com/gpustack/llama-box" target="_blank">Подробнее</a>',
'playground.documents.verify.embedding': 'Добавьте минимум два текста.', 'playground.documents.verify.embedding': 'Добавьте минимум два текста.',
'playground.documents.verify.rerank': 'Документы не могут быть пустыми.', 'playground.documents.verify.rerank': 'Документы не могут быть пустыми.',
'playground.image.guidance.tip': 'Уровень контроля: влияет на качество и разнообразие изображений.', 'playground.image.guidance.tip':
'Уровень контроля: влияет на качество и разнообразие изображений.',
'playground.image.cfg_scale.tip': 'Уровень соответствия промпту.', 'playground.image.cfg_scale.tip': 'Уровень соответствия промпту.',
'playground.image.strength.tip': 'Чем выше значение — тем сильнее изменения исходного изображения.', 'playground.image.strength.tip':
'Чем выше значение — тем сильнее изменения исходного изображения.',
'playground.image.edit.tips': 'Перетащите изображение для загрузки', 'playground.image.edit.tips': 'Перетащите изображение для загрузки',
'playground.image.saveMask': 'Сохранить маску', 'playground.image.saveMask': 'Сохранить маску',
'playground.image.negativeMask': 'Негативная маска', 'playground.image.negativeMask': 'Негативная маска',
@@ -123,16 +139,18 @@ export default {
'playground.chat.aithought': 'Рассуждение (CoT)', 'playground.chat.aithought': 'Рассуждение (CoT)',
'playground.chat.thinking': 'Рассуждение...', 'playground.chat.thinking': 'Рассуждение...',
'playground.image.mask.uploaded': 'Маска загружена', 'playground.image.mask.uploaded': 'Маска загружена',
'playground.image.mask.upload': 'Маска загрузки: Дополнительное редактирование запрещено после загрузки.', 'playground.image.mask.upload':
'Маска загрузки: Дополнительное редактирование запрещено после загрузки.',
'playground.params.frequency_penalty.tips': `Число от -2.0 до 2.0. Положительные значения снижают вероятность повторения токенов, уже часто встречающихся в тексте, уменьшая склонность модели дословно повторять одни и те же фразы.`, 'playground.params.frequency_penalty.tips': `Число от -2.0 до 2.0. Положительные значения снижают вероятность повторения токенов, уже часто встречающихся в тексте, уменьшая склонность модели дословно повторять одни и те же фразы.`,
'playground.params.presence_penalty.tips': `Число от -2.0 до 2.0. Положительные значения снижают вероятность повторения любых токенов, присутствующих в тексте, повышая склонность модели к обсуждению новых тем.`, 'playground.params.presence_penalty.tips': `Число от -2.0 до 2.0. Положительные значения снижают вероятность повторения любых токенов, присутствующих в тексте, повышая склонность модели к обсуждению новых тем.`,
'playground.image.origin': 'Оригинал', 'playground.image.origin': 'Оригинал',
'playground.image.mask': 'Маска', 'playground.image.mask': 'Маска',
'playground.image.negativeMask.tips': '1. После выделения области создание маски станет недоступным; поэтому сначала нарисуйте маску, а затем активируйте опцию. \n 2. После загрузки изображения маски создание новых масок невозможно.' 'playground.image.negativeMask.tips':
'1. После выделения области создание маски станет недоступным; поэтому сначала нарисуйте маску, а затем активируйте опцию. \n 2. После загрузки изображения маски создание новых масок невозможно.',
'playground.model.noavailable.tips2':
'If the expected model isnt showing up, make sure its running and correctly categorized. If the category is incorrect, you can manually adjust it in the models settings.'
}; };
// ========== To-Do: Translate Keys (Remove After Translation) ========== // ========== To-Do: Translate Keys (Remove After Translation) ==========
// 1. 'playground.model.noavailable.tips2'
// ========== End of To-Do List ========== // ========== End of To-Do List ==========
+11 -9
View File
@@ -13,21 +13,21 @@ export default {
'你可以使用以下代码将当前的提示和设置集成到你的应用程序中。', '你可以使用以下代码将当前的提示和设置集成到你的应用程序中。',
'playground.completion': '补全', 'playground.completion': '补全',
'playground.prompt': '提示', 'playground.prompt': '提示',
'playground.timeToFirstToken': '输出首个 token 时间', 'playground.timeToFirstToken': '输出首个 Token 时间',
'playground.timePerOutputToken': '生成每个 token 时间', 'playground.timePerOutputToken': '生成每个 Token 时间',
'playground.tokenusage': 'Token 使用量', 'playground.tokenusage': 'Token 使用量',
'models.openinplayground': '打开试验场', 'models.openinplayground': '打开试验场',
'playground.tokenoutput': '输出', 'playground.tokenoutput': '输出',
'playground.params.temperature.tips': 'playground.params.temperature.tips':
'控制随机性:降低温度会导致更少的随机完成。当温度接近零时,模型将变得确定性和重复性。', '控制随机性:降低温度会导致更少的随机完成。当温度接近零时,模型将变得确定性和重复性。',
'playground.params.maxtokens.tips': 'playground.params.maxtokens.tips':
'生成的最大 token 数。输入的 token 和生成的 token 的总长度受模型上下文长度的限制。', '生成的最大 Token 数。输入的 Token 和生成的 Token 的总长度受模型上下文长度的限制。',
'playground.params.topp.tips': 'playground.params.topp.tips':
'通过核心采样控制多样性:0.5 表示考虑所有基于概率权重选项的一半。', '通过核心采样控制多样性:0.5 表示考虑所有基于概率权重选项的一半。',
'playground.params.seed.tips': 'playground.params.seed.tips':
'如果指定,我们的系统将尽最大努力进行确定性采样,以便使用相同 seed 和参数的重复请求应返回相同的结果。', '如果指定,系统将尽最大努力进行确定性采样,以便使用相同 Seed 和参数的重复请求应返回相同的结果。',
'playground.params.stop.tips': 'playground.params.stop.tips':
'停止序列是一个预定义或用户指定的文本字符串,当这些序列出现时,它会提示 AI 停止生成后续的 token', '停止序列是一个预定义或用户指定的文本字符串,当这些序列出现时,它会提示 AI 停止生成后续的 Token',
'playground.viewcode.tips': 'playground.viewcode.tips':
'{here} 查看 API 密钥。您应该使用环境变量或密钥管理工具将您的密钥暴露给您的应用程序。', '{here} 查看 API 密钥。您应该使用环境变量或密钥管理工具将您的密钥暴露给您的应用程序。',
'playground.viewcode.here': '这里', 'playground.viewcode.here': '这里',
@@ -122,10 +122,10 @@ export default {
'图片生成的最大尺寸受控于模型的部署参数。<a href="https://github.com/gpustack/llama-box" target="_blank">参考文档</a>', '图片生成的最大尺寸受控于模型的部署参数。<a href="https://github.com/gpustack/llama-box" target="_blank">参考文档</a>',
'playground.documents.verify.embedding': '至少输入两条文本', 'playground.documents.verify.embedding': '至少输入两条文本',
'playground.documents.verify.rerank': '文档不能为空', 'playground.documents.verify.rerank': '文档不能为空',
'playground.image.guidance.tip': '引导比例,影响图片的质量和多样性', 'playground.image.guidance.tip': '引导比例,影响图片的质量和多样性',
'playground.image.cfg_scale.tip': 'playground.image.cfg_scale.tip':
'无分类器引导比例,影响图片的对Prompt的贴合度', '无分类器引导比例,影响图片的对 Prompt 的贴合度',
'playground.image.strength.tip': '值越高,它对原图的修改越大', 'playground.image.strength.tip': '值越高,它对原图的修改越大',
'playground.image.edit.tips': '点击或拖动图片到此区域上传', 'playground.image.edit.tips': '点击或拖动图片到此区域上传',
'playground.image.saveMask': '保存遮罩', 'playground.image.saveMask': '保存遮罩',
'playground.image.negativeMask': '反向遮罩', 'playground.image.negativeMask': '反向遮罩',
@@ -143,5 +143,7 @@ export default {
'playground.image.origin': '原图', 'playground.image.origin': '原图',
'playground.image.mask': '遮罩', 'playground.image.mask': '遮罩',
'playground.image.negativeMask.tips': 'playground.image.negativeMask.tips':
'1. 选择后,将不可再绘制遮罩;因此,你应该先绘制遮罩然后再勾选.\n 2. 当上传了遮罩图片,将不可再生成遮罩' '1. 选择后,将不可再绘制遮罩;因此,你应该先绘制遮罩然后再勾选.\n 2. 当上传了遮罩图片,将不可再生成遮罩',
'playground.model.noavailable.tips2':
'若预期的模型未显示,请检查模型是否已正常运行并被正确分类。如分类不正确,请编辑模型并手动调整其类别。'
}; };
@@ -19,7 +19,7 @@ import {
queryHuggingfaceModelFiles, queryHuggingfaceModelFiles,
queryModelScopeModelFiles queryModelScopeModelFiles
} from '../apis'; } from '../apis';
import { modelSourceMap } from '../config'; import { backendOptionsMap, modelSourceMap } from '../config';
import '../style/hf-model-file.less'; import '../style/hf-model-file.less';
import ModelFileItem from './model-file-item'; import ModelFileItem from './model-file-item';
import TitleWrapper from './title-wrapper'; import TitleWrapper from './title-wrapper';
@@ -228,6 +228,7 @@ const HFModelFile: React.FC<HFModelFileProps> = forwardRef((props, ref) => {
try { try {
const evaluateFileList = list.map((item: any) => { const evaluateFileList = list.map((item: any) => {
return { return {
backend: backendOptionsMap.llamaBox,
source: modelSource, source: modelSource,
...(modelSource === modelSourceMap.huggingface_value ...(modelSource === modelSourceMap.huggingface_value
? { ? {
+12 -1
View File
@@ -207,8 +207,19 @@ const SearchModel: React.FC<SearchInputProps> = (props) => {
try { try {
const repoList = list.map((item) => { const repoList = list.map((item) => {
const res = handleRecognizeAudioModel(item, modelSource); const res = handleRecognizeAudioModel(item, modelSource);
let backendObj = {};
if (res.isAudio) {
backendObj = {
backend: backendOptionsMap.voxBox
};
} else if (item.isGGUF) {
// backendObj = {
// backend: backendOptionsMap.llamaBox
// };
}
return { return {
...(res.isAudio ? { backend: backendOptionsMap.voxBox } : {}), ...backendObj,
source: modelSource, source: modelSource,
...(modelSource === modelSourceMap.huggingface_value ...(modelSource === modelSourceMap.huggingface_value
? { ? {
+5 -4
View File
@@ -431,10 +431,6 @@ export const useCheckCompatibility = () => {
const { scheduleType } = allValues; const { scheduleType } = allValues;
const gpuIds = allValues.gpu_selector?.gpu_ids || []; const gpuIds = allValues.gpu_selector?.gpu_ids || [];
if (scheduleType === 'manual') {
return !gpuIds.length;
}
const noLocalValue = const noLocalValue =
allValues.source === modelSourceMap.local_path_value && allValues.source === modelSourceMap.local_path_value &&
!allValues.local_path; !allValues.local_path;
@@ -443,6 +439,10 @@ export const useCheckCompatibility = () => {
allValues.source === modelSourceMap.ollama_library_value && allValues.source === modelSourceMap.ollama_library_value &&
!allValues.ollama_library_model_name; !allValues.ollama_library_model_name;
if (scheduleType === 'manual') {
return !gpuIds.length || noLocalValue || noOllamaValue;
}
return noLocalValue || noOllamaValue; return noLocalValue || noOllamaValue;
}; };
@@ -455,6 +455,7 @@ export const useCheckCompatibility = () => {
if (_.isEqual(cacheFormValuesRef.current, allValues)) { if (_.isEqual(cacheFormValuesRef.current, allValues)) {
return; return;
} }
if (checkRequiredValue(allValues)) { if (checkRequiredValue(allValues)) {
setWarningStatus({ setWarningStatus({
show: false, show: false,
@@ -174,6 +174,9 @@ const ParamsSettings: React.FC<ParamsSettingsProps> = forwardRef(
]} ]}
> >
<SealSelect <SealSelect
description={intl.formatMessage({
id: 'playground.model.noavailable.tips2'
})}
onChange={handleOnModelChange} onChange={handleOnModelChange}
showSearch={true} showSearch={true}
options={modelList} options={modelList}
+12 -1
View File
@@ -97,6 +97,13 @@ const PathWrapper = styled.div`
} }
`; `;
const OverlayScrollerWrapper = styled.div`
.overlay-scroller-wrapper {
padding-block: 0;
padding-inline: 6px 0;
}
`;
const ItemWrapper = styled.ul` const ItemWrapper = styled.ul`
max-width: 300px; max-width: 300px;
margin: 0; margin: 0;
@@ -331,7 +338,11 @@ const ModelFiles = () => {
return ( return (
<Tooltip <Tooltip
title={<OverlayScroller>{renderItem()}</OverlayScroller>} title={
<OverlayScrollerWrapper>
<OverlayScroller>{renderItem()}</OverlayScroller>
</OverlayScrollerWrapper>
}
overlayInnerStyle={{ width: 'max-content', maxWidth: 300 }} overlayInnerStyle={{ width: 'max-content', maxWidth: 300 }}
> >
<FilesTag color="purple" icon={<InfoCircleOutlined />}> <FilesTag color="purple" icon={<InfoCircleOutlined />}>
+2 -3
View File
@@ -246,8 +246,7 @@ const Workers: React.FC = () => {
style={{ style={{
display: 'flex', display: 'flex',
flexWrap: 'wrap', flexWrap: 'wrap',
gap: 6, gap: 6
maxWidth: 200
}} }}
> >
{_.map(record.labels, (value: any, key: string) => { {_.map(record.labels, (value: any, key: string) => {
@@ -255,7 +254,7 @@ const Workers: React.FC = () => {
<AutoTooltip <AutoTooltip
key={key} key={key}
className="m-r-0" className="m-r-0"
maxWidth={120} maxWidth={155}
style={{ style={{
paddingInline: 8, paddingInline: 8,
borderRadius: 12 borderRadius: 12