提交到 RoboDojo 排行榜
RoboDojo 的排行榜通过 XPolicyLab 运行提交的策略。本教程带着 agent 从开发走到 pull request。通过 XPolicyLab 评测解释了其中涉及的各个部分。
排行榜中决定一次提交形态的规则(2026-10-14 的协议):
- 所有任务使用同一个固定的系统和推理流程;允许其中有 agent,不允许按任务选择策略或 checkpoint 的路由器;
- RoboDojo 用其官方客户端自行为提交打分:在公开 layout 上跑三个评测 seed(均值 ± 标准差),另加隐藏的验证 layout(差距过大会使该条目无效);
- 提交内容:符合 XPolicyLab 标准的推理代码(一个 pull request)、
bash robodojo.sh summarize的完整本地结果、对方法及其使用的模型类型的简短描述(这里是:agent、VLA、LLM/VLM),以及在上榜后 3 天内公开代码、配置和 checkpoint 的承诺; - 要上榜,方法需要有新东西(一种架构或方法,可以是对已有模型有原则的集成),以及一篇论文或技术报告,或者撰写它们的具体计划。
1. 在契约下开发
Section titled “1. 在契约下开发”官方客户端交给策略的内容少于我们的 worker 报告的内容:没有相机标定,夹爪值是最后一次的指令,没有步数上限,没有任务名。agent 默认看到的恰好就是这些(configs/default.toml):
# The agent: what `harness run` runs unless an experiment names another agent file.# Every layer of the harness is on: programs over analytic and learned skills (Simate),# the reactive layer (guards and controllers every tick), handlers, and the success# verifier, above the fixed safety shield. It sees what RoboDojo's official client hands# a policy, nothing more (the leaderboard protocol), and it is the configuration# submitted to the leaderboard. The ablations of the paper (configs/ablations/) include# this file and switch parts off.description = "Harness Policy: programs over analytic and learned skills, reactive layer, handlers, verifier"prompt = "../prompts/robodojo"# The model roles (configs/models/<name>.toml); an experiment's `model` or --model NAME# picks another.model = "deepseek-flash"# No pointer role: the vlm role (the main model) points, as in every 1.4 evaluation run,# where Molmo2 was not running and programs pointed in 3 of 129 episodes.roles = ["main", "vlm", "verifier"]
[skills]layers = { learned = true, reactive = true, handlers = true }
[services]segmenter = "sam3"# The learned policy: Simate. Inside the agent it scored as G0.5 did on the development# comparison; alone it scored more over all 42 tasks (Long-Horizon 38.9 against 19.1).policies = ["simate"]# No world model: no 1.4 evaluation run had OpenWAM, and without it the models fit one# 24 GB GPU (kinematics, SAM 3, Simate: 23.2 GB). `--set 'agent.services.world_models=# ["openwam"]'` adds predict_future.world_models = []
[runtime]# Long enough for pointing calls inside a program to wait out a network outage.cell_timeout_seconds = 1800reactive_budget_ms = 20.0default_max_seconds = 30.0cameras = ["cam_head", "cam_left_wrist", "cam_right_wrist"]verifier = true# The first motion is start(strategy, kind): hand the task to the learned policy (A, C)# or not (B), decided from its description before anything moves (Z2's first call).strategy_first = true# The handed-over task runs uninterrupted: no progress watch (policy_progress_seconds# 0). Stopping the policy early bought nothing (the model's own tools after it added no# score), and measuring the scene while it ran may harm it: pour_liquid_into_cup,# development layouts 0-1, policy alone 4 of 4 (2 scripted now, 2 on 13 October), with# the watch measuring 1 of 4 (2 scripted, 2 of agent 1.4.0). The stall stop still ends# a run whose arms moved and then stopped.policy_progress_seconds = 0.0# After the handed-over task's first run the model has this many calls to finish (its own tools, the policy# again, or finish); then the policy runs on to the end of the episode. Finishing with# the tools took about half of the development run's spend for no score over the policy# alone.post_policy_calls = 4# The XPolicyLab observation contract (core/contract.py): instruction, camera colors,# measured arm joints, link6 poses, the last gripper commands; camera calibration from# the embodiment; no depth, no step limit, no task name, so no task descriptions# (configs/ablations/with-task-description.toml adds them, Tab. 4's second row).# `--set agent.runtime.contract=native` shows a development run everything the# simulator worker measures.contract = "xpolicylab"# Programs run isolated where the machine allows user namespaces (an evaluation host# need not).isolation = "auto"
[budget]# 30 model calls per episode (Zhang et al. 2026b ran 100). A handed-over task needs a# few; the model's own tools where they fail used the rest of 100: agent 1.4.0 on# evaluation layouts, pick_from_conveyor_by_image 98 calls ($0.38) for 0.max_model_calls = 30harness run configs/experiments/dev.toml --deploy mine --output runs/dev开发 layout 上的结果就是导出的策略应当达到的结果。
2. 选择模型并导出
Section titled “2. 选择模型并导出”导出会把 agent 连同其模型一起冻结。选定提交所用的模型(--model NAME,configs/models/ 中的一个文件;agent 自己的模型是通过 OpenRouter 调用的 DeepSeek V4.1 Flash),提交并推送,然后:
harness export xpolicylab --name HarnessPolicy \ --out <RoboDojo>/XPolicyLab/policy/HarnessPolicy --deploy mineagent 原样就是提交的内容:没有指点角色(由 VLM,即主模型本身来指点),没有世界模型,因此包需要运动学服务、SAM 3 和 Simate,共 23.2 GB,一块空闲的 24 GB GPU 就能让它们常驻。除 checkpoint 以外,评测方只需要 OPENROUTER_API_KEY。harness lock 在你导出之前打印包将要记录的 identity(agent 1.6.0 配合 DeepSeek V4.1 Flash:3786ebbcd0e640ae);agent 的开发运行具有相同的 identity,因此它们的结果就是这个包的结果。在导出时使用 --set 或 --model 会改变它,与任何一次运行一样。(agent 1.4.2 导出时使用了 --set 'roles=["main", "vlm", "verifier"]' --set 'services.world_models=[]',1.5.0 把它设为了默认。)
导出会拒绝不在契约下运行或读取任务描述的 agent、不能严格解析的 agent,以及未提交的代码(--allow-dirty 可覆盖最后一项,用于试验)。--vendor 把 agent 据以解析的文件复制进目录,而不是让 install.sh 克隆该 commit:在仓库为私有期间使用它,因为评测方的 install.sh 无法克隆私有仓库。
harness export xpolicylab --name HarnessPolicy \ --out <RoboDojo>/XPolicyLab/policy/HarnessPolicy --deploy mine --check --gpu 5XPolicyLab 的 PR 检查:对每个脚本执行 bash -n、py_compile、model.py 或 deploy.py 中没有图像解码,以及在 XPolicyLab 的调试环境中用脚本化的模型回复(configs/scripts/xpolicylab_check.json)运行十个 episode。包会自行把服务放到给它的 GPU 上;一块 24 GB 的 GPU 就够了(模型按需加载)。
4. 运行官方客户端
Section titled “4. 运行官方客户端”<RoboDojo>/XPolicyLab/policy/HarnessPolicy 就位后,RoboDojo 自己的客户端会完全按评测方的方式运行它:
cd <RoboDojo>/XPolicyLab/policy/HarnessPolicyexport TMPDIR=/data/me/tmp # Isaac Lab writes under $TMPDIR/isaaclabEVAL_NUM=1 bash eval.sh RoboDojo general_pickup HarnessPolicy arx_x5 joint 0 5 5 harness-policy harness-policy参数依次为:benchmark、任务、checkpoint 名称(不会读取)、机器人、动作类型、seed、策略 GPU、模拟器 GPU、策略环境、模拟器环境。EVAL_NUM 限制 episode 数。客户端从 Assets/Eval_Layout/RoboDojo/arx_x5/<seed>/<task>_<n>.json 读取 layout;要在不触碰评测 layout 的情况下检查接线,可以把一个开发 layout 作为一个未使用的 seed 提供:
mkdir -p <RoboDojo>/Assets/Eval_Layout/RoboDojo/arx_x5/9000ln -s <dev_layout_dir>/general_pickup_3.json <RoboDojo>/Assets/Eval_Layout/RoboDojo/arx_x5/9000/general_pickup_0.jsonEVAL_NUM=1 bash eval.sh RoboDojo general_pickup HarnessPolicy arx_x5 joint 9000 5 5 harness-policy harness-policyrm -r <RoboDojo>/Assets/Eval_Layout/RoboDojo/arx_x5/9000每个策略服务器实例把它的 trace 写到策略目录中的 results/<task>-<time>-<pid>/(每个 episode 一个目录,与 harness run 写出的一样,但没有结果:由主机打分);RoboDojo 把它的视频和得分写到 eval_result/ 下。
用这种方式对 agent 1.4.1 的包做过一次检查(每个任务一个开发 layout,作为 seed 9000 提供):stack_bowls、general_pickup 和 make_toast 成功,solve_equation 未成功;没有请求碰到客户端的 120 s 上限。
为了申请,在本地运行一次完整评测:一个评测包的每个任务及其 _random 变体,按官方 episode 数运行(不设置 EVAL_NUM),然后用 RoboDojo 的 bash robodojo.sh summarize 汇总。三个 seed 由 RoboDojo 自己运行。在同一块 GPU 上启动下一个 eval.sh 之前,策略服务器需要拿回其服务占用的显存:等到上一个实例的服务都已退出。
- 带着
policy/HarnessPolicy/向 XPolicyLab 发起一个 pull request。该目录固定了 commit(agent.json、install.sh);其 README 遵循 XPolicyLab 的适配器模板。 - 在 robodojo-benchmark.com/eval 申请:pull request 的 URL 和 commit,策略和 checkpoint,benchmark、任务、机器人和动作空间(
arx_x5,joint),包需要的环境变量和下载项(OPENROUTER_API_KEY:说明它是托管模型的 key),本地结果以及方法描述。
评测方运行 install.sh、download_checkpoints.sh,设置 OPENROUTER_API_KEY,然后运行 eval.sh。启动时策略再次解析 agent.json,得到的 identity 与导出时的不一致就拒绝运行。