Spaces:
Sleeping
Sleeping
| 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() |