File size: 2,814 Bytes
dbf5e96
b2b578f
 
 
 
 
 
 
 
 
dbf5e96
 
b2b578f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74c9d03
b2b578f
74c9d03
b2b578f
 
 
 
 
 
74c9d03
b2b578f
74c9d03
 
b2b578f
 
 
74c9d03
0255d22
b2b578f
0255d22
b2b578f
 
0255d22
b2b578f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0255d22
b2b578f
 
 
 
 
 
 
 
0255d22
 
74c9d03
0255d22
b2b578f
 
dbf5e96
b2b578f
 
 
 
 
dbf5e96
 
 
 
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
91
92
93
94
95
"""
FastAPI application for CodeReviewEnv.

Follows the OpenEnv reference pattern (calendar_env, repl_env):
  - create_app() with environment factory
  - MCP tool-calling interface
  - Concurrent session support
  - Gradio UI for interactive testing

Entry point: server.app:app (referenced in openenv.yaml)
"""

from __future__ import annotations

import inspect
import logging
import os
import sys
from pathlib import Path

# Ensure imports work both as package and standalone
SERVER_DIR = Path(__file__).resolve().parent
if str(SERVER_DIR) not in sys.path:
    sys.path.insert(0, str(SERVER_DIR))
REPO_ROOT = SERVER_DIR.parent
if str(REPO_ROOT) not in sys.path:
    sys.path.insert(0, str(REPO_ROOT))

from openenv.core.env_server.http_server import create_app

try:
    from ..models import CodeReviewAction, CodeReviewObservation
    from .code_review_environment import CodeReviewEnvironment
except ImportError:
    from models import CodeReviewAction, CodeReviewObservation
    from server.code_review_environment import CodeReviewEnvironment

logger = logging.getLogger(__name__)


def create_code_review_environment() -> CodeReviewEnvironment:
    """Factory for creating fresh environment instances (one per session)."""
    return CodeReviewEnvironment()


# ─── Build the app using OpenEnv create_app ──────────────────────────────────

# Check if create_app supports gradio_builder
_sig = inspect.signature(create_app)

try:
    from server.gradio_ui import build_gradio_app

    if "gradio_builder" in _sig.parameters:
        app = create_app(
            create_code_review_environment,
            CodeReviewAction,
            CodeReviewObservation,
            env_name="code_review_env",
            max_concurrent_envs=50,
            gradio_builder=build_gradio_app,
        )
    else:
        app = create_app(
            create_code_review_environment,
            CodeReviewAction,
            CodeReviewObservation,
            env_name="code_review_env",
            max_concurrent_envs=50,
        )
except ImportError:
    app = create_app(
        create_code_review_environment,
        CodeReviewAction,
        CodeReviewObservation,
        env_name="code_review_env",
        max_concurrent_envs=50,
    )


# ─── Entry point ─────────────────────────────────────────────────────────────

def main(host: str = "0.0.0.0", port: int | None = None):
    """Run the CodeReviewEnv server with uvicorn."""
    import uvicorn

    if port is None:
        port = int(os.getenv("API_PORT", "7860"))

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


if __name__ == "__main__":
    main()