From e8e982559d7ec6ec9f4a9eb9e7c67b5c14ea3ae6 Mon Sep 17 00:00:00 2001 From: jialin Date: Mon, 19 Jan 2026 16:16:32 +0800 Subject: [PATCH] chore: providers ux --- src/components/icon-font/icons.ts | 4 +- src/locales/en-US/no-result.ts | 3 + src/locales/en-US/provider.ts | 3 +- src/locales/ja-JP/no-result.ts | 3 + src/locales/ja-JP/provider.ts | 3 +- src/locales/ru-RU/no-result.ts | 6 ++ src/locales/ru-RU/provider.ts | 3 +- src/locales/zh-CN/menu.ts | 3 +- src/locales/zh-CN/no-result.ts | 6 +- src/locales/zh-CN/provider.ts | 9 +- .../components => _components}/model-tag.tsx | 4 +- .../llmodels/components/catalog-item.tsx | 2 +- src/pages/llmodels/components/model-item.tsx | 2 +- .../llmodels/hooks/use-models-columns.tsx | 2 +- .../components/provider-models.tsx | 9 +- .../maas-provider/config/form-context.ts | 19 ++++ src/pages/maas-provider/config/index.ts | 9 +- src/pages/maas-provider/config/mock.ts | 13 ++- src/pages/maas-provider/config/types.ts | 1 + .../maas-provider/forms/advance-config.tsx | 9 +- src/pages/maas-provider/forms/index.tsx | 99 ++++++++++++------- .../maas-provider/forms/proxy_config.tsx | 59 +++++++++++ .../maas-provider/forms/supported-models.tsx | 24 +++-- .../hooks/use-create-provider.ts | 13 ++- .../hooks/use-provider-columns.tsx | 21 ++-- src/pages/maas-provider/index.tsx | 54 ++++------ src/pages/model-access/forms/basic.tsx | 31 ++++++ src/pages/model-access/forms/endpoints.tsx | 38 +++++++ src/pages/model-access/forms/index.tsx | 95 +++++++++++++++++- src/pages/model-access/forms/meta-data.tsx | 38 +++++++ .../model-access/hooks/use-create-access.ts | 10 +- src/pages/model-access/index.tsx | 2 +- 32 files changed, 469 insertions(+), 128 deletions(-) rename src/pages/{llmodels/components => _components}/model-tag.tsx (94%) create mode 100644 src/pages/maas-provider/config/form-context.ts create mode 100644 src/pages/maas-provider/forms/proxy_config.tsx create mode 100644 src/pages/model-access/forms/basic.tsx create mode 100644 src/pages/model-access/forms/endpoints.tsx create mode 100644 src/pages/model-access/forms/meta-data.tsx diff --git a/src/components/icon-font/icons.ts b/src/components/icon-font/icons.ts index b35be6e4..9f84e967 100644 --- a/src/components/icon-font/icons.ts +++ b/src/components/icon-font/icons.ts @@ -1,6 +1,7 @@ import IconFont from '@/components/icon-font'; import { ApiOutlined, + CopyOutlined, DeleteOutlined, DockerOutlined, DownloadOutlined, @@ -62,7 +63,8 @@ const icons = { CaptivePortal: React.createElement(IconFont, { type: 'icon-captive_portal' }), StarOutlined: React.createElement(StarOutlined), Charger: React.createElement(IconFont, { type: 'icon-charger' }), - Disabled: React.createElement(IconFont, { type: 'icon-disabled' }) + Disabled: React.createElement(IconFont, { type: 'icon-disabled' }), + CopyOutlined: React.createElement(CopyOutlined) }; export default icons; diff --git a/src/locales/en-US/no-result.ts b/src/locales/en-US/no-result.ts index 3d6eccec..2b95bdc0 100644 --- a/src/locales/en-US/no-result.ts +++ b/src/locales/en-US/no-result.ts @@ -46,6 +46,9 @@ export default { 'noresult.provider.title': 'No Providers', 'noresult.provider.subTitle': 'No providers have been added yet.', 'noresult.provider.nofound': 'No matching providers found.', + 'noresult.providers.title': 'No Providers', + 'noresult.providers.subTitle': 'No providers have been added yet.', + 'noresult.providers.nofound': 'No matching providers found.', 'noresult.accesses.title': 'No Accesses', 'noresult.accesses.subTitle': 'No accesses have been added yet.', 'noresult.accesses.nofound': 'No matching accesses found.' diff --git a/src/locales/en-US/provider.ts b/src/locales/en-US/provider.ts index 9aa637bb..2cd52ddc 100644 --- a/src/locales/en-US/provider.ts +++ b/src/locales/en-US/provider.ts @@ -2,5 +2,6 @@ export default { 'providers.title': 'Providers', 'providers.button.add': 'Add Provider', 'providers.table.providerName': 'Provider', - 'providers.table.modelsCounts': 'Models Count' + 'providers.table.modelsCounts': 'Models Count', + 'providers.table.proxy': 'Proxy' }; diff --git a/src/locales/ja-JP/no-result.ts b/src/locales/ja-JP/no-result.ts index 3d6eccec..2b95bdc0 100644 --- a/src/locales/ja-JP/no-result.ts +++ b/src/locales/ja-JP/no-result.ts @@ -46,6 +46,9 @@ export default { 'noresult.provider.title': 'No Providers', 'noresult.provider.subTitle': 'No providers have been added yet.', 'noresult.provider.nofound': 'No matching providers found.', + 'noresult.providers.title': 'No Providers', + 'noresult.providers.subTitle': 'No providers have been added yet.', + 'noresult.providers.nofound': 'No matching providers found.', 'noresult.accesses.title': 'No Accesses', 'noresult.accesses.subTitle': 'No accesses have been added yet.', 'noresult.accesses.nofound': 'No matching accesses found.' diff --git a/src/locales/ja-JP/provider.ts b/src/locales/ja-JP/provider.ts index 9aa637bb..2cd52ddc 100644 --- a/src/locales/ja-JP/provider.ts +++ b/src/locales/ja-JP/provider.ts @@ -2,5 +2,6 @@ export default { 'providers.title': 'Providers', 'providers.button.add': 'Add Provider', 'providers.table.providerName': 'Provider', - 'providers.table.modelsCounts': 'Models Count' + 'providers.table.modelsCounts': 'Models Count', + 'providers.table.proxy': 'Proxy' }; diff --git a/src/locales/ru-RU/no-result.ts b/src/locales/ru-RU/no-result.ts index 38182321..d25b3cad 100644 --- a/src/locales/ru-RU/no-result.ts +++ b/src/locales/ru-RU/no-result.ts @@ -47,6 +47,9 @@ export default { 'noresult.provider.title': 'No Providers', 'noresult.provider.subTitle': 'No providers have been added yet.', 'noresult.provider.nofound': 'No matching providers found.', + 'noresult.providers.title': 'No Providers', + 'noresult.providers.subTitle': 'No providers have been added yet.', + 'noresult.providers.nofound': 'No matching providers found.', 'noresult.accesses.title': 'No Accesses', 'noresult.accesses.subTitle': 'No accesses have been added yet.', 'noresult.accesses.nofound': 'No matching accesses found.' @@ -63,6 +66,9 @@ export default { // 5. 'noresult.provider.title': 'No Providers', // 6. 'noresult.provider.subTitle': 'No providers have been added yet.', // 7. 'noresult.provider.nofound': 'No matching providers found.', +// 5. 'noresult.providers.title': 'No Providers', +// 6. 'noresult.providers.subTitle': 'No providers have been added yet.', +// 7. 'noresult.providers.nofound': 'No matching providers found.', // 8. 'noresult.accesses.title': 'No Accesses', // 9. 'noresult.accesses.subTitle': 'No accesses have been added yet.', // 10. 'noresult.accesses.nofound': 'No matching accesses found.' diff --git a/src/locales/ru-RU/provider.ts b/src/locales/ru-RU/provider.ts index 9aa637bb..2cd52ddc 100644 --- a/src/locales/ru-RU/provider.ts +++ b/src/locales/ru-RU/provider.ts @@ -2,5 +2,6 @@ export default { 'providers.title': 'Providers', 'providers.button.add': 'Add Provider', 'providers.table.providerName': 'Provider', - 'providers.table.modelsCounts': 'Models Count' + 'providers.table.modelsCounts': 'Models Count', + 'providers.table.proxy': 'Proxy' }; diff --git a/src/locales/zh-CN/menu.ts b/src/locales/zh-CN/menu.ts index 47346047..728d1375 100644 --- a/src/locales/zh-CN/menu.ts +++ b/src/locales/zh-CN/menu.ts @@ -15,8 +15,7 @@ export default { 'menu.models.userModels': '我的模型', 'menu.models.benchmark': '基准测试', 'menu.models.benchmarkDetail': '基准测试详情', - 'menu.models.provider': '渠道', - 'menu.models.providers': '渠道', + 'menu.models.providers': '提供商', 'menu.models.accesses': '接入', 'menu.modelCatalog': '模型库', 'menu.models.catalog': '模型库', diff --git a/src/locales/zh-CN/no-result.ts b/src/locales/zh-CN/no-result.ts index 0dccbc48..e14e338e 100644 --- a/src/locales/zh-CN/no-result.ts +++ b/src/locales/zh-CN/no-result.ts @@ -41,9 +41,9 @@ export default { 'noresult.benchmark.title': '暂无基准测试', 'noresult.benchmark.subTitle': '尚未添加任何基准测试。', 'noresult.benchmark.nofound': '未找到匹配的基准测试', - 'noresult.provider.title': '暂无渠道', - 'noresult.provider.subTitle': '尚未添加任何渠道。', - 'noresult.provider.nofound': '未找到匹配的渠道', + 'noresult.providers.title': '暂无提供商', + 'noresult.providers.subTitle': '尚未添加任何提供商。', + 'noresult.providers.nofound': '未找到匹配的提供商', 'noresult.accesses.title': '暂无接入', 'noresult.accesses.subTitle': '尚未添加任何接入。', 'noresult.accesses.nofound': '未找到匹配的接入' diff --git a/src/locales/zh-CN/provider.ts b/src/locales/zh-CN/provider.ts index ccbe338f..58161117 100644 --- a/src/locales/zh-CN/provider.ts +++ b/src/locales/zh-CN/provider.ts @@ -1,6 +1,7 @@ export default { - 'providers.title': '渠道', - 'providers.button.add': '添加渠道', - 'providers.table.providerName': '渠道', - 'providers.table.modelsCounts': '模型数量' + 'providers.title': '提供商', + 'providers.button.add': '添加提供商', + 'providers.table.providerName': '提供商', + 'providers.table.modelsCounts': '模型数量', + 'providers.table.proxy': '代理' }; diff --git a/src/pages/llmodels/components/model-tag.tsx b/src/pages/_components/model-tag.tsx similarity index 94% rename from src/pages/llmodels/components/model-tag.tsx rename to src/pages/_components/model-tag.tsx index e3eb8df5..8dee5275 100644 --- a/src/pages/llmodels/components/model-tag.tsx +++ b/src/pages/_components/model-tag.tsx @@ -5,7 +5,7 @@ import { WechatWorkOutlined } from '@ant-design/icons'; import { Tag } from 'antd'; -import { modelCategoriesMap } from '../config'; +import { modelCategoriesMap } from '../llmodels/config'; export const categoryConfig = { [modelCategoriesMap.reranker]: { @@ -53,7 +53,7 @@ const ModelTag: React.FC = ({ categoryKey, size }) => { return ( = () => { : 'gray' } > - {model.name} ( - {categoryOptions.find((item) => item.value === model.type)?.label}) + {model.name} + + {categoryConfig[model.type]?.icon} + ))} diff --git a/src/pages/maas-provider/config/form-context.ts b/src/pages/maas-provider/config/form-context.ts new file mode 100644 index 00000000..4e26046b --- /dev/null +++ b/src/pages/maas-provider/config/form-context.ts @@ -0,0 +1,19 @@ +import { PageActionType } from '@/config/types'; +import { createContext, useContext } from 'react'; + +interface FormContextProps { + providerType?: string; + action?: PageActionType; +} + +const FormContext = createContext({}); + +export const useFormContext = () => { + const context = useContext(FormContext); + if (!context) { + throw new Error('useFormContext must be used within a FormProvider'); + } + return context; +}; + +export default FormContext; diff --git a/src/pages/maas-provider/config/index.ts b/src/pages/maas-provider/config/index.ts index cd38826a..912198cc 100644 --- a/src/pages/maas-provider/config/index.ts +++ b/src/pages/maas-provider/config/index.ts @@ -44,8 +44,8 @@ export const maasProviderOptions = Object.entries(maasProviderValueMap).map( ); export const ProviderStatusValueMap: Record = { - Ready: 'Ready', - InActive: 'Inactive' + Ready: 'ready', + InActive: 'inactive' }; export const ProviderStatusLabelMap = { @@ -65,6 +65,11 @@ export const rowActionList = [ label: 'common.button.edit', icon: icons.EditOutlined }, + { + key: 'copy', + label: 'common.button.copy', + icon: icons.CopyOutlined + }, { key: 'delete', label: 'common.button.delete', diff --git a/src/pages/maas-provider/config/mock.ts b/src/pages/maas-provider/config/mock.ts index aa2004d9..89c26dbe 100644 --- a/src/pages/maas-provider/config/mock.ts +++ b/src/pages/maas-provider/config/mock.ts @@ -9,23 +9,26 @@ export const mockDataList: MaasProviderItem[] = [ models: 5, state_message: '', provider: 'doubao', + proxy_config: {}, builtIn: false }, { id: 2, models: 3, name: 'Qwen', - state: 'Inactive', + state: 'inactive', state_message: 'Provider is inactive', provider: 'qwen', + proxy_config: false, builtIn: true }, { id: 3, models: 8, name: 'OpenAI', - state: 'Ready', + state: 'ready', state_message: '', + proxy_config: null, provider: 'openai', builtIn: false }, @@ -33,18 +36,20 @@ export const mockDataList: MaasProviderItem[] = [ id: 4, models: 2, name: 'Deepseek', - state: 'Ready', + state: 'ready', state_message: '', provider: 'deepseek', + proxy_config: null, builtIn: false }, { id: 5, models: 4, name: 'Anthropic', - state: 'Inactive', + state: 'inactive', state_message: 'Provider is inactive', provider: 'anthropic', + proxy_config: {}, builtIn: true } ]; diff --git a/src/pages/maas-provider/config/types.ts b/src/pages/maas-provider/config/types.ts index 9f605b35..24ced421 100644 --- a/src/pages/maas-provider/config/types.ts +++ b/src/pages/maas-provider/config/types.ts @@ -7,6 +7,7 @@ export interface MaasProviderItem { state: string; state_message: string; provider: maasProviderType; + proxy_config?: any; builtIn: boolean; } diff --git a/src/pages/maas-provider/forms/advance-config.tsx b/src/pages/maas-provider/forms/advance-config.tsx index 0dc2cf08..6e849345 100644 --- a/src/pages/maas-provider/forms/advance-config.tsx +++ b/src/pages/maas-provider/forms/advance-config.tsx @@ -5,13 +5,14 @@ import { useIntl } from '@umijs/max'; import { Form } from 'antd'; import React, { forwardRef, useImperativeHandle } from 'react'; import { maasProviderType } from '../config'; +import ProxyConfig from './proxy_config'; const AdvanceConfig: React.FC<{ action: PageActionType; provider?: maasProviderType; ref?: any; }> = forwardRef(({ action, provider }, ref) => { - const [form] = Form.useForm(); + const form = Form.useFormInstance(); const intl = useIntl(); const editorRef = React.useRef(null); const [fileContent, setFileContent] = React.useState(''); @@ -28,7 +29,8 @@ const AdvanceConfig: React.FC<{ return ( <> -
+
+