Mirror of GitHub source: OpenEnv-compliant LeniencyBench environment + training scripts
6b4f87f verified | """FastAPI server for the DriftEnv. Same OpenEnv contract as round 1.""" | |
| from typing import Optional | |
| from fastapi import FastAPI, HTTPException | |
| from pydantic import BaseModel | |
| from drift_env.environment import DriftEnv | |
| from drift_env.models import Action, Observation, State, StepResult | |
| app = FastAPI(title="LeniencyBench", version="0.1.0") | |
| env = DriftEnv() | |
| def root(): | |
| return { | |
| "name": "LeniencyBench", | |
| "code_name": "policy-drift", | |
| "version": "0.1.0", | |
| "description": ( | |
| "An OpenEnv benchmark that measures and trains out LLM leniency " | |
| "bias: the tendency to apply old/loose policies even after an " | |
| "admin message tightens the rule. 20-email customer-support " | |
| "episodes with 2 policy drifts per episode at fixed positions." | |
| ), | |
| "endpoints": ["/reset", "/step", "/state"], | |
| } | |
| class ResetRequest(BaseModel): | |
| seed: int = 0 | |
| episode_id: str = "ep_0" | |
| def reset(req: Optional[ResetRequest] = None): | |
| req = req or ResetRequest() | |
| return env.reset(seed=req.seed, episode_id=req.episode_id) | |
| def step(action: Action): | |
| try: | |
| return env.step(action) | |
| except RuntimeError as e: | |
| raise HTTPException(status_code=400, detail=str(e)) | |
| def state(): | |
| return env.state() | |