| import os | |
| from pathlib import Path | |
| from openenv.core.env_server import create_fastapi_app | |
| try: | |
| from dotenv import load_dotenv as _load_dotenv | |
| except ImportError: | |
| def _load_dotenv(_path: str) -> bool: # type: ignore[misc] | |
| return False | |
| try: | |
| from .ShopManagerEng_environment import JewelryShopEnvironment | |
| from ..models import JewelryAction, JewelryObservation | |
| except ImportError: | |
| from server.ShopManagerEng_environment import JewelryShopEnvironment | |
| from models import JewelryAction, JewelryObservation | |
| import uvicorn | |
| # Load .env from this package (ShopManagerEng/.env) for FRED/keys when running the server | |
| _env = Path(__file__).resolve().parent.parent / ".env" | |
| if _env.is_file(): | |
| _load_dotenv(_env) | |
| # RL trainers (TRL GRPO, etc.) open one WebSocket per parallel rollout. With | |
| # num_generations=8 + per_device_train_batch_size>=8 you can easily need 8-16 | |
| # concurrent envs. Default max is 1, so we bump it. Override via env var | |
| # SHOPMANAGER_MAX_CONCURRENT_ENVS for hosted Spaces with tighter budgets. | |
| _MAX_CONCURRENT_ENVS = int(os.environ.get("SHOPMANAGER_MAX_CONCURRENT_ENVS", "16")) | |
| app = create_fastapi_app( | |
| JewelryShopEnvironment, | |
| JewelryAction, | |
| JewelryObservation, | |
| max_concurrent_envs=_MAX_CONCURRENT_ENVS, | |
| ) | |
| def main(): | |
| uvicorn.run(app, host="0.0.0.0", port=8000) | |
| if __name__ == "__main__": | |
| main() |