From b75b799e34617e4bd0cd45856404af32ea44366d Mon Sep 17 00:00:00 2001 From: Arthur Barrett Date: Thu, 28 Aug 2025 12:39:35 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20fix:=20Handle=20Web=20API=20Stre?= =?UTF-8?q?ams=20in=20File=20Download=20Route=20for=20OpenAI=20Assistants?= =?UTF-8?q?=20(#9200)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/server/routes/files/files.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/api/server/routes/files/files.js b/api/server/routes/files/files.js index af55eb6d6c..09e229c96f 100644 --- a/api/server/routes/files/files.js +++ b/api/server/routes/files/files.js @@ -31,6 +31,7 @@ const { getAssistant } = require('~/models/Assistant'); const { getAgent } = require('~/models/Agent'); const { getLogStores } = require('~/cache'); const { logger } = require('~/config'); +const { Readable } = require('stream'); const router = express.Router(); @@ -325,11 +326,6 @@ router.get('/download/:userId/:file_id', fileAccess, async (req, res) => { res.setHeader('X-File-Metadata', JSON.stringify(file)); }; - /** @type {{ body: import('stream').PassThrough } | undefined} */ - let passThrough; - /** @type {ReadableStream | undefined} */ - let fileStream; - if (checkOpenAIStorage(file.source)) { req.body = { model: file.model }; const endpointMap = { @@ -342,12 +338,19 @@ router.get('/download/:userId/:file_id', fileAccess, async (req, res) => { overrideEndpoint: endpointMap[file.source], }); logger.debug(`Downloading file ${file_id} from OpenAI`); - passThrough = await getDownloadStream(file_id, openai); + const passThrough = await getDownloadStream(file_id, openai); setHeaders(); logger.debug(`File ${file_id} downloaded from OpenAI`); - passThrough.body.pipe(res); + + // Handle both Node.js and Web streams + const stream = + passThrough.body && typeof passThrough.body.getReader === 'function' + ? Readable.fromWeb(passThrough.body) + : passThrough.body; + + stream.pipe(res); } else { - fileStream = await getDownloadStream(req, file.filepath); + const fileStream = await getDownloadStream(req, file.filepath); fileStream.on('error', (streamError) => { logger.error('[DOWNLOAD ROUTE] Stream error:', streamError);