Draft with Qwen Image, finish with ChatGPT Image 2.5: 50 heroes cost

Four Qwen Image drafts at $0.025 then one ChatGPT Image 2.5 finish per hero costs $8.29375 for 50 heroes, against $13.175 for four GPT attempts each.

5 min readSume
All posts

A two-model pipeline is cheaper than rerolling the expensive one: generate four Qwen Image drafts per hero at $0.025 each, pick one, and send it as a reference to ChatGPT Image 2.5 for the finish. For 50 hero images that is $8.29375 against $13.175 if you take four GPT attempts per hero.

The saving comes from the draft stage, where you buy composition choices at a quarter of the price. It only holds if the finishing model keeps the draft's layout, which you should test on five heroes before running 50.

The cost model

Both prices are the billed rates from the Sume catalog (read 2026-10-03); the ChatGPT Image 2.5 rate is the high-quality 1024 figure, and a larger size or xhigh quality raises it.

Cost of 50 hero images, three plans (read 2026-10-03)
PlanCallsImages billedTotal
Qwen drafts (n=4) then one GPT 2.5 finish50 + 50200 Qwen + 50 GPT$8.29375
GPT 2.5 only, four attempts per hero50 x 4200 GPT$13.175
GPT 2.5 only, one attempt per hero5050 GPT$3.29375

Why the third row is not the answer

One attempt per hero is the cheapest line, but it leaves you with whatever the first sample was. The draft stage is a cheap selection step: four compositions, one chosen by a human or a scoring rule, then a paid finish on the winner. The finish call uses the draft as an input_references item, so the composition carries over while the finishing model redraws detail.

ChatGPT Image 2.5 accepts up to 16 references and Qwen Image 10, so you can also pass a style guide next to the draft.

The two calls

Both calls use POST /v1/images. The helper raises on a 202 so a slow generation is not mistaken for an image; switch to mode: "async" and the job endpoints for 4K or high-quality finishes.

import os
import requests

URL = "https://api.sume.com/v1/images"
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}


def gen(payload):
    r = requests.post(URL, headers=H, json=payload, timeout=60)
    r.raise_for_status()
    if r.status_code != 200:
        raise RuntimeError("202: poll the job instead")
    return r.json()["data"]


def hero(prompt):
    drafts = gen({"model": "qwen/qwen-image", "prompt": prompt, "n": 4})
    pick = drafts[0]["url"]  # replace with your own choice
    ref = {"type": "image_url", "image_url": {"url": pick}}
    return gen({
        "model": "openai/gpt-image-2.5",
        "prompt": "Finish image 1 as a polished hero: " + prompt,
        "input_references": [ref],
    })[0]["url"]


if __name__ == "__main__":
    print(hero("a ceramic mug on a walnut desk, soft window light"))

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume