File size: 2,564 Bytes
0f67fc2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
837bbe4
0f67fc2
 
 
 
 
 
 
 
 
 
 
 
28056d8
5ff47e7
0f67fc2
28056d8
 
 
 
 
 
 
5ff47e7
28056d8
837bbe4
28056d8
 
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
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# source tree.

"""
FastAPI application for the Token Optimiser Environment.

This module creates an HTTP server that exposes the TokenOptimiserEnvironment
over HTTP and WebSocket endpoints, compatible with EnvClient.

Endpoints:
    - POST /reset: Reset the environment
    - POST /step: Execute an action
    - GET /state: Get current environment state
    - GET /schema: Get action/observation schemas
    - WS /ws: WebSocket endpoint for persistent sessions

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 is required for the web interface. Install dependencies with '\n    uv sync\n'"
    ) from e

# Import using absolute paths from package root
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))

from models import TokenOptimiserAction, TokenOptimiserObservation, TokenOptimiserState
from server.token_optimiser_environment import TokenOptimiserEnvironment


# Create the app with web interface and README integration
app = create_app(
    TokenOptimiserEnvironment,
    TokenOptimiserAction,
    TokenOptimiserObservation,
    env_name="token_optimiser",
    max_concurrent_envs=10,  # Increased for RL training concurrency
)


def main(host: str = "0.0.0.0", port: int = 8000):
    """
    Entry point for direct execution via uv run or python -m.

    This function enables running the server without Docker:
        uv run --project . server
        uv run --project . server --port 8001
        python -m token_optimiser.server.app

    For production deployments, consider using uvicorn directly with
    multiple workers:
        uvicorn token_optimiser.server.app:app --workers 4
    """
    import argparse
    import uvicorn

    if host == "0.0.0.0" and port == 8000:
        parser = argparse.ArgumentParser()
        parser.add_argument("--host", type=str, default="0.0.0.0")
        parser.add_argument("--port", type=int, default=8000)
        args = parser.parse_args()
        host = args.host
        port = args.port

    uvicorn.run(app, host=host, port=port)

if __name__ == "__main__":
    main()