File size: 4,031 Bytes
56da996
1afab97
ec5fbdc
de9a652
56da996
1afab97
 
56da996
de9a652
 
 
 
 
 
 
 
 
 
 
 
db5829b
 
 
de9a652
db5829b
 
 
 
8cc4d1a
 
de9a652
db5829b
de9a652
db5829b
 
 
 
 
 
 
 
 
1afab97
db5829b
1afab97
757132d
56da996
 
 
1afab97
 
db5829b
8cc4d1a
 
 
 
1afab97
de9a652
 
 
6d96487
 
 
 
 
d871fbd
c481706
360de49
 
757132d
360de49
 
 
b5470b8
8cc4d1a
360de49
 
757132d
de9a652
 
360de49
 
 
 
 
 
 
 
8cc4d1a
 
 
 
 
 
 
 
360de49
8922e87
1afab97
db5829b
c02e53f
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
102
import gradio as gr
from gradio_client import Client
import requests
import json

# Создаем клиент для взаимодействия с API
client = Client("llamameta/Pixtral-Large-Instruct-2411")

# Функция для загрузки системной роли из JSON файла
def load_system_role(role_name):
    with open('system_roles.json', 'r', encoding='utf-8') as file:
        roles = json.load(file)
    return roles.get(role_name, "Ты помощник по умолчанию.")

# Функция для загрузки названий ролей из JSON файла
def load_role_names():
    with open('system_roles.json', 'r', encoding='utf-8') as file:
        roles = json.load(file)
    return list(roles.keys())

def respond(
    message,
    history: list[tuple[str, str]],
    system_role_name,
    max_tokens,
    temperature,
    top_p,
):
    if not message:
        return history, ""
    system_role = load_system_role(system_role_name)
    # Формируем сообщения для отправки в API
    messages = [{"role": "system", "content": system_role}]
    
    for val in history:
        if val[0]:
            messages.append({"role": "user", "content": val[0]})
        if val[1]:
            messages.append({"role": "assistant", "content": val[1]})
    
    messages.append({"role": "user", "content": message})
    
    # Генерируем ответ от чат-бота
    response = client.predict(
        message=message,
        system_message=system_role,
        max_tokens=max_tokens,
        temperature=temperature,
        top_p=top_p,
        api_name="/chat"
    )
    
    # Обновляем историю сообщений
    history.append((message, response))
    
    return history, ""

# Загрузка названий ролей из JSON файла
role_names = load_role_names()

# Ссылка на файл CSS
css_url = "https://neurixyufi-aihub.static.hf.space/style.css"

# Получение CSS по ссылке
response = requests.get(css_url)
css = response.text + " .gradio-container{max-width: 700px !important} h1{text-align:center} #component-4 { height: 70vh !important; }"

# Создаем интерфейс с использованием gr.Blocks
with gr.Blocks(css=css) as demo:
    gr.Markdown("# Помощник")
    
    with gr.Row():
        with gr.Column():
            chatbot = gr.Chatbot(show_label=False)
            message = gr.Textbox(label="Введите ваше сообщение", placeholder="Введите ваше сообщение здесь...", lines=3, container=False)
            submit = gr.Button("Отправить")
    
    with gr.Accordion("Настройки помощника", open=False):
        with gr.Accordion(label="Помощник", open=False):
            helper_role = gr.Radio(show_label=True, label="Выберите помощника", interactive=True, choices=role_names, value=role_names[0])
        max_tokens = gr.Slider(minimum=100, maximum=18000, value=18000, step=1, label="Максимальное количество новых токенов")
        temperature = gr.Slider(minimum=0.0, maximum=1.0, value=0.7, step=0.1, label="Температура")
        top_p = gr.Slider(minimum=0.0, maximum=1.0, value=0.95, step=0.05, label="Top-p (нуклеарное сэмплирование)")
    
    # Обработка отправки сообщения
    submit.click(
        fn=respond,
        inputs=[message, chatbot, system_message, max_tokens, temperature, top_p],
        outputs=[chatbot, message]
    )
    
    # Обработка отправки сообщения при нажатии Ctrl+Enter
    message.submit(
        fn=respond,
        inputs=[message, chatbot, system_message, max_tokens, temperature, top_p],
        outputs=[chatbot, message]
    )

# Запускаем интерфейс
if __name__ == "__main__":
    demo.queue(max_size=250).launch(show_api=False, share=False)