From 7830ceccf5ff02412e046bfbaa179e8dabecf334 Mon Sep 17 00:00:00 2001 From: Albert Alises Date: Thu, 25 Jun 2026 13:09:41 +0200 Subject: [PATCH] fix(core): Route split in batches chains through loop output (#32968) --- .../src/workflow-builder.integration.test.ts | 30 +++++++++++++++++++ .../@n8n/workflow-sdk/src/workflow-builder.ts | 5 ++-- .../split-in-batches-handler.ts | 22 ++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/packages/@n8n/workflow-sdk/src/workflow-builder.integration.test.ts b/packages/@n8n/workflow-sdk/src/workflow-builder.integration.test.ts index c468fdfc084..a5b83ca498f 100644 --- a/packages/@n8n/workflow-sdk/src/workflow-builder.integration.test.ts +++ b/packages/@n8n/workflow-sdk/src/workflow-builder.integration.test.ts @@ -681,6 +681,36 @@ describe('New SDK API', () => { // Process Item loops back to Split In Batches via nextBatch() expect(json.connections['Process Item'].main[0]![0].node).toBe('Process Batches'); }); + + it('chains nodes after a bare splitInBatches builder from the loop output', () => { + const t = createTrigger('Start'); + const defineScenarios = createNode('Define Scenarios'); + const loop = splitInBatches({ + version: 3, + config: { + name: 'Loop Each Item', + parameters: { batchSize: 1, options: {} }, + }, + }); + const generatePrompt = createNode('Generate Prompt'); + const extractPrompt = createNode('Extract Prompt'); + const logResult = createNode('Log Result'); + + const wf = workflow('test', 'Agentic AI Image Generator') + .add(t) + .to(defineScenarios) + .to(loop) + .to(generatePrompt) + .to(extractPrompt) + .to(logResult) + .to(nextBatch(loop)); + + const json = wf.toJSON(); + + expect(json.connections['Loop Each Item'].main[0] ?? []).toEqual([]); + expect(json.connections['Loop Each Item'].main[1]![0].node).toBe('Generate Prompt'); + expect(json.connections['Log Result'].main[0]![0].node).toBe('Loop Each Item'); + }); }); describe('API Integration: Complete Workflow Examples', () => { diff --git a/packages/@n8n/workflow-sdk/src/workflow-builder.ts b/packages/@n8n/workflow-sdk/src/workflow-builder.ts index b1c239b2d7a..bdb33ddcfc3 100644 --- a/packages/@n8n/workflow-sdk/src/workflow-builder.ts +++ b/packages/@n8n/workflow-sdk/src/workflow-builder.ts @@ -345,8 +345,9 @@ class WorkflowBuilderImpl implements WorkflowBuilder { } } - this._currentNode = headName; - this._currentOutput = 0; + const continuation = thenHandler.handleThen?.(nodeOrComposite, headName, 0, ctx); + this._currentNode = continuation?.currentNode ?? headName; + this._currentOutput = continuation?.currentOutput ?? 0; return this; } diff --git a/packages/@n8n/workflow-sdk/src/workflow-builder/plugins/composite-handlers/split-in-batches-handler.ts b/packages/@n8n/workflow-sdk/src/workflow-builder/plugins/composite-handlers/split-in-batches-handler.ts index 18641ea6dd4..3dc1b6da523 100644 --- a/packages/@n8n/workflow-sdk/src/workflow-builder/plugins/composite-handlers/split-in-batches-handler.ts +++ b/packages/@n8n/workflow-sdk/src/workflow-builder/plugins/composite-handlers/split-in-batches-handler.ts @@ -130,8 +130,30 @@ export const splitInBatchesHandler: CompositeHandlerPlugin 0) || + (input._eachBatches !== undefined && input._eachBatches.length > 0) + ); +} + /** * Process named syntax: splitInBatches(sibNode, { done: ..., each: ... }) */