GitHub Actions
Update from GitHub Actions
4d16728
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")