Release Candidate: Production Release with Multi-Tenant & Onboarding Enhancements
This commit is contained in:
65
backend/models/podcast_bible_models.py
Normal file
65
backend/models/podcast_bible_models.py
Normal file
@@ -0,0 +1,65 @@
|
||||
"""
|
||||
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")
|
||||
Reference in New Issue
Block a user