Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
2291ee3
feat: initial acr build and push action
pp-npeham Sep 10, 2025
0577dc9
feat: add working branch for testing action
pp-npeham Sep 10, 2025
8bd2411
feat: permissions id-token write
pp-npeham Sep 10, 2025
b31feb1
feat: login to acr before build and push docker image
pp-npeham Sep 10, 2025
eb1cc62
refactor: remove not needed code
pp-npeham Sep 10, 2025
66a6282
feat: only run action on main branch
pp-npeham Sep 11, 2025
9764323
Merge pull request #1 from poeppelmann/feat/MIA-85-librechat-build-pi…
pp-npeham Sep 11, 2025
76ee340
Merge branch 'danny-avila:main' into main
ronniekolk Sep 15, 2025
6aeb5c6
fix: Implement hotfix for Android Edge browser keyboard overlay issue…
pp-npeham Oct 21, 2025
3cb2b4f
fix: Refine Android Edge keyboard overlay hotfix in ChatForm
pp-npeham Oct 22, 2025
b040eb2
Merge pull request #4 from poeppelmann/fix/MIA-113-keyboard-hides-inp…
pp-npeham Oct 22, 2025
91cab50
fix: Implement hotfix for Android Edge browser keyboard overlay issue…
pp-npeham Oct 22, 2025
0893114
Merge pull request #5 from poeppelmann/fix/MIA-113-keyboard-hides-inp…
pp-npeham Oct 22, 2025
37aec90
Merge remote-tracking branch 'origin/main' into chore/latest-fork-05-…
pp-npeham Nov 5, 2025
981685b
Merge pull request #7 from poeppelmann/chore/latest-fork-05-11-2025-2
pp-npeham Nov 5, 2025
f3cf31b
Merge remote-tracking branch 'origin/release' into chore/release-0-8-…
pp-npeham Nov 5, 2025
97288f3
Merge pull request #8 from poeppelmann/chore/release-0-8-1-rc1
pp-npeham Nov 5, 2025
5a2bf02
build: add custom pp assets
AndreRoggenkamp Nov 5, 2025
16b9b91
Merge pull request #9 from poeppelmann/build/add-custom-pp-assets
AndreRoggenkamp Nov 5, 2025
6cc3025
build: add GitHub Actions workflow for building and pushing LibreChat…
pp-npeham Nov 6, 2025
85a95ae
Merge pull request #10 from poeppelmann/build/acr-build-action-switch…
pp-npeham Nov 6, 2025
7b5b224
chore: update GitHub Actions workflow for LibreChat container build a…
pp-npeham Nov 6, 2025
3e38bbe
Merge pull request #11 from poeppelmann/build/acr-build-action-switch…
pp-npeham Nov 6, 2025
46c9096
chore: remove Android Edge keyboard overlay hotfix code
pp-npeham Nov 13, 2025
68c781c
Merge pull request #12 from poeppelmann/fix/MIA-113-remove-mobile-and…
pp-npeham Nov 13, 2025
38d10f0
Merge pull request #14 from poeppelmann/release
pp-npeham Nov 13, 2025
ab134aa
Merge remote-tracking branch 'origin/main' into chore/main-rv0.8.1-rc1
pp-npeham Nov 13, 2025
8e90a73
chore: remove Android Edge keyboard overlay hotfix code
pp-npeham Nov 13, 2025
2abb315
Merge pull request #15 from poeppelmann/chore/main-rv0.8.1-rc1
pp-npeham Nov 13, 2025
e1a2896
Merge pull request #16 from danny-avila/main
pp-npeham Nov 28, 2025
47bbe30
Merge pull request #17 from poeppelmann/chore/main-v0.8.1-rc2
pp-npeham Nov 28, 2025
6aca2b6
Merge pull request #18 from poeppelmann/release
pp-npeham Nov 28, 2025
09cab5c
Merge pull request #19 from danny-avila/main
AndreRoggenkamp Dec 15, 2025
d74bb77
Merge pull request #20 from poeppelmann/chore/main-v0.8.1
AndreRoggenkamp Dec 15, 2025
6b18a7b
Merge pull request #21 from danny-avila/main
pp-npeham Dec 17, 2025
6f61537
Merge pull request #22 from poeppelmann/main
pp-npeham Dec 18, 2025
46f91f2
Merge pull request #23 from poeppelmann/release
pp-npeham Dec 18, 2025
d97e064
Merge pull request #24 from danny-avila/main
pp-npeham Jan 12, 2026
8716fbf
Merge pull request #25 from poeppelmann/chore/main-v0.8.2-rc2
pp-npeham Jan 12, 2026
1b3d36c
Merge pull request #26 from danny-avila/main
AndreRoggenkamp Jan 22, 2026
6633602
Merge pull request #27 from poeppelmann/Chore/main-v0.8.2-rc3
AndreRoggenkamp Jan 22, 2026
7cdef78
Merge pull request #28 from danny-avila/main
AndreRoggenkamp Jan 29, 2026
fceae02
Merge pull request #29 from poeppelmann/chore/main-v0.8.2
AndreRoggenkamp Jan 29, 2026
97e10db
✨ feat: Add Image Generation capability and UI components
pp-npeham Mar 5, 2026
c352539
Merge remote-tracking branch 'upstream/main' into chore/main-2026-03-…
pp-npeham Mar 6, 2026
45cb789
Merge pull request #32 from poeppelmann/chore/main-2026-03-06-update-…
pp-npeham Mar 6, 2026
7ed45db
Merge pull request #33 from poeppelmann/main
pp-npeham Mar 6, 2026
a9f85c0
Merge remote-tracking branch 'origin/release' into feat/MIA-131-libre…
pp-npeham Mar 6, 2026
28a88a2
Merge pull request #34 from danny-avila/main
pp-npeham Mar 10, 2026
636b126
Merge pull request #36 from poeppelmann/main
pp-npeham Mar 10, 2026
eacf7ad
Merge pull request #30 from poeppelmann/feat/MIA-131-librechat-image-…
pp-npeham Mar 10, 2026
736960e
🕐 fix: Use client timezone for special variable date formatting
ucodia Mar 27, 2026
885b238
Merge remote-tracking branch 'upstream/main' into chore/update-main-w…
pp-npeham Apr 9, 2026
0bf95c7
Merge pull request #38 from poeppelmann/chore/update-main-with-upstream
pp-npeham Apr 9, 2026
93d7135
Merge pull request #41 from danny-avila/main
ronniekolk Apr 10, 2026
991636e
Merge pull request #45 from danny-avila/main
ronniekolk Apr 23, 2026
13de39a
✨ feat: Add conversation_id support in special variables
ronniekolk Apr 23, 2026
867f066
Merge remote-tracking branch 'origin/release' into chore/main-v0.8.5
pp-npeham Apr 23, 2026
0795b5e
Merge remote-tracking branch 'origin/release' into chore/main-v0.8.5
pp-npeham Apr 23, 2026
4463701
Merge pull request #48 from poeppelmann/chore/main-v0.8.5
pp-npeham Apr 23, 2026
8ac0502
Merge remote-tracking branch 'origin/release' into feat/ChatID-as-Var…
pp-npeham Apr 23, 2026
1ca547e
Merge pull request #47 from poeppelmann/feat/ChatID-as-Variable
ronniekolk Apr 24, 2026
fe97fb6
Merge remote-tracking branch 'ucodia/fix/special-vars-client-timezone…
pp-npeham Apr 28, 2026
d4b243a
fix: Restore Meilisearch chat search by repairing orphaned-doc cleanup
claude Apr 30, 2026
2aa0b0f
Merge pull request #52 from pcode-at/claude/fix-chat-search-meilisear…
pp-npeham Apr 30, 2026
8384d25
Merge pull request #54 from poeppelmann/fix/MIA-150-meili-full-text-s…
pp-npeham May 7, 2026
703a421
Merge pull request #55 from poeppelmann/fix/MIA-160-release-with-spec…
pp-npeham May 7, 2026
dd65dc0
feat: add image generation as an ephemeral tool toggle in chat menu
claude May 7, 2026
9865866
Merge remote-tracking branch 'mia-librechat/feat/MIA-204-add-image-ge…
npeham May 8, 2026
d1c10ca
Merge pull request #56 from pcode-at/feat/MIA-204-add-image-generatio…
pp-npeham May 8, 2026
b3d6e9e
fix: rename imageGen to imageGeneration and remove unused ImageGen co…
npeham May 8, 2026
671f08e
Merge pull request #57 from pcode-at/feat/MIA-204-add-image-generatio…
pp-npeham May 8, 2026
924f36b
Merge pull request #2 from pcode-at/feat/MIA-204-add-image-generation…
npeham May 11, 2026
ffb8607
Merge pull request #58 from pcode-at/mia-dev
pp-npeham May 11, 2026
0cbe4c7
fix: downscale agent image-tool results to stay under Anthropic's 5 M…
claude May 13, 2026
28aba18
feat: drive image_gen_oai defaults from the tool-result byte budget
claude May 13, 2026
2e1f717
fix: default image_gen_oai output_format to jpeg for Azure compatibility
claude May 13, 2026
c81d28b
feat: enhance image generation defaults in .env.example and refactor …
npeham May 13, 2026
c7cc016
refactor: remove downscaling functionality and related code from imag…
npeham May 13, 2026
3a81298
Merge remote-tracking branch 'origin/mia-dev' into claude/debug-k8s-l…
npeham May 16, 2026
d92d3e5
Merge pull request #4 from pcode-at/claude/debug-k8s-librechat-pGUrN
npeham May 16, 2026
c248ec1
Merge pull request #59 from pcode-at/feat/MIA-204-add-image-generatio…
pp-npeham May 16, 2026
d6d7850
Merge pull request #60 from danny-avila/main
pp-npeham May 20, 2026
f18a483
Merge pull request #61 from poeppelmann/main
pp-npeham May 20, 2026
abc9be5
fix: route chat image generation toggle to Gemini image tool
claude May 21, 2026
563363d
fix: cap Gemini-generated image size for provider limits
claude May 21, 2026
8f5c809
refactor: share image size-limit helper across image tools
claude May 22, 2026
44bd8b1
Merge pull request #7 from pcode-at/claude/librechat-image-resize-con…
npeham May 22, 2026
f99c8b2
Merge pull request #62 from pcode-at/claude/add-image-generation-chat…
pp-npeham May 22, 2026
0488f4b
Merge pull request #63 from poeppelmann/feat/MIA-204-gemini-image-gen…
pp-npeham May 22, 2026
87ed13d
fix: apply client timezone to date template variables when anchor tim…
claude Jun 1, 2026
8004582
Merge pull request #64 from danny-avila/main
pp-npeham Jun 1, 2026
04744c6
Merge remote-tracking branch 'origin/main' into claude/determined-mcc…
claude Jun 1, 2026
2f223f1
Merge pull request #9 from pcode-at/claude/determined-mccarthy-ZB6v5
npeham Jun 1, 2026
58bc689
Merge remote-tracking branch 'origin/mia-dev' into claude/kind-darwin…
npeham Jun 1, 2026
23263b0
Merge pull request #8 from pcode-at/claude/kind-darwin-9Cqwp
npeham Jun 1, 2026
3063fc3
Merge pull request #68 from danny-avila/main
pp-npeham Jun 3, 2026
1fd1814
Merge pull request #10 from poeppelmann/main
npeham Jun 3, 2026
1000d9c
Merge pull request #11 from pcode-at/main
npeham Jun 3, 2026
ada8b93
Merge remote-tracking branch 'origin/mia-dev' into claude/hopeful-hei…
claude Jun 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -421,6 +421,11 @@ AZURE_AI_SEARCH_SEARCH_OPTION_SELECT=
# IMAGE_GEN_OAI_BASEURL= # Custom OpenAI base URL for image generation tool
# IMAGE_GEN_OAI_AZURE_API_VERSION= # Custom Azure OpenAI deployments
# IMAGE_GEN_OAI_MODEL=gpt-image-1 # OpenAI image model (e.g., gpt-image-1, gpt-image-1.5)
# Defaults for image_gen_oai / image_edit_oai when the model passes size or quality as auto:
# IMAGE_GEN_OAI_OUTPUT_FORMAT=jpeg # png | jpeg | webp (Azure gpt-image-1 may reject webp)
# IMAGE_GEN_OAI_OUTPUT_COMPRESSION=85 # 0-100, used for jpeg/webp
# IMAGE_GEN_OAI_DEFAULT_SIZE=auto # auto | 1024x1024 | 1536x1024 | 1024x1536 | 256x256 | 512x512
# IMAGE_GEN_OAI_DEFAULT_QUALITY=auto # auto | high | medium | low
# IMAGE_GEN_OAI_DESCRIPTION=
# IMAGE_GEN_OAI_DESCRIPTION_WITH_FILES=Custom description for image generation tool when files are present
# IMAGE_GEN_OAI_DESCRIPTION_NO_FILES=Custom description for image generation tool when no files are present
Expand Down
47 changes: 47 additions & 0 deletions .github/workflows/acr-build-and-push-libre-chat.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Build and Push MIA - LibreChat Container to ACR

