from fastapi import FastAPI, HTTPException, Body from pydantic import BaseModel from typing import Dict, Optional, List from env import EmailEnv from models import Action, Observation import uvicorn import os app = FastAPI(title="EmailTriage OpenEnv", description="A real-world email management and scheduling environment.") # Global instance env = EmailEnv() @app.post("/reset") async def reset_env(req: Optional[Dict] = Body(default={})): task_id = req.get("task_id", req.get("level", 1)) if req else 1 obs, info = env.reset(options={"level": task_id}) return { "observation": obs, "info": info, "status": "Ready" } @app.post("/step") async def step_env(action: Dict): obs, reward, terminated, truncated, info = env.step(action) return { "observation": obs, "reward": float(reward), "terminated": bool(terminated), "truncated": bool(truncated), "info": info } @app.get("/state") async def get_state(): return env.state() # Health check for HF Spaces @app.get("/") async def root(): return {"status": "running", "environment": "OpenEnv"} if __name__ == "__main__": # HF Spaces default port is 7860 port = int(os.getenv("PORT", 7860)) uvicorn.run(app, host="0.0.0.0", port=port)