Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
b6d85a4
chore: vjepa use jpeg from parent
juelg May 8, 2026
3d3fe8e
feat(policies): added support for lerobot policies
juelg May 8, 2026
b96dbd4
stash
juelg May 8, 2026
a4a31ed
feat(rcs): adapt multi robot space
juelg May 11, 2026
fcc221f
fix: rcs duobench integration and lerobot policies
juelg May 13, 2026
568cb6d
fix: seeding by gym reset and video recording
juelg May 14, 2026
76f446a
feat(lerobot): correct resizing and option for temporal ensemble
juelg May 14, 2026
571f0cf
fix: change reset options default
juelg May 14, 2026
81b8e42
fix: left over fixes
juelg May 17, 2026
d9895a8
feat: add config to wandb
juelg May 17, 2026
67aecf8
feat: add duobench envs
juelg May 17, 2026
95829b0
feat: video as mp4
juelg May 18, 2026
f1b3b4b
feat: xvla and remap key
juelg May 18, 2026
e931fc6
feat: multi processing over envs
juelg May 18, 2026
2c7b206
fix: respect n_action_steps for non act policies
juelg May 18, 2026
7bda6f2
feat: parallelize over envs
juelg May 19, 2026
0c7c791
feat(client): allow reconnection of the client
juelg May 19, 2026
d837ac7
refactor: remove xvla import and return chunk
juelg May 21, 2026
cb7040d
fix: multiprocessing of single tasks
juelg May 22, 2026
4c345b5
add manual resize
juelg May 22, 2026
af1b936
fix: env reset in jpeg case
juelg May 23, 2026
b77d9ae
fix: removed multi processing on single server level
juelg May 24, 2026
5d39491
fix: fan out for same eval id
juelg May 24, 2026
29af7a1
feat: high res cameras in videos
juelg May 24, 2026
6f4b2ab
style: python format
juelg Jun 20, 2026
5144ef1
build: use dependency groups
juelg Jun 20, 2026
6fd5553
docs: added lerobot server cli examples
juelg Jun 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/pipeline.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,10 @@ jobs:
with:
python-version: "3.10"
cache: "pip"
- name: Install library
run: python -m pip install -e .
- name: Install linting and formatting dependencies
run: python -m pip install '.[dev]'
run: python -m pip install 'pip>=25.1' && python -m pip install --group dev
- name: Check formatting
run: make checkformat
# - name: Check linting
Expand Down
34 changes: 30 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ On top of vlagents you can then install a simulation environment where the agent
We currently the following environments:
- [maniskill](https://github.com/haosulab/ManiSkill)
- [robot control stack](https://github.com/RobotControlStack/robot-control-stack)
- [duobench](https://github.com/RobotControlStack/duobench)
- [libero](https://github.com/Lifelong-Robot-Learning/LIBERO)


Expand All @@ -41,6 +42,14 @@ We currently support the following policies:
- [openpi](https://github.com/Physical-Intelligence/openpi)
- [vjepa2-ac](https://github.com/facebookresearch/vjepa2)
- [diffusion policy](https://github.com/real-stanford/diffusion_policy)
- [lerobot policies](https://github.com/huggingface/lerobot/tree/main/src/lerobot/policies)


### LeRobot
```shell
pip install 'lerobot[all]'
```



### Octo
Expand Down Expand Up @@ -74,7 +83,7 @@ pip install git+https://github.com/juelg/vlagents.git
For more details, see the [Octo github page](https://github.com/octo-models/octo).

#### Troubleshooting
If pip conplains about dependency issues than it might have happened that torch somehow slipped in.
If pip complains about dependency issues than it might have happened that torch somehow slipped in.
Check if you have any torch packages installed by
```shell
pip freeze | grep torch
Expand Down Expand Up @@ -152,6 +161,16 @@ Currently located on the branch `diffusion_policy`.
## Usage
To start an vlagents server use the `start-server` command where `kwargs` is a dictionary of the constructor arguments of the policy you want to start e.g.
```shell
# lerobot act (n_action_steps is the executed horizon of the action chunk)
python -m vlagents start-server lerobot --port 8080 --host 0.0.0.0 --kwargs '{"policy_name": "act", "checkpoint_path": "<path to pretrained_model>", "n_action_steps": 1}'

# lerobot pi05
python -m vlagents start-server lerobot --port 20000 --host 0.0.0.0 --kwargs '{"policy_name": "pi05", "checkpoint_path": "<path to pretrained_model>", "n_action_steps": 1}'

# lerobot xvla
uv run python -m vlagents start-server lerobot --port 20000 --host 0.0.0.0 --kwargs '{"policy_name": "xvla", "checkpoint_path": "<path to pretrained_model>", "n_action_steps": 1, "rename_map": {"head": "image", "left_wrist": "image2", "right_wrist": "image3"}}'


# octo
python -m vlagents start-server octo --host localhost --port 8080 --kwargs '{"checkpoint_path": "hf://Juelg/octo-base-1.5-finetuned-maniskill", "checkpoint_step": None, "horizon": 1, "unnorm_key": []}'

Expand Down Expand Up @@ -245,7 +264,8 @@ In order to extend the library with a new agent environment, extend the `Evaluat
### Developer Tools
Install the following dev dependencies:
```shell
pip install -ve '.[dev]'
pip install 'pip>=25.1'
pip install --group dev
```

The following dev tools are provided:
Expand All @@ -261,12 +281,18 @@ make test
```

## Citation
If you find the agent useful for your work, please consider citing the original work behind it:
If you find the agent useful for your work, please consider citing the original works behind it:
```
@inproceedings{juelg2025refinedpolicydistillationvla,
title={{Refined Policy Distillation}: {F}rom {VLA} Generalists to {RL} Experts},
author={Tobias J{\"u}lg and Wolfram Burgard and Florian Walter},
year={2025},
booktitle={Proc.~of the IEEE/RSJ Int.~Conf.~on Intelligent Robots and Systems (IROS)},
booktitle={Proc.~of the IEEE/RSJ Int.~Conf.~on Intelligent Robots and Systems (IROS)}
}
@misc{juelg2026vlagentspolicyserverefficient,
title={VLAgents: A Policy Server for Efficient VLA Inference},
author={Tobias J{\"u}lg and Khaled Gamal and Nisarga Nilavadi and Pierre Krack and Seongjin Bien and Michael Krawez and Florian Walter and Wolfram Burgard},
year={2026},
howpublished={\url{https://arxiv.org/abs/2601.11250}}
}
```
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Homepage = "https://github.com/RobotControlStack/vlagents"
Issues = "https://github.com/RobotControlStack/vlagents/issues"


[project.optional-dependencies]
[dependency-groups]
dev = [
"ruff",
"black",
Expand Down
36 changes: 36 additions & 0 deletions src/tests/test_eval_merge.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import numpy as np

from vlagents.__main__ import _merge_env_split_results
from vlagents.evaluator_envs import EvalConfig


def test_merge_env_split_results_keeps_distinct_seeded_cfgs():
cfg_a = EvalConfig("duobench/spring_door", {}, max_steps_per_episode=900, seed=0, jpeg_encoding=True)
cfg_b = EvalConfig("duobench/spring_door", {}, max_steps_per_episode=900, seed=10, jpeg_encoding=True)

results = [
(
np.array([[[1.0, 0.1, 100.0], [0.0, 0.2, 200.0]]]),
[[[0.1], [0.2]]],
[0.15],
40000,
),
(
np.array([[[0.0, 0.3, 300.0], [1.0, 0.4, 400.0]]]),
[[[0.3], [0.4]]],
[0.35],
40000,
),
]

merged_last_reward, merged_rewards, merged_mean_rewards, merged_step = _merge_env_split_results(
results=results,
worker_eval_cfgs=[[cfg_a], [cfg_b]],
eval_cfgs=[cfg_a, cfg_b],
)

assert merged_step == 40000
assert np.array_equal(merged_last_reward[0], results[0][0][0])
assert np.array_equal(merged_last_reward[1], results[1][0][0])
assert merged_rewards == [results[0][1][0], results[1][1][0]]
assert merged_mean_rewards == [0.15, 0.35]
2 changes: 1 addition & 1 deletion src/tests/test_libero.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import os

import numpy as np
from lerobot.envs.libero import LiberoEnv
from PIL import Image

from lerobot.envs.libero import LiberoEnv
from vlagents.__main__ import _run_eval
from vlagents.evaluator_envs import AgentConfig, EvalConfig

Expand Down
Loading
Loading