| const fs = require('fs'); |
| const { sleep } = require('@librechat/agents'); |
| const { logger } = require('@librechat/data-schemas'); |
| const { FilePurpose } = require('librechat-data-provider'); |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| async function uploadOpenAIFile({ req, file, openai }) { |
| const { height, width } = req.body; |
| const isImage = height && width; |
| const uploadedFile = await openai.files.create({ |
| file: fs.createReadStream(file.path), |
| purpose: isImage ? FilePurpose.Vision : FilePurpose.Assistants, |
| }); |
|
|
| logger.debug( |
| `[uploadOpenAIFile] User ${req.user.id} successfully uploaded file to OpenAI`, |
| uploadedFile, |
| ); |
|
|
| if (uploadedFile.status !== 'processed') { |
| const sleepTime = 2500; |
| logger.debug( |
| `[uploadOpenAIFile] File ${ |
| uploadedFile.id |
| } is not yet processed. Waiting for it to be processed (${sleepTime / 1000}s)...`, |
| ); |
| await sleep(sleepTime); |
| } |
|
|
| return isImage ? { ...uploadedFile, height, width } : uploadedFile; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| async function deleteOpenAIFile(req, file, openai) { |
| try { |
| const res = await openai.files.del(file.file_id); |
| if (!res.deleted) { |
| throw new Error('OpenAI returned `false` for deleted status'); |
| } |
| logger.debug( |
| `[deleteOpenAIFile] User ${req.user.id} successfully deleted file "${file.file_id}" from OpenAI`, |
| ); |
| } catch (error) { |
| logger.error('[deleteOpenAIFile] Error deleting file from OpenAI: ' + error.message); |
| throw error; |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| async function getOpenAIFileStream(file_id, openai) { |
| try { |
| return await openai.files.content(file_id); |
| } catch (error) { |
| logger.error('Error getting OpenAI file download stream:', error); |
| throw error; |
| } |
| } |
|
|
| module.exports = { uploadOpenAIFile, deleteOpenAIFile, getOpenAIFileStream }; |
|
|