From c63a79ee4871178aa4d7b7f570e5e9d45b0280de Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 4 Apr 2026 23:15:14 -0700 Subject: [PATCH] Image generation: Embed generation metadata in API image responses --- modules/api/images.py | 23 +++++++++++++++++------ modules/ui_image_generation.py | 3 +++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/modules/api/images.py b/modules/api/images.py index 95704535..dde7d336 100644 --- a/modules/api/images.py +++ b/modules/api/images.py @@ -4,8 +4,11 @@ OpenAI-compatible image generation using local diffusion models. import base64 import io +import json import time +from PIL.PngImagePlugin import PngInfo + from .errors import ServiceUnavailableError from modules import shared @@ -15,7 +18,7 @@ def generations(request): Generate images using the loaded diffusion model. Returns dict with 'created' timestamp and 'data' list of images. """ - from modules.ui_image_generation import generate + from modules.ui_image_generation import build_generation_metadata, generate if shared.image_model is None: raise ServiceUnavailableError("No image model loaded. Load a model via the UI first.") @@ -46,10 +49,18 @@ def generations(request): if not images: raise ServiceUnavailableError("Image generation failed or produced no images.") - # Build response + # Build response with per-batch metadata (seed increments per batch) + base_seed = state.get('image_seed_resolved', state['image_seed']) + batch_size = int(state['image_batch_size']) + resp = {'created': int(time.time()), 'data': []} - for img in images: - b64 = _image_to_base64(img) + for idx, img in enumerate(images): + batch_seed = base_seed + idx // batch_size + metadata = build_generation_metadata(state, batch_seed) + metadata_json = json.dumps(metadata, ensure_ascii=False) + png_info = PngInfo() + png_info.add_text("image_gen_settings", metadata_json) + b64 = _image_to_base64(img, png_info) image_obj = {'revised_prompt': request.prompt} @@ -63,7 +74,7 @@ def generations(request): return resp -def _image_to_base64(image) -> str: +def _image_to_base64(image, png_info=None) -> str: buffered = io.BytesIO() - image.save(buffered, format="PNG") + image.save(buffered, format="PNG", pnginfo=png_info) return base64.b64encode(buffered.getvalue()).decode('utf-8') diff --git a/modules/ui_image_generation.py b/modules/ui_image_generation.py index 1efb2479..727aa7b1 100644 --- a/modules/ui_image_generation.py +++ b/modules/ui_image_generation.py @@ -798,6 +798,9 @@ def generate(state, save_images=True): if seed == -1: seed = random.randint(0, 2**32 - 1) + # Store resolved seed back so callers (e.g. API) can access it + state['image_seed_resolved'] = seed + device = get_device() if device is None: device = "cpu"