R1 / app.py
vortex123's picture
Update app.py
b365cdb verified
raw
history blame
6.05 kB
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 c type="messages").
Возвращает (new_history, new_history, ""), где:
- new_history — обновлённая история для Chatbot
- "" — чтобы очистить поле ввода.
"""
# Преобразуем history в messages для DeepSeek (по сути — то же самое, но на всякий случай)
messages = []
for item in history:
messages.append({"role": item["role"], "content": item["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}
]
# Возвращаем:
# 1) обновлённый чат для Chatbot,
# 2) обновлённый state,
# 3) пустую строку для очистки поля ввода
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:
gr.Markdown(
"<h1 style='text-align:center; color:#ffffff;'>Чат с deepseek-reasoner</h1>"
"<p style='text-align:center; color:#bbbbbb;'>Нажмите Enter, чтобы отправить; Ctrl+Enter для новой строки</p>"
)
# Компонент чата в «сообщениях» (OpenAI-стиле)
chatbot = gr.Chatbot(
label="Диалог",
height=400,
type="messages",
elem_id="chatbot"
)
# Поле ввода
msg = gr.Textbox(
label="Ваш вопрос",
placeholder="Введите сообщение...",
lines=2, # можно увеличить
elem_id="user_input"
)
# Кнопка "Отправить"
send_btn = gr.Button("Отправить", variant="primary", elem_id="send_button")
# Gradio-хранилище истории
# (по умолчанию пустой список [{"role": "...", "content": "..."}])
state = gr.State([])
# При клике на кнопку: вызываем функцию, обновляем чат и очищаем поле ввода
send_btn.click(
fn=chat_with_deepseek,
inputs=[msg, state],
outputs=[chatbot, state, msg],
scroll_to_output=True
)
# Здесь мы не используем msg.submit(...), так как будем обрабатывать Enter
# через JavaScript (чтобы Ctrl+Enter давал перенос строки).
# Подключаем JS-код, который перехватывает Enter и Ctrl+Enter
# - Enter => отправка (нажатие на send_button)
# - Ctrl+Enter => вставка новой строки
custom_js = """
<script>
document.addEventListener('DOMContentLoaded', function() {
// Ищем textarea внутри элемента #user_input
const userInput = document.querySelector('#user_input textarea');
// Ищем кнопку внутри #send_button
const sendButton = document.querySelector('#send_button button');
if (userInput && sendButton) {
userInput.addEventListener('keydown', function(e) {
if (e.key === 'Enter') {
if (e.ctrlKey) {
// Ctrl+Enter => вставляем новую строку
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 {
// Просто Enter => отправляем
e.preventDefault();
sendButton.click();
}
}
});
}
});
</script>
"""
# Добавляем HTML-блок с нашим кастомным JS
gr.HTML(custom_js)
# Запуск приложения
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)