live
MODEL IDopenai:gpt-image@2.6-sunburst

GPT-Image-2.6 Sunburst

OpenAI
by

GPT-Image-2.6 Sunburst is OpenAI's image model for detailed compositions and editing work that needs precise control. Besides raster images, it generates SVG graphics and animated GIFs from text, and it edits images from marks drawn over them, like a circle around the object to change. A thinking level sets how much it plans before rendering, separate from rendering quality.

GPT-Image-2.6 Sunburst

Detailed editing

How to choose GPT-Image-2.6 Sunburst over Flare for dense, exact text and precise edits: a side-by-side comparison, a chain of focused edits and a markup edit.

Introduction

GPT-Image-2.6 ships as two models that take the same request and bill at the same token rates. OpenAI positions Flare for fast generation and editing in interactive workflows, and Sunburst for detailed compositions and edits that need precise control. A request written for one runs on the other once model changes, so the choice between them comes down to what comes back.

The cover below went through three rounds on Sunburst, each one taking the previous result as its source: a new headline, a new background behind the runner, then one new cover line. Each round changes one thing and names everything else as something to keep.

Step through the rounds, then go back to Original. The type no instruction touched comes through all three: the masthead, the date, the price and the two remaining cover lines read the same at the last step as in the source, and the runner keeps her face and her jacket while the backdrop behind her changes.

This guide covers the request, running a chain of focused edits, the two models side by side on a dense text layout, pointing an edit at one line with a markup image, and choosing between the two.

The request

Sunburst takes the same parameters as Flare. Each round of the chain above is an ordinary edit: the image to change in inputs.referenceImages, the instruction in positivePrompt, and the source's own width and height so the result lines up with it. This is the first round:

Try in Playground
import { createClient } from '@runware/sdk'

const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()

const [result] = await client.run({
  model: 'openai:gpt-image@2.6-sunburst',
  positivePrompt: 'Change only the main headline from "RUN THE RIDGE" to "OWN THE TRAIL", in the same bold white capitals, at the same size and in the same position. Keep the masthead, the date, the price, the three cover lines, the barcode, the runner, her face, her jacket, the orange backdrop, the framing and the lighting exactly as they are.',
  inputs: {
    referenceImages: [
      'https://assets.runware.ai/guides/openai-gpt-image-2-6-sunburst/detailed-editing/source-cover.jpg'
    ]
  },
  settings: {
    quality: 'high',
    thinkingLevel: 'low'
  },
  width: 1536,
  height: 2048
})
import asyncio
import os

from runware import Runware


async def main():
    async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
        results = await client.run({
            "model": "openai:gpt-image@2.6-sunburst",
            "positivePrompt": "Change only the main headline from \"RUN THE RIDGE\" to \"OWN THE TRAIL\", in the same bold white capitals, at the same size and in the same position. Keep the masthead, the date, the price, the three cover lines, the barcode, the runner, her face, her jacket, the orange backdrop, the framing and the lighting exactly as they are.",
            "inputs": {
                "referenceImages": [
                    "https://assets.runware.ai/guides/openai-gpt-image-2-6-sunburst/detailed-editing/source-cover.jpg"
                ]
            },
            "settings": {
                "quality": "high",
                "thinkingLevel": "low"
            },
            "width": 1536,
            "height": 2048
        })


asyncio.run(main())
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "imageInference",
      "taskUUID": "5c2e9a71-4b38-4d0f-a6e2-8f13b7c94d20",
      "model": "openai:gpt-image@2.6-sunburst",
      "positivePrompt": "Change only the main headline from \"RUN THE RIDGE\" to \"OWN THE TRAIL\", in the same bold white capitals, at the same size and in the same position. Keep the masthead, the date, the price, the three cover lines, the barcode, the runner, her face, her jacket, the orange backdrop, the framing and the lighting exactly as they are.",
      "inputs": {
        "referenceImages": [
          "https://assets.runware.ai/guides/openai-gpt-image-2-6-sunburst/detailed-editing/source-cover.jpg"
        ]
      },
      "settings": {
        "quality": "high",
        "thinkingLevel": "low"
      },
      "width": 1536,
      "height": 2048
    }
  ]'
