Replicate status succeeded vs Sume completed: map the states
Replicate uses starting, processing, succeeded, failed, canceled. Sume uses queued, processing, completed, failed, canceled. A mapping table and a poll loop.

How do Replicate prediction statuses map to Sume job statuses?
Replicate's succeeded is Sume's completed; both have failed and canceled; and the two non-terminal states do not line up exactly. Replicate has starting then processing; Sume has queued then processing. Porting a poll loop is a one-line status mapping plus one place where the meaning of the first state differs.
What does Replicate's reference list?
A prediction's status is one of: starting (the prediction is starting up; if this lasts longer than a few seconds, a new worker is typically being started), processing (the model's predict method is executing), succeeded, failed and canceled (canceled by its creator). The object also carries created_at, started_at, completed_at, a metrics object with predict_time and total_time, and a urls object with web, get and cancel.
What does Sume's job list?
Five statuses in Jobs and results: queued (accepted, waiting), processing (running or being finalized), completed, failed and canceled. The status endpoint also returns the booleans terminal and result_ready, and a queue-shaped status of IN_QUEUE, IN_PROGRESS, COMPLETED, FAILED or CANCELED that never disagrees with sume_status. Poll on the booleans or on sume_status, and do not mix them.
queued is a normal state, not a warning. It means your workspace is at its processing limit, as described in Generation admission. Replicate's starting is about a worker booting; a Sume queued job is waiting for a slot in your plan.
Mapping table
Use this in a shared client that talks to both.
| Replicate | Sume | Terminal |
|---|---|---|
starting | queued (closest) | No |
processing | processing | No |
succeeded | completed | Yes |
failed | failed | Yes |
canceled | canceled | Yes |
What does a portable poll loop look like?
This normalizes both vendors to one set of names. For Sume, honor next_poll_after_seconds when present and fall back to a growing delay; fetch the result only after completed, because /result answers 409 job_not_completed otherwise.
TERMINAL = {"succeeded": "completed", "completed": "completed",
"failed": "failed", "canceled": "canceled"}
def normalize(status: str) -> str:
s = status.lower()
if s in TERMINAL:
return TERMINAL[s]
return "queued" if s in {"starting", "queued"} else "processing"
def next_delay(payload: dict, attempt: int) -> float:
hint = payload.get("next_poll_after_seconds")
return float(hint) if hint else min(2 ** attempt, 30)
assert normalize("succeeded") == "completed"
assert normalize("starting") == "queued"
assert next_delay({}, 3) == 8What differs besides the names?
Cancellation: Replicate exposes urls.cancel on each prediction; Sume's POST /v1/jobs/:id/cancel works only before generation starts and returns 409 job_generation_already_started afterward. Retention: Replicate API predictions lose data after an hour, while Sume results stay readable. And a failed Sume job carries a public error on the job record, so read failures from GET /v1/jobs/:id rather than from /result.
Sources
Related posts
More in Comparisons
- Replicate private models bill idle time: how Sume bills a job
On Replicate, a private model on dedicated hardware bills setup, idle and active time. Sume bills per job: a reserve at submit, then capture or refund.
- Replicate SSE stream URL vs Sume: no event stream, so poll
Replicate returns a urls.stream endpoint with output, error and done events. Sume has no SSE or WebSocket on the Developer API. Poll status or take a webhook.
- Replicate's six prediction statuses vs Sume's five job statuses
Replicate has starting, processing, succeeded, failed, canceled and aborted. Sume has queued, processing, completed, failed and canceled. The map and its gap.
- Replicate webhook signature vs Sume: webhook-id or sume-v1?
Replicate signs id.timestamp.body with a whsec_ key; Sume signs timestamp.body as sume-v1. Compare headers, secrets and a Python verifier for the Sume side.
Written by Sume