import { deleteChannel, getChannelList, getChannelProviders, putChannel, putChannelStatus } from '@/web/core/ai/channel'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import React, { useState } from 'react'; import { Table, Thead, Tbody, Tr, Th, Td, TableContainer, Box, Flex, Button, HStack } from '@chakra-ui/react'; import { useTranslation } from 'next-i18next'; import MyBox from '@fastgpt/web/components/common/MyBox'; import MyIconButton from '@fastgpt/web/components/common/Icon/button'; import { useUserStore } from '@/web/support/user/useUserStore'; import { ChannelInfoType } from '@/global/aiproxy/type'; import MyTag from '@fastgpt/web/components/common/Tag/index'; import { aiproxyIdMap, ChannelStatusEnum, ChannelStautsMap, defaultChannel } from '@/global/aiproxy/constants'; import MyMenu from '@fastgpt/web/components/common/MyMenu'; import dynamic from 'next/dynamic'; import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip'; import MyNumberInput from '@fastgpt/web/components/common/Input/NumberInput'; import { getModelProvider } from '@fastgpt/global/core/ai/provider'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { useConfirm } from '@fastgpt/web/hooks/useConfirm'; const EditChannelModal = dynamic(() => import('./EditChannelModal'), { ssr: false }); const ModelTest = dynamic(() => import('./ModelTest'), { ssr: false }); const ChannelTable = ({ Tab }: { Tab: React.ReactNode }) => { const { t } = useTranslation(); const { userInfo } = useUserStore(); const isRoot = userInfo?.username === 'root'; const { data: channelList = [], runAsync: refreshChannelList, loading: loadingChannelList } = useRequest2(getChannelList, { manual: false }); const { data: channelProviders = {} } = useRequest2(getChannelProviders, { manual: false }); const [editChannel, setEditChannel] = useState(); const { runAsync: updateChannel, loading: loadingUpdateChannel } = useRequest2(putChannel, { manual: true, onSuccess: () => { refreshChannelList(); } }); const { runAsync: updateChannelStatus, loading: loadingUpdateChannelStatus } = useRequest2( putChannelStatus, { onSuccess: () => { refreshChannelList(); } } ); const { openConfirm, ConfirmModal } = useConfirm({ type: 'delete' }); const { runAsync: onDeleteChannel, loading: loadingDeleteChannel } = useRequest2(deleteChannel, { manual: true, onSuccess: () => { refreshChannelList(); } }); const [modelTestData, setTestModelData] = useState<{ channelId: number; models: string[] }>(); const isLoading = loadingChannelList || loadingUpdateChannel || loadingDeleteChannel || loadingUpdateChannelStatus; return ( <> {isRoot && ( {Tab} )} {channelList.map((item) => { const providerData = aiproxyIdMap[item.type] || { label: channelProviders[item.type]?.name || 'Invalid provider', provider: 'Other' }; const provider = getModelProvider(providerData?.provider); return ( ); })}
ID {t('account_model:channel_name')} {t('account_model:channel_type')} {t('account_model:channel_status')} {t('account_model:channel_priority')}
{item.id} {item.name} {t(providerData?.label as any)} {t(ChannelStautsMap[item.status]?.label as any) || t('account_model:channel_status_unknown')} { const val = (() => { if (!e) return 1; return e; })(); updateChannel({ ...item, priority: val }); }} /> setTestModelData({ channelId: item.id, models: item.models }) }, ...(item.status === ChannelStatusEnum.ChannelStatusEnabled ? [ { icon: 'common/disable', label: t('account_model:forbid_channel'), onClick: () => updateChannelStatus( item.id, ChannelStatusEnum.ChannelStatusDisabled ) } ] : [ { icon: 'common/enable', label: t('account_model:enable_channel'), onClick: () => updateChannelStatus( item.id, ChannelStatusEnum.ChannelStatusEnabled ) } ]), { icon: 'common/settingLight', label: t('account_model:edit'), onClick: () => setEditChannel(item) }, { type: 'danger', icon: 'delete', label: t('common:Delete'), onClick: () => openConfirm( () => onDeleteChannel(item.id), undefined, t('account_model:confirm_delete_channel', { name: item.name }) )() } ] } ]} Button={} />
{!!editChannel && ( setEditChannel(undefined)} onSuccess={refreshChannelList} /> )} {!!modelTestData && ( setTestModelData(undefined)} /> )} ); }; export default ChannelTable;