import sys import os import logging from typing import Optional from pathlib import Path # Add the current directory to Python path current_dir = Path(__file__).parent.absolute() sys.path.insert(0, str(current_dir)) # Import functional modules try: from main import main, validate_environment from audio_utils import validate_environment as validate_audio_env except ImportError as e: print(f"Error importing functional modules: {e}") print("Please ensure all required dependencies are installed.") sys.exit(1) # Configure logging def setup_logging(level: str = "INFO") -> logging.Logger: """Set up application logging.""" log_level = getattr(logging, level.upper(), logging.INFO) logging.basicConfig( level=log_level, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[ logging.StreamHandler(sys.stdout), logging.FileHandler('wisal_app.log', mode='a') ] ) return logging.getLogger('WisalApp') def check_dependencies() -> bool: """Check if all required dependencies are available.""" required_packages = [ 'gradio', 'numpy', 'soundfile', 'webrtcvad', 'fastrtc', 'google.genai', 'openai', 'weaviate', 'langdetect', 'requests', 'langchain', 'pypdf', 'docx', # python-docx imports as 'docx' 'dotenv' ] missing_packages = [] for package in required_packages: try: __import__(package.replace('-', '_').replace('.', '.')) except ImportError: missing_packages.append(package) if missing_packages: print(f"Missing required packages: {', '.join(missing_packages)}") print("Please install them using: pip install " + " ".join(missing_packages)) return False return True def check_environment_files() -> bool: """Check if required environment files exist.""" required_files = ['.env'] missing_files = [] for file_path in required_files: if not os.path.exists(file_path): missing_files.append(file_path) if missing_files: print(f"Missing required files: {', '.join(missing_files)}") print("Please create a .env file with the required API keys.") return False return True def print_startup_banner(): """Print application startup banner.""" banner = """ ╔═══════════════════════════════════════════════════════════════╗ ║ ║ ║ 🤖 Wisal: Autism AI Assistant ║ ║ ║ ║ Functional Programming Version ║ ║ Developed by Compumacy AI ║ ║ ║ ╚═══════════════════════════════════════════════════════════════╝ """ print(banner) def print_feature_overview(): """Print overview of available features.""" features = """ 🔧 Available Features: ├── 💬 Text-based chat with autism expertise ├── 🎤 Voice input with transcription ├── 🔊 Text-to-speech responses ├── 📄 Document upload and Q&A ├── 🔍 Web search integration ├── 🧠 RAG (Retrieval Augmented Generation) ├── 🎯 Functional programming architecture └── 🌐 Real-time voice chat (WebRTC) """ print(features) def run_pre_flight_checks() -> bool: """Run all pre-flight checks before starting the application.""" app_logger = setup_logging() print_startup_banner() app_logger.info("Starting pre-flight checks...") # Check 1: Dependencies app_logger.info("Checking dependencies...") if not check_dependencies(): app_logger.error("Dependency check failed") return False app_logger.info("✅ Dependencies check passed") # Check 2: Environment files app_logger.info("Checking environment files...") if not check_environment_files(): app_logger.error("Environment files check failed") return False app_logger.info("✅ Environment files check passed") # Check 3: Environment variables app_logger.info("Validating environment variables...") if not validate_environment(): app_logger.warning("⚠️ Some environment variables are missing - features may be limited") else: app_logger.info("✅ Environment variables validated") # Check 4: Audio environment app_logger.info("Checking audio environment...") if not validate_audio_env(): app_logger.warning("⚠️ Audio environment not fully configured - voice features may be limited") else: app_logger.info("✅ Audio environment validated") app_logger.info("Pre-flight checks completed") print_feature_overview() return True def handle_graceful_shutdown(): """Handle graceful application shutdown.""" print("\n🔄 Shutting down Wisal gracefully...") print("👋 Thank you for using Wisal!") def run_application(): """Run the main application with error handling.""" try: print("🚀 Starting Wisal application...") main() except KeyboardInterrupt: handle_graceful_shutdown() except Exception as e: print(f"❌ Application error: {e}") logging.error(f"Application error: {e}", exc_info=True) sys.exit(1) def main_runner(): """Main runner function.""" try: # Run pre-flight checks if not run_pre_flight_checks(): print("❌ Pre-flight checks failed. Cannot start application.") sys.exit(1) print("✅ All checks passed. Starting application...") # Run the application run_application() except Exception as e: print(f"❌ Fatal error during startup: {e}") logging.error(f"Fatal startup error: {e}", exc_info=True) sys.exit(1) if __name__ == "__main__": main_runner()