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)