FAL GPT Image 2.5 Flare Edit (Soze)
The fast one, and usually the one you want
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- image_7
- image_8
- image_9
- image_10
- image_11
- image_12
- image_13
- image_14
- image_15
- image_16
- image_batch
- mask
- images
- alpha_mask
- image_urls
- image_count
- status
You can't download GPT Image. No weights, no HuggingFace repo, no GGUF - if you want it, something has to call it over the network. This node is that something: it takes a prompt and up to 16 reference images, POSTs them to fal.ai's openai/gpt-image-2.5/flare/edit endpoint, and hands the result back as a normal IMAGE you can wire into your existing graph.
It's the official ComfyUI API Nodes minus the middleman: a third-party pack wrapping fal directly, so you bring your own fal account and pay fal per image - no Comfy credits, no login. If you've used the official GPT Image partner node and resented the markup, that's the trade.
What it's actually doing
Structurally it's an HTTP client, and "Flare" is just which endpoint it hits. Flare and Sunburst are the two 2.5 edit variants and they share one base class here: byte-identical request bodies, identical published prices, one differing line - the endpoint string. So the choice between them is entirely about which one fal routes you to.
It's more than a thin wrapper, though: references get uploaded to fal and passed as image_urls, an optional MASK goes up as mask_url, results come back with alpha intact, and anything at a mismatched size is resized to the first so you get one clean batch. Submits retry with backoff rather than dying on the first blip.
The inputs worth setting
prompt is the edit instruction - say what changes, not what the picture is. There's no negative prompt; these models don't take one.
quality is the one that costs money. GPT Image 2.5 has five tiers, and per the author's tooltip, 2.5's high matches GPT Image 2's medium. Coming from an old GPT Image 2 workflow that ran high, you want max here - 4x the price. high is the default and a sane one. auto works but hides the tier you were billed for, so the node stops estimating cost when you pick it.
image_size defaults to auto, inferring the canvas from your references. The presets resolve smaller than you'd expect - the tooltip flags landscape_16_9 as 1088x608 - so when output size matters for a composite, set width and height instead (both, multiples of 16, up to 3840). Then num_images (1–10, billed each), output_format, and background.
References go in image_1…image_16, or as a single image_batch. Slots win: connect any image_N and the batch is ignored, with a note in the status widget. Either way, only the first 16 frames count.
Outputs
images is the batch - all N results stacked into one IMAGE, so Preview or Save Image downstream just works. alpha_mask is the cut-out in ComfyUI's 1 - alpha LoadImage convention, so a transparent-background render gives you a usable mask instead of a flattened backdrop. image_urls is newline-joined result URLs, image_count is how many landed, and status is the first thing to read when something's off - a headline plus a timestamped transcript of uploads, retries, delivered size and a cost estimate.
Install
ComfyUI Manager, search ComfyUI_Soze (listed as "Quality of Life Nodes for ComfyUI"), or do it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/SozeInc/ComfyUI_Soze.git
pip install -r ComfyUI_Soze/requirements.txt
No model downloads - this node is pure network. But the requirements drag in torchaudio, moviepy>=1.0.3 and azure-storage-blob whether or not you ever touch the pack's video, audio or ComfyDeploy nodes.
Then the key: either FAL_KEY in the environment ComfyUI runs in, or a config.ini at the repo root (gitignored, so it won't travel with the clone):
[API]
FAL_KEY = <your_fal_key>
The node sits under FAL/ImageGeneration.
Where people get burned
A failure is a black square, not an exception. Blank prompt, no references, an upload failure, an API error - every early-out returns a 64x64 black image with image_count 0 and the reason in status. Save Image will cheerfully write that to disk. In a batch, branch on image_count.
A bad key looks like an upload problem. The fal client is created lazily, so a missing FAL_KEY or an empty fal balance first appears as "every reference upload failed," with the real cause buried in status.
A mask that won't upload kills the run. Masked edits abort rather than silently degrading into a full-frame repaint. Right call, but a transient hiccup costs you the whole call.
Your images leave the machine. They go to fal, then to OpenAI, and OpenAI's filter applies no matter who's proxying - there's no abliterating a closed model. sync_mode keeps results out of fal's request history and returns data URIs instead of public URLs; that's a real knob, it just changes where your output lives, not where your input went.
Custom sizes come back snapped. fal rounds to multiples of 16 and clamps to its pixel bounds, then bills the delivered size. The node tells you when what you asked for isn't what came back.
Inputs (28)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | — | |
| image_size | COMBO | auto | 'auto' infers size from the input images. Presets resolve small (landscape_16_9 is 1088x608) - set width/height when the canvas matters. |
| quality | COMBO | high | GPT Image 2.5 has five tiers. Its 'high' matches GPT Image 2's 'medium'; to match GPT Image 2 at 'high', use 'max' (4x the cost of 'high'). |
| num_images | INT | 11–10 | Billed per image. |
| output_format | COMBO | png | 3 options: png, jpeg, webp |
| background | COMBO | auto | 'transparent' needs png or webp. The cut-out comes back on the alpha_mask output. |
| image_1opt | IMAGE | Reference image slot 1. Overrides image_batch when connected. | |
| image_2opt | IMAGE | Reference image slot 2. Overrides image_batch when connected. | |
| image_3opt | IMAGE | Reference image slot 3. Overrides image_batch when connected. | |
| image_4opt | IMAGE | Reference image slot 4. Overrides image_batch when connected. | |
| image_5opt | IMAGE | Reference image slot 5. Overrides image_batch when connected. | |
| image_6opt | IMAGE | Reference image slot 6. Overrides image_batch when connected. | |
| image_7opt | IMAGE | Reference image slot 7. Overrides image_batch when connected. | |
| image_8opt | IMAGE | Reference image slot 8. Overrides image_batch when connected. | |
| image_9opt | IMAGE | Reference image slot 9. Overrides image_batch when connected. | |
| image_10opt | IMAGE | Reference image slot 10. Overrides image_batch when connected. | |
| image_11opt | IMAGE | Reference image slot 11. Overrides image_batch when connected. | |
| image_12opt | IMAGE | Reference image slot 12. Overrides image_batch when connected. | |
| image_13opt | IMAGE | Reference image slot 13. Overrides image_batch when connected. | |
| image_14opt | IMAGE | Reference image slot 14. Overrides image_batch when connected. | |
| image_15opt | IMAGE | Reference image slot 15. Overrides image_batch when connected. | |
| image_16opt | IMAGE | Reference image slot 16. Overrides image_batch when connected. | |
| image_batchopt | IMAGE | Optional IMAGE batch, one reference per frame (first 16 used). Ignored if any image_N slot is connected. | |
| maskopt | MASK | Optional mask of the region to edit. Sent as mask_url. | |
| widthopt | INT | 00–3840 | Custom canvas width. Set both width and height to override image_size; 0 = use image_size. Aspect ratio must stay within 3:1. |
| heightopt | INT | 00–3840 | Custom canvas height. See width. |
| output_compressionopt | INT | -1-1–100 | 0-100, jpeg and webp only. -1 = fal default. |
| sync_modeopt | BOOLEAN | false | If True, FAL returns images as data URIs instead of public URLs, and keeps them out of request history. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| alpha_mask | MASK | — |
| image_urls | STRING | — |
| image_count | INT | — |
| status | STRING | — |