84 lines
4.3 KiB
Python
84 lines
4.3 KiB
Python
"""Pydantic models for Facebook Story functionality."""
|
|
|
|
from typing import Optional, List, Dict, Any
|
|
from pydantic import BaseModel, Field
|
|
from enum import Enum
|
|
|
|
|
|
class StoryType(str, Enum):
|
|
"""Story type options."""
|
|
PRODUCT_SHOWCASE = "Product showcase"
|
|
BEHIND_SCENES = "Behind the scenes"
|
|
USER_TESTIMONIAL = "User testimonial"
|
|
EVENT_PROMOTION = "Event promotion"
|
|
TUTORIAL = "Tutorial/How-to"
|
|
QUESTION_POLL = "Question/Poll"
|
|
ANNOUNCEMENT = "Announcement"
|
|
CUSTOM = "Custom"
|
|
|
|
|
|
class StoryTone(str, Enum):
|
|
"""Story tone options."""
|
|
CASUAL = "Casual"
|
|
FUN = "Fun"
|
|
PROFESSIONAL = "Professional"
|
|
INSPIRATIONAL = "Inspirational"
|
|
EDUCATIONAL = "Educational"
|
|
ENTERTAINING = "Entertaining"
|
|
CUSTOM = "Custom"
|
|
|
|
|
|
class StoryVisualOptions(BaseModel):
|
|
"""Visual options for story."""
|
|
# Background layer
|
|
background_type: str = Field(default="Solid color", description="Background type (Solid color, Gradient, Image, Video)")
|
|
background_image_prompt: Optional[str] = Field(None, description="If background_type is Image/Video, describe desired visual")
|
|
gradient_style: Optional[str] = Field(None, description="Gradient style if gradient background is chosen")
|
|
|
|
# Text overlay styling
|
|
text_overlay: bool = Field(default=True, description="Include text overlay")
|
|
text_style: Optional[str] = Field(None, description="Headline/Subtext style, e.g., Bold, Minimal, Handwritten")
|
|
text_color: Optional[str] = Field(None, description="Preferred text color or palette")
|
|
text_position: Optional[str] = Field(None, description="Top/Center/Bottom; Left/Center/Right")
|
|
|
|
# Embellishments and interactivity
|
|
stickers: bool = Field(default=True, description="Use stickers/emojis")
|
|
interactive_elements: bool = Field(default=True, description="Include polls/questions")
|
|
interactive_types: Optional[List[str]] = Field(
|
|
default=None,
|
|
description="List of interactive types like ['poll','quiz','slider','countdown']"
|
|
)
|
|
|
|
# CTA overlay
|
|
call_to_action: Optional[str] = Field(None, description="Optional CTA copy to place on story")
|
|
|
|
|
|
class FacebookStoryRequest(BaseModel):
|
|
"""Request model for Facebook story generation."""
|
|
business_type: str = Field(..., description="Type of business")
|
|
target_audience: str = Field(..., description="Target audience description")
|
|
story_type: StoryType = Field(..., description="Type of story to create")
|
|
custom_story_type: Optional[str] = Field(None, description="Custom story type if 'Custom' is selected")
|
|
story_tone: StoryTone = Field(..., description="Tone of the story")
|
|
custom_tone: Optional[str] = Field(None, description="Custom tone if 'Custom' is selected")
|
|
include: Optional[str] = Field(None, description="Elements to include in the story")
|
|
avoid: Optional[str] = Field(None, description="Elements to avoid in the story")
|
|
visual_options: StoryVisualOptions = Field(default_factory=StoryVisualOptions, description="Visual customization options")
|
|
# Advanced text generation options (parity with original Streamlit module)
|
|
use_hook: bool = Field(default=True, description="Start with a hook to grab attention")
|
|
use_story: bool = Field(default=True, description="Use a short narrative arc")
|
|
use_cta: bool = Field(default=True, description="Include a call to action")
|
|
use_question: bool = Field(default=True, description="Ask a question to spur interaction")
|
|
use_emoji: bool = Field(default=True, description="Use emojis where appropriate")
|
|
use_hashtags: bool = Field(default=True, description="Include relevant hashtags in copy")
|
|
|
|
|
|
class FacebookStoryResponse(BaseModel):
|
|
"""Response model for Facebook story generation."""
|
|
success: bool = Field(..., description="Whether the generation was successful")
|
|
content: Optional[str] = Field(None, description="Generated story content")
|
|
images_base64: Optional[List[str]] = Field(None, description="List of base64-encoded story images (PNG)")
|
|
visual_suggestions: Optional[List[str]] = Field(None, description="Visual element suggestions")
|
|
engagement_tips: Optional[List[str]] = Field(None, description="Engagement optimization tips")
|
|
error: Optional[str] = Field(None, description="Error message if generation failed")
|
|
metadata: Optional[Dict[str, Any]] = Field(None, description="Additional metadata about the generation") |