| | 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, |
| | }; |
| |
|