From a6c7e39cb8cd82c3d03af984bdb52a2541140038 Mon Sep 17 00:00:00 2001 From: Eugene Date: Fri, 26 Sep 2025 10:57:58 +0200 Subject: [PATCH] fix(OpenAI Node): Missing header for assistant API calls (#20060) --- .../credentials/OpenAiApi.credentials.ts | 10 ++-- .../test/OpenAiApi.credentials.test.ts | 48 +++++++++++++++++++ 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/packages/nodes-base/credentials/OpenAiApi.credentials.ts b/packages/nodes-base/credentials/OpenAiApi.credentials.ts index 162ee0db14e..aba20a61f0e 100644 --- a/packages/nodes-base/credentials/OpenAiApi.credentials.ts +++ b/packages/nodes-base/credentials/OpenAiApi.credentials.ts @@ -82,10 +82,11 @@ export class OpenAiApi implements ICredentialType { credentials: ICredentialDataDecryptedObject, requestOptions: IHttpRequestOptions, ): Promise { - requestOptions.headers = { - Authorization: 'Bearer ' + credentials.apiKey, - 'OpenAI-Organization': credentials.organizationId, - }; + requestOptions.headers ??= {}; + + requestOptions.headers['Authorization'] = `Bearer ${credentials.apiKey}`; + requestOptions.headers['OpenAI-Organization'] = credentials.organizationId; + if ( credentials.header && typeof credentials.headerName === 'string' && @@ -94,6 +95,7 @@ export class OpenAiApi implements ICredentialType { ) { requestOptions.headers[credentials.headerName] = credentials.headerValue; } + return requestOptions; } } diff --git a/packages/nodes-base/credentials/test/OpenAiApi.credentials.test.ts b/packages/nodes-base/credentials/test/OpenAiApi.credentials.test.ts index d612c5799e6..a90a807707a 100644 --- a/packages/nodes-base/credentials/test/OpenAiApi.credentials.test.ts +++ b/packages/nodes-base/credentials/test/OpenAiApi.credentials.test.ts @@ -151,5 +151,53 @@ describe('OpenAiApi Credential', () => { 'OpenAI-Organization': '', }); }); + + it('should preserve existing headers when adding auth headers', async () => { + const credentials: ICredentialDataDecryptedObject = { + apiKey: 'sk-test123456789', + }; + + const requestOptions: IHttpRequestOptions = { + headers: { + 'OpenAI-Beta': 'assistants=v2', + }, + url: '/assistants', + baseURL: 'https://api.openai.com/v1', + }; + + const result = await openAiApi.authenticate(credentials, requestOptions); + + expect(result.headers).toEqual({ + 'OpenAI-Beta': 'assistants=v2', + Authorization: 'Bearer sk-test123456789', + }); + }); + + it('should preserve existing headers even with custom header option enabled', async () => { + const credentials: ICredentialDataDecryptedObject = { + apiKey: 'sk-test123456789', + header: true, + headerName: 'X-Additional-Header', + headerValue: 'additional-value', + }; + + const requestOptions: IHttpRequestOptions = { + headers: { + 'OpenAI-Beta': 'assistants=v2', + 'X-Existing-Header': 'existing-value', + }, + url: '/assistants/asst_123', + baseURL: 'https://api.openai.com/v1', + }; + + const result = await openAiApi.authenticate(credentials, requestOptions); + + expect(result.headers).toEqual({ + 'OpenAI-Beta': 'assistants=v2', + 'X-Existing-Header': 'existing-value', + Authorization: 'Bearer sk-test123456789', + 'X-Additional-Header': 'additional-value', + }); + }); }); });