Spaces:
Sleeping
Sleeping
File size: 1,937 Bytes
a83c934 |
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 |
"""Chat message model for storing conversation history
Represents a single question-answer exchange in the chatbot.
Aligns with data-model.md ChatMessage entity specification.
"""
from datetime import datetime
from uuid import UUID, uuid4
from enum import Enum
from sqlalchemy import Column, String, Text, TIMESTAMP, ForeignKey, text
from sqlalchemy.dialects.postgresql import UUID as PGUUID, JSONB
from sqlalchemy.orm import relationship
from src.config.database import Base
class ChatUserRole(str, Enum):
"""Enum for the role of the chat message sender."""
USER = "user"
ASSISTANT = "assistant"
class ChatMessage(Base):
"""ChatMessage model for storing conversation history
Attributes:
id: Unique message identifier (UUID)
user_id: Foreign key to User
thread_id: OpenAI Agents SDK thread identifier
role: Message sender (user or assistant)
content: Message text content
metadata: Additional context (JSONB)
created_at: Message creation timestamp
"""
__tablename__ = "chat_messages"
id = Column(
PGUUID(as_uuid=True),
primary_key=True,
default=uuid4,
server_default="gen_random_uuid()"
)
user_id = Column(PGUUID(as_uuid=True), ForeignKey("users.id"), nullable=False)
thread_id = Column(String(255), nullable=False)
role = Column(String(10), nullable=False) # CHECK (role IN ('user', 'assistant')) will be added in migration
content = Column(Text, nullable=False)
message_metadata = Column('metadata', JSONB, default=dict, server_default=text("'{}'::jsonb"), nullable=False)
created_at = Column(TIMESTAMP, nullable=False, default=datetime.utcnow, server_default="NOW()")
# Relationships
user = relationship("User", back_populates="chat_messages")
def __repr__(self) -> str:
return f"<ChatMessage(id={self.id}, role={self.role}, thread_id={self.thread_id})>" |