Spaces:
Sleeping
Sleeping
""" | |
MCP client for interacting with the TutorX MCP server. | |
This module provides functions that interact with the MCP server | |
for use by the Gradio interface. | |
""" | |
import json | |
import requests | |
from typing import Dict, Any, List, Optional | |
import base64 | |
from datetime import datetime | |
# Default MCP server URL | |
MCP_SERVER_URL = "http://localhost:8000" | |
class TutorXClient: | |
"""Client for interacting with the TutorX MCP server""" | |
def __init__(self, server_url=MCP_SERVER_URL): | |
self.server_url = server_url | |
def _call_tool(self, tool_name: str, params: Dict[str, Any]) -> Dict[str, Any]: | |
""" | |
Call an MCP tool on the server | |
Args: | |
tool_name: Name of the tool to call | |
params: Parameters to pass to the tool | |
Returns: | |
Tool response | |
""" | |
try: | |
response = requests.post( | |
f"{self.server_url}/tools/{tool_name}", | |
json=params, | |
headers={"Content-Type": "application/json"} | |
) | |
response.raise_for_status() | |
return response.json() | |
except requests.RequestException as e: | |
return { | |
"error": f"Failed to call tool: {str(e)}", | |
"timestamp": datetime.now().isoformat() | |
} | |
def _get_resource(self, resource_uri: str) -> Dict[str, Any]: | |
""" | |
Get an MCP resource from the server | |
Args: | |
resource_uri: URI of the resource to get | |
Returns: | |
Resource data | |
""" | |
try: | |
response = requests.get( | |
f"{self.server_url}/resources?uri={resource_uri}", | |
headers={"Accept": "application/json"} | |
) | |
response.raise_for_status() | |
return response.json() | |
except requests.RequestException as e: | |
return { | |
"error": f"Failed to get resource: {str(e)}", | |
"timestamp": datetime.now().isoformat() | |
} | |
# ------------ Core Features ------------ | |
def assess_skill(self, student_id: str, concept_id: str) -> Dict[str, Any]: | |
"""Assess student's skill level on a specific concept""" | |
return self._call_tool("assess_skill", { | |
"student_id": student_id, | |
"concept_id": concept_id | |
}) | |
def get_concept_graph(self) -> Dict[str, Any]: | |
"""Get the full knowledge concept graph""" | |
return self._get_resource("concept-graph://") | |
def get_learning_path(self, student_id: str) -> Dict[str, Any]: | |
"""Get personalized learning path for a student""" | |
return self._get_resource(f"learning-path://{student_id}") | |
def generate_quiz(self, concept_ids: List[str], difficulty: int = 2) -> Dict[str, Any]: | |
"""Generate a quiz based on specified concepts and difficulty""" | |
return self._call_tool("generate_quiz", { | |
"concept_ids": concept_ids, | |
"difficulty": difficulty | |
}) | |
def analyze_error_patterns(self, student_id: str, concept_id: str) -> Dict[str, Any]: | |
"""Analyze common error patterns for a student on a specific concept""" | |
return self._call_tool("analyze_error_patterns", { | |
"student_id": student_id, | |
"concept_id": concept_id | |
}) | |
# ------------ Advanced Features ------------ | |
def analyze_cognitive_state(self, eeg_data: Dict[str, Any]) -> Dict[str, Any]: | |
"""Analyze EEG data to determine cognitive state""" | |
return self._call_tool("analyze_cognitive_state", { | |
"eeg_data": eeg_data | |
}) | |
def get_curriculum_standards(self, country_code: str) -> Dict[str, Any]: | |
"""Get curriculum standards for a specific country""" | |
return self._get_resource(f"curriculum-standards://{country_code}") | |
def align_content_to_standard(self, content_id: str, standard_id: str) -> Dict[str, Any]: | |
"""Align educational content to a specific curriculum standard""" | |
return self._call_tool("align_content_to_standard", { | |
"content_id": content_id, | |
"standard_id": standard_id | |
}) | |
def generate_lesson(self, topic: str, grade_level: int, duration_minutes: int = 45) -> Dict[str, Any]: | |
"""Generate a complete lesson plan on a topic""" | |
return self._call_tool("generate_lesson", { | |
"topic": topic, | |
"grade_level": grade_level, | |
"duration_minutes": duration_minutes | |
}) | |
# ------------ User Experience ------------ | |
def get_student_dashboard(self, student_id: str) -> Dict[str, Any]: | |
"""Get dashboard data for a specific student""" | |
return self._get_resource(f"student-dashboard://{student_id}") | |
def get_accessibility_settings(self, student_id: str) -> Dict[str, Any]: | |
"""Get accessibility settings for a student""" | |
return self._call_tool("get_accessibility_settings", { | |
"student_id": student_id | |
}) | |
def update_accessibility_settings(self, student_id: str, settings: Dict[str, Any]) -> Dict[str, Any]: | |
"""Update accessibility settings for a student""" | |
return self._call_tool("update_accessibility_settings", { | |
"student_id": student_id, | |
"settings": settings | |
}) | |
# ------------ Multi-Modal Interaction ------------ | |
def text_interaction(self, query: str, student_id: str) -> Dict[str, Any]: | |
"""Process a text query from the student""" | |
return self._call_tool("text_interaction", { | |
"query": query, | |
"student_id": student_id | |
}) | |
def voice_interaction(self, audio_data_base64: str, student_id: str) -> Dict[str, Any]: | |
"""Process voice input from the student""" | |
return self._call_tool("voice_interaction", { | |
"audio_data_base64": audio_data_base64, | |
"student_id": student_id | |
}) | |
def handwriting_recognition(self, image_data_base64: str, student_id: str) -> Dict[str, Any]: | |
"""Process handwritten input from the student""" | |
return self._call_tool("handwriting_recognition", { | |
"image_data_base64": image_data_base64, | |
"student_id": student_id | |
}) | |
# ------------ Assessment ------------ | |
def create_assessment(self, concept_ids: List[str], num_questions: int, difficulty: int = 3) -> Dict[str, Any]: | |
"""Create a complete assessment for given concepts""" | |
return self._call_tool("create_assessment", { | |
"concept_ids": concept_ids, | |
"num_questions": num_questions, | |
"difficulty": difficulty | |
}) | |
def grade_assessment(self, assessment_id: str, student_answers: Dict[str, str], questions: List[Dict[str, Any]]) -> Dict[str, Any]: | |
"""Grade a completed assessment""" | |
return self._call_tool("grade_assessment", { | |
"assessment_id": assessment_id, | |
"student_answers": student_answers, | |
"questions": questions | |
}) | |
def get_student_analytics(self, student_id: str, timeframe_days: int = 30) -> Dict[str, Any]: | |
"""Get comprehensive analytics for a student""" | |
return self._call_tool("get_student_analytics", { | |
"student_id": student_id, | |
"timeframe_days": timeframe_days | |
}) | |
def check_submission_originality(self, submission: str, reference_sources: List[str]) -> Dict[str, Any]: | |
"""Check student submission for potential plagiarism""" | |
return self._call_tool("check_submission_originality", { | |
"submission": submission, | |
"reference_sources": reference_sources | |
}) | |
# Create a default client instance for easy import | |
client = TutorXClient() | |