# Image Studio — chat-driven stills (HiDream-O1 · Ideogram-4 · Chroma · Z-Image) The image side of [Club 3090 AI Studio](README.md). Type a rough idea in Open WebUI; the "director" LLM crafts it; ComfyUI renders a **still**. Four lanes share one pipe + one director, all **single-device on GPU0** (they run in *either* `gpu-mode` — including alongside a video render, since the video DiT's weights sit on GPU1). Pick by intent: | Lane | Model | Best at | Prompt style | Notes | |---|---|---|---|---| | `✨ Image (HiDream-O1)` | HiDream-O1-Image-Dev-2604 fp8 | **top-quality general / photoreal** (AA #1 single-model open-weight) | natural language | native 2048², ~15 GB, ~3–4 min | | `🖼️ Image` | Ideogram-4 fp8 | **design / logo / text / typography** | structured JSON (director-crafted) | safety-trained; ~18.5 GB @1024² | | `🔓 Image (Chroma)` | Chroma1-HD fp8 | **uncensored** photoreal / illustration | natural language + negative + real CFG | ~9 GB; the "Sulphur for stills" | | `🔓 Image (Z-Image)` | Z-Image-Turbo fp8 | **uncensored**, **fast** photoreal / general | natural language | ~7 GB, **~25 s** (8-step cfg=1); Lumina2 encoder; the quick uncensored lane | Refine any of them by replying with the change (*"monochrome"*, *"tighter crop"*, *"at night"*, *"flat vector style"*) — the director evolves the previous prompt and regenerates. No approval gate. ## Architecture ``` Browser │ "a logo for a coffee shop" · "a photoreal red fox at dusk" ▼ ┌──────────────────────────────────────────────────┐ │ Open WebUI :8080 (the front-end) │ │ image lanes: ✨ HiDream-O1 · 🖼️ Ideogram-4 · 🔓 Chroma │ └───────┬──────────────────────────────────┬───────┘ (1) │ craft the prompt (2) │ render the still ▼ ▼ ┌──────────────────────────┐ ┌───────────────────────────┐ │ Director :8090 │ │ ComfyUI :8188 │ │ qwen3.5-4b · GPU0 ~4.6GB │ │ HiDream-O1 / Ideogram-4 / │ │ idea → Ideogram JSON │ │ Chroma · single-device GPU0│ │ caption · or HiDream / │ │ → .png │ │ Chroma prose │ └─────────────┬─────────────┘ └──────────────────────────┘ ▼ ┌───────────────────────────┐ OWUI's native 🖼️ button → │ Gallery :8189 │ image-shim :8191 rewrites the │ nginx over /output — │ plain text into an Ideogram │ links survive ComfyUI down │ JSON caption, then → ComfyUI └─────────────┬─────────────┘ ▼ 🖼️ link back in chat Browser (reply "monochrome" to refine) ``` All three image lanes are **single-device on GPU0** (the video DiT, when present, lives on GPU1) and coexist with the director. See [README.md](README.md) for the full studio substrate. --- ## ✨ HiDream-O1 (top-quality / photoreal) The **`✨ Studio · Image (HiDream-O1)`** lane renders on **HiDream-O1-Image-Dev-2604 fp8** — a 9B **pixel-level unified transformer** (Qwen3-VL backbone; no separate VAE / text encoder; the model works directly in a pixel-and-token space). On [Artificial Analysis](https://artificialanalysis.ai/image/leaderboard/text-to-image/open-weights) it's the **#1 single-model open-weight** text-to-image (Elo 1189). It takes a **rich natural-language prompt**, so the director crafts a vivid descriptive paragraph. The Dev-2604 build is **distilled**: 28-step, **CFG-off** (no negative prompt — everything lives in the positive description). It renders at its **native 2048×2048** (the node snaps smaller requests up), single-device on **GPU0 ~15 GB**, ~**3–4 min/image** on a 3090 (sdpa attention — flash-attn isn't built for sm_86). Heaviest + slowest of the image lanes — the trade for top quality. Not subject to `image_max_edge` (fixed 2048²). > **No native ComfyUI support** (unlike Ideogram-4). Its nodes (HiDream O1 Model Loader / > Conditioning / Sampler) come from the third-party **`Saganaki22/HiDream_O1-ComfyUI`** custom > node, cloned by `services/comfyui/entrypoint.sh` (+ an idempotent transformers-5 compat patch); > weights via `download_hidream_o1.sh`. ## 🖼️ Ideogram-4 (design / logo / photo / art) The **`🖼️ Studio · Image`** lane renders on **Ideogram-4 fp8** — single-device on **GPU0** (~18.5 GB @1024²), so it runs in either gpu-mode (no switch needed to make an image). **The director crafts a JSON caption, not prose.** Ideogram-4 is trained on **structured JSON captions** (`high_level_description`, a `style_description` block, and a `compositional_deconstruction` with background + per-object elements). Hand it off-schema plain text and it denoises to a gray **"Image blocked by safety filter"** placeholder — its built-in fallback, *not* a real safety judgement (it fires on a plain "a red apple"). So the image director outputs the JSON caption; the pipe validates it and falls back to wrapping your text in a minimal caption if needed. Measured: plain text → 100% blocked; the same prompt as a JSON caption → clean render (~80 s warm @1024²). The lane is **category-aware**: the director infers logo / poster / UI-mockup / photo / illustration and fills the JSON with the levers that matter (logos → vector/flat/negative space/1–2 colours; photos → camera + lens, depth of field; etc.). Want visible text/lettering? Ask for it in quotes. Defaults 1024×1024, 20 steps; the long edge is capped at `image_max_edge` (1024) so it coexists with the director on GPU0 (2048² + director = OOM; raise the cap and stop the director for 2K stills). ## 🔓 Chroma (uncensored) The **`🔓 Studio · Image (Chroma)`** lane renders on **Chroma1-HD fp8** — a Flux-based, de-distilled, *trained-uncensored* model (~9 GB, single-device GPU0). Unlike Ideogram, Chroma takes a **rich natural-language prompt** (no JSON), supports a **negative prompt**, and uses **real CFG** — so the director crafts a vivid descriptive paragraph (the uncensored qwen honours intent without sanitising). The encoder (`t5xxl_fp16`) and VAE (Flux `ae.safetensors`) are shared with the Flux ecosystem (already on disk), so only the Chroma DiT is model-specific. Defaults 1024×1024, 26 steps, cfg 3.5. The **uncensored stills lane** — Ideogram remains the choice for text/logos; Chroma for unrestricted photoreal/illustration. Validated clean (~72–80 s warm). > **Why a separate model instead of "un-censoring Ideogram":** Ideogram-4's safety is trained into > the weights (no abliterated variant; diffusion abliteration isn't a drop-in). The image shim only > removes Ideogram's *false-positive* blocking of neutral prompts — genuine moderation stays. So > uncensored stills get their own model (Chroma), exactly as Sulphur is the uncensored video lane. > Capability is in the weights; the infra is content-neutral. ## 🔓 Z-Image-Turbo (uncensored · fast) The **`🔓 Studio · Image (Z-Image)`** lane renders on **Z-Image-Turbo fp8** — Alibaba's 6B, **Apache-licensed**, permissively-trained text-to-image model (~7 GB, single-device GPU0). It's the **fast** uncensored lane: an 8-step cfg=1 turbo schedule renders a coherent 1024² still in **~25 s** (vs Chroma's ~75 s and HiDream's ~3–4 min). Native ComfyUI nodes — the text encoder is a Qwen3-4B loaded via `CLIPLoader` type `lumina2`; VAE is the shared Flux `ae.safetensors`. Natural-language prompt (the director crafts prose, same as Chroma). Use it when you want an uncensored still **now**; reach for Chroma when you want real-CFG/negative control, HiDream for top-quality. The **`🎨 Studio · Image (Krea 2)`** lane renders on **Krea 2 Turbo fp8** — a 12B dense DiT (~18 GB, single-device GPU0, coexists with the director like the Ideogram lane). The earlier *"dropped, cloud-only"* verdict was **pin-specific**: native **local** Krea2 detection landed in **ComfyUI v0.26.0** ([#14589](https://github.com/comfyanonymous/ComfyUI/pull/14589)) — older pins only exposed the cloud `Krea2ImageNode`. It now loads via native nodes: `UNETLoader` for the DiT, `CLIPLoader` type `krea2` for the **Qwen3-VL-4B** text encoder, and the **Qwen-Image VAE**. Natural-language prompt (director prose, like Chroma/Z-Image), 8-step cfg=1 turbo schedule (~40 s/1024²). It's **aligned, not uncensored** — its draw is the **aesthetic / stylized** look, so Z-Image stays the uncensored fast pick. Requires the v0.26.0 ComfyUI pin. ## Quality ceiling & the optional HQ upgrade path (parked) The image lanes ship the **fast / distilled** checkpoints (Z-Image-**Turbo**, HiDream-O1-**Dev**). They look great, and we're keeping them — but if a no-compromise quality tier is ever wanted, the lever is the **model variant, not settings or resolution.** Measured on this rig (2026-06-24): - **Tuning a distilled model is a dead end.** Z-Image: 8 vs 16 steps, `res_multistep` vs `dpmpp_2m`, shift 3 vs 6 → all visually identical. HiDream-O1-Dev: the `negative_prompt` is a no-op (it's guidance-distilled), and `noise_scale` is a **calibrated constant, not a knob** — dropping it 7.5→5.0 produced a **blank image**. So don't chase steps / sampler / shift / negative / noise for these. - **The real lever = the non-distilled sibling** (both are separately-released checkpoints): | Lane | Ships | HQ variant | Fits our 24 GB card? | |---|---|---|---| | Z-Image | Turbo · 8-step · no CFG | **Z-Image base** · 50-step · real CFG | ✅ **yes** — same 6B arch; ~14–16 GB w/ director, like HiDream-O1. Clean drop-in, ~5–6× slower | | HiDream | O1-Dev · 28-step distilled | **HiDream-I1-Full** · 50-step · real CFG | ⚠️ **not at 2048²** — 17B + 4 encoders (incl. Llama-3.1-8B) + CFG vs only ~9.7 GB headroom (HiDream-O1 peaks at 14.9 GB w/ director). Needs the director off GPU0 + 1024²/DisTorch | **Status: parked, not wired.** Z-Image base is the clean future win (fits, no layout change); HiDream I1-Full needs VRAM gymnastics for an incremental gain over the already-excellent Dev lane. The [director-placement lever](requirements.md) (free 4.5 GB off GPU0) is what would make the heavy variant feasible — i.e. the same lever that matters for video. ## Native image button (via the image shim) OWUI's built-in 🖼️ image button (on a chat message) also renders Ideogram-4 stills — but it sends **plain text** to the image engine, which trips the same "blocked by safety filter" placeholder, and OWUI's own image-prompt-generation can't help (it returns `{"prompt":""}` and nesting the Ideogram JSON inside that string defeats the task models). The fix is **`services/studio/image-shim/`** (`:8191`): a transparent **ComfyUI reverse-proxy**. OWUI's `COMFYUI_BASE_URL` points at it (`imagegen.env`), with OWUI's image-prompt-generation turned **off**. The shim proxies every ComfyUI call (incl. the `/ws` progress socket) straight through — *except* `POST /prompt`, where it reads the plain-text prompt node, asks the director (qwen `:8090`) for a rich Ideogram-4 JSON caption, and rewrites the node before forwarding. The escaping is done in **Python** (reliable). Blast radius = image generation only — title/tag task-generation is untouched. `gpu-mode ai-studio` starts the shim and the director. If the shim is down, point `COMFYUI_BASE_URL` back at `:8188` (plain text then hits the placeholder) or use the **Studio · Image lane**. ## VRAM / GPU split All three image lanes render on **GPU0** and coexist with the ~4.6 GB director. Ideogram ~18.5 GB @1024² + director ≈ 23 GB (fits; 2048² would OOM with the director resident). HiDream is fixed at 2048² (~15 GB) + director ≈ 20 GB. Because ComfyUI holds both cards in `ai-studio`, you can do **video and a ≤1024² image in the same scene with no switch**. ## Models (obtain separately → `/mnt/models/comfyui/models/...`) | File | ComfyUI dir | Lane | |---|---|---| | `HiDream-O1-Image-Dev-2604-FP8/` (drbaph; complete folder) | `diffusion_models/` | HiDream-O1 — needs `HiDream_O1-ComfyUI` node | | `ideogram4_fp8_scaled.safetensors` (+ `_unconditional_`), `qwen3vl_8b_fp8_scaled`, `flux2-vae` | `diffusion_models/`, `text_encoders/`, `vae/` | Ideogram-4 | | `Chroma1-HD-fp8mixed.safetensors` (Comfy-Org/Chroma1-HD_repackaged) | `diffusion_models/` | Chroma (uncensored) | | `t5xxl_fp16.safetensors` + Flux `ae.safetensors` | `text_encoders/`, `vae/flux/` | Chroma (shared with Flux ecosystem) |