From b7ed2cade1caddd62b78a5ec3dfabf3f86950ac2 Mon Sep 17 00:00:00 2001 From: zxhlyh Date: Fri, 22 Aug 2025 18:11:55 +0800 Subject: [PATCH] initial template --- .../hooks/use-pipeline-template.ts | 57 +++++++++++++++- .../components/workflow/nodes/tool/node.tsx | 3 + .../components/workflow/nodes/tool/panel.tsx | 3 +- .../components/workflow/nodes/tool/types.ts | 4 ++ .../workflow/nodes/tool/use-initial.ts | 68 +++++++++++++++++++ 5 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 web/app/components/workflow/nodes/tool/use-initial.ts diff --git a/web/app/components/rag-pipeline/hooks/use-pipeline-template.ts b/web/app/components/rag-pipeline/hooks/use-pipeline-template.ts index 753088f83c..2e9ac427c5 100644 --- a/web/app/components/rag-pipeline/hooks/use-pipeline-template.ts +++ b/web/app/components/rag-pipeline/hooks/use-pipeline-template.ts @@ -1,28 +1,79 @@ import { useTranslation } from 'react-i18next' import { generateNewNode } from '@/app/components/workflow/utils' import { + NODE_WIDTH_X_OFFSET, START_INITIAL_POSITION, } from '@/app/components/workflow/constants' import type { KnowledgeBaseNodeType } from '@/app/components/workflow/nodes/knowledge-base/types' import knowledgeBaseDefault from '@/app/components/workflow/nodes/knowledge-base/default' +import ToolNodeDefault from '@/app/components/workflow/nodes/tool/default' export const usePipelineTemplate = () => { const { t } = useTranslation() + const { newNode: difyExtractorNode } = generateNewNode({ + id: 'difyExtractor', + data: { + ...ToolNodeDefault.defaultValue, + type: ToolNodeDefault.metaData.type, + title: '', + provider_id: 'langgenius/dify_extractor/dify_extractor', + tool_name: 'dify_extractor', + _notInitialized: true, + }, + position: { + x: START_INITIAL_POSITION.x + NODE_WIDTH_X_OFFSET, + y: START_INITIAL_POSITION.y, + }, + } as any) + + const { newNode: generalChunkNode } = generateNewNode({ + id: 'generalChunk', + data: { + ...ToolNodeDefault.defaultValue, + type: ToolNodeDefault.metaData.type, + title: '', + provider_id: 'langgenius/general_chunker/general_chunker', + tool_name: 'general_chunker', + _notInitialized: true, + }, + position: { + x: START_INITIAL_POSITION.x + NODE_WIDTH_X_OFFSET * 2, + y: START_INITIAL_POSITION.y, + }, + } as any) + const { newNode: knowledgeBaseNode } = generateNewNode({ + id: 'knowledgeBase', data: { ...knowledgeBaseDefault.defaultValue as KnowledgeBaseNodeType, type: knowledgeBaseDefault.metaData.type, title: t(`workflow.blocks.${knowledgeBaseDefault.metaData.type}`), }, position: { - x: START_INITIAL_POSITION.x + 500, + x: START_INITIAL_POSITION.x + NODE_WIDTH_X_OFFSET * 3, y: START_INITIAL_POSITION.y, }, }) + const difyExtractorToGeneralChunkEdge = { + id: `${difyExtractorNode.id}-${generalChunkNode.id}`, + source: difyExtractorNode.id, + sourceHandle: 'source', + target: generalChunkNode.id, + targetHandle: 'target', + } + + const generalChunkToKnowledgeBaseEdge = { + id: `${generalChunkNode.id}-${knowledgeBaseNode.id}`, + source: generalChunkNode.id, + sourceHandle: 'source', + target: knowledgeBaseNode.id, + targetHandle: 'target', + } + return { - nodes: [knowledgeBaseNode], - edges: [], + nodes: [difyExtractorNode, generalChunkNode, knowledgeBaseNode], + edges: [difyExtractorToGeneralChunkEdge, generalChunkToKnowledgeBaseEdge], } } diff --git a/web/app/components/workflow/nodes/tool/node.tsx b/web/app/components/workflow/nodes/tool/node.tsx index 8cc3ec580d..a25ef270af 100644 --- a/web/app/components/workflow/nodes/tool/node.tsx +++ b/web/app/components/workflow/nodes/tool/node.tsx @@ -3,12 +3,15 @@ import React from 'react' import type { ToolNodeType } from './types' import type { NodeProps } from '@/app/components/workflow/types' import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' +import { useInitial } from './use-initial' const Node: FC> = ({ + id, data, }) => { const { tool_configurations, paramSchemas } = data const toolConfigs = Object.keys(tool_configurations || {}) + useInitial(id) if (!toolConfigs.length) return null diff --git a/web/app/components/workflow/nodes/tool/panel.tsx b/web/app/components/workflow/nodes/tool/panel.tsx index 7312fb0a89..5ab894c0d1 100644 --- a/web/app/components/workflow/nodes/tool/panel.tsx +++ b/web/app/components/workflow/nodes/tool/panel.tsx @@ -12,6 +12,7 @@ import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/compo import StructureOutputItem from '@/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/show' import { useStore } from '@/app/components/workflow/store' import { wrapStructuredVarItem } from '@/app/components/workflow/utils/tool' +import { useInitial } from './use-initial' const i18nPrefix = 'workflow.nodes.tool' @@ -20,7 +21,7 @@ const Panel: FC> = ({ data, }) => { const { t } = useTranslation() - + useInitial(id) const { readOnly, inputs, diff --git a/web/app/components/workflow/nodes/tool/types.ts b/web/app/components/workflow/nodes/tool/types.ts index 6294b9b689..c7a900a4f0 100644 --- a/web/app/components/workflow/nodes/tool/types.ts +++ b/web/app/components/workflow/nodes/tool/types.ts @@ -24,4 +24,8 @@ export type ToolNodeType = CommonNodeType & { paramSchemas?: Record[] version?: string tool_node_version?: string + tool_description?: string + is_team_authorization?: boolean + params?: Record + _notInitialized?: boolean } diff --git a/web/app/components/workflow/nodes/tool/use-initial.ts b/web/app/components/workflow/nodes/tool/use-initial.ts new file mode 100644 index 0000000000..998d905d75 --- /dev/null +++ b/web/app/components/workflow/nodes/tool/use-initial.ts @@ -0,0 +1,68 @@ +import { + useCallback, + useEffect, +} from 'react' +import { useStoreApi } from 'reactflow' +import { useNodeDataUpdate } from '@/app/components/workflow/hooks/use-node-data-update' +import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks' +import { useStore } from '../../store' +import type { ToolNodeType } from './types' +import { canFindTool } from '@/utils' + +export const useInitial = (id: string) => { + const store = useStoreApi() + const buildInTools = useStore(s => s.buildInTools) + const language = useLanguage() + const { handleNodeDataUpdateWithSyncDraft } = useNodeDataUpdate() + + const getNodeData = useCallback(() => { + const { getNodes } = store.getState() + const nodes = getNodes() + + return nodes.find(node => node.id === id) + }, [store, id]) + + const handleNodeDataUpdate = useCallback((data: Partial) => { + handleNodeDataUpdateWithSyncDraft({ + id, + data, + }) + }, [id, handleNodeDataUpdateWithSyncDraft]) + + const handleInitial = useCallback(() => { + const nodeData = getNodeData() + const { provider_id, tool_name, _notInitialized } = nodeData?.data + const currCollection = buildInTools.find(item => canFindTool(item.id, provider_id)) + const currTool = currCollection?.tools.find(tool => tool.name === tool_name) + + if (!currTool) + return + + if (_notInitialized && currCollection) { + const params: Record = {} + if (currTool.parameters) { + currTool.parameters.forEach((item) => { + params[item.name] = '' + }) + } + handleNodeDataUpdate({ + provider_id: currCollection.id, + provider_type: currCollection.type as any, + provider_name: currCollection.name, + tool_name: currTool.name, + tool_label: currTool.label[language], + tool_description: currTool.description[language], + title: currTool.label[language], + is_team_authorization: currCollection.is_team_authorization, + output_schema: currTool.output_schema, + paramSchemas: currTool.parameters, + params, + _notInitialized: false, + }) + } + }, [handleNodeDataUpdate, language, buildInTools, getNodeData]) + + useEffect(() => { + handleInitial() + }, [handleInitial]) +}