Same prompt on five Sume image models in one script: about 18 cents
One loop sends a text-in-image prompt to Flux 2 Pro, Seedream 5.0 Lite, Qwen Image, Imagen 4 Fast and Recraft V4. Expected total $0.18125. Code you can run.

To compare image models on one prompt, loop over their ids with the same body and add up usage.cost. On Sume, Flux 2 Pro, Seedream 5.0 Lite, Qwen Image, Imagen 4 Fast and Recraft V4 bill $0.0375, $0.04375, $0.025, $0.025 and $0.05, so one image from each costs $0.18125. All five list the 16:9 ratio, so one request body works for every row.
The prices are the billed endpoint figures on origin/main, read 2026-10-08. The sample prints each hosted URL so you can open the five pictures side by side.
What the five share
The request has model, prompt and aspect_ratio, which every row lists. It omits n, which defaults to one image, and it omits quality, resolution and output_format, because several of these rows do not list them and Sume returns 400 unsupported_parameter for a parameter the model does not list.
| Model id | Billed per image | Notes |
|---|---|---|
| black-forest-labs/flux.2-pro | $0.0375 | png, jpeg, webp; edits with references |
| bytedance-seed/seedream-5-lite | $0.04375 | png, jpeg, webp; edits with references |
| qwen/qwen-image | $0.025 | png, jpeg, webp; edits with references |
| google/imagen-4-fast | $0.025 | Text only |
| recraft/recraft-v4 | $0.05 | Text only; webp output |
The script
It needs SUME_API_KEY and requests. The timeout is longer than Sume's 30-second sync wait, so a slow row comes back as 202, which the script reports and skips; fetch it later with the job's result_url, as the jobs page describes.
import os, requests
models = [
"black-forest-labs/flux.2-pro",
"bytedance-seed/seedream-5-lite",
"qwen/qwen-image",
"google/imagen-4-fast",
"recraft/recraft-v4",
]
prompt = "A matte black coffee tin on a pale oak table, the label reads FIRST LIGHT"
headers = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
total = 0.0
for model in models:
body = {"model": model, "prompt": prompt, "aspect_ratio": "16:9"}
r = requests.post("https://api.sume.com/v1/images", json=body,
headers=headers, timeout=60)
if r.status_code == 202:
print(model, "still running as a job")
continue
r.raise_for_status()
out = r.json()
total += out["usage"]["cost"]
print(model, out["data"][0]["url"])
print(f"total ${total:.5f}")
Judging the output
Choose the prompt for your real use. The sample uses short label text because that is the part models most often get wrong. Score each of the five on the same checklist before you look at price: text spelled right, product shape right, no extra objects. Run each prompt a few times, since a single sample can mislead, and the cost of ten rounds across all five is $1.8125.
Store each run as a row with the model id, prompt, URL and cost, so a later run on a new catalog entry can be compared against the old ones. Hosted URLs are what the API returns, so save the files you want to keep to your own storage rather than relying on a link staying around.
Sources
Related posts
More in Developers
- Score your own audio: a word error rate script for Sume STT
Microsoft quotes 5.2% WER on FLEURS for MAI-Transcribe-2. Measure your audio: a short Python WER function, a reference file and a cent-a-minute Sume STT run.
- Seedance output pixel sizes: 480p, 720p and 1080p for every ratio
The frame size Seedance renders at 480p, 720p and 1080p for 21:9, 16:9, 4:3, 1:1, 3:4 and 9:16 on Sume, as used for pricing.
- Seedance reference inputs on Sume: images, video, audio per docs
Which reference types the Seedance ids accept on /v1/videos (images, video, audio, first and last frame), how references are priced, and a working request.
- 60 video jobs in Node with a promise pool: which plans need waves
A Node promise pool for Sume video jobs, plus the fit table: 60 jobs against accepted capacity on Free, Pro, Startup and Scale, and how many waves each needs.
Written by Sume