import uvicorn from fastapi import FastAPI, HTTPException from fastapi.responses import HTMLResponse from pydantic import BaseModel from env.core import CloudOpsEnvironment from models import Action as ActionModel app = FastAPI(title="CloudOps Optimizer") env = CloudOpsEnvironment() HTML_CONTENT = """ CloudOps Optimizer

☁️ CloudOps Optimizer

Simulate cloud infrastructure cost and performance optimization

Reset Environment

Take Action

Output

Select a task and click Reset to begin...
""" @app.get("/", response_class=HTMLResponse) async def root(): return HTML_CONTENT @app.get("/json") async def api_info(): return { "name": "CloudOps Optimizer", "version": "1.0.0", "endpoints": { "health": "/health", "reset": "/reset?task=easy|medium|hard", "step": "/step (POST)", "state": "/state" } } class ActionRequest(BaseModel): message: str @app.get("/health") async def health(): return {"status": "ok"} @app.get("/reset") async def reset(task: str = "easy"): try: obs = env.reset(task_id=task) return {"observation": obs.model_dump(), "done": False} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.post("/step") async def step(action: ActionRequest): try: action_obj = ActionModel(message=action.message) obs, reward, done, info = env.step(action_obj) reward_val = reward.value if hasattr(reward, 'value') else reward return { "observation": obs.model_dump(), "reward": reward_val, "done": done, "info": info } except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.get("/state") async def state(): return env.state() if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=7860)