import uuid import os from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import Dict, Optional from environment.env import CodeReviewEnv from environment.models import Action, Observation, Reward app = FastAPI(title="CodeReviewEnv") sessions: Dict[str, CodeReviewEnv] = {} class ResetRequest(BaseModel): task_id: str = "easy" class StepRequest(BaseModel): session_id: str action: Action @app.get("/") async def root(): return {"status": "online", "environment": "CodeReviewEnv", "tag": "openenv"} @app.post("/reset") async def reset_endpoint(req: Optional[ResetRequest] = None): if req is None: req = ResetRequest() session_id = str(uuid.uuid4()) env = CodeReviewEnv(req.task_id) obs = env.reset() sessions[session_id] = env return {"session_id": session_id, "observation": obs.dict()} @app.post("/step") async def step_endpoint(req: StepRequest): if req.session_id not in sessions: raise HTTPException(status_code=400, detail="Invalid session ID") env = sessions[req.session_id] obs, reward, done, info = env.step(req.action) return {"observation": obs.dict(), "reward": reward.dict(), "done": done, "info": info} def main(): import uvicorn # 8000 is standard for the OpenEnv multi-mode validator uvicorn.run("server.app:app", host="0.0.0.0", port=7860) if __name__ == "__main__": main()