File size: 4,855 Bytes
4145939 43ef72c 4145939 b365cdb 43ef72c 903a112 43ef72c 4145939 43ef72c b365cdb dc2732a b365cdb dc2732a 43ef72c dc2732a 43ef72c dc2732a b365cdb 43ef72c b365cdb dc2732a 43ef72c 4e3871a 43ef72c 4e3871a dc2732a 4e3871a dc2732a 4145939 43ef72c 4e3871a 43ef72c b365cdb 43ef72c dc2732a 43ef72c b365cdb 43ef72c b365cdb 43ef72c b365cdb 4e3871a b365cdb 43ef72c 903a112 4e3871a b365cdb 4e3871a 4145939 903a112 43ef72c 4e3871a dc2732a b365cdb 43ef72c 4e3871a 903a112 dc2732a 43ef72c 903a112 4e3871a 43ef72c 903a112 dc2732a 4e3871a 43ef72c b365cdb 43ef72c 4145939 903a112 b365cdb dc2732a b365cdb 903a112 b365cdb 4145939 dc2732a 4145939 43ef72c |
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 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
import gradio as gr
from openai import OpenAI
# Инициализация клиента DeepSeek
client = OpenAI(
api_key="sk-a02694cf3c8640c9ae60428ee2c5a62e", # <-- Замените на свой ключ
base_url="https://api.deepseek.com"
)
def chat_with_deepseek(user_message, history):
"""
user_message: строка, введённая пользователем.
history: список словарей [{"role": ..., "content": ...}, ...]
в формате Gradio Chatbot (type="messages").
Возвращает (new_history, new_history, ""), где:
- new_history — обновлённая история для Chatbot,
- "" — очистка поля ввода.
"""
# Формируем messages для запроса к DeepSeek
messages = []
for msg in history:
messages.append({"role": msg["role"], "content": msg["content"]})
# Добавляем текущее сообщение пользователя
messages.append({"role": "user", "content": user_message})
# Вызываем deepseek-reasoner
try:
response = client.chat.completions.create(
model="deepseek-reasoner",
messages=messages
)
assistant_content = response.choices[0].message.content
except Exception as e:
assistant_content = f"Ошибка при обращении к API: {e}"
# Обновляем историю
new_history = history + [
{"role": "user", "content": user_message},
{"role": "assistant", "content": assistant_content}
]
return new_history, new_history, "" # Третий выход очистит поле ввода
with gr.Blocks(
theme=gr.themes.Base(
primary_hue="slate",
secondary_hue="blue",
neutral_hue="slate",
text_size="md",
font=["Arial", "sans-serif"]
),
css="""
/* Фон приложения чёрный */
body {
background-color: #000000 !important;
}
.block.block--main {
background-color: #000000 !important;
}
.gradio-container {
color: #ffffff !important;
}
/* Фон области чата */
#chatbot {
background-color: #111111 !important;
}
"""
) as demo:
# HTML-блок с заголовком и подсказкой по Enter/Ctrl+Enter
gr.HTML("""
<h1 style="text-align:center; color:#ffffff;">Чат с deepseek-reasoner</h1>
<p style="text-align:center; color:#cccccc;">
<strong>Enter</strong> — отправить сообщение;
<strong>Ctrl+Enter</strong> — новая строка
</p>
""")
# Компонент Chatbot
chatbot = gr.Chatbot(
label="Диалог",
height=400,
type="messages",
elem_id="chatbot"
)
# Поле ввода (2 строки)
msg = gr.Textbox(
label="Ваш вопрос",
placeholder="Введите сообщение...",
lines=2,
elem_id="user_input"
)
# Скрытая кнопка, на которую будем «кликать» через JS
hidden_send_btn = gr.Button("Скрытая кнопка", visible=False, elem_id="hidden_send_btn")
# Состояние с историей
state = gr.State([])
# При клике на кнопку — вызываем chat_with_deepseek
hidden_send_btn.click(
fn=chat_with_deepseek,
inputs=[msg, state],
outputs=[chatbot, state, msg],
scroll_to_output=True
)
# JS: Enter => отправка, Ctrl+Enter => перенос
custom_js = """
<script>
document.addEventListener('DOMContentLoaded', function() {
const userInput = document.querySelector('#user_input textarea');
const sendButton = document.querySelector('#hidden_send_btn button');
if (userInput && sendButton) {
userInput.addEventListener('keydown', function(e) {
if (e.key === 'Enter') {
if (e.ctrlKey) {
e.preventDefault();
const start = userInput.selectionStart;
const end = userInput.selectionEnd;
userInput.value = userInput.value.substring(0, start) + "\\n"
+ userInput.value.substring(end);
userInput.selectionStart = userInput.selectionEnd = start + 1;
} else {
e.preventDefault();
sendButton.click();
}
}
});
}
});
</script>
"""
gr.HTML(custom_js)
# Запуск
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)
|