| 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 newWidth, newHeight; |
| let resizeOptions = { fit: 'inside', withoutEnlargement: true }; |
|
|
| 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, 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 }; |
|
|