Phase 1: Dead Code Cleanup - Remove GeminiGroundedProvider import and property from linkedin_service.py - Remove fallback_provider property (gemini_provider imports) - Fix routers/linkedin.py edit endpoint to use llm_text_gen - Delete dead LinkedInImageEditor class - Remove dead _transform_gemini_sources from content_generator.py Phase 2: Research Infrastructure Alignment - Add user_id to _conduct_research() for pre-flight validation - Add validate_exa_research_operations() before Exa/Tavily calls - Pass user_id to provider.simple_search() for usage tracking - Inject research content into LLM prompts via _build_research_context() - Fix Google engine path to fallback to Exa - Add Exa → Tavily fallback on research failure Phase 3: Cosmetic Cleanup - Rename _generate_prompts_with_gemini → _generate_prompts_with_llm - Rename _build_gemini_prompt → _build_image_prompt - Rename _parse_gemini_response → _parse_llm_response - Remove all Gemini references from LinkedIn code (0 remaining) - Update docstrings and log messages Additional: - Research caching using existing ResearchCache - Shared ExaContentResearchProvider in services/research/ - Persona service uses llm_text_gen instead of gemini_structured_json_response - LinkedInWriter.tsx ChatMessage → ChatMsg type mapping fix - RegisterLinkedInActionsEnhanced.tsx content_format_rules typing fix
Persona Services Package
This package contains platform-specific persona generation and analysis services, providing a modular and extensible architecture for creating platform-optimized writing personas.
Structure
services/persona/
├── __init__.py # Package initialization
├── linkedin/ # LinkedIn-specific persona services
│ ├── __init__.py # LinkedIn package initialization
│ ├── linkedin_persona_service.py # Main LinkedIn persona service
│ ├── linkedin_persona_prompts.py # LinkedIn-specific prompts
│ └── linkedin_persona_schemas.py # LinkedIn-specific schemas
└── README.md # This documentation
LinkedIn Persona Services
LinkedInPersonaService
The main service class for generating LinkedIn-specific persona adaptations.
Key Features:
- Enhanced LinkedIn-specific prompt generation
- Professional networking optimization
- Industry-specific adaptations
- Algorithm optimization for LinkedIn
- Persona validation and quality scoring
Methods:
generate_linkedin_persona()- Generate LinkedIn-optimized personavalidate_linkedin_persona()- Validate persona data qualityoptimize_for_linkedin_algorithm()- Algorithm-specific optimizationsget_linkedin_constraints()- Get LinkedIn platform constraints
LinkedInPersonaPrompts
Handles LinkedIn-specific prompt generation with professional optimization.
Key Features:
- Industry-specific targeting (technology, business, etc.)
- Professional networking focus
- Thought leadership positioning
- B2B optimization
- LinkedIn algorithm awareness
LinkedInPersonaSchemas
Defines LinkedIn-specific JSON schemas for persona generation.
Key Features:
- Enhanced LinkedIn schema with professional fields
- Algorithm optimization fields
- Professional networking elements
- LinkedIn feature-specific adaptations
Usage
from services.persona.linkedin.linkedin_persona_service import LinkedInPersonaService
# Initialize the service
linkedin_service = LinkedInPersonaService()
# Generate LinkedIn persona
linkedin_persona = linkedin_service.generate_linkedin_persona(
core_persona=core_persona_data,
onboarding_data=onboarding_data
)
# Validate persona quality
validation_results = linkedin_service.validate_linkedin_persona(linkedin_persona)
# Optimize for LinkedIn algorithm
optimized_persona = linkedin_service.optimize_for_linkedin_algorithm(linkedin_persona)
Integration with Main Persona Service
The main PersonaAnalysisService automatically uses the LinkedIn service when generating LinkedIn personas:
# In PersonaAnalysisService._generate_single_platform_persona()
if platform.lower() == "linkedin":
return self.linkedin_service.generate_linkedin_persona(core_persona, onboarding_data)
Benefits of This Architecture
- Modularity: Each platform has its own dedicated service
- Extensibility: Easy to add new platforms (Facebook, Instagram, etc.)
- Maintainability: Platform-specific logic is isolated
- Testability: Each service can be tested independently
- Reusability: Services can be used across different parts of the application
Future Extensions
This architecture makes it easy to add new platform-specific services:
services/persona/facebook/- Facebook-specific persona servicesservices/persona/instagram/- Instagram-specific persona servicesservices/persona/twitter/- Twitter-specific persona servicesservices/persona/blog/- Blog-specific persona services
Each platform service would follow the same pattern:
{platform}_persona_service.py- Main service class{platform}_persona_prompts.py- Platform-specific prompts{platform}_persona_schemas.py- Platform-specific schemas