From 1f1730c27d491a444507f9de1db9b6988dfcf455 Mon Sep 17 00:00:00 2001 From: Tomi Turtiainen <10324676+tomi@users.noreply.github.com> Date: Mon, 25 Aug 2025 15:44:13 +0300 Subject: [PATCH] perf(OpenAI Node): Use streaming for file operations (#18666) --- .../actions/audio/transcribe.operation.ts | 19 ++++++------- .../actions/audio/translate.operation.ts | 19 ++++++------- .../OpenAi/actions/file/upload.operation.ts | 19 ++++++------- .../vendors/OpenAi/helpers/binary-data.ts | 27 +++++++++++++++++++ .../vendors/OpenAi/test/OpenAi.node.test.ts | 22 ++++++++++++--- 5 files changed, 76 insertions(+), 30 deletions(-) create mode 100644 packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/helpers/binary-data.ts diff --git a/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/audio/transcribe.operation.ts b/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/audio/transcribe.operation.ts index ddbc1f09ae..3f986e18cb 100644 --- a/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/audio/transcribe.operation.ts +++ b/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/audio/transcribe.operation.ts @@ -2,6 +2,7 @@ import FormData from 'form-data'; import type { INodeProperties, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow'; import { updateDisplayOptions } from 'n8n-workflow'; +import { getBinaryDataFile } from '../../helpers/binary-data'; import { apiRequest } from '../../transport'; const properties: INodeProperties[] = [ @@ -71,19 +72,19 @@ export async function execute(this: IExecuteFunctions, i: number): Promise { 'POST', '/audio/transcriptions', expect.objectContaining({ - headers: { 'Content-Type': 'multipart/form-data' }, + headers: expect.objectContaining({ + 'content-type': expect.stringMatching(/^multipart\/form-data; boundary=/), + }), + option: expect.objectContaining({ + formData: expect.any(FormData), + }), }), ); }); @@ -386,7 +392,12 @@ describe('OpenAi, Audio resource', () => { 'POST', '/audio/translations', expect.objectContaining({ - headers: { 'Content-Type': 'multipart/form-data' }, + headers: expect.objectContaining({ + 'content-type': expect.stringMatching(/^multipart\/form-data; boundary=/), + }), + option: expect.objectContaining({ + formData: expect.any(FormData), + }), }), ); }); @@ -453,7 +464,12 @@ describe('OpenAi, File resource', () => { 'POST', '/files', expect.objectContaining({ - headers: { 'Content-Type': 'multipart/form-data' }, + headers: expect.objectContaining({ + 'content-type': expect.stringMatching(/^multipart\/form-data; boundary=/), + }), + option: expect.objectContaining({ + formData: expect.any(FormData), + }), }), ); });