aagparekh's picture
Add interactive frontend UI
b0c701c
import os
from pathlib import Path
from dotenv import load_dotenv
from fastapi.responses import FileResponse
from fastapi.staticfiles import StaticFiles
from openenv.core import create_app
import uvicorn
load_dotenv()
from environment.actions import ContextCorruptionAction, EpisodeObservation
from environment.env import ContextCorruptionEnv
from environment.model_inference import InferenceRequest, model_status, run_inference
_difficulty_env = os.getenv("DIFFICULTY")
_difficulty = int(_difficulty_env) if _difficulty_env else None
_max_sessions = int(os.getenv("MAX_CONCURRENT_ENVS", "64"))
_frontend_dir = Path(__file__).parent.parent / "frontend"
app = create_app(
env=lambda: ContextCorruptionEnv(difficulty=_difficulty),
action_cls=ContextCorruptionAction,
observation_cls=EpisodeObservation,
env_name="ContextCorruption-Env",
max_concurrent_envs=_max_sessions,
)
if _frontend_dir.exists():
app.mount("/static", StaticFiles(directory=_frontend_dir), name="static")
@app.get("/", include_in_schema=False)
def frontend():
index_path = _frontend_dir / "index.html"
if index_path.exists():
return FileResponse(index_path)
return api_status()
@app.get("/api/status")
def api_status():
return {
"name": "ContextCorruption-Env",
"status": "running",
"openenv_endpoints": ["/health", "/metadata", "/schema", "/reset", "/step", "/state"],
"model_endpoints": ["/model/status", "/model/infer"],
"docs": "/docs",
}
@app.get("/model/status")
def get_model_status():
return model_status()
@app.post("/model/infer")
def infer_with_trained_model(request: InferenceRequest):
return run_inference(request.observation)
if __name__ == "__main__":
uvicorn.run("environment.server:app", host="0.0.0.0", port=7860, reload=False)