CommTutor / file_study_guide_panel.py
ankban's picture
Update file_study_guide_panel.py
9fa3d3d verified
Raw
History Blame
3.18 kB
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