From 762cabbd15eb2a28b5033df9c23c83815df8f962 Mon Sep 17 00:00:00 2001 From: Jaakko Husso Date: Wed, 3 Dec 2025 16:40:53 +0200 Subject: [PATCH] feat(core): Count 'chat' mode executions towards production execution concurrency limits (no-changelog) (#22624) --- .../concurrency-control.service.test.ts | 97 ++++++++++--------- .../concurrency-control.service.ts | 4 +- 2 files changed, 55 insertions(+), 46 deletions(-) diff --git a/packages/cli/src/concurrency/__tests__/concurrency-control.service.test.ts b/packages/cli/src/concurrency/__tests__/concurrency-control.service.test.ts index bdd3209cceb..bbdef1237fb 100644 --- a/packages/cli/src/concurrency/__tests__/concurrency-control.service.test.ts +++ b/packages/cli/src/concurrency/__tests__/concurrency-control.service.test.ts @@ -215,31 +215,34 @@ describe('ConcurrencyControlService', () => { }, ); - it.each(['webhook', 'trigger'])('should enqueue on %s mode', async (mode: ExecutionMode) => { - /** - * Arrange - */ - globalConfig.executions.concurrency.productionLimit = 1; + it.each(['webhook', 'trigger', 'chat'])( + 'should enqueue on %s mode', + async (mode: ExecutionMode) => { + /** + * Arrange + */ + globalConfig.executions.concurrency.productionLimit = 1; - const service = new ConcurrencyControlService( - logger, - executionRepository, - telemetry, - eventService, - globalConfig, - ); - const enqueueSpy = jest.spyOn(ConcurrencyQueue.prototype, 'enqueue'); + const service = new ConcurrencyControlService( + logger, + executionRepository, + telemetry, + eventService, + globalConfig, + ); + const enqueueSpy = jest.spyOn(ConcurrencyQueue.prototype, 'enqueue'); - /** - * Act - */ - await service.throttle({ mode, executionId: '1' }); + /** + * Act + */ + await service.throttle({ mode, executionId: '1' }); - /** - * Assert - */ - expect(enqueueSpy).toHaveBeenCalled(); - }); + /** + * Assert + */ + expect(enqueueSpy).toHaveBeenCalled(); + }, + ); it('should enqueue on evaluation mode', async () => { /** @@ -298,31 +301,34 @@ describe('ConcurrencyControlService', () => { }, ); - it.each(['webhook', 'trigger'])('should dequeue on %s mode', (mode: ExecutionMode) => { - /** - * Arrange - */ - globalConfig.executions.concurrency.productionLimit = 1; + it.each(['webhook', 'trigger', 'chat'])( + 'should dequeue on %s mode', + (mode: ExecutionMode) => { + /** + * Arrange + */ + globalConfig.executions.concurrency.productionLimit = 1; - const service = new ConcurrencyControlService( - logger, - executionRepository, - telemetry, - eventService, - globalConfig, - ); - const dequeueSpy = jest.spyOn(ConcurrencyQueue.prototype, 'dequeue'); + const service = new ConcurrencyControlService( + logger, + executionRepository, + telemetry, + eventService, + globalConfig, + ); + const dequeueSpy = jest.spyOn(ConcurrencyQueue.prototype, 'dequeue'); - /** - * Act - */ - service.release({ mode }); + /** + * Act + */ + service.release({ mode }); - /** - * Assert - */ - expect(dequeueSpy).toHaveBeenCalled(); - }); + /** + * Assert + */ + expect(dequeueSpy).toHaveBeenCalled(); + }, + ); it('should dequeue on evaluation mode', () => { /** @@ -381,7 +387,7 @@ describe('ConcurrencyControlService', () => { }, ); - it.each(['webhook', 'trigger'])( + it.each(['webhook', 'trigger', 'chat'])( 'should remove an execution on %s mode', (mode: ExecutionMode) => { /** @@ -559,6 +565,7 @@ describe('ConcurrencyControlService', () => { */ await service.throttle({ mode: 'trigger', executionId: '1' }); await service.throttle({ mode: 'webhook', executionId: '2' }); + await service.throttle({ mode: 'chat', executionId: '3' }); /** * Assert diff --git a/packages/cli/src/concurrency/concurrency-control.service.ts b/packages/cli/src/concurrency/concurrency-control.service.ts index 512d3c3ced6..67eb56e1138 100644 --- a/packages/cli/src/concurrency/concurrency-control.service.ts +++ b/packages/cli/src/concurrency/concurrency-control.service.ts @@ -206,7 +206,9 @@ export class ConcurrencyControlService { return undefined; } - if (mode === 'webhook' || mode === 'trigger') return this.queues.get('production'); + if (mode === 'webhook' || mode === 'trigger' || mode === 'chat') { + return this.queues.get('production'); + } if (mode === 'evaluation') return this.queues.get('evaluation');