Ideogram 4 Quad Prompt Builder
Assembling Ideogram 4's JSON prompt from four storyboard frames
- layout
- frame_a
- frame_b
- frame_c
- frame_d
- prompt
Here's the dirty secret about Ideogram 4 that makes this whole pack exist: it was trained almost exclusively on structured JSON captions, and plain prose prompts underperform badly on it. You condition it with hex color palettes, bounding boxes in a 0–1000 coordinate space, and per-element descriptions. That's a genuine superpower - precise layout control no other open model offers - but hand-writing that JSON is miserable. Ideogram4QuadPromptBuilder is the node that writes it for you, from a layout and up to four frames.
What it does
It takes the geometry from Ideogram4QuadLayout and the story from your Frame nodes, and emits the complete structured prompt as a single string:
layout(required) - theQUAD_LAYOUT, which carries each cell's bounding box in Ideogram's 0–1000 space. The builder places each frame's text into the correct panel bbox, so panel positions are enforced spatially, not just described.frame_athroughframe_d(optional) - up to fourQUAD_FRAMEs, one per panel.- Global fields:
high_level_description(a scene-level summary),aesthetics,lighting,medium,background, andshared_palettefor hex colors the whole storyboard inherits.
The single prompt output is a JSON string - wire it into the text conditioning of your Ideogram 4 workflow the same way you'd feed the prompt into CLIPTextEncode.
The consistency trick
This is the node's best feature, and it's per-subject rather than per-panel. The builder walks the frames in reading order and tracks which subjects it has seen. The first time a character appears it's established - phrased as "Mara: [description]". Every later appearance is stamped with recurrence language:
- subject →
the EXACT SAME Mara, identical face and outfit - location →
the SAME diner setting - object →
the SAME briefcase, identical
So multiple characters can recur in different combinations across the four panels, and each one stays locked to its own description instead of bleeding into a neighbor. That's the direct application of what makes Ideogram 4 special - it has the best character and IP recall of any open model without a LoRA, and this node is built to exploit it. Flip enforce_consistency off and it stops stamping, which you might do for a frame where a character genuinely changes.
It even fills in high_level_description for you if you leave it empty, generating a summary like "A four-panel 2×2 storyboard featuring Mara, The Diner…" from the cast - a nice touch that means you can get a working prompt from frames alone.
Installing
cd ComfyUI/custom_nodes
git clone https://github.com/reality-comes/comfyui-ideogram4-quad-storyboard
Restart ComfyUI; it appears under image/ideogram4 (ComfyUI Manager: search "Ideogram 4 Quad Storyboard"). No extra Python dependencies, no model downloads - the pack runs on ComfyUI's bundled torch and comfy. The model you render with is Ideogram 4 itself (fp8 or nf4, non-commercial license), which you load and schedule separately.
Where people get burned
The defaults are opinionated - cinematic, moody, high-contrast aesthetics, 35mm film still medium, "Identical set in every panel" background - and that's actually a coherent look for a storyboard, but it'll fight you if you want bright and clean. Override medium, lighting, and aesthetics early. Second gotcha: a Frame whose position isn't one of the four real cells gets silently skipped, so check your positions if a panel's text is missing from the JSON. And don't be surprised the output is JSON, not prose - that's the format the model was trained on, and the whole reason this node exists. Preview the string once, marvel, then feed it in.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| layout | QUAD_LAYOUT | — | |
| enforce_consistency | BOOLEAN | true | — |
| high_level_description | STRING | — | |
| aesthetics | STRING | cinematic, moody, high-contrast | — |
| lighting | STRING | dramatic directional light, deep shadows | — |
| medium | STRING | cinematic photograph, 35mm film still | — |
| background | STRING | Identical set in every panel. | — |
| shared_palette | STRING | — | |
| frame_aopt | QUAD_FRAME | — | |
| frame_bopt | QUAD_FRAME | — | |
| frame_copt | QUAD_FRAME | — | |
| frame_dopt | QUAD_FRAME | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | — |