diff --git a/web/app/components/base/install-button/index.tsx b/web/app/components/base/install-button/index.tsx index f9ad238fb2..983e9b343e 100644 --- a/web/app/components/base/install-button/index.tsx +++ b/web/app/components/base/install-button/index.tsx @@ -3,7 +3,7 @@ import { RiInstallLine, RiLoader2Line } from '@remixicon/react' type InstallButtonProps = { loading: boolean - onInstall: () => void + onInstall: (e: React.MouseEvent) => void t: any } diff --git a/web/app/components/header/account-setting/model-provider-page/model-parameter-modal/agent-model-trigger.tsx b/web/app/components/header/account-setting/model-provider-page/model-parameter-modal/agent-model-trigger.tsx index 68cdf2230e..e1a8873cde 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-parameter-modal/agent-model-trigger.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-parameter-modal/agent-model-trigger.tsx @@ -1,5 +1,5 @@ import type { FC } from 'react' -import { useEffect, useState } from 'react' +import { useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import type { CustomConfigurationModelFixedFields, @@ -9,6 +9,7 @@ import type { import { ConfigurationMethodEnum, CustomConfigurationStatusEnum, + ModelTypeEnum, } from '../declarations' import { UPDATE_MODEL_PROVIDER_CUSTOM_MODEL_LIST } from '../provider-added-card' import type { PluginInfoFromMarketPlace } from '@/app/components/plugins/types' @@ -54,13 +55,19 @@ const AgentModelTrigger: FC = ({ const updateModelProviders = useUpdateModelProviders() const updateModelList = useUpdateModelList() const { eventEmitter } = useEventEmitterContextContext() - 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, + 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 [loading, setLoading] = useState(false) @@ -124,6 +131,24 @@ const AgentModelTrigger: FC = ({ }) } + const handleInstall = async (pluginInfo: PluginInfoFromMarketPlace) => { + setLoading(true) + try { + const { all_installed } = await installPackageFromMarketPlace(pluginInfo.latest_package_identifier) + if (all_installed) { + setInstalled(true) + updateModelProviders() + updateModelList(ModelTypeEnum.textGeneration) + } + } + catch (error) { + console.error('Installation failed:', error) + } + finally { + setLoading(false) + } + } + return (
= ({ {!installed && !modelProvider && pluginInfo && ( { - setLoading(true) - const { all_installed } = await installPackageFromMarketPlace(pluginInfo.latest_package_identifier) - if (all_installed) - setInstalled(true) + onInstall={(e) => { + e.stopPropagation() + handleInstall(pluginInfo) }} t={t} /> )} + {modelProvider && !disabled && ( +
+ +
+ )} ) : ( <> diff --git a/web/app/components/header/account-setting/model-provider-page/model-parameter-modal/status-indicators.tsx b/web/app/components/header/account-setting/model-provider-page/model-parameter-modal/status-indicators.tsx index 2f7ee0e5f7..94724b43eb 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-parameter-modal/status-indicators.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-parameter-modal/status-indicators.tsx @@ -1,4 +1,5 @@ import Tooltip from '@/app/components/base/tooltip' +import Link from 'next/link' import { RiErrorWarningFill } from '@remixicon/react' type StatusIndicatorsProps = { @@ -28,7 +29,16 @@ const StatusIndicators = ({ needsConfiguration, modelProvider, disabled, pluginI
{t('workflow.nodes.agent.modelNotInMarketplace.desc')}
-
{t('workflow.nodes.agent.modelNotInMarketplace.manageInPlugins')}
+
+ { + e.stopPropagation() + }} + > + {t('workflow.nodes.agent.linkToPlugin')} + +
} asChild={false} diff --git a/web/app/components/header/account-setting/model-provider-page/model-selector/deprecated-model-trigger.tsx b/web/app/components/header/account-setting/model-provider-page/model-selector/deprecated-model-trigger.tsx index e47afa1c4d..6d42561774 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-selector/deprecated-model-trigger.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-selector/deprecated-model-trigger.tsx @@ -22,14 +22,14 @@ const ModelTrigger: FC = ({ return (
-
+
{modelName}
diff --git a/web/app/components/header/account-setting/model-provider-page/model-selector/empty-trigger.tsx b/web/app/components/header/account-setting/model-provider-page/model-selector/empty-trigger.tsx index ccbf2d8c22..980e4e3784 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-selector/empty-trigger.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-selector/empty-trigger.tsx @@ -14,7 +14,7 @@ const ModelTrigger: FC = ({ return (
diff --git a/web/app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx b/web/app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx index c4250c0307..f82beaab93 100644 --- a/web/app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx +++ b/web/app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx @@ -89,15 +89,15 @@ export const AgentStrategySelector = (props: AgentStrategySelectorProps) => { const { t } = useTranslation() return -
setOpen(o => !o)}> +
setOpen(o => !o)}> {/* eslint-disable-next-line @next/next/no-img-element */} - {icon && icon} + />
}

diff --git a/web/i18n/en-US/workflow.ts b/web/i18n/en-US/workflow.ts index 64ea5b9317..200e4d9ca7 100644 --- a/web/i18n/en-US/workflow.ts +++ b/web/i18n/en-US/workflow.ts @@ -716,7 +716,7 @@ const translation = { }, modelNotInMarketplace: { title: 'Model not installed', - desc: 'This model is not installed from the marketplace. Please go to Plugins to reinstall.', + desc: 'This model is installed from Local or GitHub repository. Please use after installation.', manageInPlugins: 'Manage in Plugins', }, configureModel: 'Configure Model', diff --git a/web/i18n/zh-Hans/workflow.ts b/web/i18n/zh-Hans/workflow.ts index fce1fd74b2..3d970d3e9f 100644 --- a/web/i18n/zh-Hans/workflow.ts +++ b/web/i18n/zh-Hans/workflow.ts @@ -716,7 +716,7 @@ const translation = { }, modelNotInMarketplace: { title: '模型未安装', - desc: '此模型未从市场安装。请转到插件重新安装。', + desc: '此模型安装自本地或 GitHub 仓库。请安装后使用。', manageInPlugins: '在插件中管理', }, model: '模型',