diff --git a/packages/global/core/workflow/template/system/loopEnd.ts b/packages/global/core/workflow/template/system/loopEnd.ts index cf32b9d19e84..c1abaebb092f 100644 --- a/packages/global/core/workflow/template/system/loopEnd.ts +++ b/packages/global/core/workflow/template/system/loopEnd.ts @@ -27,7 +27,8 @@ export const LoopEndNode: FlowNodeTemplateType = { valueType: WorkflowIOValueTypeEnum.any, label: '', required: true, - value: [] + value: [], + showType: true } ], outputs: [] diff --git a/packages/global/core/workflow/type/io.d.ts b/packages/global/core/workflow/type/io.d.ts index 988789ff59bc..11ef55fa909e 100644 --- a/packages/global/core/workflow/type/io.d.ts +++ b/packages/global/core/workflow/type/io.d.ts @@ -54,6 +54,7 @@ export type FlowNodeInputItemType = InputComponentPropsType & { // render components params canEdit?: boolean; // dynamic inputs isPro?: boolean; // Pro version field + showType?: boolean; // show data type }; export type FlowNodeOutputItemType = { diff --git a/packages/service/core/workflow/dispatch/tools/runLoop.ts b/packages/service/core/workflow/dispatch/tools/runLoop.ts index dd787ec8efe8..864585729288 100644 --- a/packages/service/core/workflow/dispatch/tools/runLoop.ts +++ b/packages/service/core/workflow/dispatch/tools/runLoop.ts @@ -25,8 +25,10 @@ export const dispatchLoop = async (props: Props): Promise => { const runNodes = runtimeNodes.filter((node) => childNodes.includes(node.nodeId)); const outputArray = []; const loopDetail: ChatHistoryItemResType[] = []; + let totalPoints = 0; + let totalTokens = 0; - for (const element of loopInputArray) { + for await (const element of loopInputArray) { const response = await dispatchWorkFlow({ ...props, runtimeNodes: runNodes.map((node) => @@ -54,10 +56,16 @@ export const dispatchLoop = async (props: Props): Promise => { )?.loopOutputElement; outputArray.push(loopOutputElement); loopDetail.push(...response.flowResponses); + response.flowResponses.forEach((res) => { + totalPoints = totalPoints + (res.totalPoints ?? 0); + totalTokens = totalTokens + (res.tokens ?? 0); + }); } return { [DispatchNodeResponseKeyEnum.nodeResponse]: { + totalPoints: totalPoints, + tokens: totalTokens, loopInput: loopInputArray, loopResult: outputArray, loopDetail: loopDetail diff --git a/projects/app/src/components/core/chat/components/WholeResponseModal.tsx b/projects/app/src/components/core/chat/components/WholeResponseModal.tsx index 848cb010fdd8..bc5dfd1ddd5a 100644 --- a/projects/app/src/components/core/chat/components/WholeResponseModal.tsx +++ b/projects/app/src/components/core/chat/components/WholeResponseModal.tsx @@ -39,7 +39,6 @@ export const WholeResponseContent = ({ showDetail: boolean; }) => { const { t } = useTranslation(); - console.log('activeModule', activeModule); // Auto scroll to top const ContentRef = useRef(null); diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/hooks/useWorkflow.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/hooks/useWorkflow.tsx index b100b42445f5..a7de76f64f9d 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/hooks/useWorkflow.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/hooks/useWorkflow.tsx @@ -378,8 +378,6 @@ export const useWorkflow = () => { } } - customApplyNodeChanges(changes, nodes); - onNodesChange(changes); }; @@ -439,7 +437,6 @@ export const useWorkflow = () => { change.selected = true; } else { return (() => { - customApplyNodeChanges(changes, nodes); onNodesChange(changes); })(); } @@ -458,25 +455,23 @@ export const useWorkflow = () => { onNodesChange(changes); resetNodeSizeAndPosition(rect, parentId); })(); - } else if (nodes.find((item) => item.data.parentNodeId === node.id)) { + } else if (nodes.some((item) => item.data.parentNodeId === node.id)) { const parentId = node.id; const childNodes = nodes.filter((n) => n.data.parentNodeId === parentId); const initPosition = node.position; const deltaX = change.position?.x ? change.position.x - initPosition.x : 0; const deltaY = change.position?.y ? change.position.y - initPosition.y : 0; - const childNodesChange = childNodes.map((node) => { + const childNodesChange: NodePositionChange[] = childNodes.map((node) => { if (change.dragging) { + const position = { + x: node.position.x + deltaX, + y: node.position.y + deltaY + }; return { ...change, id: node.id, - position: { - x: node.position.x + deltaX, - y: node.position.y + deltaY - }, - positionAbsolute: { - x: node.position.x + deltaX, - y: node.position.y + deltaY - } + position, + positionAbsolute: position }; } else { return { @@ -490,11 +485,14 @@ export const useWorkflow = () => { // changes, // nodes.filter((node) => !node.data.parentNodeId) // ); - onNodesChange(changes.concat(childNodesChange)); + onNodesChange([...changes, ...childNodesChange]); })(); } else { return (() => { - customApplyNodeChanges(changes, nodes); + customApplyNodeChanges( + changes, + nodes.filter((node) => !node.data.parentNodeId) + ); onNodesChange(changes); })(); } @@ -509,6 +507,7 @@ export const useWorkflow = () => { const onNodeDragStop = useCallback( (_: any, node: Node) => { + if (!node) return; const intersections = getIntersectingNodes(node); const parentNode = intersections.find((item) => item.type === FlowNodeTypeEnum.loop); diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeLoop.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeLoop.tsx index faccb8cb1d15..7702463d675d 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeLoop.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeLoop.tsx @@ -1,12 +1,12 @@ import { FlowNodeItemType } from '@fastgpt/global/core/workflow/type/node'; -import React, { useCallback, useEffect } from 'react'; -import { Background, NodeProps, NodeResizeControl, NodeResizer, OnResize } from 'reactflow'; +import React, { useEffect } from 'react'; +import { Background, NodeProps } from 'reactflow'; import NodeCard from './render/NodeCard'; import Container from '../components/Container'; import IOTitle from '../components/IOTitle'; import { useTranslation } from 'react-i18next'; import RenderInput from './render/RenderInput'; -import { Box, Center, Flex } from '@chakra-ui/react'; +import { Box } from '@chakra-ui/react'; import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel'; import RenderOutput from './render/RenderOutput'; import { NodeInputKeyEnum } from '@fastgpt/global/core/workflow/constants'; diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeLoopEnd.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeLoopEnd.tsx index cdbe6fbdb4de..c953c962fe06 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeLoopEnd.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeLoopEnd.tsx @@ -1,16 +1,16 @@ import { FlowNodeItemType } from '@fastgpt/global/core/workflow/type/node'; -import { useTranslation } from 'react-i18next'; import { NodeProps } from 'reactflow'; import NodeCard from './render/NodeCard'; -import EmptyTip from '@fastgpt/web/components/common/EmptyTip'; import Reference from './render/RenderInput/templates/Reference'; import { Box } from '@chakra-ui/react'; +import React from 'react'; +import { NodeInputKeyEnum } from '@fastgpt/global/core/workflow/constants'; const NodeLoopEnd = ({ data, selected }: NodeProps) => { - const { t } = useTranslation(); const { nodeId, inputs } = data; - const inputItem = inputs.find((input) => input.key === 'loopOutputArrayElement'); + const inputItem = inputs.find((input) => input.key === NodeInputKeyEnum.loopOutputArrayElement); + if (!inputItem) return null; return ( ) => { }} > - {inputItem && } + ); }; -export default NodeLoopEnd; +export default React.memo(NodeLoopEnd); diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeLoopStart.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeLoopStart.tsx index a1b5a1204c7e..e6183be11c1f 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeLoopStart.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeLoopStart.tsx @@ -12,7 +12,7 @@ import { } from '@fastgpt/global/core/workflow/constants'; import VariableTable from './NodePluginIO/VariableTable'; import { Box } from '@chakra-ui/react'; -import { useEffect } from 'react'; +import React, { useEffect } from 'react'; import { FlowNodeOutputTypeEnum } from '@fastgpt/global/core/workflow/node/constant'; const typeMap = { @@ -109,4 +109,4 @@ const NodeLoopStart = ({ data, selected }: NodeProps) => { ); }; -export default NodeLoopStart; +export default React.memo(NodeLoopStart); diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/templates/Reference.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/templates/Reference.tsx index ca11b22756e8..8818bb6df1cf 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/templates/Reference.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/templates/Reference.tsx @@ -30,10 +30,12 @@ type SelectProps = { children: { label: string; value: string; + valueType?: WorkflowIOValueTypeEnum; }[]; }[]; onSelect: (val: ReferenceValueProps) => void; styles?: ButtonProps; + showType?: boolean; }; const Reference = ({ item, nodeId }: RenderInputProps) => { @@ -83,6 +85,7 @@ const Reference = ({ item, nodeId }: RenderInputProps) => { list={referenceList} value={formatValue} onSelect={onSelect} + showType={item.showType} /> ); }; @@ -139,7 +142,8 @@ export const useReference = ({ .map((output) => { return { label: t((output.label as any) || ''), - value: output.id + value: output.id, + valueType: output.valueType }; }) }; @@ -166,7 +170,13 @@ export const useReference = ({ formatValue }; }; -export const ReferSelector = ({ placeholder, value, list = [], onSelect }: SelectProps) => { +export const ReferSelector = ({ + placeholder, + value, + list = [], + onSelect, + showType +}: SelectProps) => { const selectItemLabel = useMemo(() => { if (!value) { return; @@ -179,7 +189,12 @@ export const ReferSelector = ({ placeholder, value, list = [], onSelect }: Selec if (!secondColumn) { return; } - return [firstColumn, secondColumn]; + const valueType = secondColumn.valueType; + return { + firstColumn: firstColumn, + secondColumn: secondColumn, + valueType: valueType + }; }, [list, value]); const Render = useMemo(() => { @@ -188,9 +203,24 @@ export const ReferSelector = ({ placeholder, value, list = [], onSelect }: Selec label={ selectItemLabel ? ( - {selectItemLabel[0].label} + {selectItemLabel.firstColumn.label} - {selectItemLabel[1].label} + {selectItemLabel.secondColumn.label} + {showType && ( + + {selectItemLabel.valueType} + + )} ) : ( {placeholder} diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/context.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/context.tsx index 80ed35eccddd..a5daf3facd80 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/context.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/context.tsx @@ -888,7 +888,6 @@ const WorkflowContextProvider = ({ ); if (isPastEqual) return false; - console.log(currentNodes); setPast((past) => [ {