File size: 2,681 Bytes
330b6e4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
"""Message model for storing chat messages."""

from datetime import datetime
from sqlalchemy import Column, String, Text, DateTime, Integer, JSON
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
from .base import BaseModel, db, GUID


class Message(BaseModel):
    """Model for storing individual chat messages."""
    
    __tablename__ = 'messages'
    
    # Core message fields
    session_id = Column(GUID(), ForeignKey('chat_sessions.id'), nullable=False, index=True)
    role = Column(String(20), nullable=False)  # 'user' or 'assistant'
    content = Column(Text, nullable=False)
    language = Column(String(50), nullable=False, default='python')
    
    # Metadata and tracking
    timestamp = Column(DateTime, default=datetime.utcnow, nullable=False, index=True)
    message_metadata = Column(JSON, default=dict)  # Additional context like token count, processing time, etc.
    
    # Relationships
    session = relationship("ChatSession", back_populates="messages")
    
    def __init__(self, session_id, role, content, language='python', message_metadata=None):
        """Initialize a new message."""
        super().__init__()
        self.session_id = session_id
        self.role = role
        self.content = content
        self.language = language
        self.timestamp = datetime.utcnow()
        self.message_metadata = message_metadata or {}
    
    def to_dict(self):
        """Convert message to dictionary with formatted timestamp."""
        data = super().to_dict()
        # Format timestamp as ISO string for JSON serialization
        if self.timestamp:
            data['timestamp'] = self.timestamp.isoformat()
        return data
    
    @classmethod
    def create_user_message(cls, session_id, content, language='python'):
        """Create a user message."""
        return cls(
            session_id=session_id,
            role='user',
            content=content,
            language=language
        )
    
    @classmethod
    def create_assistant_message(cls, session_id, content, language='python', message_metadata=None):
        """Create an assistant message."""
        return cls(
            session_id=session_id,
            role='assistant',
            content=content,
            language=language,
            message_metadata=message_metadata
        )
    
    def __repr__(self):
        """String representation of the message."""
        content_preview = self.content[:50] + "..." if len(self.content) > 50 else self.content
        return f"<Message(id={self.id}, role={self.role}, content='{content_preview}')>"