Luma failure_reason moderation messages vs Sume generation_rejected
Luma reports moderation and dispatch failures as strings in failure_reason. Sume returns a job error category and next action. A map for handling both.

After a Luma Dream Machine job is accepted, a failure shows up as text in the failure_reason field: moderation messages, prompt processing errors, and job execution errors. Sume does not hand you free text to parse. A failed job carries a public error with a category, a stage, retryability, retry-after seconds, a public reason and a next action.
What Luma tells you
Luma lists three moderation strings: Contains blacklisted words, Frame moderation failed and Advanced prompt moderation failed. Two processing strings follow: Prompt processing failed and Failed to read user input frames. The job execution group has Error dispatching job, Job failed (GPU processing failed, contact support) and Error processing callback (contact support).
| Luma group | Strings | Closest Sume category |
|---|---|---|
| Moderation | Blacklisted words; frame moderation; advanced prompt moderation | generation_rejected: inspect events and fix unsupported input |
| Input access | Failed to read user input frames | Input media errors: input_media_unreachable, image_not_fetchable |
| Dispatch | Error dispatching job | queue or generation_unavailable: retry later |
| GPU failure | Job failed | internal or runtime_unavailable: inspect events |
| Callback | Error processing callback | Webhook delivery status, separate from the job |
What Sume tells you
Sume's categories and next actions: validation (fix input), auth (check key and workspace), quota (add funds or lower request cost), queue (retry later with the same idempotency key), generation_unavailable (retry later), generation_rejected (inspect events and fix unsupported input), generation_timeout and worker_timeout (poll status or retry later), runtime_unavailable (retry later, not aggressively) and internal (inspect events and contact support with the request or job id).
Delivery is not the job
The table's last row matters. A Luma callback failure is reported as a job failure string, while Sume keeps webhook delivery state separate from job state: a job can be completed while its delivery is failed or exhausted. Check the job before you assume the work was lost.
Handling both
Four habits cover both vendors.
- Branch on a category or a code, never on a message string.
- Do not show raw provider text to your end users.
- For a rejection, change the prompt or input before any retry.
- Keep the request id in your logs for support.
Sources
Related posts
More in Developers
- Luma Modify Video: adhere, flex and reimagine modes vs a Sume prompt
Luma's Modify Video has nine modes: adhere 1-3, flex 1-3 and reimagine 1-3. Sume's video edit has no mode field, so strictness comes from the prompt.
- MAI-Image-2.6 allows 6 requests a minute at tier 1; Sume queues
Foundry rates MAI-Image-2.6 at 6 RPM on tier 1 and 429s past it. Sume accepts valid image jobs as queued until a plan slot opens. Compare the two behaviours.
- MAI-Image-2.6 returns base64 PNG; Sume returns a hosted image URL
Foundry returns MAI-Image-2.6 as b64_json PNG only. Sume returns a signed media URL in data[].url, in png, jpeg or webp per model. How to handle each in code.
- Make an AI avatar video from the terminal with the Sume CLI
sume avatars create and sume avatar-videos create submit Avatar 1.0 jobs from a shell. Flags, the --confirm-paid guard, and how to recover the job.
Written by Sume