File size: 5,875 Bytes
e0baf3c
 
99a6360
e79e5f0
 
7a0a3a3
e79e5f0
e0baf3c
 
 
8a9bac8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import gradio as gr
import os
import json
from file_utils import (
    extract_text_from_file,
    call_llm
)


def file_dashboard():
    uploaded_files = gr.State([])
    file_sections = gr.State({})
    file_texts = gr.State({})
    chat_history = gr.State({})
    quiz_data = gr.State({})
    total_score = gr.State({})

    file_guide_list = gr.Radio(label="Your Study Guides", choices=[], interactive=True)
    btn_file_view = gr.Button("πŸ“ Files")

    file_upload = gr.File(label="πŸ“€ Upload File", file_types=[".pdf", ".txt", ".md", ".pptx"])
    study_guide_output = gr.Markdown("Upload a file to generate a study guide.")
    file_chat_output = gr.Row(visible=False)

    with file_chat_output:
        file_preview = gr.Textbox(label="πŸ“„ File Content Preview", lines=15, interactive=False)
        chat_output = gr.Chatbot(label="πŸ’¬ Chat with Document")

    chat_input = gr.Textbox(label="Ask something about this file")
    generate_quiz_btn = gr.Button("🧠 Generate Quiz from File")
    quiz_container = gr.Column(visible=False)
    quiz_score = gr.Textbox(label="Your Score", interactive=False, visible=False)

    def store_file_and_generate_guide(file, current_files, section_map, text_map):
        if file is None:
            return current_files, section_map, text_map, "No file uploaded.", gr.update(choices=[])
        text = extract_text_from_file(file)
        filename = os.path.basename(file.name)
        prompt = f"Break the content into 4–6 logical learning sections. Format: 'Section Title: Short summary'\n\n{text}"
        response = call_llm(prompt, system_message="You are a helpful assistant for students studying documents.")
        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, f"### {filename} Study Guide\n\n{response}", gr.update(choices=updated_files)

    def load_study_guide(selected_filename, section_map):
        if not selected_filename or selected_filename not in section_map:
            return "No study guide available."
        return f"### {selected_filename} Study Guide\n\n{section_map[selected_filename]}"

    def open_file_viewer(selected_file, text_map):
        content = text_map.get(selected_file, "No file content available.")
        return gr.update(visible=True), content, []

    def chat_with_file(question, selected_file, text_map, history_map):
        if not selected_file or selected_file not in text_map:
            return [], history_map
        text = text_map[selected_file]
        history = history_map.get(selected_file, [])
        prompt = f"You are a helpful tutor. Answer this question using the document content below.\n\n{text}\n\nQuestion: {question}"
        answer = call_llm(prompt)
        new_history = history + [(question, answer)]
        history_map[selected_file] = new_history
        return new_history, history_map

    def generate_quiz_ui(selected_file, text_map):
        if not selected_file or selected_file not in text_map:
            return gr.update(visible=True), gr.update(visible=False, value="")

        text = text_map[selected_file]
        prompt = f"Create 5 multiple-choice questions based on the content below.\nReturn as JSON list with 'question', 'options' (list), and 'answer'.\n\n{text}"
        response = call_llm(prompt)

        try:
            questions = json.loads(response)
            quiz_elements = []
            score = {"correct": 0, "total": len(questions)}

            for i, q in enumerate(questions):
                question_md = gr.Markdown(f"**Q{i+1}. {q['question']}**")
                options = gr.Radio(choices=q['options'], label=f"Your Answer to Q{i+1}", interactive=True)
                feedback = gr.Textbox(label="Result", interactive=False)

                def evaluate(ans):
                    def check(choice):
                        correct = choice == ans
                        return "βœ… Correct!" if correct else f"❌ Incorrect. Correct answer: {ans}"
                    return check

                options.change(fn=evaluate(q['answer']), inputs=[options], outputs=[feedback])
                quiz_elements.extend([question_md, options, feedback])

            return gr.update(visible=True), gr.update(visible=True, value=f"Score: 0/{score['total']}")

        except Exception as e:
            return gr.update(visible=True), gr.update(visible=True, value="Error generating quiz.")

    file_upload.change(
        fn=store_file_and_generate_guide,
        inputs=[file_upload, uploaded_files, file_sections, file_texts],
        outputs=[uploaded_files, file_sections, file_texts, study_guide_output, file_guide_list],
        show_progress="minimal"
    )

    file_guide_list.change(
        fn=load_study_guide,
        inputs=[file_guide_list, file_sections],
        outputs=[study_guide_output],
        show_progress="minimal"
    )

    btn_file_view.click(
        fn=open_file_viewer,
        inputs=[file_guide_list, file_texts],
        outputs=[file_chat_output, file_preview, chat_output]
    )

    chat_input.submit(
        fn=chat_with_file,
        inputs=[chat_input, file_guide_list, file_texts, chat_history],
        outputs=[chat_output, chat_history],
        show_progress="minimal"
    )

    generate_quiz_btn.click(
        fn=generate_quiz_ui,
        inputs=[file_guide_list, file_texts],
        outputs=[quiz_container, quiz_score],
        show_progress="minimal"
    )

    return gr.Column(
        components=[
            file_upload,
            study_guide_output,
            file_chat_output,
            chat_input,
            generate_quiz_btn,
            quiz_container,
            quiz_score
        ],
        scale=4,
        elem_id="main-column"
    )