"""Local-only FastAPI adapter for the same evaluated Python engine."""
import asyncio
from typing import Literal
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, ConfigDict
from engine import evaluate

app = FastAPI(title="Zyel Python Evaluation Lab", version="157.024")
gate = asyncio.Semaphore(1)

class Experiment(BaseModel):
    model_config = ConfigDict(extra="forbid")
    preset: Literal["evidence", "injection", "slow"] = "evidence"
    variant: Literal["broken", "safe"] = "safe"

@app.post("/run")
async def run(config: Experiment):
    try:
        async with asyncio.timeout(.01):
            await gate.acquire()
    except TimeoutError:
        raise HTTPException(429, "One experiment at a time")
    try:
        async with asyncio.timeout(3):
            return await evaluate(config.preset, config.variant)
    finally:
        gate.release()

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=4199)
