from __future__ import annotations from sqlalchemy import desc from sqlalchemy.dialects.postgresql import JSONB, UUID from models.model import db # from .account import Account <- This is the source of the circular import class PromptTemplate(db.Model): # type: ignore[name-defined] __tablename__ = "prompt_templates" __table_args__ = ( db.PrimaryKeyConstraint("id", name="prompt_template_pkey"), db.Index("prompt_template_tenant_id_idx", "tenant_id"), ) def __init__(self, **kwargs): super().__init__(**kwargs) id = db.Column(UUID, primary_key=True, server_default=db.text("uuid_generate_v4()")) tenant_id = db.Column(UUID, nullable=False) name = db.Column(db.String(255), nullable=False) mode = db.Column(db.String(255), nullable=False) description = db.Column(db.Text, nullable=True) tags = db.Column(JSONB, nullable=True) created_at = db.Column(db.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)")) updated_at = db.Column( db.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)"), onupdate=db.text("CURRENT_TIMESTAMP(0)"), ) # Relationships versions = db.relationship( "PromptVersion", back_populates="prompt_template", cascade="all, delete-orphan", lazy="dynamic" ) def get_latest_version(self): """ Fetches the most recent version of the prompt template. """ return self.versions.order_by(desc(PromptVersion.created_at)).first() # type: ignore def to_dict(self): latest_version = self.get_latest_version() model_settings = None if latest_version: model_settings = {"model_name": latest_version.model_name, "parameters": latest_version.model_parameters} return { "id": str(self.id), "name": self.name, "mode": self.mode, "description": self.description, "tags": self.tags, "prompt_content": latest_version.prompt_text if latest_version else None, "model_settings": model_settings, "created_at": self.created_at.isoformat(), "updated_at": self.updated_at.isoformat(), } def __repr__(self): return f"" class PromptVersion(db.Model): # type: ignore[name-defined] __tablename__ = "prompt_versions" __table_args__ = ( db.PrimaryKeyConstraint("id", name="prompt_version_pkey"), db.Index("prompt_version_template_id_idx", "prompt_template_id"), ) id = db.Column(UUID, primary_key=True, server_default=db.text("uuid_generate_v4()")) prompt_template_id = db.Column(UUID, db.ForeignKey("prompt_templates.id"), nullable=False) version = db.Column(db.String(255), nullable=False, default="1.0") prompt_text = db.Column(db.Text, nullable=False) variables = db.Column(JSONB, nullable=True) model_name = db.Column(db.String(255), nullable=True) model_parameters = db.Column(JSONB, nullable=True) model_settings = db.Column(JSONB, nullable=True) status = db.Column(db.String(50), nullable=False, default="draft") # e.g., draft, published, archived created_by = db.Column(UUID, nullable=False) created_at = db.Column(db.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)")) updated_at = db.Column( db.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)"), onupdate=db.text("CURRENT_TIMESTAMP(0)"), ) # Relationships prompt_template = db.relationship("PromptTemplate", back_populates="versions") def __repr__(self): return f""