on:
push:
branches: ["release"]
workflow_dispatch:

permissions:
id-token: write
contents: read

jobs:
build-and-push:
runs-on: ubuntu-latest

env:
IMAGE_NAME: mia-libre-chat
TAG: ${{ github.sha }}

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Azure login (OIDC)
uses: azure/login@v2
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}

- name: ACR sanity
run: |
az account show -o table
az acr show -n "${{ vars.ACR_NAME }}" -o table

- name: Login to ACR
run: az acr login --name "${{ vars.ACR_NAME }}"

- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile.multi
push: true
tags: |
${{ vars.ACR_REGISTRY_SERVER }}/${{ env.IMAGE_NAME }}:${{ env.TAG }}
${{ vars.ACR_REGISTRY_SERVER }}/${{ env.IMAGE_NAME }}:latest
11 changes: 9 additions & 2 deletions api/app/clients/tools/structured/DALLE3.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ const {
extractBaseURL,
getProxyDispatcher,
getEnvProxyDispatcher,
enforceImageSizeLimit,
createMinimalRetentionRequest,
} = require('@librechat/api');
const { FileContext, ContentTypes } = require('librechat-data-provider');
Expand Down Expand Up @@ -194,12 +195,18 @@ Error Message: ${error.message}`);
}
const imageResponse = await fetch(theImageUrl, fetchOptions);
const arrayBuffer = await imageResponse.arrayBuffer();
const base64 = Buffer.from(arrayBuffer).toString('base64');
const buffer = Buffer.from(arrayBuffer);
const contentType = imageResponse.headers.get('content-type');
const mimeType = contentType?.split(';')[0]?.trim() || 'image/png';
const { buffer: finalBuffer, mimeType: finalMimeType } = await enforceImageSizeLimit(
buffer,
mimeType,
);
const content = [
{
type: ContentTypes.IMAGE_URL,
image_url: {
url: `data:image/png;base64,${base64}`,
url: `data:${finalMimeType};base64,${finalBuffer.toString('base64')}`,
},
},
];
Expand Down
21 changes: 17 additions & 4 deletions api/app/clients/tools/structured/FluxAPI.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ const {
applyAxiosProxyConfig,
createMinimalRetentionRequest,
getHttpsProxyAgent,
enforceImageSizeLimit,
} = require('@librechat/api');
const { FileContext, ContentTypes } = require('librechat-data-provider');

Expand Down Expand Up @@ -313,12 +314,18 @@ class FluxAPI extends Tool {
}
const imageResponse = await fetch(imageUrl, fetchOptions);
const arrayBuffer = await imageResponse.arrayBuffer();
const base64 = Buffer.from(arrayBuffer).toString('base64');
const buffer = Buffer.from(arrayBuffer);
const contentType = imageResponse.headers.get('content-type');
const mimeType = contentType?.split(';')[0]?.trim() || 'image/png';
const { buffer: finalBuffer, mimeType: finalMimeType } = await enforceImageSizeLimit(
buffer,
mimeType,
);
const content = [
{
type: ContentTypes.IMAGE_URL,
image_url: {
url: `data:image/png;base64,${base64}`,
url: `data:${finalMimeType};base64,${finalBuffer.toString('base64')}`,
},
},
];
Expand Down Expand Up @@ -546,12 +553,18 @@ class FluxAPI extends Tool {
}
const imageResponse = await fetch(imageUrl, fetchOptions);
const arrayBuffer = await imageResponse.arrayBuffer();
const base64 = Buffer.from(arrayBuffer).toString('base64');
const buffer = Buffer.from(arrayBuffer);
const contentType = imageResponse.headers.get('content-type');
const mimeType = contentType?.split(';')[0]?.trim() || 'image/png';
const { buffer: finalBuffer, mimeType: finalMimeType } = await enforceImageSizeLimit(
buffer,
mimeType,
);
const content = [
{
type: ContentTypes.IMAGE_URL,
image_url: {
url: `data:image/png;base64,${base64}`,
url: `data:${finalMimeType};base64,${finalBuffer.toString('base64')}`,
},
},
];
Expand Down
16 changes: 10 additions & 6 deletions api/app/clients/tools/structured/GeminiImageGen.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ const {
loadServiceKey,
getBalanceConfig,
getEnvProxyDispatcher,
enforceImageSizeLimit,
getTransactionsConfig,
} = require('@librechat/api');
const { getStrategyFunctions } = require('~/server/services/Files/strategies');
Expand Down Expand Up @@ -318,7 +319,7 @@ function createGeminiImageTool(fields = {}) {

const { req, imageFiles = [], userId, fileStrategy, GEMINI_API_KEY, GOOGLE_KEY } = fields;

const imageOutputType = fields.imageOutputType || EImageOutputType.PNG;
const imageOutputType = fields.imageOutputType || EImageOutputType.WEBP;

const geminiImageGenTool = tool(
async ({ prompt, image_ids, aspectRatio, imageSize }, runnableConfig) => {
Expand Down Expand Up @@ -419,14 +420,17 @@ function createGeminiImageTool(fields = {}) {
}

const rawBuffer = Buffer.from(rawImageData, 'base64');
const { buffer: convertedBuffer, format: outputFormat } = await convertImageFormat(
const { buffer: convertedBuffer, format } = await convertImageFormat(
rawBuffer,
imageOutputType,
);
const imageData = convertedBuffer.toString('base64');
const mimeType = outputFormat === 'jpeg' ? 'image/jpeg' : `image/${outputFormat}`;

const dataUrl = `data:${mimeType};base64,${imageData}`;
const initialMimeType =
format === 'jpeg' ? 'image/jpeg' : format === 'webp' ? 'image/webp' : 'image/png';
const { buffer: finalBuffer, mimeType } = await enforceImageSizeLimit(
convertedBuffer,
initialMimeType,
);
const dataUrl = `data:${mimeType};base64,${finalBuffer.toString('base64')}`;
const file_ids = [v4()];
const content = [
{
Expand Down
68 changes: 49 additions & 19 deletions api/app/clients/tools/structured/OpenAIImageTools.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ const {
extractBaseURL,
getProxyDispatcher,
applyAxiosProxyConfig,
enforceImageSizeLimit,
resolveImageGenOaiDefaults,
} = require('@librechat/api');
const { getStrategyFunctions } = require('~/server/services/Files/strategies');
const { getFiles } = require('~/models');
Expand Down Expand Up @@ -56,7 +58,6 @@ function createAbortHandler() {
* @param {string} fields.IMAGE_GEN_OAI_API_KEY - The OpenAI API key
* @param {boolean} [fields.override] - Whether to override the API key check, necessary for app initialization
* @param {MongoFile[]} [fields.imageFiles] - The images to be used for editing
* @param {string} [fields.imageOutputType] - The image output type configuration
* @param {string} [fields.fileStrategy] - The file storage strategy
* @returns {Array<ReturnType<tool>>} - Array of image tools
*/
Expand All @@ -68,8 +69,8 @@ function createOpenAIImageTools(fields = {}) {
throw new Error('This tool is only available for agents.');
}
const { req } = fields;
const imageOutputType = fields.imageOutputType || EImageOutputType.PNG;
const appFileStrategy = fields.fileStrategy;
const budgetDefaults = resolveImageGenOaiDefaults();

const getApiKey = () => {
const apiKey = process.env.IMAGE_GEN_OAI_API_KEY ?? '';
Expand Down Expand Up @@ -117,7 +118,7 @@ function createOpenAIImageTools(fields = {}) {
prompt,
background = 'auto',
n = 1,
output_compression = 100,
output_compression,
quality = 'auto',
size = 'auto',
},
Expand All @@ -136,17 +137,15 @@ function createOpenAIImageTools(fields = {}) {

/** @type {OpenAI} */
const openai = new OpenAI(clientConfig);
let output_format = imageOutputType;
if (
background === 'transparent' &&
output_format !== EImageOutputType.PNG &&
output_format !== EImageOutputType.WEBP
) {
logger.warn(
'[ImageGenOAI] Transparent background requires PNG or WebP format, defaulting to PNG',
);
let output_format = budgetDefaults.outputFormat;
if (background === 'transparent' && output_format !== EImageOutputType.PNG) {
logger.warn('[ImageGenOAI] Transparent background requires PNG format; using PNG');
output_format = EImageOutputType.PNG;
}
const effectiveCompression =
typeof output_compression === 'number' ? output_compression : budgetDefaults.outputCompression;
const effectiveQuality = quality === 'auto' ? budgetDefaults.defaultQuality : quality;
const effectiveSize = size === 'auto' ? budgetDefaults.defaultSize : size;

let resp;
/** @type {AbortSignal} */
Expand All @@ -170,10 +169,10 @@ function createOpenAIImageTools(fields = {}) {
output_format,
output_compression:
output_format === EImageOutputType.WEBP || output_format === EImageOutputType.JPEG
? output_compression
? effectiveCompression
: undefined,
quality,
size,
quality: effectiveQuality,
size: effectiveSize,
},
{
signal: derivedSignal,
Expand Down Expand Up @@ -206,11 +205,21 @@ Error Message: ${error.message}`);
);
}

