From 16ed2ab736442c51971177cb908d8e6664c1a833 Mon Sep 17 00:00:00 2001 From: heheer <1239331448@qq.com> Date: Sat, 25 Jan 2025 11:30:09 +0800 Subject: [PATCH] fix interactive edge --- .../global/core/workflow/runtime/utils.ts | 4 +-- .../service/core/workflow/dispatch/index.ts | 25 ++++++++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/packages/global/core/workflow/runtime/utils.ts b/packages/global/core/workflow/runtime/utils.ts index e7523f123309..3bba74f7c68b 100644 --- a/packages/global/core/workflow/runtime/utils.ts +++ b/packages/global/core/workflow/runtime/utils.ts @@ -207,7 +207,7 @@ export const checkNodeRunStatus = ({ currentNode: node }); - // check skip(其中一组边,全 skip) + // check skip(其中一组边,全是 skiped 则跳过运行) if (commonEdges.length > 0 && commonEdges.every((item) => item.status === 'skipped')) { return 'skip'; } @@ -215,7 +215,7 @@ export const checkNodeRunStatus = ({ return 'skip'; } - // check active(有一类边,不全是 wait 即可运行) + // check active(其中一组边,全不是 waiting 即可运行) if (commonEdges.length > 0 && commonEdges.every((item) => item.status !== 'waiting')) { return 'run'; } diff --git a/packages/service/core/workflow/dispatch/index.ts b/packages/service/core/workflow/dispatch/index.ts index d13ef910aeb5..56eb9d942a48 100644 --- a/packages/service/core/workflow/dispatch/index.ts +++ b/packages/service/core/workflow/dispatch/index.ts @@ -339,12 +339,35 @@ export async function dispatchWorkFlow(data: Props): Promise = new Set() + ): boolean => { + const target = edge.target; + if (entryNodeSet.has(target)) return true; + + if (visited.has(target)) return false; + + visited.add(target); + const canReach = runtimeEdges + .filter((e) => e.source === target) + .some((nextEdge) => canReachEntry(nextEdge, new Set(visited))); + + visited.delete(target); + return canReach; + }; + const interactiveResult: WorkflowInteractiveResponseType = { ...interactiveResponse, entryNodeIds, memoryEdges: runtimeEdges.map((edge) => ({ ...edge, - status: entryNodeIds.includes(edge.target) ? 'active' : edge.status + status: entryNodeSet.has(edge.target) + ? 'active' + : canReachEntry(edge) + ? edge.status + : 'waiting' // 未执行过的边,重置状态为waiting })), nodeOutputs };