Deepikachintamreddy commited on
Commit
5e04bd7
·
1 Parent(s): fba04fa

add POST /grader endpoint for validator

Browse files
Files changed (1) hide show
  1. server/app.py +43 -11
server/app.py CHANGED
@@ -1,4 +1,4 @@
1
- """FastAPI application for ConfigDebugEnv v2.
2
 
3
  Uses OpenEnv's create_fastapi_app() for standard framework compatibility
4
  (WebSocket sessions, standard endpoints, grader discovery).
@@ -86,11 +86,7 @@ def health():
86
 
87
  @app.get("/metadata")
88
  def metadata():
89
- """Metadata endpoint with grader paths for validator discovery.
90
-
91
- The validator uses these grader paths to import and test each grader.
92
- Each grader path points to grader_api which returns a FLOAT in (0.01, 0.99).
93
- """
94
  print("[VALIDATOR] GET /metadata called")
95
  return {
96
  "name": "ConfigDebugEnvironment",
@@ -109,10 +105,7 @@ def metadata():
109
 
110
  @app.post("/reset")
111
  async def reset_env(request: Request):
112
- """Override /reset endpoint to return correct OpenEnv contract schema.
113
-
114
- Must include: observation, done, reward (as float, NOT null), metadata, info
115
- """
116
  print("[VALIDATOR] POST /reset called - CUSTOM OVERRIDE")
117
  try:
118
  env = ConfigDebugEnvironment()
@@ -131,6 +124,45 @@ async def reset_env(request: Request):
131
  raise
132
 
133
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
134
  @app.get("/tasks")
135
  def tasks():
136
  return {
@@ -274,4 +306,4 @@ def main(host: str = "0.0.0.0", port: int = 7860):
274
 
275
 
276
  if __name__ == "__main__":
277
- main()
 
1
+ """FastAPI application for ConfigDebugEnv.
2
 
3
  Uses OpenEnv's create_fastapi_app() for standard framework compatibility
4
  (WebSocket sessions, standard endpoints, grader discovery).
 
86
 
87
  @app.get("/metadata")
88
  def metadata():
89
+ """Metadata endpoint with grader paths for validator discovery."""
 
 
 
 
90
  print("[VALIDATOR] GET /metadata called")
91
  return {
92
  "name": "ConfigDebugEnvironment",
 
105
 
106
  @app.post("/reset")
107
  async def reset_env(request: Request):
108
+ """Override /reset endpoint to return correct OpenEnv contract schema."""
 
 
 
109
  print("[VALIDATOR] POST /reset called - CUSTOM OVERRIDE")
110
  try:
111
  env = ConfigDebugEnvironment()
 
124
  raise
125
 
126
 
127
+ @app.post("/grader")
128
+ async def grader_endpoint(request: Request):
129
+ """Score a submitted config for a specific task without a full episode.
130
+ The validator calls this to verify each task has a working grader
131
+ with scores strictly between 0 and 1."""
132
+ print("[VALIDATOR] POST /grader called")
133
+ try:
134
+ body = await request.json()
135
+ task_id = body.get("task_id", TASK_ORDER[0])
136
+ submitted_config = body.get("submitted_config",
137
+ body.get("action", {}).get("fixed_config", "{}"))
138
+
139
+ from server.graders.grader_api import (
140
+ grade_task1, grade_task2, grade_task3,
141
+ grade_task4, grade_task5, grade_task6, grade_task7,
142
+ )
143
+
144
+ grader_map = {
145
+ "task1_json": grade_task1,
146
+ "task2_yaml": grade_task2,
147
+ "task3_dockerfile": grade_task3,
148
+ "task4_compose": grade_task4,
149
+ "task5_k8s": grade_task5,
150
+ "task6_github_actions": grade_task6,
151
+ "task7_nginx": grade_task7,
152
+ }
153
+
154
+ grader_fn = grader_map.get(task_id)
155
+ if grader_fn is None:
156
+ return {"error": f"Unknown task_id: {task_id}", "score": 0.01}
157
+
158
+ score = grader_fn(submitted_config)
159
+ print(f"[GRADER] task={task_id} score={score}")
160
+ return {"task_id": task_id, "score": score, "has_grader": True}
161
+ except Exception as e:
162
+ print(f"[GRADER] Error: {e}")
163
+ return {"error": str(e), "score": 0.01}
164
+
165
+
166
  @app.get("/tasks")
167
  def tasks():
168
  return {
 
306
 
307
 
308
  if __name__ == "__main__":
309
+ main()