diff --git a/src/config/global.d.ts b/src/config/global.d.ts index 5962f937..80d88c96 100644 --- a/src/config/global.d.ts +++ b/src/config/global.d.ts @@ -1,4 +1,4 @@ -type PageActionType = 'create' | 'update' | 'view' | 'edit'; +type PageActionType = 'create' | 'update' | 'view' | 'edit' | 'copy'; declare namespace Global { type WithFalse = T | false; interface Pagination { diff --git a/src/pages/llmodels/components/access-control-modal/index.tsx b/src/pages/llmodels/components/access-control-modal/index.tsx index 849b208c..6f8ea9d9 100644 --- a/src/pages/llmodels/components/access-control-modal/index.tsx +++ b/src/pages/llmodels/components/access-control-modal/index.tsx @@ -2,16 +2,17 @@ import AlertBlockInfo from '@/components/alert-info/block'; import ModalFooter from '@/components/modal-footer'; import { PageActionType } from '@/config/types'; import FormDrawer from '@/pages/_components/form-drawer'; +import { RouteItem } from '@/pages/model-routes/config/types'; import { useIntl } from '@umijs/max'; import { message } from 'antd'; import _ from 'lodash'; import { useEffect, useRef, useState } from 'react'; import { updateModelAccessUser } from '../../apis'; -import { AccessControlFormData, ListItem } from '../../config/types'; +import { AccessControlFormData } from '../../config/types'; import AccessControlForm from './form'; const AccessControlModal: React.FC< - Global.ScrollerModalProps + Global.ScrollerModalProps > = ({ open, title, currentData, action, onCancel }) => { const intl = useIntl(); const form = useRef(null); diff --git a/src/pages/maas-provider/components/provider-logo.tsx b/src/pages/maas-provider/components/provider-logo.tsx index 40773dc0..3b3ca3b9 100644 --- a/src/pages/maas-provider/components/provider-logo.tsx +++ b/src/pages/maas-provider/components/provider-logo.tsx @@ -1,3 +1,4 @@ +import GPUStackLogo from '@/assets/images/small-logo-200x200.png'; import ai360 from '@/assets/providers-logo/ai360.svg'; import azure from '@/assets/providers-logo/azureai.svg'; import baichuan from '@/assets/providers-logo/baichuan.svg'; @@ -66,7 +67,8 @@ const ProviderLogoMap: Record = { [ProviderEnum.TOGETHERAI]: togetherai, [ProviderEnum.ZHIPUAI]: zhipuai, [ProviderEnum.GITHUB]: github, - [ProviderEnum.TRITON]: triton + [ProviderEnum.TRITON]: triton, + ['deployments']: GPUStackLogo }; const ProviderLogo: React.FC<{ diff --git a/src/pages/maas-provider/components/provider-models.tsx b/src/pages/maas-provider/components/provider-models.tsx index fb38ccf9..bc224f83 100644 --- a/src/pages/maas-provider/components/provider-models.tsx +++ b/src/pages/maas-provider/components/provider-models.tsx @@ -21,45 +21,43 @@ const ProviderModels: React.FC = ({ dataList }) => { none: }; return ( -
- - {dataList.map((model) => ( - + {dataList.map((model) => ( + - - - {model.name} - - - {categoryConfig[model.category]?.icon} - + }} + color={ + model.accessible === true + ? 'success' + : model.accessible === false + ? 'error' + : 'warning' + } + > + + + {model.name} + + + {categoryConfig[model.category]?.icon} - - ))} - -
+ + + ))} + ); }; diff --git a/src/pages/model-routes/components/route-targets.tsx b/src/pages/model-routes/components/route-targets.tsx index 33c38983..75767d9c 100644 --- a/src/pages/model-routes/components/route-targets.tsx +++ b/src/pages/model-routes/components/route-targets.tsx @@ -2,6 +2,7 @@ import AutoTooltip from '@/components/auto-tooltip'; import DropdownButtons from '@/components/drop-down-buttons'; import RowChildren from '@/components/seal-table/components/row-children'; import StatusTag from '@/components/status-tag'; +import ProviderLogo from '@/pages/maas-provider/components/provider-logo'; import { DeleteOutlined } from '@ant-design/icons'; import { useIntl } from '@umijs/max'; import { Col, Row } from 'antd'; @@ -10,6 +11,7 @@ import React from 'react'; import styled from 'styled-components'; import { TargetStatus, TargetStatusLabelMap } from '../config'; import { RouteTarget } from '../config/types'; + const CellContent = styled.div` display: flex; align-items: center; @@ -20,12 +22,14 @@ interface ProviderModelProps { dataList: RouteTarget[]; onSelect: (val: any, record: any) => void; sourceModels: any[]; + modelList?: Global.BaseOption[]; } -interface AccessItemProps { +interface TargetItemProps { onSelect: (val: any, record: any) => void; data: any; sourceModels: any[]; + modelList?: Global.BaseOption[]; } export const childActionList = [ @@ -44,10 +48,11 @@ export const childActionList = [ } ]; -const RouteItem: React.FC = ({ +const RouteItem: React.FC = ({ onSelect, data, - sourceModels + sourceModels, + modelList }) => { const intl = useIntl(); @@ -58,8 +63,19 @@ const RouteItem: React.FC = ({ } return item.value === data.provider_id; }); - console.log('renderProviderSource model:', data, sourceModels); - return model?.label || '-'; + if (!model) { + return '-'; + } + return ( + + + + {data.model_id + ? modelList?.find((m) => m.value === data.model_id)?.label + : data.provider_model_name} + + + ); }; return (
@@ -74,7 +90,7 @@ const RouteItem: React.FC = ({ {data.name} - + {renderProviderSource()} @@ -101,7 +117,7 @@ const RouteItem: React.FC = ({ )} - + = ({ const RouteTargets: React.FC = ({ dataList, onSelect, + modelList, sourceModels }) => { return ( @@ -152,6 +169,7 @@ const RouteTargets: React.FC = ({ key={index} onSelect={onSelect} sourceModels={sourceModels} + modelList={modelList} > ))}
diff --git a/src/pages/model-routes/hooks/use-target-source-models.tsx b/src/pages/model-routes/hooks/use-target-source-models.tsx index eaf83696..21020bbb 100644 --- a/src/pages/model-routes/hooks/use-target-source-models.tsx +++ b/src/pages/model-routes/hooks/use-target-source-models.tsx @@ -50,6 +50,7 @@ const useTargetSourceModels = () => { ), value: 'deployments', + providerType: 'deployments', parent: true, children: models.items?.map?.((model: ModelListItem) => ({ label: model.name, @@ -73,6 +74,7 @@ const useTargetSourceModels = () => { ), value: provider.id, parent: true, + providerType: provider.config?.type, children: provider.models?.map?.((model) => ({ label: model.name, value: model.name, diff --git a/src/pages/model-routes/index.tsx b/src/pages/model-routes/index.tsx index e40b2df8..ae3aa80b 100644 --- a/src/pages/model-routes/index.tsx +++ b/src/pages/model-routes/index.tsx @@ -15,9 +15,10 @@ import { useMemoizedFn } from 'ahooks'; import { message } from 'antd'; import { useAtom } from 'jotai'; import _ from 'lodash'; -import { useEffect } from 'react'; +import { useEffect, useState } from 'react'; import NoResult from '../_components/no-result'; import PageBox from '../_components/page-box'; +import { queryModelsList } from '../llmodels/apis'; import AccessControlModal from '../llmodels/components/access-control-modal'; import { MODEL_ROUTES, @@ -72,6 +73,24 @@ const Accesses: React.FC = () => { openAccessControlModalStatus } = useAccessControl(); const { sourceModels, fetchSourceModels } = useTargetSourceModels(); + const [modelList, setModelsList] = useState[]>([]); + + useEffect(() => { + const fetchModels = async () => { + try { + const res = await queryModelsList({ page: -1 }); + const models = + res.items?.map((model) => ({ + label: model.name, + value: model.id + })) || []; + setModelsList(models); + } catch (error) { + setModelsList([]); + } + }; + fetchModels(); + }, []); const handleClickDropdown = () => { openRouteModal( @@ -193,6 +212,7 @@ const Accesses: React.FC = () => { ) => { return ( { onCancel={closeAccessControlModal} title={openAccessControlModalStatus.title} open={openAccessControlModalStatus.open} - currentData={openAccessControlModalStatus.currentData || null} + currentData={openAccessControlModalStatus.currentData} action={openAccessControlModalStatus.action} >