from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, DateTime, Text, Float, Boolean from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker, relationship from datetime import datetime # Define the base class for declarative models Base = declarative_base() # Define the Users table class User(Base): __tablename__ = 'users' user_id = Column(Integer, primary_key=True, autoincrement=True) username = Column(String, unique=True, nullable=False) email = Column(String, unique=True, nullable=False) created_at = Column(DateTime, default=datetime.utcnow) # Add relationship for cascade options chats = relationship("Chat", back_populates="user", cascade="all, delete-orphan") usage_records = relationship("ModelUsage", back_populates="user") # Define the Chats table class Chat(Base): __tablename__ = 'chats' chat_id = Column(Integer, primary_key=True, autoincrement=True) user_id = Column(Integer, ForeignKey('users.user_id', ondelete="CASCADE"), nullable=True) title = Column(String, default='New Chat') created_at = Column(DateTime, default=datetime.utcnow) # Add relationships for cascade options user = relationship("User", back_populates="chats") messages = relationship("Message", back_populates="chat", cascade="all, delete-orphan") usage_records = relationship("ModelUsage", back_populates="chat") # Define the Messages table class Message(Base): __tablename__ = 'messages' message_id = Column(Integer, primary_key=True, autoincrement=True) chat_id = Column(Integer, ForeignKey('chats.chat_id', ondelete="CASCADE"), nullable=False) sender = Column(String, nullable=False) # 'user' or 'ai' content = Column(Text, nullable=False) timestamp = Column(DateTime, default=datetime.utcnow) # Add relationship for cascade options chat = relationship("Chat", back_populates="messages") # Define the Model Usage table class ModelUsage(Base): """Tracks AI model usage metrics for analytics and billing purposes.""" __tablename__ = 'model_usage' usage_id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey('users.user_id', ondelete="SET NULL"), nullable=True) chat_id = Column(Integer, ForeignKey('chats.chat_id', ondelete="SET NULL"), nullable=True) model_name = Column(String(100), nullable=False) provider = Column(String(50), nullable=False) prompt_tokens = Column(Integer, default=0) completion_tokens = Column(Integer, default=0) total_tokens = Column(Integer, default=0) query_size = Column(Integer, default=0) # Size in characters response_size = Column(Integer, default=0) # Size in characters cost = Column(Float, default=0.0) # Cost in USD timestamp = Column(DateTime, default=datetime.utcnow) is_streaming = Column(Boolean, default=False) request_time_ms = Column(Integer, default=0) # Request processing time in milliseconds # Add relationships user = relationship("User", back_populates="usage_records") chat = relationship("Chat", back_populates="usage_records")