Skip to main content
Set run_on= (Python) or run_on: (YAML) once on a flow, team, or workflow and every agent shares one remote sandbox, so a file written by one step is visible to the next.
Confirm the topology of a flow before you run it — print(repr(flow)) names both places. See Where Your Agent Runs.
Without a shared sandbox, each agent provisions its own isolated instance, so agents cannot hand files to each other. run_on= gives them all the same /workspace.

Quick Start

1

Share one sandbox across a workflow

Set run_on once — every step runs its shell and file tools in one sandbox. Python uses run_on=; no-code YAML uses the same run_on: key.
2

Share one sandbox across a team

The same run_on= kwarg works on a team.
3

From workflow YAML — no Python

Add one line — run_on: docker — to any workflow YAML and every step shares the same sandbox. The rest of the file is a normal workflow.
Run it with the standard CLI — no Python needed:
The accepted values are identical to the Python API — docker | e2b | modal | daytona | flyio | tenki | local, or omit run_on: entirely for the default local behaviour (see the Configuration Options table below). Action-only steps like - agent: X; action: "..." share the same sandbox as regular steps, so the writer/reader pattern above works exactly as shown.
A typo fails when the file loads, before any container starts, with the list of valid names — you are never surprised mid-run:
The value is case- and whitespace-insensitive — RUN_ON: DOCKER and run_on: " docker " both normalise to docker. Omitting run_on: leaves every existing workflow YAML behaving exactly as before — nothing is provisioned.
4

Pick a provider

Pass any provider name, or a pre-configured provider instance to customise the image and resources. The provider name is identical for Python and YAML.

How It Works

One sandbox is provisioned lazily on first tool use and torn down when the run ends, even if a step raises.
Action-only steps join the sandbox too. A step with action: but no matching agent: builds a temporary agent during the run — that temp agent shares the same sandbox, so no shell or file tool escapes to the host.

Load-time Validation

A typo in run_on: fails when the YAML loads, not halfway through a paid run. The provider name is checked against the registry at parse time. An unknown provider raises with the full list of valid names:
A non-string value raises immediately too:
The value is case- and whitespace-insensitive — DOCKER and " docker " both normalise to docker.

Configuration Options

run_on= accepts a provider name or a pre-configured provider instance. The accepted values are identical for Python (run_on="docker") and YAML (run_on: docker).

Which param goes where

The shared-sandbox knob is run_on= on the flow, the team, or the top-level YAML key. Individual agents that need their own remote sandbox use compute=.
run_on= shares one sandbox across a whole flow or team. A single LocalAgent uses compute= for its own remote provider. See Placement for how these fit together.
As of PR #4071, run_on= accepts the full compute set — anthropic, docker, e2b, modal, daytona, flyio, tenki, novita — the same places as tools_run_on= for compute-backed backends. See Placement.
As of PR #4092, the vendor compute providers live in the standalone praisonai-sandbox package (same names, same behaviour; old praisonai.integrations.compute.* imports still work through a shim).

Common Patterns

Hand a file between two agents — step 1 writes, step 2 reads the same /workspace.
Share one sandbox across a team where one agent’s output file is another agent’s input.

Choosing a Provider

Pick the provider that matches where you want the sandbox to live.

Best Practices

Per-agent compute= gives each agent its own isolated instance, so files written by one agent are invisible to the next. Set run_on= on the flow or team when agents need the same /workspace.
The default is zero-overhead — nothing is provisioned. Only set run_on= when a run actually shares files or shell state across agents.
All steps share one instance. Pass a configured provider instance to size the image, CPU, and memory for the biggest step, since it affects the whole run.
Agents that already carry their own backend= are deliberately skipped — they keep pointing at their own runtime. Use one approach or the other per agent.

Where Does It Run

Ask a flow where its thinking and tools actually run — the “shared” note lives here.

YAML Workflows

Full no-code workflow reference — including the top-level run_on: key.

Managed Agents

Per-agent managed execution and providers.

Managed CLI

Use managed ps / stop to find and reclaim stray sandboxes.

Managed Agents (Docker)

Docker daemon setup and provider details.

Managed Agents (E2B)

E2B cloud sandbox and E2B_API_KEY setup.

Managed Agents (Modal)

Modal cloud compute setup.

Tenki Cloud

Tenki microVM and TENKI_API_KEY setup.