youtube-summarizer/backend/models/prompt_models.py

67 lines
2.4 KiB
Python

"""Models for prompt template system."""
from sqlalchemy import Column, String, Text, Float, DateTime, Boolean, Integer, JSON, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.types import TypeDecorator, CHAR
from sqlalchemy.dialects.postgresql import UUID
import uuid
from datetime import datetime
from backend.models.base import Model
class GUID(TypeDecorator):
"""Platform-independent GUID type for SQLite and PostgreSQL compatibility."""
impl = CHAR
cache_ok = True
def load_dialect_impl(self, dialect):
if dialect.name == 'postgresql':
return dialect.type_descriptor(UUID())
else:
return dialect.type_descriptor(CHAR(32))
def process_bind_param(self, value, dialect):
if value is None:
return value
elif dialect.name == 'postgresql':
return str(value)
else:
if not isinstance(value, uuid.UUID):
return "%.32x" % uuid.UUID(value).int
else:
return "%.32x" % value.int
def process_result_value(self, value, dialect):
if value is None:
return value
else:
if not isinstance(value, uuid.UUID):
return uuid.UUID(value)
return value
class PromptTemplate(Model):
"""Custom prompt templates for AI models."""
__tablename__ = "prompt_templates"
__table_args__ = {'extend_existing': True}
id = Column(GUID, primary_key=True, default=uuid.uuid4)
user_id = Column(String(36), ForeignKey("users.id"), nullable=True)
name = Column(String(200), nullable=False)
description = Column(Text, nullable=True)
prompt_text = Column(Text, nullable=False)
domain_category = Column(String(50), nullable=True)
model_config = Column(JSON, nullable=True)
is_public = Column(Boolean, default=False)
usage_count = Column(Integer, default=0)
rating = Column(Float, default=0.0)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# Relationships
user = relationship("backend.models.user.User", back_populates="prompt_templates")
export_metadata = relationship("backend.models.enhanced_export.ExportMetadata")
def __repr__(self):
return f"<PromptTemplate(id={self.id}, name={self.name}, public={self.is_public})>"