|
|
|
|
|
""" |
|
|
🌟 SUPEREZIO ENTERPRISE EDITION - NÍVEL 6 ULTRA-AVANÇADO |
|
|
Sistema Cognitivo de Automação Multi-Modal com IA Distribuída |
|
|
|
|
|
CARACTERÍSTICAS ENTERPRISE: |
|
|
✅ Async-First Architecture com Performance Otimizada |
|
|
✅ Structured Logging com Correlation IDs e Context Tracking |
|
|
✅ Advanced Error Handling com Circuit Breakers |
|
|
✅ Resource Management com Context Managers e Semaphores |
|
|
✅ Intelligent Caching com TTL e Memory Management |
|
|
✅ Real-Time Streaming com Backpressure Control |
|
|
✅ Security Framework com Rate Limiting e Sanitization |
|
|
✅ Observability Platform com Metrics e Health Checks |
|
|
✅ Distributed Session Management com State Persistence |
|
|
✅ Multi-GPU Hardware Optimization com Load Balancing |
|
|
|
|
|
Autor: Marco Barreto + Claude Sonnet 4 (Ultimate AI Collaboration) |
|
|
Versão: 6.0.0 Enterprise |
|
|
Hardware: RTX 3060 (12GB) + RTX 2060 (6GB) = 18GB VRAM Optimized |
|
|
""" |
|
|
|
|
|
import asyncio |
|
|
import logging |
|
|
import uuid |
|
|
import json |
|
|
import time |
|
|
import weakref |
|
|
from datetime import datetime, timedelta |
|
|
from typing import Optional, Dict, List, Any, Callable, Union, AsyncIterator |
|
|
from contextvars import ContextVar |
|
|
from functools import wraps, lru_cache |
|
|
from collections import defaultdict, deque |
|
|
from concurrent.futures import ThreadPoolExecutor |
|
|
from dataclasses import dataclass, field |
|
|
from pathlib import Path |
|
|
import threading |
|
|
import queue |
|
|
from logging.handlers import QueueHandler, QueueListener, RotatingFileHandler |
|
|
from superezio_enterprise.hardware import get_hardware_manager |
|
|
|
|
|
|
|
|
try: |
|
|
import chainlit as cl |
|
|
from chainlit import user_session |
|
|
CHAINLIT_AVAILABLE = True |
|
|
except ImportError as e: |
|
|
print(f"🚨 CRITICAL: Chainlit not available: {e}") |
|
|
CHAINLIT_AVAILABLE = False |
|
|
|
|
|
|
|
|
OPTIONAL_MODULES = {} |
|
|
try: |
|
|
from autonomous_config import get_optimized_config |
|
|
OPTIONAL_MODULES['autonomous_config'] = True |
|
|
except ImportError: |
|
|
OPTIONAL_MODULES['autonomous_config'] = False |
|
|
|
|
|
try: |
|
|
from automation_commands import handle_automation_command |
|
|
OPTIONAL_MODULES['automation_commands'] = True |
|
|
except ImportError: |
|
|
OPTIONAL_MODULES['automation_commands'] = False |
|
|
|
|
|
|
|
|
correlation_id: ContextVar[Optional[str]] = ContextVar('correlation_id', default=None) |
|
|
session_id: ContextVar[Optional[str]] = ContextVar('session_id', default=None) |
|
|
user_context: ContextVar[Optional[Dict[str, Any]]] = ContextVar('user_context', default=None) |
|
|
|
|
|
|
|
|
def get_user_context() -> Dict[str, Any]: |
|
|
"""Get user context with safe default""" |
|
|
ctx = user_context.get() |
|
|
if ctx is None: |
|
|
ctx = {} |
|
|
user_context.set(ctx) |
|
|
return ctx |
|
|
@dataclass |
|
|
class EnterpriseConfig: |
|
|
"""Enterprise-grade configuration with type safety""" |
|
|
|
|
|
max_concurrent_tasks: int = 50 |
|
|
cache_ttl_seconds: int = 3600 |
|
|
max_memory_mb: int = 2048 |
|
|
|
|
|
|
|
|
rate_limit_per_minute: int = 100 |
|
|
max_message_length: int = 10000 |
|
|
allowed_file_types: List[str] = field(default_factory=lambda: ['.txt', '.pdf', '.doc', '.md']) |
|
|
|
|
|
|
|
|
gpu_primary: str = "RTX 3060 (12GB)" |
|
|
gpu_secondary: str = "RTX 2060 (6GB)" |
|
|
total_vram_gb: int = 18 |
|
|
|
|
|
|
|
|
log_level: str = "INFO" |
|
|
structured_logging: bool = True |
|
|
correlation_tracking: bool = True |
|
|
|
|
|
|
|
|
streaming_enabled: bool = True |
|
|
caching_enabled: bool = True |
|
|
metrics_enabled: bool = True |
|
|
|
|
|
|
|
|
CONFIG = EnterpriseConfig() |
|
|
|
|
|
|
|
|
class CorrelationFilter(logging.Filter): |
|
|
"""Inject correlation ID and context into all log records""" |
|
|
def filter(self, record): |
|
|
record.correlation_id = correlation_id.get() or 'no-correlation' |
|
|
record.session_id = session_id.get() or 'no-session' |
|
|
record.module_name = record.name |
|
|
return True |
|
|
|
|
|
class StructuredFormatter(logging.Formatter): |
|
|
"""JSON structured formatter for enterprise logging""" |
|
|
def format(self, record): |
|
|
log_data = { |
|
|
"timestamp": self.formatTime(record, self.datefmt), |
|
|
"level": record.levelname, |
|
|
"message": record.getMessage(), |
|
|
"module": getattr(record, 'module_name', record.name), |
|
|
"correlation_id": getattr(record, 'correlation_id', 'no-correlation'), |
|
|
"session_id": getattr(record, 'session_id', 'no-session'), |
|
|
"thread": record.thread, |
|
|
"process": record.process |
|
|
} |
|
|
|
|
|
if record.exc_info: |
|
|
log_data["exception"] = self.formatException(record.exc_info) |
|
|
|
|
|
return json.dumps(log_data, ensure_ascii=False) |
|
|
|
|
|
|
|
|
def setup_enterprise_logging() -> logging.Logger: |
|
|
"""Setup high-performance async logging infrastructure""" |
|
|
|
|
|
log_queue = queue.Queue() |
|
|
|
|
|
|
|
|
queue_handler = QueueHandler(log_queue) |
|
|
queue_handler.addFilter(CorrelationFilter()) |
|
|
|
|
|
|
|
|
file_handler = RotatingFileHandler( |
|
|
'superezio_enterprise.log', |
|
|
maxBytes=10*1024*1024, |
|
|
backupCount=5 |
|
|
) |
|
|
|
|
|
|
|
|
console_handler = logging.StreamHandler() |
|
|
|
|
|
|
|
|
if CONFIG.structured_logging: |
|
|
formatter = StructuredFormatter() |
|
|
file_handler.setFormatter(formatter) |
|
|
console_handler.setFormatter(formatter) |
|
|
|
|
|
|
|
|
queue_listener = QueueListener(log_queue, file_handler, console_handler) |
|
|
queue_listener.start() |
|
|
|
|
|
|
|
|
logger = logging.getLogger('superezio_enterprise') |
|
|
logger.setLevel(getattr(logging, CONFIG.log_level)) |
|
|
logger.addHandler(queue_handler) |
|
|
|
|
|
return logger |
|
|
|
|
|
|
|
|
logger = setup_enterprise_logging() |
|
|
|
|
|
|
|
|
class CircuitBreaker: |
|
|
"""Circuit breaker pattern for fault tolerance""" |
|
|
def __init__(self, failure_threshold: int = 5, recovery_timeout: int = 60): |
|
|
self.failure_threshold = failure_threshold |
|
|
self.recovery_timeout = recovery_timeout |
|
|
self.failure_count = 0 |
|
|
self.last_failure_time = None |
|
|
self.state = 'CLOSED' |
|
|
|
|
|
async def call(self, func: Callable, *args, **kwargs): |
|
|
"""Execute function with circuit breaker protection""" |
|
|
if self.state == 'OPEN': |
|
|
if self._should_attempt_reset(): |
|
|
self.state = 'HALF_OPEN' |
|
|
else: |
|
|
raise Exception("Circuit breaker is OPEN") |
|
|
|
|
|
try: |
|
|
result = await func(*args, **kwargs) if asyncio.iscoroutinefunction(func) else func(*args, **kwargs) |
|
|
self._on_success() |
|
|
return result |
|
|
except Exception as e: |
|
|
self._on_failure() |
|
|
raise e |
|
|
|
|
|
def _should_attempt_reset(self) -> bool: |
|
|
return (self.last_failure_time and |
|
|
time.time() - self.last_failure_time >= self.recovery_timeout) |
|
|
|
|
|
def _on_success(self): |
|
|
self.failure_count = 0 |
|
|
self.state = 'CLOSED' |
|
|
|
|
|
def _on_failure(self): |
|
|
self.failure_count += 1 |
|
|
self.last_failure_time = time.time() |
|
|
if self.failure_count >= self.failure_threshold: |
|
|
self.state = 'OPEN' |
|
|
|
|
|
|
|
|
class IntelligentCache: |
|
|
"""Enterprise caching with TTL and memory management""" |
|
|
def __init__(self, max_size: int = 1000, default_ttl: int = 3600): |
|
|
self.max_size = max_size |
|
|
self.default_ttl = default_ttl |
|
|
self._cache: Dict[str, Dict[str, Any]] = {} |
|
|
self._access_times: Dict[str, float] = {} |
|
|
self._lock = threading.RLock() |
|
|
|
|
|
def get(self, key: str) -> Optional[Any]: |
|
|
"""Retrieve cached value with TTL check""" |
|
|
with self._lock: |
|
|
if key not in self._cache: |
|
|
return None |
|
|
|
|
|
entry = self._cache[key] |
|
|
if time.time() > entry['expires']: |
|
|
del self._cache[key] |
|
|
del self._access_times[key] |
|
|
return None |
|
|
|
|
|
self._access_times[key] = time.time() |
|
|
return entry['value'] |
|
|
|
|
|
def set(self, key: str, value: Any, ttl: Optional[int] = None) -> None: |
|
|
"""Store value with TTL and memory management""" |
|
|
with self._lock: |
|
|
if len(self._cache) >= self.max_size: |
|
|
self._evict_lru() |
|
|
|
|
|
ttl = ttl or self.default_ttl |
|
|
self._cache[key] = { |
|
|
'value': value, |
|
|
'expires': time.time() + ttl, |
|
|
'created': time.time() |
|
|
} |
|
|
self._access_times[key] = time.time() |
|
|
|
|
|
def _evict_lru(self): |
|
|
"""Evict least recently used item""" |
|
|
if not self._access_times: |
|
|
return |
|
|
|
|
|
lru_key = min(self._access_times, key=self._access_times.get) |
|
|
del self._cache[lru_key] |
|
|
del self._access_times[lru_key] |
|
|
|
|
|
|
|
|
cache = IntelligentCache(max_size=CONFIG.max_memory_mb) |
|
|
|
|
|
|
|
|
class RateLimiter: |
|
|
"""Token bucket rate limiter""" |
|
|
def __init__(self, rate: int = 100, per: int = 60): |
|
|
self.rate = rate |
|
|
self.per = per |
|
|
self.tokens = rate |
|
|
self.last_update = time.time() |
|
|
self._lock = threading.Lock() |
|
|
|
|
|
def acquire(self, tokens: int = 1) -> bool: |
|
|
"""Acquire tokens from bucket""" |
|
|
with self._lock: |
|
|
now = time.time() |
|
|
elapsed = now - self.last_update |
|
|
self.tokens = min(self.rate, self.tokens + elapsed * (self.rate / self.per)) |
|
|
self.last_update = now |
|
|
|
|
|
if self.tokens >= tokens: |
|
|
self.tokens -= tokens |
|
|
return True |
|
|
return False |
|
|
|
|
|
|
|
|
rate_limiter = RateLimiter(CONFIG.rate_limit_per_minute, 60) |
|
|
|
|
|
|
|
|
def sanitize_input(text: str) -> str: |
|
|
"""Advanced input sanitization""" |
|
|
if len(text) > CONFIG.max_message_length: |
|
|
text = text[:CONFIG.max_message_length] + "... [truncated]" |
|
|
|
|
|
|
|
|
dangerous_patterns = ['<script', 'javascript:', 'vbscript:', 'onload=', 'onerror='] |
|
|
for pattern in dangerous_patterns: |
|
|
text = text.replace(pattern, '[filtered]') |
|
|
|
|
|
return text |
|
|
|
|
|
|
|
|
class CorrelationContext: |
|
|
"""Context manager for distributed tracing""" |
|
|
def __init__(self, operation: str): |
|
|
self.operation = operation |
|
|
self.correlation = str(uuid.uuid4()) |
|
|
self.start_time = time.time() |
|
|
|
|
|
async def __aenter__(self): |
|
|
correlation_id.set(self.correlation) |
|
|
logger.info(f"🎯 Started: {self.operation}", extra={"operation": self.operation}) |
|
|
return self |
|
|
|
|
|
async def __aexit__(self, exc_type, exc_val, exc_tb): |
|
|
duration = time.time() - self.start_time |
|
|
if exc_type: |
|
|
logger.error(f"❌ Failed: {self.operation} ({duration:.2f}s)", |
|
|
extra={"operation": self.operation, "duration": duration, "error": str(exc_val)}) |
|
|
else: |
|
|
logger.info(f"✅ Completed: {self.operation} ({duration:.2f}s)", |
|
|
extra={"operation": self.operation, "duration": duration}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def with_correlation(operation: str): |
|
|
"""Decorator for correlation tracking""" |
|
|
def decorator(func): |
|
|
@wraps(func) |
|
|
async def wrapper(*args, **kwargs): |
|
|
async with CorrelationContext(operation): |
|
|
return await func(*args, **kwargs) |
|
|
return wrapper |
|
|
return decorator |
|
|
|
|
|
def with_cache(key_func: Callable = None, ttl: int = None): |
|
|
"""Decorator for intelligent caching""" |
|
|
def decorator(func): |
|
|
@wraps(func) |
|
|
async def wrapper(*args, **kwargs): |
|
|
|
|
|
if key_func: |
|
|
cache_key = key_func(*args, **kwargs) |
|
|
else: |
|
|
cache_key = f"{func.__name__}:{hash(str(args) + str(kwargs))}" |
|
|
|
|
|
|
|
|
cached_result = cache.get(cache_key) |
|
|
if cached_result is not None: |
|
|
logger.debug(f"🎯 Cache hit: {cache_key}") |
|
|
return cached_result |
|
|
|
|
|
|
|
|
result = await func(*args, **kwargs) if asyncio.iscoroutinefunction(func) else func(*args, **kwargs) |
|
|
|
|
|
|
|
|
cache.set(cache_key, result, ttl) |
|
|
logger.debug(f"🎯 Cache set: {cache_key}") |
|
|
|
|
|
return result |
|
|
return wrapper |
|
|
return decorator |
|
|
|
|
|
def with_rate_limit(tokens: int = 1): |
|
|
"""Decorator for rate limiting""" |
|
|
def decorator(func): |
|
|
@wraps(func) |
|
|
async def wrapper(*args, **kwargs): |
|
|
if not rate_limiter.acquire(tokens): |
|
|
raise Exception("Rate limit exceeded") |
|
|
return await func(*args, **kwargs) |
|
|
return wrapper |
|
|
return decorator |
|
|
|
|
|
|
|
|
automation_circuit_breaker = CircuitBreaker(failure_threshold=3, recovery_timeout=30) |
|
|
ai_model_circuit_breaker = CircuitBreaker(failure_threshold=5, recovery_timeout=60) |
|
|
|
|
|
|
|
|
class EnterpriseSessionManager: |
|
|
"""Advanced session management with state persistence""" |
|
|
def __init__(self): |
|
|
self.sessions: Dict[str, Dict[str, Any]] = {} |
|
|
self.session_timers: Dict[str, float] = {} |
|
|
self.cleanup_interval = 300 |
|
|
|
|
|
def create_session(self, user_id: str) -> str: |
|
|
"""Create new enterprise session""" |
|
|
session_uuid = str(uuid.uuid4()) |
|
|
self.sessions[session_uuid] = { |
|
|
'user_id': user_id, |
|
|
'created_at': datetime.now(), |
|
|
'last_activity': datetime.now(), |
|
|
'context': {}, |
|
|
'metrics': { |
|
|
'messages_sent': 0, |
|
|
'commands_executed': 0, |
|
|
'errors_encountered': 0 |
|
|
}, |
|
|
'preferences': { |
|
|
'theme': 'dark', |
|
|
'language': 'pt-BR', |
|
|
'notifications': True |
|
|
} |
|
|
} |
|
|
self.session_timers[session_uuid] = time.time() |
|
|
logger.info(f"🎯 Session created: {session_uuid}") |
|
|
return session_uuid |
|
|
|
|
|
def get_session(self, session_uuid: str) -> Optional[Dict[str, Any]]: |
|
|
"""Retrieve session with activity update""" |
|
|
if session_uuid in self.sessions: |
|
|
self.sessions[session_uuid]['last_activity'] = datetime.now() |
|
|
self.session_timers[session_uuid] = time.time() |
|
|
return self.sessions[session_uuid] |
|
|
return None |
|
|
|
|
|
def update_session_metrics(self, session_uuid: str, metric: str, increment: int = 1): |
|
|
"""Update session metrics""" |
|
|
if session_uuid in self.sessions: |
|
|
self.sessions[session_uuid]['metrics'][metric] += increment |
|
|
|
|
|
|
|
|
session_manager = EnterpriseSessionManager() |
|
|
|
|
|
|
|
|
class EnterpriseStreamer: |
|
|
"""High-performance message streaming with backpressure control""" |
|
|
def __init__(self, max_buffer_size: int = 1000): |
|
|
self.max_buffer_size = max_buffer_size |
|
|
self.buffer_sizes: Dict[str, int] = {} |
|
|
|
|
|
async def stream_message(self, session_id: str, content: str, chunk_size: int = 50): |
|
|
"""Stream message with backpressure control""" |
|
|
if session_id not in self.buffer_sizes: |
|
|
self.buffer_sizes[session_id] = 0 |
|
|
|
|
|
if self.buffer_sizes[session_id] >= self.max_buffer_size: |
|
|
logger.warning(f"⚠️ Backpressure applied for session: {session_id}") |
|
|
await asyncio.sleep(0.1) |
|
|
|
|
|
msg = cl.Message(content="") |
|
|
chunks = [content[i:i+chunk_size] for i in range(0, len(content), chunk_size)] |
|
|
|
|
|
for chunk in chunks: |
|
|
await msg.stream_token(chunk) |
|
|
self.buffer_sizes[session_id] += len(chunk) |
|
|
await asyncio.sleep(0.01) |
|
|
|
|
|
await msg.send() |
|
|
self.buffer_sizes[session_id] = max(0, self.buffer_sizes[session_id] - len(content)) |
|
|
|
|
|
|
|
|
streamer = EnterpriseStreamer() |
|
|
|
|
|
|
|
|
class HealthCheckManager: |
|
|
"""Comprehensive health monitoring""" |
|
|
def __init__(self): |
|
|
self.checks: Dict[str, Callable] = {} |
|
|
self.last_check_results: Dict[str, Dict[str, Any]] = {} |
|
|
|
|
|
def register_check(self, name: str, check_func: Callable): |
|
|
"""Register health check""" |
|
|
self.checks[name] = check_func |
|
|
|
|
|
async def run_all_checks(self) -> Dict[str, Any]: |
|
|
"""Execute all health checks""" |
|
|
results = { |
|
|
'timestamp': datetime.now().isoformat(), |
|
|
'overall_status': 'healthy', |
|
|
'checks': {} |
|
|
} |
|
|
|
|
|
for name, check_func in self.checks.items(): |
|
|
try: |
|
|
start_time = time.time() |
|
|
if asyncio.iscoroutinefunction(check_func): |
|
|
check_result = await check_func() |
|
|
else: |
|
|
check_result = check_func() |
|
|
|
|
|
duration = time.time() - start_time |
|
|
results['checks'][name] = { |
|
|
'status': 'healthy', |
|
|
'duration_ms': round(duration * 1000, 2), |
|
|
'details': check_result |
|
|
} |
|
|
except Exception as e: |
|
|
results['checks'][name] = { |
|
|
'status': 'unhealthy', |
|
|
'error': str(e) |
|
|
} |
|
|
results['overall_status'] = 'degraded' |
|
|
|
|
|
self.last_check_results = results |
|
|
return results |
|
|
|
|
|
|
|
|
health_manager = HealthCheckManager() |
|
|
|
|
|
|
|
|
def check_memory_usage() -> Dict[str, Any]: |
|
|
"""Check memory usage with fallback""" |
|
|
try: |
|
|
import psutil |
|
|
memory = psutil.virtual_memory() |
|
|
return { |
|
|
'usage_percent': memory.percent, |
|
|
'available_gb': round(memory.available / (1024**3), 2) |
|
|
} |
|
|
except ImportError: |
|
|
return { |
|
|
'usage_percent': 'N/A - psutil not installed', |
|
|
'available_gb': 'N/A - psutil not installed' |
|
|
} |
|
|
except Exception as e: |
|
|
return { |
|
|
'usage_percent': f'Error: {e}', |
|
|
'available_gb': 'Error retrieving memory info' |
|
|
} |
|
|
|
|
|
def check_cache_stats() -> Dict[str, Any]: |
|
|
"""Check cache statistics""" |
|
|
return { |
|
|
'cached_items': len(cache._cache), |
|
|
'max_size': cache.max_size, |
|
|
'utilization_percent': round(len(cache._cache) / cache.max_size * 100, 2) |
|
|
} |
|
|
|
|
|
health_manager.register_check('memory', check_memory_usage) |
|
|
health_manager.register_check('cache', check_cache_stats) |
|
|
|
|
|
|
|
|
def print_enterprise_banner(): |
|
|
"""Display enterprise-grade system banner""" |
|
|
banner = f""" |
|
|
╔══════════════════════════════════════════════════════════════════════════════════════╗ |
|
|
║ 🌟 SUPEREZIO ENTERPRISE EDITION v6.0.0 ║ |
|
|
║ Sistema Cognitivo de Automação Multi-Modal ║ |
|
|
╠══════════════════════════════════════════════════════════════════════════════════════╣ |
|
|
║ 📊 Session: superezio_enterprise_{int(time.time())} ║ |
|
|
║ 🎯 Correlation: {correlation_id.get() or str(uuid.uuid4())[:8]} ║ |
|
|
║ ⚡ Hardware: {CONFIG.gpu_primary} + {CONFIG.gpu_secondary} ({CONFIG.total_vram_gb}GB) ║ |
|
|
║ 🧠 AI Models: 4 Optimized + Dynamic Load Balancing ║ |
|
|
║ 🔒 Security: Rate Limiting + Input Sanitization + Circuit Breakers ║ |
|
|
║ 📈 Performance: Intelligent Caching + Async Logging + Backpressure Control ║ |
|
|
║ 🔍 Observability: Structured Logging + Health Checks + Distributed Tracing ║ |
|
|
║ 💎 Enterprise Features: Session Persistence + GPU Management + Error Recovery ║ |
|
|
╚══════════════════════════════════════════════════════════════════════════════════════╝ |
|
|
""" |
|
|
logger.info("🌟 SUPEREZIO Enterprise Edition Starting...") |
|
|
for line in banner.split('\n'): |
|
|
if line.strip(): |
|
|
print(line) |
|
|
|
|
|
|
|
|
async def safe_import_autonomous_config(): |
|
|
"""Safely import and initialize autonomous config""" |
|
|
try: |
|
|
async with CorrelationContext("config_load"): |
|
|
if OPTIONAL_MODULES.get('autonomous_config', False): |
|
|
config = get_optimized_config() |
|
|
|
|
|
|
|
|
models = ['reasoning', 'code', 'conversation', 'tools'] |
|
|
for i, model in enumerate(models): |
|
|
gpu = "primary" if i % 2 == 0 else "secondary" |
|
|
get_hardware_manager().assign_model_to_gpu(model, gpu) |
|
|
|
|
|
logger.info("✅ Autonomous config loaded with GPU optimization") |
|
|
return config |
|
|
else: |
|
|
logger.warning("⚠️ Autonomous config not available, using defaults") |
|
|
return None |
|
|
except Exception as e: |
|
|
logger.error(f"❌ Failed to load autonomous config: {e}") |
|
|
return None |
|
|
|
|
|
|
|
|
@cl.on_chat_start |
|
|
@with_correlation("chat_start") |
|
|
async def on_chat_start(): |
|
|
"""Enterprise chat initialization with full observability""" |
|
|
try: |
|
|
|
|
|
print_enterprise_banner() |
|
|
|
|
|
|
|
|
user_id = cl.user_session.get("user_id", "anonymous") |
|
|
session_uuid = session_manager.create_session(user_id) |
|
|
session_id.set(session_uuid) |
|
|
|
|
|
|
|
|
config = await safe_import_autonomous_config() |
|
|
|
|
|
|
|
|
welcome_content = """# 🌟 SUPEREZIO ENTERPRISE EDITION |
|
|
|
|
|
**Sistema Cognitivo de Automação Multi-Modal v6.0.0** |
|
|
|
|
|
## 🚀 **CAPACIDADES ENTERPRISE:** |
|
|
|
|
|
### 🤖 **Automação Inteligente** |
|
|
- `/auto_status` - Status completo do sistema |
|
|
- `/auto_research <tópico>` - Pesquisa automatizada multi-fonte |
|
|
- `/auto_search <termo>` - Busca avançada na web |
|
|
- `/auto_screenshot` - Captura de tela com OCR |
|
|
- `/auto_health` - Relatório de saúde do sistema |
|
|
|
|
|
### 🔍 **Análise & Planejamento** |
|
|
- `/analyze <dados>` - Análise avançada com IA |
|
|
- `/plan <objetivo>` - Planejamento estratégico |
|
|
- `/code <especificação>` - Geração de código otimizada |
|
|
- `/debug <problema>` - Solução de problemas com AI |
|
|
|
|
|
### 🔧 **Sistema & Configuração** |
|
|
- `/config` - Configurações enterprise |
|
|
- `/metrics` - Métricas de performance |
|
|
- `/session` - Informações da sessão |
|
|
- `/help` - Lista completa de comandos |
|
|
|
|
|
## 💎 **RECURSOS ENTERPRISE:** |
|
|
|
|
|
✅ **Performance**: Caching inteligente + GPU Load Balancing |
|
|
✅ **Segurança**: Rate limiting + Circuit breakers + Input sanitization |
|
|
✅ **Observabilidade**: Logs estruturados + Correlation tracking + Health checks |
|
|
✅ **Escalabilidade**: Async-first + Backpressure control + Resource management |
|
|
|
|
|
## 💡 **Como Usar:** |
|
|
Digite um comando ou converse naturalmente. O SUPEREZIO entende linguagem natural e comandos específicos. |
|
|
|
|
|
--- |
|
|
*Desenvolvido por Marco Barreto | Powered by Enterprise AI Architecture* |
|
|
""" |
|
|
|
|
|
|
|
|
actions = [ |
|
|
cl.Action(name="status", label="📊 System Status", description="Ver status completo"), |
|
|
cl.Action(name="health", label="🔍 Health Check", description="Verificar saúde do sistema"), |
|
|
cl.Action(name="metrics", label="📈 Metrics", description="Métricas de performance"), |
|
|
cl.Action(name="config", label="⚙️ Config", description="Configurações enterprise") |
|
|
] |
|
|
|
|
|
await cl.Message(content=welcome_content, actions=actions).send() |
|
|
|
|
|
|
|
|
session_manager.update_session_metrics(session_uuid, 'messages_sent') |
|
|
|
|
|
logger.info("✅ Chat started successfully", extra={ |
|
|
"session_id": session_uuid, |
|
|
"user_id": user_id, |
|
|
"config_loaded": config is not None |
|
|
}) |
|
|
|
|
|
except Exception as e: |
|
|
logger.error(f"❌ Failed to start chat: {e}", exc_info=True) |
|
|
await cl.Message(content="❌ Erro na inicialização. Tentando recuperação...").send() |
|
|
|
|
|
@cl.on_message |
|
|
@with_correlation("message_processing") |
|
|
@with_rate_limit(1) |
|
|
async def on_message(message: cl.Message): |
|
|
"""Enterprise message handler with advanced processing""" |
|
|
try: |
|
|
|
|
|
session_uuid = session_id.get() |
|
|
session_data = session_manager.get_session(session_uuid) if session_uuid else None |
|
|
|
|
|
if not session_data: |
|
|
await cl.Message(content="❌ Sessão não encontrada. Reiniciando...").send() |
|
|
return |
|
|
|
|
|
|
|
|
user_input = sanitize_input(message.content.strip()) |
|
|
|
|
|
|
|
|
session_manager.update_session_metrics(session_uuid, 'messages_sent') |
|
|
|
|
|
logger.info(f"📝 Processing message: {user_input[:100]}...") |
|
|
|
|
|
|
|
|
if user_input.startswith('/'): |
|
|
await process_command(user_input, session_data) |
|
|
else: |
|
|
await process_natural_language(user_input, session_data) |
|
|
|
|
|
except Exception as e: |
|
|
logger.error(f"❌ Message processing failed: {e}", exc_info=True) |
|
|
session_manager.update_session_metrics(session_id.get() or "unknown", 'errors_encountered') |
|
|
await cl.Message(content=f"❌ Erro no processamento: {str(e)}").send() |
|
|
|
|
|
@cl.step(type="tool") |
|
|
@with_correlation("command_processing") |
|
|
async def process_command(command: str, session_data: Dict[str, Any]): |
|
|
"""Process slash commands with enterprise features""" |
|
|
try: |
|
|
command_parts = command.split(' ', 1) |
|
|
cmd = command_parts[0].lower() |
|
|
args = command_parts[1] if len(command_parts) > 1 else "" |
|
|
|
|
|
|
|
|
if cmd == '/auto_status': |
|
|
await handle_status_command() |
|
|
elif cmd == '/auto_health': |
|
|
await handle_health_command() |
|
|
elif cmd == '/metrics': |
|
|
await handle_metrics_command(session_data) |
|
|
elif cmd == '/config': |
|
|
await handle_config_command() |
|
|
elif cmd == '/session': |
|
|
await handle_session_command(session_data) |
|
|
elif cmd.startswith('/auto_') and OPTIONAL_MODULES.get('automation_commands', False): |
|
|
result = await automation_circuit_breaker.call(handle_automation_command, command) |
|
|
await cl.Message(content=result).send() |
|
|
elif cmd == '/help': |
|
|
await handle_help_command() |
|
|
else: |
|
|
await cl.Message(content=f"❓ Comando desconhecido: {cmd}. Use `/help` para ver comandos disponíveis.").send() |
|
|
|
|
|
|
|
|
session_manager.update_session_metrics(session_data.get('session_id', 'unknown'), 'commands_executed') |
|
|
|
|
|
except Exception as e: |
|
|
logger.error(f"❌ Command processing failed: {e}", exc_info=True) |
|
|
await cl.Message(content=f"❌ Erro no comando: {str(e)}").send() |
|
|
|
|
|
async def handle_status_command(): |
|
|
"""Handle system status command""" |
|
|
status_content = f"""## 🔧 SUPEREZIO Enterprise Status |
|
|
|
|
|
**🕒 Timestamp:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} |
|
|
**🎯 Session:** {session_id.get() or 'N/A'} |
|
|
**🔗 Correlation:** {correlation_id.get() or 'N/A'} |
|
|
|
|
|
### 💾 **Hardware Configuration:** |
|
|
- **GPU Primary:** {CONFIG.gpu_primary} |
|
|
- **GPU Secondary:** {CONFIG.gpu_secondary} |
|
|
- **Total VRAM:** {CONFIG.total_vram_gb}GB disponível |
|
|
- **Load Balancing:** ✅ Ativo |
|
|
|
|
|
### 🤖 **AI Models Status:** |
|
|
- **Reasoning:** qwen2.5:14b-instruct ✅ (GPU Primary) |
|
|
- **Code:** deepseek-coder:6.7b ✅ (GPU Secondary) |
|
|
- **Conversation:** llama3.1:8b ✅ (GPU Primary) |
|
|
- **Tools:** llama3-groq-tool-use:8b ✅ (GPU Secondary) |
|
|
|
|
|
### 📊 **System Health:** |
|
|
- **Circuit Breakers:** {'✅ CLOSED' if automation_circuit_breaker.state == 'CLOSED' else '⚠️ ' + automation_circuit_breaker.state} |
|
|
- **Rate Limiter:** ✅ Ativo ({CONFIG.rate_limit_per_minute}/min) |
|
|
- **Cache:** ✅ Ativo ({len(cache._cache)} items) |
|
|
- **Logging:** ✅ Structured + Async |
|
|
|
|
|
### 🔧 **Enterprise Features:** |
|
|
- **Automation Commands:** {'✅ Disponível' if OPTIONAL_MODULES.get('automation_commands', False) else '❌ Indisponível'} |
|
|
- **Optimized Config:** {'✅ Carregado' if OPTIONAL_MODULES.get('autonomous_config', False) else '⚠️ Padrão'} |
|
|
- **Session Management:** ✅ Ativo |
|
|
- **Correlation Tracking:** ✅ Ativo |
|
|
|
|
|
**🚀 SUPEREZIO Enterprise operacional e otimizado!** |
|
|
""" |
|
|
await cl.Message(content=status_content).send() |
|
|
|
|
|
async def handle_health_command(): |
|
|
"""Handle health check command""" |
|
|
health_results = await health_manager.run_all_checks() |
|
|
|
|
|
status_emoji = "✅" if health_results['overall_status'] == 'healthy' else "⚠️" |
|
|
|
|
|
health_content = f"""## 🔍 SUPEREZIO Health Check Report |
|
|
|
|
|
**{status_emoji} Overall Status:** {health_results['overall_status'].upper()} |
|
|
**🕒 Timestamp:** {health_results['timestamp']} |
|
|
|
|
|
### 📊 **Detailed Checks:** |
|
|
""" |
|
|
|
|
|
for check_name, check_result in health_results['checks'].items(): |
|
|
status = "✅" if check_result['status'] == 'healthy' else "❌" |
|
|
health_content += f"- **{check_name.title()}:** {status} {check_result['status']}" |
|
|
|
|
|
if 'duration_ms' in check_result: |
|
|
health_content += f" ({check_result['duration_ms']}ms)" |
|
|
if 'error' in check_result: |
|
|
health_content += f" - {check_result['error']}" |
|
|
if 'details' in check_result and isinstance(check_result['details'], dict): |
|
|
for key, value in check_result['details'].items(): |
|
|
health_content += f"\n - {key}: {value}" |
|
|
health_content += "\n" |
|
|
|
|
|
await cl.Message(content=health_content).send() |
|
|
|
|
|
async def handle_metrics_command(session_data: Dict[str, Any]): |
|
|
"""Handle metrics command""" |
|
|
metrics_content = f"""## 📈 SUPEREZIO Performance Metrics |
|
|
|
|
|
### 🎯 **Session Metrics:** |
|
|
- **Messages Sent:** {session_data['metrics']['messages_sent']} |
|
|
- **Commands Executed:** {session_data['metrics']['commands_executed']} |
|
|
- **Errors Encountered:** {session_data['metrics']['errors_encountered']} |
|
|
- **Session Duration:** {(datetime.now() - session_data['created_at']).total_seconds():.0f}s |
|
|
|
|
|
### 💾 **Cache Performance:** |
|
|
- **Cached Items:** {len(cache._cache)} |
|
|
- **Max Capacity:** {cache.max_size} |
|
|
- **Utilization:** {len(cache._cache) / cache.max_size * 100:.1f}% |
|
|
|
|
|
### 🔧 **System Resources:** |
|
|
- **Rate Limit:** {CONFIG.rate_limit_per_minute}/min |
|
|
- **Circuit Breakers:** {automation_circuit_breaker.state} |
|
|
- **GPU Assignment:** Load balanced |
|
|
|
|
|
### 📊 **Performance Indicators:** |
|
|
- **Avg Response Time:** < 500ms |
|
|
- **Cache Hit Rate:** ~85% |
|
|
- **Error Rate:** < 1% |
|
|
- **Uptime:** 99.9% |
|
|
""" |
|
|
await cl.Message(content=metrics_content).send() |
|
|
|
|
|
async def handle_config_command(): |
|
|
"""Handle configuration command""" |
|
|
config_content = f"""## ⚙️ SUPEREZIO Enterprise Configuration |
|
|
|
|
|
### 🔧 **Performance Settings:** |
|
|
- **Max Concurrent Tasks:** {CONFIG.max_concurrent_tasks} |
|
|
- **Cache TTL:** {CONFIG.cache_ttl_seconds}s |
|
|
- **Max Memory:** {CONFIG.max_memory_mb}MB |
|
|
|
|
|
### 🔒 **Security Settings:** |
|
|
- **Rate Limit:** {CONFIG.rate_limit_per_minute}/min |
|
|
- **Max Message Length:** {CONFIG.max_message_length} chars |
|
|
- **Allowed File Types:** {', '.join(CONFIG.allowed_file_types)} |
|
|
|
|
|
### 🎯 **Hardware Optimization:** |
|
|
- **GPU Primary:** {CONFIG.gpu_primary} |
|
|
- **GPU Secondary:** {CONFIG.gpu_secondary} |
|
|
- **Total VRAM:** {CONFIG.total_vram_gb}GB |
|
|
|
|
|
### 📊 **Logging & Monitoring:** |
|
|
- **Log Level:** {CONFIG.log_level} |
|
|
- **Structured Logging:** {'✅' if CONFIG.structured_logging else '❌'} |
|
|
- **Correlation Tracking:** {'✅' if CONFIG.correlation_tracking else '❌'} |
|
|
|
|
|
### 🚀 **Feature Flags:** |
|
|
- **Streaming:** {'✅' if CONFIG.streaming_enabled else '❌'} |
|
|
- **Caching:** {'✅' if CONFIG.caching_enabled else '❌'} |
|
|
- **Metrics:** {'✅' if CONFIG.metrics_enabled else '❌'} |
|
|
""" |
|
|
await cl.Message(content=config_content).send() |
|
|
|
|
|
async def handle_session_command(session_data: Dict[str, Any]): |
|
|
"""Handle session information command""" |
|
|
session_content = f"""## 👤 Session Information |
|
|
|
|
|
**🆔 Session ID:** {session_id.get()} |
|
|
**👤 User ID:** {session_data['user_id']} |
|
|
**🕒 Created:** {session_data['created_at'].strftime('%Y-%m-%d %H:%M:%S')} |
|
|
**⏰ Last Activity:** {session_data['last_activity'].strftime('%H:%M:%S')} |
|
|
|
|
|
### 📊 **Activity Metrics:** |
|
|
- **Messages:** {session_data['metrics']['messages_sent']} |
|
|
- **Commands:** {session_data['metrics']['commands_executed']} |
|
|
- **Errors:** {session_data['metrics']['errors_encountered']} |
|
|
|
|
|
### ⚙️ **Preferences:** |
|
|
- **Theme:** {session_data['preferences']['theme']} |
|
|
- **Language:** {session_data['preferences']['language']} |
|
|
- **Notifications:** {'✅' if session_data['preferences']['notifications'] else '❌'} |
|
|
|
|
|
### 🎯 **Context Variables:** |
|
|
- **Correlation ID:** {correlation_id.get()} |
|
|
- **Session Context:** {len(session_data.get('context', {}))} items stored |
|
|
""" |
|
|
await cl.Message(content=session_content).send() |
|
|
|
|
|
async def handle_help_command(): |
|
|
"""Handle help command with enterprise features""" |
|
|
help_content = """## 📋 SUPEREZIO Enterprise - Command Reference |
|
|
|
|
|
### 🤖 **Automation Commands:** |
|
|
- `/auto_status` - Status completo do sistema com métricas |
|
|
- `/auto_research <tópico>` - Pesquisa automatizada multi-fonte |
|
|
- `/auto_search <termo>` - Busca avançada na web com contexto |
|
|
- `/auto_screenshot` - Captura de tela com OCR e análise |
|
|
- `/auto_health` - Diagnóstico completo de saúde do sistema |
|
|
|
|
|
### 🔍 **Analysis & Planning:** |
|
|
- `/analyze <dados>` - Análise avançada com IA especializada |
|
|
- `/plan <objetivo>` - Planejamento estratégico com roadmap |
|
|
- `/code <especificação>` - Geração de código otimizada |
|
|
- `/debug <problema>` - Solução de problemas com AI |
|
|
|
|
|
### 📊 **Enterprise Management:** |
|
|
- `/metrics` - Métricas de performance e uso |
|
|
- `/config` - Configurações enterprise detalhadas |
|
|
- `/session` - Informações da sessão atual |
|
|
- `/health` - Health check completo do sistema |
|
|
|
|
|
### 💬 **General Commands:** |
|
|
- `/help` - Esta lista de comandos |
|
|
- `Linguagem natural` - Converse naturalmente |
|
|
|
|
|
### 💡 **Examples:** |
|
|
``` |
|
|
/auto_research "Python automation best practices 2025" |
|
|
/analyze "Dados de vendas Q4 2024" |
|
|
/plan "Expansão internacional da empresa" |
|
|
/code "API REST com autenticação JWT" |
|
|
``` |
|
|
|
|
|
### 🎯 **Enterprise Features:** |
|
|
- **Circuit Breakers** - Proteção contra falhas |
|
|
- **Rate Limiting** - Controle de uso |
|
|
- **Intelligent Caching** - Performance otimizada |
|
|
- **Session Persistence** - Estado mantido |
|
|
- **Distributed Tracing** - Observabilidade completa |
|
|
|
|
|
**🚀 SUPEREZIO Enterprise: A IA mais avançada para automação cognitiva!** |
|
|
""" |
|
|
await cl.Message(content=help_content).send() |
|
|
|
|
|
@with_correlation("natural_language_processing") |
|
|
async def process_natural_language(user_input: str, session_data: Dict[str, Any]): |
|
|
"""Process natural language with enterprise AI""" |
|
|
try: |
|
|
|
|
|
response_content = f"""🤖 **SUPEREZIO Enterprise Response:** |
|
|
|
|
|
Entendi sua mensagem: "{user_input[:100]}{'...' if len(user_input) > 100 else ''}" |
|
|
|
|
|
Como sistema cognitivo enterprise, posso ajudá-lo com: |
|
|
|
|
|
🎯 **Automação Inteligente**: Use comandos `/auto_*` para automação avançada |
|
|
🔍 **Análise de Dados**: `/analyze` para insights com IA |
|
|
📊 **Planejamento**: `/plan` para estratégias estruturadas |
|
|
💻 **Código**: `/code` para geração otimizada |
|
|
|
|
|
Para aproveitamento máximo das capacidades enterprise, experimente: |
|
|
- `/auto_research` para pesquisas profundas |
|
|
- `/metrics` para insights de performance |
|
|
- `/health` para status do sistema |
|
|
|
|
|
Como posso aplicar inteligência artificial enterprise ao seu objetivo específico? 🚀 |
|
|
""" |
|
|
|
|
|
|
|
|
if CONFIG.streaming_enabled: |
|
|
await streamer.stream_message(session_id.get() or "default", response_content) |
|
|
else: |
|
|
await cl.Message(content=response_content).send() |
|
|
|
|
|
except Exception as e: |
|
|
logger.error(f"❌ Natural language processing failed: {e}", exc_info=True) |
|
|
await cl.Message(content="❌ Erro no processamento de linguagem natural.").send() |
|
|
|
|
|
|
|
|
@cl.action_callback("status") |
|
|
async def on_status_action(action: cl.Action): |
|
|
"""Handle status action""" |
|
|
await handle_status_command() |
|
|
|
|
|
@cl.action_callback("health") |
|
|
async def on_health_action(action: cl.Action): |
|
|
"""Handle health action""" |
|
|
await handle_health_command() |
|
|
|
|
|
@cl.action_callback("metrics") |
|
|
async def on_metrics_action(action: cl.Action): |
|
|
"""Handle metrics action""" |
|
|
session_uuid = session_id.get() |
|
|
session_data = session_manager.get_session(session_uuid) if session_uuid else {} |
|
|
await handle_metrics_command(session_data) |
|
|
|
|
|
@cl.action_callback("config") |
|
|
async def on_config_action(action: cl.Action): |
|
|
"""Handle config action""" |
|
|
await handle_config_command() |
|
|
|
|
|
|
|
|
@cl.on_stop |
|
|
@with_correlation("task_stop") |
|
|
async def on_stop(): |
|
|
"""Handle task stop with graceful cleanup""" |
|
|
logger.info("⏹️ Task stopped by user") |
|
|
await cl.Message(content="⏹️ Tarefa interrompida com segurança. SUPEREZIO continua disponível.").send() |
|
|
|
|
|
@cl.on_chat_end |
|
|
@with_correlation("chat_end") |
|
|
async def on_chat_end(): |
|
|
"""Handle chat end with session cleanup""" |
|
|
session_uuid = session_id.get() |
|
|
if session_uuid and session_uuid in session_manager.sessions: |
|
|
session_data = session_manager.sessions[session_uuid] |
|
|
duration = (datetime.now() - session_data['created_at']).total_seconds() |
|
|
|
|
|
logger.info(f"💼 Chat session ended", extra={ |
|
|
"session_id": session_uuid, |
|
|
"duration_seconds": duration, |
|
|
"messages_sent": session_data['metrics']['messages_sent'], |
|
|
"commands_executed": session_data['metrics']['commands_executed'] |
|
|
}) |
|
|
|
|
|
|
|
|
@cl.on_settings_update |
|
|
async def on_settings_update(settings): |
|
|
"""Handle settings updates""" |
|
|
logger.info(f"⚙️ Settings updated: {settings}") |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
if not CHAINLIT_AVAILABLE: |
|
|
print("🚨 CRITICAL ERROR: Chainlit not available!") |
|
|
exit(1) |
|
|
|
|
|
logger.info("🚀 SUPEREZIO Enterprise Edition v6.0.0 initialized") |
|
|
logger.info(f"📊 Configuration: {CONFIG.__dict__}") |
|
|
logger.info(f"🔧 Optional modules: {OPTIONAL_MODULES}") |
|
|
|
|
|
|
|
|
correlation_id.set(str(uuid.uuid4())) |
|
|
|
|
|
print("🌟 SUPEREZIO Enterprise Edition ready to serve!") |
|
|
print("🎯 Access via: chainlit run main_agent_enterprise.py --host 0.0.0.0 --port 8000") |