From 49364802c25479b982f0fd150bf013e8f93cdbc4 Mon Sep 17 00:00:00 2001 From: zhaoying Date: Wed, 25 Mar 2026 14:24:13 +0800 Subject: [PATCH] feat(web): model add volcano provider --- web/src/assets/images/model/volcano.png | Bin 0 -> 7312 bytes web/src/i18n/en.ts | 1 + web/src/i18n/zh.ts | 1 + web/src/views/ModelManagement/List.tsx | 8 ++++---- web/src/views/ModelManagement/Square.tsx | 4 ++-- .../components/CustomModelModal.tsx | 4 ++-- .../components/ModelImplement/SubModelModal.tsx | 4 ++-- .../components/ModelImplement/index.tsx | 6 +++--- .../components/ModelListDetail.tsx | 2 +- web/src/views/ModelManagement/index.tsx | 2 +- web/src/views/ModelManagement/utils.ts | 6 ++++-- 11 files changed, 21 insertions(+), 17 deletions(-) create mode 100644 web/src/assets/images/model/volcano.png diff --git a/web/src/assets/images/model/volcano.png b/web/src/assets/images/model/volcano.png new file mode 100644 index 0000000000000000000000000000000000000000..9aeb3bf317d99307c66d494ccaeb5f713062406f GIT binary patch literal 7312 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 X>8RiOhtKz(O;P)UM{KJ|esTW?Xc - -
{t(`modelNew.${item.provider}`)}
+ +
{String(item.provider).charAt(0).toUpperCase() + String(item.provider).slice(1)}
- {item.tags.map(tag => {t(`modelNew.${tag}`)})} + {item.tags.map(tag => {t(`modelNew.${tag}`)})} } isNeedTooltip={false} footer={ diff --git a/web/src/views/ModelManagement/Square.tsx b/web/src/views/ModelManagement/Square.tsx index be59101c..b1686372 100644 --- a/web/src/views/ModelManagement/Square.tsx +++ b/web/src/views/ModelManagement/Square.tsx @@ -74,7 +74,7 @@ const ModelSquare = forwardRef (({ query }, ref) => { 'rb:text-[#171719]': activeProvider === vo.provider, })} onClick={() => setActiveProvider(vo.provider)} - >{t(`modelNew.${vo.provider}`)} + >{String(vo.provider).charAt(0).toUpperCase() + String(vo.provider).slice(1)} ))} {list.filter(vo => vo.provider === activeProvider).map(vo => ( @@ -105,7 +105,7 @@ const ModelSquare = forwardRef (({ query }, ref) => { } isNeedTooltip={false} footer={ - @{t(`modelNew.${vo.provider}`)} + @{String(item.provider).charAt(0).toUpperCase() + String(item.provider).slice(1)} {item.add_count} } > diff --git a/web/src/views/ModelManagement/components/CustomModelModal.tsx b/web/src/views/ModelManagement/components/CustomModelModal.tsx index d6784c60..abede886 100644 --- a/web/src/views/ModelManagement/components/CustomModelModal.tsx +++ b/web/src/views/ModelManagement/components/CustomModelModal.tsx @@ -2,7 +2,7 @@ * @Author: ZhaoYing * @Date: 2026-02-03 16:49:28 * @Last Modified by: ZhaoYing - * @Last Modified time: 2026-03-25 12:27:33 + * @Last Modified time: 2026-03-25 14:07:10 */ /** * Custom Model Modal @@ -210,7 +210,7 @@ const CustomModelModal = forwardRef( url={modelProviderUrl} hasAll={false} disabled={isEdit} - format={(items) => items.map((item) => ({ label: t(`modelNew.${item}`), value: String(item) }))} + format={(items) => items.map((item) => ({ label: String(item).charAt(0).toUpperCase() + String(item).slice(1), value: String(item) }))} /> diff --git a/web/src/views/ModelManagement/components/ModelImplement/SubModelModal.tsx b/web/src/views/ModelManagement/components/ModelImplement/SubModelModal.tsx index b2b44bf3..cc33dec2 100644 --- a/web/src/views/ModelManagement/components/ModelImplement/SubModelModal.tsx +++ b/web/src/views/ModelManagement/components/ModelImplement/SubModelModal.tsx @@ -2,7 +2,7 @@ * @Author: ZhaoYing * @Date: 2026-02-03 16:49:20 * @Last Modified by: ZhaoYing - * @Last Modified time: 2026-03-04 11:51:01 + * @Last Modified time: 2026-03-25 14:07:08 */ /** * Sub-Model Modal @@ -178,7 +178,7 @@ const SubModelModal = forwardRef(({ url={modelProviderUrl} hasAll={false} format={(items) => items.map((item) => ({ - label: t(`modelNew.${typeof item === 'object' ? item.value : item}`), + label: String(typeof item === 'object' ? item.value : item).charAt(0).toUpperCase() + String(typeof item === 'object' ? item.value : item).slice(1), value: typeof item === 'object' ? item.value : item }))} onChange={(value) => handleChangeProvider(value)} diff --git a/web/src/views/ModelManagement/components/ModelImplement/index.tsx b/web/src/views/ModelManagement/components/ModelImplement/index.tsx index f665f745..9ee4ff84 100644 --- a/web/src/views/ModelManagement/components/ModelImplement/index.tsx +++ b/web/src/views/ModelManagement/components/ModelImplement/index.tsx @@ -1,8 +1,8 @@ /* * @Author: ZhaoYing * @Date: 2026-02-03 16:49:12 - * @Last Modified by: ZhaoYing - * @Last Modified time: 2026-02-03 16:49:12 + * @Last Modified by: ZhaoYing + * @Last Modified time: 2026-03-25 14:14:14 */ /** * Model Implementation Component @@ -106,7 +106,7 @@ const ModelImplement: FC = ({ type, value, onChange }) => { >
{item.api_key}
- {t(`modelNew.${item.provider}`)} + {String(item.provider).charAt(0).toUpperCase() + String(item.provider).slice(1)} ) })} diff --git a/web/src/views/ModelManagement/components/ModelListDetail.tsx b/web/src/views/ModelManagement/components/ModelListDetail.tsx index d5d09cab..a3b9bbc0 100644 --- a/web/src/views/ModelManagement/components/ModelListDetail.tsx +++ b/web/src/views/ModelManagement/components/ModelListDetail.tsx @@ -111,7 +111,7 @@ const ModelListDetail = forwardRef(({ return ( {t(`modelNew.${data.provider}`)} {t('modelNew.modelList')} ({list.length}{t('modelNew.item')})} + title={<>{String(data.provider).charAt(0).toUpperCase() + String(data.provider).slice(1)} {t('modelNew.modelList')} ({list.length}{t('modelNew.item')})} open={open} onClose={handleClose} > diff --git a/web/src/views/ModelManagement/index.tsx b/web/src/views/ModelManagement/index.tsx index b5fa6669..461f7cd5 100644 --- a/web/src/views/ModelManagement/index.tsx +++ b/web/src/views/ModelManagement/index.tsx @@ -111,7 +111,7 @@ const tabKeys = ['group', 'list', 'square'] items.map((item) => ({ label: t(`modelNew.${item}`), value: String(item) }))} + format={(items) => items.map((item) => ({ label: String(item).charAt(0).toUpperCase() + String(item).slice(1), value: String(item) }))} className="rb:w-40" allowClear={true} placeholder={t('modelNew.provider')} diff --git a/web/src/views/ModelManagement/utils.ts b/web/src/views/ModelManagement/utils.ts index bf44367f..23e1e4f3 100644 --- a/web/src/views/ModelManagement/utils.ts +++ b/web/src/views/ModelManagement/utils.ts @@ -2,7 +2,7 @@ * @Author: ZhaoYing * @Date: 2026-02-03 16:50:22 * @Last Modified by: ZhaoYing - * @Last Modified time: 2026-02-27 10:22:46 + * @Last Modified time: 2026-03-25 14:03:13 */ /** * Utility functions for Model Management @@ -14,6 +14,7 @@ import gpustackIcon from '@/assets/images/model/gpustack.png' import ollamaIcon from '@/assets/images/model/ollama.svg' import openaiIcon from '@/assets/images/model/openai.svg' import xinferenceIcon from '@/assets/images/model/xinference.svg' +import volcanoIcon from '@/assets/images/model/volcano.png' /** * Provider icon mapping @@ -24,7 +25,8 @@ export const ICONS = { gpustack: gpustackIcon, ollama: ollamaIcon, openai: openaiIcon, - xinference: xinferenceIcon + xinference: xinferenceIcon, + volcano: volcanoIcon, } /**