Add Facebook Writer API with models, routers, and migration summary
Co-authored-by: ajay.calsoft <ajay.calsoft@gmail.com>
This commit is contained in:
161
backend/api/facebook_writer/services/story_service.py
Normal file
161
backend/api/facebook_writer/services/story_service.py
Normal file
@@ -0,0 +1,161 @@
|
||||
"""Facebook Story generation service."""
|
||||
|
||||
from typing import Dict, Any, List
|
||||
from ..models.story_models import FacebookStoryRequest, FacebookStoryResponse
|
||||
from .base_service import FacebookWriterBaseService
|
||||
|
||||
|
||||
class FacebookStoryService(FacebookWriterBaseService):
|
||||
"""Service for generating Facebook stories."""
|
||||
|
||||
def generate_story(self, request: FacebookStoryRequest) -> FacebookStoryResponse:
|
||||
"""
|
||||
Generate a Facebook story based on the request parameters.
|
||||
|
||||
Args:
|
||||
request: FacebookStoryRequest containing all the parameters
|
||||
|
||||
Returns:
|
||||
FacebookStoryResponse with the generated content
|
||||
"""
|
||||
try:
|
||||
# Determine the actual story type and tone
|
||||
actual_story_type = request.custom_story_type if request.story_type.value == "Custom" else request.story_type.value
|
||||
actual_tone = request.custom_tone if request.story_tone.value == "Custom" else request.story_tone.value
|
||||
|
||||
# Build the prompt
|
||||
prompt = self._build_story_prompt(request, actual_story_type, actual_tone)
|
||||
|
||||
# Generate the story content
|
||||
content = self._generate_text(prompt, temperature=0.7, max_tokens=1024)
|
||||
|
||||
if not content:
|
||||
return FacebookStoryResponse(
|
||||
success=False,
|
||||
error="Failed to generate story content"
|
||||
)
|
||||
|
||||
# Generate visual suggestions and engagement tips
|
||||
visual_suggestions = self._generate_visual_suggestions(actual_story_type, request.visual_options)
|
||||
engagement_tips = self._generate_engagement_tips("story")
|
||||
|
||||
return FacebookStoryResponse(
|
||||
success=True,
|
||||
content=content,
|
||||
visual_suggestions=visual_suggestions,
|
||||
engagement_tips=engagement_tips,
|
||||
metadata={
|
||||
"business_type": request.business_type,
|
||||
"target_audience": request.target_audience,
|
||||
"story_type": actual_story_type,
|
||||
"tone": actual_tone
|
||||
}
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
return FacebookStoryResponse(
|
||||
**self._handle_error(e, "Facebook story generation")
|
||||
)
|
||||
|
||||
def _build_story_prompt(self, request: FacebookStoryRequest, story_type: str, tone: str) -> str:
|
||||
"""
|
||||
Build the prompt for Facebook story generation.
|
||||
|
||||
Args:
|
||||
request: The story request
|
||||
story_type: The actual story type (resolved from custom if needed)
|
||||
tone: The actual tone (resolved from custom if needed)
|
||||
|
||||
Returns:
|
||||
Formatted prompt string
|
||||
"""
|
||||
base_prompt = self._build_base_prompt(
|
||||
request.business_type,
|
||||
request.target_audience,
|
||||
f"Create a {story_type} story"
|
||||
)
|
||||
|
||||
prompt = f"""
|
||||
{base_prompt}
|
||||
|
||||
Generate a Facebook Story with the following specifications:
|
||||
|
||||
Story Type: {story_type}
|
||||
Tone: {tone}
|
||||
|
||||
Content Requirements:
|
||||
- Include: {request.include or 'N/A'}
|
||||
- Avoid: {request.avoid or 'N/A'}
|
||||
|
||||
Visual Options:
|
||||
- Background Type: {request.visual_options.background_type}
|
||||
- Text Overlay: {request.visual_options.text_overlay}
|
||||
- Stickers/Emojis: {request.visual_options.stickers}
|
||||
- Interactive Elements: {request.visual_options.interactive_elements}
|
||||
|
||||
Please create a Facebook Story that:
|
||||
1. Is optimized for mobile viewing (vertical format)
|
||||
2. Has concise, impactful text (stories are viewed quickly)
|
||||
3. Includes clear visual direction for designers
|
||||
4. Maintains {tone} tone throughout
|
||||
5. Encourages viewer interaction
|
||||
6. Fits the {story_type} format
|
||||
7. Appeals to: {request.target_audience}
|
||||
|
||||
Format the response with:
|
||||
- Main story text/copy
|
||||
- Visual description
|
||||
- Text overlay suggestions
|
||||
- Interactive element suggestions (if enabled)
|
||||
|
||||
Keep it engaging and story-appropriate for Facebook's ephemeral format.
|
||||
"""
|
||||
|
||||
return prompt
|
||||
|
||||
def _generate_visual_suggestions(self, story_type: str, visual_options) -> List[str]:
|
||||
"""Generate visual suggestions based on story type and options."""
|
||||
suggestions = []
|
||||
|
||||
if story_type == "Product showcase":
|
||||
suggestions.extend([
|
||||
"Use high-quality product photos with clean backgrounds",
|
||||
"Include multiple angles or features in carousel format",
|
||||
"Add animated elements to highlight key features"
|
||||
])
|
||||
elif story_type == "Behind the scenes":
|
||||
suggestions.extend([
|
||||
"Use candid, authentic photos/videos",
|
||||
"Show the process or journey",
|
||||
"Include team members or workspace shots"
|
||||
])
|
||||
elif story_type == "Tutorial/How-to":
|
||||
suggestions.extend([
|
||||
"Break down steps with numbered overlays",
|
||||
"Use before/after comparisons",
|
||||
"Include clear, step-by-step visuals"
|
||||
])
|
||||
|
||||
# Add general suggestions based on visual options
|
||||
if visual_options.text_overlay:
|
||||
suggestions.append("Use bold, readable fonts for text overlays")
|
||||
|
||||
if visual_options.stickers:
|
||||
suggestions.append("Add relevant emojis and stickers to increase engagement")
|
||||
|
||||
if visual_options.interactive_elements:
|
||||
suggestions.append("Include polls, questions, or swipe-up actions")
|
||||
|
||||
return suggestions
|
||||
|
||||
def _generate_engagement_tips(self, content_type: str) -> List[str]:
|
||||
"""Generate engagement tips specific to stories."""
|
||||
return [
|
||||
"Post at peak audience activity times",
|
||||
"Use interactive stickers to encourage participation",
|
||||
"Keep text minimal and highly readable",
|
||||
"Include a clear call-to-action",
|
||||
"Use trending hashtags in story text",
|
||||
"Tag relevant accounts to increase reach",
|
||||
"Save important stories as Highlights"
|
||||
]
|
||||
Reference in New Issue
Block a user