sume/auto on a retried submit: same job, model still sume/auto
A retry of a sume/auto video with the same Idempotency-Key returns the original job, price and route. A Python check, plus why the family is never disclosed.

When you submit model: "sume/auto" twice with the same Idempotency-Key, Sume returns the original job both times. The docs say resolution is a pure function of the normalized request and the catalog version, so an idempotent replay gets the same price and the same route. The poll response reports "model": "sume/auto", and Sume does not disclose which family served the request.
What the docs state
The video docs list sume/auto as an addition that only Sume has. OpenRouter has no generate-time auto routing. The table collects the claims.
| Question | Answer from the docs |
|---|---|
| Does a replay with the same key create a second job? | No. A replay returns the original job |
| Does the replay get a different price or route? | No. Resolution depends only on the normalized request and the catalog version |
| What does the poll response show as the model? | sume/auto |
| Can I learn which family ran? | No. Sume never discloses it; do not infer it from output traits |
| Where do I pin a family? | Send a concrete model id from GET /v1/videos/models |
Check it
The script sends the same request twice under one key and compares the ids. Expect True sume/auto sume/auto. Run it with a key set, and note that the first call is a paid submit while the second should not bill again.
import asyncio
import json
import os
import urllib.request
def submit(key: str) -> dict:
body = {"model": "sume/auto", "prompt": "Vertical product clip on a desk",
"aspect_ratio": "9:16", "duration": 5}
req = urllib.request.Request(
"https://api.sume.com/v1/videos",
data=json.dumps(body).encode(),
headers={"Authorization": f"Bearer {os.environ.get('SUME_API_KEY', '')}",
"Content-Type": "application/json", "Idempotency-Key": key},
)
with urllib.request.urlopen(req, timeout=30) as resp:
return json.load(resp)
async def main() -> None:
first = await asyncio.to_thread(submit, "auto-demo-001")
again = await asyncio.to_thread(submit, "auto-demo-001")
print(first["id"] == again["id"], first["model"], again["model"])
asyncio.run(main())When to pin instead
Use sume/auto when you do not care which family renders the clip. Pin an id when you A/B test models, when you need a duration outside the intersection of what the families accept, or when you want a fixed per-second price in your estimate. With sume/auto, the catalog version is part of the route, so the same request submitted under a new key after a catalog change is not guaranteed to resolve the same way.
A changed payload under the same key is a conflict: 409 idempotency_conflict. Use a key again only for an exact retry.
Operational notes
Because the catalog version is part of resolution, log it alongside your request when you can, so a change in routing is traceable. If a result looks different from yesterday's, check whether the catalog changed before blaming the request.
The price is the same on replay, but a new key is a new job and a new charge. Generate keys per logical request and persist them before the first send.
Sources
Related posts
More in Developers
- sume/auto and aspect_ratio 8:1: name Nano Banana 2.1 instead
sume/auto does not tell you which family ran, and the repo gives it the GPT Image ratio list, which has no 4:1 or 8:1. Name google/nano-banana-2.1 for strips.
- sume/auto video: default 8 s at 720p, and a 2 to 4,286 cent range
Video Router Auto defaults to 720p and 8 seconds, with 3 to 10 second clips at 16:9 or 9:16. The catalog reports a 50 cent estimate and a 2 to 4,286 cent range.
- Sume error retry matrix: retry with the same key, or fix the request
Which Sume API errors to retry with the same Idempotency-Key, which to fix first, and which to leave alone. A table and a small Python function that decides.
- Sume job next_action: poll_status, fetch_result, inspect_events
The Sume status payload tells your client what to do next. Three next_action values map to five job states; here is the full table and a TypeScript switch.
Written by Sume