File size: 2,630 Bytes
952f360
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# 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 the Doom Env Environment.

This module creates an HTTP server that exposes the DoomEnvironment
over HTTP endpoints, making it compatible with HTTPEnvClient.

Usage:
    # Development (with auto-reload):
    uvicorn server.app:app --reload --host 0.0.0.0 --port 8000

    # Production:
    uvicorn server.app:app --host 0.0.0.0 --port 8000 --workers 4

    # Or run directly:
    python -m server.app
"""

try:
    from openenv_core.env_server.http_server import create_app
except Exception as e:  # pragma: no cover
    raise ImportError(
        "openenv_core is required for the web interface. Install dependencies with '\n    uv sync\n'"
    ) from e

try:
    from ..models import DoomAction, DoomObservation
    from .doom_env_environment import DoomEnvironment
except ImportError:
    from doom_env.server.doom_env_environment import DoomEnvironment
    from doom_env.models import DoomAction, DoomObservation

import os

# Read configuration from environment variables
scenario = os.getenv("DOOM_SCENARIO", "basic")
screen_resolution = os.getenv("DOOM_SCREEN_RESOLUTION", "RES_160X120")
screen_format = os.getenv("DOOM_SCREEN_FORMAT", "RGB24")
window_visible = os.getenv("DOOM_WINDOW_VISIBLE", "false").lower() in ("true", "1", "yes")

# Create the environment instance with configuration
env = DoomEnvironment(
    scenario=scenario,
    screen_resolution=screen_resolution,
    screen_format=screen_format,
    window_visible=window_visible,
    use_discrete_actions=True,
)

# Create the app with web interface and README integration
app = create_app(
    env,
    DoomAction,
    DoomObservation,
    env_name="doom_env",
)


def main():
    """
    Entry point for direct execution via uv run or python -m.

    This function enables running the server without Docker:
        uv run --project . server
        python -m envs.doom_env.server.app
        openenv serve doom_env

    For production deployments, use uvicorn directly:
        uvicorn envs.doom_env.server.app:app --workers 4
    """
    import uvicorn

    print(f"Doom Environment Configuration:")
    print(f"  Scenario: {scenario}")
    print(f"  Resolution: {screen_resolution}")
    print(f"  Format: {screen_format}")
    print(f"  Window Visible: {window_visible}")
    print(f"\nStarting server on http://0.0.0.0:8000")

    uvicorn.run(app, host="0.0.0.0", port=8000)


if __name__ == "__main__":
    main()