from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey from sqlalchemy.orm import relationship from datetime import datetime import uuid from .database import Base class ChatSession(Base): __tablename__ = 'chat_sessions' id = Column(Integer, primary_key=True, index=True) session_id = Column(String(64), unique=True, index=True, nullable=False) name = Column(String(100), default="New Chat", nullable=False) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) messages = relationship("ChatMessage", back_populates="session") class ChatMessage(Base): __tablename__ = 'chat_messages' id = Column(Integer, primary_key=True, index=True) message_id = Column(String(36), unique=True, index=True, nullable=False, default=lambda: str(uuid.uuid4())) session_pk = Column(Integer, ForeignKey('chat_sessions.id'), nullable=False) role = Column(String(16), nullable=False) # 'user' | 'assistant' content = Column(Text, nullable=False) # JSON-encoded list of citation URLs; null/empty => no chips sources_json = Column(Text, nullable=True, default='[]') # JSON-encoded list of inline image attachments for user messages. attachments_json = Column(Text, nullable=True, default='[]') workflow_id = Column(String(36), nullable=True) workflow_revision_id = Column(String(36), nullable=True) workflow_run_id = Column(String(36), nullable=True, index=True) agent_summary_json = Column(Text, nullable=True, default='{}') usage_json = Column(Text, nullable=True, default='{}') created_at = Column(DateTime, default=datetime.utcnow, nullable=False) session = relationship("ChatSession", back_populates="messages")