File size: 6,714 Bytes
222db43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# app/main.py
import os
import logging
import argparse
import yaml
from typing import Dict, Any

# Import utility classes
from utils.token_manager import TokenManager
from utils.cache_manager import CacheManager
from utils.metrics_calculator import MetricsCalculator

# Import model managers
from models.text_models import TextModelManager
from models.image_models import ImageModelManager
from models.summary_models import SummaryModelManager

# Import agents
from agents.text_analysis_agent import TextAnalysisAgent
from agents.image_processing_agent import ImageProcessingAgent
from agents.report_generation_agent import ReportGeneratorAgent
from agents.metrics_agent import MetricsAgent
from agents.coordinator_agent import CoordinatorAgent

# Import application components
from app.orchestrator import Orchestrator
from app.data_manager import DataManager
from app.error_handler import ErrorHandler
from app.synchronizer import Synchronizer
from app.gradio_interface import GradioInterface

def load_config(config_path: str) -> Dict[str, Any]:
    """Load configuration from YAML file."""
    try:
        with open(config_path, 'r') as f:
            config = yaml.safe_load(f)
        return config
    except Exception as e:
        logging.error(f"Error loading configuration: {e}")
        return {}

def setup_logging(log_level: str = "INFO"):
    """Set up logging configuration."""
    numeric_level = getattr(logging, log_level.upper(), None)
    if not isinstance(numeric_level, int):
        numeric_level = logging.INFO
        
    logging.basicConfig(
        level=numeric_level,
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        handlers=[
            logging.StreamHandler(),
            logging.FileHandler("app.log")
        ]
    )

def build_application(config: Dict[str, Any]):
    """Build the application components based on configuration."""
    # Create utility instances
    token_manager = TokenManager(config.get("token_manager", {}))
    cache_manager = CacheManager(config.get("cache_manager", {}))
    metrics_calculator = MetricsCalculator(config.get("metrics_calculator", {}))
    
    # Create model managers
    text_model_manager = TextModelManager(
        token_manager=token_manager,
        cache_manager=cache_manager,
        metrics_calculator=metrics_calculator
    )
    
    image_model_manager = ImageModelManager(
        token_manager=token_manager,
        cache_manager=cache_manager,
        metrics_calculator=metrics_calculator
    )
    
    summary_model_manager = SummaryModelManager(
        token_manager=token_manager,
        cache_manager=cache_manager,
        metrics_calculator=metrics_calculator
    )
    
    # Create agents
    text_analysis_agent = TextAnalysisAgent(
        text_model_manager=text_model_manager,
        summary_model_manager=summary_model_manager,
        token_manager=token_manager,
        cache_manager=cache_manager,
        metrics_calculator=metrics_calculator
    )
    
    image_processing_agent = ImageProcessingAgent(
        image_model_manager=image_model_manager,
        text_model_manager=text_model_manager,
        token_manager=token_manager,
        cache_manager=cache_manager,
        metrics_calculator=metrics_calculator
    )
    
    report_generation_agent = ReportGeneratorAgent(
        summary_model_manager=summary_model_manager,
        token_manager=token_manager,
        cache_manager=cache_manager,
        metrics_calculator=metrics_calculator
    )
    
    metrics_agent = MetricsAgent(
        metrics_calculator=metrics_calculator,
        token_manager=token_manager,
        cache_manager=cache_manager
    )
    
    # Create data manager
    data_manager = DataManager(cache_manager=cache_manager)
    
    # Create coordinator agent
    coordinator_agent = CoordinatorAgent(
        text_analysis_agent=text_analysis_agent,
        image_processing_agent=image_processing_agent,
        report_generation_agent=report_generation_agent,
        metrics_agent=metrics_agent,
        token_manager=token_manager,
        cache_manager=cache_manager,
        metrics_calculator=metrics_calculator
    )
    
    # Create orchestrator
    orchestrator = Orchestrator(
        coordinator_agent=coordinator_agent,
        text_analysis_agent=text_analysis_agent,  # Add this
        image_processing_agent=image_processing_agent,  # Add this
        report_generation_agent=report_generation_agent,  # Add this
        metrics_agent=metrics_agent,  # Add this
        text_model_manager=text_model_manager,
        image_model_manager=image_model_manager,
        summary_model_manager=summary_model_manager,
        token_manager=token_manager,
        cache_manager=cache_manager,
        metrics_calculator=metrics_calculator
    )
    
    # Create Gradio interface
    interface = GradioInterface(orchestrator=orchestrator)
    
    return {
        "token_manager": token_manager,
        "cache_manager": cache_manager,
        "metrics_calculator": metrics_calculator,
        "text_model_manager": text_model_manager,
        "image_model_manager": image_model_manager,
        "summary_model_manager": summary_model_manager,
        "text_analysis_agent": text_analysis_agent,
        "image_processing_agent": image_processing_agent,
        "report_generation_agent": report_generation_agent,
        "metrics_agent": metrics_agent,
        "data_manager": data_manager,
        "coordinator_agent": coordinator_agent,
        "orchestrator": orchestrator,
        "interface": interface
    }

def main():
    """Main entry point for the application."""
    # Parse command line arguments
    parser = argparse.ArgumentParser(description="Deep Dive Analysis with Sustainable AI")
    parser.add_argument("--config", type=str, default="config/config.yaml", help="Path to configuration file")
    parser.add_argument("--log-level", type=str, default="INFO", help="Logging level")
    parser.add_argument("--port", type=int, default=7860, help="Port for Gradio interface")
    parser.add_argument("--share", action="store_true", help="Create a shareable link")
    args = parser.parse_args()
    
    # Setup logging
    setup_logging(args.log_level)
    
    # Load configuration
    config = load_config(args.config)
    
    # Build application
    app = build_application(config)
    
    # Launch interface
    try:
        app["interface"].launch(server_port=args.port, share=args.share)
    except KeyboardInterrupt:
        logging.info("Application shutdown requested")
    finally:
        # Cleanup
        app["interface"].cleanup()
        logging.info("Application shutdown complete")

if __name__ == "__main__":
    main()