"""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""