diff --git a/web/app/components/workflow/block-selector/all-tools.tsx b/web/app/components/workflow/block-selector/all-tools.tsx index 870d791d4f..93b7a301da 100644 --- a/web/app/components/workflow/block-selector/all-tools.tsx +++ b/web/app/components/workflow/block-selector/all-tools.tsx @@ -1,3 +1,7 @@ +import type { + Dispatch, + SetStateAction, +} from 'react' import { useEffect, useMemo, @@ -21,6 +25,7 @@ import PluginList, { type ListProps } from '@/app/components/workflow/block-sele import { PluginType } from '../../plugins/types' import { useMarketplacePlugins } from '../../plugins/marketplace/hooks' import { useGlobalPublicStore } from '@/context/global-public-context' +import RAGToolSuggestions from './rag-tool-suggestions' type AllToolsProps = { className?: string @@ -36,6 +41,8 @@ type AllToolsProps = { onSelectMultiple?: (type: BlockEnum, tools: ToolDefaultValue[]) => void selectedTools?: ToolValue[] canChooseMCPTool?: boolean + onTagsChange: Dispatch> + isInRAGPipeline?: boolean } const DEFAULT_TAGS: AllToolsProps['tags'] = [] @@ -54,6 +61,8 @@ const AllTools = ({ mcpTools = [], selectedTools, canChooseMCPTool, + onTagsChange, + isInRAGPipeline = false, }: AllToolsProps) => { const language = useGetLanguage() const tabs = useToolTabs() @@ -101,13 +110,14 @@ const AllTools = ({ category: PluginType.tool, }) } - // eslint-disable-next-line react-hooks/exhaustive-deps }, [searchText, tags, enable_marketplace]) const pluginRef = useRef(null) const wrapElemRef = useRef(null) const isSupportGroupView = [ToolTypeEnum.All, ToolTypeEnum.BuiltIn].includes(activeTab) + const isShowRAGRecommendations = isInRAGPipeline && activeTab === ToolTypeEnum.All && !searchText + return (
@@ -137,6 +147,14 @@ const AllTools = ({ className='max-h-[464px] overflow-y-auto' onScroll={pluginRef.current?.handleScroll} > + {isShowRAGRecommendations && ( + + )} {/* Plugins from marketplace */} - {enable_marketplace && } + {enable_marketplace && ( + + )}
) diff --git a/web/app/components/workflow/block-selector/main.tsx b/web/app/components/workflow/block-selector/main.tsx index 0e97cefc90..631b85cd8c 100644 --- a/web/app/components/workflow/block-selector/main.tsx +++ b/web/app/components/workflow/block-selector/main.tsx @@ -197,6 +197,7 @@ const NodeSelector: FC = ({ noBlocks={noBlocks} dataSources={dataSources} noTools={noTools} + onTagsChange={setTags} /> diff --git a/web/app/components/workflow/block-selector/rag-tool-suggestions.tsx b/web/app/components/workflow/block-selector/rag-tool-suggestions.tsx new file mode 100644 index 0000000000..52c527a13e --- /dev/null +++ b/web/app/components/workflow/block-selector/rag-tool-suggestions.tsx @@ -0,0 +1,58 @@ +import type { Dispatch, SetStateAction } from 'react' +import React, { useCallback } from 'react' +import { useTranslation } from 'react-i18next' +import type { OnSelectBlock, ToolWithProvider } from '../types' +// import Tools from './tools' +// import { ToolTypeEnum } from './types' +import type { ViewType } from './view-type-select' +import { RiMoreLine } from '@remixicon/react' + +type RAGToolSuggestionsProps = { + tools: ToolWithProvider[] + viewType: ViewType + onSelect: OnSelectBlock + onTagsChange: Dispatch> +} + +const RAGToolSuggestions: React.FC = ({ + // tools, + // viewType, + // onSelect, + onTagsChange, +}) => { + const { t } = useTranslation() + + const loadMore = useCallback(() => { + onTagsChange(prev => [...prev, 'rag']) + }, [onTagsChange]) + + return ( +
+
+ {t('pipeline.ragToolSuggestions.title')} +
+ {/* */} +
+
+ +
+
+ {t('common.operation.more')} +
+
+
+ ) +} + +export default React.memo(RAGToolSuggestions) diff --git a/web/app/components/workflow/block-selector/tabs.tsx b/web/app/components/workflow/block-selector/tabs.tsx index 9be52ef3b0..91d5ac3af6 100644 --- a/web/app/components/workflow/block-selector/tabs.tsx +++ b/web/app/components/workflow/block-selector/tabs.tsx @@ -1,4 +1,4 @@ -import type { FC } from 'react' +import type { Dispatch, FC, SetStateAction } from 'react' import { memo } from 'react' import { useAllBuiltInTools, useAllCustomTools, useAllMCPTools, useAllWorkflowTools } from '@/service/use-tools' import type { @@ -18,6 +18,7 @@ export type TabsProps = { onActiveTabChange: (activeTab: TabsEnum) => void searchText: string tags: string[] + onTagsChange: Dispatch> onSelect: OnSelectBlock availableBlocksTypes?: BlockEnum[] blocks: NodeDefault[] @@ -34,6 +35,7 @@ const Tabs: FC = ({ activeTab, onActiveTabChange, tags, + onTagsChange, searchText, onSelect, availableBlocksTypes, @@ -109,6 +111,8 @@ const Tabs: FC = ({ workflowTools={workflowTools || []} mcpTools={mcpTools || []} canChooseMCPTool + onTagsChange={onTagsChange} + isInRAGPipeline={dataSources.length > 0} /> ) } diff --git a/web/app/components/workflow/block-selector/tools.tsx b/web/app/components/workflow/block-selector/tools.tsx index da47432b04..feb34d2651 100644 --- a/web/app/components/workflow/block-selector/tools.tsx +++ b/web/app/components/workflow/block-selector/tools.tsx @@ -28,6 +28,7 @@ type ToolsProps = { indexBarClassName?: string selectedTools?: ToolValue[] canChooseMCPTool?: boolean + isShowRAGRecommendations?: boolean } const Blocks = ({ onSelect, @@ -42,6 +43,7 @@ const Blocks = ({ indexBarClassName, selectedTools, canChooseMCPTool, + isShowRAGRecommendations = false, }: ToolsProps) => { // const tools: any = [] const { t } = useTranslation() @@ -105,7 +107,12 @@ const Blocks = ({ } {!tools.length && !hasSearchText && (
- + +
+ )} + {!!tools.length && isShowRAGRecommendations && ( +
+ {t('tools.allTools')}
)} {!!tools.length && ( diff --git a/web/i18n/en-US/pipeline.ts b/web/i18n/en-US/pipeline.ts index 1b4f33aed1..cdbb7df76d 100644 --- a/web/i18n/en-US/pipeline.ts +++ b/web/i18n/en-US/pipeline.ts @@ -31,6 +31,9 @@ const translation = { footerTip: 'In test run mode, preview up to {{count}} chunks', }, }, + ragToolSuggestions: { + title: 'Suggestions for RAG', + }, } export default translation diff --git a/web/i18n/en-US/tools.ts b/web/i18n/en-US/tools.ts index dfbfb82d8b..7e95549cb2 100644 --- a/web/i18n/en-US/tools.ts +++ b/web/i18n/en-US/tools.ts @@ -234,6 +234,7 @@ const translation = { publishTip: 'App not published. Please publish the app first.', }, }, + allTools: 'All tools', } export default translation diff --git a/web/i18n/zh-Hans/pipeline.ts b/web/i18n/zh-Hans/pipeline.ts index 98a49c4df2..72c53b42dc 100644 --- a/web/i18n/zh-Hans/pipeline.ts +++ b/web/i18n/zh-Hans/pipeline.ts @@ -31,6 +31,9 @@ const translation = { footerTip: '在测试运行模式下,最多预览 {{count}} 个分段', }, }, + ragToolSuggestions: { + title: 'RAG 工具推荐', + }, } export default translation diff --git a/web/i18n/zh-Hans/tools.ts b/web/i18n/zh-Hans/tools.ts index 82be1c9bb0..81b92c2aff 100644 --- a/web/i18n/zh-Hans/tools.ts +++ b/web/i18n/zh-Hans/tools.ts @@ -234,6 +234,7 @@ const translation = { publishTip: '应用未发布。请先发布应用。', }, }, + allTools: '全部工具', } export default translation