vortex123 commited on
Commit
dc2732a
·
verified ·
1 Parent(s): b365cdb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +39 -48
app.py CHANGED
@@ -3,30 +3,29 @@ from openai import OpenAI
3
 
4
  # Инициализация клиента DeepSeek
5
  client = OpenAI(
6
- api_key="sk-a02694cf3c8640c9ae60428ee2c5a62e", # ЗАМЕНИТЕ на свой ключ
7
  base_url="https://api.deepseek.com"
8
  )
9
 
10
  def chat_with_deepseek(user_message, history):
11
  """
12
  user_message: строка, введённая пользователем.
13
- history: список словарей формата [{"role": ..., "content": ...}, ...]
14
- (в формате для Gradio Chatbot c type="messages").
15
 
16
  Возвращает (new_history, new_history, ""), где:
17
- - new_history — обновлённая история для Chatbot
18
- - "" — чтобы очистить поле ввода.
19
  """
20
-
21
- # Преобразуем history в messages для DeepSeek (по сути — то же самое, но на всякий случай)
22
  messages = []
23
- for item in history:
24
- messages.append({"role": item["role"], "content": item["content"]})
25
-
26
  # Добавляем текущее сообщение пользователя
27
  messages.append({"role": "user", "content": user_message})
28
 
29
- # Вызываем модель deepseek-reasoner
30
  try:
