66 lines
4.4 KiB
Python
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")
|