12 KiB
LinkedIn Content Generation Service
A comprehensive FastAPI-based service for generating professional LinkedIn content using AI. This service has been migrated from the legacy Streamlit implementation to provide robust API endpoints for LinkedIn content creation.
Overview
The LinkedIn Content Generation Service provides AI-powered tools for creating various types of LinkedIn content:
- Posts: Short-form professional posts with research-backed content
- Articles: Long-form articles with SEO optimization
- Carousels: Multi-slide visual content
- Video Scripts: Structured scripts for LinkedIn videos
- Comment Responses: Professional responses to LinkedIn comments
Features
🚀 Core Capabilities
- Multi-format Content Generation: Posts, articles, carousels, video scripts, and comment responses
- Research Integration: Automated research using multiple search engines (Metaphor, Google, Tavily)
- AI-Powered Optimization: Industry-specific content optimization using Gemini AI
- SEO Enhancement: Built-in SEO optimization for LinkedIn articles
- Engagement Prediction: AI-based engagement metrics prediction
- Professional Tone Control: Multiple tone options (professional, conversational, authoritative, etc.)
🛠 Technical Features
- FastAPI Integration: RESTful API with automatic documentation
- Comprehensive Error Handling: Robust exception handling and logging
- Database Monitoring: Request logging and performance monitoring
- Async/Await Support: Non-blocking operations for better performance
- Pydantic Validation: Strong request/response validation
- Structured JSON Responses: Consistent API response format
API Endpoints
Base URL
/api/linkedin
Available Endpoints
| Endpoint | Method | Description |
|---|---|---|
/health |
GET | Health check for service status |
/generate-post |
POST | Generate LinkedIn posts |
/generate-article |
POST | Generate LinkedIn articles |
/generate-carousel |
POST | Generate LinkedIn carousels |
/generate-video-script |
POST | Generate video scripts |
/generate-comment-response |
POST | Generate comment responses |
/content-types |
GET | Get available content types |
/usage-stats |
GET | Get usage statistics |
Quick Start
1. Prerequisites
# Install dependencies
pip install -r requirements.txt
# Set environment variables
export GEMINI_API_KEY="your_gemini_api_key"
export DATABASE_URL="sqlite:///./alwrity.db"
2. Start the Service
# Start FastAPI server
uvicorn app:app --host 0.0.0.0 --port 8000 --reload
3. Access Documentation
- Interactive API Docs: http://localhost:8000/docs
- Alternative Docs: http://localhost:8000/redoc
Usage Examples
Generate a LinkedIn Post
import requests
# Request payload
payload = {
"topic": "Artificial Intelligence in Healthcare",
"industry": "Healthcare",
"post_type": "thought_leadership",
"tone": "professional",
"target_audience": "Healthcare executives",
"key_points": ["AI diagnostics", "Patient outcomes", "Cost reduction"],
"include_hashtags": True,
"include_call_to_action": True,
"research_enabled": True,
"max_length": 2000
}
# Make request
response = requests.post(
"http://localhost:8000/api/linkedin/generate-post",
json=payload
)
# Process response
if response.status_code == 200:
data = response.json()
print(f"Generated post: {data['data']['content']}")
print(f"Hashtags: {[h['hashtag'] for h in data['data']['hashtags']]}")
else:
print(f"Error: {response.status_code}")
Generate a LinkedIn Article
payload = {
"topic": "Digital Transformation in Manufacturing",
"industry": "Manufacturing",
"tone": "professional",
"target_audience": "Manufacturing leaders",
"key_sections": ["Current challenges", "Technology solutions", "Implementation strategies"],
"include_images": True,
"seo_optimization": True,
"research_enabled": True,
"word_count": 1500
}
response = requests.post(
"http://localhost:8000/api/linkedin/generate-article",
json=payload
)
Generate a LinkedIn Carousel
payload = {
"topic": "5 Ways to Improve Team Productivity",
"industry": "Business Management",
"slide_count": 8,
"tone": "professional",
"target_audience": "Team leaders and managers",
"key_takeaways": ["Clear communication", "Goal setting", "Tool optimization"],
"include_cover_slide": True,
"include_cta_slide": True,
"visual_style": "modern"
}
response = requests.post(
"http://localhost:8000/api/linkedin/generate-carousel",
json=payload
)
Request/Response Models
LinkedIn Post Request
{
"topic": "string",
"industry": "string",
"post_type": "professional|thought_leadership|industry_news|personal_story|company_update|poll",
"tone": "professional|conversational|authoritative|inspirational|educational|friendly",
"target_audience": "string (optional)",
"key_points": ["string"] (optional),
"include_hashtags": true,
"include_call_to_action": true,
"research_enabled": true,
"search_engine": "metaphor|google|tavily",
"max_length": 3000
}
LinkedIn Post Response
{
"success": true,
"data": {
"content": "Generated post content...",
"character_count": 1250,
"hashtags": [
{
"hashtag": "#AIinHealthcare",
"category": "industry",
"popularity_score": 0.9
}
],
"call_to_action": "What's your experience with AI in healthcare?",
"engagement_prediction": {
"estimated_likes": 120,
"estimated_comments": 15,
"estimated_shares": 8
}
},
"research_sources": [
{
"title": "AI in Healthcare: Current Trends",
"url": "https://example.com/ai-healthcare",
"content": "Summary of AI healthcare trends...",
"relevance_score": 0.95
}
],
"generation_metadata": {
"generation_time": 3.2,
"timestamp": "2025-01-27T10:00:00Z",
"model_used": "gemini-2.0-flash-001"
}
}
Configuration
Environment Variables
| Variable | Description | Required | Default |
|---|---|---|---|
GEMINI_API_KEY |
Google Gemini API key | Yes | - |
DATABASE_URL |
Database connection string | No | sqlite:///./alwrity.db |
LOG_LEVEL |
Logging level | No | INFO |
Content Generation Settings
The service supports various customization options:
Post Types
professional: Standard professional poststhought_leadership: Industry insights and expertiseindustry_news: News and updatespersonal_story: Personal experiences and storiescompany_update: Company news and announcementspoll: Interactive polls
Tone Options
professional: Formal business toneconversational: Casual but professionalauthoritative: Expert and confidentinspirational: Motivational and upliftingeducational: Informative and teachingfriendly: Warm and approachable
Search Engines
metaphor: Metaphor AI search (recommended)google: Google Search APItavily: Tavily AI search
Architecture
Service Structure
backend/
├── models/
│ └── linkedin_models.py # Pydantic models for requests/responses
├── services/
│ └── linkedin_service.py # Core business logic
├── routers/
│ └── linkedin.py # FastAPI route handlers
├── middleware/
│ └── monitoring_middleware.py # Request monitoring
└── docs/
└── LINKEDIN_CONTENT_GENERATION.md
Key Components
LinkedInContentService
The core service class that handles all content generation logic:
- Content Generation: AI-powered content creation
- Research Integration: Multi-source research capabilities
- Error Handling: Comprehensive exception management
- Logging: Detailed operation logging
Request Models
Pydantic models for strong typing and validation:
LinkedInPostRequestLinkedInArticleRequestLinkedInCarouselRequestLinkedInVideoScriptRequestLinkedInCommentResponseRequest
Response Models
Structured response models with metadata:
LinkedInPostResponseLinkedInArticleResponseLinkedInCarouselResponseLinkedInVideoScriptResponseLinkedInCommentResponseResult
Performance Considerations
Response Times
- Posts: 3-8 seconds (with research)
- Articles: 15-45 seconds (depending on length)
- Carousels: 5-15 seconds
- Video Scripts: 3-10 seconds
- Comment Responses: 1-3 seconds
Rate Limiting
The service respects API rate limits:
- Gemini API: Built-in retry logic with exponential backoff
- Research APIs: Configurable rate limiting
Caching
- Research results caching (planned)
- Response caching for similar requests (planned)
Error Handling
Common Error Scenarios
422 Validation Error
{
"detail": [
{
"loc": ["body", "topic"],
"msg": "ensure this value has at least 3 characters",
"type": "value_error.any_str.min_length"
}
]
}
500 Internal Server Error
{
"success": false,
"error": "Content generation failed: API key not configured",
"generation_metadata": {
"service_version": "1.0.0",
"timestamp": "2025-01-27T10:00:00Z"
}
}
Error Recovery
- Automatic retry logic for transient failures
- Graceful fallback for content generation
- Detailed error logging for debugging
Monitoring and Logging
Request Monitoring
All API requests are logged with:
- Request path and method
- Response time and status code
- User information (if available)
- Request/response sizes
Performance Metrics
- Generation time tracking
- Success/failure rates
- Popular content types
- Error frequency analysis
Health Checks
curl http://localhost:8000/api/linkedin/health
Migration from Streamlit
Key Changes
- Architecture: Streamlit UI → FastAPI REST API
- Dependencies: Integrated with existing backend services
- Error Handling: Enhanced exception handling and logging
- Monitoring: Database-backed request monitoring
- Validation: Strong request/response validation
- Documentation: Automatic API documentation
Compatibility
- All original functionality preserved
- Enhanced features and capabilities
- Better integration with existing systems
- Improved performance and scalability
Testing
Running Tests
# Structure validation
python3 validate_linkedin_structure.py
# Full functionality tests (requires dependencies)
python3 test_linkedin_endpoints.py
Test Coverage
- ✅ Post generation
- ✅ Article generation
- ✅ Carousel generation
- ✅ Video script generation
- ✅ Comment response generation
- ✅ Error handling
- ✅ Structure validation
Troubleshooting
Common Issues
1. Import Errors
ModuleNotFoundError: No module named 'pydantic'
Solution: Install dependencies
pip install -r requirements.txt
2. API Key Issues
Error: GEMINI_API_KEY environment variable is not set
Solution: Set the environment variable
export GEMINI_API_KEY="your_api_key_here"
3. Database Connection Issues
Error creating database session
Solution: Check database configuration and permissions
4. Generation Timeouts
Solution: Increase timeout settings or reduce content complexity
Debug Mode
Enable debug logging:
export LOG_LEVEL=DEBUG
Future Enhancements
Planned Features
- Real search engine integration (Metaphor, Google, Tavily)
- Content scheduling and calendar integration
- A/B testing capabilities
- Advanced analytics and reporting
- Multi-language support
- Custom templates and brand voice
- LinkedIn API integration for direct posting
- Content performance tracking
Performance Improvements
- Response caching
- Parallel processing for multiple requests
- Background job processing
- CDN integration for static assets
Support
For issues and questions:
- Check the troubleshooting section
- Review the API documentation at
/docs - Check the logs for detailed error information
- Validate your request format against the examples
License
This LinkedIn Content Generation Service is part of the ALwrity platform and follows the same licensing terms.