Price a 20-prompt video regression suite: 360p, 3 seconds on Sume
A 20-prompt golden set rendered at 360p and 3 seconds on Gemini Omni costs $2.40 per run on Sume. The arithmetic, a Python cost check and the request body.

Twenty golden prompts at 3 seconds and 360p on gemini-omni-flash-1.1 cost $0.12 each on Sume, so a full run is 20 x 0.12 = $2.40. That is cheap enough to run on every prompt-template change, which is the point of having a regression suite at all.
OpenAI removed the Sora video models on 2026-09-24 per its deprecations page. After a change like that, the only defense against the next one is a set of prompts you can rerun against whatever model you adopt, with a known price per pass.
The arithmetic
The repo docs list Omni at $0.03 a second at 360p before margin. Sume bills list times 1.25, so 3 seconds is 3 x 0.03 x 1.25 = $0.1125. Each job is rounded up to the cent, so one prompt bills $0.12. The rounding happens per job, which means 20 jobs cost 20 x 0.12 = $2.40, not 20 x 0.1125 = $2.25.
At 720p the same three seconds is 3 x 0.10 x 1.25 = $0.375, billed $0.38, and 20 prompts cost $7.60. So 360p is the right tier for catching a broken prompt and 720p is for the final look.
| Resolution | Per second | One 3 s job | 20 jobs |
|---|---|---|---|
| 360p | $0.0375 | $0.1125, billed $0.12 | $2.40 |
| 720p | $0.125 | $0.375, billed $0.38 | $7.60 |
| 1080p | $0.1875 | $0.5625, billed $0.57 | $11.40 |
The cost check
The script keeps a three-row suite inline so it runs as written; load your own from a JSONL file with one object per line. It prints the cost of a run at both tiers and the exact request body for the first prompt. Compare the printed total to what the dashboard reports after a real run, and investigate if they differ.
import json, math
RATE = {"360p": 0.0375, "720p": 0.125} # Omni per second: list x 1.25
SUITE = """\
{"id": "mug", "prompt": "Steam rising from a ceramic mug, slow dolly-in"}
{"id": "rain", "prompt": "Rain on a window, city lights blurred behind"}
{"id": "shoe", "prompt": "A white sneaker turning on a pedestal, soft light"}
"""
def job_cost(seconds, res):
return math.ceil(round(seconds * RATE[res], 6) * 100) / 100
def body(row, res="360p", seconds=3):
return {"model": "gemini-omni-flash-1.1", "prompt": row["prompt"],
"duration": seconds, "resolution": res, "aspect_ratio": "16:9"}
rows = [json.loads(line) for line in SUITE.splitlines()]
for res in ("360p", "720p"):
total = sum(job_cost(3, res) for _ in rows)
print(f"{len(rows)} prompts, 3 s at {res}: ${total:.2f}")
print(json.dumps(body(rows[0])))
What makes the suite useful
Keep prompts that failed in the past. A clip that once rendered the wrong object, or produced a face you disliked, belongs in the set permanently. Add one prompt per feature you depend on, such as a reference tag, a vertical aspect or a first frame.
Render the suite after every change to a prompt template, and keep the outputs in a folder named for the run. Looking at twenty three-second clips takes a few minutes and catches regressions that no assertion can.
- Do not compare clips for equality; Sume's /v1/videos rejects seed, so renders vary.
- Use the same idempotency key prefix per run label, so a rerun of a label never double-bills.
- Pin the model id in the suite file and change it deliberately.
When the price changes
The rates in the script are the repo-documented list prices times 1.25 as read on 2026-10-05. If the pricing docs change, update the two numbers and the totals follow. The arithmetic stays the same: seconds times rate, rounded up to the cent per job, then multiplied by the number of prompts.
A suite is also a cheap way to see whether a different model is worth switching to. Render the same twenty prompts on two ids at their lowest shared resolution and compare the costs and the clips side by side.
Sources
Related posts
More in Pricing
- Price before you pay: four places Sume shows a cost before a job runs
Video models list pricing_skus, Timeline plan returns an estimate, video-filter check is free, and the usage ledger shows the reserve. Where to look and when.
- Sume queue_full: is money held for the job that was rejected?
A 429 queue_full means the workspace has no accepted-job capacity left. Sume releases or refunds the reservation for the failed admission. How to confirm it.
- Quiz audio: 100 questions at 140 characters, one job, sliced per line
A hundred 140-character quiz questions are 14,000 characters: $0.21 on MAI Flash, $0.31 on MAI-Voice-2.1 and $0.67 on Sume, which can slice one job by sentence.
- Quote a 30-second AI video clip: Seedance 2.5 per clip and per minute
How to quote a 30-second Seedance 2.5 clip on Sume: price at 480p, 720p and 1080p, a per-minute equivalent, a retake allowance and the rounding rule.
Written by Sume