rewardgen 0.1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. rewardgen-0.1.0.0/PKG-INFO +419 -0
  2. rewardgen-0.1.0.0/README.md +386 -0
  3. rewardgen-0.1.0.0/pyproject.toml +77 -0
  4. rewardgen-0.1.0.0/rewardgen/__init__.py +14 -0
  5. rewardgen-0.1.0.0/rewardgen/api_models.py +256 -0
  6. rewardgen-0.1.0.0/rewardgen/core.py +1066 -0
  7. rewardgen-0.1.0.0/rewardgen/robometer/__init__.py +2 -0
  8. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/__init__.py +1 -0
  9. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/data_scripts/__init__.py +1 -0
  10. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/data_scripts/agibot/__init__.py +21 -0
  11. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/data_scripts/agibot/agibot_helper.py +170 -0
  12. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/data_scripts/agibot/download_task_jsons.py +42 -0
  13. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/data_scripts/libero/rerender_libero.py +322 -0
  14. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_helpers/generate_soar_labels_vlm.py +619 -0
  15. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_helpers/oxe_helper.py +815 -0
  16. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/agibotworld_loader.py +619 -0
  17. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/autoeval_loader.py +85 -0
  18. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/egocot_loader.py +188 -0
  19. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/egodex_loader.py +146 -0
  20. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/epic_loader.py +268 -0
  21. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/failsafe_loader.py +202 -0
  22. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/fino_net_loader.py +422 -0
  23. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/galaxea_loader.py +302 -0
  24. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/h2r_loader.py +380 -0
  25. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/hand_paired_loader.py +168 -0
  26. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/humanoid_everyday_loader.py +346 -0
  27. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/libero_loader.py +158 -0
  28. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/mit_franka_prank_loader.py +216 -0
  29. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/molmoact_loader.py +244 -0
  30. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/motif_loader.py +131 -0
  31. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/mw_collected_loader.py +161 -0
  32. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/mw_task_annotations.py +205 -0
  33. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/new_mit_franka_loader.py +262 -0
  34. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/oxe_loader.py +457 -0
  35. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/ph2d_loader.py +104 -0
  36. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/racer_loader.py +189 -0
  37. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/roboarena_loader.py +123 -0
  38. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/robofac_loader.py +452 -0
  39. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/robofail_loader.py +191 -0
  40. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/roboreward_loader.py +170 -0
  41. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/soar_loader.py +235 -0
  42. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/usc_franka_policy_ranking_loader.py +148 -0
  43. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/usc_koch_human_robot_paired_loader.py +466 -0
  44. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/usc_koch_p_ranking_loader.py +274 -0
  45. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/usc_xarm_policy_ranking_loader.py +164 -0
  46. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/utd_so101_clean_policy_ranking_loader.py +276 -0
  47. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/utd_so101_loader.py +158 -0
  48. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/generate_hf_dataset.py +1083 -0
  49. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/helpers.py +404 -0
  50. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/validate_dataset.py +196 -0
  51. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/video_helpers.py +238 -0
  52. rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/visualize_dataset.py +273 -0
  53. rewardgen-0.1.0.0/rewardgen/robometer/rg_robometer.py +244 -0
  54. rewardgen-0.1.0.0/rewardgen/robometer/robometer/configs/eval_configs.py +274 -0
  55. rewardgen-0.1.0.0/rewardgen/robometer/robometer/configs/experiment_configs.py +562 -0
  56. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/collators/__init__.py +6 -0
  57. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/collators/base.py +86 -0
  58. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/collators/rbm_heads.py +694 -0
  59. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/collators/rewind.py +164 -0
  60. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/collators/utils.py +197 -0
  61. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/dataset_category.py +558 -0
  62. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/dataset_types.py +68 -0
  63. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/__init__.py +13 -0
  64. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/base.py +774 -0
  65. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/custom_eval.py +67 -0
  66. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/helpers.py +703 -0
  67. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/name_mapping.py +96 -0
  68. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/name_mapping_final.py +96 -0
  69. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/rbm_data.py +253 -0
  70. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/repeated_dataset.py +24 -0
  71. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/strategy_first_dataset.py +657 -0
  72. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/__init__.py +19 -0
  73. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/base.py +782 -0
  74. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/eval/base_pref.py +73 -0
  75. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/eval/confusion_matrix.py +300 -0
  76. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/eval/progress_policy_ranking.py +235 -0
  77. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/eval/quality_preference.py +219 -0
  78. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/eval/reward_alignment.py +174 -0
  79. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/eval/roboarena_quality_preference.py +121 -0
  80. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/pref.py +370 -0
  81. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/progress.py +176 -0
  82. rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/scripts/preprocess_datasets.py +1095 -0
  83. rewardgen-0.1.0.0/rewardgen/robometer/robometer/evals/eval_server.py +802 -0
  84. rewardgen-0.1.0.0/rewardgen/robometer/robometer/evals/eval_utils.py +455 -0
  85. rewardgen-0.1.0.0/rewardgen/robometer/robometer/evals/eval_viz_utils.py +208 -0
  86. rewardgen-0.1.0.0/rewardgen/robometer/robometer/models/__init__.py +8 -0
  87. rewardgen-0.1.0.0/rewardgen/robometer/robometer/models/heads.py +101 -0
  88. rewardgen-0.1.0.0/rewardgen/robometer/robometer/models/rbm.py +993 -0
  89. rewardgen-0.1.0.0/rewardgen/robometer/robometer/models/rewind_transformer.py +396 -0
  90. rewardgen-0.1.0.0/rewardgen/robometer/robometer/models/utils.py +77 -0
  91. rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/__init__.py +0 -0
  92. rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/config_utils.py +41 -0
  93. rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/distributed.py +273 -0
  94. rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/embedding_utils.py +100 -0
  95. rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/logger.py +441 -0
  96. rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/metrics.py +210 -0
  97. rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/save.py +973 -0
  98. rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/setup_utils.py +1203 -0
  99. rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/tensor_utils.py +27 -0
  100. rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/timer.py +40 -0
  101. rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/upload_to_hub.py +241 -0
  102. rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/video_utils.py +603 -0
  103. rewardgen-0.1.0.0/rewardgen/robometer/scripts/count_trajectories.py +370 -0
  104. rewardgen-0.1.0.0/rewardgen/robometer/scripts/example_inference.py +482 -0
  105. rewardgen-0.1.0.0/rewardgen/robometer/scripts/example_inference_local.py +201 -0
  106. rewardgen-0.1.0.0/rewardgen/robometer/scripts/example_libero_robometer_wrapper.py +736 -0
  107. rewardgen-0.1.0.0/rewardgen/robometer/scripts/robotics_demo_video_scraper.py +1039 -0
  108. rewardgen-0.1.0.0/rewardgen/robometer/train.py +358 -0
  109. rewardgen-0.1.0.0/rewardgen/roboreward.py +282 -0
  110. rewardgen-0.1.0.0/rewardgen/sole.py +762 -0
  111. rewardgen-0.1.0.0/rewardgen/topreward.py +483 -0
  112. rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothBCOTrainer.py +2216 -0
  113. rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothCPOTrainer.py +1996 -0
  114. rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothDPOTrainer.py +2934 -0
  115. rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothGKDTrainer.py +1347 -0
  116. rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothGRPOTrainer.py +4282 -0
  117. rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothKTOTrainer.py +2413 -0
  118. rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothNashMDTrainer.py +1400 -0
  119. rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothORPOTrainer.py +1920 -0
  120. rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothOnlineDPOTrainer.py +2503 -0
  121. rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothPPOTrainer.py +1694 -0
  122. rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothPRMTrainer.py +1169 -0
  123. rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothRLOOTrainer.py +2864 -0
  124. rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothRewardTrainer.py +1387 -0
  125. rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothSFTTrainer.py +1725 -0
  126. rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothXPOTrainer.py +1445 -0
  127. rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/moe_utils.py +1320 -0
  128. rewardgen-0.1.0.0/rewardgen/utils/__init__.py +2 -0
  129. rewardgen-0.1.0.0/rewardgen/utils/model_utils.py +47 -0
  130. rewardgen-0.1.0.0/rewardgen.egg-info/PKG-INFO +419 -0
  131. rewardgen-0.1.0.0/rewardgen.egg-info/SOURCES.txt +133 -0
  132. rewardgen-0.1.0.0/rewardgen.egg-info/dependency_links.txt +1 -0
  133. rewardgen-0.1.0.0/rewardgen.egg-info/requires.txt +25 -0
  134. rewardgen-0.1.0.0/rewardgen.egg-info/top_level.txt +1 -0
  135. rewardgen-0.1.0.0/setup.cfg +4 -0
