diff --git a/server/services/Files/images/encode.js b/server/services/Files/images/encode.js index 809ec0e8401..d8dc5839ad8 100644 --- a/server/services/Files/images/encode.js +++ b/server/services/Files/images/encode.js @@ -1,5 +1,27 @@ +const axios = require('axios'); const { EModelEndpoint, FileSources } = require('librechat-data-provider'); const { getStrategyFunctions } = require('../strategies'); +const { logger } = require('~/config'); + +/** + * Fetches an image from a URL and returns its base64 representation. + * + * @async + * @param {string} url The URL of the image. + * @returns {Promise} The base64-encoded string of the image. + * @throws {Error} If there's an issue fetching the image or encoding it. + */ +async function fetchImageToBase64(url) { + try { + const response = await axios.get(url, { + responseType: 'arraybuffer', + }); + return Buffer.from(response.data).toString('base64'); + } catch (error) { + logger.error('Error fetching image to convert to base64', error); + throw error; + } +} /** * Encodes and formats the given files. @@ -26,6 +48,13 @@ async function encodeAndFormat(req, files, endpoint) { } encodingMethods[source] = prepareImagePayload; + + /* Google doesn't support passing URLs to payload */ + if (source !== FileSources.local && endpoint === EModelEndpoint.google) { + const [_file, imageURL] = await prepareImagePayload(req, file); + promises.push([_file, await fetchImageToBase64(imageURL)]); + continue; + } promises.push(prepareImagePayload(req, file)); }