GPT Image 2.5 Sunburst: a five-turn product photo edit loop

OpenAI positions Sunburst for tighter control over repeated edits. A five-turn loop on Sume: one source photo, one change per call, a preserve list each time.

5 min readSume
All posts

OpenAI's launch report describes Sunburst as built for workflows where editing precision matters most, such as production campaigns and polished product imagery. On Sume you call it as openai/gpt-image-2.5-sunburst. The loop that works is simple: one change per call, feed each output back in as the only reference, and repeat the preserve list every turn.

Why a loop and not one giant prompt

A product photo often needs several adjustments: background, shadow, a colour variant, a label fix, a crop. Asking for all of them at once gives the model room to change things you did not mention. One change per call keeps each step checkable, and you can stop at the last good frame.

The five turns

Each turn sends the previous output URL as input_references. Sume mirrors results to its own storage, so data[0].url is a public HTTPS URL you can pass straight into the next request.

Five-turn edit plan for one product photo (model facts from the launch report and Sume docs) (read 2026-10-07)
TurnSingle changePreserve list
1Replace the background with a soft grey sweepProduct shape, label, colour, camera angle
2Add a soft contact shadowBackground, product, label
3Recolour the cap to matte blackShadow, background, label text
4Fix the label wording to the exact string you supplyEverything else
5Extend the canvas to 4:5 for a feed postProduct position and lighting

A runnable loop in Python

This script runs the first three turns of the plan; turns 4 and 5 use the same pattern, and for turn 5 set aspect_ratio to 4:5 instead of auto. It handles the documented 200 image response and raises on a 202, where you would instead poll the job. Set SUME_API_KEY and a public source URL first.

import os
import requests

URL = "https://api.sume.com/v1/images"
HEAD = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"]}
KEEP = "Keep the product shape, label text and lighting unchanged. "
STEPS = [
    "Replace the background with a soft grey sweep.",
    "Add a soft contact shadow under the product.",
    "Recolour only the cap to matte black.",
]

ref = os.environ["SOURCE_URL"]
for step in STEPS:
    body = {
        "model": "openai/gpt-image-2.5-sunburst",
        "prompt": KEEP + step,
        "quality": "high",
        "aspect_ratio": "auto",
        "input_references": [{"type": "image_url", "image_url": {"url": ref}}],
    }
    r = requests.post(URL, headers=HEAD, json=body, timeout=60)
    if r.status_code != 200:
        raise SystemExit("status %s: %s" % (r.status_code, r.text[:200]))
    ref = r.json()["data"][0]["url"]
    print(step, ref)

What to check

Compare each output against the previous one before moving on; the model description is a vendor claim, and drift can still happen. If a turn returns 202, follow the job envelope and read the images from the job result. Flare and Sunburst share the same price and limits on Sume per the docs, so Sunburst is a quality choice, not a cost one.

Stop conditions

Stop the loop when any of these happens:

  • The label text changes in any way.
  • The product outline moves relative to the previous frame.
  • Two turns in a row change something you did not ask for.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume