From 2925d654d14167ff8f8dad8b79be8ea0be8eddfc Mon Sep 17 00:00:00 2001 From: oleg Date: Fri, 5 Jun 2026 15:15:45 +0200 Subject: [PATCH] fix: Use UUID thread IDs for Instance AI evals (no-changelog) (#31830) --- .../__tests__/runner-thread-id.test.ts | 40 +++++++++++++++++++ .../evaluations/computer-use/chat.ts | 2 +- .../instance-ai/evaluations/harness/runner.ts | 2 +- 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 packages/@n8n/instance-ai/evaluations/__tests__/runner-thread-id.test.ts diff --git a/packages/@n8n/instance-ai/evaluations/__tests__/runner-thread-id.test.ts b/packages/@n8n/instance-ai/evaluations/__tests__/runner-thread-id.test.ts new file mode 100644 index 00000000000..722ebc69037 --- /dev/null +++ b/packages/@n8n/instance-ai/evaluations/__tests__/runner-thread-id.test.ts @@ -0,0 +1,40 @@ +import { vi } from 'vitest'; + +import type { N8nClient } from '../clients/n8n-client'; +import type { EvalLogger } from '../harness/logger'; +import { buildWorkflow } from '../harness/runner'; + +const silentLogger: EvalLogger = { + info: () => {}, + verbose: () => {}, + success: () => {}, + warn: () => {}, + error: () => {}, + isVerbose: false, +}; + +const uuidV4Pattern = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/; + +describe('buildWorkflow thread IDs', () => { + it('uses UUID thread IDs accepted by the instance-ai thread endpoint', async () => { + let capturedThreadId = ''; + const client = { + ensureThread: vi.fn(async (threadId: string) => { + capturedThreadId = threadId; + await Promise.resolve(); + throw new Error('stop after ensureThread'); + }), + } as unknown as N8nClient; + + await buildWorkflow({ + client, + conversation: [{ role: 'user', text: 'build a workflow' }], + preRunWorkflowIds: new Set(), + claimedWorkflowIds: new Set(), + logger: silentLogger, + }); + + expect(client.ensureThread).toHaveBeenCalledTimes(1); + expect(capturedThreadId).toMatch(uuidV4Pattern); + }); +}); diff --git a/packages/@n8n/instance-ai/evaluations/computer-use/chat.ts b/packages/@n8n/instance-ai/evaluations/computer-use/chat.ts index 1242181231e..e107d613aaf 100644 --- a/packages/@n8n/instance-ai/evaluations/computer-use/chat.ts +++ b/packages/@n8n/instance-ai/evaluations/computer-use/chat.ts @@ -42,7 +42,7 @@ export interface RunChatOptions { */ export async function runChat(options: RunChatOptions): Promise { const { client, prompt, timeoutMs, logger } = options; - const threadId = `cu-eval-${crypto.randomUUID()}`; + const threadId = crypto.randomUUID(); const startTime = Date.now(); const abortController = new AbortController(); diff --git a/packages/@n8n/instance-ai/evaluations/harness/runner.ts b/packages/@n8n/instance-ai/evaluations/harness/runner.ts index 0f8a5010a11..5ac2d390433 100644 --- a/packages/@n8n/instance-ai/evaluations/harness/runner.ts +++ b/packages/@n8n/instance-ai/evaluations/harness/runner.ts @@ -299,7 +299,7 @@ function isMultiTurnConversation(conversation: ConversationTurn[]): boolean { export async function buildWorkflow(config: BuildWorkflowConfig): Promise { const { client, conversation, logger } = config; const openingMessage = conversation[0]?.text ?? ''; - const threadId = `eval-${crypto.randomUUID()}`; + const threadId = crypto.randomUUID(); const startTime = Date.now(); const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;