runware run openai:gpt-image@2.6-sunburst \
  positivePrompt="Change only the main headline from \"RUN THE RIDGE\" to \"OWN THE TRAIL\", in the same bold white capitals, at the same size and in the same position. Keep the masthead, the date, the price, the three cover lines, the barcode, the runner, her face, her jacket, the orange backdrop, the framing and the lighting exactly as they are." \
  inputs.referenceImages.0=https://assets.runware.ai/guides/openai-gpt-image-2-6-sunburst/detailed-editing/source-cover.jpg \
  settings.quality=high \
  settings.thinkingLevel=low \
  width=1536 \
  height=2048
{
  "taskType": "imageInference",
  "taskUUID": "5c2e9a71-4b38-4d0f-a6e2-8f13b7c94d20",
  "model": "openai:gpt-image@2.6-sunburst",
  "positivePrompt": "Change only the main headline from \"RUN THE RIDGE\" to \"OWN THE TRAIL\", in the same bold white capitals, at the same size and in the same position. Keep the masthead, the date, the price, the three cover lines, the barcode, the runner, her face, her jacket, the orange backdrop, the framing and the lighting exactly as they are.",
  "inputs": {
    "referenceImages": [
      "https://assets.runware.ai/guides/openai-gpt-image-2-6-sunburst/detailed-editing/source-cover.jpg"
    ]
  },
  "settings": {
    "quality": "high",
    "thinkingLevel": "low"
  },
  "width": 1536,
  "height": 2048
}
Response
[
  {
    "taskType": "imageInference",
    "taskUUID": "5c2e9a71-4b38-4d0f-a6e2-8f13b7c94d20",
    "imageUUID": "a83f0d6e-2c17-4b95-8e41-7d9b3c5f12a6",
    "imageURL": "https://im.runware.ai/image/os/a14d18/ws/2/ii/a83f0d6e-2c17-4b95-8e41-7d9b3c5f12a6.jpg"
  }
]

Running the same edit on Flare changes one field: model becomes openai:gpt-image@2.6-flare, and everything else goes out unchanged. Every parameter is documented on the model reference, and the techniques this guide relies on have their own Flare guides: prompting, editing images, markup editing and quality and thinking level. They apply to Sunburst as written. This guide covers when to send a request to Sunburst instead.

Chaining focused edits

A chain is a series of edits where each round's reference is the previous round's output. Round two of the cover sends the file round one returned, and round three the file from round two. The imageUUID from the previous response works in inputs.referenceImages as well, so a pipeline can pass it along instead of uploading the image again.

Every round renders the whole frame again, so anything a round changes by accident is carried into every round after it. On a cover, that means the type a round was not asked to touch: the masthead and the cover lines have to come back letter for letter, three times over. Four habits keep the chain clean:

  • One change per round. The headline, the background and the cover line went in as separate requests. When one round goes wrong you know which instruction caused it, and you rerun that round instead of the whole chain.
  • A keep list that grows. Each instruction ends by naming what stays, and the list picks up what earlier rounds added: rounds two and three both keep "OWN THE TRAIL" because round one wrote it. Editing images covers writing the instruction itself.
  • A low thinking level. The chain runs with settings.thinkingLevel set to low. OpenAI recommends a lower level for focused edits such as changing a background or a sign, and notes that a higher one can introduce unwanted changes in an edit. The default is high.
  • A check against the original. Compare the last round with Original as well as with the round before it. A small change repeated across rounds is easier to see end to end than one step at a time.

Dense, exact text

On packaging, one wrong character makes the asset unusable. A nutrition label that reads 18mg where the spec says 180mg cannot go on a product page, so every quoted string has to come back exactly as written. The prompt behind both renders below quotes the brand, the product name, all fourteen lines of a US Nutrition Facts label and the ingredients list. Both ran at 2304 × 1536 with settings.quality set to high, and only model differed.

Open both and read the side panel against the prompt, line by line. Both renders got every quoted string right: each label line has the value and the percentage the prompt gave it, and the ingredients list ends at "BAKING SODA." as written. The one difference is a line nobody asked for. Flare added "Amount per serving" above the calories, a standard line on a real label but not one the prompt quoted, while Sunburst printed only what was quoted.

