Spaces:
Sleeping
Sleeping
| """ | |
| Gradio web interface for the TutorX MCP Server | |
| """ | |
| import gradio as gr | |
| import numpy as np | |
| import json | |
| import base64 | |
| from io import BytesIO | |
| from PIL import Image | |
| from datetime import datetime | |
| # Import MCP client to communicate with the MCP server | |
| from client import client | |
| # Utility functions | |
| def image_to_base64(img): | |
| """Convert a PIL image or numpy array to base64 string""" | |
| if isinstance(img, np.ndarray): | |
| img = Image.fromarray(img) | |
| buffered = BytesIO() | |
| img.save(buffered, format="PNG") | |
| img_str = base64.b64encode(buffered.getvalue()).decode() | |
| return img_str | |
| def format_json(data): | |
| """Format JSON data for display""" | |
| return json.dumps(data, indent=2) | |
| # Create Gradio interface | |
| with gr.Blocks(title="TutorX Educational AI", theme=gr.themes.Soft()) as demo: | |
| gr.Markdown("# 📚 TutorX Educational AI Platform") | |
| gr.Markdown(""" | |
| An adaptive, multi-modal, and collaborative AI tutoring platform built with MCP. | |
| This interface demonstrates the functionality of the TutorX MCP server. | |
| """) | |
| # Set a default student ID for the demo | |
| student_id = "student_12345" | |
| with gr.Tabs() as tabs: | |
| # Tab 1: Core Features | |
| with gr.Tab("Core Features"): | |
| gr.Markdown("## Adaptive Learning Engine") | |
| with gr.Row(): | |
| with gr.Column(): | |
| concept_id_input = gr.Dropdown( | |
| choices=["math_algebra_basics", "math_algebra_linear_equations", "math_algebra_quadratic_equations"], | |
| label="Select Concept", | |
| value="math_algebra_linear_equations" | |
| ) | |
| assess_btn = gr.Button("Assess Skill") | |
| with gr.Column(): | |
| assessment_output = gr.JSON(label="Skill Assessment") | |
| assess_btn.click( | |
| fn=lambda concept: client.assess_skill(student_id, concept), | |
| inputs=[concept_id_input], | |
| outputs=[assessment_output] | |
| ) | |
| gr.Markdown("## Concept Graph") | |
| concept_graph_btn = gr.Button("Show Concept Graph") | |
| concept_graph_output = gr.JSON(label="Concept Graph") | |
| concept_graph_btn.click( | |
| fn=lambda: client.get_concept_graph(), | |
| inputs=[], | |
| outputs=[concept_graph_output] | |
| ) | |
| gr.Markdown("## Assessment Generation") | |
| with gr.Row(): | |
| with gr.Column(): | |
| concepts_input = gr.CheckboxGroup( | |
| choices=["math_algebra_basics", "math_algebra_linear_equations", "math_algebra_quadratic_equations"], | |
| label="Select Concepts", | |
| value=["math_algebra_linear_equations"] | |
| ) | |
| diff_input = gr.Slider(minimum=1, maximum=5, value=2, step=1, label="Difficulty") | |
| gen_quiz_btn = gr.Button("Generate Quiz") | |
| with gr.Column(): | |
| quiz_output = gr.JSON(label="Generated Quiz") | |
| gen_quiz_btn.click( | |
| fn=lambda concepts, diff: client.generate_quiz(concepts, diff), | |
| inputs=[concepts_input, diff_input], | |
| outputs=[quiz_output] | |
| ) | |
| # Tab 2: Advanced Features | |
| with gr.Tab("Advanced Features"): | |
| gr.Markdown("## Lesson Generation") | |
| with gr.Row(): | |
| with gr.Column(): | |
| topic_input = gr.Textbox(label="Lesson Topic", value="Solving Quadratic Equations") | |
| grade_input = gr.Slider(minimum=1, maximum=12, value=9, step=1, label="Grade Level") | |
| duration_input = gr.Slider(minimum=15, maximum=90, value=45, step=5, label="Duration (minutes)") | |
| gen_lesson_btn = gr.Button("Generate Lesson Plan") | |
| with gr.Column(): | |
| lesson_output = gr.JSON(label="Lesson Plan") | |
| gen_lesson_btn.click( | |
| fn=lambda topic, grade, duration: client.generate_lesson(topic, grade, duration), | |
| inputs=[topic_input, grade_input, duration_input], | |
| outputs=[lesson_output] | |
| ) | |
| gr.Markdown("## Curriculum Standards") | |
| with gr.Row(): | |
| with gr.Column(): | |
| country_input = gr.Dropdown( | |
| choices=["us", "uk"], | |
| label="Country", | |
| value="us" | |
| ) | |
| standards_btn = gr.Button("Get Standards") | |
| with gr.Column(): | |
| standards_output = gr.JSON(label="Curriculum Standards") | |
| standards_btn.click( | |
| fn=lambda country: client.get_curriculum_standards(country), | |
| inputs=[country_input], | |
| outputs=[standards_output] | |
| ) | |
| # Tab 3: Multi-Modal Interaction | |
| with gr.Tab("Multi-Modal Interaction"): | |
| gr.Markdown("## Text Interaction") | |
| with gr.Row(): | |
| with gr.Column(): | |
| text_input = gr.Textbox(label="Ask a Question", value="How do I solve a quadratic equation?") | |
| text_btn = gr.Button("Submit") | |
| with gr.Column(): | |
| text_output = gr.JSON(label="Response") | |
| text_btn.click( | |
| fn=lambda query: client.text_interaction(query, student_id), | |
| inputs=[text_input], | |
| outputs=[text_output] | |
| ) | |
| gr.Markdown("## Handwriting Recognition") | |
| with gr.Row(): | |
| with gr.Column(): | |
| drawing_input = gr.Sketchpad(label="Draw an Equation") | |
| drawing_btn = gr.Button("Recognize") | |
| with gr.Column(): | |
| drawing_output = gr.JSON(label="Recognition Results") | |
| # Convert drawing to base64 then process | |
| drawing_btn.click( | |
| fn=lambda img: client.handwriting_recognition(image_to_base64(img), student_id), | |
| inputs=[drawing_input], | |
| outputs=[drawing_output] | |
| ) | |
| # Tab 4: Analytics | |
| with gr.Tab("Analytics"): | |
| gr.Markdown("## Student Performance") | |
| analytics_btn = gr.Button("Generate Analytics Report") | |
| timeframe = gr.Slider(minimum=7, maximum=90, value=30, step=1, label="Timeframe (days)") | |
| analytics_output = gr.JSON(label="Performance Analytics") | |
| analytics_btn.click( | |
| fn=lambda days: client.get_student_analytics(student_id, days), | |
| inputs=[timeframe], | |
| outputs=[analytics_output] | |
| ) | |
| gr.Markdown("## Error Pattern Analysis") | |
| error_concept = gr.Dropdown( | |
| choices=["math_algebra_basics", "math_algebra_linear_equations", "math_algebra_quadratic_equations"], | |
| label="Select Concept for Error Analysis", | |
| value="math_algebra_linear_equations" | |
| ) | |
| error_btn = gr.Button("Analyze Errors") | |
| error_output = gr.JSON(label="Error Pattern Analysis") | |
| error_btn.click( | |
| fn=lambda concept: client.analyze_error_patterns(student_id, concept), | |
| inputs=[error_concept], | |
| outputs=[error_output] | |
| ) | |
| # Tab 5: Assessment Tools | |
| with gr.Tab("Assessment Tools"): | |
| gr.Markdown("## Create Assessment") | |
| with gr.Row(): | |
| with gr.Column(): | |
| assess_concepts = gr.CheckboxGroup( | |
| choices=["math_algebra_basics", "math_algebra_linear_equations", "math_algebra_quadratic_equations"], | |
| label="Select Concepts", | |
| value=["math_algebra_linear_equations"] | |
| ) | |
| assess_questions = gr.Slider(minimum=1, maximum=10, value=3, step=1, label="Number of Questions") | |
| assess_diff = gr.Slider(minimum=1, maximum=5, value=3, step=1, label="Difficulty") | |
| create_assess_btn = gr.Button("Create Assessment") | |
| with gr.Column(): | |
| assessment_output = gr.JSON(label="Generated Assessment") | |
| create_assess_btn.click( | |
| fn=lambda concepts, num, diff: client.create_assessment(concepts, num, diff), | |
| inputs=[assess_concepts, assess_questions, assess_diff], | |
| outputs=[assessment_output] | |
| ) | |
| gr.Markdown("## Plagiarism Detection") | |
| with gr.Row(): | |
| with gr.Column(): | |
| submission_input = gr.Textbox( | |
| label="Student Submission", | |
| lines=5, | |
| value="The quadratic formula states that if ax² + bx + c = 0, then x = (-b ± √(b² - 4ac)) / 2a." | |
| ) | |
| reference_input = gr.Textbox( | |
| label="Reference Source", | |
| lines=5, | |
| value="According to the quadratic formula, for any equation in the form ax² + bx + c = 0, the solutions are x = (-b ± √(b² - 4ac)) / 2a." | |
| ) | |
| plagiarism_btn = gr.Button("Check Originality") | |
| with gr.Column(): | |
| plagiarism_output = gr.JSON(label="Originality Report") | |
| plagiarism_btn.click( | |
| fn=lambda sub, ref: client.check_submission_originality(sub, [ref]), | |
| inputs=[submission_input, reference_input], | |
| outputs=[plagiarism_output] | |
| ) | |
| # Launch the app | |
| if __name__ == "__main__": | |
| demo.launch() | |