π0.5 DROID + Qwen planner
pi05-droid-qwen · policy template by Physical Intelligence · Qwen3.8 27B names the next step every ~2 s; π0.5 runs it at 15 Hz. Each version below is fixed once published, newest first.
seq init pi05-droid-qwen gives the stable version, seq init pi05-droid-qwen@beta the beta, and seq init pi05-droid-qwen@v<N> any version below that is not withdrawn. A deployment made from this template names the version it runs in seq policy versions and on its page in the console; seq policy upgrade moves it to the newer stable one.
-
v14beta
A deployment of this version runs on one card type, the L4: a worker starts only on an L4, never on an A100.
Needs sequence-ai 0.34.19 or later, on your machine and on the robot:
pip install -U sequence-ai, which brings Pillow for the robot.policy.pydeclaresgpu="L4", where v13 listed["L4", "A100-40GB"]: a deployment names one card type. To run on another card, name that one instead.README.mdsays so where it spoke of the A100.- The image, its frozen files, the weights, the contract and the serving code are v13's.
Use v14
# start a policy from this version, then deploy it seq init pi05-droid-qwen@v14 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v14 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid-qwen@v14 my-policy
-
The image installs openpi from
third_party/openpi, the copy in your folder, and everything else only from this version's frozen files, which the platform keeps: v12's packages, the same on any day.Needs sequence-ai 0.34.19 or later, on your machine and on the robot:
pip install -U sequence-ai, which brings Pillow for the robot.policy.pycopies openpi'spyproject.toml,README.md,LICENSE,src/andpackages/openpi-client/fromthird_party/openpiinto the image and installs them, editable at/opt/openpias before: change openpi there and deploy again, and your deployment runs your openpi.third_party/README.mdlists what goes into the image.- Everything else comes from
/seq/frozen(.template_files("pi05-droid-qwen", version=13)), with no index: the basenvidia/cuda:12.2.2-cudnn8-runtime-ubuntu22.04by digest, the system packages as.debfiles, every Python package with its sha256 checked againstrequirements-policy.lock, and lerobot from its source.frozen.tomlsays what is frozen. - The Python packages are the 209 that v12's image holds (
pins-policy.txt), torch 2.7.1 and JAX 0.5.3 among them, and openpi, its client and lerobot from their sources: the build installs nothing from PyPI or GitHub. - openpi comes without its two submodules, which the image never used: LIBERO, and ALOHA's own code and hardware files.
client.pystops when it is imported, sayingpip install -U sequence-ai, if sequence-ai is older than 0.34.19 or Pillow is missing, instead of at the robot's first frame.- To add a package or change a version, add your own step after the template's (
.uv_pip_install(...)); it installs from PyPI as any image does. - The weights, the contract and the serving code are as in v12.
Use v13
# start a policy from this version, then deploy it seq init pi05-droid-qwen@v13 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v13 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid-qwen@v13 my-policy
-
The source the image builds from comes with the template: openpi at the commit the image pins, in third_party/, with its licenses; LICENSE and NOTICE come with the template too.
Needs sequence-ai 0.34.12 or later, on your machine and on the robot, with Pillow on the robot:
pip install -U sequence-aibrings both.third_party/openpi/: https://github.com/Physical-Intelligence/openpi at commit215abfb217dbac7d5f1273282331b9b1866c0479, with its submodulethird_party/aloha(MIT). Left out, asthird_party/README.mdsays: the LIBERO submodule (its assets include objects under non-commercial terms and with no license given) and ALOHA 2's hardware files (102 MB); this template uses neither.LICENSE(Apache-2.0, for the template's own files) andNOTICE(the checkpoint's terms - Gemma's notice first - and where the code comes from) come with the template.- The image, its weights and what it installs are as in v11.
Use v12
# start a policy from this version, then deploy it seq init pi05-droid-qwen@v12 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v12 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid-qwen@v12 my-policy
-
The robot fits each camera frame and makes each command with the SDK's own helpers, as policy.py declares them.
Needs sequence-ai 0.34.12 or later, on your machine and on the robot, with Pillow on the robot:
pip install -U sequence-aibrings both.client.pycallspolicy.prepare_imagefor each frame (resize="pad",filter="bilinear", as policy.py declares) andpolicy.to_commandfor each step, instead of its own copies of them: itsresize_with_pad,encode,to_commandandto_commandsare gone.policy.pydeclares how each camera's frame is fitted, openpi'sresize_with_padwith bilinear filtering, and the gripper's threshold,binarize={7: 0.5}. The same frames and steps give the same JPEGs and commands as v10.preprocesstakes the connected policy first:preprocess(policy, exterior=..., wrist=..., ...). One chunk at a time ispolicy.to_commands(policy.predict(...)).- A deployment of this version checks every frame and never resizes one: a frame that is not 224x224 is refused with a 400 that names the call that fits it.
- Under an older sequence-ai,
policy.pyandclient.pystop with a sentence that names 0.34.12, instead of an error about unknown fields.
Use v11
# start a policy from this version, then deploy it seq init pi05-droid-qwen@v11 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v11 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid-qwen@v11 my-policy
-
v10stable
The policy declares its action bounds, each joint velocity within [-1, 1] and the gripper within [0, 1], and the platform keeps every step inside them;
client.pygainsto_command(step)forrun().Needs sequence-ai 0.33.50 or later; on the robot, Pillow.
policy.pydeclaresbounds: the 7 joint velocities within [-1, 1], where openpi's DROID example clips them, and the gripper position within [0, 1]. The worker clips each chunk into them before it leaves, naming each clipped value in the response'swarnings, andrun()andnext_action()clip again before a step reachesact.- Before, only
client.py'sto_commandsheld the steps, so a robot that calledrun()oract()without it was sent the model's raw velocities. client.pygainsto_command(step): one step asrun()hands it toact, the gripper made 0 or 1 at 0.5 and every value clipped to [-1, 1].to_commandsisto_commandon each step of a chunk.- The README's example is the
run()loop:connect,wait_until_ready(), thenrun(observe=..., act=lambda action: robot.step(to_command(action))), which plays each chunk's 8 steps at 15 Hz and fetches the next chunk while they play.predict()withto_commandsstays as the one-chunk form.
Use v10
# start a policy from this version, then deploy it seq init pi05-droid-qwen@v10 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v10 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid-qwen@v10 my-policy
In the console, Deploy deploys this version: the console deploys the stable one.
-
The README says to declare
cpuandmemoryfor all the copies when a worker runs several copies of the model.Needs sequence-ai 0.33.50 or later; on the robot, Pillow.
- Each copy is a process of its own, with its own host memory: two pi05-libero copies on one L4 used up to 20.4 GiB, where one copy uses about 10 (measured on the platform).
- For two copies, declare
cpu=2.5, memory=24. The price shown at deploy counts the CPU one robot uses, and a worker with a robot on every copy is billed at the greater of request and use. - README only: the code and the image are v8's.
Use v9
# start a policy from this version, then deploy it seq init pi05-droid-qwen@v9 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v9 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid-qwen@v9 my-policy
-
A worker that runs several copies of the model starts in about the time of one: the copies share one bf16 copy of the params and warm a lone request only.
Needs sequence-ai 0.33.50 or later; on the robot, Pillow.
- With
@seq.concurrent(replicas_per_gpu=N)under@seq.policy, the first load leaves the params as bf16 (about 6.7 GB) in the deployment's compile cache, and every later load maps them from there instead of each copy restoring the checkpoint into its own memory. - On such a worker the warmup compiles a lone request only. Each copy compiles a batch size the first time a batch of that size comes (an eval's): about 5 s each on a B200, once an earlier worker has compiled it.
- Eight pi05-libero copies on one B200 went from start to ready in 69-82 s, against 153-185 s before and 62 s for one copy alone (measured on the platform).
- The shared copy is billed as storage, like the rest of the compile cache. A worker of one copy keeps none, warms every batch size and loads as before.
Use v8
# start a policy from this version, then deploy it seq init pi05-droid-qwen@v8 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v8 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid-qwen@v8 my-policy
- With
-
The README says
client.pyneeds Pillow on the robot, and that the planner asks 2 s after each answer, about every 3.5 s, not every 2 s.Needs sequence-ai 0.33.50 or later; on the robot, Pillow.
client.pyimports Pillow to fit the camera frames before they are sent, so on a robot with sequence-ai alonefrom client import preprocessfailed withNo module named 'PIL'. The README's "Use it" now sayspip install sequence-ai pillow.- The planner waits
_PLAN_EVERY_S(2 s) after each answer before it asks again, so a robot's step is renewed about every 3.5 s. A planner answer took 0.9-3.1 s on 2026-10-09 and 0.85-1.47 s on 2026-10-06 (measured on the platform). - README only: the code and the image are v6's.
Use v7
# start a policy from this version, then deploy it seq init pi05-droid-qwen@v7 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v7 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid-qwen@v7 my-policy
-
The image installs openpi at one fixed commit and its dependencies as PyPI had them on 2026-10-03, so a rebuild on any day installs exactly the same packages.
Needs sequence-ai 0.33.50 or later; on the robot, Pillow.
policy.pychecks out openpi at215abfb(openpi's main of 2026-08-24), installsuv0.12.22, and resolves openpi's dependencies with--exclude-newer 2026-10-03T03:32:00Z.- Earlier versions build openpi's latest commit with whatever PyPI has that day: on 2026-10-09 that was pyarrow 26.0.0, which needs NumPy 2, beside openpi's NumPy 1.26.4, and the policy no longer loaded.
- To take newer versions, move
_OPENPI_COMMITand_PYPI_AS_OFforward together. - The planner, the model, its weights and
client.pyare v5's.
Use v6
# start a policy from this version, then deploy it seq init pi05-droid-qwen@v6 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v6 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid-qwen@v6 my-policy
-
The README's example for a planner of your own names no particular provider, and the policy declares its model family,
family="pi".Needs sequence-ai 0.33.50 or later; on the robot, Pillow.
- The example stores your provider's key, its chat completions address and its name for the model in the
plannersecret, asPLANNER_API_KEY,PLANNER_URLandPLANNER_MODEL. @seq.policy(family="pi")names outright the model family the console draws its icon from, which earlier versions left to be read from the image. It needs sequence-ai 0.33.50 or later, and the README now says so.
v5 is the oldest version
seq initgives; it includes every change of v2-v4 below.Use v5
# start a policy from this version, then deploy it seq init pi05-droid-qwen@v5 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v5 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid-qwen@v5 my-policy
- The example stores your provider's key, its chat completions address and its name for the model in the
-
v4withdrawn
The policy has no batch wait of its own: an eval's acts are gathered until they stop coming, where a 5 ms wait cut a round into small padded batches. A robot's act never waits.
Withdrawn on 2026-10-08: its README's example for a planner of your own named one particular chat provider. v5 is the same template with your provider's details as placeholders there, and it declares its model family.
-
v3withdrawn
The planner is the platform's Qwen3.8 27B (
qwen3-8-27b) with its reasoning off. Since the catalogue movedqwen3-vlto this model, v2's planner spent its 32 tokens on reasoning and every plan came back empty.Withdrawn on 2026-10-08: its README's example for a planner of your own named one particular chat provider. v5 is the template without it, with every change since.
- A planner of your own is sent the same field,
"reasoning": {"effort": "none"}. A service that refuses it answers 400 and the robot keeps its step; remove the field from_ask_ownfor such a service. - To plan with another model of the catalogue, change
_PLANNERandmodels=together, and keep_REASONINGoff for a reasoning model.
- A planner of your own is sent the same field,
-
v2withdrawn
A planner of your own is any OpenAI-shaped chat endpoint, named in the
plannersecret, and the policy declarescpu=1.25andmemory=11.Withdrawn on 2026-10-08: its README's example for a planner of your own named one particular chat provider. v5 is the template without it, with every change since.
- Store the endpoint's key, its address and the model to ask, one line each, as the secret
planner(PLANNER_API_KEY,PLANNER_URL,PLANNER_MODEL), and declare the secret inpolicy.py. A key stored without the other two fails the deployment's start. - Serving one robot a worker used 1.1 cores and 9.8 GiB (measured on the platform), so with
cpu=1.25andmemory=11(GiB) the price shown at deploy is the price billed. - The README gives a planner call's price as the one
seq modelsshows, instead of a fixed figure.
- Store the endpoint's key, its address and the model to ask, one line each, as the secret
-
v1withdrawn
The first version: a Qwen3-VL planner names the next step from the robot's cameras and its task every few seconds, and π0.5-DROID runs that step every control step.
Withdrawn on 2026-10-07: its code named one particular chat provider's address for a planner of your own. From v2 on, a planner of your own is whatever endpoint you name in the
plannersecret.- The planner is the platform's
qwen3-vl, called through/v1/chat. You store no key: when a robot connects, the platform hands the worker a short-lived credential that may call only the modelspolicy.pydeclares, and each call is billed to your account. - Until a robot's first plan, and while plans fail, π0.5 runs the latest step there is, the robot's own task before any. Each robot, and each environment of an eval, is planned for on its own.
client.pyis pi05-droid's robot half, and π0.5 runs on pi05-droid's official weights.
- The planner is the platform's