GPT Image 2.5 Flare (BudgetPixel)
The GPT Image node you leave wired up while you iterate
- reference_images
- images
OpenAI's image models have no weights to download, so "local" was never on the table for them. This node is the honest version of that: an ordinary-looking ComfyUI image node whose whole job is to POST your prompt to BudgetPixel's API, poll until the picture exists, and hand back a tensor. No GPU, no checkpoint, no 10GB download - and no image if your internet is down.
Flare is the everyday tier of GPT Image 2.5 - the pack ships two nodes for the same model, and this is the cheaper, lower-latency one. Same widgets, same reference-image count, same endpoints, one thing different: its quality default is medium where Sunburst's is high. That is the whole distinction, and it's a good default. You get 40 credits an image instead of 80 at 1K, and you can still crank quality when a shot earns it.
How it actually works
The pack is built from committed schemas/*.json snapshots of BudgetPixel's public OpenAPI spec, and node classes are generated at import time - the same trick Replicate's official pack uses. So this isn't hand-written widget code, it's a schema diff, which is why the params line up exactly with the API docs.
When you hit Queue Prompt, the node builds a JSON payload from your widgets, POSTs it to the model's create endpoint, then polls the status endpoint every 2 seconds until succeeded, up to a 600-second ceiling. The ComfyUI progress bar is fake-but-honest: it steps 10/25/60/90/100 as the job moves through pending → starting → processing → completing → succeeded. Results come back as signed URLs, get downloaded credential-free, and are stacked into one IMAGE batch.
The one non-obvious bit is caching: IS_CHANGED returns a timestamp only when force_rerun is true, otherwise an empty string. Press Queue Prompt twice with identical inputs and ComfyUI serves the cached image without touching the API - a feature, until someone assumes the node is broken because their "second attempt" is byte-identical. Flip force_rerun on when you want a fresh roll.
Inputs worth setting
- prompt - the only required field, multiline, dynamic-prompt friendly.
- quality / resolution - the price dial. At 1K:
low30,medium40,high80,xhigh130,max250 credits; 2K doubles that, 4K triples it.maxat 4K is 750 credits per image. Set these deliberately, not by accident. - num_images (1–4) - multiplies the bill by exactly that much.
- reference_images - an ordinary
IMAGEsocket, up to 9 frames, for editing and multi-reference composition. Omit it for text-to-image. Small PNGs go inline as data URIs; anything over ~6 MiB gets pushed to a temporary upload URL first. The first reference is free, each additional one adds 5 credits per generated image, and a batch of 10+ frames gets silently truncated to 9 with a console warning - check your terminal if a reference seems ignored. - force_rerun - as above. It exists precisely because everything else is cached.
The output is one images socket (type IMAGE) - wire it into Save Image, a preview, or your upscaler exactly like a local sampler's output.
Install
ComfyUI Manager is the sane route - search BudgetPixel, install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/budgetpixel-ai/comfyui-budgetpixel.git
pip install -r comfyui-budgetpixel/requirements.txt
That requirements file is one line: requests. No torch, no model files, nothing to download.
Then give it a key. Either set BUDGETPIXEL_API_KEY=bpx_live_... in your environment, or drop a budgetpixel.json inside the pack folder:
{ "api_key": "bpx_live_..." }
There is deliberately no api_key widget, so a shared workflow JSON never carries your key. Keys come from budgetpixel.com and the API is included on every paid plan.
Where people get burned
A missing key doesn't fail quietly - you get No BudgetPixel API key found pointing at the settings page, and a key on a free account returns api_access_not_enabled with a link to pricing. Neither is a node bug.
A generation that takes longer than 600 seconds raises a client timeout and gives up: the job is still running server-side, and still billing. Same story if you interrupt the graph - the poll stops, the job doesn't. Expect this on xhigh/max at 4K with several outputs; the pack's own pre-flight BudgetPixel Cost Estimate node exists so you can see the number before you commit.
And the structural caveat, the same one every whole-frame editor has: reference-image editing re-emits the entire image, so pixels you didn't ask about come back close but not identical, and that drift compounds over a chain of edits. If something in your frame must not move - a product photo, a logo, a face you already like - crop, edit, and composite back rather than trusting the edit path to leave it alone.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Text description of the image to generate. | |
| aspect_ratioopt | COMBO | 1:1 | Output aspect ratio. |
| num_imagesopt | INT | 11–4 | Number of images to generate. |
| output_formatopt | COMBO | png | Output image format. |
| qualityopt | COMBO | medium | Rendering quality. Per image at 1K: low 30, medium 40, high 80, xhigh 130, max 250 credits (scaled by resolution). |
| reference_imagesopt | IMAGE | Optional reference images (up to 9) for image editing and composition. Each item is a public image URL, a data URI, raw base64, or an uploaded-file URL from POST /v1/uploads. Omit for text-to-image. The first reference is free; each additional one adds 5 credits per generated image. | |
| resolutionopt | COMBO | 1K | Output resolution tier. 2K bills 2× and 4K 3× the 1K price of the chosen quality. |
| force_rerunopt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |