From 6379f43b2245dfb5147db2c6e179ebed89bd6ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Tue, 3 Feb 2026 22:22:30 +0100 Subject: [PATCH] persist settings in localStorage, randomize every picture seed if using random seed (empty), consider empty seed as random => variance and allow multiple pictures without seed increment --- sd_pipeline.py | 13 ++++++++----- templates/index.html | 26 +++++++++++++++++--------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/sd_pipeline.py b/sd_pipeline.py index 968aed7..437cf1a 100644 --- a/sd_pipeline.py +++ b/sd_pipeline.py @@ -83,7 +83,7 @@ class SDPipeline: self.model_type = os.environ.get("SD_MODEL_TYPE", "sd15") self.low_vram = os.environ.get("SD_LOW_VRAM", "").lower() in ("1", "true", "yes") self.lora_stack = self._parse_lora_stack(os.environ.get("SD_LORA_STACK", "")) - self.quality_keywords = "hyper detail, Canon50, cinematic lighting, realistic, f/1.4, ISO 200, 1/160s, 8K, RAW, unedited" + self.quality_keywords = "hyper detail, cinematic lighting, realistic, unedited" #Canon50, f/1.4, ISO 200, 1/160s, 8K, RAW def _parse_lora_stack(self, lora_env: str) -> list[tuple[str, float]]: """Parse SD_LORA_STACK env var into list of (path, weight) tuples. @@ -175,7 +175,6 @@ class SDPipeline: if self.pipe is None: self.load() - seed = options.seed if options.seed is not None else self._random_seed() self._stop_requested = False with self._generation_lock: @@ -184,7 +183,7 @@ class SDPipeline: self._stop_requested = False return - params = self._compute_params(options, seed, i) + params = self._compute_params(options, i) full_prompt = f"{options.prompt}, {self.quality_keywords}" if options.add_quality_keywords else options.prompt image = self._generate_image(full_prompt, options.negative_prompt, params, options.width, options.height) @@ -196,9 +195,13 @@ class SDPipeline: result = self._save_and_encode(image, options, params, full_prompt, i) yield result - def _compute_params(self, options: GenerationOptions, seed: int, index: int) -> ImageParams: + def _compute_params(self, options: GenerationOptions, index: int) -> ImageParams: """Compute generation parameters for a single image.""" - current_seed = seed + index if options.increment_seed else seed + if options.seed is not None: + if options.increment_seed: + current_seed = options.seed + index + else: + current_seed = self._random_seed() if options.vary_guidance and options.count > 1: t = index / (options.count - 1) diff --git a/templates/index.html b/templates/index.html index 106a69b..7e405ec 100644 --- a/templates/index.html +++ b/templates/index.html @@ -167,13 +167,6 @@ const guidanceValue = document.getElementById('guidance-value'); const randomSeedBtn = document.getElementById('random-seed'); const seedInput = document.getElementById('seed'); - - let timePerImage = null; - let progressInterval = null; - let imageStartTime = null; - let isGenerating = false; - let abortController = null; - const incrementSeedCheckbox = document.getElementById('increment-seed'); const varyGuidanceCheckbox = document.getElementById('vary-guidance'); const varyStepsCheckbox = document.getElementById('vary-steps'); @@ -190,6 +183,12 @@ const varyGuidanceGroup = varyGuidanceCheckbox.closest('.form-group'); const varyStepsGroup = varyStepsCheckbox.closest('.form-group'); + let timePerImage = null; + let progressInterval = null; + let imageStartTime = null; + let isGenerating = false; + let abortController = null; + function updateVaryOptionsVisibility() { const count = parseInt(countInput.value) || 1; const showVary = count > 1; @@ -221,7 +220,7 @@ }); randomSeedBtn.addEventListener('click', () => { - seedInput.value = Math.floor(100000000 + Math.random() * 900000000); + seedInput.value = ''; }); document.getElementById('prompt').addEventListener('keydown', (e) => { @@ -470,13 +469,15 @@ let requestedCount = parseInt(document.getElementById('count').value); // If count > 1 but no vary options enabled, reduce to 1 - const hasVaryOption = incrementSeedCheckbox.checked || varyGuidanceCheckbox.checked || varyStepsCheckbox.checked; + const hasVaryOption = seedValue === '' || incrementSeedCheckbox.checked || varyGuidanceCheckbox.checked || varyStepsCheckbox.checked; if (requestedCount > 1 && !hasVaryOption) { requestedCount = 1; } setStatus(requestedCount === 1 ? 'Generating image...' : `Generating image 1 of ${requestedCount}...`, 'loading'); + localStorage.setItem('settings', JSON.stringify(getSettings())); + const data = { prompt: prompt, negative_prompt: document.getElementById('negative-prompt').value.trim(), @@ -652,6 +653,13 @@ results.appendChild(card); } + + window.addEventListener('load', function() { + let settings = localStorage.getItem('settings'); + if (settings !== null) { + applySettings(JSON.parse(settings)); + } + })