Deepikachintamreddy commited on
Commit ·
5e04bd7
1
Parent(s): fba04fa
add POST /grader endpoint for validator
Browse files- server/app.py +43 -11
server/app.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 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,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()
|