""" FastAPI server exposing the OpenEnv-compatible HTTP API. Port: 7860 (Hugging Face Spaces default) """ from fastapi import FastAPI, HTTPException from fastapi.responses import JSONResponse from ..models import ( DebugState, ResetRequest, ResetResponse, StepRequest, StepResponse, ) from .environment import CodeDebugEnvironment app = FastAPI( title="Code Debug OpenEnv", description="An OpenEnv environment where an AI agent debugs broken Python code.", version="1.0.0", ) env = CodeDebugEnvironment() # ------------------------------------------------------------------ # Health & metadata # ------------------------------------------------------------------ @app.get("/health") async def health(): return {"status": "healthy", "tasks_loaded": len(env.tasks)} @app.get("/tasks") async def list_tasks(): return env.list_tasks() # ------------------------------------------------------------------ # OpenEnv core endpoints # ------------------------------------------------------------------ @app.post("/reset", response_model=ResetResponse) async def reset(req: ResetRequest = None): if req is None: req = ResetRequest() try: result = env.reset(task_id=req.task_id, seed=req.seed) return result except KeyError as e: raise HTTPException(status_code=404, detail=str(e)) @app.post("/step/{episode_id}", response_model=StepResponse) async def step(episode_id: str, req: StepRequest): try: result = env.step(episode_id, req.action.model_dump()) return result except KeyError as e: raise HTTPException(status_code=404, detail=str(e)) except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) @app.get("/state/{episode_id}", response_model=DebugState) async def state(episode_id: str): try: return env.state(episode_id) except KeyError as e: raise HTTPException(status_code=404, detail=str(e)) # ------------------------------------------------------------------ # Entry point for local dev # ------------------------------------------------------------------ if __name__ == "__main__": import uvicorn uvicorn.run("code_debug_env.server.app:app", host="0.0.0.0", port=7860, reload=True)