from sqlalchemy.dialects.postgresql import JSONB from ..extensions import db from .user import User, Tenant from .document import Embedding, Retriever class ChatSession(db.Model): id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey(User.id), nullable=True) session_id = db.Column(db.String(36), nullable=True) session_start = db.Column(db.DateTime, nullable=False) session_end = db.Column(db.DateTime, nullable=True) timezone = db.Column(db.String(30), nullable=True) # Relations interactions = db.relationship('Interaction', backref='chat_session', lazy=True) def __repr__(self): return f"" class Interaction(db.Model): id = db.Column(db.Integer, primary_key=True) chat_session_id = db.Column(db.Integer, db.ForeignKey(ChatSession.id), nullable=False) question = db.Column(db.Text, nullable=False) detailed_question = db.Column(db.Text, nullable=True) answer = db.Column(db.Text, nullable=True) algorithm_used = db.Column(db.String(20), nullable=True) language = db.Column(db.String(2), nullable=False) timezone = db.Column(db.String(30), nullable=True) appreciation = db.Column(db.Integer, nullable=True) # Timing information question_at = db.Column(db.DateTime, nullable=False) detailed_question_at = db.Column(db.DateTime, nullable=True) answer_at = db.Column(db.DateTime, nullable=True) # Relations embeddings = db.relationship('InteractionEmbedding', backref='interaction', lazy=True) def __repr__(self): return f"" class InteractionEmbedding(db.Model): interaction_id = db.Column(db.Integer, db.ForeignKey(Interaction.id, ondelete='CASCADE'), primary_key=True) embedding_id = db.Column(db.Integer, db.ForeignKey(Embedding.id, ondelete='CASCADE'), primary_key=True) class Specialist(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), nullable=False) description = db.Column(db.Text, nullable=True) type = db.Column(db.String(50), nullable=False, default="STANDARD_RAG") tuning = db.Column(db.Boolean, nullable=True, default=False) configuration = db.Column(JSONB, nullable=True) arguments = db.Column(JSONB, nullable=True) # Relationship to retrievers through the association table retrievers = db.relationship('SpecialistRetriever', backref='specialist', lazy=True, cascade="all, delete-orphan") # Versioning Information created_at = db.Column(db.DateTime, nullable=False, server_default=db.func.now()) created_by = db.Column(db.Integer, db.ForeignKey(User.id), nullable=True) updated_at = db.Column(db.DateTime, nullable=False, server_default=db.func.now(), onupdate=db.func.now()) updated_by = db.Column(db.Integer, db.ForeignKey(User.id)) class SpecialistRetriever(db.Model): specialist_id = db.Column(db.Integer, db.ForeignKey(Specialist.id, ondelete='CASCADE'), primary_key=True) retriever_id = db.Column(db.Integer, db.ForeignKey(Retriever.id, ondelete='CASCADE'), primary_key=True)