Season 2 of a Shorts series: same Sume Format, new input, new keys
Start season 2 without rebuilding anything. Keep the Format, change the input and idempotency keys, and keep season 1 receipts as a style reference.

Reuse the same Format for season 2 and change only what the episodes say: the input object, the idempotency keys and, if you want, a revised cap. The Format holds how the work is done; each run carries what is different. That split is why a season is cheap to restart.
YouTube Shorts series now have seasons and episodes as first-class objects, rolling out since 2026-09-23 per a platform roundup (Orthotropy, read 2026-10-06). Your generation side should mirror that: one Format per series, one batch per season.
What stays and what changes
Stays: the Format handle and slug, the output schema, your key and scopes. Changes: the season number, the episode briefs and the keys. Put the season in the key so season 2 episode 1 can never collide with season 1 episode 1. A key like harbor-s2-e1-v1 is unambiguous, and a replay under it returns the original receipt with idempotency_hit true.
Pass episode data in input, an object with up to 64 top-level keys and 2 MiB. Sume writes it to a file the agent reads as data, so a brief that contains instruction-like text will not be obeyed as a command (Sume docs: Call a Format, read 2026-10-06).
Carrying the look forward
Season 2 should look like season 1. There are two honest options. First, put the style rules in the Format so every run inherits them. Second, continue a specific finished run with previous_run_id so the new run starts from that run's workspace. Use the second for a direct sequel to one episode, the first for the whole season. Continuing a run does not inherit the output schema, so send it again on each turn (Sume docs: Format runs, read 2026-10-06).
import os, requests
BASE = "https://api.sume.com/v1/formats/sume/sume-slideshow/runs"
H = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"]}
briefs = [
"The keeper's daughter returns with a map",
"The second door opens onto the harbor",
]
for n, brief in enumerate(briefs, start=1):
r = requests.post(BASE, json={
"input": {"season": 2, "episode": n, "brief": brief},
"instruction": "Make season 2 episode %d from input." % n,
"generation_spend_cap_usd": 12,
}, headers={**H, "Idempotency-Key": "harbor-s2-e%d-v1" % n}, timeout=30)
print(n, r.status_code, r.json()["data"]["id"])| Setting | Season 1 | Season 2 |
|---|---|---|
| Format | One handle and slug | Same handle and slug |
| Idempotency key | harbor-s1-e1-v1 | harbor-s2-e1-v1 |
| Input | Season 1 briefs | Season 2 briefs, season field |
| Spend cap | Per-run cap | Per-run cap, revisit after season 1 usage |
Use season 1 usage to set the cap
Each terminal receipt carries usage. Read what season 1 episodes actually consumed and set the season 2 per-run cap just above the worst real episode, not at a round guess. A cap too low fails a run partway; a cap left at the platform default of $400 protects little.
Mistakes that cost money in season 2
The most common mistake is copying season 1's script with the keys unchanged. Every request then replays the season 1 receipt with idempotency_hit true. You pay nothing, which feels like savings, and you also get no new episodes. Always put the season number in the key.
The second is changing the brief but reusing the key with a different body. Sume returns 409 idempotency_conflict, which is the correct behavior: the key promised the same request. Treat a conflict as a prompt to bump the version.
The third is forgetting the cap. generation_spend_cap_usd up to 500 is accepted per run, and leaving it out means the Format's own cap applies. A Format that never named a cap reports the platform default of $400, a ceiling you would rarely choose on purpose for one episode, so state a number on every call.
When to change the Format itself
Change the Format, not the input, when the way of working changes: a new aspect ratio, a different voice, a new opening card. Changes to the Format affect every later run, so make them between seasons, never in the middle of one, and note the date so receipts from before and after can be told apart.
Sources
Related posts
More in Formats
- Shorts series bulk queue finishes out of order: publish by number
Episodes in a Sume bulk queue run in parallel and finish in any order. Sort by an episode number in your output schema, not by completion time.
- Shorts series: episode video and thumbnail from one Format run
YouTube Shorts series take a custom thumbnail per episode. Bind one output schema so each Sume Format run returns the video and the thumbnail together.
- Sume Format run expires_at: 90 minutes, and how to set your timeout
A non-terminal Sume Format run carries an expires_at, 90 minutes from creation. Use it as your client timeout instead of inventing a number.
- Sume output schema limits: depth 10, 5,000 properties, 120,000 chars
How big can a Sume output_schema be? Depth 10, 5,000 properties and 120,000 characters, and a refusal before any spend. What to flatten and where it fails.
Written by Sume