Sunburst Model Verification
GOO-370 · Verification

Sunburst generates, edits and cuts out — proven in the running app.

GPT Image 2.5 Sunburst is wired into the FAL registry, the seed, Galleria and the workflow nodes. Four real generations were driven through the live UI by a browser agent — a text-to-image, a reference edit, a transparent cut-out, and a run from the workflow canvas node, which is a separate code path from Galleria. All seven hops of the generation path are exercised on both surfaces.

Branch ziann/goo-370-feature-add-sunburst-model Files 11 changed, uncommitted Identifier gpt-image-2.5-sunburst

Where it stands

Passed

End to end

Three generations reached completed, none stuck in queued. 15 credits charged each, three times over.

Passed

Both surfaces

Galleria and the workflow canvas node, which are separate code paths. Six quality tiers and the new Background control render on each.

Open

Before shipping

The credit figure is a placeholder and there is no production rollout script. Everything else is settled.

The generation path, segment by segment

A request crosses seven hops. The provider call was proven first with direct requests; the remaining six were proven afterwards by driving the real interface, then checking the database and service logs rather than trusting the screen.

1 Galleria panel & workflow canvas node both surfaces: model picked, settings rendered, run Verified
2 Gateway POST /api/v1/generations Verified
3 Queue worker generation:image:fal Verified
4 Vertex-AI service registry lookup resolved the FAL path Verified
5 FAL provider call fal.run/openai/gpt-image-2.5/sunburst/… Verified
6 Download & store asset persisted, served back to the feed Verified
7 Completion & credit charge credit_ledger · usage · 15.0000 Verified

Worth noting for anyone debugging later: nothing ever sat in queued. FAL image models take the synchronous fal.run path, which sidesteps the completion-webhook failure mode that strands video generations when the gateway URL is wrong.

The interface

The Galleria panel with GPT Image 2.5 Sunburst selected, showing six quality buttons and a Background control.
Signed in · model selected Every control this change introduces, rendering live: Quality with six tiers — Auto, Low, Medium, High, X-High, Max, against the four gpt-image-2 offers — and the Background row, which no other model in the catalogue has. The button quotes Generate (15 credits), read from the seeded row.
Three generated images in the feed: a lemon with no background, a green lime, and a lemon on white.
Three runs, one feed Right to left, in the order they were made: the original lemon on white (background: auto), the same lemon turned into a lime through the edit endpoint, and a transparent cut-out. The cut-out is the convincing one — it sits straight on the dark canvas with no white card behind it. Credits read 9,999,855, down exactly 45 from 9,999,900.

The workflow canvas node

The canvas is a different code path from Galleria — its own config, its own defaults, its own execution file. Galleria passing proved nothing about it, so it was tested separately. The node carries a risk Galleria does not: its dispatcher destructures node data into an explicit allow-list and then rebuilds it into an explicit object literal, so a key missing from either list arrives undefined and falls silently back to a default.

A Generate Image node on the workflow canvas showing a transparent-background strawberry and a Background setting reading Transparent.
Workflow canvas · Generate Image node Background set to Transparent, and the strawberry sits on a checkerboard rather than a white card. Note the settings differ from Galleria's by design: Size 1:1 HD here against Galleria's 4:3, because the node has its own defaults.
POST /api/generations → 201
"config":{"image_size":"square_hd","quality":"low","background":"transparent","output_format":"png","num_images":1}
CheckObservedResult
Generation3e14f5b5… completed, bg=transparent, 17.3spass
Credits15.0000, quoted = chargedpass
Raw asset1024×1024 RGBA, 51.0% clear pixelspass
Picker orderSunburst first, GPT Image 2 secondpass

What the backend actually did

The screen can lie. These lines are from vertex-ai.log and show the path the registry resolved for each of the three runs.

[FAL Image] model=gpt-image-2.5-sunburst path=openai/gpt-image-2.5/sunburst/text-to-image edit=false images_in=0
[FAL Image] model=gpt-image-2.5-sunburst path=openai/gpt-image-2.5/sunburst/edit          edit=true  images_in=1
[FAL Image] model=gpt-image-2.5-sunburst path=openai/gpt-image-2.5/sunburst/text-to-image edit=false images_in=0
CheckObservedResult
Generations3 rows, all status = completedpass
Stuck in queued0pass
Credits charged3 × usage 15.0000 in credit_ledgerpass
Picker orderSunburst seq 5, GPT Image 2 seq 6pass
Gateway listenercwd = this worktree, not a stale binarypass

Transparency, measured rather than eyeballed

background is the parameter new in 2.5. A screenshot of a dark canvas cannot distinguish a real alpha channel from a dark fill, so the raw stored assets were decoded and their pixels counted.

RunEncodingFully transparent pixelsCorner alpha
background = auto8-bit RGB0 (0.0%)255
background = transparent8-bit RGBA364,388 (46.3%)0
A red apple on a plain white background.
Direct provider call · generate The first evidence gathered, before the cluster was available — a direct request to the provider returning RGB.
The same apple, recoloured green, on a transparent background.
Direct provider call · edit The same apple fed back through the edit endpoint with background: transparent, returning RGBA. Stem, highlight and contour survive the recolour untouched — the precision editing Sunburst is chosen for.

Option sets, checked against the live provider

Rather than pay for a generation per tier, deliberately invalid values were sent and the provider's 422 responses read back. Each names its accepted set, so every dropdown is validated at once, for free.

ParameterAccepted by FALOffered in UIMatch
quality auto, low, medium, high, xhigh, max all 6exact
background auto, transparent, opaque all 3exact
image_size square_hd, square, portrait_4_3, portrait_16_9, landscape_4_3, landscape_16_9, auto all 7exact

Static checks

CheckScopeResult
Go buildgateway, vertex-ai, go-queuepass
Go vetvertex-ai routes & internalpass
Go test./routes/external/pass
ESLintall 8 frontend filespass
SQL parseseed.sql into throwaway Postgrespass
Sequence auditno duplicates in image or videopass

Open items

Before production

The credit figure is a placeholder, not an agreed price.

Seeded at 15, derived from the repo's formula against the worst verified cost — $0.211 at 1024px max. The vendor publishes no price for 4K combined with max, so that case may exceed a flat rate. Both the model row and the cost row carry a marker to substitute the real figure. If the true cost varies sharply by resolution, a model_provider_costs row would track it better than a flat default.