From 08cff0045d21d1fbf8691dd5a8f7d578a4aaf86c Mon Sep 17 00:00:00 2001 From: AkaraChen Date: Thu, 9 Jan 2025 14:31:43 +0800 Subject: [PATCH] feat: form not installed indicator --- .../deprecated-model-trigger.tsx | 14 ++-- .../model-selector/index.tsx | 9 ++- .../nodes/agent/components/model-bar.tsx | 67 +++++++++++++++++++ .../components/workflow/nodes/agent/node.tsx | 44 ++---------- 4 files changed, 92 insertions(+), 42 deletions(-) create mode 100644 web/app/components/workflow/nodes/agent/components/model-bar.tsx 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 bcc573b06a..069e026b64 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 @@ -10,11 +10,15 @@ type ModelTriggerProps = { modelName: string providerName: string className?: string + showWarnIcon?: boolean + contentClassName?: string } const ModelTrigger: FC = ({ modelName, providerName, className, + showWarnIcon, + contentClassName, }) => { const { t } = useTranslation() const { modelProviders } = useProviderContext() @@ -24,7 +28,7 @@ const ModelTrigger: FC = ({
-
+
= ({
- - - + {showWarnIcon && ( + + + + )}
diff --git a/web/app/components/header/account-setting/model-provider-page/model-selector/index.tsx b/web/app/components/header/account-setting/model-provider-page/model-selector/index.tsx index da31cdeee5..d28959a509 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-selector/index.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-selector/index.tsx @@ -15,6 +15,7 @@ import { PortalToFollowElemContent, PortalToFollowElemTrigger, } from '@/app/components/base/portal-to-follow-elem' +import classNames from '@/utils/classnames' type ModelSelectorProps = { defaultModel?: DefaultModel @@ -24,6 +25,8 @@ type ModelSelectorProps = { onSelect?: (model: DefaultModel) => void readonly?: boolean scopeFeatures?: string[] + deprecatedClassName?: string + showDeprecatedWarnIcon?: boolean } const ModelSelector: FC = ({ defaultModel, @@ -33,6 +36,8 @@ const ModelSelector: FC = ({ onSelect, readonly, scopeFeatures = [], + deprecatedClassName, + showDeprecatedWarnIcon = false, }) => { const [open, setOpen] = useState(false) const { @@ -64,7 +69,7 @@ const ModelSelector: FC = ({ placement='bottom-start' offset={4} > -
+
= ({ modelName={defaultModel?.model || ''} providerName={defaultModel?.provider || ''} className={triggerClassName} + showWarnIcon={showDeprecatedWarnIcon} + contentClassName={deprecatedClassName} /> ) } diff --git a/web/app/components/workflow/nodes/agent/components/model-bar.tsx b/web/app/components/workflow/nodes/agent/components/model-bar.tsx new file mode 100644 index 0000000000..dffbf40d36 --- /dev/null +++ b/web/app/components/workflow/nodes/agent/components/model-bar.tsx @@ -0,0 +1,67 @@ +import Tooltip from '@/app/components/base/tooltip' +import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' +import { useModelList } from '@/app/components/header/account-setting/model-provider-page/hooks' +import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector' +import Indicator from '@/app/components/header/indicator' +import { type FC, useMemo } from 'react' +import { useTranslation } from 'react-i18next' + +export type ModelBarProps = { + provider: string + model: string +} | {} + +const useAllModel = () => { + const { data: textGeneration } = useModelList(ModelTypeEnum.textGeneration) + const { data: moderation } = useModelList(ModelTypeEnum.moderation) + const { data: rerank } = useModelList(ModelTypeEnum.rerank) + const { data: speech2text } = useModelList(ModelTypeEnum.speech2text) + const { data: textEmbedding } = useModelList(ModelTypeEnum.textEmbedding) + const { data: tts } = useModelList(ModelTypeEnum.tts) + const models = useMemo(() => { + return textGeneration + .concat(moderation) + .concat(rerank) + .concat(speech2text) + .concat(textEmbedding) + .concat(tts) + }, [textGeneration, moderation, rerank, speech2text, textEmbedding, tts]) + if (!textGeneration || !moderation || !rerank || !speech2text || !textEmbedding || !tts) + return undefined + return models +} + +export const ModelBar: FC = (props) => { + const { t } = useTranslation() + const modelList = useAllModel() + if (!('provider' in props)) { + return + } + const modelInstalled = modelList?.some( + provider => provider.provider === props.provider && provider.models.some(model => model.model === props.model)) + const showWarn = modelList && !modelInstalled + return modelList && +
+ + {showWarn && } +
+
+} diff --git a/web/app/components/workflow/nodes/agent/node.tsx b/web/app/components/workflow/nodes/agent/node.tsx index f2c93cfc4d..0bc2fb4caf 100644 --- a/web/app/components/workflow/nodes/agent/node.tsx +++ b/web/app/components/workflow/nodes/agent/node.tsx @@ -2,41 +2,19 @@ import { type FC, memo, useMemo } from 'react' import type { NodeProps } from '../../types' import type { AgentNodeType } from './types' import { SettingItem } from '../_base/components/setting-item' -import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector' import { Group, GroupLabel } from '../_base/components/group' import type { ToolIconProps } from './components/tool-icon' import { ToolIcon } from './components/tool-icon' import useConfig from './use-config' import { useTranslation } from 'react-i18next' -import { FormTypeEnum, ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' -import { useModelList } from '@/app/components/header/account-setting/model-provider-page/hooks' +import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' import { useRenderI18nObject } from '@/hooks/use-i18n' - -const useAllModel = () => { - const { data: textGeneration } = useModelList(ModelTypeEnum.textGeneration) - const { data: moderation } = useModelList(ModelTypeEnum.moderation) - const { data: rerank } = useModelList(ModelTypeEnum.rerank) - const { data: speech2text } = useModelList(ModelTypeEnum.speech2text) - const { data: textEmbedding } = useModelList(ModelTypeEnum.textEmbedding) - const { data: tts } = useModelList(ModelTypeEnum.tts) - const models = useMemo(() => { - return textGeneration - .concat(moderation) - .concat(rerank) - .concat(speech2text) - .concat(textEmbedding) - .concat(tts) - }, [textGeneration, moderation, rerank, speech2text, textEmbedding, tts]) - if (!textGeneration || !moderation || !rerank || !speech2text || !textEmbedding || !tts) - return undefined - return models -} +import { ModelBar } from './components/model-bar' const AgentNode: FC> = (props) => { const { inputs, currentStrategy, currentStrategyStatus, pluginDetail } = useConfig(props.id, props.data) const renderI18nObject = useRenderI18nObject() const { t } = useTranslation() - const modelList = useAllModel() const models = useMemo(() => { if (!inputs) return [] // if selected, show in node @@ -46,6 +24,7 @@ const AgentNode: FC> = (props) => { .filter(param => param.type === FormTypeEnum.modelSelector) .reduce((acc, param) => { const item = inputs.agent_parameters?.[param.name]?.value + console.log({ item }) if (!item) { if (param.required) { acc.push({ param: param.name }) @@ -102,27 +81,18 @@ const AgentNode: FC> = (props) => { {inputs.agent_strategy_label} : } - {models.length > 0 && modelList && {t('workflow.nodes.agent.model')} } > {models.map((model) => { - return })} - } + {tools.length > 0 && {t('workflow.nodes.agent.toolbox')} }>