task.run /
taskset.run at execution time, and the same task and the same env.py run anywhere - only the
runtime changes.
Built-in runtimes
| Runtime | Where the env runs | When to reach for it |
|---|---|---|
LocalRuntime("env.py") | A child process from your source | Fastest iteration; local development |
DockerRuntime("my-env") | A fresh local container per rollout | Reproducibility and parity with production |
ModalRuntime("my-env") | A fresh Modal sandbox per rollout | Cloud scale, no infra to manage |
DaytonaRuntime("my-env") | A fresh Daytona sandbox per rollout | Cloud scale on Daytona |
Runtime("tcp://host:8765") | A substrate you already started | Attaching to a long-lived container or sandbox you own |
HUDRuntime() | The HUD platform, leased by name | After you deploy (see below); the default when runtime= is omitted for platform/file rows |
from hud import LocalRuntime, DockerRuntime, HUDRuntime, Runtime); ModalRuntime and DaytonaRuntime import from hud.eval.
Omit
runtime= and it’s inferred. A taskset minted in-process from one .py source serves that
source locally; rows loaded from a file or the platform fall back to HUDRuntime. Pass a runtime
explicitly the moment you want something other than that.The decision: run it yourself or deploy
Every runtime above is one of two choices, and that choice is the only one that really matters: do you keep the environment on infra you bring up, or deploy it to the HUD platform?- Run it yourself.
LocalRuntimefor development,DockerRuntimefor a reproducible container,ModalRuntime/DaytonaRuntimefor cloud sandboxes, orRuntime(url)to attach to something you already started. You own the substrate’s lifecycle. - Deploy to the platform.
hud deploybuilds your environment image and hosts it; thenHUDRuntime()leases it per rollout while your agent loop stays local. This is the path to running batches and comparing models from the platform UI, with every trace browsable.
Package & deploy
Deploying builds your environment into an image on HUD and registers it by the name in yourEnvironment(...) declaration - one step, no local Docker:
hud init scaffolds the Dockerfile.hud. One build packs every task from the definition, so the same
image runs unchanged on HUD, on a cloud sandbox, in CI, or on your laptop. After deploying,
HUDRuntime() is the natural pair. Pass build config with --env, --build-arg, and --secret. See
the CLI reference for the full flag set.
Run on your own infra
A runtime is just a function: given a task, start a container somewhere and yield its control-channel URL. That one function is the whole integration surface for any provider - Modal, E2B, Runloop, your own Kubernetes:run.py
DockerRuntime and the rest are just built-in versions of this. Anything that starts your image and
hands back a URL plugs in with no change to the environment or the task - that’s what “run anywhere”
means concretely. Constructed directly, Runtime(url) yields itself with a no-op lifecycle, since
whoever provisioned the substrate owns teardown.
Placement can also vary per task: a runtime is called once per rollout with the task row being placed,
so one callable can route heavier rows to heavier substrates.
A self-contained image, no HUD account
For a fully local artifact, build straight from the scaffoldedDockerfile.hud and drive a task with
the packaged CLI. docker exec runs the commands inside the container, so nothing needs to be
exposed:
Reproducible by construction. Each rollout gets its own fresh container, so results reproduce
across runs and machines and one rollout never leaks state into the next. Keep per-task setup in
@env.initialize so every run starts from
the same state.Runtime arguments
The constructor for each built-in runtime:LocalRuntime
path-.pyfile (or directory) that declares the env. The child’s working directory is the source’s directory, so sibling imports and relative data paths resolve.env- pin a specific env name when the source declares more than one. Defaults to the placed task’s env.ready_timeout- seconds to wait for the child to start serving.
DockerRuntime
image- image name to run; shorthand forruntime_config.image.port- port the image’s CMD serves inside the container (the scaffoldedDockerfile.hudserves8765).run_args- extradocker runflags, e.g.["--gpus", "all"]or["-e", "KEY=VAL"].runtime_config- aRuntimeConfig(image, resources) for finer control.
ModalRuntime
image_name- published Modal image name (the preferred durable handle), e.g.ModalRuntime("hud-libero-env").image- anImageto build lazily on first use, as an escape hatch.command- override the serving command (defaults to the scaffoldedhud serveentrypoint).app_name/port/env_vars- Modal app name, in-sandbox serving port, and extra environment variables.
modal extra and a configured token.
DaytonaRuntime
snapshot_name- Daytona snapshot to boot from (the durable handle).image- Dockerfile/registry ref to build the snapshot once if it’s missing. Resources (cpu/memory/gpu) live on the snapshot.workdir/port- guest working directory and in-sandbox serving port.ssh_host/ssh_expires_minutes- SSH tunnel settings (Daytona exposes services over an SSH local-forward).
HUDRuntime
run_timeout- bound on one rollout end to end, including instance startup.runtime_url- override the runtime endpoint the tunnel connects to.
Runtime
url- control-channel address of an already-running substrate (e.g.tcp://host:8765).params- connection-time data a transport may need (auth token, sandbox id).
RuntimeConfig
RuntimeConfig carries the construction hints a container-based runtime needs: which image, how much
hardware, and what timeouts. Set it on the runtime (runtime_config=) or per row on
Task.runtime_config; the runtime merges the two and applies what it
supports.
| Field | Description |
|---|---|
image | Image to run. |
resources | RuntimeResources(cpu, memory_mb, gpu=RuntimeGPU(type, count)). |
limits | RuntimeLimits(startup_timeout_s, run_timeout_s). |
DockerRuntime, ModalRuntime, and DaytonaRuntime accept it (Docker
ignores limits; Daytona ignores run_timeout_s and resource overrides when booting from a snapshot).
LocalRuntime and HUDRuntime reject a per-task runtime_config.
See also
Agents
The agent that connects to the environment and acts.
Train
Turn the rewards a run collects into a training signal.
CLI reference
hud deploy, hud eval, hud task, and the full flag set.Tasks & Tasksets
Per-task placement via
Task.runtime_config.