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)