ApoGalleria-Flux2
Reuse one Ideogram 4 caption on Flux.2 without rewriting it
- flux2_json
Both Ideogram 4 and Flux.2 "take JSON", which makes it sound like one caption could serve both. It can't. Ideo4 wants a deeply nested schema with bounding boxes and hex palettes; Flux.2 wants a much flatter, loosely typed one. ApoGalleria-Flux2 is the adapter - a tiny node whose whole job is turning the first into the second.
Why you'd bother
You already put real work into a caption - maybe assembled in ApoGalleria-Ideo4 from locked fields across several entries, maybe hand-authored, because Ideogram 4 was trained exclusively on structured JSON captions and prose underperforms badly on it. Either way it's a pile of structured knowledge: subjects, a palette, a lighting read, a background.
Flux.2 doesn't want that shape. It's an LLM-encoded model reading your prompt as a message, so nested descriptors genuinely help it keep subjects apart - the community finding is that they "reduce ambiguity and concept bleed". But Flux.2's structured prompting guide defines its own keys (scene, subjects, style, lighting, background, color_palette), and none of them are Ideo4's. This node does that translation instead of you retyping the caption.
The mechanism
It's a pure field-to-field remap - no model, no heuristics, no UI, no library, no storage. A converter and nothing else.
high_level_descriptionbecomesscene.- The three style fields -
aesthetics,medium, and whichever ofart_style/photois present - get folded into one labelledstylestring:Aesthetic: …. Medium: …. Art style: …. lighting,color_paletteandbackgroundcarry across as-is.- Each
elements[].descbecomes asubjects[].description, and per-elementtextandcolor_palettecome along only if the source element actually had them. bboxis dropped. Deliberately - Flux.2 has no coordinate concept, and the author's call was not to invent a plain-English position out of a box that says something more precise. If position matters, put it in the description.- Flux.2's
mood,compositionandcamerakeys are never emitted. There's no Ideo4 field to source them from, so they're left out rather than written as empty strings.
Empty source fields are skipped rather than written as null, so the output is shorter than you might expect. That's correct behaviour.
Inputs and outputs
Wire export_json from ApoGalleria-Ideo4 into ideo4_json. It's a required multiline STRING, and the code declares it forceInput - a socket you connect, not a box you type in.
pretty_print is the only other control, an optional BOOLEAN defaulting to True. It indents the output JSON - cosmetic, but handy if you're inspecting the string. Leave it on.
The single output is flux2_json (STRING). Feed it into the text encode / conditioning side of your Flux.2 graph.
Installing it
It comes with the pack, so there's nothing separate to fetch.
- In ComfyUI Manager, search
ApoGalleriaand install. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/ApoloniArt/ApoGalleria ComfyUI-ApoGalleria
pip install -r ComfyUI-ApoGalleria/requirements.txt
- Restart ComfyUI. All three nodes show up under the ApoGalleria category.
That requirements file is one line: Pillow>=9.0.0. No models to download, no PyTorch version roulette, no compile step - which makes this a low-risk pack to drop into an existing environment.
To update:
cd ComfyUI/custom_nodes/ComfyUI-ApoGalleria
git pull
Gotchas
Bad input returns a string, not an error. A parse/validation failure is caught and returned as a string beginning ERROR: … on the output instead of raising. Friendlier than a red node, but it means a malformed caption travels down the graph looking like a prompt. If your Flux.2 generation comes out nonsense, read the flux2_json string first.
Feed it Ideo4 JSON, not Flux.2 JSON. The node won't notice - it'll parse happily and give you an empty-ish result. The source format is the nested one with compositional_deconstruction.elements.
Thin caption, thin output. Empty fields are omitted, so a near-empty flux2_json means the source caption was mostly blank - usually a library entry whose fields were never filled in.
The pack is new and quiet. There is essentially no independent discussion of ApoGalleria anywhere - it landed in September 2026 from a solo author, ApoloniArt. Nothing is deprecated or version-fractured yet, but you're trusting the README and the source, so keep the logs open the first time you wire it up.
One last honest note on JSON prompting: it works on Flux.2 because the text encoder is an LLM and clean field separation helps it, not because the model parses JSON as syntax - a well-structured paragraph does the same work. The reason to reach for this node is that your caption already exists in structured form.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| ideo4_json | STRING | — | |
| pretty_printopt | BOOLEAN | true | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| flux2_json | STRING | — |