Flare draft, Sunburst final: a two-pass image edit loop on Sume
Find the edit on GPT Image 2.5 Flare at low quality, then send the same request to Sunburst at high for the keeper. Costs and limits from Sume docs.

A cheap way to run image edits is two passes: send the request to openai/gpt-image-2.5 (Flare) at quality: "low" until the edit is right, then repeat the same prompt and references on openai/gpt-image-2.5-sunburst at high for the keeper. OpenAI's announcement describes Flare as the speed-first model and Sunburst as the precision model, and Sume's Image API lists both with the same parameters.
Why two models and not one
OpenAI's announcement dated 2026-09-08 says Flare prioritizes speed (described as 50% faster) for everyday prompts, while Sunburst emphasizes precision for detailed creative work with longer generation times. The claim compares the two models with each other, so treat it as a direction, not a number you can budget around.
Sume's docs say Flare and Sunburst use the same Fal token rates, so the choice is about time and edit precision, not a different price list. The draft pass is cheap because you also drop quality: at 1024x1024 the output token estimate is a fraction of a cent at low and several cents at high.
What the two passes cost
These are output-token estimates only, computed from the $30 per million output image token rate in the Image API docs and Fal's GPT Image 2.5 Flare page. Input tokens and Sume's own pricing come on top, so read the live numbers from GET /v1/images/models before you budget.
| Quality | Output estimate per image | Use it for |
|---|---|---|
| low | $0.00588 | Draft: is the edit direction right? |
| medium | $0.01317 | Second look at faces and layout |
| high | $0.05268 | Keeper candidate (the default when quality is omitted) |
| xhigh | $0.09366 | Dense detail, small text |
The loop
Keep every request identical between passes except model and quality. The reference list, its order and the prompt are what carry the edit, and the Image API does not accept a seed, so a second pass on a different model is a new take, not a replay of the draft. Expect the final to differ in detail from the draft.
Pick the draft you like, then spend high only on it. If a draft pass fails the check (wrong object changed, wrong crop), fix the prompt at low where it costs fractions of a cent.
- Pass 1:
openai/gpt-image-2.5,quality: low,n: 4for four takes. - Choose one take; note its prompt and
input_references. - Pass 2:
openai/gpt-image-2.5-sunburst,quality: high,n: 1. - Edits: set
aspect_ratio: "auto"so the output keeps the reference's shape.
Request for either pass
import os
import asyncio
import httpx
URL = "https://api.sume.com/v1/images"
HEADERS = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
async def edit(model: str, quality: str, n: int) -> list[str]:
body = {
"model": model,
"prompt": "Replace the background with a soft daylight studio. Keep the product identical.",
"input_references": [
{"type": "image_url", "image_url": {"url": "https://example.com/product.png"}}
],
"aspect_ratio": "auto",
"quality": quality,
"n": n,
}
async with httpx.AsyncClient(timeout=60) as client:
r = await client.post(URL, headers=HEADERS, json=body)
r.raise_for_status()
if r.status_code == 202:
raise RuntimeError("Still running: poll the job, see Jobs and results")
return [d["url"] for d in r.json()["data"]]
async def main():
print(await edit("openai/gpt-image-2.5", "low", 4))
asyncio.run(main())What this does not do
Sume does not pick the pass for you. model: "sume/auto" leaves the family to Sume, and the docs say Auto continues to use Flare, so choose Sunburst by id when you want it. Slow requests can come back as a 202 job instead of an image body; the pattern for that is in Jobs and results.
Sources
Related posts
More in Developers
- format_not_forkable 409 in the Sume API: what it means and the fix
Sume returns 409 format_not_forkable when the id you called names a built-in capability, not a Format card. How to tell, and which ids to call instead.
- Format webhook 3xx: Sume does not follow redirects, use the final URL
A webhook endpoint that redirects counts as a failed delivery attempt. Register the final HTTPS URL, mind www and trailing-slash redirects, then redeliver.
- Python verifier for Sume webhooks: stale timestamps, empty secret
A short Python function that verifies a Sume webhook: five-minute timestamp window, constant-time HMAC compare and a hard refusal of an empty secret.
- Forward verified Sume webhooks to Kafka, keyed by job_id
Verify the sume-v1 signature, refuse an empty secret, then produce each job event to Kafka with job_id as the key so retries land in one partition.
Written by Sume