File size: 3,911 Bytes
6510698
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
Main application file for Phi-3.5-MoE Hugging Face Space.

This is the entry point that orchestrates all components:
- Environment detection and validation
- Model loading with proper configuration
- Gradio interface creation and launch
"""

import os
import sys
import logging
from pathlib import Path

# Add the project root to Python path
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))

from app.model_loader import ModelLoader
from app.interface import GradioInterface
from app.config.model_config import EnvironmentDetector, DependencyValidator

# Setup logging
logging.basicConfig(
    level=logging.INFO,
    format='[%(asctime)s] %(name)s - %(levelname)s: %(message)s',
    handlers=[
        logging.StreamHandler(sys.stdout)
    ]
)
logger = logging.getLogger(__name__)


def setup_environment():
    """Setup and validate the environment."""
    logger.info("πŸ”§ Setting up environment...")
    
    # Load environment variables from .env if it exists
    env_file = Path(".env")
    if env_file.exists():
        logger.info("πŸ“„ Loading environment variables from .env")
        from dotenv import load_dotenv
        load_dotenv()
    
    # Log environment info
    env_info = EnvironmentDetector.detect_environment()
    logger.info("πŸ“Š Environment Information:")
    for key, value in env_info.items():
        logger.info(f"   {key}: {value}")
    
    # Validate dependencies
    missing_deps = DependencyValidator.get_missing_required_packages()
    if missing_deps:
        logger.error(f"❌ Missing required dependencies: {missing_deps}")
        logger.error("Please run the prestart.sh script to install dependencies")
        return False
    
    logger.info("βœ… Environment setup completed")
    return True


def create_application():
    """Create and configure the application."""
    logger.info("πŸš€ Creating Phi-3.5-MoE application...")
    
    try:
        # Setup environment
        if not setup_environment():
            logger.error("❌ Environment setup failed")
            return None, None
        
        # Create model loader
        logger.info("πŸ€– Initializing model loader...")
        model_loader = ModelLoader()
        
        # Attempt to load the model
        logger.info("πŸ“₯ Loading model (this may take several minutes)...")
        model_loaded = model_loader.load_complete_model()
        
        if model_loaded:
            logger.info("βœ… Model loaded successfully!")
        else:
            logger.warning("⚠️ Model loading failed - running in fallback mode")
        
        # Create Gradio interface
        logger.info("🎨 Creating Gradio interface...")
        interface = GradioInterface(model_loader)
        
        logger.info("πŸŽ‰ Application created successfully!")
        return model_loader, interface
        
    except Exception as e:
        logger.error(f"❌ Failed to create application: {e}")
        return None, None


def main():
    """Main application entry point."""
    logger.info("=" * 60)
    logger.info("πŸš€ Starting Phi-3.5-MoE Expert Assistant")
    logger.info("=" * 60)
    
    try:
        # Create application
        model_loader, interface = create_application()
        
        if interface is None:
            logger.error("❌ Failed to create application")
            sys.exit(1)
        
        # Launch interface
        logger.info("🌐 Launching web interface...")
        interface.launch(
            server_name="0.0.0.0",
            server_port=7860,
            share=False,
            show_error=True
        )
        
    except KeyboardInterrupt:
        logger.info("πŸ‘‹ Application stopped by user")
    except Exception as e:
        logger.error(f"❌ Application failed: {e}")
        sys.exit(1)
    finally:
        logger.info("🏁 Application shutdown complete")


if __name__ == "__main__":
    main()