Sume job failed artifact_too_large: shrink the output

A finished file that storage refuses with HTTP 413 fails as artifact_too_large and is not retryable. Shorten the cut, lower the resolution or the bitrate.

4 min readSume
All posts

artifact_too_large means the file a job produced was bigger than Sume's artifact upload limit, so it could not be stored and the job failed without a result. It is not a timeout and not retryable: shorten the cut, lower the resolution or lower the bitrate before you submit again.

The public message says it plainly: the generated file was larger than the artifact upload limit, and re-running the request unchanged will fail the same way. next_action is fix_input.

How the status maps

The remap reads details.artifact_upload_status, the HTTP status the storage side returned for the upload, and treats only deterministic client statuses as a rejection.

For the other 4xx case the message reads "Artifact storage rejected the generated file, so it could not be stored." and ends with the same warning that an unchanged rerun fails the same way. The category is generation_rejected and the stage is generation_processing.

Upload-status mapping in packages/api-jobs/src/public-job.ts (source read 2026-10-10)
details.artifact_upload_statuspublic_reasonretryablenext_action
413artifact_too_largefalsefix_input
Another 4xx, such as 400 or 403artifact_upload_rejectedfalsefix_input
408 or 429Ordinary transient pathPer the stored flagretry_later when retryable
Any 5xxOrdinary transient pathPer the stored flagretry_later when retryable

Why the mapping is strict about 413

A code comment in the remap explains the history. A 413 on a finished render carried no provider status, so it fell through to the generic path, was labelled a generation timeout with retry_later, and an automated client re-rendered the same oversized timeline again and again before reporting a temporary timeout. Every word of that advice was wrong. The dedicated branch exists so that a size problem is never described as a transient one.

What to change

The file is too big, so the request has to produce a smaller file. The levers are the ones the message names.

  • A shorter cut or a shorter duration.
  • A lower resolution. The Video Generation page lists the resolutions each model accepts.
  • A lower bitrate, on endpoints that take a bitrate setting.
  • Fewer or lighter inputs when the output is assembled from several clips.

Branch on it in code

A client that retries on failure should treat this reason as a stop sign. This function returns what to do for a job error object.

After the change, submit a new job. The failed one is terminal and keeps its error, and the broader retry rules are in which job errors to retry.

def next_step(error):
    reason = error.get("public_reason")
    if reason in ("artifact_too_large", "artifact_upload_rejected"):
        return "shrink the output, then submit a new job"
    if error.get("retryable") and error.get("next_action") == "retry_later":
        return "wait %ss, then retry" % (error.get("retry_after_seconds") or 30)
    if error.get("next_action") == "fix_input":
        return "change the request"
    return "read the job events"

print(next_step({"public_reason": "artifact_too_large", "retryable": False}))
print(next_step({"retryable": True, "next_action": "retry_later", "retry_after_seconds": 12}))

Sources

Related posts

More in Developers

All Developers posts

Written by Sume