| import gradio as gr |
| import os |
| import json |
| from file_utils import ( |
| extract_text_from_file, |
| call_llm, |
| save_study_guide, |
| fetch_study_guides |
| ) |
|
|
| def file_study_guide_dashboard(nickname): |
| uploaded_files = gr.State([]) |
| file_sections = gr.State({}) |
| file_texts = gr.State({}) |
|
|
| with gr.Column(scale=4, elem_id="main-column") as guide_content: |
| nickname_input = nickname |
| file_upload = gr.File(label="π€ Upload File for Study Guide", file_types=[".pdf", ".txt", ".md", ".pptx"]) |
| study_guide_output = gr.Textbox(label="π Generated Study Guide", lines=10, interactive=False) |
| save_guide_btn = gr.Button("π Save Study Guide") |
|
|
| saved_guides_dropdown = gr.Dropdown(label="π Your Saved Guides", choices=[], interactive=True) |
| saved_guide_display = gr.Textbox(label="π Selected Guide Content", lines=10, interactive=False) |
|
|
| def generate_study_guide(file, current_files, section_map, text_map): |
| if file is None: |
| return current_files, section_map, text_map, "No file uploaded." |
|
|
| text = extract_text_from_file(file) |
| filename = os.path.basename(file.name) |
|
|
| prompt = f"Divide this document into 4β6 learning sections. For each section, include a bold title and 2β3 line explanation.\n\n{text}" |
| response = call_llm(prompt, system_message="You are an AI tutor creating study guides.") |
|
|
| updated_files = current_files + [filename] if filename not in current_files else current_files |
| section_map[filename] = response |
| text_map[filename] = text |
|
|
| return updated_files, section_map, text_map, response |
|
|
| def save_guide_to_db(user, uploaded_files, section_map): |
| if not uploaded_files or user.strip() == "": |
| return |
| filename = uploaded_files[-1] |
| guide = section_map.get(filename, "") |
| if guide: |
| save_study_guide(user=user, filename=filename, guide=guide) |
|
|
| def load_user_guides(user): |
| guides = fetch_study_guides(user) |
| return [f"{g.filename} ({g.timestamp})" for g in guides] |
|
|
| def show_saved_guide(user, label): |
| guides = fetch_study_guides(user) |
| for g in guides: |
| if label.startswith(g.filename): |
| return g.guide |
| return "" |
|
|
| file_upload.change( |
| fn=generate_study_guide, |
| inputs=[file_upload, uploaded_files, file_sections, file_texts], |
| outputs=[uploaded_files, file_sections, file_texts, study_guide_output] |
| ) |
|
|
| save_guide_btn.click( |
| fn=save_guide_to_db, |
| inputs=[nickname_input, uploaded_files, file_sections], |
| outputs=[] |
| ) |
|
|
| nickname_input.change( |
| fn=load_user_guides, |
| inputs=[nickname_input], |
| outputs=[saved_guides_dropdown] |
| ) |
|
|
| saved_guides_dropdown.change( |
| fn=show_saved_guide, |
| inputs=[nickname_input, saved_guides_dropdown], |
| outputs=[saved_guide_display] |
| ) |
|
|
| return guide_content |
|
|