youtube-summarizer/backend/models/enhanced_export.py

81 lines
3.5 KiB
Python

"""Enhanced export models for Story 4.4 Custom AI Models & Enhanced Export."""
from sqlalchemy import Column, String, Integer, Float, Text, Boolean, DateTime, JSON, ForeignKey
from sqlalchemy.orm import relationship
from datetime import datetime
from backend.core.database_registry import registry
from .base import Model
class PromptExperiment(Model):
"""A/B testing experiments for prompt optimization."""
__tablename__ = "prompt_experiments"
id = Column(String, primary_key=True)
name = Column(String(200), nullable=False)
description = Column(Text, nullable=True)
baseline_template_id = Column(String, ForeignKey("prompt_templates.id"), nullable=False)
variant_template_id = Column(String, ForeignKey("prompt_templates.id"), nullable=False)
status = Column(String(20), default="active") # active, completed, paused
success_metric = Column(String(50), default="quality_score") # quality_score, user_rating, processing_time
statistical_significance = Column(Float, nullable=True)
results = Column(JSON, nullable=True)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# Relationships
baseline_template = relationship("backend.models.prompt_models.PromptTemplate", foreign_keys=[baseline_template_id])
variant_template = relationship("backend.models.prompt_models.PromptTemplate", foreign_keys=[variant_template_id])
class ExportMetadata(Model):
"""Metadata for enhanced export operations."""
__tablename__ = "export_metadata"
id = Column(String, primary_key=True)
summary_id = Column(String, ForeignKey("summaries.id"), nullable=False)
template_id = Column(String, ForeignKey("prompt_templates.id"), nullable=True)
export_type = Column(String(20), nullable=False) # markdown, pdf, json, html
executive_summary = Column(Text, nullable=True)
section_count = Column(Integer, nullable=True)
timestamp_count = Column(Integer, nullable=True)
processing_time_seconds = Column(Float, nullable=True)
quality_score = Column(Float, nullable=True)
config_used = Column(JSON, nullable=True) # Export configuration used
created_at = Column(DateTime, default=datetime.utcnow)
# Relationships
summary = relationship("backend.models.summary.Summary", back_populates="export_metadata")
template = relationship("backend.models.prompt_models.PromptTemplate")
class SummarySection(Model):
"""Detailed sections with timestamps for enhanced exports."""
__tablename__ = "summary_sections"
id = Column(String, primary_key=True)
summary_id = Column(String, ForeignKey("summaries.id"), nullable=False)
section_index = Column(Integer, nullable=False)
title = Column(String(300), nullable=False)
start_timestamp = Column(Integer, nullable=False) # seconds
end_timestamp = Column(Integer, nullable=False) # seconds
content = Column(Text, nullable=True)
summary = Column(Text, nullable=True)
key_points = Column(JSON, nullable=True) # List of key points
youtube_link = Column(String(500), nullable=True) # Timestamped YouTube link
confidence_score = Column(Float, default=0.0)
created_at = Column(DateTime, default=datetime.utcnow)
# Relationships
summary = relationship("backend.models.summary.Summary", back_populates="sections")
# Register models with the database registry
registry.register_model(PromptExperiment)
registry.register_model(ExportMetadata)
registry.register_model(SummarySection)