Spaces:
Running
Running
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) |