FAL GPT Image 2.5 Sunburst Edit (Soze)
Same price, more patience, tighter edits
- 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
Sunburst is the second of the two GPT Image 2.5 edit endpoints in this pack, and the pitch is narrow but real: tightest edit scoping, slower, same price as Flare. One change to one photo? Flare is fine. Sunburst earns its keep when the same plate is going through five rounds of "no, not like that" and every round has to leave the rest of the frame alone.
As with its sibling, this node calls fal.ai. GPT Image 2.5 has no weights to download, so an API call is the only door. Unlike the official ComfyUI partner nodes there's no Comfy account in the loop - you bring a fal key and pay fal per image.
The two variants are one node underneath
In this pack they're literally the same class. Flare and Sunburst share one base implementation that builds a byte-identical request body - same image_urls, same quality, same image_size - and the subclass changes only the endpoint string, openai/gpt-image-2.5/sunburst/edit versus .../flare/edit. Node-side behavior and price are identical; what differs is how fal's backend handles the request.
So verify it yourself: duplicate the node, wire the same reference and prompt into both, compare. Two calls, and you'll know for your images rather than somebody's benchmark.
The wrapper is Flare's too: references uploaded to fal and passed as image_urls, an optional MASK sent as mask_url, results downloaded with alpha intact, mismatched sizes resized to the first so you get one clean batch. Submits retry with backoff, and every step narrates itself into the status widget.
Inputs that matter
prompt is the edit instruction - describe the change, not the scene. There's no negative prompt; closed image models don't take one.
quality is the money knob and the one people misread. GPT Image 2.5 has five tiers, and the tooltip is blunt: 2.5's high equals GPT Image 2's medium. Coming from a GPT Image 2 workflow that used high, you want max - 4x the cost. Coming in fresh, the default high is fine.
image_size defaults to auto and infers from your references. The presets are small - the author flags landscape_16_9 at 1088x608 - so when canvas size matters downstream, set width and height instead (both, multiples of 16, max 3840). Then num_images (up to 10, billed each), output_format, and background.
References go in image_1…image_16, or as one image_batch. Any connected image_N slot overrides the batch, and only the first 16 frames are used - both notes surface in the status widget so you aren't guessing.
Outputs
images is the batch, all results stacked into one IMAGE so a Preview or Save Image downstream takes it as-is. alpha_mask gives you the cut-out as a MASK in ComfyUI's 1 - alpha LoadImage convention - the reason to set background to transparent with png or webp. image_urls is a newline-joined STRING of result URLs, image_count is how many came back, and status is the transcript: config, uploads, the size fal actually delivered, and a cost line from fal's published price table. Expect roughly five cents for a 1024x1024 at high and about 4x that at max, prompt tokens on top - and no estimate at all when quality is auto, because the real tier is hidden.
Install
Same pack, same two routes. In ComfyUI Manager search ComfyUI_Soze ("Quality of Life Nodes for ComfyUI"), or:
cd ComfyUI/custom_nodes
git clone https://github.com/SozeInc/ComfyUI_Soze.git
pip install -r ComfyUI_Soze/requirements.txt
Nothing to download model-wise. Do brace for that requirements list, though - torchaudio, moviepy>=1.0.3 and azure-storage-blob come along whether or not you'll ever run this pack's video, audio or ComfyDeploy nodes, and dragging moviepy into an existing Comfy environment is the sort of thing that occasionally upsets a pip resolution.
Then the credential, either as FAL_KEY in ComfyUI's environment or a gitignored config.ini at the repo root:
[API]
FAL_KEY = <your_fal_key>
You'll find the node under FAL/ImageGeneration.
Where people get burned
A failed run isn't an error, it's a black square. Blank prompt, no references, an upload failure, an API refusal - all return a 64x64 black IMAGE with image_count 0 and the reason in status. Nothing throws, and Save Image writes it to disk without complaining.
The mask is all or nothing. If it can't be uploaded, the node aborts instead of editing without it. Deliberate - a masked inpaint silently running full-frame is worse than a dead run - but it costs you the call.
An unset key reads as an upload problem. The FAL client is created lazily, so a missing FAL_KEY or an exhausted fal balance first shows up as "every reference upload failed," with the real reason buried deeper in the status text.
The filter travels with the model. Your references and prompt go to fal, then to OpenAI, and OpenAI's content policy decides - Sunburst doesn't shift that and no node can. sync_mode keeps results out of fal's request history and returns data URIs rather than public URLs; a genuine knob, but it changes where the output lives, not where your input went.
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 | — |