File size: 5,335 Bytes
4145939 43ef72c 4145939 88f118c 43ef72c 88f118c 43ef72c 4145939 43ef72c b365cdb 88f118c b365cdb 88f118c 43ef72c 88f118c 43ef72c dc2732a b365cdb 43ef72c b365cdb 88f118c 43ef72c 4e3871a 43ef72c 4e3871a 88f118c 4e3871a 88f118c 4145939 43ef72c 88f118c 43ef72c 4e3871a 43ef72c b365cdb 43ef72c 88f118c 43ef72c b365cdb 43ef72c b365cdb 43ef72c 4e3871a b365cdb 43ef72c 903a112 88f118c 903a112 88f118c 903a112 88f118c 4e3871a b365cdb 4e3871a 4145939 88f118c 43ef72c 4e3871a dc2732a b365cdb 43ef72c 4e3871a 88f118c 43ef72c 88f118c 4e3871a 43ef72c 88f118c dc2732a 4e3871a 43ef72c b365cdb 43ef72c 4145939 88f118c b365cdb dc2732a b365cdb 88f118c b365cdb 88f118c b365cdb 88f118c b365cdb 88f118c 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 143 144 145 146 147 148 149 150 151 152 |
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":"user"|"assistant","content":"..."}],
формат Gradio Chatbot (type="messages").
Возвращает (new_history, new_history, ""):
- new_history — обновлённая история для Chatbot
- "" — чтобы очистить поле ввода
"""
# Преобразуем history в формат 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(
# Тема Gradio:
theme=gr.themes.Base(
primary_hue="slate",
secondary_hue="blue",
neutral_hue="slate",
text_size="md",
font=["Arial", "sans-serif"]
),
# CSS для чёрного оформления
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.HTML("""
<h1 style="text-align:center; color:#ffffff;">Чат с deepseek-reasoner</h1>
<p style="text-align:center; color:#cccccc;">
<b>Enter</b> — отправить; <b>Ctrl+Enter</b> — новая строка.
</p>
""")
# Компонент чата, хранящего сообщения в формате "messages"
chatbot = gr.Chatbot(
label="Диалог",
height=400,
type="messages",
elem_id="chatbot"
)
# Текстовое поле (2 строки по умолчанию)
msg = gr.Textbox(
label="Ваш вопрос",
placeholder="Введите сообщение...",
lines=2,
elem_id="user_input"
)
# Скрытая кнопка (не показываем в UI), которую мы будем "нажимать" программно
hidden_send_btn = gr.Button(
"Скрытая кнопка",
visible=False,
elem_id="hidden_send_btn"
)
# Состояние для истории чата
state = gr.State([])
# При клике на кнопку (вызванной JS), отправляем сообщение
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') {
// Если нажали 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>
"""
gr.HTML(custom_js)
# Запуск
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)
|