import type { FC } from 'react' import { useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import type { ModelItem, ModelProvider, } from '../declarations' import { CustomConfigurationStatusEnum, ModelTypeEnum, } from '../declarations' import type { PluginInfoFromMarketPlace } from '@/app/components/plugins/types' import { useInvalidateInstalledPluginList } from '@/service/use-plugins' import ConfigurationButton from './configuration-button' import { PluginType } from '@/app/components/plugins/types' import { useModelModalHandler, useUpdateModelList, useUpdateModelProviders, } from '../hooks' import ModelIcon from '../model-icon' import ModelDisplay from './model-display' import { InstallPluginButton } from '@/app/components/workflow/nodes/_base/components/install-plugin-button' import StatusIndicators from './status-indicators' import cn from '@/utils/classnames' import { useProviderContext } from '@/context/provider-context' import { useModalContextSelector } from '@/context/modal-context' import { useEventEmitterContextContext } from '@/context/event-emitter' import { RiEqualizer2Line } from '@remixicon/react' import { fetchPluginInfoFromMarketPlace } from '@/service/plugins' export type AgentModelTriggerProps = { open?: boolean disabled?: boolean currentProvider?: ModelProvider currentModel?: ModelItem providerName?: string modelId?: string hasDeprecated?: boolean scope?: string } const AgentModelTrigger: FC = ({ disabled, currentProvider, currentModel, providerName, modelId, hasDeprecated, scope, }) => { const { t } = useTranslation() const { modelProviders } = useProviderContext() const setShowModelModal = useModalContextSelector(state => state.setShowModelModal) const updateModelProviders = useUpdateModelProviders() const updateModelList = useUpdateModelList() const { eventEmitter } = useEventEmitterContextContext() const { modelProvider, needsConfiguration } = useMemo(() => { const modelProvider = modelProviders.find(item => item.provider === providerName) const needsConfiguration = modelProvider?.custom_configuration.status === CustomConfigurationStatusEnum.noConfigure && !( modelProvider.system_configuration.enabled === true && modelProvider.system_configuration.quota_configurations.find( item => item.quota_type === modelProvider.system_configuration.current_quota_type, ) ) return { modelProvider, needsConfiguration, } }, [modelProviders, providerName]) const [pluginInfo, setPluginInfo] = useState(null) const [isPluginChecked, setIsPluginChecked] = useState(false) const [installed, setInstalled] = useState(false) const invalidateInstalledPluginList = useInvalidateInstalledPluginList() const handleOpenModal = useModelModalHandler() useEffect(() => { (async () => { if (providerName && !modelProvider) { const parts = providerName.split('/') const org = parts[0] const name = parts[1] try { const pluginInfo = await fetchPluginInfoFromMarketPlace({ org, name }) if (pluginInfo.data.plugin.category === PluginType.model) setPluginInfo(pluginInfo.data.plugin) } catch (error) { // pass } setIsPluginChecked(true) } else { setIsPluginChecked(true) } })() }, [providerName, modelProvider]) if (modelId && !isPluginChecked) return null return (
{modelId ? ( <> {needsConfiguration && ( )} {!installed && !modelProvider && pluginInfo && ( e.stopPropagation()} size={'small'} uniqueIdentifier={pluginInfo.latest_package_identifier} onSuccess={() => { [ ModelTypeEnum.textGeneration, ModelTypeEnum.textEmbedding, ModelTypeEnum.rerank, ModelTypeEnum.moderation, ModelTypeEnum.speech2text, ModelTypeEnum.tts, ].forEach((type: ModelTypeEnum) => { if (scope?.includes(type)) updateModelList(type) }, ) updateModelProviders() invalidateInstalledPluginList() setInstalled(true) }} /> )} {modelProvider && !disabled && !needsConfiguration && (
)} ) : ( <>
{t('workflow.nodes.agent.configureModel')}
)}
) } export default AgentModelTrigger