from fastapi import FastAPI, HTTPException, Request from fastapi.responses import JSONResponse from .models import ModerationAction, StepResult, ResetResult, EnvState, ResetRequest from .env import ContentModerationEnv from .tasks import TASKS app = FastAPI(title="Content Moderation OpenEnv", version="1.0.0") _env = ContentModerationEnv() @app.get("/") async def root(): return { "title": "Content Moderation OpenEnv", "version": "1.0.0", "description": "Real-world AI content moderation environment", "endpoints": { "GET /": "This endpoint", "GET /health": "Health check", "GET /docs": "Swagger UI documentation", "GET /redoc": "ReDoc documentation", "GET /tasks": "List available tasks", "POST /reset": "Start new episode", "POST /step": "Submit moderation action", "GET /state": "Get current episode state", "POST /close": "Close episode" }, "docs_url": "/docs", "redoc_url": "/redoc" } @app.post("/reset", response_model=ResetResult) async def reset(request: Request): try: body = await request.json() except Exception: body = {} task = (body or {}).get("task", "text_spam") try: return _env.reset(task=task) except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) @app.post("/step", response_model=StepResult) def step(action: ModerationAction): return _env.step(action) @app.get("/state", response_model=EnvState) def state(): return _env.state() @app.post("/close") def close(): _env.close() return {"status": "closed"} @app.get("/tasks") def list_tasks(): return { name: { "description": t["description"], "difficulty": t["difficulty"], "num_items": len(t["items"]), "content_type": t["content_type"], } for name, t in TASKS.items() } @app.get("/health") def health(): return {"status": "ok"}