youtube-summarizer/backend/models/agent_models.py

64 lines
2.2 KiB
Python

"""Models for multi-agent analysis system."""
from sqlalchemy import Column, String, Text, Float, DateTime, ForeignKey, JSON
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 AgentSummary(Model):
"""Multi-agent analysis results."""
__tablename__ = "agent_summaries"
__table_args__ = {'extend_existing': True}
id = Column(GUID, primary_key=True, default=uuid.uuid4)
summary_id = Column(GUID, ForeignKey("summaries.id", ondelete='CASCADE'))
agent_type = Column(String(20), nullable=False) # technical, business, user, synthesis
agent_summary = Column(Text, nullable=True)
key_insights = Column(JSON, nullable=True)
focus_areas = Column(JSON, nullable=True)
recommendations = Column(JSON, nullable=True)
confidence_score = Column(Float, nullable=True)
processing_time_seconds = Column(Float, nullable=True)
created_at = Column(DateTime, default=datetime.utcnow)
# Relationship
summary = relationship("backend.models.summary.Summary", back_populates="agent_analyses")
def __repr__(self):
return f"<AgentSummary(id={self.id}, type={self.agent_type}, summary_id={self.summary_id})>"