const mimeType =
output_format === EImageOutputType.PNG
? 'image/png'
: output_format === EImageOutputType.WEBP
? 'image/webp'
: 'image/jpeg';
const { buffer: finalBuffer, mimeType: finalMimeType } = await enforceImageSizeLimit(
Buffer.from(base64Image, 'base64'),
mimeType,
);
const content = [
{
type: ContentTypes.IMAGE_URL,
image_url: {
url: `data:image/${output_format};base64,${base64Image}`,
url: `data:${finalMimeType};base64,${finalBuffer.toString('base64')}`,
},
},
];
Expand Down Expand Up @@ -244,14 +253,24 @@ Error Message: ${error.message}`);
};
}

const effectiveQuality = quality === 'auto' ? budgetDefaults.defaultQuality : quality;
const effectiveSize = size === 'auto' ? budgetDefaults.defaultSize : size;

const formData = new FormData();
formData.append('model', imageModel);
formData.append('prompt', replaceUnwantedChars(prompt));
// TODO: `mask` support
// TODO: more than 1 image support
// formData.append('n', n.toString());
formData.append('quality', quality);
formData.append('size', size);
formData.append('quality', effectiveQuality);
formData.append('size', effectiveSize);
formData.append('output_format', budgetDefaults.outputFormat);
if (
budgetDefaults.outputFormat === EImageOutputType.WEBP ||
budgetDefaults.outputFormat === EImageOutputType.JPEG
) {
formData.append('output_compression', String(budgetDefaults.outputCompression));
}

/** @type {Record<FileSources, undefined | NodeStreamDownloader<File>>} */
const streamMethods = {};
Expand Down Expand Up @@ -376,11 +395,22 @@ Error Message: ${error.message}`);
);
}

