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(49), 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 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") type_version = db.Column(db.String(20), nullable=True, default="1.0.0") tuning = db.Column(db.Boolean, nullable=True, default=False) configuration = db.Column(JSONB, nullable=True) arguments = db.Column(JSONB, nullable=True) active = db.Column(db.Boolean, nullable=True, default=True) # Relationship to retrievers through the association table retrievers = db.relationship('SpecialistRetriever', backref='specialist', lazy=True, cascade="all, delete-orphan") agents = db.relationship('EveAIAgent', backref='specialist', lazy=True) tasks = db.relationship('EveAITask', backref='specialist', lazy=True) tools = db.relationship('EveAITool', backref='specialist', lazy=True) dispatchers = db.relationship('SpecialistDispatcher', backref='specialist', lazy=True) # 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 EveAIAsset(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="DOCUMENT_TEMPLATE") type_version = db.Column(db.String(20), nullable=True, default="1.0.0") valid_from = db.Column(db.DateTime, nullable=True) valid_to = db.Column(db.DateTime, nullable=True) # 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)) # Relations versions = db.relationship('EveAIAssetVersion', backref='asset', lazy=True) class EveAIAssetVersion(db.Model): id = db.Column(db.Integer, primary_key=True) asset_id = db.Column(db.Integer, db.ForeignKey(EveAIAsset.id), nullable=False) bucket_name = db.Column(db.String(255), nullable=True) configuration = db.Column(JSONB, nullable=True) arguments = db.Column(JSONB, nullable=True) # 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)) # Relations instructions = db.relationship('EveAIAssetInstruction', backref='asset_version', lazy=True) class EveAIAssetInstruction(db.Model): id = db.Column(db.Integer, primary_key=True) asset_version_id = db.Column(db.Integer, db.ForeignKey(EveAIAssetVersion.id), nullable=False) name = db.Column(db.String(255), nullable=False) content = db.Column(db.Text, nullable=True) class EveAIProcessedAsset(db.Model): id = db.Column(db.Integer, primary_key=True) asset_version_id = db.Column(db.Integer, db.ForeignKey(EveAIAssetVersion.id), nullable=False) specialist_id = db.Column(db.Integer, db.ForeignKey(Specialist.id), nullable=True) chat_session_id = db.Column(db.Integer, db.ForeignKey(ChatSession.id), nullable=True) bucket_name = db.Column(db.String(255), nullable=True) object_name = db.Column(db.String(255), nullable=True) created_at = db.Column(db.DateTime, nullable=True, server_default=db.func.now()) class EveAIAgent(db.Model): id = db.Column(db.Integer, primary_key=True) specialist_id = db.Column(db.Integer, db.ForeignKey(Specialist.id), nullable=False) 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") type_version = db.Column(db.String(20), nullable=True, default="1.0.0") role = db.Column(db.Text, nullable=True) goal = db.Column(db.Text, nullable=True) backstory = db.Column(db.Text, nullable=True) tuning = db.Column(db.Boolean, nullable=True, default=False) configuration = db.Column(JSONB, nullable=True) arguments = db.Column(JSONB, nullable=True) # 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 EveAITask(db.Model): id = db.Column(db.Integer, primary_key=True) specialist_id = db.Column(db.Integer, db.ForeignKey(Specialist.id), nullable=False) 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") type_version = db.Column(db.String(20), nullable=True, default="1.0.0") task_description = db.Column(db.Text, nullable=True) expected_output = db.Column(db.Text, nullable=True) tuning = db.Column(db.Boolean, nullable=True, default=False) configuration = db.Column(JSONB, nullable=True) arguments = db.Column(JSONB, nullable=True) context = db.Column(JSONB, nullable=True) asynchronous = db.Column(db.Boolean, nullable=True, default=False) # 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 EveAITool(db.Model): id = db.Column(db.Integer, primary_key=True) specialist_id = db.Column(db.Integer, db.ForeignKey(Specialist.id), nullable=False) 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") type_version = db.Column(db.String(20), nullable=True, default="1.0.0") tuning = db.Column(db.Boolean, nullable=True, default=False) configuration = db.Column(JSONB, nullable=True) arguments = db.Column(JSONB, nullable=True) # 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 Dispatcher(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") type_version = db.Column(db.String(20), nullable=True, default="1.0.0") tuning = db.Column(db.Boolean, nullable=True, default=False) configuration = db.Column(JSONB, nullable=True) arguments = db.Column(JSONB, nullable=True) # 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 Interaction(db.Model): id = db.Column(db.Integer, primary_key=True) chat_session_id = db.Column(db.Integer, db.ForeignKey(ChatSession.id), nullable=False) specialist_id = db.Column(db.Integer, db.ForeignKey(Specialist.id), nullable=True) specialist_arguments = db.Column(JSONB, nullable=True) specialist_results = db.Column(JSONB, nullable=True) 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) processing_error = db.Column(db.String(255), 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 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) retriever = db.relationship("Retriever", backref="specialist_retrievers") class SpecialistDispatcher(db.Model): specialist_id = db.Column(db.Integer, db.ForeignKey(Specialist.id, ondelete='CASCADE'), primary_key=True) dispatcher_id = db.Column(db.Integer, db.ForeignKey(Dispatcher.id, ondelete='CASCADE'), primary_key=True) dispatcher = db.relationship("Dispatcher", backref="specialist_dispatchers") class SpecialistMagicLink(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) specialist_id = db.Column(db.Integer, db.ForeignKey(Specialist.id, ondelete='CASCADE'), nullable=False) magic_link_code = db.Column(db.String(55), nullable=False, unique=True) valid_from = db.Column(db.DateTime, nullable=True) valid_to = db.Column(db.DateTime, nullable=True) specialist_args = db.Column(JSONB, nullable=True) 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)) def __repr__(self): return f""