diff --git a/frontend/packages/core/src/components/AIProviderSelect/index.tsx b/frontend/packages/core/src/components/AIProviderSelect/index.tsx index 6bed65be..5b9e28f4 100644 --- a/frontend/packages/core/src/components/AIProviderSelect/index.tsx +++ b/frontend/packages/core/src/components/AIProviderSelect/index.tsx @@ -25,10 +25,11 @@ interface AIProviderResponse { interface AIProviderSelectProps { value?: string onChange?: (value: string, provider: AIProvider) => void - style?: React.CSSProperties + style?: React.CSSProperties, + source?: 'ai_api' | 'ai_keys' } -const AIProviderSelect: React.FC = ({ value, onChange, style = { width: 200 } }) => { +const AIProviderSelect: React.FC = ({ value, onChange, source = 'ai', style = { width: 200 } }) => { const { t } = useTranslation() const [providers, setProviders] = useState([]) const [loading, setLoading] = useState(false) @@ -40,7 +41,7 @@ const AIProviderSelect: React.FC = ({ value, onChange, st if (isMounted) setLoading(true) try { const endpoint = 'simple/ai/providers/configured' - const response = await fetchData(endpoint, { method: 'GET', eoParams: { all: true} }) + const response = await fetchData(endpoint, { method: 'GET', ...(source === 'ai_api' ? { eoParams: { all: true } } : {}) }) const { code, data, msg } = response if (code === STATUS_CODE.SUCCESS) { const providers = data.providers.map((val) => ({ diff --git a/frontend/packages/core/src/index.css b/frontend/packages/core/src/index.css index fe0145b5..c912b574 100644 --- a/frontend/packages/core/src/index.css +++ b/frontend/packages/core/src/index.css @@ -752,6 +752,9 @@ p{ .custom-steps .ant-steps-item-content { margin-top: 0 !important; } +.custom-steps .ant-steps-item-content .ant-steps-item-description { + width: 138px !important; +} .ant-modal-body .pr-PAGE_INSIDE_X{ diff --git a/frontend/packages/core/src/pages/aiApis/index.tsx b/frontend/packages/core/src/pages/aiApis/index.tsx index c5cadf06..04db39bc 100644 --- a/frontend/packages/core/src/pages/aiApis/index.tsx +++ b/frontend/packages/core/src/pages/aiApis/index.tsx @@ -255,6 +255,7 @@ const ApiSettings: React.FC = () => {
{ setSelectedProvider(value) setProvider(option) diff --git a/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx b/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx index 58a93c2a..f3e0de23 100644 --- a/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx +++ b/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx @@ -151,7 +151,7 @@ const AiServiceInsideRouterCreate = () => { type: aiModel?.type }) as AiProviderDefaultConfig & { config: string } ) - aiModel?.type !== 'local' && getDefaultModelConfig(aiModel?.provider) + aiModel?.type !== 'local' && getDefaultModelConfig(aiModel?.provider, false) } else { message.error(msg || $t(RESPONSE_TIPS.error)) } @@ -160,7 +160,7 @@ const AiServiceInsideRouterCreate = () => { .finally(() => setLoading(false)) } - const getDefaultModelConfig = (provider?: string) => { + const getDefaultModelConfig = (provider?: string, resetDefaultLlm = true) => { fetchData>('ai/provider/llms', { method: 'GET', eoParams: { provider: provider ?? aiServiceInfo?.provider?.id }, @@ -170,19 +170,21 @@ const AiServiceInsideRouterCreate = () => { const { code, data, msg } = response if (code === STATUS_CODE.SUCCESS) { setLlmList(data.llms) - setDefaultLlm((prev) => { - const llmSetting = data.llms?.find( - (x: AiProviderLlmsItems) => x.id === (prev?.id ?? data.provider.defaultLlm) - ) - return { - ...prev, - defaultLlm: data.provider.defaultLlm, - provider: data.provider.id, - name: data.provider.name, - config: llmSetting?.config || '', - ...(llmSetting ?? {}) - } as AiProviderDefaultConfig & { config: string } - }) + if (resetDefaultLlm) { + setDefaultLlm((prev) => { + const llmSetting = data.llms?.find( + (x: AiProviderLlmsItems) => x.id === (prev?.id ?? data.provider.defaultLlm) + ) + return { + ...prev, + defaultLlm: data.provider.defaultLlm, + provider: data.provider.id, + name: data.provider.name, + config: llmSetting?.config || '', + ...(llmSetting ?? {}) + } as AiProviderDefaultConfig & { config: string } + }) + } } else { message.error(msg || $t(RESPONSE_TIPS.error)) } diff --git a/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterModelConfig.tsx b/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterModelConfig.tsx index 0b56a91b..006732de 100644 --- a/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterModelConfig.tsx +++ b/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterModelConfig.tsx @@ -97,7 +97,7 @@ const AiServiceRouterModelConfig = forwardRef { + const getLlmList = (provider: string, setDefaultValue = true) => { fetchData>('ai/provider/llms', { method: 'GET', eoParams: { provider }, @@ -139,10 +139,12 @@ const AiServiceRouterModelConfig = forwardRef x.id === data.provider.defaultLlm)?.config - }) + if (setDefaultValue && data.llms.length) { + form.setFieldsValue({ + id: data.provider.defaultLlm, + config: data.llms.find((x) => x.id === data.provider.defaultLlm)?.config + }) + } } else { message.error(msg || $t(RESPONSE_TIPS.error)) } diff --git a/frontend/packages/core/src/pages/aiSetting/LocalModelList.tsx b/frontend/packages/core/src/pages/aiSetting/LocalModelList.tsx index 7bdac68c..1ad6c662 100644 --- a/frontend/packages/core/src/pages/aiSetting/LocalModelList.tsx +++ b/frontend/packages/core/src/pages/aiSetting/LocalModelList.tsx @@ -114,7 +114,7 @@ const LocalModelList: React.FC = () => { normal: { text: '正常' }, deploying: { text: '部署中', className: 'text-[#2196f3] cursor-pointer' }, error: { text: '模型异常', className: 'text-[#ff4d4f]' }, - disabled: { text: '停用', className: 'text-[#999]' }, + disabled: { text: '停用' }, deploying_error: { text: '部署失败', className: 'text-[#ff4d4f] cursor-pointer' } }) @@ -318,7 +318,7 @@ const LocalModelList: React.FC = () => { render: (dom: React.ReactNode, record: ModelListData) => ( { }, { title: $t('默认模型'), + ellipsis: true, dataIndex: 'defaultLlm' }, { diff --git a/frontend/packages/core/src/pages/aiSetting/types.ts b/frontend/packages/core/src/pages/aiSetting/types.ts index 053e73f8..920de61d 100644 --- a/frontend/packages/core/src/pages/aiSetting/types.ts +++ b/frontend/packages/core/src/pages/aiSetting/types.ts @@ -13,6 +13,7 @@ export interface ModelListData { name: string logo: string defaultLlm: string | undefined + provider?: string modelMode?: string status: ModelStatus state?: ModelDeployStatus diff --git a/frontend/packages/core/src/pages/guide/LocalAiDeploy.tsx b/frontend/packages/core/src/pages/guide/LocalAiDeploy.tsx index c9e42636..64d3fc3c 100644 --- a/frontend/packages/core/src/pages/guide/LocalAiDeploy.tsx +++ b/frontend/packages/core/src/pages/guide/LocalAiDeploy.tsx @@ -57,9 +57,12 @@ const LocalAiDeploy = forwardRef((props: any, ref: any * @returns */ const deployPopularModel = async (id: string) => { - await deployLocalModel({ + const response = await deployLocalModel({ modelID: id }) + if (response.code !== STATUS_CODE.SUCCESS) { + return + } onClose?.() } @@ -84,10 +87,13 @@ const LocalAiDeploy = forwardRef((props: any, ref: any form .validateFields() .then(async (value) => { - await deployLocalModel({ + const response = await deployLocalModel({ modelID: value.model, team: value.team }) + if (response.code !== STATUS_CODE.SUCCESS) { + return + } resolve(true) }) .catch((errorInfo) => reject(errorInfo)) diff --git a/frontend/packages/core/src/pages/guide/deployModelUtil.ts b/frontend/packages/core/src/pages/guide/deployModelUtil.ts index c08b566b..a0477234 100644 --- a/frontend/packages/core/src/pages/guide/deployModelUtil.ts +++ b/frontend/packages/core/src/pages/guide/deployModelUtil.ts @@ -23,6 +23,7 @@ const useDeployLocalModel = () => { const { code, msg } = response if (code === STATUS_CODE.SUCCESS) { message.success(msg || $t(RESPONSE_TIPS.success)) + return response } else { message.error(msg || $t(RESPONSE_TIPS.error)) } diff --git a/frontend/packages/core/src/pages/loadBalancing/index.tsx b/frontend/packages/core/src/pages/loadBalancing/index.tsx index 42f1b598..0ce69cf4 100644 --- a/frontend/packages/core/src/pages/loadBalancing/index.tsx +++ b/frontend/packages/core/src/pages/loadBalancing/index.tsx @@ -14,7 +14,6 @@ import AddLoadBalancingModel from './AddModel' const LoadBalancingPage = () => { const pageListRef = useRef(null) const [searchWord, setSearchWord] = useState('') - const [columns, setColumns] = useState[]>([]) const { modal, message } = App.useApp() const [apiKeys, setApiKeys] = useState([]) const addModelRef = useRef() @@ -150,125 +149,120 @@ const LoadBalancingPage = () => { }) } - /** + /** * 设置表格列 */ - const setTableColumns = () => { - setColumns([ - { - title: '', - dataIndex: 'drag', - width: '40px' - }, - { - title: $t('优先级'), - dataIndex: 'priority', - width: 80, - ellipsis: true, - key: 'priority' - }, - { - title: $t('模型'), - dataIndex: ['provider', 'name'], - ellipsis: true, - width: 100, - key: 'provider', - render: (dom: React.ReactNode, record: LoadBalancingItems) => ( - - {record.provider?.name} / {record.model?.name} - - ) - }, - { - title: $t('类型'), - dataIndex: 'type', - width: 100, - ellipsis: true, - key: 'type', - render: (dom: React.ReactNode, record: LoadBalancingItems) => ( - {record.type === 'online' ? $t('线上模型') : $t('本地模型')} - ) - }, - { - title: $t('状态'), - dataIndex: 'state', - width: 120, - ellipsis: true, - key: 'state', - render: (dom: React.ReactNode, record: LoadBalancingItems) => ( - {statusEnum[record.state]?.text || '-'} - ) - }, - { - title: $t('Apis'), - dataIndex: 'apiCount', - ellipsis: true, - width: 80, - key: 'apiCount', - render: (dom: React.ReactNode, record: LoadBalancingItems) => ( - - - {record.apiCount || '0'} - - - ) - }, - { - title: $t('Keys'), - dataIndex: 'keyCount', - ellipsis: true, - width: 80, - key: 'keyCount', - render: (dom: React.ReactNode, record: LoadBalancingItems) => ( - - - {record.keyCount || '0'} - - - ) - }, - { - title: '', - key: 'option', - btnNums: 1, - width: 80, - fixed: 'right', - valueType: 'option', - render: (_: React.ReactNode, entity: any) => [ - handleDelete(entity.id as string)} - btnTitle={$t('删除')} - /> - ] - } - ]) - } - useEffect(() => { - setTableColumns() - }, []) + const columns: PageProColumns[] = [ + { + title: '', + dataIndex: 'drag', + width: '40px' + }, + { + title: $t('优先级'), + dataIndex: 'priority', + width: 80, + ellipsis: true, + key: 'priority' + }, + { + title: $t('模型'), + dataIndex: ['provider', 'name'], + ellipsis: true, + key: 'provider', + render: (dom: React.ReactNode, record: LoadBalancingItems) => ( + + {record.provider?.name} / {record.model?.name} + + ) + }, + { + title: $t('类型'), + dataIndex: 'type', + width: 120, + ellipsis: true, + key: 'type', + render: (dom: React.ReactNode, record: LoadBalancingItems) => ( + {record.type === 'online' ? $t('线上模型') : $t('本地模型')} + ) + }, + { + title: $t('状态'), + dataIndex: 'state', + width: 80, + ellipsis: true, + key: 'state', + render: (dom: React.ReactNode, record: LoadBalancingItems) => ( + {statusEnum[record.state]?.text || '-'} + ) + }, + { + title: $t('Apis'), + dataIndex: 'apiCount', + ellipsis: true, + width: 80, + key: 'apiCount', + render: (dom: React.ReactNode, record: LoadBalancingItems) => ( + + + {record.apiCount || '0'} + + + ) + }, + { + title: $t('Keys'), + dataIndex: 'keyCount', + ellipsis: true, + width: 80, + key: 'keyCount', + render: (dom: React.ReactNode, record: LoadBalancingItems) => ( + + + {record.keyCount || '0'} + + + ) + }, + { + title: '', + key: 'option', + btnNums: 1, + width: 50, + fixed: 'right', + valueType: 'option', + render: (_: React.ReactNode, entity: any) => [ + handleDelete(entity.id as string)} + btnTitle={$t('删除')} + /> + ] + } + ] + return ( <>