GPT Image user error: don't retry unchanged; Sume failures unbilled
OpenAI says not to auto-retry image_generation_user_error without changing the prompt or inputs. On Sume, retry 429 with backoff; failed images are not billed.

Do not retry an image_generation_user_error unchanged: OpenAI says to modify the prompt or input images first, and to branch on error.code. On Sume, the documented back-off case is 429; a failed or cancelled image generation is not billed, so a retry costs nothing extra for the failed attempt.
OpenAI's rule is from its image generation guide; Sume's from Image generation and Authentication, read 2026-10-01.
What does OpenAI say to do with user errors?
The guide says to retry transient rate-limit and server failures with backoff, and not to automatically retry quota errors or image generation user errors that require changing the request. User-correctable failures may return error.type = "image_generation_user_error"; for programmatic handling, error.code is the stable discriminator. One documented code is moderation_blocked, which can carry moderation_details with a stage of input or output.
Which Sume failures are worth retrying?
Sume's authentication page lists 429 as a rate-limit error to back off and retry after retry-after. Prompt refusals are a different class: the job code carries a typed content_policy_rejected reason, and resending the same prompt is not expected to change it. Edit the prompt or references, then submit again.
| Failure | Retry unchanged? | Source |
|---|---|---|
429 rate limit | Yes, after retry-after | Sume authentication |
content_policy_rejected | No, change the prompt or inputs | Sume job reason; OpenAI says the same for user errors |
image_generation_user_error | No, change the request first | OpenAI guide |
Does a failed Sume image cost anything?
The docs call image billing all-or-nothing: completed generations are billed in full, and failed or cancelled ones are not billed. They also say a client that disconnects early is billed as a failed generation, meaning not at all. If you submit retries after a timeout, send an Idempotency-Key on submit requests when retrying, as Jobs and results advises. For batches, see retrying failed items.
What should my retry loop look like?
Branch on the error class first. Back off on 429, stop and surface the message on a policy rejection, and only resubmit after your code or a person has changed the prompt or references. Cap attempts so a loop cannot repeat the same refused request.
Sources
Related posts
More in Developers
- gpt-transcribe expected languages vs Sume STT language_code
OpenAI's gpt-transcribe accepts multiple expected input languages. Sume STT takes one optional language_code hint or auto-detect. What to send for mixed audio.
- Grok Imagine base64 response_format vs a Sume hosted URL
xAI lets you request base64 instead of a temporary URL. Sume returns Sume-hosted, signed URLs in data[].url, not inline base64, for x-ai/grok-image.
- HeyGen 429 Retry-After vs Sume rate_limited and queue_full
HeyGen sends 429 with a Retry-After header in seconds. Sume sends 429 rate_limited with retry-after when present, and a separate 429 queue_full.
- HeyGen asset upload max size: 32 MB, and what Sume does instead
HeyGen's POST /v3/assets caps files at 32 MB, URLs included. Sume has no asset step: requests take public HTTPS URLs, and oversized bodies return 413.
Written by Sume