Deepikachintamreddy commited on
Commit
b5fc338
·
1 Parent(s): 5b5379b

fix: class-based graders with grade() method per Meta instructions

Browse files
Files changed (2) hide show
  1. openenv.yaml +7 -7
  2. server/graders/grader_api.py +65 -26
openenv.yaml CHANGED
@@ -22,41 +22,41 @@ tasks:
22
  name: JSON Config Debug
23
  difficulty: easy
24
  num_bugs: 2
25
- grader: server.graders.grader_api:grade_task1
26
  has_grader: true
27
  - id: task2_yaml
28
  name: YAML Config Debug
29
  difficulty: easy
30
  num_bugs: 2
31
- grader: server.graders.grader_api:grade_task2
32
  has_grader: true
33
  - id: task3_dockerfile
34
  name: Dockerfile Debug
35
  difficulty: medium
36
  num_bugs: 3
37
- grader: server.graders.grader_api:grade_task3
38
  has_grader: true
39
  - id: task4_compose
40
  name: Docker Compose Debug
41
  difficulty: medium
42
  num_bugs: 4
43
- grader: server.graders.grader_api:grade_task4
44
  has_grader: true
45
  - id: task5_k8s
46
  name: Kubernetes Config Debug
47
  difficulty: hard
48
  num_bugs: 5
49
- grader: server.graders.grader_api:grade_task5
50
  has_grader: true
51
  - id: task6_github_actions
52
  name: GitHub Actions Debug
53
  difficulty: hard
54
  num_bugs: 5
55
- grader: server.graders.grader_api:grade_task6
56
  has_grader: true
57
  - id: task7_nginx
58
  name: Nginx Config Debug
59
  difficulty: very_hard
60
  num_bugs: 6
61
- grader: server.graders.grader_api:grade_task7
62
  has_grader: true
 
22
  name: JSON Config Debug
23
  difficulty: easy
24
  num_bugs: 2
25
+ grader: server.graders.grader_api:Task1Grader
26
  has_grader: true
27
  - id: task2_yaml
28
  name: YAML Config Debug
29
  difficulty: easy
30
  num_bugs: 2
31
+ grader: server.graders.grader_api:Task2Grader
32
  has_grader: true
33
  - id: task3_dockerfile
34
  name: Dockerfile Debug
35
  difficulty: medium
36
  num_bugs: 3
37
+ grader: server.graders.grader_api:Task3Grader
38
  has_grader: true
39
  - id: task4_compose
40
  name: Docker Compose Debug
41
  difficulty: medium
42
  num_bugs: 4
43
+ grader: server.graders.grader_api:Task4Grader
44
  has_grader: true
45
  - id: task5_k8s
46
  name: Kubernetes Config Debug
47
  difficulty: hard
48
  num_bugs: 5
49
+ grader: server.graders.grader_api:Task5Grader
50
  has_grader: true
51
  - id: task6_github_actions
52
  name: GitHub Actions Debug
53
  difficulty: hard
54
  num_bugs: 5
55
+ grader: server.graders.grader_api:Task6Grader
56
  has_grader: true
57
  - id: task7_nginx
58
  name: Nginx Config Debug
59
  difficulty: very_hard
60
  num_bugs: 6
61
+ grader: server.graders.grader_api:Task7Grader
62
  has_grader: true
server/graders/grader_api.py CHANGED
@@ -1,6 +1,6 @@
1
  """
2
- grader_api.py - Bulletproof grader wrappers.
3
- Returns FLOAT ONLY. Never throws. Always in (0.01, 0.99).
4
  """
5
 
6
  from server.graders.json_grader import grade_task1 as _r1
@@ -12,34 +12,73 @@ from server.graders.github_actions_grader import grade_task6 as _r6
12
  from server.graders.nginx_grader import grade_task7 as _r7
13
 
14
 
15
- def _safe_float(fn):
16
- def wrapper(*args, **kwargs):
17
- try:
18
- if not args and not kwargs:
19
- return 0.5
20
- submitted = args[0] if args else kwargs.get("submitted_config", "{}")
21
- result = fn(submitted)
22
- if isinstance(result, (tuple, list)):
23
- reward = float(result[0])
24
- else:
25
- reward = float(result)
26
- except Exception:
27
- reward = 0.5
 
 
 
 
 
