File size: 2,063 Bytes
eb0a4a1
53ac2bc
eb0a4a1
 
 
 
 
 
 
 
 
 
 
53ac2bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eb0a4a1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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"}