from sqlalchemy import Column, Integer, String, DateTime, Text, JSON, Float, Boolean, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship from datetime import datetime Base = declarative_base() class PromptTemplate(Base): __tablename__ = "prompt_templates" id = Column(Integer, primary_key=True) template_id = Column(String(64), unique=True, nullable=False) name = Column(String(128), nullable=False) description = Column(Text, nullable=True) template_text = Column(Text, nullable=False) variables = Column(JSON, default=[]) # list of variable names category = Column(String(64), nullable=True) tags = Column(JSON, default=[]) # list of tags (avoid 'metadata') created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) is_active = Column(Boolean, default=True) versions = relationship("PromptVersion", back_populates="template") tests = relationship("PromptTest", back_populates="template") class PromptVersion(Base): __tablename__ = "prompt_versions" id = Column(Integer, primary_key=True) template_id = Column(Integer, ForeignKey("prompt_templates.id")) version = Column(Integer, nullable=False) template_text = Column(Text, nullable=False) variables = Column(JSON, default=[]) changelog = Column(Text, nullable=True) created_at = Column(DateTime, default=datetime.utcnow) is_latest = Column(Boolean, default=False) template = relationship("PromptTemplate", back_populates="versions") class PromptTest(Base): __tablename__ = "prompt_tests" id = Column(Integer, primary_key=True) template_id = Column(Integer, ForeignKey("prompt_templates.id")) test_id = Column(String(64), unique=True, nullable=False) test_input = Column(JSON, default={}) # variable values test_output = Column(Text, nullable=True) # rendered prompt passed = Column(Boolean, default=False) executed_at = Column(DateTime, default=datetime.utcnow) error_message = Column(Text, nullable=True) template = relationship("PromptTemplate", back_populates="tests") class PromptHistory(Base): __tablename__ = "prompt_history" id = Column(Integer, primary_key=True) template_id = Column(Integer, ForeignKey("prompt_templates.id")) action = Column(String(32), nullable=False) # create, update, test, rollback details = Column(JSON, default={}) user_id = Column(String(64), nullable=True) created_at = Column(DateTime, default=datetime.utcnow)