import type { FC } from 'react' import { useState } from 'react' import { useTranslation } from 'react-i18next' import type { CustomConfigrationModelFixedFields, ModelItem, ModelProvider, } from '../declarations' import { ConfigurateMethodEnum } from '../declarations' import { DEFAULT_BACKGROUND_COLOR, modelTypeFormat, } from '../utils' import ProviderIcon from '../provider-icon' import ModelBadge from '../model-badge' import CredentialPanel from './credential-panel' import QuotaPanel from './quota-panel' import ModelList from './model-list' import AddModelButton from './add-model-button' import { ChevronDownDouble } from '@/app/components/base/icons/src/vender/line/arrows' import { Loading02 } from '@/app/components/base/icons/src/vender/line/general' import { fetchModelProviderModelList } from '@/service/common' import { useEventEmitterContextContext } from '@/context/event-emitter' import { IS_CE_EDITION } from '@/config' export const UPDATE_MODEL_PROVIDER_CUSTOM_MODEL_LIST = 'UPDATE_MODEL_PROVIDER_CUSTOM_MODEL_LIST' type ProviderAddedCardProps = { provider: ModelProvider onOpenModal: (configurateMethod: ConfigurateMethodEnum, currentCustomConfigrationModelFixedFields?: CustomConfigrationModelFixedFields) => void } const ProviderAddedCard: FC = ({ provider, onOpenModal, }) => { const { t } = useTranslation() const { eventEmitter } = useEventEmitterContextContext() const [fetched, setFetched] = useState(false) const [loading, setLoading] = useState(false) const [collapsed, setCollapsed] = useState(true) const [modelList, setModelList] = useState([]) const configurateMethods = provider.configurate_methods.filter(method => method !== ConfigurateMethodEnum.fetchFromRemote) const systemConfig = provider.system_configuration const hasModelList = fetched && !!modelList.length const showQuota = systemConfig.enabled && ['minimax', 'spark', 'zhipuai', 'anthropic', 'openai'].includes(provider.provider) && !IS_CE_EDITION const getModelList = async (providerName: string) => { if (loading) return try { setLoading(true) const modelsData = await fetchModelProviderModelList(`/workspaces/current/model-providers/${providerName}/models`) setModelList(modelsData.data) setCollapsed(false) setFetched(true) } finally { setLoading(false) } } const handleOpenModelList = () => { if (fetched) { setCollapsed(false) return } getModelList(provider.provider) } eventEmitter?.useSubscription((v: any) => { if (v?.type === UPDATE_MODEL_PROVIDER_CUSTOM_MODEL_LIST && v.payload === provider.provider) getModelList(v.payload) }) return (
{ provider.supported_model_types.map(modelType => ( {modelTypeFormat(modelType)} )) }
{ showQuota && ( ) } { configurateMethods.includes(ConfigurateMethodEnum.predefinedModel) && ( onOpenModal(ConfigurateMethodEnum.predefinedModel)} provider={provider} /> ) }
{ collapsed && (
{ hasModelList ? t('common.modelProvider.modelsNum', { num: modelList.length }) : t('common.modelProvider.showModels') }
{ hasModelList ? t('common.modelProvider.showModelsNum', { num: modelList.length }) : t('common.modelProvider.showModels') } { loading && ( ) }
{ configurateMethods.includes(ConfigurateMethodEnum.customizableModel) && ( onOpenModal(ConfigurateMethodEnum.customizableModel)} className='hidden group-hover:flex group-hover:text-primary-600' /> ) }
) } { !collapsed && ( setCollapsed(true)} onConfig={currentCustomConfigrationModelFixedFields => onOpenModal(ConfigurateMethodEnum.customizableModel, currentCustomConfigrationModelFixedFields)} /> ) }
) } export default ProviderAddedCard