| """ |
| server/app.py — LifeStack OpenEnv entry point. |
| |
| This module is the canonical server entry point registered in pyproject.toml |
| as [project.scripts] server = "server.app:main". It wraps LifeStackEnv in an |
| HTTP + WebSocket server compatible with EnvClient / openenv validate. |
| """ |
|
|
| from __future__ import annotations |
|
|
| import os |
| import sys |
| from pathlib import Path |
|
|
| |
| |
| _ROOT = Path(__file__).resolve().parent.parent |
| if str(_ROOT) not in sys.path: |
| sys.path.insert(0, str(_ROOT)) |
|
|
|
|
| def main() -> None: |
| """ |
| LifeStack OpenEnv Server — standard distribution entry point. |
| Wraps LifeStackEnv in an HTTP and WebSocket server compatible with EnvClient. |
| """ |
| try: |
| import uvicorn |
| except ImportError as exc: |
| raise SystemExit( |
| "uvicorn is not installed. Run: pip install uvicorn" |
| ) from exc |
|
|
| try: |
| from openenv.core import create_app |
| except Exception as exc: |
| raise SystemExit( |
| f"openenv.core could not be imported ({exc}). " |
| "Ensure openenv-core>=0.2.3, fastapi, and fastmcp are installed." |
| ) from exc |
|
|
| from core.lifestack_env import LifeStackEnv, LifeStackAction, LifeStackObservation, USING_MODERN_API |
|
|
| if not USING_MODERN_API: |
| raise SystemExit( |
| "openenv.core modern API is not available (USING_MODERN_API=False). " |
| "Check that openenv-core>=0.2.3 and its dependencies (fastapi, fastmcp) " |
| "are correctly installed in this Python environment." |
| ) |
|
|
| host = os.getenv("OPENENV_HOST", "0.0.0.0") |
| port = int(os.getenv("OPENENV_PORT", "8000")) |
| max_concurrent = int(os.getenv("OPENENV_MAX_SESSIONS", "4")) |
|
|
| os.environ.setdefault("ENABLE_WEB_INTERFACE", "true") |
|
|
| app = create_app( |
| env=LifeStackEnv, |
| action_cls=LifeStackAction, |
| observation_cls=LifeStackObservation, |
| env_name="LifeStack Premium", |
| max_concurrent_envs=max_concurrent, |
| ) |
|
|
| print("\n" + "=" * 60) |
| print(" LifeStack OpenEnv Server is ready!") |
| print(f" HTTP Endpoint : http://{host}:{port}") |
| print(f" Web Interface : http://{host}:{port}/web") |
| print(f" Documentation : http://{host}:{port}/docs") |
| print(f" Health check : http://{host}:{port}/health") |
| print("=" * 60 + "\n") |
|
|
| uvicorn.run(app, host=host, port=port, log_level="info") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|