Dropdead072 commited on
Commit
1e3cf08
·
verified ·
1 Parent(s): 4d25ddf

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +80 -28
app.py CHANGED
@@ -1,64 +1,116 @@
1
  import gradio as gr
 
2
  import os
3
- from pipeline import run_course_builder
4
-
5
  from dotenv import load_dotenv
 
6
  load_dotenv()
7
 
 
 
 
 
 
 
 
 
 
8
  def generate_course(query: str, toc: str, archive_file):
9
  if archive_file is None:
10
- return "Пожалуйста, загрузите архив с материалами (.zip)", ""
11
-
12
  try:
 
 
 
 
 
 
 
 
 
 
 
 
13
  temp_path = "temp_materials.zip"
14
  with open(temp_path, "wb") as f:
15
- f.write(archive_file.read())
16
-
17
- result = run_course_builder(query, toc, temp_path)
18
-
19
- if isinstance(result, str):
20
- markdown = result
21
- else:
22
- markdown = result.get("markdown", result.get("result", str(result)))
23
-
24
  return "✅ Курс успешно сгенерирован!", markdown
25
-
26
  except Exception as e:
27
- return f"❌ Ошибка: {str(e)}", ""
 
 
 
 
 
 
 
 
 
 
 
28
 
29
- # ====================== Gradio Interface ======================
30
 
 
 
 
 
 
 
 
 
 
 
 
31
  with gr.Blocks(title="Генератор учебных курсов", theme=gr.themes.Soft()) as demo:
32
  gr.Markdown("# 📚 Генератор Интенсивных Учебных Курсов")
33
- gr.Markdown("Загрузи оглавление + архив с материалами получи красивый понедельный план")
34
 
35
  with gr.Row():
36
  with gr.Column(scale=2):
37
  query_input = gr.Textbox(
38
- label="Запрос / Описание курса",
39
- placeholder="Напиши мне интенсивный курс на 9 недель по алгебре и введению в алгебраическую геометрию...",
40
  lines=3
41
  )
42
  toc_input = gr.Textbox(
43
- label="Оглавление (TOC)",
44
- placeholder="Вставь оглавление курса...",
45
- lines=10
46
  )
47
  file_input = gr.File(
48
  label="Архив с материалами (.zip)",
49
- file_types=[".zip"]
 
50
  )
51
 
52
  with gr.Column(scale=3):
53
- output_status = gr.Textbox(label="Статус", interactive=False)
54
- output_markdown = gr.Markdown(label="Сгенерированный курс", height=800)
55
 
56
- btn = gr.Button("🚀 Сгенерировать курс", variant="primary", size="large")
 
 
57
 
58
- btn.click(
 
59
  fn=generate_course,
60
  inputs=[query_input, toc_input, file_input],
61
- outputs=[output_status, output_markdown]
 
 
 
 
 
 
 
62
  )
63
 
64
  if __name__ == "__main__":
 
1
  import gradio as gr
2
+ import hashlib
3
  import os
 
 
4
  from dotenv import load_dotenv
5
+
6
  load_dotenv()
7
 
8
+ from pipeline import run_course_builder
9
+
10
+ cache = {}
11
+
12
+ def get_cache_key(query: str, toc: str, archive_name: str = "") -> str:
13
+ key_string = f"{query.strip()}|{toc.strip()}|{archive_name}"
14
+ return hashlib.md5(key_string.encode('utf-8')).hexdigest()
15
+
16
+
17
  def generate_course(query: str, toc: str, archive_file):
18
  if archive_file is None:
19
+ return "Пожалуйста, загрузите ZIP-архив с материалами", ""
20
+
21
  try:
22
+ if hasattr(archive_file, 'read'):
23
+ file_content = archive_file.read()
24
+ else:
25
+ with open(str(archive_file), "rb") as f:
26
+ file_content = f.read()
27
+
28
+ archive_name = getattr(archive_file, 'name', 'unknown.zip')
29
+ cache_key = get_cache_key(query, toc, archive_name)
30
+
31
+ if cache_key in cache:
32
+ return "✅ Курс успешно сгенерирован!", cache[cache_key]
33
+
34
  temp_path = "temp_materials.zip"
35
  with open(temp_path, "wb") as f:
36
+ f.write(file_content)
37
+
38
+ result = run_course_builder(query, toc or "", temp_path)
39
+
40
+ markdown = result if isinstance(result, str) else result.get("markdown") or result.get("result") or str(result)
41
+
42
+ cache[cache_key] = markdown
43
+
 
44
  return "✅ Курс успешно сгенерирован!", markdown
45
+
46
  except Exception as e:
47
+ error_msg = f"❌ Ошибка: {str(e)}"
48
+ return error_msg, error_msg
49
+
50
+
51
+ def clear_cache():
52
+ cache.clear()
53
+ if os.path.exists("temp_materials.zip"):
54
+ try:
55
+ os.remove("temp_materials.zip")
56
+ except:
57
+ pass
58
+ return "🗑️ Кэш очищен", ""
59
 
 
60
 
61
+ def clear_cache():
62
+ cache.clear()
63
+ if os.path.exists("temp_materials.zip"):
64
+ try:
65
+ os.remove("temp_materials.zip")
66
+ except:
67
+ pass
68
+ return "🗑️ Кэш и временные файлы очищены", ""
69
+
70
+
71
+ # ====================== Gradio Interface ======================
72
  with gr.Blocks(title="Генератор учебных курсов", theme=gr.themes.Soft()) as demo:
73
  gr.Markdown("# 📚 Генератор Интенсивных Учебных Курсов")
74
+ gr.Markdown("Загрузите оглавление и архив с материалами получите готовый понедельный план")
75
 
76
  with gr.Row():
77
  with gr.Column(scale=2):
78
  query_input = gr.Textbox(
79
+ label="Описание курса",
80
+ placeholder="Напишите, какой курс вам нужен (например: интенсивный курс на 9 недель по алгебре и введению в алгебраическую геометрию)...",
81
  lines=3
82
  )
83
  toc_input = gr.Textbox(
84
+ label="Оглавление (необязательно)",
85
+ placeholder="Вставьте оглавление курса...",
86
+ lines=8
87
  )
88
  file_input = gr.File(
89
  label="Архив с материалами (.zip)",
90
+ file_types=[".zip"],
91
+ type="filepath"
92
  )
93
 
94
  with gr.Column(scale=3):
95
+ status_output = gr.Textbox(label="Статус", interactive=False)
96
+ markdown_output = gr.Markdown(label="Сгенерированный курс", height=720)
97
 
98
+ with gr.Row():
99
+ generate_btn = gr.Button("🚀 Сгенерировать курс", variant="primary", size="large")
100
+ clear_btn = gr.Button("🗑️ Очистить кэш и файлы", variant="secondary")
101
 
102
+ # Обработка генерации
103
+ generate_btn.click(
104
  fn=generate_course,
105
  inputs=[query_input, toc_input, file_input],
106
+ outputs=[status_output, markdown_output]
107
+ )
108
+
109
+ # Очистка кэша
110
+ clear_btn.click(
111
+ fn=clear_cache,
112
+ inputs=[],
113
+ outputs=[status_output, markdown_output]
114
  )
115
 
116
  if __name__ == "__main__":