import type { FC } from 'react' import { useState } from 'react' import { useTranslation } from 'react-i18next' import { RiLoader2Line, } from '@remixicon/react' import type { CustomConfigurationModelFixedFields, ModelItem, ModelProvider, } from '../declarations' import { ConfigurationMethodEnum } from '../declarations' import { DEFAULT_BACKGROUND_COLOR, MODEL_PROVIDER_QUOTA_GET_PAID, 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 { fetchModelProviderModelList } from '@/service/common' import { useEventEmitterContextContext } from '@/context/event-emitter' import { IS_CE_EDITION } from '@/config' import { useAppContext } from '@/context/app-context' export const UPDATE_MODEL_PROVIDER_CUSTOM_MODEL_LIST = 'UPDATE_MODEL_PROVIDER_CUSTOM_MODEL_LIST' type ProviderAddedCardProps = { provider: ModelProvider onOpenModal: (configurationMethod: ConfigurationMethodEnum, currentCustomConfigurationModelFixedFields?: CustomConfigurationModelFixedFields) => 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 configurationMethods = provider.configurate_methods.filter(method => method !== ConfigurationMethodEnum.fetchFromRemote) const systemConfig = provider.system_configuration const hasModelList = fetched && !!modelList.length const { isCurrentWorkspaceManager } = useAppContext() const showQuota = systemConfig.enabled && [...MODEL_PROVIDER_QUOTA_GET_PAID].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 && ( ) } { configurationMethods.includes(ConfigurationMethodEnum.predefinedModel) && isCurrentWorkspaceManager && ( onOpenModal(ConfigurationMethodEnum.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 && ( ) }
{ configurationMethods.includes(ConfigurationMethodEnum.customizableModel) && isCurrentWorkspaceManager && ( onOpenModal(ConfigurationMethodEnum.customizableModel)} className='hidden group-hover:flex group-hover:text-primary-600' /> ) }
) } { !collapsed && ( setCollapsed(true)} onConfig={currentCustomConfigurationModelFixedFields => onOpenModal(ConfigurationMethodEnum.customizableModel, currentCustomConfigurationModelFixedFields)} onChange={(provider: string) => getModelList(provider)} /> ) }
) } export default ProviderAddedCard