File size: 6,952 Bytes
e0baf3c
 
99a6360
e79e5f0
 
7a0a3a3
e79e5f0
e0baf3c
 
 
0a0c7fa
78b6fc4
 
c47a4d5
d3d2ca6
99a6360
 
78b6fc4
0a0c7fa
 
78b6fc4
5206c58
 
 
 
 
 
78b6fc4
5206c58
 
fb9d374
e79e5f0
5206c58
78b6fc4
5206c58
78b6fc4
 
 
 
d3d2ca6
 
c47a4d5
 
99a6360
 
 
0a0c7fa
c47a4d5
0a0c7fa
c47a4d5
7a0a3a3
78b6fc4
 
 
 
 
c47a4d5
 
78b6fc4
 
 
 
 
7a0a3a3
d3d2ca6
 
 
c47a4d5
d3d2ca6
c47a4d5
d3d2ca6
c47a4d5
d3d2ca6
 
 
 
 
 
e0baf3c
99a6360
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e0baf3c
78b6fc4
c47a4d5
 
0a0c7fa
e0baf3c
 
78b6fc4
 
 
 
 
 
 
 
 
d3d2ca6
78b6fc4
 
 
d3d2ca6
c47a4d5
d3d2ca6
 
c47a4d5
 
 
99a6360
 
 
 
 
 
 
78b6fc4
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
import gradio as gr
import os
import json
from file_utils import (
    extract_text_from_file,
    call_llm
)


def file_dashboard():
    with gr.Blocks(elem_id="file-learning-layout") as file_panel:
        uploaded_files = gr.State([])
        file_sections = gr.State({})
        file_texts = gr.State({})
        chat_history = gr.State({})
        quiz_data = gr.State({})
        total_score = gr.State({})

        with gr.Row():
            with gr.Column(scale=1, min_width=220):
                gr.Markdown("### πŸŽ“ Educare", elem_id="sidebar-title")
                gr.Markdown("---")
                with gr.Accordion("🧭 Learning Modes", open=True):
                    btn_spoken = gr.Button("πŸ—£ Spoken Communication")
                    btn_written = gr.Button("✍️ Written Communication")
                    with gr.Accordion("πŸ“„ File-Based Learning", open=True):
                        btn_study_guides = gr.Button("πŸ“˜ Study Guides")
                        file_guide_list = gr.Radio(label="Your Study Guides", choices=[], interactive=True)
                        btn_file_view = gr.Button("πŸ“ Files")
                gr.Markdown("---")
                gr.Markdown("""Ankush Bansal""", elem_id="sidebar-user")

            with gr.Column(scale=4, elem_id="main-column") as main_content:
                mode_view = gr.State("upload")
                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_display = 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(selected_file, text_map):
            if not selected_file or selected_file not in text_map:
                return gr.update(visible=True), [], {}, gr.update(visible=True, 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)
                score_state = {"score": 0, "total": len(questions)}
                with quiz_display:
                    for i, q in enumerate(questions):
                        q_text = gr.Markdown(f"**Q{i+1}. {q['question']}**")
                        q_radio = gr.Radio(choices=q['options'], label="Select an answer")
                        q_feedback = gr.Textbox(label="Result", interactive=False)
                        def handle_answer(choice, ans=q['answer'], score_state=score_state):
                            if choice == ans:
                                score_state["score"] += 1
                                return "βœ… Correct!"
                            return f"❌ Incorrect. Correct answer: {ans}"
                        q_radio.change(handle_answer, inputs=[q_radio], outputs=[q_feedback])
                return gr.update(visible=True), questions, {selected_file: questions}, gr.update(visible=True, value="Score: 0/5")
            except:
                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,
            inputs=[file_guide_list, file_texts],
            outputs=[quiz_display, quiz_display, quiz_data, quiz_score],
            show_progress="minimal"
        )

        return file_panel