π§© Ideogram 4 Prompt Builder w. String Inputs
Draw your composition, get the JSON caption Ideogram 4 actually wants
- image
- prompt
- preview
- bboxes
- width
- height
Ideogram 4.0 landed in June 2026 as the first open-weights Ideogram, and it broke the usual prompting habit in a very specific way: it was trained exclusively on structured JSON captions. Type a normal English sentence and it underperforms. Type the JSON it was trained on - hex colour palettes, bounding boxes as [y_min, x_min, y_max, x_max], typed elements per region - and you get regional layout control that nothing else open-weights offers, plus a side effect people found amusing: prompting through the documented schema also tends to dodge the refusal image that's trained into the weights.
Hand-writing that JSON is miserable. π§© Ideogram 4 Prompt Builder is a visual editor that does it for you. It's adapted from kijai's KJNodes builder, converted to the classic node API and then extended with one genuinely useful addition - a string input pin per region. Draw region 1, and a region_N input appears on the node. Connect a wildcard processor or an LLM node to it and that string overrides the region's description at run time. That's the whole reason this version is worth installing over the original: it turns a static layout into a template you can vary per queue.
The editor
It's a canvas inside the node. Drag on empty space to draw a box, click to select, alt-click to cycle through overlapping regions, double-click to type a description inline. Right-click opens a layers list where you can reorder, duplicate and delete. + Region adds a default box (and its pin), Grab BG pulls the last generated image in as a reference background, Live feeds the sampling preview through as the background while you generate.
There's a token estimate in the corner - ~N tok - that goes green, then orange, then red. Red means you're at or over 2048 tokens and the model will error out. It is not decorative. Long region descriptions in a busy layout get there faster than you'd expect.
Copy and Paste move caption JSON to and from the clipboard, which is how you share a layout with someone.
Inputs and outputs
Required: width and height, which set the canvas aspect ratio and the pixel grid your boxes are measured in. Ideogram 4 needs multiples of 16 - the default is 1024Γ1024, and 1344Γ768 or 768Γ1344 will get you landscape and portrait.
Optional: high_level_description (one line summarising the whole image), background (the scene background - treat it as required in practice), and the style block: style picks whether you emit a photo or art_style key or nothing at all, with photo, art_style, aesthetics, lighting and medium filling in the descriptors. image shows a reference behind the editor. import_json loads an existing caption - note it loads into the editor on run, and the output always reflects the editor, never the raw input, so importing and immediately queueing without touching anything is safer than it sounds.
Outputs: prompt is the assembled caption as JSON text - that's what goes to your Ideogram 4 text encode. preview is a rendered visualisation of the regions, their text and their palettes. bboxes gives the region boxes in pixels as {x, y, width, height} for anything downstream that wants them; freeform regions are excluded because they have no fixed position. width and height pass through.
Sounds great. Should you build on it?
Two honest caveats, both from the model side rather than the node side. First, Ideogram 4 is non-commercial licensed, and the agreement lets Ideogram terminate on notice - which is why LoRA production on it stalled within four weeks of release while people moved to Krea 2. Second, it's slow: 3-4 minutes per image against ~30-40 seconds for Krea 2 Turbo, plus the time you spend authoring a layout. The community's workaround is sane - explore with a fast model, come back here to compose the final piece.
Where it shines is exactly what it was built for: layouts, in-image text, and precise placement. If that's your job, nothing else open-weights does it.
Install
ComfyUI Manager β ComfyUI-mnemic-nodes, or:
cd ComfyUI/custom_nodes
git clone https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes
Restart. No extra models for this node - it's an editor and a JSON assembler. You do need an Ideogram 4 checkpoint and a way to feed a JSON caption into it; the pack's requirements come along regardless (which for this node means a stack of transformers, opencv-python, piexif etc. you won't touch).
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| width | INT | 102464β16384 | Canvas aspect width (also the pixel grid the bbox is measured in). Ideogram 4 needs multiples of 16. |
| height | INT | 102464β16384 | Canvas aspect height (also the pixel grid the bbox is measured in). Ideogram 4 needs multiples of 16. |
| high_level_descriptionopt | STRING | Optional one-line overview of the whole image (blank = omitted). | |
| backgroundopt | STRING | Required scene background description. | |
| styleopt | COMBO | none | Style block: none omits it, photo/art_style pick which style key is emitted. |
| photoopt | STRING | Photo style descriptor (used when style = photo). | |
| art_styleopt | STRING | Art style descriptor (used when style = art_style). | |
| aestheticsopt | STRING | Style descriptor (blank = omitted). | |
| lightingopt | STRING | Style descriptor (blank = omitted). | |
| mediumopt | STRING | Style descriptor (blank = omitted). | |
| imageopt | IMAGE | Optional reference image shown as the editor background (and behind the preview). | |
| import_jsonopt | STRING | Optional: a full caption JSON. When connected, it loads into the editor on run; the output always reflects the editor, never the raw input. | |
| style_palette_dataopt | STRING | Serialized style color palette from the editor (managed by the node UI). | |
| elements_dataopt | STRING | Serialized regions from the editor (managed by the node UI). |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | The assembled Ideogram 4 caption, as JSON text. |
| preview | IMAGE | Rendered preview of the regions, their text and their palettes. |
| bboxes | BOUNDING_BOX | Region boxes in pixels as {x, y, width, height}, nested one list per frame. Freeform regions are excluded because they have no fixed position. |
| width | INT | Canvas width in pixels, passed through from the input. |
| height | INT | Canvas height in pixels, passed through from the input. |