MCP-EdTech / src /mcp_core /context.py
Engmhabib's picture
Upload 30 files
942216e verified
Raw History Blame Contribute Delete
3.95 kB
from datetime import datetime
from typing import Dict, List, Optional, Any, Union
from uuid import uuid4
import json
class Context:
def __init__(self, context_id: Optional[str] = None, metadata: Optional[Dict[str, Any]] = None, max_history_length: int = 100):
self.context_id = context_id or str(uuid4())
self.metadata = metadata or {}
self.max_history_length = max_history_length
self.history: List[Dict[str, Any]] = []
self.state: Dict[str, Any] = {}
self.created_at = datetime.utcnow()
self.updated_at = self.created_at
def add_interaction(self, input_data: Dict[str, Any], output_data: Dict[str, Any]) -> None:
interaction = {
"timestamp": datetime.utcnow().isoformat(),
"input": input_data,
"output": output_data
}
self.history.append(interaction)
if len(self.history) > self.max_history_length:
self.history = self.history[-self.max_history_length:]
self.updated_at = datetime.utcnow()
def update_state(self, new_state: Dict[str, Any], merge: bool = True) -> None:
if merge:
self.state.update(new_state)
else:
self.state = new_state
self.updated_at = datetime.utcnow()
def get_history(self, limit: Optional[int] = None) -> List[Dict[str, Any]]:
if limit is None or limit >= len(self.history):
return self.history
return self.history[-limit:]
def to_dict(self) -> Dict[str, Any]:
return {
"context_id": self.context_id,
"metadata": self.metadata,
"state": self.state,
"history": self.history,
"created_at": self.created_at.isoformat(),
"updated_at": self.updated_at.isoformat(),
}
def to_json(self) -> str:
return json.dumps(self.to_dict())
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> 'Context':
context = cls(context_id=data.get("context_id"))
context.metadata = data.get("metadata", {})
context.state = data.get("state", {})
context.history = data.get("history", [])
if "created_at" in data:
context.created_at = datetime.fromisoformat(data["created_at"])
if "updated_at" in data:
context.updated_at = datetime.fromisoformat(data["updated_at"])
return context
@classmethod
def from_json(cls, json_str: str) -> 'Context':
data = json.loads(json_str)
return cls.from_dict(data)
class ContextManager:
def __init__(self):
self.contexts: Dict[str, Context] = {}
def create_context(self, metadata: Optional[Dict[str, Any]] = None, context_id: Optional[str] = None) -> Context:
context = Context(context_id=context_id, metadata=metadata)
self.contexts[context.context_id] = context
return context
def get_context(self, context_id: str) -> Optional[Context]:
return self.contexts.get(context_id)
def update_context(self, context_id: str, updates: Dict[str, Any]) -> Optional[Context]:
context = self.get_context(context_id)
if not context:
return None
if "metadata" in updates:
context.metadata.update(updates["metadata"])
if "state" in updates:
context.update_state(updates["state"])
return context
def delete_context(self, context_id: str) -> bool:
if context_id in self.contexts:
del self.contexts[context_id]
return True
return False
def list_contexts(self) -> List[str]:
return list(self.contexts.keys())