Kenan023214 commited on
Commit
d604d43
·
verified ·
1 Parent(s): 75c77e2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +26 -16
app.py CHANGED
@@ -2,11 +2,12 @@ import gradio as gr
2
  import torch
3
  from transformers import AutoModelForCausalLM, AutoTokenizer
4
  from functools import lru_cache
 
5
 
6
  # --- Конфигурация Hugging Face Space ---
7
  MODEL_NAME = "Kenan023214/PyroNet-mini"
8
  DEVICE = "cpu" # Используем CPU, как указано для Basic Space
9
- MAX_NEW_TOKENS = 512 # Увеличим для "хода мыслей"
10
  MAX_CONTEXT_TOKENS = 2048
11
 
12
  # Словарь с встроенным содержимым шаблонов чата
@@ -110,10 +111,8 @@ def trim_history_to_max_tokens(messages, max_tokens):
110
 
111
  def build_messages_for_template(history_messages, reasoning: bool, language: str):
112
  """Подготавливает сообщения для шаблона, включая системное сообщение."""
113
- # Используем полный системный промпт из словаря
114
  full_template_content = CHAT_TEMPLATES.get(language, CHAT_TEMPLATES["en"])
115
 
116
- # Извлекаем системное сообщение из шаблона
117
  system_start_tag = "<|system|>"
118
  system_end_tag = "<|end|>"
119
  system_message_raw = full_template_content.split(system_start_tag)[1].split(system_end_tag)[0].strip()
@@ -146,20 +145,24 @@ def extract_assistant_reply_and_reasoning(raw_generated_text: str) -> tuple[str,
146
 
147
  # --- Основная функция для Gradio ---
148
  def generate_response(user_text: str, history, reasoning: bool, language: str):
149
- """Обрабатывает пользовательский запрос и генерирует ответ."""
 
 
 
 
 
150
 
151
- history.append({"role": "user", "content": user_text})
 
152
 
153
- trimmed_history = trim_history_to_max_tokens(history, MAX_CONTEXT_TOKENS)
154
-
155
  messages_for_template = build_messages_for_template(trimmed_history, reasoning, language)
156
-
157
- # Используем содержимое шаблона из словаря, а не путь к файлу
158
  template_content = CHAT_TEMPLATES.get(language, CHAT_TEMPLATES["en"])
159
 
 
160
  text = tokenizer.apply_chat_template(
161
  messages_for_template,
162
- chat_template=template_content, # Передаем содержимое шаблона напрямую
163
  tokenize=False,
164
  add_generation_prompt=True
165
  )
@@ -177,12 +180,19 @@ def generate_response(user_text: str, history, reasoning: bool, language: str):
177
  )
178
 
179
  raw = tokenizer.decode(outputs[0], skip_special_tokens=False)
 
 
180
  reply, reasoning_text = extract_assistant_reply_and_reasoning(raw)
181
 
182
- history.append({"role": "assistant", "content": reply})
 
 
 
 
 
 
 
183
 
184
- return "", history, reasoning_text
185
-
186
  # --- Интерфейс Gradio ---
187
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
188
  gr.Markdown("# PyroNet-mini Chat")
@@ -232,10 +242,10 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
232
  outputs=[msg, chatbot, reasoning_box]
233
  )
234
  btn_clear.click(
235
- fn=lambda: ([], "", ""),
236
  inputs=[],
237
- outputs=[chatbot, msg, reasoning_box]
238
  )
239
 
240
  if __name__ == "__main__":
241
- demo.launch()
 
2
  import torch
3
  from transformers import AutoModelForCausalLM, AutoTokenizer
4
  from functools import lru_cache
5
+ import time
6
 
7
  # --- Конфигурация Hugging Face Space ---
8
  MODEL_NAME = "Kenan023214/PyroNet-mini"
9
  DEVICE = "cpu" # Используем CPU, как указано для Basic Space
10
+ MAX_NEW_TOKENS = 1024 # Увеличим для "хода мыслей"
11
  MAX_CONTEXT_TOKENS = 2048
12
 
13
  # Словарь с встроенным содержимым шаблонов чата
 
111
 
112
  def build_messages_for_template(history_messages, reasoning: bool, language: str):
113
  """Подготавливает сообщения для шаблона, включая системное сообщение."""
 
114
  full_template_content = CHAT_TEMPLATES.get(language, CHAT_TEMPLATES["en"])
115
 
 
116
  system_start_tag = "<|system|>"
117
  system_end_tag = "<|end|>"
118
  system_message_raw = full_template_content.split(system_start_tag)[1].split(system_end_tag)[0].strip()
 
145
 
146
  # --- Основная функция для Gradio ---
147
  def generate_response(user_text: str, history, reasoning: bool, language: str):
148
+ """
149
+ Обрабатывает пользовательский запрос, генерирует ответ и возвращает его
150
+ с эффектом печати.
151
+ """
152
+ # Добавляем user-сообщение во внутреннюю историю
153
+ history.append([user_text, None])
154
 
155
+ # Конвертируем Gradio-историю в наш внутренний формат
156
+ internal_history = [{"role": "user", "content": h[0]} for h in history if h[0] is not None]
157
 
158
+ trimmed_history = trim_history_to_max_tokens(internal_history, MAX_CONTEXT_TOKENS)
 
159
  messages_for_template = build_messages_for_template(trimmed_history, reasoning, language)
 
 
160
  template_content = CHAT_TEMPLATES.get(language, CHAT_TEMPLATES["en"])
161
 
162
+ # Применяем шаблон и токенизируем
163
  text = tokenizer.apply_chat_template(
164
  messages_for_template,
165
+ chat_template=template_content,
166
  tokenize=False,
167
  add_generation_prompt=True
168
  )
 
180
  )
181
 
182
  raw = tokenizer.decode(outputs[0], skip_special_tokens=False)
183
+
184
+ # Извлекаем финальный ответ и ход мыслей
185
  reply, reasoning_text = extract_assistant_reply_and_reasoning(raw)
186
 
187
+ # Обновляем историю Gradio с финальным ответом
188
+ history[-1][1] = ""
189
+
190
+ # Используем генератор для создания эффекта печати
191
+ for chunk in reply.split():
192
+ history[-1][1] += chunk + " "
193
+ time.sleep(0.05) # Небольшая задержка для анимации
194
+ yield "", history, reasoning_text
195
 
 
 
196
  # --- Интерфейс Gradio ---
197
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
198
  gr.Markdown("# PyroNet-mini Chat")
 
242
  outputs=[msg, chatbot, reasoning_box]
243
  )
244
  btn_clear.click(
245
+ fn=lambda: (None, [], ""),
246
  inputs=[],
247
+ outputs=[msg, chatbot, reasoning_box]
248
  )
249
 
250
  if __name__ == "__main__":
251
+ demo.launch()