const editFormat = budgetDefaults.outputFormat;
const mimeType =
editFormat === EImageOutputType.PNG
? 'image/png'
: editFormat === EImageOutputType.WEBP
? 'image/webp'
: 'image/jpeg';
const { buffer: finalBuffer, mimeType: finalMimeType } = await enforceImageSizeLimit(
Buffer.from(base64Image, 'base64'),
mimeType,
);
const content = [
{
type: ContentTypes.IMAGE_URL,
image_url: {
url: `data:image/${imageOutputType};base64,${base64Image}`,
url: `data:${finalMimeType};base64,${finalBuffer.toString('base64')}`,
},
},
];
Expand Down
9 changes: 7 additions & 2 deletions api/app/clients/tools/structured/StableDiffusion.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const { v4: uuidv4 } = require('uuid');
const { logger } = require('@librechat/data-schemas');
const { Tool } = require('@librechat/agents/langchain/tools');
const { FileContext, ContentTypes } = require('librechat-data-provider');
const { getBasePath } = require('@librechat/api');
const { getBasePath, enforceImageSizeLimit } = require('@librechat/api');
const paths = require('~/config/paths');

const stableDiffusionJsonSchema = {
Expand Down Expand Up @@ -143,11 +143,16 @@ class StableDiffusionAPI extends Tool {

try {
if (this.isAgent) {
const pngBase64 = image.includes(',') ? image.split(',')[1] : image;
const { buffer: finalBuffer, mimeType: finalMimeType } = await enforceImageSizeLimit(
Buffer.from(pngBase64, 'base64'),
'image/png',
);
const content = [
{
type: ContentTypes.IMAGE_URL,
image_url: {
url: `data:image/png;base64,${image}`,
url: `data:${finalMimeType};base64,${finalBuffer.toString('base64')}`,
},
},
];
Expand Down
Loading
Loading