File size: 3,167 Bytes
42fa16e
 
 
 
 
 
 
 
e8fef7f
 
 
05f0041
e8fef7f
 
 
 
 
 
9700948
e8fef7f
 
42fa16e
05f0041
e8fef7f
 
42fa16e
e8fef7f
42fa16e
05f0041
a8a31d7
05f0041
9700948
05f0041
42fa16e
 
e8fef7f
 
 
 
 
 
9db46db
e8fef7f
05f0041
e8fef7f
 
 
9f87737
e8fef7f
 
 
 
9f87737
e8fef7f
05f0041
e8fef7f
42fa16e
 
9700948
42fa16e
e8fef7f
42fa16e
 
 
 
 
 
e8fef7f
42fa16e
 
 
 
 
 
e8fef7f
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
import gradio as gr

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():
    # fill_height=True растягивает интерфейс на всю высоту экрана
    with gr.Blocks(theme=gr.themes.Base(), css=CSS, fill_height=True) as demo:
        gr.HTML("<script>document.title = 'AI Agent';</script>")

        with gr.Sidebar(width=280):
            use_search = gr.Checkbox(label="🌐 Интернет-поиск", value=False)
            uploaded_file = gr.File(
                label="📎 Файл контекста",
                file_types=[".txt", ".pdf", ".py", ".md", ".json"],
            )

            # Аккордеон скроет страшные ползунки, пока юзер сам их не откроет
            with gr.Accordion("⚙️ Настройки модели", open=False):
                sys_pt = gr.Textbox(
                    label="System Prompt",
                    value="Вы AI-агент. Если нужно узнать свежую информацию, используйте поиск.",
                    lines=3,
                )
                temp = gr.Slider(0, 1, value=settings.DEFAULT_TEMP, label="Температура")
                tokens = gr.Slider(
                    512,
                    settings.CONTEXT_SIZE,
                    value=settings.DEFAULT_MAX_TOKENS,
                    label="Max Tokens",
                    step=128,
                )

            clear = gr.Button("🗑️ Очистить чат")

        # Чат
        chatbot = gr.Chatbot(
            elem_id="chatbot",
            show_label=False,
            scale=1,
        )

        # Плашка ввода в самом низу
        with gr.Row():
            msg = gr.Textbox(
                show_label=False,
                placeholder="Напиши сообщение...",
                scale=10,
                autofocus=True,
                container=False,
            )
            submit = gr.Button("➤", variant="primary", scale=1, min_width=50)

        # События интерфейса (обработчики)
        input_args = [msg, chatbot]
        output_args = [msg, chatbot]
        gen_args = [chatbot, sys_pt, temp, tokens, use_search, uploaded_file]

        # Обработка 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]
        )

        # Обработка клика по кнопке отправки
        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