| const fs = require('fs'); |
| const axios = require('axios'); |
| const FormData = require('form-data'); |
| const { logger } = require('@librechat/data-schemas'); |
| const { FileSources } = require('librechat-data-provider'); |
| const { logAxiosError, generateShortLivedToken } = require('@librechat/api'); |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const deleteVectors = async (req, file) => { |
| if (!file.embedded || !process.env.RAG_API_URL) { |
| return; |
| } |
| try { |
| const jwtToken = generateShortLivedToken(req.user.id); |
|
|
| return await axios.delete(`${process.env.RAG_API_URL}/documents`, { |
| headers: { |
| Authorization: `Bearer ${jwtToken}`, |
| 'Content-Type': 'application/json', |
| accept: 'application/json', |
| }, |
| data: [file.file_id], |
| }); |
| } catch (error) { |
| logAxiosError({ |
| error, |
| message: 'Error deleting vectors', |
| }); |
| if ( |
| error.response && |
| error.response.status !== 404 && |
| (error.response.status < 200 || error.response.status >= 300) |
| ) { |
| logger.warn('Error deleting vectors, file will not be deleted'); |
| throw new Error(error.message || 'An error occurred during file deletion.'); |
| } |
| } |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| async function uploadVectors({ req, file, file_id, entity_id, storageMetadata }) { |
| if (!process.env.RAG_API_URL) { |
| throw new Error('RAG_API_URL not defined'); |
| } |
|
|
| try { |
| const jwtToken = generateShortLivedToken(req.user.id); |
| const formData = new FormData(); |
| formData.append('file_id', file_id); |
| formData.append('file', fs.createReadStream(file.path)); |
| if (entity_id != null && entity_id) { |
| formData.append('entity_id', entity_id); |
| } |
|
|
| |
| if (storageMetadata) { |
| formData.append('storage_metadata', JSON.stringify(storageMetadata)); |
| } |
|
|
| const formHeaders = formData.getHeaders(); |
|
|
| const response = await axios.post(`${process.env.RAG_API_URL}/embed`, formData, { |
| headers: { |
| Authorization: `Bearer ${jwtToken}`, |
| accept: 'application/json', |
| ...formHeaders, |
| }, |
| }); |
|
|
| const responseData = response.data; |
| logger.debug('Response from embedding file', responseData); |
|
|
| if (responseData.known_type === false) { |
| throw new Error(`File embedding failed. The filetype ${file.mimetype} is not supported`); |
| } |
|
|
| if (!responseData.status) { |
| throw new Error('File embedding failed.'); |
| } |
|
|
| return { |
| bytes: file.size, |
| filename: file.originalname, |
| filepath: FileSources.vectordb, |
| embedded: Boolean(responseData.known_type), |
| }; |
| } catch (error) { |
| logAxiosError({ |
| error, |
| message: 'Error uploading vectors', |
| }); |
| throw new Error(error.message || 'An error occurred during file upload.'); |
| } |
| } |
|
|
| module.exports = { |
| deleteVectors, |
| uploadVectors, |
| }; |
|
|