Nodes/ApoGalleria/ApoGalleria-Flux2
ComfyUI Node

ApoGalleria-Flux2

Reuse one Ideogram 4 caption on Flux.2 without rewriting it

By ApoloniArt·Created 21 days ago·Updated about 21 hours ago· 3
ApoGalleria-Flux2
    • flux2_json
    ideo4_json
    pretty_printtrue

    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_description becomes scene.
    • The three style fields - aesthetics, medium, and whichever of art_style/photo is present - get folded into one labelled style string: Aesthetic: …. Medium: …. Art style: ….
    • lighting, color_palette and background carry across as-is.
    • Each elements[].desc becomes a subjects[].description, and per-element text and color_palette come along only if the source element actually had them.
    • bbox is 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, composition and camera keys 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.

    1. In ComfyUI Manager, search ApoGalleria and install. Or by hand:
    cd ComfyUI/custom_nodes
    git clone https://github.com/ApoloniArt/ApoGalleria ComfyUI-ApoGalleria
    pip install -r ComfyUI-ApoGalleria/requirements.txt
    
    1. 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.

    CategoryApoGalleria

    Inputs (2)

    NameTypeDefaultDescription
    ideo4_jsonSTRING
    pretty_printoptBOOLEANtrue

    Outputs (1)

    NameTypeDescription
    flux2_jsonSTRING