Deepikachintamreddy commited on
Commit ·
b5fc338
1
Parent(s): 5b5379b
fix: class-based graders with grade() method per Meta instructions
Browse files- openenv.yaml +7 -7
- 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:
|
| 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:
|
| 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:
|
| 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:
|
| 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:
|
| 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:
|
| 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:
|
| 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 -
|
| 3 |
-
|
| 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
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
return max(0.01, min(0.99, reward))
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
return wrapper
|
| 32 |
|
| 33 |
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|