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)