File size: 4,705 Bytes
ce82348
 
 
 
 
05bfbba
ce82348
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
05bfbba
ce82348
 
 
 
 
 
 
 
05bfbba
ce82348
05bfbba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ce82348
05bfbba
 
ce82348
 
 
05bfbba
 
 
 
 
 
 
 
 
 
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# src/ui/layout.py

"""

Модуль верстки пользовательского интерфейса Gradio.

ИСПРАВЛЕНО: Удалена тема Soft для возврата стандартных шрифтов.

ДОБАВЛЕНО: Компоненты для просмотра 2D SVG-плана и скачивания JSON-артефактов.

"""
import gradio as gr
from omegaconf import DictConfig

from .callbacks import (
    generate_wrapper, 
    get_cache_status_text, 
    get_inventory_json
)

def create_ui(cfg: DictConfig) -> gr.Blocks:
    """

    Создает структуру веб-интерфейса.

    """
    with gr.Blocks(title="ИИ-Мерчандайзер 3D") as app:
        gr.Markdown("# 🏪 Интеллектуальный генератор 3D-планировок")

        # 1. Текстовое табло с общей статистикой
        server_status = gr.Textbox(
            value=get_cache_status_text,
            label="Статус сервера и общая статистика",
            interactive=False,
            lines=2
        )

        # 2. Инспектор ассортимента (под аккордеоном)
        with gr.Accordion("📦 Детальный просмотр доступных SKU", open=False):
            inventory_inspect = gr.JSON(
                value=get_inventory_json,
                label="Иерархия товаров в ОЗУ"
            )
        
        # 3. Панель управления
        with gr.Row():
            prompt_input = gr.Textbox(
                label="✨ Текстовый запрос к ИИ-мерчандайзеру",
                placeholder="Например: Поставь молоко в холодильник, а пиво на стеллаж напротив.",
                lines=2,
                scale=4
            )
            generate_btn = gr.Button("🚀 Сгенерировать", variant="primary", scale=1)

        # 4. Область вывода результатов генерации
        with gr.Row():
            with gr.Column(scale=1):
                status_output = gr.Textbox(
                    label="Чек-лист выполнения", 
                    value="🟢 Ожидание запуска...", 
                    interactive=False,
                    lines=15
                )
            
            with gr.Column(scale=3):
                # Вкладки для переключения между 3D и 2D
                with gr.Tabs():
                    with gr.TabItem("🎮 3D Сцена"):
                        output_3d = gr.Model3D(
                            label="Результат 3D-рендера",
                            clear_color=[0.9, 0.9, 0.9, 1.0],
                            height=600
                        )
                    with gr.TabItem("🗺️ 2D План (SVG)"):
                        output_svg = gr.Image(
                            label="Векторный план расстановки",
                            type="filepath",
                            interactive=False
                        )

        # 5. Панель артефактов (для скачивания)
        with gr.Row():
            draft_json_out = gr.File(label="📥 Скачать черновик LLM (Draft JSON)")
            final_json_out = gr.File(label="📥 Скачать финальный расчет (Final JSON)")
            history_json_out = gr.File(label="📥 Скачать историю LLM (JSONL)")
            draft_svg_file_out = gr.File(label="📥 Draft SVG")
            svg_file_out = gr.File(label="📥 Скачать 2D План (SVG)")

        # Привязка событий: теперь функция должна возвращать 5 значений (3D, Чеклист, SVG-превью, Draft, Final, SVG-файл)
        # Так как SVG-файл и SVG-превью - это один и тот же файл, мы просто передадим его путь дважды в outputs
        generate_btn.click(
            fn=generate_wrapper,
            inputs=[prompt_input],
            outputs=[
                output_3d, 
                status_output, 
                output_svg, 
                draft_json_out, 
                final_json_out, 
                svg_file_out, 
                history_json_out,
                draft_svg_file_out
            ],
            show_progress="hidden"
        )
        
    return app