prashasti12/AI-debugging-agent
0
1"""2HF Spaces server — DebugOps Environment (OpenEnv compatible)3 4Exposes:5 POST /reset6 POST /step7 GET /state8"""9 10from __future__ import annotations11from typing import Dict, Any, Optional12 13import os14import uvicorn15from fastapi import FastAPI, HTTPException, Body16 17from tasks.task_simple import create_env as create_simple18from tasks.task_multi_service import create_env as create_multi19from tasks.task_critical import create_env as create_critical20 21 22app = FastAPI(title="DebugOps AI Environment", version="1.0.0")23 24# Global environment instance25_env: Optional[Any] = None26 27def create_env(task: str):28 if task == "simple":29 return create_simple()30 elif task == "multi_service":31 return create_multi()32 elif task == "critical":33 return create_critical()34 else:35 raise ValueError(f"Invalid task: {task}")36 37 38def get_env():39 global _env40 if _env is None:41 raise HTTPException(status_code=400, detail="Call /reset first")42 return _env43 44@app.get("/")45def root():46 return {47 "name": "DebugOps AI Environment",48 "description": "Production debugging RL environment (OpenEnv compatible)",49 "endpoints": ["/reset", "/step", "/state", "/health"],50 }51 52 53@app.get("/health")54def health():55 return {"status": "ok"}56 57 58@app.post("/reset")59def reset(payload: Optional[Dict[str, Any]] = Body(default={})):60 """61 Accepts BOTH:62 {} (validator case)63 {"task": "critical"} (manual case)64 """65 global _env66 67 try:68 task = payload.get("task", "simple") if payload else "simple"69 70 _env = create_env(task)71 obs = _env.reset()72 73 return {74 "observation": obs,75 "done": False,76 }77 78 except Exception as e:79 raise HTTPException(status_code=500, detail=str(e))80 81 82@app.post("/step")83@app.post("/step/")84def step(payload: Dict[str, Any] = Body(...)):85 env = get_env()86 87 try:88 action = payload.get("action")89 if not action:90 raise ValueError("Missing 'action' field")91 92 obs, reward, done, info = env.step(action)93 94 return {95 "observation": obs,96 "reward": float(round(reward, 3)),97 "done": done,98 "info": info,99 }100 101 except Exception as e:102 raise HTTPException(status_code=400, detail=str(e))103 104 105@app.get("/state")106@app.get("/state/")107def state():108 env = get_env()109 try:110 return env.state()111 except Exception as e:112 raise HTTPException(status_code=400, detail=str(e))113 114def main():115 port = int(os.getenv("PORT", 7860))116 uvicorn.run(app, host="0.0.0.0", port=port)117 118 119if __name__ == "__main__":120 main()