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)