11import argparse
22import pathlib
3+ from typing import Any
34
45import docker
56
67from env import all_envs
7- from env .base import Env
8- from print import tasks_and_results_to_table , tasks_and_results_to_table_averages
8+ from print import (
9+ tasks_and_results_to_table ,
10+ tasks_and_results_to_table_averages ,
11+ )
912from scenarios import all_scenarios
10- from scenarios .base import Scenario
1113from tasks import Task , TaskHandler
1214
15+ _DEFAULT_SAVE_PATH = pathlib .Path (__file__ ).parent .parent / "results"
1316
14- def select_envs (args : argparse .Namespace ) -> list [Env ]:
17+
18+ def main (args : Any ) -> None :
19+
20+ # ----- Preparation -----#
1521 envs = all_envs
22+ exclude_envs = args .exclude_envs if args .exclude_envs else []
23+ envs = [e for e in all_envs if e .id not in exclude_envs ]
1624 if args .envs :
1725 envs = [e for e in all_envs if e .id in args .envs ]
1826 envs = sorted (envs , key = lambda e : e .id )
27+
1928 if not envs :
2029 raise Exception (
2130 f"Got an empty/invalid list of envs, possible choices: { [e .id for e in all_envs ]} " ,
2231 )
23- return envs
2432
25-
26- def select_scenarios (args : argparse .Namespace ) -> list [Scenario ]:
27- scenarios = all_scenarios
33+ exclude_scenarios = args .exclude_scenarios if args .exclude_scenarios else []
34+ scenarios = [e for e in all_scenarios if e .id not in exclude_scenarios ]
2835 if args .scenarios :
29- scenarios = [e for e in all_scenarios if e .id in args .scenarios ]
36+ scenarios = [
37+ e
38+ for e in all_scenarios
39+ if e .id in args .scenarios and e .id not in exclude_scenarios
40+ ]
3041 scenarios = sorted (scenarios , key = lambda s : s .id )
3142 if not scenarios :
3243 raise Exception (
3344 f"Got an empty/invalid list of scenarios, possible choices: { [s .id for s in all_scenarios ]} " ,
3445 )
35- return scenarios
36-
3746
38- def main (args : argparse .Namespace ) -> None :
39- # ----- Preparation -----#
40- envs = select_envs (args )
41- scenarios = select_scenarios (args )
47+ if not args .models :
48+ raise Exception ("Got an empty list of models" )
4249
4350 if args .only_samples :
4451 samples = args .only_samples
4552 else :
4653 samples = list (range (args .n_samples ))
4754
55+ if args .ks :
56+ ks = args .ks
57+ else :
58+ ks = [1 , 5 ]
59+
4860 tasks = sorted (
4961 [
5062 Task (
@@ -56,6 +68,7 @@ def main(args: argparse.Namespace) -> None:
5668 safety_prompt = args .safety_prompt ,
5769 reasoning_effort = args .reasoning_effort ,
5870 openrouter = args .openrouter ,
71+ vllm = args .vllm ,
5972 )
6073 for env in envs
6174 for scenario in scenarios
@@ -79,7 +92,10 @@ def main(args: argparse.Namespace) -> None:
7992 base_delay = args .base_delay ,
8093 max_delay = args .max_delay ,
8194 force = args .force ,
95+ skip_failed = args .skip_failed ,
8296 openrouter = args .openrouter ,
97+ vllm = args .vllm ,
98+ vllm_port = args .vllm_port ,
8399 )
84100 elif args .mode == "test" :
85101 task_handler .run_tests (
@@ -89,9 +105,11 @@ def main(args: argparse.Namespace) -> None:
89105 min_port = args .min_port ,
90106 force = args .force ,
91107 )
108+ if args .prune_docker :
109+ docker .from_env ().containers .prune ()
92110 elif args .mode == "evaluate" :
93111 r = task_handler .evaluate_results (
94- ks = args . ks ,
112+ ks = ks ,
95113 samples = samples ,
96114 )
97115 print (tasks_and_results_to_table_averages (r ))
@@ -112,7 +130,7 @@ def main(args: argparse.Namespace) -> None:
112130 choices = [
113131 "generate" ,
114132 "test" ,
115- "evaluate" ,
133+ "evaluate"
116134 ],
117135 required = True ,
118136 help = "Mode in which to run the code" ,
@@ -141,7 +159,7 @@ def main(args: argparse.Namespace) -> None:
141159 help = "If given, it will restrict operations to these sample indices." ,
142160 )
143161 parser .add_argument (
144- "--ks" , type = int , nargs = "+" , default = [ 1 , 5 ] , help = "List of k for pass@k score."
162+ "--ks" , type = int , nargs = "+" , default = None , help = "List of k for pass@k score."
145163 )
146164 parser .add_argument (
147165 "--envs" ,
@@ -150,13 +168,27 @@ def main(args: argparse.Namespace) -> None:
150168 nargs = "+" ,
151169 help = "List of environments (if empty, then all environments are used)" ,
152170 )
171+ parser .add_argument (
172+ "--exclude_envs" ,
173+ type = str ,
174+ default = None ,
175+ nargs = "+" ,
176+ help = "List of environments to exclude" ,
177+ )
153178 parser .add_argument (
154179 "--scenarios" ,
155180 type = str ,
156181 default = None ,
157182 nargs = "+" ,
158183 help = "List of scenarios (if empty, then all scenarios are used)" ,
159184 )
185+ parser .add_argument (
186+ "--exclude_scenarios" ,
187+ type = str ,
188+ default = None ,
189+ nargs = "+" ,
190+ help = "List of scenarios to exclude" ,
191+ )
160192 parser .add_argument (
161193 "--spec_type" ,
162194 choices = ["openapi" , "text" ],
@@ -174,7 +206,7 @@ def main(args: argparse.Namespace) -> None:
174206 parser .add_argument (
175207 "--results_dir" ,
176208 type = pathlib .Path ,
177- default = pathlib . Path ( __file__ ). parent . parent / "results" ,
209+ default = _DEFAULT_SAVE_PATH ,
178210 help = "Directory to save the results" ,
179211 )
180212 parser .add_argument (
@@ -225,9 +257,30 @@ def main(args: argparse.Namespace) -> None:
225257 action = "store_true" ,
226258 help = "Force generation even if the file already exists" ,
227259 )
260+ parser .add_argument (
261+ "--skip_failed" ,
262+ action = "store_true" ,
263+ help = "Skip failed tasks and continue with the rest" ,
264+ )
265+ parser .add_argument (
266+ "--prune_docker" ,
267+ action = "store_true" ,
268+ help = "Prune docker containers after running tests" ,
269+ )
228270 parser .add_argument (
229271 "--openrouter" ,
230272 action = "store_true" ,
231273 help = "Route requests through OpenRouter" ,
232274 )
275+ parser .add_argument (
276+ "--vllm" ,
277+ action = "store_true" ,
278+ help = "Use VLLM for generation" ,
279+ )
280+ parser .add_argument (
281+ "--vllm_port" ,
282+ type = int ,
283+ default = 8000 ,
284+ help = "Port for VLLM server" ,
285+ )
233286 main (parser .parse_args ())
0 commit comments