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)