A wrong digit in a nutrition label does not show at thumbnail size, so on this kind of layout checking every quoted string is the test that decides it. Run it on your own content before you settle on a model. One prompt on both models costs two renders.

Both renders ran at the default settings.thinkingLevel of high. OpenAI notes that a higher level helps with dense text and complex layouts, the opposite of its advice for focused edits, so a pipeline that generates a layout and then edits it can switch levels between the two calls. The same holds for any image where the text is the content, such as a menu with prices or a spec sheet.

Marking the edit

A schedule is a hard target for a written instruction. The poster below has eight rows with the same structure, and an instruction that says "the third talk" leaves the model to decide whether the keynote counts. inputs.markupImage points at the row instead of describing it: a transparent PNG at the source's exact size, with a red circle drawn where the change goes.

The conference poster with a red ellipse drawn around the 11:30 AM schedule row, Pricing Pages That Convert · Priya Natarajan
Source with markupEdited
Built from 2 references
  • Source
  • Markup image
Try in Playground
import { createClient } from '@runware/sdk'

const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()

const [result] = await client.run({
  model: 'openai:gpt-image@2.6-sunburst',
  positivePrompt: 'In the schedule row inside the red circle, change the session to "Onboarding That Sticks" and the speaker to "Jordan Whitaker", keeping the time "11:30 AM" and the same type, size and colors. Remove the red circle. Keep every other row, the title, the date line, the gray rules, the coral bar and the footer exactly as they are.',
  inputs: {
    referenceImages: [
      'https://assets.runware.ai/guides/openai-gpt-image-2-6-sunburst/detailed-editing/source-poster.jpg'
    ],
    markupImage: 'https://assets.runware.ai/guides/openai-gpt-image-2-6-sunburst/detailed-editing/markup-poster.png'
  },
  settings: {
    quality: 'high',
    thinkingLevel: 'low'
  },
  width: 1536,
  height: 2304
})
import asyncio
import os

from runware import Runware


async def main():
    async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
        results = await client.run({
            "model": "openai:gpt-image@2.6-sunburst",
            "positivePrompt": "In the schedule row inside the red circle, change the session to \"Onboarding That Sticks\" and the speaker to \"Jordan Whitaker\", keeping the time \"11:30 AM\" and the same type, size and colors. Remove the red circle. Keep every other row, the title, the date line, the gray rules, the coral bar and the footer exactly as they are.",
            "inputs": {
                "referenceImages": [
                    "https://assets.runware.ai/guides/openai-gpt-image-2-6-sunburst/detailed-editing/source-poster.jpg"
                ],
                "markupImage": "https://assets.runware.ai/guides/openai-gpt-image-2-6-sunburst/detailed-editing/markup-poster.png"
            },
            "settings": {
                "quality": "high",
                "thinkingLevel": "low"
            },
            "width": 1536,
            "height": 2304
        })


asyncio.run(main())
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "imageInference",
      "taskUUID": "e4a17c29-8b53-4f06-9d2e-3c58a1f70b94",
      "model": "openai:gpt-image@2.6-sunburst",
      "positivePrompt": "In the schedule row inside the red circle, change the session to \"Onboarding That Sticks\" and the speaker to \"Jordan Whitaker\", keeping the time \"11:30 AM\" and the same type, size and colors. Remove the red circle. Keep every other row, the title, the date line, the gray rules, the coral bar and the footer exactly as they are.",
      "inputs": {
        "referenceImages": [
          "https://assets.runware.ai/guides/openai-gpt-image-2-6-sunburst/detailed-editing/source-poster.jpg"
        ],
        "markupImage": "https://assets.runware.ai/guides/openai-gpt-image-2-6-sunburst/detailed-editing/markup-poster.png"
      },
      "settings": {
        "quality": "high",
        "thinkingLevel": "low"
      },
      "width": 1536,
      "height": 2304
    }
  ]'
