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()