import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import Link from 'next/link' import { RiAlertFill, RiArrowDownSLine, RiArrowRightUpLine, RiBrainLine, } from '@remixicon/react' import { useContext } from 'use-context-selector' import SystemModelSelector from './system-model-selector' import ProviderAddedCard, { UPDATE_MODEL_PROVIDER_CUSTOM_MODEL_LIST } from './provider-added-card' // import ProviderCard from './provider-card' import type { CustomConfigurationModelFixedFields, ModelProvider, } from './declarations' import { ConfigurationMethodEnum, CustomConfigurationStatusEnum, ModelTypeEnum, } from './declarations' import { useDefaultModel, useUpdateModelList, useUpdateModelProviders, } from './hooks' import Divider from '@/app/components/base/divider' import ProviderCard from '@/app/components/plugins/provider-card' import I18n from '@/context/i18n' import { useProviderContext } from '@/context/provider-context' import { useModalContextSelector } from '@/context/modal-context' import { useEventEmitterContextContext } from '@/context/event-emitter' import cn from '@/utils/classnames' import { extensionDallE, modelGPT4, toolNotion } from '@/app/components/plugins/card/card-mock' const ModelProviderPage = () => { const { t } = useTranslation() const { eventEmitter } = useEventEmitterContextContext() const updateModelProviders = useUpdateModelProviders() const updateModelList = useUpdateModelList() const { data: textGenerationDefaultModel } = useDefaultModel(ModelTypeEnum.textGeneration) const { data: embeddingsDefaultModel } = useDefaultModel(ModelTypeEnum.textEmbedding) const { data: rerankDefaultModel } = useDefaultModel(ModelTypeEnum.rerank) const { data: speech2textDefaultModel } = useDefaultModel(ModelTypeEnum.speech2text) const { data: ttsDefaultModel } = useDefaultModel(ModelTypeEnum.tts) const { modelProviders: providers } = useProviderContext() const setShowModelModal = useModalContextSelector(state => state.setShowModelModal) const defaultModelNotConfigured = !textGenerationDefaultModel && !embeddingsDefaultModel && !speech2textDefaultModel && !rerankDefaultModel && !ttsDefaultModel const [configuredProviders, notConfiguredProviders] = useMemo(() => { const configuredProviders: ModelProvider[] = [] const notConfiguredProviders: ModelProvider[] = [] providers.forEach((provider) => { if ( provider.custom_configuration.status === CustomConfigurationStatusEnum.active || ( provider.system_configuration.enabled === true && provider.system_configuration.quota_configurations.find(item => item.quota_type === provider.system_configuration.current_quota_type) ) ) configuredProviders.push(provider) else notConfiguredProviders.push(provider) }) return [configuredProviders, notConfiguredProviders] }, [providers]) const handleOpenModal = ( provider: ModelProvider, configurationMethod: ConfigurationMethodEnum, CustomConfigurationModelFixedFields?: CustomConfigurationModelFixedFields, ) => { setShowModelModal({ payload: { currentProvider: provider, currentConfigurationMethod: configurationMethod, currentCustomConfigurationModelFixedFields: CustomConfigurationModelFixedFields, }, onSaveCallback: () => { updateModelProviders() if (configurationMethod === ConfigurationMethodEnum.predefinedModel) { provider.supported_model_types.forEach((type) => { updateModelList(type) }) } if (configurationMethod === ConfigurationMethodEnum.customizableModel && provider.custom_configuration.status === CustomConfigurationStatusEnum.active) { eventEmitter?.emit({ type: UPDATE_MODEL_PROVIDER_CUSTOM_MODEL_LIST, payload: provider.provider, } as any) if (CustomConfigurationModelFixedFields?.__model_type) updateModelList(CustomConfigurationModelFixedFields?.__model_type) } }, }) } const [collapse, setCollapse] = useState(false) const { locale } = useContext(I18n) // TODO #Plugin list API# const pluginList = [toolNotion, extensionDallE, modelGPT4] return (
{t('common.modelProvider.models')}
{defaultModelNotConfigured &&
} {defaultModelNotConfigured && (
{t('common.modelProvider.notConfigured')}
)}
{!configuredProviders?.length && (
{t('common.modelProvider.emptyProviderTitle')}
{t('common.modelProvider.emptyProviderTip')}
)} {!!configuredProviders?.length && (
{configuredProviders?.map(provider => ( handleOpenModal(provider, configurationMethod, currentCustomConfigurationModelFixedFields)} /> ))}
)} {false && !!notConfiguredProviders?.length && ( <>
{t('common.modelProvider.configureRequired')}
{notConfiguredProviders?.map(provider => ( handleOpenModal(provider, configurationMethod, currentCustomConfigurationModelFixedFields)} /> ))}
)}
setCollapse(!collapse)}> {t('common.modelProvider.installProvider')}
{t('common.modelProvider.discoverMore')} Dify Marketplace
{!collapse && (
{pluginList.map((plugin, index) => ( ))}
)}
) } export default ModelProviderPage