runware run openai:gpt-image@2.6-sunburst \
  positivePrompt="In the schedule row inside the red circle, change the session to \"Onboarding That Sticks\" and the speaker to \"Jordan Whitaker\", keeping the time \"11:30 AM\" and the same type, size and colors. Remove the red circle. Keep every other row, the title, the date line, the gray rules, the coral bar and the footer exactly as they are." \
  inputs.referenceImages.0=https://assets.runware.ai/guides/openai-gpt-image-2-6-sunburst/detailed-editing/source-poster.jpg \
  inputs.markupImage=https://assets.runware.ai/guides/openai-gpt-image-2-6-sunburst/detailed-editing/markup-poster.png \
  settings.quality=high \
  settings.thinkingLevel=low \
  width=1536 \
  height=2304
{
  "taskType": "imageInference",
  "taskUUID": "e4a17c29-8b53-4f06-9d2e-3c58a1f70b94",
  "model": "openai:gpt-image@2.6-sunburst",
  "positivePrompt": "In the schedule row inside the red circle, change the session to \"Onboarding That Sticks\" and the speaker to \"Jordan Whitaker\", keeping the time \"11:30 AM\" and the same type, size and colors. Remove the red circle. Keep every other row, the title, the date line, the gray rules, the coral bar and the footer exactly as they are.",
  "inputs": {
    "referenceImages": [
      "https://assets.runware.ai/guides/openai-gpt-image-2-6-sunburst/detailed-editing/source-poster.jpg"
    ],
    "markupImage": "https://assets.runware.ai/guides/openai-gpt-image-2-6-sunburst/detailed-editing/markup-poster.png"
  },
  "settings": {
    "quality": "high",
    "thinkingLevel": "low"
  },
  "width": 1536,
  "height": 2304
}
Response
[
  {
    "taskType": "imageInference",
    "taskUUID": "e4a17c29-8b53-4f06-9d2e-3c58a1f70b94",
    "imageUUID": "3b9e71c4-d052-4a8f-b6e3-91f4c0a7d258",
    "imageURL": "https://im.runware.ai/image/os/a14d18/ws/2/ii/3b9e71c4-d052-4a8f-b6e3-91f4c0a7d258.jpg"
  }
]

The slider shows the circle drawn onto the poster so you can see where it falls. The request sends them as two files: the clean poster in inputs.referenceImages and the circle alone in inputs.markupImage. The instruction names the new strings and asks for the circle to be removed, the way OpenAI's own markup example does. Drag the handle across the schedule: the circled row reads "Onboarding That Sticks · Jordan Whitaker" at 11:30 AM, and the other seven rows match the source line for line.

The markup image must have the same width and height as the first reference image and contain transparent pixels. A fully opaque PNG or one at another size is rejected. A markup image cannot be combined with inputs.maskImage, and with one in the request the first reference can have at most 16,777,216 pixels.

Markup editing covers drawing the marks and writing the instruction around them.

Choosing between them

The request and the rates are shared, so the choice can change from one call to the next without touching anything but model.

Reach for Flare when the loop matters more than any one frame: exploration, drafts, anything a user is waiting on in an interactive tool, and simple edits where one clearly named thing changes on an uncluttered frame. OpenAI positions it for interactive iteration.

Reach for Sunburst when the frame matters more than the loop. That covers layouts full of exact text, such as packaging or a schedule, and edits on a busy frame where everything outside the change has to come back as it was. It also covers the final render of anything going onto a product page or into print.

The shared request makes a third option cheap: both, at different stages. Explore on Flare, then run the settled prompt or instruction once on Sunburst for the asset that ships.

Sunburst is not a quality level. settings.quality and settings.thinkingLevel work the same way on both models and default to the same values, so choosing Sunburst raises neither one. Set them per request.

Tips

  1. Swap the model string, keep everything else. A request written for Flare runs on Sunburst unchanged, so an A/B on your own content costs two renders.

  2. Check every quoted string. On packaging and schedules the failure that matters is one wrong digit, and it does not show at thumbnail size.

  3. Make one change per round. A chain of single changes tells you which round went wrong and lets you rerun only that one.

  4. Use a low thinking level for focused edits. OpenAI recommends it for a new background or a new sign, and a higher one for dense text and complex layouts.

  5. Mark the target when it repeats. When the change goes to one of several similar rows or items, a circle in inputs.markupImage replaces a description that can be miscounted. Ask for the circle to be removed.

  6. Explore on Flare, ship on Sunburst. Iteration is where the call volume is, and the final render is the one that has to read correctly.