Spaces:
Running
Running
| """ | |
| Advanced Automated Content Generation tools for TutorX. | |
| Generates interactive content, exercises, and adaptive learning materials. | |
| """ | |
| import json | |
| import uuid | |
| from datetime import datetime | |
| from typing import Dict, Any, List, Optional | |
| from mcp_server.mcp_instance import mcp | |
| from mcp_server.model.gemini_flash import GeminiFlash | |
| MODEL = GeminiFlash() | |
| def extract_json_from_text(text: str): | |
| """Extract JSON from text response""" | |
| import re | |
| if not text or not isinstance(text, str): | |
| return None | |
| # Remove code fences | |
| text = re.sub(r'^\s*```(?:json)?\s*', '', text, flags=re.IGNORECASE) | |
| text = re.sub(r'\s*```\s*$', '', text, flags=re.IGNORECASE) | |
| text = text.strip() | |
| # Remove trailing commas | |
| text = re.sub(r',([ \t\r\n]*[}}\]])', r'\1', text) | |
| return json.loads(text) | |
| async def generate_interactive_exercise(concept: str, exercise_type: str = "problem_solving", | |
| difficulty_level: float = 0.5, | |
| student_level: str = "intermediate") -> dict: | |
| """ | |
| Generate interactive exercises with multiple components and adaptive features. | |
| Args: | |
| concept: The concept to create exercises for | |
| exercise_type: Type of exercise ('problem_solving', 'simulation', 'case_study', 'lab', 'project') | |
| difficulty_level: Difficulty level (0.0 to 1.0) | |
| student_level: Student's academic level | |
| Returns: | |
| Dictionary with interactive exercise content | |
| """ | |
| try: | |
| prompt = f""" | |
| Create an interactive {exercise_type} exercise for the concept: "{concept}" | |
| Exercise Parameters: | |
| - Difficulty Level: {difficulty_level:.2f}/1.0 | |
| - Student Level: {student_level} | |
| - Exercise Type: {exercise_type} | |
| Generate a comprehensive interactive exercise that includes: | |
| 1. Clear learning objectives | |
| 2. Step-by-step instructions | |
| 3. Interactive components that engage the student | |
| 4. Multiple difficulty levels within the exercise | |
| 5. Real-time feedback mechanisms | |
| 6. Assessment criteria | |
| 7. Extension activities for advanced students | |
| Return JSON with: | |
| - "exercise_id": unique identifier | |
| - "title": engaging title for the exercise | |
| - "learning_objectives": list of specific learning goals | |
| - "introduction": engaging introduction to the exercise | |
| - "instructions": detailed step-by-step instructions | |
| - "interactive_components": list of interactive elements | |
| - "materials_needed": required materials or resources | |
| - "estimated_time": estimated completion time in minutes | |
| - "difficulty_variations": easier and harder versions | |
| - "assessment_rubric": criteria for evaluating student work | |
| - "feedback_prompts": questions for self-reflection | |
| - "extension_activities": additional challenges for advanced students | |
| - "real_world_connections": how this relates to real-world applications | |
| """ | |
| response = await MODEL.generate_text(prompt, temperature=0.7) | |
| exercise_data = extract_json_from_text(response) | |
| # Add metadata | |
| exercise_data.update({ | |
| "success": True, | |
| "concept": concept, | |
| "exercise_type": exercise_type, | |
| "difficulty_level": difficulty_level, | |
| "student_level": student_level, | |
| "generated_at": datetime.utcnow().isoformat(), | |
| "ai_generated": True | |
| }) | |
| return exercise_data | |
| except Exception as e: | |
| return { | |
| "success": False, | |
| "error": f"Failed to generate interactive exercise: {str(e)}" | |
| } | |
| async def generate_adaptive_content_sequence(topic: str, student_profile: dict, | |
| sequence_length: int = 5) -> dict: | |
| """ | |
| Generate a sequence of adaptive content that adjusts based on student profile. | |
| Args: | |
| topic: Main topic for the content sequence | |
| student_profile: Student's learning profile and preferences | |
| sequence_length: Number of content pieces in the sequence | |
| Returns: | |
| Dictionary with adaptive content sequence | |
| """ | |
| try: | |
| prompt = f""" | |
| Create an adaptive content sequence for the topic: "{topic}" | |
| Student Profile: | |
| {json.dumps(student_profile, indent=2)} | |
| Generate a sequence of {sequence_length} interconnected content pieces that: | |
| 1. Build upon each other progressively | |
| 2. Adapt to the student's learning style and preferences | |
| 3. Include multiple content types (text, visual descriptions, interactive elements) | |
| 4. Provide branching paths based on understanding | |
| 5. Include assessment checkpoints | |
| 6. Offer remediation and enrichment options | |
| Return JSON with: | |
| - "sequence_id": unique identifier for the sequence | |
| - "topic": main topic | |
| - "total_pieces": number of content pieces | |
| - "estimated_total_time": total estimated time in minutes | |
| - "content_sequence": array of content pieces, each with: | |
| - "piece_id": unique identifier | |
| - "title": content title | |
| - "content_type": type of content (explanation, example, practice, assessment) | |
| - "content": main content text | |
| - "visual_elements": descriptions of visual components | |
| - "interactive_elements": interactive components | |
| - "difficulty_level": difficulty rating | |
| - "prerequisites": what student should know | |
| - "learning_objectives": specific objectives for this piece | |
| - "assessment_questions": questions to check understanding | |
| - "branching_options": different paths based on performance | |
| - "estimated_time": time for this piece | |
| - "adaptation_rules": rules for how content adapts to student responses | |
| - "success_criteria": criteria for successful completion | |
| """ | |
| response = await MODEL.generate_text(prompt, temperature=0.6) | |
| sequence_data = extract_json_from_text(response) | |
| # Add metadata | |
| sequence_data.update({ | |
| "success": True, | |
| "topic": topic, | |
| "student_profile": student_profile, | |
| "generated_at": datetime.utcnow().isoformat(), | |
| "ai_generated": True | |
| }) | |
| return sequence_data | |
| except Exception as e: | |
| return { | |
| "success": False, | |
| "error": f"Failed to generate adaptive content sequence: {str(e)}" | |
| } | |
| async def generate_scenario_based_learning(concept: str, scenario_type: str = "real_world", | |
| complexity_level: str = "moderate") -> dict: | |
| """ | |
| Generate scenario-based learning content with realistic situations. | |
| Args: | |
| concept: The concept to teach through scenarios | |
| scenario_type: Type of scenario ('real_world', 'historical', 'futuristic', 'problem_solving') | |
| complexity_level: Complexity of the scenario ('simple', 'moderate', 'complex') | |
| Returns: | |
| Dictionary with scenario-based learning content | |
| """ | |
| try: | |
| prompt = f""" | |
| Create a {scenario_type} scenario-based learning experience for: "{concept}" | |
| Scenario Parameters: | |
| - Type: {scenario_type} | |
| - Complexity: {complexity_level} | |
| Design a realistic scenario that: | |
| 1. Presents the concept in a meaningful context | |
| 2. Requires students to apply their knowledge | |
| 3. Includes decision points and consequences | |
| 4. Provides multiple solution paths | |
| 5. Connects to real-world applications | |
| 6. Engages students emotionally and intellectually | |
| Return JSON with: | |
| - "scenario_id": unique identifier | |
| - "title": compelling scenario title | |
| - "setting": detailed description of the scenario setting | |
| - "background_story": engaging background narrative | |
| - "main_challenge": primary challenge students must solve | |
| - "characters": key characters in the scenario (if applicable) | |
| - "decision_points": critical decisions students must make | |
| - "possible_outcomes": different outcomes based on decisions | |
| - "learning_integration": how the concept is woven into the scenario | |
| - "assessment_criteria": how to evaluate student responses | |
| - "discussion_questions": questions for reflection and discussion | |
| - "extension_scenarios": related scenarios for further exploration | |
| - "real_world_connections": connections to actual situations | |
| - "resources": additional resources students might need | |
| """ | |
| response = await MODEL.generate_text(prompt, temperature=0.8) | |
| scenario_data = extract_json_from_text(response) | |
| # Add metadata | |
| scenario_data.update({ | |
| "success": True, | |
| "concept": concept, | |
| "scenario_type": scenario_type, | |
| "complexity_level": complexity_level, | |
| "generated_at": datetime.utcnow().isoformat(), | |
| "ai_generated": True | |
| }) | |
| return scenario_data | |
| except Exception as e: | |
| return { | |
| "success": False, | |
| "error": f"Failed to generate scenario-based learning: {str(e)}" | |
| } | |
| async def generate_multimodal_content(concept: str, modalities: List[str] = None, | |
| target_audience: str = "general") -> dict: | |
| """ | |
| Generate multi-modal content that appeals to different learning styles. | |
| Args: | |
| concept: The concept to create content for | |
| modalities: List of modalities to include ('visual', 'auditory', 'kinesthetic', 'reading') | |
| target_audience: Target audience description | |
| Returns: | |
| Dictionary with multi-modal content | |
| """ | |
| try: | |
| if not modalities: | |
| modalities = ["visual", "auditory", "kinesthetic", "reading"] | |
| prompt = f""" | |
| Create multi-modal content for the concept: "{concept}" | |
| Target Audience: {target_audience} | |
| Modalities to include: {modalities} | |
| Generate content that appeals to different learning styles: | |
| Return JSON with: | |
| - "content_id": unique identifier | |
| - "concept": the main concept | |
| - "visual_content": content for visual learners (descriptions of diagrams, charts, images) | |
| - "auditory_content": content for auditory learners (descriptions of sounds, music, verbal explanations) | |
| - "kinesthetic_content": content for kinesthetic learners (hands-on activities, movement, manipulation) | |
| - "reading_content": content for reading/writing learners (text-based materials, written exercises) | |
| - "integrated_activities": activities that combine multiple modalities | |
| - "accessibility_features": features for students with different abilities | |
| - "technology_integration": how technology can enhance each modality | |
| - "assessment_variations": different ways to assess understanding for each modality | |
| - "adaptation_guidelines": how to adapt content for different needs | |
| """ | |
| response = await MODEL.generate_text(prompt, temperature=0.7) | |
| content_data = extract_json_from_text(response) | |
| # Add metadata | |
| content_data.update({ | |
| "success": True, | |
| "concept": concept, | |
| "modalities": modalities, | |
| "target_audience": target_audience, | |
| "generated_at": datetime.utcnow().isoformat(), | |
| "ai_generated": True | |
| }) | |
| return content_data | |
| except Exception as e: | |
| return { | |
| "success": False, | |
| "error": f"Failed to generate multimodal content: {str(e)}" | |
| } | |
| async def generate_adaptive_assessment(concept: str, assessment_type: str = "formative", | |
| student_data: dict = None) -> dict: | |
| """ | |
| Generate adaptive assessments that adjust based on student responses. | |
| Args: | |
| concept: The concept to assess | |
| assessment_type: Type of assessment ('formative', 'summative', 'diagnostic', 'peer') | |
| student_data: Optional student performance data | |
| Returns: | |
| Dictionary with adaptive assessment content | |
| """ | |
| try: | |
| prompt = f""" | |
| Create an adaptive {assessment_type} assessment for: "{concept}" | |
| Student Data: {json.dumps(student_data or {}, indent=2)} | |
| Design an assessment that: | |
| 1. Adapts difficulty based on student responses | |
| 2. Provides immediate feedback | |
| 3. Identifies learning gaps | |
| 4. Offers multiple question types | |
| 5. Includes branching logic | |
| 6. Provides detailed analytics | |
| Return JSON with: | |
| - "assessment_id": unique identifier | |
| - "title": assessment title | |
| - "instructions": clear instructions for students | |
| - "question_pool": large pool of questions with metadata: | |
| - "question_id": unique identifier | |
| - "question_text": the question | |
| - "question_type": type (multiple_choice, short_answer, essay, etc.) | |
| - "difficulty_level": difficulty rating (0.0 to 1.0) | |
| - "cognitive_level": Bloom's taxonomy level | |
| - "options": answer options (if applicable) | |
| - "correct_answer": correct answer | |
| - "explanation": detailed explanation | |
| - "hints": progressive hints | |
| - "common_misconceptions": common wrong answers and why | |
| - "adaptive_rules": rules for question selection and difficulty adjustment | |
| - "feedback_templates": templates for different types of feedback | |
| - "scoring_rubric": detailed scoring criteria | |
| - "analytics_tracking": what data to track for analysis | |
| - "remediation_suggestions": suggestions based on performance | |
| """ | |
| response = await MODEL.generate_text(prompt, temperature=0.6) | |
| assessment_data = extract_json_from_text(response) | |
| # Add metadata | |
| assessment_data.update({ | |
| "success": True, | |
| "concept": concept, | |
| "assessment_type": assessment_type, | |
| "generated_at": datetime.utcnow().isoformat(), | |
| "ai_generated": True | |
| }) | |
| return assessment_data | |
| except Exception as e: | |
| return { | |
| "success": False, | |
| "error": f"Failed to generate adaptive assessment: {str(e)}" | |
| } | |
| async def generate_gamified_content(concept: str, game_type: str = "quest", | |
| target_age_group: str = "teen") -> dict: | |
| """ | |
| Generate gamified learning content with game mechanics and engagement features. | |
| Args: | |
| concept: The concept to gamify | |
| game_type: Type of game ('quest', 'puzzle', 'simulation', 'competition', 'story') | |
| target_age_group: Target age group ('child', 'teen', 'adult') | |
| Returns: | |
| Dictionary with gamified content | |
| """ | |
| try: | |
| prompt = f""" | |
| Create gamified learning content for: "{concept}" | |
| Game Parameters: | |
| - Game Type: {game_type} | |
| - Target Age Group: {target_age_group} | |
| Design engaging game-based learning that includes: | |
| 1. Clear game objectives aligned with learning goals | |
| 2. Progressive difficulty levels | |
| 3. Reward systems and achievements | |
| 4. Interactive challenges | |
| 5. Narrative elements (if applicable) | |
| 6. Social features for collaboration/competition | |
| Return JSON with: | |
| - "game_id": unique identifier | |
| - "title": engaging game title | |
| - "theme": game theme and setting | |
| - "storyline": narrative framework (if applicable) | |
| - "learning_objectives": educational goals | |
| - "game_mechanics": core game mechanics and rules | |
| - "levels": progressive levels with increasing difficulty | |
| - "challenges": specific challenges and tasks | |
| - "reward_system": points, badges, achievements | |
| - "character_progression": how players advance | |
| - "social_features": multiplayer or collaborative elements | |
| - "assessment_integration": how learning is assessed within the game | |
| - "feedback_mechanisms": how players receive feedback | |
| - "customization_options": ways to personalize the experience | |
| - "accessibility_features": features for different abilities | |
| """ | |
| response = await MODEL.generate_text(prompt, temperature=0.8) | |
| game_data = extract_json_from_text(response) | |
| # Add metadata | |
| game_data.update({ | |
| "success": True, | |
| "concept": concept, | |
| "game_type": game_type, | |
| "target_age_group": target_age_group, | |
| "generated_at": datetime.utcnow().isoformat(), | |
| "ai_generated": True | |
| }) | |
| return game_data | |
| except Exception as e: | |
| return { | |
| "success": False, | |
| "error": f"Failed to generate gamified content: {str(e)}" | |
| } | |
| async def validate_generated_content(content_data: dict, validation_criteria: dict = None) -> dict: | |
| """ | |
| Validate and quality-check generated educational content. | |
| Args: | |
| content_data: The content to validate | |
| validation_criteria: Specific criteria for validation | |
| Returns: | |
| Dictionary with validation results and suggestions | |
| """ | |
| try: | |
| default_criteria = { | |
| "educational_alignment": True, | |
| "age_appropriateness": True, | |
| "clarity": True, | |
| "engagement": True, | |
| "accessibility": True, | |
| "accuracy": True | |
| } | |
| criteria = {**default_criteria, **(validation_criteria or {})} | |
| prompt = f""" | |
| Validate this educational content against quality criteria: | |
| Content to Validate: | |
| {json.dumps(content_data, indent=2)} | |
| Validation Criteria: | |
| {json.dumps(criteria, indent=2)} | |
| Perform comprehensive validation and return JSON with: | |
| - "overall_quality_score": score from 0.0 to 1.0 | |
| - "validation_results": detailed results for each criterion | |
| - "strengths": identified strengths in the content | |
| - "areas_for_improvement": specific areas that need work | |
| - "suggestions": concrete suggestions for improvement | |
| - "compliance_check": compliance with educational standards | |
| - "accessibility_assessment": accessibility for different learners | |
| - "engagement_analysis": analysis of engagement potential | |
| - "accuracy_verification": verification of factual accuracy | |
| - "recommended_modifications": specific modifications to make | |
| """ | |
| response = await MODEL.generate_text(prompt, temperature=0.3) | |
| validation_data = extract_json_from_text(response) | |
| return { | |
| "success": True, | |
| "content_validated": True, | |
| "validation_timestamp": datetime.utcnow().isoformat(), | |
| **validation_data | |
| } | |
| except Exception as e: | |
| return { | |
| "success": False, | |
| "error": f"Failed to validate content: {str(e)}" | |
| } | |