File size: 3,769 Bytes
42fa16e
 
3edce53
 
 
 
 
 
42fa16e
 
 
 
 
 
fe2d9d0
 
 
05f0041
 
 
 
 
 
 
42fa16e
05f0041
 
 
42fa16e
05f0041
42fa16e
05f0041
 
 
 
 
42fa16e
 
3edce53
 
 
05f0041
 
 
42fa16e
74b0917
 
 
 
 
 
 
 
 
 
 
 
05f0041
 
42fa16e
05f0041
 
 
 
 
 
 
42fa16e
 
05f0041
42fa16e
 
 
 
05f0041
42fa16e
 
 
 
 
 
05f0041
42fa16e
 
 
 
 
 
05f0041
42fa16e
 
 
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
import gradio as gr

# if not hasattr(gr, "Separator"):
#     def _gr_separator():
#         return gr.HTML(
#             "<div style='margin: 15px 0; border-top: 1px solid var(--border-color-primary);'></div>"
#         )
#     gr.Separator = lambda *args, **kwargs: _gr_separator()
from src.core.config import settings
from src.ui.callbacks import bot_response, set_interactive, user_input
from src.ui.styles import CSS


def create_ui():
    with gr.Blocks() as demo:
        gr.HTML(f"<style>{CSS}</style>")
        gr.HTML("<script>document.title = 'Code LLM';</script>")
        with gr.Row(elem_id="main-row", variant="panel"):
            # Боковая панель
            with gr.Sidebar(elem_id="sidebar-container"):
                gr.Markdown("## 🛠️ Dashboard")

                # Настройки модели
                gr.Markdown("### ⚙️ Model Settings")
                sys_pt = gr.Textbox(
                    label="System Prompt",
                    value="Вы опытный программист. Отвечаете кратко и по делу.",
                    lines=4,
                )
                temp = gr.Slider(0, 1, value=settings.DEFAULT_TEMP, label="Temperature")
                tokens = gr.Slider(
                    512,
                    8192,
                    value=settings.DEFAULT_MAX_TOKENS,
                    label="Max New Tokens",
                    step=128,
                )

                gr.HTML(
                    "<div style='margin: 15px 0; border-top: 1px solid var(--border-color-primary);'></div>"
                )
                clear = gr.Button("🗑️ Clear Chat", variant="stop")

            # Основная область чата
            with gr.Column(elem_id="col-chat-main"):
                chatbot_kwargs = {
                    "elem_id": "chatbot",
                    "show_label": False,
                }
                try:
                    chatbot = gr.Chatbot(**chatbot_kwargs)
                except TypeError as e:
                    err_msg = str(e)
                    for key in list(chatbot_kwargs.keys()):
                        if key in err_msg:
                            chatbot_kwargs.pop(key, None)
                    chatbot = gr.Chatbot(**chatbot_kwargs)

                # Область ввода, прижатая к низу
                with gr.Row(elem_id="input-area"):
                    msg = gr.Textbox(
                        show_label=False,
                        placeholder="Type your message here...",
                        scale=10,
                        autofocus=True,
                        container=False,
                    )
                    submit = gr.Button("Run ➤", variant="primary", scale=1)

        # Настройка логики обработки сообщений
        input_args = [msg, chatbot]
        output_args = [msg, chatbot]
        gen_args = [chatbot, sys_pt, temp, tokens]

        # Обработка Enter в текстовом поле
        msg.submit(user_input, input_args, output_args, queue=False).then(
            lambda: set_interactive(False), None, [msg, submit]
        ).then(bot_response, gen_args, chatbot).then(
            lambda: set_interactive(True), None, [msg, submit]
        )

        # Обработка клика по кнопке Run
        submit.click(user_input, input_args, output_args, queue=False).then(
            lambda: set_interactive(False), None, [msg, submit]
        ).then(bot_response, gen_args, chatbot).then(
            lambda: set_interactive(True), None, [msg, submit]
        )

        # Очистка чата
        clear.click(lambda: [], None, chatbot)

    return demo