Template updates

π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.

  1. 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.py declares gpu="L4", where v13 listed ["L4", "A100-40GB"]: a deployment names one card type. To run on another card, name that one instead.
    • README.md says 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
    pi05-droid-qwen v14shell
    # 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
  2. v13

    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.py copies openpi's pyproject.toml, README.md, LICENSE, src/ and packages/openpi-client/ from third_party/openpi into the image and installs them, editable at /opt/openpi as before: change openpi there and deploy again, and your deployment runs your openpi. third_party/README.md lists what goes into the image.
    • Everything else comes from /seq/frozen (.template_files("pi05-droid-qwen", version=13)), with no index: the base nvidia/cuda:12.2.2-cudnn8-runtime-ubuntu22.04 by digest, the system packages as .deb files, every Python package with its sha256 checked against requirements-policy.lock, and lerobot from its source. frozen.toml says 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.py stops when it is imported, saying pip 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
    pi05-droid-qwen v13shell
    # 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
  3. v12

    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-ai brings both.

    • third_party/openpi/: https://github.com/Physical-Intelligence/openpi at commit 215abfb217dbac7d5f1273282331b9b1866c0479, with its submodule third_party/aloha (MIT). Left out, as third_party/README.md says: 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) and NOTICE (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
    pi05-droid-qwen v12shell
    # 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
  4. v11

    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-ai brings both.

    • client.py calls policy.prepare_image for each frame (resize="pad", filter="bilinear", as policy.py declares) and policy.to_command for each step, instead of its own copies of them: its resize_with_pad, encode, to_command and to_commands are gone.
    • policy.py declares how each camera's frame is fitted, openpi's resize_with_pad with bilinear filtering, and the gripper's threshold, binarize={7: 0.5}. The same frames and steps give the same JPEGs and commands as v10.
    • preprocess takes the connected policy first: preprocess(policy, exterior=..., wrist=..., ...). One chunk at a time is policy.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.py and client.py stop with a sentence that names 0.34.12, instead of an error about unknown fields.
    Use v11
    pi05-droid-qwen v11shell
    # 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
  5. 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.py gains to_command(step) for run().

    Needs sequence-ai 0.33.50 or later; on the robot, Pillow.

    • policy.py declares bounds: 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's warnings, and run() and next_action() clip again before a step reaches act.
    • Before, only client.py's to_commands held the steps, so a robot that called run() or act() without it was sent the model's raw velocities.
    • client.py gains to_command(step): one step as run() hands it to act, the gripper made 0 or 1 at 0.5 and every value clipped to [-1, 1]. to_commands is to_command on each step of a chunk.
    • The README's example is the run() loop: connect, wait_until_ready(), then run(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() with to_commands stays as the one-chunk form.
    Use v10
    pi05-droid-qwen v10shell
    # 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.

  6. v9

    The README says to declare cpu and memory for 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
    pi05-droid-qwen v9shell
    # 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
  7. v8

    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
    pi05-droid-qwen v8shell
    # 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
  8. v7

    The README says client.py needs 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.py imports Pillow to fit the camera frames before they are sent, so on a robot with sequence-ai alone from client import preprocess failed with No module named 'PIL'. The README's "Use it" now says pip 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
    pi05-droid-qwen v7shell
    # 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
  9. v6

    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.py checks out openpi at 215abfb (openpi's main of 2026-08-24), installs uv 0.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_COMMIT and _PYPI_AS_OF forward together.
    • The planner, the model, its weights and client.py are v5's.
    Use v6
    pi05-droid-qwen v6shell
    # 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
  10. v5

    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 planner secret, as PLANNER_API_KEY, PLANNER_URL and PLANNER_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 init gives; it includes every change of v2-v4 below.

    Use v5
    pi05-droid-qwen v5shell
    # 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
  11. 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.

  12. v3withdrawn

    The planner is the platform's Qwen3.8 27B (qwen3-8-27b) with its reasoning off. Since the catalogue moved qwen3-vl to 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_own for such a service.
    • To plan with another model of the catalogue, change _PLANNER and models= together, and keep _REASONING off for a reasoning model.
  13. v2withdrawn

    A planner of your own is any OpenAI-shaped chat endpoint, named in the planner secret, and the policy declares cpu=1.25 and memory=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 in policy.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.25 and memory=11 (GiB) the price shown at deploy is the price billed.
    • The README gives a planner call's price as the one seq models shows, instead of a fixed figure.
  14. 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 planner secret.

    • 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 models policy.py declares, 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.py is pi05-droid's robot half, and π0.5 runs on pi05-droid's official weights.