| | const sharp = require('sharp'); |
| | const { EModelEndpoint } = require('librechat-data-provider'); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | async function resizeImageBuffer(inputBuffer, resolution, endpoint) { |
| | const maxLowRes = 512; |
| | const maxShortSideHighRes = 768; |
| | const maxLongSideHighRes = endpoint === EModelEndpoint.anthropic ? 1568 : 2000; |
| |
|
| | let customPercent, customPx; |
| | if (resolution && typeof resolution === 'object') { |
| | if (typeof resolution.percentage === 'number') { |
| | customPercent = resolution.percentage; |
| | } else if (typeof resolution.px === 'number') { |
| | customPx = resolution.px; |
| | } |
| | } |
| |
|
| | let newWidth, newHeight; |
| | let resizeOptions = { fit: 'inside', withoutEnlargement: true }; |
| |
|
| | if (customPercent != null || customPx != null) { |
| | |
| | const metadata = await sharp(inputBuffer).metadata(); |
| | if (customPercent != null) { |
| | newWidth = Math.round(metadata.width * (customPercent / 100)); |
| | newHeight = Math.round(metadata.height * (customPercent / 100)); |
| | } else { |
| | |
| | newWidth = Math.min(metadata.width, customPx); |
| | newHeight = Math.min(metadata.height, customPx); |
| | } |
| | resizeOptions.width = newWidth; |
| | resizeOptions.height = newHeight; |
| | } else if (resolution === 'low') { |
| | resizeOptions.width = maxLowRes; |
| | resizeOptions.height = maxLowRes; |
| | } else if (resolution === 'high') { |
| | const metadata = await sharp(inputBuffer).metadata(); |
| | const isWidthShorter = metadata.width < metadata.height; |
| |
|
| | if (isWidthShorter) { |
| | |
| | newWidth = Math.min(metadata.width, maxShortSideHighRes); |
| | |
| | newHeight = Math.round((metadata.height / metadata.width) * newWidth); |
| | |
| | if (newHeight > maxLongSideHighRes) { |
| | newHeight = maxLongSideHighRes; |
| | newWidth = Math.round((metadata.width / metadata.height) * newHeight); |
| | } |
| | } else { |
| | |
| | newHeight = Math.min(metadata.height, maxShortSideHighRes); |
| | |
| | newWidth = Math.round((metadata.width / metadata.height) * newHeight); |
| | |
| | if (newWidth > maxLongSideHighRes) { |
| | newWidth = maxLongSideHighRes; |
| | newHeight = Math.round((metadata.height / metadata.width) * newWidth); |
| | } |
| | } |
| |
|
| | resizeOptions.width = newWidth; |
| | resizeOptions.height = newHeight; |
| | } else { |
| | throw new Error('Invalid resolution parameter'); |
| | } |
| |
|
| | const resizedBuffer = await sharp(inputBuffer).rotate().resize(resizeOptions).toBuffer(); |
| |
|
| | const resizedMetadata = await sharp(resizedBuffer).metadata(); |
| | return { |
| | buffer: resizedBuffer, |
| | bytes: resizedMetadata.size, |
| | width: resizedMetadata.width, |
| | height: resizedMetadata.height, |
| | }; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | async function resizeAndConvert({ inputBuffer, desiredFormat, width = 150 }) { |
| | const resizedBuffer = await sharp(inputBuffer) |
| | .resize({ width }) |
| | .toFormat(desiredFormat) |
| | .toBuffer(); |
| | const resizedMetadata = await sharp(resizedBuffer).metadata(); |
| | return { |
| | buffer: resizedBuffer, |
| | width: resizedMetadata.width, |
| | height: resizedMetadata.height, |
| | bytes: Buffer.byteLength(resizedBuffer), |
| | }; |
| | } |
| |
|
| | module.exports = { resizeImageBuffer, resizeAndConvert }; |
| |
|