File size: 4,104 Bytes
8372659
 
 
 
 
 
 
 
def69a7
 
8372659
 
 
 
 
 
 
 
bbd9cd6
def69a7
 
 
 
 
 
 
 
bbd9cd6
8372659
 
 
def69a7
 
8372659
def69a7
8372659
 
 
 
 
 
 
 
 
bbd9cd6
8372659
 
 
 
def69a7
 
 
 
 
 
 
 
 
 
 
8372659
 
 
 
 
bbd9cd6
8372659
 
 
 
bbd9cd6
8372659
 
 
 
 
bbd9cd6
 
 
 
 
 
 
 
8372659
def69a7
 
bbd9cd6
 
def69a7
8372659
 
 
 
def69a7
 
 
8372659
 
 
 
def69a7
 
 
8372659
 
def69a7
 
 
 
 
 
 
 
8372659
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
"""
Script to run either the MCP server or the Gradio interface
"""

import argparse
import importlib.util
import os
import sys
import time
import subprocess

def load_module(name, path):
    """Load a module from path"""
    spec = importlib.util.spec_from_file_location(name, path)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module

def run_mcp_server(host="0.0.0.0", port=8001, transport="http"):
    """Run the MCP server with specified configuration"""
    print(f"Starting TutorX MCP Server on {host}:{port} using {transport} transport...")
    
    # Set environment variables for MCP server
    os.environ["MCP_HOST"] = host
    os.environ["MCP_PORT"] = str(port)
    os.environ["MCP_TRANSPORT"] = transport
    
    # Import and run the main module
    main_module = load_module("main", "main.py")
    
    # Access the mcp instance and run it
    if hasattr(main_module, "run_server"):
        main_module.run_server()
    else:
        print("Error: run_server function not found in main.py")
        sys.exit(1)

def run_gradio_interface():
    """Run the Gradio interface"""
    print("Starting TutorX Gradio Interface...")
    app_module = load_module("app", "app.py")
    
    # Run the Gradio demo
    if hasattr(app_module, "demo"):
        app_module.demo.launch(server_name="0.0.0.0", server_port=7860)
    else:
        print("Error: Gradio demo not found in app.py")
        sys.exit(1)

def check_port_available(port):
    """Check if a port is available"""
    import socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        sock.bind(('127.0.0.1', port))
        sock.close()
        return True
    except:
        return False

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Run TutorX MCP Server or Gradio Interface")
    parser.add_argument(
        "--mode", 
        choices=["mcp", "gradio", "both"], 
        default="both",
        help="Run mode: 'mcp' for MCP server, 'gradio' for Gradio interface, 'both' for both"
    )
    parser.add_argument(
        "--host", 
        default="0.0.0.0",
        help="Host address to use"
    )
    parser.add_argument(
        "--port", 
        type=int,
        default=8001,
        help="Port to use for MCP server (default: 8001)"
    )
    parser.add_argument(
        "--gradio-port", 
        type=int,
        default=7860,
        help="Port to use for Gradio interface (default: 7860)"
    )
    parser.add_argument(
        "--transport",
        default="http",
        help="Transport protocol to use (default: http)"
    )
    
    args = parser.parse_args()
    
    if args.mode == "mcp":
        if not check_port_available(args.port):
            print(f"Warning: Port {args.port} is already in use. Trying to use the server anyway...")
        run_mcp_server(args.host, args.port, args.transport)
    elif args.mode == "gradio":
        run_gradio_interface()
    elif args.mode == "both":
        # For 'both' mode, we'll start MCP server in a separate process
        if not check_port_available(args.port):
            print(f"Warning: Port {args.port} is already in use. Trying to use the server anyway...")
            
        # Start MCP server in a background process
        mcp_process = subprocess.Popen(
            [
                sys.executable, 
                "run.py", 
                "--mode", "mcp", 
                "--host", args.host, 
                "--port", str(args.port),
                "--transport", args.transport
            ],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )
        
        # Give the MCP server a moment to start up
        print("Starting MCP server in background...")
        time.sleep(2)
        
        try:
            # Then start Gradio interface
            run_gradio_interface()
        finally:
            # Make sure to terminate the MCP server process when exiting
            print("Shutting down MCP server...")
            mcp_process.terminate()
            mcp_process.wait(timeout=5)