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() |