File size: 3,104 Bytes
a0debed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""

Main application entry point for Proportion MCP Server.

Handles both local development and cloud deployment.

"""

import logging
import os
import signal
import sys

from proportion_server import create_gradio_app
from config import get_settings, setup_logging, is_huggingface_space

# Initialize logging and settings
setup_logging()
logger = logging.getLogger(__name__)
settings = get_settings()


def signal_handler(signum, frame):
    """Handle shutdown signals gracefully."""
    logger.info(f"๐Ÿ“ก Received signal {signum}, shutting down gracefully...")
    sys.exit(0)


def main() -> None:
    """Main application entry point."""
    
    # Set up signal handlers for graceful shutdown
    signal.signal(signal.SIGINT, signal_handler)
    signal.signal(signal.SIGTERM, signal_handler)
    
    logger.info("๐Ÿš€ Starting Proportion MCP Server")
    logger.info(f"Settings: {settings.model_dump_json(indent=2)}")
    
    # Create Gradio app
    demo = create_gradio_app()
    assert demo is not None, "Failed to create Gradio application"
    logger.info("โœ… Gradio application created successfully")
    
    # Launch configuration
    launch_kwargs = {
        "server_name": settings.server_name,
        "server_port": settings.server_port,
        "mcp_server": True,  # Enable MCP server functionality
        "show_error": settings.debug,
        "quiet": not settings.debug,
        "prevent_thread_lock": False,  # Keep main thread alive
    }
    
    # Development-specific settings
    if not settings.is_production():
        launch_kwargs.update({
            "debug": settings.debug,
        })
    
    # Hugging Face Spaces specific settings
    if is_huggingface_space():
        launch_kwargs.update({
            "server_name": "0.0.0.0",  # Required for HF Spaces
            "share": False,  # Don't create gradio.live links on HF
            "quiet": True,  # Reduce logging noise
        })
        logger.info("๐Ÿค— Configured for Hugging Face Spaces deployment")
    
    # Log the MCP endpoint information
    if is_huggingface_space():
        space_url = os.environ.get("SPACE_URL", "https://your-space.hf.space")
        logger.info(f"๐Ÿ”— MCP Server will be available at: {space_url}")
    else:
        logger.info(f"๐Ÿ”— MCP Server will be available at: http://{settings.server_name}:{settings.server_port}")
    
    logger.info("๐Ÿ”ง MCP Tools exposed: percent_of, solve_proportion, scale_by_ratio, direct_k, resize_dimensions")
    logger.info("๐Ÿ“– Functions with proper type hints and docstrings are automatically exposed as MCP tools")
    
    # Launch the server
    logger.info("๐ŸŒ Starting server...")
    demo.launch(**launch_kwargs)
    
    # Keep the main thread alive
    logger.info("โœ… Server is running, press Ctrl+C to stop")
    if hasattr(signal, 'pause'):
        # Unix systems
        signal.pause()
    else:
        # Windows systems
        import time
        while True:
            time.sleep(1)


if __name__ == "__main__":
    main()