CourseBuilder / app.py
Dropdead072's picture
Update app.py
4bc15ad verified
import gradio as gr
import hashlib
import os
from dotenv import load_dotenv
load_dotenv()
from pipeline import run_course_builder
cache = {}
def get_cache_key(query: str, toc: str, archive_name: str = "") -> str:
key_string = f"{query.strip()}|{toc.strip()}|{archive_name}"
return hashlib.md5(key_string.encode('utf-8')).hexdigest()
def generate_course(query: str, toc: str, archive_file):
if archive_file is None:
return "❌ Пожалуйста, загрузите ZIP-архив с материалами", ""
try:
if hasattr(archive_file, 'read'):
file_content = archive_file.read()
else:
with open(str(archive_file), "rb") as f:
file_content = f.read()
archive_name = getattr(archive_file, 'name', 'unknown.zip')
cache_key = get_cache_key(query, toc, archive_name)
if cache_key in cache:
return "✅ Курс успешно сгенерирован!", cache[cache_key]
temp_path = "temp_materials.zip"
with open(temp_path, "wb") as f:
f.write(file_content)
result = run_course_builder(query, toc or "", temp_path)
markdown = result if isinstance(result, str) else result.get("markdown") or result.get("result") or str(result)
cache[cache_key] = markdown
return "✅ Курс успешно сгенерирован!", markdown
except Exception as e:
error_msg = f"❌ Ошибка: {str(e)}"
return error_msg, error_msg
def clear_cache():
cache.clear()
if os.path.exists("temp_materials.zip"):
try:
os.remove("temp_materials.zip")
except:
pass
return "🗑️ Кэш очищен", ""
def clear_cache():
cache.clear()
if os.path.exists("temp_materials.zip"):
try:
os.remove("temp_materials.zip")
except:
pass
return "🗑️ Кэш и временные файлы очищены", ""
# ====================== Gradio Interface ======================
with gr.Blocks(title="Генератор учебных курсов", theme=gr.themes.Soft()) as demo:
gr.Markdown("# 📚 Генератор Учебных Курсов")
gr.Markdown("Загрузите оглавление и архив с материалами — получите готовый понедельный план")
with gr.Row():
with gr.Column(scale=2):
query_input = gr.Textbox(
label="Описание курса",
placeholder="Напишите, какой курс вам нужен (например: интенсивный курс на 9 недель по алгебре и геометрии)...",
lines=3
)
toc_input = gr.Textbox(
label="Оглавление",
placeholder="Вставьте оглавление предоставляемых материалов...",
lines=8
)
file_input = gr.File(
label="Архив с материалами (.zip)",
file_types=[".zip"],
type="filepath"
)
with gr.Column(scale=3):
status_output = gr.Textbox(label="Статус", interactive=False)
markdown_output = gr.Markdown(label="Сгенерированный курс", height=720)
with gr.Row():
generate_btn = gr.Button("🚀 Сгенерировать курс", variant="primary", size="large")
clear_btn = gr.Button("🗑️ Очистить кэш и файлы", variant="secondary")
# Обработка генерации
generate_btn.click(
fn=generate_course,
inputs=[query_input, toc_input, file_input],
outputs=[status_output, markdown_output]
)
# Очистка кэша
clear_btn.click(
fn=clear_cache,
inputs=[],
outputs=[status_output, markdown_output]
)
if __name__ == "__main__":
demo.launch()