File size: 4,998 Bytes
56da996
9f5c6b7
ec5fbdc
de9a652
9f5c6b7
 
56da996
9f5c6b7
 
 
 
 
 
56da996
de9a652
 
 
 
 
 
 
 
 
 
db5829b
 
 
de9a652
db5829b
 
 
 
8cc4d1a
 
9f5c6b7
de9a652
db5829b
de9a652
db5829b
 
 
ef31d22
9f5c6b7
db5829b
ef31d22
9f5c6b7
db5829b
 
 
9f5c6b7
 
 
 
1afab97
9f5c6b7
 
 
56da996
 
9f5c6b7
1afab97
db5829b
9f5c6b7
 
 
8cc4d1a
9f5c6b7
8cc4d1a
 
1afab97
de9a652
 
 
6d96487
 
 
 
9f5c6b7
 
 
 
 
 
 
c481706
360de49
 
757132d
360de49
 
 
b5470b8
8cc4d1a
9f5c6b7
360de49
757132d
de9a652
 
360de49
 
 
 
 
 
 
1d54561
9f5c6b7
 
8cc4d1a
 
 
 
 
2a893fd
9f5c6b7
 
360de49
8922e87
1afab97
db5829b
9f5c6b7
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import gradio as gr
from huggingface_hub import InferenceClient
import requests
import json
import os
import random

def get_random_api_key():
    keys = os.getenv("KEYS", "").split(",")
    if keys and keys[0]:  # Check if KEYS is set and not empty
        return random.choice(keys).strip()
    else:
        raise ValueError("API keys not found. Please set the KEYS environment variable.")

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, "Ты помощник по умолчанию.")

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]:
            user_message = val[0]
            messages.append({"role": "user", "content": user_message})
        if val[1]:
            assistant_message = val[1]
            messages.append({"role": "assistant", "content": assistant_message})
    
    messages.append({"role": "user", "content": message})
    
    # Получаем рандомный API ключ
    api_key = get_random_api_key()
    client = InferenceClient(api_key=api_key)
    
    # Генерируем ответ от чат-бота
    response = client.chat.completions.create(
        model="Qwen/Qwen2.5-Coder-32B-Instruct", 
        messages=messages, 
        max_tokens=max_tokens,
        temperature=temperature,
        top_p=top_p
    )
    
    # Переводим ответ ассистента на русский, если он не на русском
    response_text = response.choices[0].message.content
    
    # Обновляем историю сообщений
    history.append((message, response_text))
    
    return history, ""

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

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

# Получение CSS по ссылке
try:
    response = requests.get(css_url)
    response.raise_for_status() # Поднимаем исключение, если статус ответа не 200
    css = response.text + " .gradio-container{max-width: 700px !important} h1{text-align:center} #component-4 { height: 70vh !important; }"
except requests.exceptions.RequestException as e:
    print(f"Ошибка при загрузке CSS: {e}")
    css = " .gradio-container{max-width: 700px !important} h1{text-align:center} #component-4 { height: 70vh !important; }" # Используем базовый стиль, если загрузка CSS не удалась

# Создаем интерфейс с использованием 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("Отправить", variant='primary')
    
    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, helper_role, max_tokens, temperature, top_p],
        outputs=[chatbot, message],
        concurrency_limit=250
    )
    
    # Обработка отправки сообщения при нажатии Ctrl+Enter
    message.submit(
        fn=respond,
        inputs=[message, chatbot, helper_role, max_tokens, temperature, top_p],
        outputs=[chatbot, message],
        concurrency_limit=250
    )

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