# Conversation Models Technical Documentation ## Overview ### Design Motivation and Problem Background When building complex AI application systems, multi-participant conversation management faces the following core challenges: **1. Multi-Participant Conversation Complexity** - Need to support multiple participant types such as users, master controllers, AI agents - Different participants have different roles and permissions - Lack of unified participant identity management mechanism **2. Conversation Session Isolation Requirements** - Need to support different types of conversation sessions (user to master controller, master controller to agent, agent to agent, etc.) - Each session needs independent context and state management - Lack of session type validation and isolation mechanisms **3. Agent-to-Agent Communication Standardization** - AI agents need standardized communication protocols - Need to support different types of messages (task assignment, result reporting, collaboration requests, etc.) - Lack of unified agent communication message format **4. Conversation Data Persistence** - Conversation data needs to support serialization and deserialization - Need data formats compatible with storage systems - Lack of standardized data conversion mechanisms **Conversation Model System's Solution**: - **Typed Participant Models**: Type-safe participant definitions based on dataclass - **Session Type Validation**: Automatically validates session type matches participants - **Standardized Message Format**: Unified agent communication message structure - **Data Conversion Support**: Automatic serialization and deserialization mechanisms - **Session Isolation Tools**: Provides session key generation and validation tools ### Component Positioning `conversation_models.py` is a domain model component of the AIECS system, located in the Domain Layer, defining core data models related to conversation management. As the system's data contract layer, it provides type-safe, structured conversation data models and utility functions. ## Component Type and Positioning ### Component Type **Domain Model Component** - Located in the Domain Layer, belongs to data contract definitions ### Architecture Layers ``` ┌─────────────────────────────────────────┐ │ Application Layer │ ← Components using conversation models │ (ContextEngine, ServiceLayer) │ └─────────────────┬───────────────────────┘ │ ┌─────────────────▼───────────────────────┐ │ Domain Layer │ ← Conversation models layer │ (ConversationModels, Data Contracts) │ └─────────────────┬───────────────────────┘ │ ┌─────────────────▼───────────────────────┐ │ Infrastructure Layer │ ← Components conversation models depend on │ (Storage, Serialization) │ └─────────────────┬───────────────────────┘ │ ┌─────────────────▼───────────────────────┐ │ External Systems │ ← External storage systems │ (Redis, Database, FileSystem) │ └─────────────────────────────────────────┘ ``` ## Upstream Components (Consumers) ### 1. Domain Services - **ContextEngine** (`domain/context/context_engine.py`) - **SessionManager** (if exists) - **ConversationManager** (if exists) ### 2. Application Layer Services - **AgentService** (if exists) - **CommunicationService** (if exists) - **WorkflowService** (if exists) ### 3. Infrastructure Layer - **Storage Systems** (via serialization interface) - **Message Queues** (via message format) - **API Layer** (via data conversion) ## Downstream Components (Dependencies) ### 1. Python Standard Library - **dataclasses** - Provides dataclass support - **typing** - Provides type annotation support - **datetime** - Provides time handling - **uuid** - Provides unique identifier generation ### 2. Domain Models - **TaskContext** (if exists) - **SessionMetrics** (if exists) - **Other Domain Models** (via metadata fields) ### 3. Utility Functions - **create_session_key** - Session key generation utility - **validate_conversation_isolation_pattern** - Session isolation validation utility ## Core Model Details ### 1. ConversationParticipant - Conversation Participant Model ```python @dataclass class ConversationParticipant: """Represents a participant in a conversation""" participant_id: str participant_type: str # 'user', 'master_controller', 'agent' participant_role: Optional[str] = None # For agents: 'writer', 'researcher', etc. metadata: Dict[str, Any] = field(default_factory=dict) ``` **Field Descriptions**: - **participant_id**: Unique participant identifier - **participant_type**: Participant type (user, master controller, agent) - **participant_role**: Participant role (only valid for agents) - **metadata**: Participant metadata **Validation Rules**: ```python def __post_init__(self): """Validate participant data after initialization""" if not self.participant_id: raise ValueError("participant_id cannot be empty") if not self.participant_type: raise ValueError("participant_type cannot be empty") # Validate participant type valid_types = {'user', 'master_controller', 'agent'} if self.participant_type not in valid_types: raise ValueError(f"participant_type must be one of {valid_types}") # For agents, role must be specified if self.participant_type == 'agent' and not self.participant_role: raise ValueError("participant_role is required for agent participants") ``` **Usage Examples**: ```python # Create user participant user = ConversationParticipant( participant_id="user_123", participant_type="user", metadata={"name": "John Doe", "email": "john@example.com"} ) # Create agent participant agent = ConversationParticipant( participant_id="agent_001", participant_type="agent", participant_role="data_analyst", metadata={"capabilities": ["data_analysis", "visualization"]} ) # Create master controller participant controller = ConversationParticipant( participant_id="mc_001", participant_type="master_controller", metadata={"version": "1.0", "max_agents": 10} ) ``` ### 2. ConversationSession - Conversation Session Model ```python @dataclass class ConversationSession: """Represents an isolated conversation session between participants""" session_id: str participants: List[ConversationParticipant] session_type: str # 'user_to_mc', 'mc_to_agent', 'agent_to_agent', 'user_to_agent' created_at: datetime last_activity: datetime metadata: Dict[str, Any] = field(default_factory=dict) ``` **Field Descriptions**: - **session_id**: Unique session identifier - **participants**: List of participants - **session_type**: Session type - **created_at**: Creation time - **last_activity**: Last activity time - **metadata**: Session metadata **Session Type Descriptions**: - **user_to_mc**: User to master controller conversation - **mc_to_agent**: Master controller to agent conversation - **agent_to_agent**: Agent to agent conversation - **user_to_agent**: User to agent conversation **Validation Rules**: ```python def _validate_participants_for_session_type(self): """Validate that participants match session type""" participant_types = [p.participant_type for p in self.participants] if self.session_type == 'user_to_mc': expected_types = {'user', 'master_controller'} if not expected_types.issubset(set(participant_types)): raise ValueError("user_to_mc session requires user and master_controller participants") elif self.session_type == 'mc_to_agent': expected_types = {'master_controller', 'agent'} if not expected_types.issubset(set(participant_types)): raise ValueError("mc_to_agent session requires master_controller and agent participants") elif self.session_type == 'agent_to_agent': agent_count = sum(1 for p in self.participants if p.participant_type == 'agent') if agent_count < 2: raise ValueError("agent_to_agent session requires at least 2 agent participants") elif self.session_type == 'user_to_agent': expected_types = {'user', 'agent'} if not expected_types.issubset(set(participant_types)): raise ValueError("user_to_agent session requires user and agent participants") ``` **Core Methods**: #### Session Key Generation ```python def generate_session_key(self) -> str: """Generate unique session key for conversation isolation""" if self.session_type == 'user_to_mc': return self.session_id elif self.session_type == 'mc_to_agent': agent_role = next((p.participant_role for p in self.participants if p.participant_type == 'agent'), 'unknown') return f"{self.session_id}_mc_to_{agent_role}" elif self.session_type == 'agent_to_agent': agent_roles = [p.participant_role for p in self.participants if p.participant_type == 'agent'] if len(agent_roles) >= 2: return f"{self.session_id}_{agent_roles[0]}_to_{agent_roles[1]}" return f"{self.session_id}_agent_to_agent" elif self.session_type == 'user_to_agent': agent_role = next((p.participant_role for p in self.participants if p.participant_type == 'agent'), 'unknown') return f"{self.session_id}_user_to_{agent_role}" else: return self.session_id ``` #### Participant Lookup ```python def get_participant_by_type_and_role(self, participant_type: str, participant_role: Optional[str] = None) -> Optional[ConversationParticipant]: """Get participant by type and role""" for participant in self.participants: if participant.participant_type == participant_type: if participant_role is None or participant.participant_role == participant_role: return participant return None ``` #### Activity Update ```python def update_activity(self): """Update last activity timestamp""" self.last_activity = datetime.utcnow() ``` **Usage Examples**: ```python # Create user to master controller session user_mc_session = ConversationSession( session_id="session_001", participants=[ ConversationParticipant("user_123", "user"), ConversationParticipant("mc_001", "master_controller") ], session_type="user_to_mc", created_at=datetime.utcnow(), last_activity=datetime.utcnow(), metadata={"project": "data_analysis", "priority": "high"} ) # Create master controller to agent session mc_agent_session = ConversationSession( session_id="session_002", participants=[ ConversationParticipant("mc_001", "master_controller"), ConversationParticipant("agent_001", "agent", "data_analyst") ], session_type="mc_to_agent", created_at=datetime.utcnow(), last_activity=datetime.utcnow(), metadata={"task_type": "data_analysis", "deadline": "2024-01-01"} ) # Generate session keys session_key = user_mc_session.generate_session_key() # "session_001" agent_session_key = mc_agent_session.generate_session_key() # "session_002_mc_to_data_analyst" ``` ### 3. AgentCommunicationMessage - Agent Communication Message Model ```python @dataclass class AgentCommunicationMessage: """Message for agent-to-agent or controller-to-agent communication""" message_id: str session_key: str sender_id: str sender_type: str # 'master_controller', 'agent', 'user' sender_role: Optional[str] # For agents recipient_id: str recipient_type: str # 'agent', 'master_controller', 'user' recipient_role: Optional[str] # For agents content: str message_type: str # 'task_assignment', 'result_report', 'collaboration_request', 'feedback', 'communication' timestamp: datetime metadata: Dict[str, Any] = field(default_factory=dict) ``` **Field Descriptions**: - **message_id**: Unique message identifier - **session_key**: Session key - **sender_id**: Sender ID - **sender_type**: Sender type - **sender_role**: Sender role - **recipient_id**: Recipient ID - **recipient_type**: Recipient type - **recipient_role**: Recipient role - **content**: Message content - **message_type**: Message type - **timestamp**: Timestamp - **metadata**: Message metadata **Message Type Descriptions**: - **task_assignment**: Task assignment - **result_report**: Result report - **collaboration_request**: Collaboration request - **feedback**: Feedback - **communication**: Communication - **status_update**: Status update - **error_report**: Error report - **task_completion**: Task completion - **progress_update**: Progress update - **clarification_request**: Clarification request **Validation Rules**: ```python def __post_init__(self): """Validate message data after initialization""" if not self.message_id: self.message_id = str(uuid.uuid4()) if not self.session_key: raise ValueError("session_key cannot be empty") if not self.sender_id: raise ValueError("sender_id cannot be empty") if not self.recipient_id: raise ValueError("recipient_id cannot be empty") if not self.content: raise ValueError("content cannot be empty") # Validate message type valid_message_types = { 'task_assignment', 'result_report', 'collaboration_request', 'feedback', 'communication', 'status_update', 'error_report', 'task_completion', 'progress_update', 'clarification_request' } if self.message_type not in valid_message_types: raise ValueError(f"message_type must be one of {valid_message_types}") ``` **Core Methods**: #### Convert to Conversation Message Format ```python def to_conversation_message_dict(self) -> Dict[str, Any]: """Convert to format compatible with ContextEngine conversation messages""" role = f"{self.sender_type}_{self.sender_role}" if self.sender_role else self.sender_type return { "role": role, "content": self.content, "timestamp": self.timestamp.isoformat(), "metadata": { **self.metadata, "message_id": self.message_id, "sender_id": self.sender_id, "sender_type": self.sender_type, "sender_role": self.sender_role, "recipient_id": self.recipient_id, "recipient_type": self.recipient_type, "recipient_role": self.recipient_role, "message_type": self.message_type } } ``` **Usage Examples**: ```python # Create task assignment message task_message = AgentCommunicationMessage( message_id=str(uuid.uuid4()), session_key="session_002_mc_to_data_analyst", sender_id="mc_001", sender_type="master_controller", sender_role=None, recipient_id="agent_001", recipient_type="agent", recipient_role="data_analyst", content="Please analyze the sales data and generate a report", message_type="task_assignment", timestamp=datetime.utcnow(), metadata={"task_id": "task_001", "priority": "high", "deadline": "2024-01-01"} ) # Create result report message result_message = AgentCommunicationMessage( message_id=str(uuid.uuid4()), session_key="session_002_mc_to_data_analyst", sender_id="agent_001", sender_type="agent", sender_role="data_analyst", recipient_id="mc_001", recipient_type="master_controller", recipient_role=None, content="Analysis completed. Found 15% increase in sales compared to last quarter.", message_type="result_report", timestamp=datetime.utcnow(), metadata={"analysis_id": "analysis_001", "confidence": 0.95, "data_points": 1000} ) # Convert to conversation message format conversation_dict = task_message.to_conversation_message_dict() ``` ## Utility Functions Details ### 1. create_session_key - Session Key Generation Utility ```python def create_session_key(session_id: str, session_type: str, participants: List[ConversationParticipant]) -> str: """ Utility function to create session key for conversation isolation Args: session_id: Base session ID session_type: Conversation type participants: List of conversation participants Returns: Generated session key """ if session_type == 'user_to_mc': return session_id elif session_type == 'mc_to_agent': agent_role = next((p.participant_role for p in participants if p.participant_type == 'agent'), 'unknown') return f"{session_id}_mc_to_{agent_role}" elif session_type == 'agent_to_agent': agent_roles = [p.participant_role for p in participants if p.participant_type == 'agent'] if len(agent_roles) >= 2: return f"{session_id}_{agent_roles[0]}_to_{agent_roles[1]}" return f"{session_id}_agent_to_agent" elif session_type == 'user_to_agent': agent_role = next((p.participant_role for p in participants if p.participant_type == 'agent'), 'unknown') return f"{session_id}_user_to_{agent_role}" else: return session_id ``` **Usage Examples**: ```python # Create participant list participants = [ ConversationParticipant("user_123", "user"), ConversationParticipant("agent_001", "agent", "data_analyst") ] # Generate session key session_key = create_session_key("session_001", "user_to_agent", participants) # Result: "session_001_user_to_data_analyst" ``` ### 2. validate_conversation_isolation_pattern - Session Isolation Validation Utility ```python def validate_conversation_isolation_pattern(session_key: str, expected_pattern: str) -> bool: """ Validate that session key follows expected conversation isolation pattern Args: session_key: Session key to validate expected_pattern: Expected pattern ('user_to_mc', 'mc_to_agent', etc.) Returns: Returns True if pattern matches, False otherwise """ if expected_pattern == 'user_to_mc': # Should just be base session_id return '_' not in session_key or not any(x in session_key for x in ['_mc_to_', '_to_', '_user_to_']) elif expected_pattern == 'mc_to_agent': return '_mc_to_' in session_key elif expected_pattern == 'agent_to_agent': return '_to_' in session_key and '_mc_to_' not in session_key and '_user_to_' not in session_key elif expected_pattern == 'user_to_agent': return '_user_to_' in session_key else: return False ``` **Usage Examples**: ```python # Validate session key pattern session_key = "session_001_user_to_data_analyst" is_valid = validate_conversation_isolation_pattern(session_key, "user_to_agent") # Result: True session_key = "session_002_mc_to_writer" is_valid = validate_conversation_isolation_pattern(session_key, "mc_to_agent") # Result: True ``` ## Design Patterns Explained ### 1. Dataclass Pattern ```python @dataclass class ConversationParticipant: """Uses dataclass decorator to automatically generate methods""" participant_id: str participant_type: str participant_role: Optional[str] = None metadata: Dict[str, Any] = field(default_factory=dict) ``` **Advantages**: - **Automatic Method Generation**: Automatically generates `__init__`, `__repr__`, `__eq__`, etc. - **Type Safety**: Type checking based on type annotations - **Immutability**: Supports immutable dataclasses - **Serialization Support**: Compatible with `asdict()` and `from_dict()` ### 2. Validation Pattern ```python def __post_init__(self): """Execute validation after initialization""" if not self.participant_id: raise ValueError("participant_id cannot be empty") # More validation logic... ``` **Advantages**: - **Data Integrity**: Ensures data is valid at creation time - **Early Error Detection**: Detects errors before data is used - **Type Safety**: Provides stronger type safety combined with type annotations ### 3. Factory Pattern ```python @classmethod def from_dict(cls, data: Dict[str, Any]) -> 'ConversationSession': """Factory method to create instance from dictionary""" participants = [ ConversationParticipant( participant_id=p["participant_id"], participant_type=p["participant_type"], participant_role=p.get("participant_role"), metadata=p.get("metadata", {}) ) for p in data["participants"] ] return cls( session_id=data["session_id"], participants=participants, session_type=data["session_type"], created_at=datetime.fromisoformat(data["created_at"]), last_activity=datetime.fromisoformat(data["last_activity"]), metadata=data.get("metadata", {}) ) ``` **Advantages**: - **Flexible Creation**: Supports creating objects from different data sources - **Data Conversion**: Automatically handles data format conversion - **Type Safety**: Ensures created objects are of correct type ## Usage Examples ### 1. Basic Participant Management ```python from aiecs.domain.context.conversation_models import ConversationParticipant # Create different types of participants user = ConversationParticipant( participant_id="user_123", participant_type="user", metadata={"name": "John Doe", "email": "john@example.com"} ) agent = ConversationParticipant( participant_id="agent_001", participant_type="agent", participant_role="data_analyst", metadata={"capabilities": ["data_analysis", "visualization"], "version": "1.0"} ) controller = ConversationParticipant( participant_id="mc_001", participant_type="master_controller", metadata={"version": "1.0", "max_agents": 10} ) print(f"User: {user.participant_id} - {user.participant_type}") print(f"Agent: {agent.participant_id} - {agent.participant_type} - {agent.participant_role}") print(f"Controller: {controller.participant_id} - {controller.participant_type}") ``` ### 2. Conversation Session Management ```python from aiecs.domain.context.conversation_models import ConversationSession, ConversationParticipant from datetime import datetime # Create user to master controller session user_mc_session = ConversationSession( session_id="session_001", participants=[ ConversationParticipant("user_123", "user"), ConversationParticipant("mc_001", "master_controller") ], session_type="user_to_mc", created_at=datetime.utcnow(), last_activity=datetime.utcnow(), metadata={"project": "data_analysis", "priority": "high"} ) # Create master controller to agent session mc_agent_session = ConversationSession( session_id="session_002", participants=[ ConversationParticipant("mc_001", "master_controller"), ConversationParticipant("agent_001", "agent", "data_analyst") ], session_type="mc_to_agent", created_at=datetime.utcnow(), last_activity=datetime.utcnow(), metadata={"task_type": "data_analysis", "deadline": "2024-01-01"} ) # Generate session keys user_mc_key = user_mc_session.generate_session_key() # "session_001" mc_agent_key = mc_agent_session.generate_session_key() # "session_002_mc_to_data_analyst" print(f"User-MC Session Key: {user_mc_key}") print(f"MC-Agent Session Key: {mc_agent_key}") # Find participants user_participant = user_mc_session.get_participant_by_type_and_role("user") agent_participant = mc_agent_session.get_participant_by_type_and_role("agent", "data_analyst") print(f"User participant: {user_participant.participant_id}") print(f"Agent participant: {agent_participant.participant_id} - {agent_participant.participant_role}") ``` ### 3. Agent Communication Messages ```python from aiecs.domain.context.conversation_models import AgentCommunicationMessage import uuid # Create task assignment message task_message = AgentCommunicationMessage( message_id=str(uuid.uuid4()), session_key="session_002_mc_to_data_analyst", sender_id="mc_001", sender_type="master_controller", sender_role=None, recipient_id="agent_001", recipient_type="agent", recipient_role="data_analyst", content="Please analyze the sales data and generate a report", message_type="task_assignment", timestamp=datetime.utcnow(), metadata={"task_id": "task_001", "priority": "high", "deadline": "2024-01-01"} ) # Create result report message result_message = AgentCommunicationMessage( message_id=str(uuid.uuid4()), session_key="session_002_mc_to_data_analyst", sender_id="agent_001", sender_type="agent", sender_role="data_analyst", recipient_id="mc_001", recipient_type="master_controller", recipient_role=None, content="Analysis completed. Found 15% increase in sales compared to last quarter.", message_type="result_report", timestamp=datetime.utcnow(), metadata={"analysis_id": "analysis_001", "confidence": 0.95, "data_points": 1000} ) # Convert to conversation message format conversation_dict = task_message.to_conversation_message_dict() print(f"Conversation format: {conversation_dict}") # Convert to dictionary format message_dict = result_message.to_dict() print(f"Message dict: {message_dict}") ``` ### 4. Utility Function Usage ```python from aiecs.domain.context.conversation_models import ( create_session_key, validate_conversation_isolation_pattern, ConversationParticipant ) # Create participant list participants = [ ConversationParticipant("user_123", "user"), ConversationParticipant("agent_001", "agent", "data_analyst") ] # Generate session key session_key = create_session_key("session_001", "user_to_agent", participants) print(f"Generated session key: {session_key}") # "session_001_user_to_data_analyst" # Validate session key pattern is_valid = validate_conversation_isolation_pattern(session_key, "user_to_agent") print(f"Session key is valid: {is_valid}") # True # Validate wrong pattern is_valid = validate_conversation_isolation_pattern(session_key, "mc_to_agent") print(f"Session key matches mc_to_agent: {is_valid}") # False ``` ### 5. Data Serialization and Deserialization ```python # Serialize session session_dict = user_mc_session.to_dict() print(f"Session dict: {session_dict}") # Deserialize session restored_session = ConversationSession.from_dict(session_dict) print(f"Restored session: {restored_session.session_id}") # Serialize message message_dict = task_message.to_dict() print(f"Message dict: {message_dict}") # Deserialize message restored_message = AgentCommunicationMessage.from_dict(message_dict) print(f"Restored message: {restored_message.message_id}") ``` ## Maintenance Guide ### 1. Daily Maintenance #### Model Validation ```python def validate_models_health(): """Validate model health status""" try: # Test participant creation participant = ConversationParticipant( participant_id="test_001", participant_type="agent", participant_role="test_role" ) print("✅ ConversationParticipant validation passed") # Test session creation session = ConversationSession( session_id="test_session", participants=[participant], session_type="user_to_agent", created_at=datetime.utcnow(), last_activity=datetime.utcnow() ) print("✅ ConversationSession validation passed") # Test message creation message = AgentCommunicationMessage( message_id=str(uuid.uuid4()), session_key="test_key", sender_id="sender_001", sender_type="agent", sender_role="test_role", recipient_id="recipient_001", recipient_type="agent", recipient_role="test_role", content="Test message", message_type="communication", timestamp=datetime.utcnow() ) print("✅ AgentCommunicationMessage validation passed") return True except Exception as e: print(f"❌ Model validation failed: {e}") return False ``` #### Data Consistency Check ```python def check_data_consistency(session: ConversationSession): """Check session data consistency""" try: # Check session key generation generated_key = session.generate_session_key() expected_key = create_session_key( session.session_id, session.session_type, session.participants ) if generated_key != expected_key: print(f"❌ Session key mismatch: {generated_key} vs {expected_key}") return False # Check participant validation for participant in session.participants: if not participant.participant_id: print(f"❌ Empty participant_id found") return False # Check session type validation if not validate_conversation_isolation_pattern(generated_key, session.session_type): print(f"❌ Session type validation failed") return False print("✅ Data consistency check passed") return True except Exception as e: print(f"❌ Data consistency check failed: {e}") return False ``` ### 2. Troubleshooting #### Common Issue Diagnosis **Issue 1: Participant Validation Failure** ```python def diagnose_participant_validation_error(): """Diagnose participant validation errors""" try: # Test empty participant ID participant = ConversationParticipant("", "user") except ValueError as e: print(f"✅ Empty participant_id validation: {e}") try: # Test invalid participant type participant = ConversationParticipant("test", "invalid_type") except ValueError as e: print(f"✅ Invalid participant_type validation: {e}") try: # Test agent without role participant = ConversationParticipant("test", "agent") except ValueError as e: print(f"✅ Agent without role validation: {e}") ``` **Issue 2: Session Type Validation Failure** ```python def diagnose_session_validation_error(): """Diagnose session validation errors""" try: # Test empty participant list session = ConversationSession( session_id="test", participants=[], session_type="user_to_mc", created_at=datetime.utcnow(), last_activity=datetime.utcnow() ) except ValueError as e: print(f"✅ Empty participants validation: {e}") try: # Test invalid session type session = ConversationSession( session_id="test", participants=[ConversationParticipant("user", "user")], session_type="invalid_type", created_at=datetime.utcnow(), last_activity=datetime.utcnow() ) except ValueError as e: print(f"✅ Invalid session_type validation: {e}") try: # Test participant type mismatch session = ConversationSession( session_id="test", participants=[ConversationParticipant("user", "user")], session_type="mc_to_agent", created_at=datetime.utcnow(), last_activity=datetime.utcnow() ) except ValueError as e: print(f"✅ Participant type mismatch validation: {e}") ``` ### 3. Performance Optimization #### Batch Operation Optimization ```python def optimize_batch_operations(): """Optimize batch operations""" # Batch create participants participants = [] for i in range(1000): participant = ConversationParticipant( participant_id=f"participant_{i}", participant_type="agent", participant_role="test_role" ) participants.append(participant) # Batch create sessions sessions = [] for i in range(100): session = ConversationSession( session_id=f"session_{i}", participants=participants[i:i+2], session_type="agent_to_agent", created_at=datetime.utcnow(), last_activity=datetime.utcnow() ) sessions.append(session) print(f"Created {len(participants)} participants and {len(sessions)} sessions") ``` #### Memory Usage Optimization ```python def optimize_memory_usage(): """Optimize memory usage""" import gc import sys # Create many objects objects = [] for i in range(10000): participant = ConversationParticipant( participant_id=f"participant_{i}", participant_type="agent", participant_role="test_role" ) objects.append(participant) print(f"Memory usage before cleanup: {sys.getsizeof(objects)} bytes") # Clean up objects objects.clear() gc.collect() print(f"Memory usage after cleanup: {sys.getsizeof(objects)} bytes") ``` ### 4. Data Migration #### Model Version Upgrade ```python def migrate_models_to_new_version(old_data: Dict[str, Any]) -> Dict[str, Any]: """Migrate model data to new version""" # Check version version = old_data.get("version", "1.0") if version == "1.0": # Upgrade from 1.0 to 1.1 if "participants" in old_data: for participant in old_data["participants"]: # Add new required fields if "metadata" not in participant: participant["metadata"] = {} old_data["version"] = "1.1" return old_data ``` #### Data Format Conversion ```python def convert_data_formats(): """Convert data formats""" # Convert from old format to new format old_participant = { "id": "participant_001", "type": "agent", "role": "data_analyst" } # Convert to new format new_participant = ConversationParticipant( participant_id=old_participant["id"], participant_type=old_participant["type"], participant_role=old_participant["role"], metadata={} ) print(f"Converted participant: {new_participant}") ``` ## Monitoring and Logging ### Model Usage Monitoring ```python import time from typing import Dict, Any class ConversationModelsMonitor: """Conversation Models Monitor""" def __init__(self): self.creation_metrics = { "participants": 0, "sessions": 0, "messages": 0 } self.performance_metrics = { "participant_creation_time": [], "session_creation_time": [], "message_creation_time": [] } def record_participant_creation(self, creation_time: float): """Record participant creation metrics""" self.creation_metrics["participants"] += 1 self.performance_metrics["participant_creation_time"].append(creation_time) def record_session_creation(self, creation_time: float): """Record session creation metrics""" self.creation_metrics["sessions"] += 1 self.performance_metrics["session_creation_time"].append(creation_time) def record_message_creation(self, creation_time: float): """Record message creation metrics""" self.creation_metrics["messages"] += 1 self.performance_metrics["message_creation_time"].append(creation_time) def get_performance_report(self) -> Dict[str, Any]: """Get performance report""" report = {} for metric_name, times in self.performance_metrics.items(): if times: report[metric_name] = { "count": len(times), "avg_time": sum(times) / len(times), "min_time": min(times), "max_time": max(times) } return report ``` ### Logging ```python import logging from typing import Dict, Any class ConversationModelsLogger: """Conversation Models Logger""" def __init__(self): self.logger = logging.getLogger(__name__) def log_participant_creation(self, participant: ConversationParticipant): """Log participant creation""" self.logger.info(f"Participant created: {participant.participant_id} - {participant.participant_type}") def log_session_creation(self, session: ConversationSession): """Log session creation""" self.logger.info(f"Session created: {session.session_id} - {session.session_type}") def log_message_creation(self, message: AgentCommunicationMessage): """Log message creation""" self.logger.info(f"Message created: {message.message_id} - {message.message_type}") def log_validation_error(self, error: Exception, context: str): """Log validation error""" self.logger.error(f"Validation error in {context}: {error}") ``` ## Version History - **v1.0.0**: Initial version, basic participant model - **v1.1.0**: Added session model and validation - **v1.2.0**: Added agent communication message model - **v1.3.0**: Added utility functions and session isolation - **v1.4.0**: Added data serialization support - **v1.5.0**: Added performance monitoring and logging ## Related Documentation - [AIECS Project Overview](../PROJECT_SUMMARY.md) - [Content Engine Documentation](./CONTENT_ENGINE.md) - [Storage Interfaces Documentation](../CORE/STORAGE_INTERFACES.md) - [Execution Interfaces Documentation](../CORE/EXECUTION_INTERFACES.md)