"""Точка входа — запуск сервера""" import sys import signal import logging from http.server import HTTPServer from .config import PORT, TOKEN, API_KEY, ensure_folders from .state import STATE from .internet_agent import INTERNET_AGENT from .routes import WebhookHandler from .process_manager import PROCESS_MANAGER def handle_shutdown(signum, frame): """Корректная остановка сервера""" logging.info("Shutdown signal received") PROCESS_MANAGER.cancel_all() STATE.save_history() logging.info("Server shutdown gracefully") def configure_logging(): """Настройка структурированного логирования""" logging.basicConfig( level=logging.INFO, format="[%(asctime)s] [%(levelname)s] [%(name)s.%(funcName)s:%(lineno)d] %(message)s", handlers=[ logging.StreamHandler() ] ) # Отключаем логирование urllib logging.getLogger("urllib3").setLevel(logging.WARNING) def main(): configure_logging() logger = logging.getLogger(__name__) logger.info("=" * 60) logger.info("🧠 PINKSKY v7.0 — МОДУЛЬНАЯ АРХИТЕКТУРА") logger.info("=" * 60) if not TOKEN: logger.critical("TELEGRAM_BOT_TOKEN не найден!") sys.exit(1) if not API_KEY: logger.warning("NVIDIA_API_KEY не найден") ensure_folders() logger.info(f"Загружено моделей: {len(STATE.models)}") logger.info(f"Загружено ролей: {len(STATE.roles)}") logger.info(f"Загружено кондукторов: {len(STATE.conductors)}") logger.info(f"Интернет: {'✅' if STATE.build_context.get('internet_access', True) else '❌'}") logger.info(f"Кэш поиска: {INTERNET_AGENT.get_cache_stats()}") STATE.current_mode = "chat" server = HTTPServer(("0.0.0.0", PORT), WebhookHandler) # Настройка обработчиков сигналов signal.signal(signal.SIGINT, handle_shutdown) signal.signal(signal.SIGTERM, handle_shutdown) logger.info(f"🚀 Сервер запущен на порту {PORT}") logger.info("=" * 60) try: server.serve_forever() except KeyboardInterrupt: handle_shutdown(None, None) finally: server.server_close() logger.info("Сервер остановлен") if __name__ == "__main__": main()