Mastra 1.69 Inngest retries option: durable agents and Sume jobs

Mastra core 1.69.0 adds a retries option for Inngest workflows and durable agents. Pair it with a Sume Idempotency-Key so a retried step never pays twice.

4 min readSume
All posts

Since Mastra core 1.69.0 (September 23, 2026), Inngest workflows and durable agents accept a retries option, so a failing step can re-run automatically. If that step creates a Sume job, give the create call a stable Idempotency-Key; otherwise each retry can create another paid generation. The same release makes durable-agent resume methods resume suspended Inngest runs.

What the release says

Mastra 1.69.0 items (read 2026-10-02)
ItemDetail
Release dateSeptember 23, 2026
Inngest workflows and durable agentsAccept a retries option
Durable agent resumeNow resumes suspended Inngest runs
context.background.adopt()In-memory only

Where retries and Sume meet

A retry re-executes the step. If the step is create job, then wait, the retry creates again. With an Idempotency-Key built from the workflow run and the step name, the retry gets the original job back; Format run replays return 200 with idempotency_hit: true. Reusing the key with a different body returns 409 idempotency_conflict, which is a signal that the step's input changed between attempts.

Split the step in two

Make creating and waiting separate steps.

  • Step one: create with the key, return only the job id.
  • Step two: wait for the result, by webhook if possible, otherwise by GET /v1/jobs/:id/status using next_poll_after_seconds.
  • Step three: fetch /result once the state is terminal.

About adopt()

The release notes call out that context.background.adopt() is in-memory only. Treat that as a reminder: anything you need after a process restart, such as a Sume job id, belongs in durable storage and not in an in-memory handle. A restart would drop the in-memory reference, though the job keeps running at Sume.

Hosted MCP is another option. Mastra can reach https://mcp.sume.com/mcp as a remote tool server; jobs_wait holds at most 55 seconds per call, and wait_slice_expired means call again with the same ids.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume