plugrl-env-client runs Gymnasium environments and talks to a centralized PlugRL training server over WebSocket. It carries no deep learning dependencies, so an environment stack and a training stack never have to share a Python environment.
- No deep learning dependencies: The policy stays on the server. The base
install declares eight runtime dependencies -
gymnasium,websocketsandmsgpackdo the environment and wire work, next tologuru,dm-tree,tyro,plugrl-protocolandimageio- and none of them is a deep learning framework, so environments pinned to oldmujoco-pyorcython<3can be used with a modern training stack. Recording videos needs thevideoextra, which adds ffmpeg. Correction: this line previously said the client needs "onlygymnasium,websocketsandmsgpack", which named three of the nine then declared. Two of those nine have since left the base install.pandaswas never imported, andimageio[ffmpeg]becameimageio, with ffmpeg moved tovideo. E45 measured them at 45 MB and 77 MB of the 222 MB install (plugrl-server/experiments/e45-env-side-footprint/). - Distributed communication:
websocketsplusmsgpackfor asynchronous transfer between the server and any number of env clients, across machines. - Modular design: Separates the environment-side runtime (
plugrl-env-client) from the shared protocol layer (plugrl-protocol). - Command-line interface: A
tyro-powered CLI for starting and managing env clients. - Gymnasium integration: Works with standard
Gymnasiumenvironments.
The easiest way to get started is by cloning the repository and using uv to manage the environment.
-
Clone the repository:
git clone https://github.com/PlugRL/plugrl-env-client.git cd plugrl-env-client -
Install dependencies:
Option A: Use uv (recommended)
uv sync
Option B: Editable install with pip
pip install -e . -
Install Optional Environment Dependencies
Most people want
mujocoand nothing else - it is the environment the quickstart uses, and the only one here that is dense-reward continuous control needing no assets, no display and no GPU:uv sync --extra mujoco
The six extras do not all go in one environment, because they need different MuJoCo versions:
-
mujoco,classic,atariandd4rlshare one, on gymnasium's MuJoCo 3:uv sync --extra mujoco --extra classic --extra atari --extra d4rl
-
robomimicandliberoeach need robosuite 1.4.1 with MuJoCo 2.3.7, which is what the LIBERO experiments ran on. Give each an environment of its own, in a separate checkout:uv sync --extra robomimic # or: uv sync --extra libero
pyproject.tomldeclaresmujocoin conflict with the other two, souvrefuses to combine them rather than resolving one MuJoCo for both. Withpip, keep the two sets in separate virtual environments.Correction: this section used to give one command for all six extras. It could not produce a working environment: robosuite 1.4.1 rejects MuJoCo 3, and the
mujocoextra needs it. Neither was the lock resolving them correctly. It still held robomimic 0.3.0 after the extra moved to 0.4.0, and resolving it again would have put MuJoCo 2.3.7 undermujocotoo.The
robomimicextra is not a light install. E1 measures it at 7.2G with 16 CUDA wheels, because robomimic ships its own policy learning code.videogoes with any of them. The recorder needs it for mp4 output (--recorder.record-video,--recorder.record-full-rollout); its PNG snapshots need only the base install.Note:
robomimicandliberopull inegl-probe, whose legacy CMake build needsCMAKE_POLICY_VERSION_MINIMUM=3.5when using CMake 4+.uvis configured in this repository to apply that automatically. If you install withpip, set the variable manually, e.g.CMAKE_POLICY_VERSION_MINIMUM=3.5 pip install -e ".[libero]" -
The plugrl-run-env-client tool launches one or more env client processes for specific environments.
Note:
plugrl-run-workeris kept as a backwards-compatible alias.
uv run plugrl-run-env-client <ENVIRONMENT_TYPE> [OPTIONS]| Type | Extra required | Description |
|---|---|---|
| dummy-v1 | — | Dummy environment for protocol and connectivity tests |
| mujoco-v1 | mujoco |
Gymnasium MuJoCo control, default HalfCheetah-v5 |
| classic-v1 | classic |
Classic control environments (e.g. CartPole) |
| atari-v1 | atari |
Atari games via ALE |
| d4rl-v1 | d4rl |
D4RL locomotion tasks |
| robomimic-v1 | robomimic |
RoboMimic robotic manipulation |
| libero-v1 | libero |
LIBERO manipulation benchmark |
An environment whose extra is not installed reports which extra it needs.
mujoco-v1 is the one to reach for first. It is dense-reward continuous
control that needs no assets, no display and no GPU, and its default task
HalfCheetah-v5 has a 17-dimensional observation and a 6-dimensional action
- exactly
plugrl-server'sfpo-policydefaults, so the pair runs with no configuration. It renders only with--env.render; a state-only policy never looks at the frames, and producing them costs more per step than the physics does.
uv sync --extra mujoco
uv run plugrl-run-env-client mujoco-v1 --num-envs 1 --num-episodes 600 \
--runner.replan-steps 1 --runner.seed 0Run the dummy-v1 environment with custom parameters:
# Run 100 episodes
uv run plugrl-run-env-client dummy-v1 --num-episodes 100
# Run with custom environment settings (64x64 image, 4-dim action space)
uv run plugrl-run-env-client dummy-v1 --env.img-width 64 --env.img-height 64 --env.action-dim 4This example used to carry --log-level debug, which the env client has never
had - the flag exists on plugrl-run-server, and the line was copied from
there. There is no verbosity flag on this side. tests/test_documented_commands.py
now runs every command on this page through the parser, which is how that was
found.
To see all available options for a specific environment:
uv run plugrl-run-env-client dummy-v1 --help