125 lines
4.8 KiB
Python
125 lines
4.8 KiB
Python
import os
|
|
"""Facebook Post generation service."""
|
|
|
|
from typing import Dict, Any
|
|
from ..models.post_models import FacebookPostRequest, FacebookPostResponse, FacebookPostAnalytics, FacebookPostOptimization
|
|
from .base_service import FacebookWriterBaseService
|
|
|
|
|
|
class FacebookPostService(FacebookWriterBaseService):
|
|
"""Service for generating Facebook posts."""
|
|
|
|
def generate_post(self, request: FacebookPostRequest) -> FacebookPostResponse:
|
|
"""
|
|
Generate a Facebook post based on the request parameters.
|
|
|
|
Args:
|
|
request: FacebookPostRequest containing all the parameters
|
|
|
|
Returns:
|
|
FacebookPostResponse with the generated content
|
|
"""
|
|
try:
|
|
# Determine the actual goal and tone
|
|
actual_goal = request.custom_goal if request.post_goal.value == "Custom" else request.post_goal.value
|
|
actual_tone = request.custom_tone if request.post_tone.value == "Custom" else request.post_tone.value
|
|
|
|
# Get persona data for enhanced content generation
|
|
user_id = int(os.getenv("ALWRITY_FALLBACK_USER_ID", "0"))
|
|
persona_data = self._get_persona_data(user_id)
|
|
|
|
# Build the prompt
|
|
base_prompt = self._build_post_prompt(request, actual_goal, actual_tone)
|
|
prompt = self._build_persona_enhanced_prompt(base_prompt, persona_data)
|
|
|
|
# Generate the post content
|
|
content = self._generate_text(prompt, temperature=0.7, max_tokens=1024)
|
|
|
|
if not content:
|
|
return FacebookPostResponse(
|
|
success=False,
|
|
error="Failed to generate post content"
|
|
)
|
|
|
|
# Create analytics and optimization suggestions
|
|
analytics = FacebookPostAnalytics(
|
|
expected_reach="2.5K - 5K",
|
|
expected_engagement="5-8%",
|
|
best_time_to_post="2 PM - 4 PM"
|
|
)
|
|
|
|
optimization = FacebookPostOptimization(
|
|
suggestions=self._create_optimization_suggestions("post")
|
|
)
|
|
|
|
return FacebookPostResponse(
|
|
success=True,
|
|
content=content,
|
|
analytics=analytics,
|
|
optimization=optimization,
|
|
metadata={
|
|
"business_type": request.business_type,
|
|
"target_audience": request.target_audience,
|
|
"goal": actual_goal,
|
|
"tone": actual_tone
|
|
}
|
|
)
|
|
|
|
except Exception as e:
|
|
return FacebookPostResponse(
|
|
**self._handle_error(e, "Facebook post generation")
|
|
)
|
|
|
|
def _build_post_prompt(self, request: FacebookPostRequest, goal: str, tone: str) -> str:
|
|
"""
|
|
Build the prompt for Facebook post generation.
|
|
|
|
Args:
|
|
request: The post request
|
|
goal: The actual goal (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,
|
|
goal
|
|
)
|
|
|
|
prompt = f"""
|
|
{base_prompt}
|
|
|
|
Generate a Facebook post with the following specifications:
|
|
|
|
Goal: {goal}
|
|
Tone: {tone}
|
|
|
|
Content Requirements:
|
|
- Include: {request.include or 'N/A'}
|
|
- Avoid: {request.avoid or 'N/A'}
|
|
|
|
Advanced Options:
|
|
- Use attention-grabbing hook: {request.advanced_options.use_hook}
|
|
- Include storytelling elements: {request.advanced_options.use_story}
|
|
- Add clear call-to-action: {request.advanced_options.use_cta}
|
|
- Include engagement question: {request.advanced_options.use_question}
|
|
- Use relevant emojis: {request.advanced_options.use_emoji}
|
|
- Add relevant hashtags: {request.advanced_options.use_hashtags}
|
|
|
|
Media Type: {request.media_type.value}
|
|
|
|
Please write a well-structured Facebook post that:
|
|
1. Grabs attention in the first line (hook)
|
|
2. Maintains consistent {tone} tone throughout
|
|
3. Includes engaging content that aligns with the goal: {goal}
|
|
4. Ends with a clear call-to-action (if enabled)
|
|
5. Uses appropriate formatting and emojis (if enabled)
|
|
6. Includes relevant hashtags (if enabled)
|
|
7. Considers the target audience: {request.target_audience}
|
|
|
|
The post should be engaging, platform-appropriate, and optimized for Facebook's algorithm.
|
|
"""
|
|
|
|
return prompt |