# server/app.py from fastapi import FastAPI, HTTPException from openenv.core.env_server import create_fastapi_app from ..models import Action, Observation, TaskInfo from .environment import CodeDebugEnvironment from .tasks import TASK_REGISTRY from .grader import grade # Core OpenEnv app (provides /reset, /step, /state, /ws, /health) app = create_fastapi_app(CodeDebugEnvironment, Action, Observation) # ── Additional required hackathon endpoints ──────────────────────────── @app.get("/tasks") def list_tasks() -> list[TaskInfo]: """Return all tasks with their action schema.""" return [ TaskInfo( task_id=tid, difficulty=task["difficulty"], description=task["description"], action_schema=Action.model_json_schema(), ) for tid, task in TASK_REGISTRY.items() ] @app.get("/grader") def get_grader_score(task_id: str, submitted_code: str) -> dict: """ Grade a submission directly (for testing / evaluation). Returns: { score: float, passed: int, total: int, test_results: list } """ if task_id not in TASK_REGISTRY: raise HTTPException(status_code=404, detail=f"Unknown task_id: {task_id}") task = TASK_REGISTRY[task_id] result = grade(submitted_code, task_id, task["test_suite"]) return { "task_id": task_id, "score": result["score"], "passed": result["passed"], "total": result["total"], "test_results": [r.model_dump() for r in result["test_results"]], } @app.get("/baseline") def run_baseline() -> dict: """ Run the baseline agent on all tasks and return scores. This endpoint triggers the baseline inference script. """ import subprocess, sys, json try: result = subprocess.run( [sys.executable, "baseline/run_baseline.py", "--output", "json"], capture_output=True, text=True, timeout=120, ) return json.loads(result.stdout) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) def main(): """Entry point for the server.""" import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000) if __name__ == "__main__": main()