28
  return max(0.01, min(0.99, reward))
29
- wrapper.__name__ = fn.__name__
30
- wrapper.__qualname__ = fn.__qualname__
31
- return wrapper
32
 
33
 
34
- grade_task1 = _safe_float(_r1)
35
- grade_task2 = _safe_float(_r2)
36
- grade_task3 = _safe_float(_r3)
37
- grade_task4 = _safe_float(_r4)
38
- grade_task5 = _safe_float(_r5)
39
- grade_task6 = _safe_float(_r6)
40
- grade_task7 = _safe_float(_r7)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
 
42
- # Aliases for /metadata endpoint which generates grade_{task_id} names
43
  grade_task1_json = grade_task1
44
  grade_task2_yaml = grade_task2
45
  grade_task3_dockerfile = grade_task3
 
1
  """
2
+ grader_api.py - Class-based graders for OpenEnv validator.
3
+ Validator expects classes with a grade() method returning float in (0, 1).
4
  """
5
 
6
  from server.graders.json_grader import grade_task1 as _r1
 
12
  from server.graders.nginx_grader import grade_task7 as _r7
13
 
14
 
15
+ def _safe_score(fn, env, *args, **kwargs):
16
+ try:
17
+ config = ""
18
+ if env is not None and hasattr(env, 'state'):
19
+ state = env.state
20
+ if hasattr(state, 'last_action'):
21
+ config = state.last_action
22
+ elif hasattr(state, 'current_config'):
23
+ config = state.current_config
24
+ if not config and args:
25
+ config = str(args[0])
26
+ if not config:
27
+ config = "{}"
28
+ result = fn(config)
29
+ if isinstance(result, (tuple, list)):
30
+ reward = float(result[0])
31
+ else:
32
+ reward = float(result)
33
  return max(0.01, min(0.99, reward))
34
+ except Exception:
35
+ return 0.5
 
36
 
37
 
38
+ class Task1Grader:
39
+ def grade(self, env=None, *args, **kwargs) -> float:
40
+ return _safe_score(_r1, env, *args, **kwargs)
41
+
42
+
43
+ class Task2Grader:
44
+ def grade(self, env=None, *args, **kwargs) -> float:
45
+ return _safe_score(_r2, env, *args, **kwargs)
46
+
47
+
48
+ class Task3Grader:
49
+ def grade(self, env=None, *args, **kwargs) -> float:
50
+ return _safe_score(_r3, env, *args, **kwargs)
51
+
52
+
53
+ class Task4Grader:
54
+ def grade(self, env=None, *args, **kwargs) -> float:
55
+ return _safe_score(_r4, env, *args, **kwargs)
56
+
57
+
58
+ class Task5Grader:
59
+ def grade(self, env=None, *args, **kwargs) -> float:
60
+ return _safe_score(_r5, env, *args, **kwargs)
61
+
62
+
63
+ class Task6Grader:
64
+ def grade(self, env=None, *args, **kwargs) -> float:
65
+ return _safe_score(_r6, env, *args, **kwargs)
66
+
67
+
68
+ class Task7Grader:
69
+ def grade(self, env=None, *args, **kwargs) -> float:
70
+ return _safe_score(_r7, env, *args, **kwargs)
71
+
72
+
73
+ # Function aliases so app.py /grader endpoint and task_registry still work
74
+ grade_task1 = Task1Grader().grade
75
+ grade_task2 = Task2Grader().grade
76
+ grade_task3 = Task3Grader().grade
77
+ grade_task4 = Task4Grader().grade
78
+ grade_task5 = Task5Grader().grade
79
+ grade_task6 = Task6Grader().grade
80
+ grade_task7 = Task7Grader().grade
81
 
 
82
  grade_task1_json = grade_task1
83
  grade_task2_yaml = grade_task2
84
  grade_task3_dockerfile = grade_task3