31
  response = client.chat.completions.create(
32
  model="deepseek-reasoner",
@@ -36,17 +35,14 @@ def chat_with_deepseek(user_message, history):
36
  except Exception as e:
37
  assistant_content = f"Ошибка при обращении к API: {e}"
38
 
39
- # Формируем новое состояние истории
40
  new_history = history + [
41
  {"role": "user", "content": user_message},
42
  {"role": "assistant", "content": assistant_content}
43
  ]
44
- # Возвращаем:
45
- # 1) обновлённый чат для Chatbot,
46
- # 2) обновлённый state,
47
- # 3) пустую строку для очистки поля ввода
48
- return new_history, new_history, ""
49
 
 
50
  with gr.Blocks(
51
  theme=gr.themes.Base(
52
  primary_hue="slate",
@@ -56,7 +52,7 @@ with gr.Blocks(
56
  font=["Arial", "sans-serif"]
57
  ),
58
  css="""
59
- /* Чёрный фон для всего приложения */
60
  body {
61
  background-color: #000000 !important;
62
  }
@@ -70,15 +66,20 @@ with gr.Blocks(
70
  #chatbot {
71
  background-color: #111111 !important;
72
  }
73
- """
74
- ) as demo:
75
 
76
  gr.Markdown(
77
- "<h1 style='text-align:center; color:#ffffff;'>Чат с deepseek-reasoner</h1>"
78
- "<p style='text-align:center; color:#bbbbbb;'>Нажмите Enter, чтобы отправить; Ctrl+Enter для новой строки</p>"
 
 
 
 
 
 
79
  )
80
 
81
- # Компонент чата в «сообщениях» (OpenAI-стиле)
82
  chatbot = gr.Chatbot(
83
  label="Диалог",
84
  height=400,
@@ -86,58 +87,50 @@ with gr.Blocks(
86
  elem_id="chatbot"
87
  )
88
 
89
- # Поле ввода
90
  msg = gr.Textbox(
91
  label="Ваш вопрос",
92
  placeholder="Введите сообщение...",
93
- lines=2, # можно увеличить
94
  elem_id="user_input"
95
  )
96
 
97
- # Кнопка "Отправить"
98
- send_btn = gr.Button("Отправить", variant="primary", elem_id="send_button")
99
 
100
- # Gradio-хранилище истории
101
- # (по умолчанию пустой список [{"role": "...", "content": "..."}])
102
  state = gr.State([])
103
 
104
- # При клике на кнопку: вызываем функцию, обновляем чат и очищаем поле ввода
105
- send_btn.click(
106
  fn=chat_with_deepseek,
107
  inputs=[msg, state],
108
  outputs=[chatbot, state, msg],
109
  scroll_to_output=True
110
  )
111
 
112
- # Здесь мы не используем msg.submit(...), так как будем обрабатывать Enter
113
- # через JavaScript (чтобы Ctrl+Enter давал перенос строки).
114
-
115
- # Подключаем JS-код, который перехватывает Enter и Ctrl+Enter
116
- # - Enter => отправка (нажатие на send_button)
117
- # - Ctrl+Enter => вставка новой строки
118
  custom_js = """
119
  <script>
120
  document.addEventListener('DOMContentLoaded', function() {
121
- // Ищем textarea внутри элемента #user_input
122
  const userInput = document.querySelector('#user_input textarea');
123
- // Ищем кнопку внутри #send_button
124
- const sendButton = document.querySelector('#send_button button');
125
 
126
  if (userInput && sendButton) {
127
  userInput.addEventListener('keydown', function(e) {
128
  if (e.key === 'Enter') {
129
  if (e.ctrlKey) {
130
- // Ctrl+Enter => вставляем новую строку
131
  e.preventDefault();
132
  const start = userInput.selectionStart;
133
  const end = userInput.selectionEnd;
134
- userInput.value = userInput.value.substring(0, start)
135
- + "\\n"
136
  + userInput.value.substring(end);
137
- // Устанавливаем курсор ниже
138
  userInput.selectionStart = userInput.selectionEnd = start + 1;
139
  } else {
140
- // Просто Enter => отправляем
141
  e.preventDefault();
142
  sendButton.click();
143
  }
@@ -147,10 +140,8 @@ with gr.Blocks(
147
  });
148
  </script>
149
  """
150
-
151
- # Добавляем HTML-блок с нашим кастомным JS
152
  gr.HTML(custom_js)
153
 
154
- # Запуск приложения
155
  if __name__ == "__main__":
156
  demo.launch(server_name="0.0.0.0", server_port=7860)
 
3
 
4
  # Инициализация клиента DeepSeek
5
  client = OpenAI(
6
+ api_key="sk-a02694cf3c8640c9ae60428ee2c5a62e", # <-- Замените на ваш ключ
7
  base_url="https://api.deepseek.com"
8
  )
9
 
10
  def chat_with_deepseek(user_message, history):
11
  """
12
  user_message: строка, введённая пользователем.
13
+ history: список словарей [{"role": ..., "content": ...}, ...]
14
+ в формате Gradio Chatbot (type="messages").
15
 
16
  Возвращает (new_history, new_history, ""), где:
17
+ - new_history — обновлённая история для Chatbot,
18
+ - "" — очистка поля ввода.
19
  """
20
+ # Формируем messages для запроса к DeepSeek
 
21
  messages = []
22
+ for msg in history:
23
+ messages.append({"role": msg["role"], "content": msg["content"]})
24
+
25
  # Добавляем текущее сообщение пользователя
26
  messages.append({"role": "user", "content": user_message})
27
 
28
+ # Вызываем deepseek-reasoner
29
  try:
30
  response = client.chat.completions.create(
31
  model="deepseek-reasoner",
 
35
  except Exception as e:
36
  assistant_content = f"Ошибка при обращении к API: {e}"
37
 
38
+ # Обновляем историю
39
  new_history = history + [
40
  {"role": "user", "content": user_message},
41
  {"role": "assistant", "content": assistant_content}
42
  ]
43
+ return new_history, new_history, "" # Третий выход очистит поле ввода
 
 
 
 
44
 
45
+ # Создаём приложение Gradio
46
  with gr.Blocks(
47
  theme=gr.themes.Base(
48
  primary_hue="slate",
 
52
  font=["Arial", "sans-serif"]
53
  ),
54
  css="""
55
+ /* Фон приложения чёрный */
56
  body {
57
  background-color: #000000 !important;
58
  }
 
66
  #chatbot {
67
  background-color: #111111 !important;
68
  }
69
+ """) as demo:
 
70
 
71
  gr.Markdown(
72
+ """
73
+ <h1 style="text-align:center; color:#ffffff;">Чат с deepseek-reasoner</h1>
74
+ <p style="text-align:center; color:#cccccc;">
75
+ <strong>Enter</strong> — отправить сообщение;
76
+ <strong>Ctrl+Enter</strong> — перенос строки
77
+ </p>
78
+ """,
79
+ unsafe_allow_html=True
80
  )
81
 
82
+ # Компонент Chatbot с открытым форматом "messages"
83
  chatbot = gr.Chatbot(
84
  label="Диалог",
85
  height=400,
 
87
  elem_id="chatbot"
88
  )
89
 
90
+ # Поле ввода (2 строки по умолчанию)
91
  msg = gr.Textbox(
92
  label="Ваш вопрос",
93
  placeholder="Введите сообщение...",
94
+ lines=2,
95
  elem_id="user_input"
96
  )
97
 
98
+ # Скрытая кнопка отправки (не будет отображаться в интерфейсе)
99
+ hidden_send_btn = gr.Button("Скрытая кнопка", visible=False, elem_id="hidden_send_btn")
100
 
101
+ # Храним историю сообщений
 
102
  state = gr.State([])
103
 
104
+ # Логика при "клике" на скрытую кнопку
105
+ hidden_send_btn.click(
106
  fn=chat_with_deepseek,
107
  inputs=[msg, state],
108
  outputs=[chatbot, state, msg],
109
  scroll_to_output=True
110
  )
111
 
112
+ # Подключаем кастомный JS, чтобы:
113
+ # - Enter => клик по скрытой кнопке (отправка)
114
+ # - Ctrl+Enter => вставка "\n"
 
 
 
115
  custom_js = """
116
  <script>
117
  document.addEventListener('DOMContentLoaded', function() {
 
118
  const userInput = document.querySelector('#user_input textarea');
119
+ const sendButton = document.querySelector('#hidden_send_btn button');
 
120
 
121
  if (userInput && sendButton) {
122
  userInput.addEventListener('keydown', function(e) {
123
  if (e.key === 'Enter') {
124
  if (e.ctrlKey) {
125
+ // Ctrl+Enter => перенос строки
126
  e.preventDefault();
127
  const start = userInput.selectionStart;
128
  const end = userInput.selectionEnd;
129
+ userInput.value = userInput.value.substring(0, start) + "\\n"
 
130
  + userInput.value.substring(end);
 
131
  userInput.selectionStart = userInput.selectionEnd = start + 1;
132
  } else {
133
+ // Enter => отправка
134
  e.preventDefault();
135
  sendButton.click();
136
  }
 
140
  });
141
  </script>
142
  """
 
 
143
  gr.HTML(custom_js)
144
 
145
+ # Запуск
146
  if __name__ == "__main__":
147
  demo.launch(server_name="0.0.0.0", server_port=7860)