@@ -0,0 +1,419 @@
1
+ Metadata-Version: 2.4
2
+ Name: rewardgen
3
+ Version: 0.1.0.0
4
+ Summary: RewardGen package
5
+ Author: Philip
6
+ Requires-Python: >=3.8
7
+ Description-Content-Type: text/markdown
8
+ Requires-Dist: torch==2.9.0
9
+ Requires-Dist: torchvision==0.24.0
10
+ Requires-Dist: torchaudio==2.9.0
11
+ Requires-Dist: transformers==4.57.3
12
+ Requires-Dist: vllm==0.12.0
13
+ Requires-Dist: unsloth>=2025.10
14
+ Requires-Dist: wandb>=0.19.1
15
+ Requires-Dist: pillow
16
+ Requires-Dist: accelerate>=1.2.1
17
+ Requires-Dist: qwen_vl_utils
18
+ Requires-Dist: datasets>=3.2.0
19
+ Requires-Dist: trl
20
+ Requires-Dist: imageio
21
+ Requires-Dist: matplotlib
22
+ Requires-Dist: av<16.0.0,>=15.0.0
23
+ Requires-Dist: openai
24
+ Requires-Dist: google-genai
25
+ Requires-Dist: omegaconf>=2.3.0
26
+ Requires-Dist: hydra-core
27
+ Requires-Dist: tensorboard
28
+ Requires-Dist: peft
29
+ Requires-Dist: codetiming>=1.4.0
30
+ Requires-Dist: sentence-transformers>=2.0.0
31
+ Requires-Dist: decord>=0.6.0
32
+ Requires-Dist: lerobot>=0.4.4
33
+
34
+ <div align="center">
35
+
36
+
37
+ # RewardGen
38
+
39
+ **RewardGen** is a python package that makes it easy to apply any ***reward model*** to your robot videos.
40
+
41
+ </div>
42
+
43
+ ## Example videos
44
+
45
+ <!-- https://github.com/user-attachments/assets/cd481f28-0cb3-4874-bd50-1ec3ad8326ec -->
46
+ https://github.com/user-attachments/assets/3c444096-d3dd-47c7-b09d-90b0756d0f72
47
+
48
+
49
+ ## Supported Models
50
+ - Robometer (https://robometer.github.io)
51
+ - SOLE-R1 (https://philipmit.github.io/sole-r1/)
52
+ - TOPReward (https://topreward.github.io/webpage/)
53
+ - RoboReward (https://arxiv.org/abs/2601.00675)
54
+ - OpenAI models (e.g., `"GPT-5"`)
55
+ - Google models (e.g., `"Gemini-3-Pro-Preview"`)
56
+
57
+ ## ToDos
58
+ - [ ] Enable fine-tuning of reward models on custom datasets
59
+
60
+ ## File Structure
61
+
62
+ ```
63
+ rewardgen/
64
+ ├── rewardgen/ # Main package
65
+ │ ├── robometer/ # Robometer code
66
+ │ ├── sole.py # SOLE-R1 code
67
+ │ ├── roboreward.py # RoboReward code
68
+ │ ├── topreward.py # TOPReward code
69
+ │ └── api_models.py # OpenAI and Gemini APIs
70
+ ├── test_videos/ # Example videos to test
71
+ ├── model_outputs/ # Example videos showing model outputs
72
+ ├── docs/
73
+ │ ├── lerobot_dataset_reward_annotation.mdx # Examples showing integration with lerobot datasets
74
+ └── pyproject.toml # Dependencies (uv)
75
+ ```
76
+
77
+
78
+ ## Install
79
+ ### Option 1: quick pip install
80
+ ```bash
81
+ pip install -U rewardgen
82
+ ```
83
+
84
+ ### Option 2: use [uv](https://github.com/astral-sh/uv) for dependency management
85
+
86
+ ```bash
87
+ # 1) Clone the repository
88
+ git clone https://github.com/Philip-MIT/rewardgen
89
+
90
+ # 2) Install `uv`
91
+ pip install uv
92
+
93
+ # 3) Sync environment
94
+ uv sync
95
+
96
+ # 4) Activate environment
97
+ source .venv/bin/activate
98
+ ```
99
+
100
+
101
+ ---
102
+
103
+ ## Optional: Pre-download model checkpoints
104
+ ```bash
105
+
106
+ # SOLE-R1 (8B)
107
+ python -c "from rewardgen.utils.model_utils import get_model_dir; get_model_dir('sole-r1')"
108
+
109
+ # Robometer (4B)
110
+ python -c "from rewardgen.utils.model_utils import get_model_dir; get_model_dir('robometer')"
111
+
112
+ # TOPReward (based on Qwen3-VL-8B)
113
+ python -c "from rewardgen.utils.model_utils import get_model_dir; get_model_dir('topreward')"
114
+
115
+ # RoboReward (8B)
116
+ python -c "from rewardgen.utils.model_utils import get_model_dir; get_model_dir('roboreward')"
117
+
118
+ > **Note:** Robometer is ~8GB. SOLE-R1, RoboReward, and TOPReward are ~17GB each.
119
+
120
+ ```
121
+ ## Optional: Download all test videos and example model outputs
122
+ ```bash
123
+ # 1) Install gcloud: https://cloud.google.com/sdk/docs/install
124
+
125
+ # 2) Go to target directory
126
+ # cd /path/to/rewardgen
127
+
128
+ # Optional: disable credentials so you don't have to authenticate
129
+ gcloud config set auth/disable_credentials True
130
+
131
+ # Download test videos
132
+ gcloud storage cp --recursive gs://roboreason-view-videos-philip/test_videos ./
133
+
134
+ # Download model outputs for all test videos
135
+ gcloud storage cp --recursive gs://roboreason-view-videos-philip/model_outputs ./
136
+
137
+ # Optional: re-enable credentials afterward if you disabled them above.
138
+ gcloud config set auth/disable_credentials False
139
+
140
+ ```
141
+
142
+ ---
143
+ ## Quick start: Example reward generation and plotting
144
+ ```python
145
+ # pip install -U rewardgen
146
+ from rewardgen import generate, video_plot
147
+
148
+ video_paths = ['test_videos/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4']
149
+ task_description="Pick up the cube from the table."
150
+
151
+ # Robometer
152
+ rewards, success_probs = generate(model="Robometer", task_description=task_description, video_paths=video_paths, view_type='external', verbose=False)
153
+ output_robometer = {"model": "Robometer", "rewards": rewards[0]}
154
+
155
+ # SOLE-R1
156
+ rewards, reasoning_traces = generate(model="SOLE-R1", task_description=task_description, video_paths=video_paths, view_type='external and wrist', verbose=False)
157
+ output_sole = {"model": "SOLE-R1", "rewards": rewards[0], "reasoning_traces": reasoning_traces[0]}
158
+
159
+ # Optional: Ground-truth rewards (available for test videos from sim environments)
160
+ import json
161
+ with open(video_paths[0].replace(".mp4", "/data.json"), 'r') as f:
162
+ data = json.load(f)
163
+
164
+ output_groundtruth = {"model": "Ground truth", "rewards": data['ground-truth rewards']}
165
+
166
+ # Plot
167
+ video_plot(outputs=[output_groundtruth, output_sole, output_robometer], plot_save_path='model_outputs/combined/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4', video_path = video_paths[0], task_description=task_description)
168
+
169
+ ```
170
+
171
+ ---
172
+ ## Examples for generating across all models
173
+
174
+ ### Robometer
175
+ ```python
176
+
177
+ from rewardgen import generate
178
+
179
+ video_paths=['test_videos/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4']
180
+ task_description="Pick up the cube from the table."
181
+
182
+ rewards, success_probs = generate(
183
+ model="Robometer",
184
+ task_description=task_description,
185
+ video_paths=video_paths,
186
+ view_type='external',
187
+ verbose=False
188
+ )
189
+
190
+ ```
191
+
192
+ ### SOLE-R1
193
+ ```python
194
+
195
+ from rewardgen import generate
196
+
197
+ video_paths=['test_videos/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4']
198
+ task_description="Pick up the cube from the table."
199
+
200
+ rewards, reasoning_traces = generate(
201
+ model="SOLE-R1",
202
+ task_description=task_description,
203
+ video_paths=video_paths,
204
+ view_type='external and wrist',
205
+ verbose=False
206
+ )
207
+
208
+ output_sole = {"model": "SOLE-R1", "rewards": rewards[0], "reasoning_traces": reasoning_traces[0]}
209
+
210
+ # Plotting with show_reasoning_traces=True
211
+ video_plot(
212
+ outputs=[output_sole],
213
+ plot_save_path='model_outputs/combined/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4',
214
+ video_path=video_paths[0],
215
+ show_reasoning_traces=True,
216
+ task_description=task_description,
217
+ verbose=False
218
+ )
219
+ ```
220
+
221
+
222
+ ### TOPReward
223
+ ```python
224
+
225
+ from rewardgen import generate
226
+
227
+ video_paths=['test_videos/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4']
228
+ task_description="Pick up the cube from the table."
229
+
230
+ rewards = generate(
231
+ model="TOPReward",
232
+ task_description=task_description,
233
+ video_paths=video_paths,
234
+ view_type='external',
235
+ verbose=False
236
+ )
237
+
238
+ ```
239
+
240
+ ### RoboReward
241
+ ```python
242
+
243
+ from rewardgen import generate
244
+
245
+ video_paths=['test_videos/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4']
246
+ task_description="Pick up the cube from the table."
247
+
248
+ rewards = generate(
249
+ model="RoboReward",
250
+ task_description=task_description,
251
+ video_paths=video_paths,
252
+ view_type='external',
253
+ verbose=False
254
+ )
255
+
256
+ ```
257
+
258
+ ### GPT-5 (and other OpenAI models)
259
+ ```python
260
+
261
+ from rewardgen import generate
262
+
263
+ video_paths=['test_videos/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4']
264
+ task_description="Pick up the cube from the table."
265
+
266
+ # requires OpenAI API key: https://developers.openai.com/api/docs/quickstart
267
+ API_KEY = "..."
268
+
269
+ rewards, reasoning_traces = generate(
270
+ model="GPT-5",
271
+ task_description=task_description,
272
+ video_paths=video_paths,
273
+ view_type='external',
274
+ key=API_KEY,
275
+ verbose=False
276
+ )
277
+ ```
278
+
279
+ ### Gemini-3-Pro (and other Google models)
280
+ ```python
281
+
282
+ from rewardgen import generate
283
+
284
+ video_paths=['test_videos/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4']
285
+ task_description="Pick up the cube from the table."
286
+
287
+ # requires Gemini API key: https://ai.google.dev/gemini-api/docs/api-key
288
+ API_KEY = "..."
289
+
290
+ rewards, reasoning_traces = generate(
291
+ model="Gemini-3-Pro-Preview",
292
+ task_description=task_description,
293
+ video_paths=video_paths,
294
+ view_type='external',
295
+ key=API_KEY,
296
+ verbose=False
297
+ )
298
+ ```
299
+
300
+ ## Video plotting
301
+ ```python
302
+
303
+ from rewardgen import generate, video_plot
304
+
305
+ video_paths=['test_videos/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4']
306
+ task_description="Pick up the cube from the table."
307
+
308
+ # Robometer
309
+ rewards, success_probs = generate(model="Robometer", task_description=task_description, video_paths=video_paths, view_type='external')
310
+ output_robometer = {"model": "Robometer", "rewards": rewards[0]}
311
+
312
+ # SOLE-R1
313
+ rewards, reasoning_traces = generate(model="SOLE-R1", task_description=task_description, video_paths=video_paths, view_type='external and wrist')
314
+ output_sole = {"model": "SOLE-R1", "rewards": rewards[0], "reasoning_traces": reasoning_traces[0]}
315
+
316
+ # Optional: Ground-truth rewards (available for test videos from sim environments)
317
+ import json
318
+ with open(video_paths[0].replace(".mp4", "/data.json"), 'r') as f:
319
+ data = json.load(f)
320
+
321
+ output_groundtruth = {"model": "Ground truth", "rewards": data['ground-truth rewards']}
322
+
323
+ video_plot(
324
+ outputs=[output_sole, output_robometer],
325
+ plot_save_path='model_outputs/combined/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4',
326
+ video_path=video_paths[0],
327
+ task_description=task_description,
328
+ verbose=False
329
+ )
330
+ ```
331
+
332
+ ## Reward generation and plotting across many videos
333
+ ```python
334
+
335
+ from rewardgen import generate
336
+ import glob
337
+ import json
338
+
339
+ video_paths = glob.glob('test_videos/robosuite/lift/unsuccessful/*')
340
+ task_description="Pick up the cube from the table."
341
+
342
+ ## REWARD GENERATION
343
+ # Robometer for all videos
344
+ rewards_robometer, success_probs_robometer = generate(model="Robometer", task_description=task_description, video_paths=video_paths, view_type='external')
345
+ # SOLE-R1 for all videos
346
+ rewards_sole, reasoning_traces_sole = generate(model="SOLE-R1", task_description=task_description, video_paths=video_paths, view_type='external and wrist')
347
+
348
+ ## PLOTTING
349
+ plot_save_dir = 'model_outputs/combined'
350
+ for video_idx in range(len(video_paths)):
351
+ output_robometer = {"model": "Robometer", "rewards": rewards_robometer[video_idx]}
352
+ output_sole = {"model": "SOLE-R1", "rewards": rewards_sole[video_idx]}
353
+ # Optional: Ground-truth rewards (available for test videos from sim environments)
354
+ with open(video_paths[video_idx].replace(".mp4", "/data.json"), 'r') as f:
355
+ data = json.load(f)
356
+
357
+ output_groundtruth = {"model": "Ground truth", "rewards": data['ground-truth rewards']}
358
+ video_plot(
359
+ outputs = [output_groundtruth, output_sole, output_robometer],
360
+ plot_save_path = plot_save_dir + video_paths[video_idx].split('test_videos/')[-1] ,
361
+ video_path = video_paths[video_idx],
362
+ task_description=task_description,
363
+ verbose = False
364
+ )
365
+ ```
366
+
367
+
368
+
369
+ ---
370
+
371
+
372
+ ## generate
373
+
374
+ | Argument | Type | Required | Description |
375
+ | --------------------- | ----------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
376
+ | `model` | `str` | ✅ | Name of the model to use. Options include: `"Robometer"`, `"SOLE-R1"`, `"TOPReward"`, `"RoboReward"`, OpenAI models (e.g.`"GPT-5"`), Google models (e.g., `"Gemini-3-Pro-Preview"`) |
377
+ | `task_description` | `str` | ✅ | Natural language description of the task the robot is performing. |
378
+ | `video_paths` | `List[str]` | ✅ | List of paths to input video files. |
379
+ | `view_type_per_video` | `List[str]` | ✅ | List specifying the camera view(s) used for reward reasoning for each video (e.g., `"external"`, `"wrist"`, or `"external and wrist"`). |
380
+ | `key` | `str` | ❌ | API key required for external models (e.g., OpenAI or Gemini). Not needed for local models. |
381
+
382
+
383
+ | Model Type | Return Values |
384
+ | ---------------------- | --------------------------- |
385
+ | SOLE-R1 / GPT / Gemini | `rewards, reasoning_traces` |
386
+ | Robometer | `rewards, success_probs` |
387
+ | TOPReward / RoboReward | `rewards` |
388
+
389
+
390
+ ## video_plot
391
+
392
+ | Argument | Type | Required | Description |
393
+ | ----------------------- | ------------ | -------- | ----------------------------------------------------------------------------------------- |
394
+ | `outputs` | `List[dict]` | ❌* | List of model outputs (e.g., from `generate`) to visualize together. |
395
+ | `plot_save_path` | `str` | ❌ | Path where the output video with overlays will be saved. |
396
+ | `video_path` | `str` | ❌ | Path to the original video file being visualized. |
397
+ | `view_type` | `str` | ❌ | View type used for visualization (e.g., `"external"`, `"wrist"`, `"external and wrist"`). |
398
+ | `show_reasoning_traces` | `bool` | ❌ | Whether to overlay reasoning traces on the video. Default: `False`. |
399
+ | `show_all_frames` | `bool` | ❌ | Whether to render all frames instead of sampled frames. Default: `False`. |
400
+ | `model` | `str` | ❌** | Model name (used when calling `video_plot` directly instead of passing `outputs`). |
401
+ | `task_description` | `str` | ❌** | Task description (used in direct-call mode). |
402
+ | `video_paths` | `List[str]` | ❌** | Input videos (used in direct-call mode). |
403
+ | `view_type_per_video` | `List[str]` | ❌** | View types per video (used in direct-call mode). |
404
+ | `key` | `str` | ❌** | API key (if required for model). |
405
+
406
+
407
+
408
+
409
+
410
+ ---
411
+ ## Acknowledgements
412
+ RewardGen builds upon the following repos:
413
+ - RewardScope (https://github.com/philfung/reward-scope)
414
+ - Robometer (https://github.com/robometer/robometer)
415
+ - TOPReward (https://github.com/TOPReward/TOPReward)
416
+
417
+ Also thank you to [Jack Vial](https://github.com/jackvial) for the SO-101 videos.
418
+
419
+