From b4c1f592dc2b70a1015122473a4bd7799d5475f5 Mon Sep 17 00:00:00 2001 From: Martin Horn Date: Fri, 26 Dec 2025 10:14:38 +0100 Subject: [PATCH] AP-25468: Fixed input/output ids for combined tools workflow ... that is output by the Agent Chat Widget. AP-25468 (Make Agent Chat Widget compatible with Integrated Deployment) --- .../org/knime/python3/nodes/ToolExecutor.java | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/org.knime.python3.nodes/src/main/java/org/knime/python3/nodes/ToolExecutor.java b/org.knime.python3.nodes/src/main/java/org/knime/python3/nodes/ToolExecutor.java index f8465e91e..36ad03a3b 100644 --- a/org.knime.python3.nodes/src/main/java/org/knime/python3/nodes/ToolExecutor.java +++ b/org.knime.python3.nodes/src/main/java/org/knime/python3/nodes/ToolExecutor.java @@ -56,6 +56,7 @@ import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; +import java.util.stream.IntStream; import java.util.stream.Stream; import org.knime.core.data.filestore.FileStore; @@ -266,9 +267,9 @@ PythonPortObject getCombinedToolsWorkflow() { spec = new WorkflowPortObjectSpec(ws, name, List.of(), List.of()); } else { var wfm = m_combinedToolsWorkflow.loadAndGetWorkflow(); - var inputIds = new ArrayList(); - var outputIds = new ArrayList(); - var ws = createWorkflowSegmentWithRemovedIONodes(wfm, inputIds, outputIds); + var ws = createWorkflowSegmentWithRemovedIONodes(wfm); + var inputIds = IntStream.range(0, ws.getConnectedInputs().size()).mapToObj(i -> "input-" + i).toList(); + var outputIds = IntStream.range(0, ws.getConnectedOutputs().size()).mapToObj(i -> "output-" + i).toList(); spec = new WorkflowPortObjectSpec(ws, wfm.getName(), inputIds, outputIds); } var wpo = new WorkflowPortObject(spec); @@ -406,8 +407,7 @@ private static WorkflowSegment createEmptyWorkflowSegment(final String name) { return new WorkflowSegment(createEmptyWorkflow(name), List.of(), List.of(), Set.of()); } - private static WorkflowSegment createWorkflowSegmentWithRemovedIONodes(final WorkflowManager wfm, - final List inputIds, final List outputIds) { + private static WorkflowSegment createWorkflowSegmentWithRemovedIONodes(final WorkflowManager wfm) { WorkflowManager segmentWfm; segmentWfm = createEmptyWorkflow("workflow_segment"); var copyContent = WorkflowCopyContent.builder() @@ -415,7 +415,7 @@ private static WorkflowSegment createWorkflowSegmentWithRemovedIONodes(final Wor segmentWfm.copyFromAndPasteHere(wfm, copyContent); List inputs = new ArrayList<>(); List outputs = new ArrayList<>(); - removeAndCollectContainerInputsAndOutputs(segmentWfm, inputs, inputIds, outputs, outputIds); + removeAndCollectContainerInputsAndOutputs(segmentWfm, inputs, outputs); return new WorkflowSegment(segmentWfm, inputs, outputs, Set.of()); } @@ -431,11 +431,11 @@ private static WorkflowManager createEmptyWorkflow(final String name) { } private static void removeAndCollectContainerInputsAndOutputs(final WorkflowManager wfm, final List inputs, - final List inputIds, final List outputs, final List outputIds) { + final List outputs) { List nodesToRemove = new ArrayList<>(); for (NodeContainer nc : wfm.getNodeContainers()) { if (nc instanceof NativeNodeContainer nnc - && (collectInputs(wfm, inputs, inputIds, nnc) || collectOutputs(wfm, outputs, outputIds, nnc))) { + && (collectInputs(wfm, inputs, nnc) || collectOutputs(wfm, outputs, nnc))) { nodesToRemove.add(nnc.getID()); } } @@ -443,13 +443,11 @@ private static void removeAndCollectContainerInputsAndOutputs(final WorkflowMana } private static boolean collectOutputs(final WorkflowManager wfm, final List outputs, - final List outputIds, final NativeNodeContainer nnc) { + final NativeNodeContainer nnc) { if (nnc.getNodeModel() instanceof DefaultVirtualPortObjectOutNodeModel) { for (ConnectionContainer cc : wfm.getIncomingConnectionsFor(nnc.getID())) { outputs.add(new Output(nnc.getInPort(cc.getDestPort()).getPortType(), null, new PortID(NodeIDSuffix.create(wfm.getID(), cc.getSource()), cc.getSourcePort()))); - outputIds.add(wfm.getNodeContainer(cc.getSource()).getOutPort(cc.getSourcePort()).getPortName() + "-" - + outputIds.size()); } return true; } else { @@ -458,7 +456,7 @@ private static boolean collectOutputs(final WorkflowManager wfm, final List inputs, - final List inputIds, final NativeNodeContainer nnc) { + final NativeNodeContainer nnc) { if (nnc.getNodeModel() instanceof DefaultVirtualPortObjectInNodeModel) { for (var i = 0; i < nnc.getNrOutPorts(); i++) { Set ports = wfm.getOutgoingConnectionsFor(nnc.getID(), i).stream() @@ -466,9 +464,6 @@ private static boolean collectInputs(final WorkflowManager wfm, final List