FUNCTIONAL_ROLES = { "OPENING": { "Hook": "Grabs viewers' attention or interest; appears in first few seconds", "Establish Context": "Sets up the status quo—who, where, or when—before story progression" }, "PROBLEM": { "Problem Setup": "Presents a problem, need, or pain point to resolve for the first time", "Problem Agitation": "Amplifies the problem to make it relatable or severe" }, "PRODUCT": { "Feature Explanation": "Explains product features and why it delivers benefits; goes beyond just showing", "Product Highlight": "Presents key product attributes or benefits (surface-level showcasing)", "Demonstration": "Shows the product being used or tested to accomplish a task", "Comparison": "Contrasts product with competitors or previous states", "Social Proof": "Shows reviews or testimonials from other people", "Solution Reveal": "Presents product as solution to a problem" }, "PERSUASIVE": { "Emotional Appeal": "Uses emotions to connect with and engage the audience", "Humor": "Uses comedic elements to entertain and make message relatable", "Aspirational Vision": "Depicts an ideal lifestyle or future enabled by the product", "Promotion": "Communicates offer mechanics: discount, bundle, code, pricing terms", "Urgency Trigger": "Adds time pressure to accelerate action", "Scarcity Trigger": "Highlights limited availability to create FOMO" }, "CLOSURE": { "Call-to-Action": "Cues to act; drives immediate action", "Outcome": "Shows post-intervention payoff or transformation", "Branding Moment": "Displays brand identity (logo, tagline, slogans)", "Insight/Philosophy": "Expresses brand philosophy; leads viewers to discover something new" }, "OTHER": { "Visual Filler": "Provides transitional pacing without narrative contribution" } } STORY_ARCS = { "Problem-Solution-Outcome": { "sequence": ["Problem Setup", "Solution Reveal", "Outcome"], "description": "Introduces a problem, offers a solution, and shows the outcome" }, "Hook-Feature-Benefit-Action": { "sequence": ["Hook", "Feature Explanation", "Product Highlight", "Call-to-Action"], "abbreviation": "HFBA", "description": "Grabs attention, explains features, highlights benefits, drives action" }, "AIDA": { "sequence": ["Hook", "Feature Explanation", "Aspirational Vision", "Call-to-Action"], "description": "Attention-Interest-Desire-Action classic marketing funnel" }, "Social-Proof-Action": { "sequence": ["Social Proof", "Call-to-Action"], "abbreviation": "SPA", "description": "Shows testimonials/reviews then drives action" }, "Problem-Agitate-Solution": { "sequence": ["Problem Setup", "Problem Agitation", "Solution Reveal"], "abbreviation": "PAS", "description": "Presents problem, amplifies pain, offers solution" }, "Before-After-Bridge": { "sequence": ["Establish Context", "Outcome", "Solution Reveal"], "abbreviation": "BAB", "description": "Shows current situation, desired outcome, product as bridge" }, "Hook-Problem-Solution": { "sequence": ["Hook", "Problem Setup", "Solution Reveal"], "abbreviation": "HPS", "description": "Grabs attention, presents problem, offers solution" }, "Feature-Benefit-Action": { "sequence": ["Feature Explanation", "Product Highlight", "Call-to-Action"], "abbreviation": "FBA", "description": "Direct product-focused approach" } } STORY_DEFINITION = """ A story is an account of an event or a sequence of connected events that leads to a transition from an initial state to a later stage or outcome. Signals of STORY PRESENT: - Dialogues between characters - Sharing of personal experiences - Inclusion of challenges/conflicts/problem solutions - Character transformation or journey Signals of STORY ABSENT: - Announcer/narrator voiceover only - Promotional language dominance - Heavy focus on product features without context - Visual mashups without narrative connection """ def get_taxonomy_formatted() -> str: """Return taxonomy as formatted string for prompts.""" lines = [] for category, roles in FUNCTIONAL_ROLES.items(): lines.append(f"\n**{category}**") for role, description in roles.items(): lines.append(f"- {role}: {description}") return "\n".join(lines) def get_role_category(role_name: str) -> str: """Get category for a role name.""" for category, roles in FUNCTIONAL_ROLES.items(): if role_name in roles: return category return "OTHER"