File size: 5,224 Bytes
4145939 43ef72c 4145939 2e1a1b2 43ef72c 2e1a1b2 43ef72c 4145939 43ef72c b365cdb 2e1a1b2 88f118c b365cdb 2e1a1b2 88f118c 43ef72c 2e1a1b2 43ef72c 2e1a1b2 dc2732a b365cdb 43ef72c b365cdb 2e1a1b2 43ef72c 4e3871a 43ef72c 4e3871a 88f118c 4e3871a 2e1a1b2 88f118c 4145939 43ef72c 4e3871a 43ef72c b365cdb 43ef72c 2e1a1b2 43ef72c b365cdb 43ef72c b365cdb 43ef72c 2e1a1b2 4e3871a b365cdb 43ef72c 903a112 2e1a1b2 903a112 2e1a1b2 903a112 2e1a1b2 4e3871a b365cdb 4e3871a 4145939 2e1a1b2 43ef72c 4e3871a dc2732a 2e1a1b2 43ef72c 4e3871a 2e1a1b2 88f118c 2e1a1b2 88f118c 43ef72c 2e1a1b2 4e3871a 43ef72c 2e1a1b2 dc2732a 4e3871a 43ef72c 2e1a1b2 43ef72c 4145939 2e1a1b2 b365cdb 2e1a1b2 b365cdb dc2732a b365cdb 2e1a1b2 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 |
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 — обновлённая история (чат) в формате messages
- "" — чтобы очистить поле ввода
"""
# Собираем сообщения из history
messages = []
for h in history:
messages.append({"role": h["role"], "content": h["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:
# Верхняя часть: "заголовок"
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 (OpenAI-стиль)
chatbot = gr.Chatbot(
label="Диалог",
height=400,
type="messages",
elem_id="chatbot"
)
# Поле для ввода текста (многострочное)
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([])
# Логика при "клике" на скрытую кнопку
hidden_send_btn.click(
fn=chat_with_deepseek,
inputs=[msg, state],
outputs=[chatbot, state, msg], # msg получит ""
scroll_to_output=True
)
# JavaScript-код:
# При Enter — отправка (клик по hidden_send_btn)
# При Ctrl+Enter — перенос строки
custom_js = """
<script>
window.addEventListener('load', 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) {
// 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)
|