import gradio as gr from openai import OpenAI # Инициализация клиента для DeepSeek (укажите ваш ключ!) client = OpenAI( api_key="sk-a02694cf3c8640c9ae60428ee2c5a62e", # <-- ЗАМЕНИТЕ на свой ключ base_url="https://api.deepseek.com" ) # Функция, которая будет вызываться при каждом новом сообщении # Она принимает текущее сообщение пользователя и "history" — историю чата # в формате Gradio (список кортежей). def chat_with_deepseek(user_message, history): """ :param user_message: текст последнего сообщения от пользователя :param history: список кортежей ([(user_msg, bot_msg), ...]), где хранится вся история переписки :return: обновлённая история с добавленным ответом от deepseek-reasoner """ # Преобразуем history из формата Gradio в формат messages для DeepSeek messages = [] for user_msg, bot_msg in history: if user_msg: messages.append({"role": "user", "content": user_msg}) if bot_msg: messages.append({"role": "assistant", "content": bot_msg}) # Добавляем новое пользовательское сообщение messages.append({"role": "user", "content": user_message}) # Обращаемся к deepseek-reasoner, передавая всю историю try: response = client.chat.completions.create( model="deepseek-reasoner", messages=messages ) bot_reply = response.choices[0].message.content except Exception as e: bot_reply = f"Ошибка при обращении к API: {str(e)}" # Возвращаем историю, дополнив её ответом бота history.append((user_message, bot_reply)) return history, history # Настраиваем интерфейс Gradio # - elem_id / css / theme позволяют стилизовать под "тёмный" чат # - "chatbot" виджет в Gradio уже отображает историю в виде «баблов» 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: #111111 !important; } .block.block--main { background-color: #111111 !important; } .gradio-container { color: #ffffff !important; } /* Дополнительные правки под темный фон */ #chatbot { background-color: #222222 !important; } """) as demo: gr.Markdown( "
Тёмная тема, многошаговый диалог
" ) # Компонент Chatbot для отображения диалога chatbot = gr.Chatbot(label="Диалог").style(height=400) # Поле для ввода текста msg = gr.Textbox( label="Ваш вопрос", placeholder="Напишите сообщение...", lines=3 ) # Кнопка отправки send_btn = gr.Button("Отправить", variant="primary") # state для хранения истории state = gr.State([]) # пустой список истории # Привязываем функцию chat_with_deepseek к нажатию кнопки "Отправить" # input: user_message (msg), history (state) # output: (chatbot, state) — обновлённая история чата send_btn.click( fn=chat_with_deepseek, inputs=[msg, state], outputs=[chatbot, state], scroll_to_output=True ) # Также можно отправлять сообщение, нажав Enter в Textbox msg.submit( fn=chat_with_deepseek, inputs=[msg, state], outputs=[chatbot, state], scroll_to_output=True ) # Запуск if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860)