From b815cd6a5fca89a809d75f876e6dc6cddea17d18 Mon Sep 17 00:00:00 2001 From: William Gill Date: Sun, 19 Apr 2026 12:47:46 -0500 Subject: [PATCH] Tune static workflows to CyberRealisticXL recommended settings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The static workflow JSONs default to CyberRealisticXLPlay (set in an earlier commit), but the KSampler still had euler/normal/CFG7/20 — the generic settings I scaffolded with. Updated to the creator-published defaults: dpmpp_2m_sde / karras / CFG 4 / 28 steps. CLIP skip 1 already correct (no node needed; default behavior). Added a section to the deployment README spelling out the trade-off: static workflows are locked to one checkpoint family at a time because Open WebUI's nodes mapping doesn't expose sampler/CFG/scheduler/CLIP skip/prefix. For multi-checkpoint use, the smart_image_gen Tool path is the only one that gets these right per-prompt. Re-paste workflows into Open WebUI Settings → Images to pick up. Co-Authored-By: Claude Opus 4.7 (1M context) --- deployments/ai-stack/README.md | 28 ++++++++++++++++++++++++---- workflows/img2img.json | 8 ++++---- workflows/txt2img.json | 8 ++++---- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/deployments/ai-stack/README.md b/deployments/ai-stack/README.md index 47959af..4fece4b 100644 --- a/deployments/ai-stack/README.md +++ b/deployments/ai-stack/README.md @@ -202,11 +202,31 @@ provides a prompt, image, seed, etc. Each entry: Recognised `type` strings (per Open WebUI source): `model`, `prompt`, `negative_prompt`, `width`, `height`, `n` (batch size), `steps`, `seed`, -and `image` (img2img / edit only). +and `image` (img2img / edit only). Notably **not** mappable: sampler, +scheduler, CFG, CLIP skip, prompt prefix. -If you swap in a fancier workflow (SDXL, Flux, ControlNet, custom -samplers, NL masking via SAM nodes, etc.), update the matching -`*.nodes.json` so the node IDs and input keys still line up. +This means the static workflow JSONs are tuned for a single checkpoint +family at a time. The shipped defaults match +`CyberRealisticXLPlay_V8.0_FP16.safetensors` +(`dpmpp_2m_sde` / `karras` / CFG 4 / 28 steps / CLIP skip 1 / no prefix). +**If you change the admin's Default Model to a different checkpoint +family** (Pony, NoobAI, Illustrious, etc.), edit the workflow JSONs: + +- `KSampler` node: change `sampler_name`, `scheduler`, `cfg`, `steps` +- For checkpoints needing CLIP skip 2: add a `CLIPSetLastLayer` node and + rewire `CLIPTextEncode` nodes through it (see + [openwebui-tools/smart_image_gen.py](openwebui-tools/smart_image_gen.py) + for the exact graph). +- For Pony or NoobAI/Illustrious: the required quality-tag prefix + (`score_9, score_8_up, ...` or `masterpiece, best quality, ...`) has + to be typed by the user every time, since the workflow can't inject + it. **For multi-checkpoint deployments, use the smart_image_gen Tool + instead** — it handles per-checkpoint sampler / CFG / steps / CLIP + skip / prefix automatically based on the LLM's `style` choice. + +If you swap in a fancier workflow (Flux, ControlNet, NL masking via +SAM nodes, etc.), update the matching `*.nodes.json` so the node IDs +and input keys still line up. ## Common gotchas diff --git a/workflows/img2img.json b/workflows/img2img.json index 40ee59d..0c96e5e 100644 --- a/workflows/img2img.json +++ b/workflows/img2img.json @@ -3,10 +3,10 @@ "class_type": "KSampler", "inputs": { "seed": 0, - "steps": 20, - "cfg": 7, - "sampler_name": "euler", - "scheduler": "normal", + "steps": 28, + "cfg": 4.0, + "sampler_name": "dpmpp_2m_sde", + "scheduler": "karras", "denoise": 0.75, "model": ["4", 0], "positive": ["6", 0], diff --git a/workflows/txt2img.json b/workflows/txt2img.json index c427f92..68581ef 100644 --- a/workflows/txt2img.json +++ b/workflows/txt2img.json @@ -3,10 +3,10 @@ "class_type": "KSampler", "inputs": { "seed": 0, - "steps": 20, - "cfg": 7, - "sampler_name": "euler", - "scheduler": "normal", + "steps": 28, + "cfg": 4.0, + "sampler_name": "dpmpp_2m_sde", + "scheduler": "karras", "denoise": 1, "model": ["4", 0], "positive": ["6", 0],