File size: 3,238 Bytes
ce82348
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# scripts/launch_ui.py

"""

Главный скрипт для запуска веб-интерфейса приложения.

Осуществляет настройку путей, предварительный разогрев кэша ОЗУ 

и старт сервера Gradio.

"""

import logging
import os
import sys
from pathlib import Path

from omegaconf import DictConfig, OmegaConf

# Добавляем корень проекта и папку src в sys.path для корректных импортов
current_file: Path = Path(__file__).resolve()
project_root: Path = current_file.parent.parent
if str(project_root) not in sys.path:
    sys.path.append(str(project_root))
src_dir: Path = project_root / "src"
if str(src_dir) not in sys.path:
    sys.path.append(str(src_dir))

from utils.logger import setup_logger
from layout_generator.pipeline import generate_layout_stream
from ui.layout import create_ui

# Настройка логгера
logger: logging.Logger = logging.getLogger(__name__)

def main() -> None:
    """Точка входа в приложение."""
    logger.info("🚀 Запуск процесса инициализации приложения...")

    # 1. Загрузка конфигурации (без устаревших параметров инвентаря)
    config_path: Path = project_root / "configs" / "layout_config.yaml"
    if config_path.exists():
        cfg: DictConfig = OmegaConf.load(config_path)
    else:
        logger.warning(f"⚠️ Конфигурация {config_path} не найдена. Используем значения по умолчанию.")
        cfg = OmegaConf.create({
            "layout": {"size_n": 10, "size_m": 10}
        })

    # 2. Разогрев кэша (холостой прогон генератора с фейковым графом)
    logger.info("⚙️ Подготовка сервера. Запуск тестовой сцены для инициализации ОЗУ...")
    try:
        warmup_tracker = setup_logger()
        
        # Минимальный граф для безопасного прогрева (чтобы загрузить геометрию холодильника)
        dummy_graph = {
            "nodes": [{"id": "warmup_node", "type": "showcase_glb", "items": {}}],
            "edges": []
        }
        
        # Прогоняем стрим вхолостую
        for _ in generate_layout_stream(
            project_dir=project_root,
            tracker=warmup_tracker, 
            size_n=5, size_m=5,
            layout_graph=dummy_graph
        ):
            pass
            
        logger.info("✅ Разогрев кэша успешно завершен.")
    except Exception as e:
        logger.error(f"❌ Ошибка при разогреве кэша: {e}", exc_info=True)

    # 3. Сборка и запуск интерфейса
    app = create_ui(cfg)
    
    is_hf_space: bool = os.environ.get("SPACE_ID") is not None
    app.launch(server_name="0.0.0.0", server_port=7860, share=not is_hf_space, debug=False)

if __name__ == "__main__":
    main()