sumo_rl_env / server /app.py
burtenshaw's picture
burtenshaw HF Staff
Upload folder using huggingface_hub
429558a verified
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.
"""
FastAPI application for SUMO-RL environment server.
This module creates an HTTP server that exposes traffic signal control
via the OpenEnv API using SUMO (Simulation of Urban MObility).
"""
import os
from openenv.core.env_server import create_app
# Support both in-repo and standalone imports
try:
# In-repo imports (when running from OpenEnv repository)
from ..models import SumoAction, SumoObservation
from .sumo_environment import SumoEnvironment
except ImportError as e:
if "relative import" not in str(e) and "no known parent package" not in str(e):
raise
# Standalone imports (when running via uvicorn server.app:app)
from models import SumoAction, SumoObservation
from server.sumo_environment import SumoEnvironment
# Get configuration from environment variables
net_file = os.getenv("SUMO_NET_FILE", "/app/nets/single-intersection.net.xml")
route_file = os.getenv("SUMO_ROUTE_FILE", "/app/nets/single-intersection.rou.xml")
num_seconds = int(os.getenv("SUMO_NUM_SECONDS", "20000"))
delta_time = int(os.getenv("SUMO_DELTA_TIME", "5"))
yellow_time = int(os.getenv("SUMO_YELLOW_TIME", "2"))
min_green = int(os.getenv("SUMO_MIN_GREEN", "5"))
max_green = int(os.getenv("SUMO_MAX_GREEN", "50"))
reward_fn = os.getenv("SUMO_REWARD_FN", "diff-waiting-time")
sumo_seed = int(os.getenv("SUMO_SEED", "42"))
# Factory function to create SumoEnvironment instances
def create_sumo_environment():
"""Factory function that creates SumoEnvironment with config."""
return SumoEnvironment(
net_file=net_file,
route_file=route_file,
num_seconds=num_seconds,
delta_time=delta_time,
yellow_time=yellow_time,
min_green=min_green,
max_green=max_green,
reward_fn=reward_fn,
sumo_seed=sumo_seed,
)
# Create FastAPI app
# Pass the factory function instead of an instance for WebSocket session support
app = create_app(
create_sumo_environment, SumoAction, SumoObservation, env_name="sumo_rl_env"
)