Workflows | Render

Long-running jobs for apps and agents

Deploy reliable application logic and parallel workloads without managing queues, worker pools, or custom retry logic.

A better way to build reliable AI agents

const agentLoop = task({ name: 'agentLoop' },
  async (ctx: TaskContext, userInput: string, conversationContext: object) => {
    const actions = await callLlm(userInput, conversationContext)

// Chain a task run for each planned action, in parallel
    const results = await Promise.all(
      actions.map((action) => ctx.run(execute, action))
    )

// Combine results into a coherent response
    return await ctx.run(synthesize, userInput, results)
  }
)

const execute = task({ name: 'execute' },
  (_ctx: TaskContext, action: { name: string }) => {
    const handler = getHandler(action.name)
    return { action: action.name, result: handler(action) }
  }
)

const synthesize = task({ name: 'synthesize' }, ...)

Turn functions into composable, async tasks

Define tasks and logic in code

Make any function an async task that runs in its own ephemeral container.

Retry failed task runs automatically

Configure retry behavior for each task to handle transient failures automatically.

Checkpoint state (coming soon)

Make crashes inconsequential by resuming workflows right where they left off.

Scale without managing queues or workers

Sub-second start times

Render starts task compute in milliseconds to keep your experiences responsive.

Massively parallel task runs

Use up to 10,000 CPUs per workflow, without managing worker pools or standing up queuing systems.

High-spec task compute

Run compute-intensive tasks on larger compute plans for up to 24 hours.

Observability & debugging

Every task. Every run. Full visibility.

See a unified history of active, queued, and completed task runs.

Analyze performance and reliability across time spans.

Inspect runs to optimize and debug.

Get started with a template

Browse more templates