# Ideogram 4 in ComfyUI Two distinct execution paths exist. Pick the right one based on auth and hardware. ## Path A: Cloud API (`IdeogramV4` node) - **Node:** `IdeogramV4` (built-in, from `comfy_api_nodes.nodes_ideogram`) - **Inputs:** `prompt` (STRING), `resolution` (COMBO), `rendering_speed` (COMBO), `seed` (INT) - **Hidden inputs:** `auth_token_comfy_org`, `api_key_comfy_org` - **Requires:** comfy.org account + API key (set via auth_token or api_key_comfy_org) ### Common error ``` Unauthorized: Please login first to use this node. ``` → Set the `api_key_comfy_org` hidden input or login in the ComfyUI web UI. ## Path B: Local inference (`Ideogram4Scheduler` node) - **Node:** `Ideogram4Scheduler` (built-in, `comfy_extras.nodes_ideogram4`) - **Outputs:** `SIGMAS` — feed into `SamplerCustomAdvanced` - **Workflow structure:** `Ideogram4Scheduler` → `SamplerCustomAdvanced` → `VAEDecode` → `SaveImage` ### Why you can't just "use the blueprint directly" The official blueprint at `blueprints/Text to Image (Ideogram v4).json` is in **editor format** (`"nodes"` / `"links"` arrays with a top-level `definitions.subgraphs` array). **The ComfyUI REST API (`POST /api/prompt`) does NOT accept editor format.** Submitting it produces HTTP 400 or 500 with no useful message. You must either: 1. Load the blueprint in the ComfyUI web UI and re-export it as **API format** (Workflow → Export API), OR 2. Manually construct an API-format workflow using the verified node wiring below. ### Critical: Ideogram 4 needs asymmetric CFG wiring Unlike standard pipelines that use `BasicGuider`, Ideogram 4 requires `CFGOverride` + `DualModelGuider` for asymmetric classifier-free guidance: - `CFGOverride` sits on the **main model** to override the CFG value in a specific timestep range - `DualModelGuider` takes the CFG-overridden main model, the positive conditioning, a **separate unconditional model** (via `model_negative`), and the zeroed-out conditioning (via `ConditioningZeroOut`) - The guider output (`GUIDER`) feeds into `SamplerCustomAdvanced` **Do NOT use:** plain `BasicGuider` (only supports single model + pos/neg), standard `KSampler` (doesn't use `Ideogram4Scheduler` sigmas), or `model_1` as the DualModelGuider input name (it's `model_negative`). ### Node input names for API-format workflows (verified against `/object_info`) | Node | Required inputs | Optional inputs | Notes | |------|-----------------|-----------------|-------| | `Ideogram4Scheduler` | `steps`, `width`, `height`, `mu`, `std` | — | Outputs `SIGMAS` for `SamplerCustomAdvanced` | | `CFGOverride` | `model`, `cfg`, `start_percent`, `end_percent` | — | Place on main UNet between `UNETLoader` and `DualModelGuider` | | `DualModelGuider` | `model`, `positive`, `cfg` | `model_negative` (MODEL), `negative` (CONDITIONING) | `model_negative` is the unconditional UNet (NOT `model_1`) | | `CLIPLoader` | `clip_name` | `type` (use `"ideogram4"`), `device` | Must use `type: "ideogram4"` for Qwen3VL text encoder | | `EmptyFlux2LatentImage` | `width`, `height`, `batch_size` | — | 128-channel latent (NOT standard `EmptyLatentImage`) | | `SamplerCustomAdvanced` | `noise`, `guider`, `sampler`, `sigmas`, `latent_image` | — | `guider` comes from `DualModelGuider`, `sigmas` from `Ideogram4Scheduler` | ### Required models | Component | Filename | Path | Size | Source | |-----------|----------|------|------|--------| | UNet (main) | `ideogram4_fp8_scaled.safetensors` | `models/diffusion_models/` | ~8.6 GB | `Comfy-Org/Ideogram-4` | | UNet (unconditional) | `ideogram4_unconditional_fp8_scaled.safetensors` | `models/diffusion_models/` | ~8.6 GB | `Comfy-Org/Ideogram-4` | | VAE | `flux2-vae.safetensors` | `models/vae/` | ~320 MB | `Comfy-Org/flux2-dev` | | Text encoder (A) | `qwen3vl_8b_fp8_scaled.safetensors` | `models/text_encoders/` | ~9.8 GB | `Comfy-Org/Qwen3-VL` | | Text encoder (B) | `gemma4_e4b_it_fp8_scaled.safetensors` | `models/text_encoders/` | ~? GB | `Comfy-Org/gemma-4` | ### Known corruption: `qwen3vl_8b_fp8_scaled.safetensors` A truncated download of this ~9.8 GB file produces: ``` Error while deserializing header: incomplete metadata, file not fully covered ``` at ComfyUI's `CLIPLoader` (node `load_clip` → `comfy.utils.load_torch_file`). **Quick integrity check** (run inside the ComfyUI container or on the host): ```bash python3 -c " import struct, json, os p = 'models/text_encoders/qwen3vl_8b_fp8_scaled.safetensors' f = open(p, 'rb'); hl = struct.unpack('