Files
ALwrity/backend/models/podcast_bible_models.py

66 lines
4.4 KiB
Python

"""
Podcast Bible Models
Pydantic models for the structured Podcast Bible, used for hyper-personalization.
"""
from pydantic import BaseModel, Field
from typing import List, Optional, Dict, Any
class HostPersona(BaseModel):
"""Details about the podcast host persona."""
name: str = Field(..., description="Name of the podcast host")
background: str = Field(..., description="Professional background and expertise")
expertise_level: str = Field(..., description="Level of expertise (e.g., Expert, Practitioner, Enthusiast)")
personality_traits: List[str] = Field(default_factory=list, description="Personality traits (e.g., Witty, Authoritative, Empathetic)")
vocal_style: str = Field(..., description="Description of the vocal style and delivery")
vocal_characteristics: List[str] = Field(default_factory=list, description="Specific vocal traits (e.g., Deep, Raspy, Energetic, Calm)")
look: Optional[str] = Field(None, description="Visual description of the host (for avatar generation)")
catchphrases: List[str] = Field(default_factory=list, description="Commonly used phrases or sign-offs")
class VisualStyle(BaseModel):
"""Visual aesthetic for the podcast videos and avatars."""
style_preset: str = Field(default="Professional Studio", description="Visual style (e.g., 3D Cartoon, Cinematic, Minimalist)")
environment: str = Field(..., description="The studio or setting where the podcast takes place")
lighting: str = Field(default="Soft Studio Lighting", description="Lighting mood and setup")
color_palette: List[str] = Field(default_factory=list, description="Primary brand colors for the visual elements")
camera_style: str = Field(default="Static Mid-shot", description="Preferred camera framing and movement")
class AudioEnvironment(BaseModel):
"""The soundscape and audio characteristics of the podcast."""
soundscape: str = Field(default="Quiet Studio", description="Acoustics and ambient noise level")
music_mood: str = Field(default="Professional & Subtle", description="Genre and mood of background music")
sfx_style: str = Field(default="Minimalist", description="Style of sound effects used (e.g., tech-inspired, natural)")
class ShowRules(BaseModel):
"""Consistency rules for the podcast narrative and structure."""
intro_format: str = Field(..., description="Standard way to start the episode")
outro_format: str = Field(..., description="Standard way to end the episode")
interaction_tone: str = Field(default="Conversational", description="Tone between hosts or with audience")
constraints: List[str] = Field(default_factory=list, description="Specific things to always do or avoid")
class AudienceDNA(BaseModel):
"""Details about the target audience."""
expertise_level: str = Field(..., description="Target audience expertise level (Beginner, Intermediate, Expert)")
interests: List[str] = Field(default_factory=list, description="Primary interests of the audience")
pain_points: List[str] = Field(default_factory=list, description="Common challenges or problems the audience faces")
demographics: Optional[str] = Field(None, description="General demographic information")
class BrandDNA(BaseModel):
"""Details about the brand and industry context."""
industry: str = Field(..., description="Primary industry or niche")
tone: str = Field(..., description="Overall brand tone (e.g., Professional, Casual, Inspirational)")
communication_style: str = Field(..., description="Preferred communication style (e.g., Socratic, Storytelling, Analytical)")
key_messages: List[str] = Field(default_factory=list, description="Core messages the brand wants to convey")
competitor_context: Optional[str] = Field(None, description="Context on how to differentiate from competitors")
class PodcastBible(BaseModel):
"""The complete structured Podcast Bible SSOT."""
project_id: Optional[str] = Field(default=None, description="Associated project ID")
host: HostPersona = Field(..., description="Host persona details")
audience: AudienceDNA = Field(..., description="Target audience details")
brand: BrandDNA = Field(..., description="Brand and industry context")
visual_style: VisualStyle = Field(..., description="Visual aesthetic and environment")
audio_environment: AudioEnvironment = Field(..., description="Soundscape and music details")
show_rules: ShowRules = Field(..., description="Consistency and structural rules")