From 076924bbd6ccb9a86384ee52b18e715e9c9fe6ea Mon Sep 17 00:00:00 2001 From: zxhlyh Date: Fri, 25 Apr 2025 11:32:17 +0800 Subject: [PATCH] rag pipeline main --- .../components/rag-pipeline-main.tsx | 39 +++++++++++++++ .../components/rag-pipeline/hooks/index.ts | 1 + .../hooks/use-available-nodes-meta-data.ts | 47 +++++++++++++++++ web/app/components/rag-pipeline/index.tsx | 14 ++---- .../hooks/use-available-nodes-meta-data.ts | 2 - .../workflow/block-selector/index.tsx | 1 - .../workflow/block-selector/main.tsx | 50 +++++++++++++++---- web/app/components/workflow/custom-edge.tsx | 1 - .../workflow/nodes/data-source/default.ts | 18 +++---- 9 files changed, 137 insertions(+), 36 deletions(-) create mode 100644 web/app/components/rag-pipeline/components/rag-pipeline-main.tsx create mode 100644 web/app/components/rag-pipeline/hooks/index.ts create mode 100644 web/app/components/rag-pipeline/hooks/use-available-nodes-meta-data.ts diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx new file mode 100644 index 0000000000..2c28f7ef24 --- /dev/null +++ b/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx @@ -0,0 +1,39 @@ +import { + useMemo, +} from 'react' +import { WorkflowWithInnerContext } from '@/app/components/workflow' +import type { WorkflowProps } from '@/app/components/workflow' +import RagPipelineChildren from './rag-pipeline-children' +import { + useAvailableNodesMetaData, +} from '../hooks' + +type RagPipelineMainProps = Pick +const RagPipelineMain = ({ + nodes, + edges, + viewport, +}: RagPipelineMainProps) => { + const availableNodesMetaData = useAvailableNodesMetaData() + + const hooksStore = useMemo(() => { + return { + availableNodesMetaData, + } + }, [ + availableNodesMetaData, + ]) + + return ( + + + + ) +} + +export default RagPipelineMain diff --git a/web/app/components/rag-pipeline/hooks/index.ts b/web/app/components/rag-pipeline/hooks/index.ts new file mode 100644 index 0000000000..ed5ceca87d --- /dev/null +++ b/web/app/components/rag-pipeline/hooks/index.ts @@ -0,0 +1 @@ +export * from './use-available-nodes-meta-data' diff --git a/web/app/components/rag-pipeline/hooks/use-available-nodes-meta-data.ts b/web/app/components/rag-pipeline/hooks/use-available-nodes-meta-data.ts new file mode 100644 index 0000000000..30df5c2ee5 --- /dev/null +++ b/web/app/components/rag-pipeline/hooks/use-available-nodes-meta-data.ts @@ -0,0 +1,47 @@ +import { useMemo } from 'react' +import { useTranslation } from 'react-i18next' +import { useGetLanguage } from '@/context/i18n' +import { WORKFLOW_COMMON_NODES } from '@/app/components/workflow/constants/node' +import type { AvailableNodesMetaData } from '@/app/components/workflow/hooks-store/store' + +export const useAvailableNodesMetaData = () => { + const { t } = useTranslation() + const language = useGetLanguage() + + const mergedNodesMetaData = useMemo(() => [ + ...WORKFLOW_COMMON_NODES, + ], []) + + const prefixLink = useMemo(() => { + if (language === 'zh_Hans') + return 'https://docs.dify.ai/zh-hans/guides/workflow/node/' + + return 'https://docs.dify.ai/guides/workflow/node/' + }, [language]) + + const availableNodesMetaData = useMemo(() => mergedNodesMetaData.map((node) => { + return { + ...node, + defaultValue: { + ...node.defaultValue, + type: node.type, + }, + title: t(`workflow.blocks.${node.type}`), + description: t(`workflow.blocksAbout.${node.type}`), + helpLinkUri: `${prefixLink}${node.helpLinkUri}`, + + } + }), [mergedNodesMetaData, t, prefixLink]) + + const availableNodesMetaDataMap = useMemo(() => availableNodesMetaData.reduce((acc, node) => { + acc![node.type] = node + return acc + }, {} as AvailableNodesMetaData['nodesMap']), [availableNodesMetaData]) + + return useMemo(() => { + return { + nodes: availableNodesMetaData, + nodesMap: availableNodesMetaDataMap, + } + }, [availableNodesMetaData, availableNodesMetaDataMap]) +} diff --git a/web/app/components/rag-pipeline/index.tsx b/web/app/components/rag-pipeline/index.tsx index 228c96c4cb..a06f7dcad4 100644 --- a/web/app/components/rag-pipeline/index.tsx +++ b/web/app/components/rag-pipeline/index.tsx @@ -1,12 +1,10 @@ -import WorkflowWithDefaultContext, { - WorkflowWithInnerContext, -} from '@/app/components/workflow' +import WorkflowWithDefaultContext from '@/app/components/workflow' import { WorkflowContextProvider, } from '@/app/components/workflow/context' import type { InjectWorkflowStoreSliceFn } from '@/app/components/workflow/store' import { createRagPipelineSliceSlice } from './store' -import RagPipelineChildren from './components/rag-pipeline-children' +import RagPipelineMain from './components/rag-pipeline-main' const RagPipeline = () => { return ( @@ -17,12 +15,10 @@ const RagPipeline = () => { edges={[]} nodes={[]} > - - - + nodes={[]} + /> ) diff --git a/web/app/components/workflow-app/hooks/use-available-nodes-meta-data.ts b/web/app/components/workflow-app/hooks/use-available-nodes-meta-data.ts index 5fb46f7d40..5562b251a0 100644 --- a/web/app/components/workflow-app/hooks/use-available-nodes-meta-data.ts +++ b/web/app/components/workflow-app/hooks/use-available-nodes-meta-data.ts @@ -13,8 +13,6 @@ export const useAvailableNodesMetaData = () => { const isChatMode = useIsChatMode() const language = useGetLanguage() - console.log('isChatMode', isChatMode) - const mergedNodesMetaData = useMemo(() => [ ...WORKFLOW_COMMON_NODES, StartDefault, diff --git a/web/app/components/workflow/block-selector/index.tsx b/web/app/components/workflow/block-selector/index.tsx index c930e4b740..283a5d9a41 100644 --- a/web/app/components/workflow/block-selector/index.tsx +++ b/web/app/components/workflow/block-selector/index.tsx @@ -9,7 +9,6 @@ const NodeSelectorWrapper = (props: NodeSelectorProps) => { const blocks = useMemo(() => { const result = availableNodesMetaData?.nodes || [] - console.log(result, 'result') return result.filter((block) => { if (block.type === BlockEnum.Start) diff --git a/web/app/components/workflow/block-selector/main.tsx b/web/app/components/workflow/block-selector/main.tsx index 88dc7d06dc..254045e231 100644 --- a/web/app/components/workflow/block-selector/main.tsx +++ b/web/app/components/workflow/block-selector/main.tsx @@ -20,13 +20,15 @@ import type { } from '../types' import Tabs from './tabs' import { TabsEnum } from './types' +import { useTabs } from './hooks' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger, } from '@/app/components/base/portal-to-follow-elem' import Input from '@/app/components/base/input' -import SearchBox from '@/app/components/plugins/marketplace/search-box' +// import SearchBox from '@/app/components/plugins/marketplace/search-box' +import cn from '@/utils/classnames' import { Plus02, @@ -89,10 +91,12 @@ const NodeSelector: FC = ({ onSelect(type, toolDefaultValue) }, [handleOpenChange, onSelect]) - const [activeTab, setActiveTab] = useState(!blocks.length ? TabsEnum.Tools : TabsEnum.Blocks) - const handleActiveTabChange = useCallback((newActiveTab: TabsEnum) => { - setActiveTab(newActiveTab) - }, []) + const { + activeTab, + setActiveTab, + tabs, + } = useTabs(!blocks.length) + const searchPlaceholder = useMemo(() => { if (activeTab === TabsEnum.Blocks) return t('workflow.tabs.searchBlock') @@ -132,9 +136,31 @@ const NodeSelector: FC = ({ } -
-
e.stopPropagation()}> - {activeTab === TabsEnum.Blocks && ( +
+
+
+ { + tabs.map(tab => ( +
{ + e.stopPropagation() + setActiveTab(tab.key) + }} + > + {tab.name} +
+ )) + } +
+
= ({ onChange={e => setSearchText(e.target.value)} onClear={() => setSearchText('')} /> +
+
+ {/*
e.stopPropagation()}> + {activeTab === TabsEnum.Blocks && ( )} {activeTab === TabsEnum.Tools && ( = ({ placeholder={t('plugin.searchTools')!} /> )} - -
+
*/} = { + ...genNodeMetaData({ + sort: -1, + type: BlockEnum.DataSource, + }), defaultValue: { }, - getAvailablePrevNodes(isChatMode: boolean) { - const nodes = isChatMode - ? ALL_CHAT_AVAILABLE_BLOCKS - : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(type => type !== BlockEnum.End) - return nodes - }, - getAvailableNextNodes(isChatMode: boolean) { - const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS - return nodes - }, checkValid() { return { isValid: true,