Twitter and LinkedIn Writers
This commit is contained in:
347
lib/ai_writers/linkedin_writer/README.md
Normal file
347
lib/ai_writers/linkedin_writer/README.md
Normal file
@@ -0,0 +1,347 @@
|
||||
# LinkedIn AI Writer
|
||||
|
||||
A comprehensive suite of AI-powered tools for generating professional LinkedIn content.
|
||||
|
||||
## Overview
|
||||
|
||||
LinkedIn AI Writer is a powerful tool designed to help professionals, businesses, and content creators generate high-quality LinkedIn content. It leverages advanced AI models to create engaging posts, articles, carousels, video scripts, and more, all optimized for LinkedIn's platform.
|
||||
|
||||
## Tools Status
|
||||
|
||||
| Tool | Status | Category |
|
||||
|------|--------|----------|
|
||||
| LinkedIn Post Generator | ✅ Active | Content Creation |
|
||||
| LinkedIn Article Generator | ✅ Active | Content Creation |
|
||||
| LinkedIn Carousel Post Generator | ✅ Active | Content Creation |
|
||||
| LinkedIn Video Script Generator | ✅ Active | Content Creation |
|
||||
| LinkedIn Poll Generator | ✅ Active | Content Creation |
|
||||
| LinkedIn Comment Response Generator | ✅ Active | Engagement |
|
||||
| LinkedIn Profile Optimizer | ✅ Active | Profile & Personal Branding |
|
||||
| LinkedIn Company Page Content Generator | ✅ Active | Business & Marketing |
|
||||
| LinkedIn Newsletter Generator | 🔄 Coming Soon | Business & Marketing |
|
||||
| LinkedIn Job Description Generator | 🔄 Coming Soon | Business & Marketing |
|
||||
| LinkedIn Sales Navigator Content Generator | 🔄 Coming Soon | Sales & Networking |
|
||||
| LinkedIn InMail Generator | 🔄 Coming Soon | Sales & Networking |
|
||||
| LinkedIn Learning Course Description Generator | 🔄 Coming Soon | Learning & Education |
|
||||
| LinkedIn Event Description Generator | 🔄 Coming Soon | Learning & Education |
|
||||
| LinkedIn Group Post Generator | 🔄 Coming Soon | Community & Engagement |
|
||||
|
||||
## Features
|
||||
|
||||
### Content Creation Tools
|
||||
|
||||
#### LinkedIn Post Generator
|
||||
- **Status**: Active
|
||||
- **Description**: Create engaging, professional posts that drive engagement and establish thought leadership.
|
||||
- **Features**:
|
||||
- Professional tone customization
|
||||
- Industry-specific terminology
|
||||
- Hashtag optimization
|
||||
- Formatting options
|
||||
- Character count optimization
|
||||
- Call-to-action suggestions
|
||||
- Engagement prediction
|
||||
- Visual content recommendations
|
||||
- Poll creation
|
||||
- Best posting time suggestions
|
||||
- Research-backed content
|
||||
- Reference tracking
|
||||
|
||||
#### LinkedIn Article Generator
|
||||
- **Status**: Active
|
||||
- **Description**: Generate long-form professional articles that showcase expertise and drive traffic.
|
||||
- **Features**:
|
||||
- Topic research and outline generation
|
||||
- SEO optimization for LinkedIn articles
|
||||
- Professional writing style adaptation
|
||||
- Section structuring
|
||||
- Citation and reference formatting
|
||||
- Image placement suggestions
|
||||
- Headline optimization
|
||||
- Meta description generation
|
||||
- Reading time estimation
|
||||
- Internal linking suggestions
|
||||
- Multiple research sources (Metaphor, Google, Tavily)
|
||||
- AI-generated section images
|
||||
|
||||
#### LinkedIn Carousel Post Generator
|
||||
- **Status**: Active
|
||||
- **Description**: Create engaging carousel posts that showcase information in a visually appealing way.
|
||||
- **Features**:
|
||||
- Slide content generation
|
||||
- Visual hierarchy optimization
|
||||
- Story arc development
|
||||
- Call-to-action placement
|
||||
- Brand consistency maintenance
|
||||
- Engagement element integration
|
||||
- Professional design suggestions
|
||||
- Content distribution strategy
|
||||
- Analytics integration
|
||||
- A/B testing variations
|
||||
|
||||
#### LinkedIn Video Script Generator
|
||||
- **Status**: Active
|
||||
- **Description**: Create scripts for LinkedIn videos that drive engagement.
|
||||
- **Features**:
|
||||
- Hook generation
|
||||
- Story structure development
|
||||
- Professional speaking points
|
||||
- Visual cue suggestions
|
||||
- Call-to-action optimization
|
||||
- Engagement prompt integration
|
||||
- Caption generation
|
||||
- Thumbnail text suggestions
|
||||
- Video description optimization
|
||||
- Hashtag strategy
|
||||
|
||||
#### LinkedIn Poll Generator
|
||||
- **Status**: Active
|
||||
- **Description**: Create engaging polls that drive interaction and gather insights.
|
||||
- **Features**:
|
||||
- Question formulation optimization
|
||||
- Option generation based on topic
|
||||
- Industry-specific poll templates
|
||||
- Engagement prediction
|
||||
- Result analysis suggestions
|
||||
- Follow-up content recommendations
|
||||
- Trending topic integration
|
||||
- Professional tone maintenance
|
||||
- Data visualization suggestions
|
||||
- Poll scheduling optimization
|
||||
|
||||
### Engagement Tools
|
||||
|
||||
#### LinkedIn Comment Response Generator
|
||||
- **Status**: Active
|
||||
- **Description**: Generate professional and engaging responses to LinkedIn comments with AI-powered analysis and optimization.
|
||||
- **Features**:
|
||||
- Comment analysis and categorization
|
||||
- Multiple response types (general, disagreement, value-add)
|
||||
- Brand voice customization
|
||||
- Engagement goal targeting
|
||||
- Resource suggestion generation
|
||||
- Follow-up question generation
|
||||
- Tone optimization
|
||||
- Response strategy recommendations
|
||||
- Context-aware responses
|
||||
- Professional formatting
|
||||
|
||||
### Profile & Personal Branding Tools
|
||||
|
||||
#### LinkedIn Profile Optimizer
|
||||
- **Status**: Active
|
||||
- **Description**: Enhance LinkedIn profiles to improve visibility and professional appeal.
|
||||
- **Features**:
|
||||
- Headline optimization
|
||||
- About section generation
|
||||
- Experience description enhancement
|
||||
- Skills recommendation
|
||||
- Project highlight creation
|
||||
- Endorsement request generation
|
||||
- Profile strength analysis
|
||||
- Keyword optimization
|
||||
- Professional summary generation
|
||||
- Custom URL suggestions
|
||||
|
||||
### Business & Marketing Tools
|
||||
|
||||
#### LinkedIn Company Page Content Generator
|
||||
- **Status**: Active
|
||||
- **Description**: Create content for company pages that builds brand awareness and engagement.
|
||||
- **Features**:
|
||||
- Company profile optimization
|
||||
- Company culture post generation
|
||||
- Product/service announcement templates
|
||||
- Employee spotlight content
|
||||
- Company milestone celebrations
|
||||
- Industry insights sharing
|
||||
- Event promotion content
|
||||
- Job posting templates
|
||||
- Company news updates
|
||||
- Brand voice consistency
|
||||
- Engagement metrics optimization
|
||||
|
||||
#### LinkedIn Newsletter Generator
|
||||
- **Status**: Coming Soon
|
||||
- **Description**: Create professional newsletters that establish thought leadership and drive engagement.
|
||||
- **Features**:
|
||||
- Newsletter structure templates
|
||||
- Topic clustering and organization
|
||||
- Professional introduction and conclusion
|
||||
- Industry trend analysis integration
|
||||
- Expert quote suggestions
|
||||
- Visual content recommendations
|
||||
- Call-to-action optimization
|
||||
- Subscriber engagement prompts
|
||||
- Consistency maintenance
|
||||
- Analytics integration suggestions
|
||||
|
||||
#### LinkedIn Job Description Generator
|
||||
- **Status**: Coming Soon
|
||||
- **Description**: Create compelling job descriptions that attract qualified candidates.
|
||||
- **Features**:
|
||||
- Role-specific templates
|
||||
- Skills and qualifications optimization
|
||||
- Company culture integration
|
||||
- Benefits and perks highlighting
|
||||
- Inclusive language checker
|
||||
- Keyword optimization
|
||||
- Application process clarity
|
||||
- Remote/hybrid work policy integration
|
||||
- Diversity and inclusion statements
|
||||
- A/B testing variations
|
||||
|
||||
### Sales & Networking Tools
|
||||
|
||||
#### LinkedIn Sales Navigator Content Generator
|
||||
- **Status**: Coming Soon
|
||||
- **Description**: Create personalized outreach content for sales professionals.
|
||||
- **Features**:
|
||||
- Prospect research integration
|
||||
- Industry-specific messaging
|
||||
- Personalization tokens
|
||||
- Connection request templates
|
||||
- Follow-up message sequences
|
||||
- Value proposition highlighting
|
||||
- Objection handling responses
|
||||
- Meeting request templates
|
||||
- Industry pain point addressing
|
||||
- ROI demonstration content
|
||||
|
||||
#### LinkedIn InMail Generator
|
||||
- **Status**: Coming Soon
|
||||
- **Description**: Create personalized and effective InMail messages.
|
||||
- **Features**:
|
||||
- Prospect research integration
|
||||
- Personalization token usage
|
||||
- Value proposition highlighting
|
||||
- Call-to-action optimization
|
||||
- Follow-up sequence generation
|
||||
- Objection handling preparation
|
||||
- Industry-specific messaging
|
||||
- A/B testing variations
|
||||
- Compliance checking
|
||||
- Engagement tracking suggestions
|
||||
|
||||
### Learning & Education Tools
|
||||
|
||||
#### LinkedIn Learning Course Description Generator
|
||||
- **Status**: Coming Soon
|
||||
- **Description**: Create compelling descriptions for LinkedIn Learning courses.
|
||||
- **Features**:
|
||||
- Course objective optimization
|
||||
- Learning outcome generation
|
||||
- Prerequisite suggestions
|
||||
- Target audience definition
|
||||
- Skill tag recommendations
|
||||
- Course structure outline
|
||||
- Engagement element suggestions
|
||||
- Completion certificate highlighting
|
||||
- Industry relevance emphasis
|
||||
- Career path integration
|
||||
|
||||
#### LinkedIn Event Description Generator
|
||||
- **Status**: Coming Soon
|
||||
- **Description**: Create compelling event descriptions that drive attendance and engagement.
|
||||
- **Features**:
|
||||
- Event objective highlighting
|
||||
- Speaker bio generation
|
||||
- Agenda formatting
|
||||
- Registration incentive suggestions
|
||||
- Networking opportunity emphasis
|
||||
- Industry relevance integration
|
||||
- Visual content recommendations
|
||||
- Engagement element suggestions
|
||||
- Post-event follow-up content
|
||||
- Attendance tracking integration
|
||||
|
||||
### Community & Engagement Tools
|
||||
|
||||
#### LinkedIn Group Post Generator
|
||||
- **Status**: Coming Soon
|
||||
- **Description**: Create content specifically optimized for LinkedIn Groups.
|
||||
- **Features**:
|
||||
- Group-specific content adaptation
|
||||
- Discussion prompt generation
|
||||
- Community guideline compliance
|
||||
- Engagement optimization
|
||||
- Moderation suggestion
|
||||
- Topic relevance checking
|
||||
- Member value highlighting
|
||||
- Cross-promotion opportunities
|
||||
- Group culture adaptation
|
||||
- Content scheduling
|
||||
|
||||
## Current Status
|
||||
|
||||
The LinkedIn AI Writer currently has the following tools fully implemented and active:
|
||||
|
||||
1. LinkedIn Post Generator
|
||||
2. LinkedIn Article Generator
|
||||
3. LinkedIn Carousel Post Generator
|
||||
4. LinkedIn Video Script Generator
|
||||
5. LinkedIn Comment Response Generator
|
||||
6. LinkedIn Profile Optimizer
|
||||
7. LinkedIn Poll Generator
|
||||
8. LinkedIn Company Page Content Generator
|
||||
|
||||
The remaining tools are marked as "Coming Soon" and will be implemented in future iterations.
|
||||
|
||||
## Future Development
|
||||
|
||||
### LinkedIn API Integration
|
||||
|
||||
To provide more personalized and effective content, future development will include integration with the LinkedIn API. This will allow:
|
||||
|
||||
- Access to user profile data for personalized content
|
||||
- Direct posting to LinkedIn
|
||||
- Analytics integration for content performance tracking
|
||||
- Engagement metrics for content optimization
|
||||
- Audience insights for targeted content creation
|
||||
|
||||
### Enhanced AI Models
|
||||
|
||||
We plan to enhance the AI models used for content generation to:
|
||||
|
||||
- Better understand LinkedIn's algorithm and best practices
|
||||
- Generate more engaging and platform-specific content
|
||||
- Provide more accurate engagement predictions
|
||||
- Create more personalized content based on user data
|
||||
|
||||
### Additional Features
|
||||
|
||||
Future iterations will include:
|
||||
|
||||
- Content calendar planning and scheduling
|
||||
- Multi-platform content adaptation
|
||||
- Advanced analytics and reporting
|
||||
- Team collaboration features
|
||||
- Content approval workflows
|
||||
- A/B testing capabilities
|
||||
- Custom templates and brand voice settings
|
||||
|
||||
## Getting Started
|
||||
|
||||
To use the LinkedIn AI Writer:
|
||||
|
||||
1. Navigate to the LinkedIn AI Writer dashboard
|
||||
2. Select the tool you want to use
|
||||
3. Fill in the required information
|
||||
4. Generate your content
|
||||
5. Review and edit as needed
|
||||
6. Copy the content to your LinkedIn account
|
||||
|
||||
## Requirements
|
||||
|
||||
- Python 3.8+
|
||||
- Streamlit
|
||||
- OpenAI API key (for GPT models)
|
||||
- Optional: LinkedIn API credentials (for future integration)
|
||||
|
||||
## Contributing
|
||||
|
||||
We welcome contributions to the LinkedIn AI Writer project. Please feel free to submit issues, feature requests, or pull requests.
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the MIT License - see the LICENSE file for details.
|
||||
@@ -29,10 +29,24 @@ from .modules.article_generator.linkedin_article_generator import linkedin_artic
|
||||
from .modules.carousel_generator.linkedin_carousel_generator import linkedin_carousel_generator_ui
|
||||
from .modules.video_script_generator.linkedin_video_script_generator import linkedin_video_script_generator_ui
|
||||
from .modules.comment_response_generator.linkedin_comment_response_generator_ui import linkedin_comment_response_generator_ui
|
||||
from .modules.profile_optimizer.linkedin_profile_optimizer_ui import linkedin_profile_optimizer_ui
|
||||
from .modules.poll_generator import linkedin_poll_generator_ui
|
||||
from .modules.company_page_generator import linkedin_company_page_generator_ui
|
||||
|
||||
# Import image generation
|
||||
from ...gpt_providers.text_to_image_generation.main_generate_image_from_prompt import generate_image
|
||||
|
||||
# Create a wrapper for the async profile optimizer UI
|
||||
def linkedin_profile_optimizer_ui_wrapper():
|
||||
"""Wrapper function to call the async LinkedIn Profile Optimizer UI."""
|
||||
import asyncio
|
||||
asyncio.run(linkedin_profile_optimizer_ui())
|
||||
|
||||
# Create a wrapper for the async company page generator UI
|
||||
def linkedin_company_page_generator_ui_wrapper():
|
||||
"""Wrapper function to call the async LinkedIn Company Page Generator UI."""
|
||||
import asyncio
|
||||
asyncio.run(linkedin_company_page_generator_ui())
|
||||
|
||||
def linkedin_main_menu():
|
||||
"""Main function for the LinkedIn AI Writer."""
|
||||
@@ -161,8 +175,8 @@ def linkedin_main_menu():
|
||||
"description": "Enhance LinkedIn profiles to improve visibility and professional appeal.",
|
||||
"color": "#0A66C2",
|
||||
"category": "Profile & Personal Branding",
|
||||
"function": None,
|
||||
"status": "coming_soon",
|
||||
"function": linkedin_profile_optimizer_ui_wrapper,
|
||||
"status": "active",
|
||||
"features": [
|
||||
"Headline optimization",
|
||||
"About section generation",
|
||||
@@ -182,8 +196,8 @@ def linkedin_main_menu():
|
||||
"description": "Create engaging polls that drive interaction and gather insights.",
|
||||
"color": "#0A66C2",
|
||||
"category": "Profile & Personal Branding",
|
||||
"function": None,
|
||||
"status": "coming_soon",
|
||||
"function": linkedin_poll_generator_ui,
|
||||
"status": "active",
|
||||
"features": [
|
||||
"Question formulation optimization",
|
||||
"Option generation based on topic",
|
||||
@@ -205,8 +219,8 @@ def linkedin_main_menu():
|
||||
"description": "Create content for company pages that builds brand awareness and engagement.",
|
||||
"color": "#0A66C2",
|
||||
"category": "Business & Marketing",
|
||||
"function": None,
|
||||
"status": "coming_soon",
|
||||
"function": linkedin_company_page_generator_ui_wrapper,
|
||||
"status": "active",
|
||||
"features": [
|
||||
"Company culture post generation",
|
||||
"Product/service announcement templates",
|
||||
@@ -516,7 +530,7 @@ def linkedin_main_menu():
|
||||
""", unsafe_allow_html=True)
|
||||
|
||||
# Add a button to access the tool
|
||||
if st.button(f"Use {tool['name']}", key=f"btn_{tool['name']}"):
|
||||
if st.button(f"Use {tool['name']}", key=f"btn_{tool['category']}_{tool['name']}"):
|
||||
# Store the selected tool in session state
|
||||
st.session_state.selected_tool = tool
|
||||
st.rerun()
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
"""
|
||||
LinkedIn Company Page Content Generator Module
|
||||
|
||||
This module provides tools for generating and optimizing content for LinkedIn company pages.
|
||||
It includes features for company profile optimization, content generation, and engagement tracking.
|
||||
"""
|
||||
|
||||
from .linkedin_company_page_generator import LinkedInCompanyPageGenerator
|
||||
from .linkedin_company_page_generator_ui import linkedin_company_page_generator_ui
|
||||
|
||||
__all__ = [
|
||||
'LinkedInCompanyPageGenerator',
|
||||
'linkedin_company_page_generator_ui'
|
||||
]
|
||||
@@ -0,0 +1,322 @@
|
||||
"""
|
||||
LinkedIn Company Page Content Generator
|
||||
|
||||
This module provides the core functionality for generating and optimizing LinkedIn company page content.
|
||||
"""
|
||||
|
||||
import json
|
||||
from typing import Dict, List, Optional, Union
|
||||
from loguru import logger
|
||||
|
||||
from .....gpt_providers.text_generation.main_text_generation import llm_text_gen
|
||||
from .....ai_web_researcher.gpt_online_researcher import do_google_serp_search
|
||||
from .....ai_web_researcher.metaphor_basic_neural_web_search import metaphor_search_articles
|
||||
from .....ai_web_researcher.tavily_ai_search import do_tavily_ai_search
|
||||
from .....gpt_providers.text_to_image_generation.main_generate_image_from_prompt import generate_image
|
||||
|
||||
class LinkedInCompanyPageGenerator:
|
||||
"""Main class for generating LinkedIn company page content."""
|
||||
|
||||
def __init__(self):
|
||||
"""Initialize the LinkedIn Company Page Generator."""
|
||||
self.company_info = {}
|
||||
self.brand_voice = {}
|
||||
self.content_history = []
|
||||
|
||||
async def optimize_company_profile(
|
||||
self,
|
||||
company_name: str,
|
||||
industry: str,
|
||||
target_audience: List[str],
|
||||
brand_voice: str,
|
||||
key_products: List[str],
|
||||
company_size: str,
|
||||
company_description: str
|
||||
) -> Dict[str, str]:
|
||||
"""
|
||||
Optimize the company profile content for LinkedIn.
|
||||
|
||||
Args:
|
||||
company_name: Name of the company
|
||||
industry: Industry sector
|
||||
target_audience: List of target audience segments
|
||||
brand_voice: Desired brand voice/tone
|
||||
key_products: List of key products/services
|
||||
company_size: Size of the company
|
||||
company_description: Current company description
|
||||
|
||||
Returns:
|
||||
Dict containing optimized profile sections
|
||||
"""
|
||||
try:
|
||||
# Store company info for future content generation
|
||||
self.company_info = {
|
||||
"name": company_name,
|
||||
"industry": industry,
|
||||
"target_audience": target_audience,
|
||||
"brand_voice": brand_voice,
|
||||
"key_products": key_products,
|
||||
"size": company_size,
|
||||
"description": company_description
|
||||
}
|
||||
|
||||
# Create the prompt for profile optimization
|
||||
prompt = f"""
|
||||
Optimize the LinkedIn company profile for {company_name}, a {company_size} company in the {industry} industry.
|
||||
|
||||
Current Description:
|
||||
{company_description}
|
||||
|
||||
Key Products/Services:
|
||||
{', '.join(key_products)}
|
||||
|
||||
Target Audience:
|
||||
{', '.join(target_audience)}
|
||||
|
||||
Brand Voice:
|
||||
{brand_voice}
|
||||
|
||||
Generate a comprehensive LinkedIn company profile with the following sections:
|
||||
1. Company Overview
|
||||
2. Mission Statement
|
||||
3. Value Proposition
|
||||
4. Industry Expertise
|
||||
5. Company Culture
|
||||
6. Products/Services Overview
|
||||
|
||||
Ensure the content:
|
||||
- Maintains the specified brand voice
|
||||
- Targets the identified audience segments
|
||||
- Highlights key products/services
|
||||
- Optimizes for LinkedIn's algorithm
|
||||
- Includes relevant industry keywords
|
||||
- Maintains professional tone
|
||||
"""
|
||||
|
||||
# Define the JSON structure for the response
|
||||
json_struct = {
|
||||
"company_overview": "string",
|
||||
"mission_statement": "string",
|
||||
"value_proposition": "string",
|
||||
"industry_expertise": "string",
|
||||
"company_culture": "string",
|
||||
"products_services_overview": "string",
|
||||
"recommended_hashtags": ["string"],
|
||||
"seo_keywords": ["string"]
|
||||
}
|
||||
|
||||
# Generate the optimized profile content
|
||||
response = await llm_text_gen(
|
||||
prompt=prompt,
|
||||
json_struct=json_struct,
|
||||
temperature=0.7
|
||||
)
|
||||
|
||||
return response
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error optimizing company profile: {str(e)}")
|
||||
raise
|
||||
|
||||
async def generate_company_update(
|
||||
self,
|
||||
update_type: str,
|
||||
topic: str,
|
||||
target_audience: Optional[List[str]] = None,
|
||||
include_hashtags: bool = True,
|
||||
include_cta: bool = True
|
||||
) -> Dict[str, str]:
|
||||
"""
|
||||
Generate a company update post for LinkedIn.
|
||||
|
||||
Args:
|
||||
update_type: Type of update (product_launch, milestone, news, etc.)
|
||||
topic: Main topic or focus of the update
|
||||
target_audience: Optional list of target audience segments
|
||||
include_hashtags: Whether to include hashtags
|
||||
include_cta: Whether to include a call-to-action
|
||||
|
||||
Returns:
|
||||
Dict containing the generated update content
|
||||
"""
|
||||
try:
|
||||
# Use company info if target audience not specified
|
||||
if not target_audience:
|
||||
target_audience = self.company_info.get("target_audience", [])
|
||||
|
||||
# Create the prompt for update generation
|
||||
prompt = f"""
|
||||
Generate a LinkedIn company update post for {self.company_info['name']} about {topic}.
|
||||
|
||||
Update Type: {update_type}
|
||||
Target Audience: {', '.join(target_audience)}
|
||||
Brand Voice: {self.company_info['brand_voice']}
|
||||
|
||||
The post should:
|
||||
- Be engaging and professional
|
||||
- Include relevant industry context
|
||||
- Highlight the company's expertise
|
||||
- Drive meaningful engagement
|
||||
- Be optimized for LinkedIn's algorithm
|
||||
"""
|
||||
|
||||
if include_hashtags:
|
||||
prompt += "\n- Include 3-5 relevant hashtags"
|
||||
|
||||
if include_cta:
|
||||
prompt += "\n- Include a clear call-to-action"
|
||||
|
||||
# Define the JSON structure for the response
|
||||
json_struct = {
|
||||
"post_content": "string",
|
||||
"hashtags": ["string"],
|
||||
"call_to_action": "string",
|
||||
"suggested_image_prompt": "string",
|
||||
"engagement_tips": ["string"]
|
||||
}
|
||||
|
||||
# Generate the update content
|
||||
response = await llm_text_gen(
|
||||
prompt=prompt,
|
||||
json_struct=json_struct,
|
||||
temperature=0.7
|
||||
)
|
||||
|
||||
return response
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error generating company update: {str(e)}")
|
||||
raise
|
||||
|
||||
async def generate_employee_spotlight(
|
||||
self,
|
||||
employee_name: str,
|
||||
role: str,
|
||||
achievements: List[str],
|
||||
spotlight_type: str = "general"
|
||||
) -> Dict[str, str]:
|
||||
"""
|
||||
Generate an employee spotlight post for LinkedIn.
|
||||
|
||||
Args:
|
||||
employee_name: Name of the employee
|
||||
role: Employee's role
|
||||
achievements: List of key achievements
|
||||
spotlight_type: Type of spotlight (general, leadership, innovation, etc.)
|
||||
|
||||
Returns:
|
||||
Dict containing the generated spotlight content
|
||||
"""
|
||||
try:
|
||||
# Create the prompt for spotlight generation
|
||||
prompt = f"""
|
||||
Generate a LinkedIn employee spotlight post for {employee_name}, {role} at {self.company_info['name']}.
|
||||
|
||||
Spotlight Type: {spotlight_type}
|
||||
Key Achievements:
|
||||
{chr(10).join(f'- {achievement}' for achievement in achievements)}
|
||||
|
||||
Company Context:
|
||||
Industry: {self.company_info['industry']}
|
||||
Brand Voice: {self.company_info['brand_voice']}
|
||||
|
||||
The post should:
|
||||
- Highlight the employee's contributions
|
||||
- Showcase company culture
|
||||
- Be engaging and professional
|
||||
- Include relevant industry context
|
||||
- Drive meaningful engagement
|
||||
"""
|
||||
|
||||
# Define the JSON structure for the response
|
||||
json_struct = {
|
||||
"spotlight_content": "string",
|
||||
"hashtags": ["string"],
|
||||
"call_to_action": "string",
|
||||
"suggested_image_prompt": "string",
|
||||
"engagement_tips": ["string"]
|
||||
}
|
||||
|
||||
# Generate the spotlight content
|
||||
response = await llm_text_gen(
|
||||
prompt=prompt,
|
||||
json_struct=json_struct,
|
||||
temperature=0.7
|
||||
)
|
||||
|
||||
return response
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error generating employee spotlight: {str(e)}")
|
||||
raise
|
||||
|
||||
async def generate_industry_content(
|
||||
self,
|
||||
content_type: str,
|
||||
topic: str,
|
||||
target_audience: Optional[List[str]] = None
|
||||
) -> Dict[str, str]:
|
||||
"""
|
||||
Generate industry-focused content for LinkedIn.
|
||||
|
||||
Args:
|
||||
content_type: Type of content (insight, trend, analysis, etc.)
|
||||
topic: Main topic or focus
|
||||
target_audience: Optional list of target audience segments
|
||||
|
||||
Returns:
|
||||
Dict containing the generated content
|
||||
"""
|
||||
try:
|
||||
# Use company info if target audience not specified
|
||||
if not target_audience:
|
||||
target_audience = self.company_info.get("target_audience", [])
|
||||
|
||||
# Research industry trends and insights
|
||||
research_results = await do_tavily_ai_search(
|
||||
query=f"{topic} in {self.company_info['industry']} industry trends insights",
|
||||
search_depth="advanced"
|
||||
)
|
||||
|
||||
# Create the prompt for content generation
|
||||
prompt = f"""
|
||||
Generate LinkedIn industry content for {self.company_info['name']} about {topic}.
|
||||
|
||||
Content Type: {content_type}
|
||||
Target Audience: {', '.join(target_audience)}
|
||||
Industry: {self.company_info['industry']}
|
||||
Brand Voice: {self.company_info['brand_voice']}
|
||||
|
||||
Research Context:
|
||||
{research_results}
|
||||
|
||||
The content should:
|
||||
- Provide valuable industry insights
|
||||
- Position the company as a thought leader
|
||||
- Be data-driven and professional
|
||||
- Drive meaningful engagement
|
||||
- Include relevant examples and context
|
||||
"""
|
||||
|
||||
# Define the JSON structure for the response
|
||||
json_struct = {
|
||||
"content": "string",
|
||||
"hashtags": ["string"],
|
||||
"call_to_action": "string",
|
||||
"suggested_image_prompt": "string",
|
||||
"engagement_tips": ["string"],
|
||||
"key_insights": ["string"]
|
||||
}
|
||||
|
||||
# Generate the industry content
|
||||
response = await llm_text_gen(
|
||||
prompt=prompt,
|
||||
json_struct=json_struct,
|
||||
temperature=0.7
|
||||
)
|
||||
|
||||
return response
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error generating industry content: {str(e)}")
|
||||
raise
|
||||
@@ -0,0 +1,321 @@
|
||||
"""
|
||||
LinkedIn Company Page Generator UI
|
||||
|
||||
This module provides the Streamlit UI for the LinkedIn Company Page Generator.
|
||||
"""
|
||||
|
||||
import streamlit as st
|
||||
import json
|
||||
from typing import Dict, List, Optional
|
||||
from loguru import logger
|
||||
|
||||
from .linkedin_company_page_generator import LinkedInCompanyPageGenerator
|
||||
|
||||
async def linkedin_company_page_generator_ui():
|
||||
"""Main UI function for the LinkedIn Company Page Generator."""
|
||||
|
||||
st.title("🏢 LinkedIn Company Page Content Generator")
|
||||
st.markdown("""
|
||||
Create engaging and professional content for your LinkedIn company page.
|
||||
This tool helps you generate optimized company profiles, updates, employee spotlights, and industry content.
|
||||
""")
|
||||
|
||||
# Initialize the generator
|
||||
generator = LinkedInCompanyPageGenerator()
|
||||
|
||||
# Create tabs for different content types
|
||||
tab1, tab2, tab3, tab4 = st.tabs([
|
||||
"Company Profile",
|
||||
"Company Updates",
|
||||
"Employee Spotlights",
|
||||
"Industry Content"
|
||||
])
|
||||
|
||||
# Company Profile Tab
|
||||
with tab1:
|
||||
st.header("Optimize Your Company Profile")
|
||||
st.markdown("Generate an optimized LinkedIn company profile that highlights your brand and drives engagement.")
|
||||
|
||||
# Company Information Form
|
||||
with st.form("company_profile_form"):
|
||||
company_name = st.text_input("Company Name", placeholder="Enter your company name")
|
||||
industry = st.text_input("Industry", placeholder="e.g., Technology, Healthcare, Finance")
|
||||
company_size = st.selectbox(
|
||||
"Company Size",
|
||||
["1-10", "11-50", "51-200", "201-500", "501-1000", "1000+"]
|
||||
)
|
||||
target_audience = st.multiselect(
|
||||
"Target Audience",
|
||||
["Job Seekers", "Customers", "Partners", "Investors", "Industry Professionals", "Media"],
|
||||
default=["Job Seekers", "Customers"]
|
||||
)
|
||||
brand_voice = st.selectbox(
|
||||
"Brand Voice",
|
||||
["Professional", "Innovative", "Friendly", "Authoritative", "Casual", "Technical"]
|
||||
)
|
||||
key_products = st.text_area(
|
||||
"Key Products/Services",
|
||||
placeholder="Enter your key products or services, one per line"
|
||||
).split("\n")
|
||||
company_description = st.text_area(
|
||||
"Current Company Description",
|
||||
placeholder="Enter your current company description"
|
||||
)
|
||||
|
||||
submit_profile = st.form_submit_button("Generate Optimized Profile")
|
||||
|
||||
if submit_profile:
|
||||
if not all([company_name, industry, target_audience, brand_voice, key_products, company_description]):
|
||||
st.error("Please fill in all required fields.")
|
||||
else:
|
||||
with st.spinner("Generating optimized company profile..."):
|
||||
try:
|
||||
profile_content = await generator.optimize_company_profile(
|
||||
company_name=company_name,
|
||||
industry=industry,
|
||||
target_audience=target_audience,
|
||||
brand_voice=brand_voice,
|
||||
key_products=key_products,
|
||||
company_size=company_size,
|
||||
company_description=company_description
|
||||
)
|
||||
|
||||
# Display the results
|
||||
st.success("Profile generated successfully!")
|
||||
|
||||
# Company Overview
|
||||
st.subheader("Company Overview")
|
||||
st.write(profile_content["company_overview"])
|
||||
|
||||
# Mission Statement
|
||||
st.subheader("Mission Statement")
|
||||
st.write(profile_content["mission_statement"])
|
||||
|
||||
# Value Proposition
|
||||
st.subheader("Value Proposition")
|
||||
st.write(profile_content["value_proposition"])
|
||||
|
||||
# Industry Expertise
|
||||
st.subheader("Industry Expertise")
|
||||
st.write(profile_content["industry_expertise"])
|
||||
|
||||
# Company Culture
|
||||
st.subheader("Company Culture")
|
||||
st.write(profile_content["company_culture"])
|
||||
|
||||
# Products/Services Overview
|
||||
st.subheader("Products/Services Overview")
|
||||
st.write(profile_content["products_services_overview"])
|
||||
|
||||
# SEO Keywords
|
||||
st.subheader("Recommended SEO Keywords")
|
||||
st.write(", ".join(profile_content["seo_keywords"]))
|
||||
|
||||
# Hashtags
|
||||
st.subheader("Recommended Hashtags")
|
||||
st.write(" ".join([f"#{tag}" for tag in profile_content["recommended_hashtags"]]))
|
||||
|
||||
except Exception as e:
|
||||
st.error(f"Error generating profile: {str(e)}")
|
||||
|
||||
# Company Updates Tab
|
||||
with tab2:
|
||||
st.header("Generate Company Updates")
|
||||
st.markdown("Create engaging company updates for your LinkedIn page.")
|
||||
|
||||
# Update Generation Form
|
||||
with st.form("company_update_form"):
|
||||
update_type = st.selectbox(
|
||||
"Update Type",
|
||||
["Product Launch", "Company Milestone", "Industry News", "Company News", "Event Announcement"]
|
||||
)
|
||||
topic = st.text_input("Topic", placeholder="Enter the main topic of your update")
|
||||
target_audience = st.multiselect(
|
||||
"Target Audience",
|
||||
["Job Seekers", "Customers", "Partners", "Investors", "Industry Professionals", "Media"],
|
||||
default=["Customers", "Industry Professionals"]
|
||||
)
|
||||
include_hashtags = st.checkbox("Include Hashtags", value=True)
|
||||
include_cta = st.checkbox("Include Call-to-Action", value=True)
|
||||
|
||||
submit_update = st.form_submit_button("Generate Update")
|
||||
|
||||
if submit_update:
|
||||
if not topic:
|
||||
st.error("Please enter a topic for your update.")
|
||||
else:
|
||||
with st.spinner("Generating company update..."):
|
||||
try:
|
||||
update_content = await generator.generate_company_update(
|
||||
update_type=update_type,
|
||||
topic=topic,
|
||||
target_audience=target_audience,
|
||||
include_hashtags=include_hashtags,
|
||||
include_cta=include_cta
|
||||
)
|
||||
|
||||
# Display the results
|
||||
st.success("Update generated successfully!")
|
||||
|
||||
# Post Content
|
||||
st.subheader("Generated Post")
|
||||
st.write(update_content["post_content"])
|
||||
|
||||
# Hashtags
|
||||
if include_hashtags:
|
||||
st.subheader("Recommended Hashtags")
|
||||
st.write(" ".join([f"#{tag}" for tag in update_content["hashtags"]]))
|
||||
|
||||
# Call-to-Action
|
||||
if include_cta:
|
||||
st.subheader("Call-to-Action")
|
||||
st.write(update_content["call_to_action"])
|
||||
|
||||
# Engagement Tips
|
||||
st.subheader("Engagement Tips")
|
||||
for tip in update_content["engagement_tips"]:
|
||||
st.write(f"• {tip}")
|
||||
|
||||
# Image Prompt
|
||||
st.subheader("Suggested Image Prompt")
|
||||
st.write(update_content["suggested_image_prompt"])
|
||||
|
||||
except Exception as e:
|
||||
st.error(f"Error generating update: {str(e)}")
|
||||
|
||||
# Employee Spotlights Tab
|
||||
with tab3:
|
||||
st.header("Generate Employee Spotlights")
|
||||
st.markdown("Create engaging employee spotlight posts to showcase your team.")
|
||||
|
||||
# Spotlight Generation Form
|
||||
with st.form("employee_spotlight_form"):
|
||||
employee_name = st.text_input("Employee Name", placeholder="Enter employee's name")
|
||||
role = st.text_input("Role", placeholder="Enter employee's role")
|
||||
achievements = st.text_area(
|
||||
"Key Achievements",
|
||||
placeholder="Enter key achievements, one per line"
|
||||
).split("\n")
|
||||
spotlight_type = st.selectbox(
|
||||
"Spotlight Type",
|
||||
["General", "Leadership", "Innovation", "Team Player", "Career Growth"]
|
||||
)
|
||||
|
||||
submit_spotlight = st.form_submit_button("Generate Spotlight")
|
||||
|
||||
if submit_spotlight:
|
||||
if not all([employee_name, role, achievements]):
|
||||
st.error("Please fill in all required fields.")
|
||||
else:
|
||||
with st.spinner("Generating employee spotlight..."):
|
||||
try:
|
||||
spotlight_content = await generator.generate_employee_spotlight(
|
||||
employee_name=employee_name,
|
||||
role=role,
|
||||
achievements=achievements,
|
||||
spotlight_type=spotlight_type
|
||||
)
|
||||
|
||||
# Display the results
|
||||
st.success("Spotlight generated successfully!")
|
||||
|
||||
# Spotlight Content
|
||||
st.subheader("Generated Spotlight")
|
||||
st.write(spotlight_content["spotlight_content"])
|
||||
|
||||
# Hashtags
|
||||
st.subheader("Recommended Hashtags")
|
||||
st.write(" ".join([f"#{tag}" for tag in spotlight_content["hashtags"]]))
|
||||
|
||||
# Call-to-Action
|
||||
st.subheader("Call-to-Action")
|
||||
st.write(spotlight_content["call_to_action"])
|
||||
|
||||
# Engagement Tips
|
||||
st.subheader("Engagement Tips")
|
||||
for tip in spotlight_content["engagement_tips"]:
|
||||
st.write(f"• {tip}")
|
||||
|
||||
# Image Prompt
|
||||
st.subheader("Suggested Image Prompt")
|
||||
st.write(spotlight_content["suggested_image_prompt"])
|
||||
|
||||
except Exception as e:
|
||||
st.error(f"Error generating spotlight: {str(e)}")
|
||||
|
||||
# Industry Content Tab
|
||||
with tab4:
|
||||
st.header("Generate Industry Content")
|
||||
st.markdown("Create thought leadership content to position your company as an industry expert.")
|
||||
|
||||
# Industry Content Generation Form
|
||||
with st.form("industry_content_form"):
|
||||
content_type = st.selectbox(
|
||||
"Content Type",
|
||||
["Industry Insight", "Trend Analysis", "Best Practices", "Case Study", "Market Update"]
|
||||
)
|
||||
topic = st.text_input("Topic", placeholder="Enter the main topic of your content")
|
||||
target_audience = st.multiselect(
|
||||
"Target Audience",
|
||||
["Job Seekers", "Customers", "Partners", "Investors", "Industry Professionals", "Media"],
|
||||
default=["Industry Professionals", "Customers"]
|
||||
)
|
||||
|
||||
submit_content = st.form_submit_button("Generate Content")
|
||||
|
||||
if submit_content:
|
||||
if not topic:
|
||||
st.error("Please enter a topic for your content.")
|
||||
else:
|
||||
with st.spinner("Generating industry content..."):
|
||||
try:
|
||||
content = await generator.generate_industry_content(
|
||||
content_type=content_type,
|
||||
topic=topic,
|
||||
target_audience=target_audience
|
||||
)
|
||||
|
||||
# Display the results
|
||||
st.success("Content generated successfully!")
|
||||
|
||||
# Content
|
||||
st.subheader("Generated Content")
|
||||
st.write(content["content"])
|
||||
|
||||
# Key Insights
|
||||
st.subheader("Key Insights")
|
||||
for insight in content["key_insights"]:
|
||||
st.write(f"• {insight}")
|
||||
|
||||
# Hashtags
|
||||
st.subheader("Recommended Hashtags")
|
||||
st.write(" ".join([f"#{tag}" for tag in content["hashtags"]]))
|
||||
|
||||
# Call-to-Action
|
||||
st.subheader("Call-to-Action")
|
||||
st.write(content["call_to_action"])
|
||||
|
||||
# Engagement Tips
|
||||
st.subheader("Engagement Tips")
|
||||
for tip in content["engagement_tips"]:
|
||||
st.write(f"• {tip}")
|
||||
|
||||
# Image Prompt
|
||||
st.subheader("Suggested Image Prompt")
|
||||
st.write(content["suggested_image_prompt"])
|
||||
|
||||
except Exception as e:
|
||||
st.error(f"Error generating content: {str(e)}")
|
||||
|
||||
# Add a footer with tips
|
||||
st.markdown("---")
|
||||
st.markdown("""
|
||||
### Tips for Effective LinkedIn Company Page Content:
|
||||
|
||||
- **Consistency**: Maintain a consistent posting schedule and brand voice
|
||||
- **Engagement**: Encourage comments and discussions on your posts
|
||||
- **Visuals**: Use high-quality images and videos to increase engagement
|
||||
- **Hashtags**: Use relevant industry hashtags to increase visibility
|
||||
- **Analytics**: Monitor your content performance and adjust your strategy
|
||||
- **Employee Advocacy**: Encourage employees to share and engage with company content
|
||||
""")
|
||||
@@ -31,31 +31,32 @@ async def linkedin_profile_optimizer_ui():
|
||||
st.info("Upload your profile information for a comprehensive analysis")
|
||||
|
||||
# Profile Data Input
|
||||
with st.expander("Enter Profile Information", expanded=True):
|
||||
profile_data = {
|
||||
"headline": st.text_input("Current Headline"),
|
||||
"about": st.text_area("About Section"),
|
||||
"industry": st.text_input("Industry"),
|
||||
"current_role": st.text_input("Current Role"),
|
||||
"experience": [],
|
||||
"skills": st.text_area("Current Skills (one per line)").split("\n"),
|
||||
"education": st.text_area("Education (one per line)").split("\n")
|
||||
}
|
||||
|
||||
# Experience Input
|
||||
st.subheader("Work Experience")
|
||||
num_experiences = st.number_input("Number of experiences to add", min_value=0, max_value=10, value=1)
|
||||
|
||||
for i in range(num_experiences):
|
||||
with st.expander(f"Experience {i+1}"):
|
||||
exp = {
|
||||
"role": st.text_input(f"Role {i+1}"),
|
||||
"company": st.text_input(f"Company {i+1}"),
|
||||
"description": st.text_area(f"Description {i+1}")
|
||||
}
|
||||
profile_data["experience"].append(exp)
|
||||
st.subheader("Enter Profile Information")
|
||||
profile_data = {
|
||||
"headline": st.text_input("Current Headline", key="profile_headline"),
|
||||
"about": st.text_area("About Section", key="profile_about"),
|
||||
"industry": st.text_input("Industry", key="profile_industry"),
|
||||
"current_role": st.text_input("Current Role", key="profile_role"),
|
||||
"experience": [],
|
||||
"skills": st.text_area("Current Skills (one per line)", key="profile_skills").split("\n"),
|
||||
"education": st.text_area("Education (one per line)", key="profile_education").split("\n")
|
||||
}
|
||||
|
||||
if st.button("Analyze Profile"):
|
||||
# Experience Input
|
||||
st.subheader("Work Experience")
|
||||
num_experiences = st.number_input("Number of experiences to add", min_value=0, max_value=10, value=1, key="profile_num_exp")
|
||||
|
||||
for i in range(num_experiences):
|
||||
st.markdown(f"**Experience {i+1}**")
|
||||
exp = {
|
||||
"role": st.text_input(f"Role {i+1}", key=f"profile_role_{i}"),
|
||||
"company": st.text_input(f"Company {i+1}", key=f"profile_company_{i}"),
|
||||
"description": st.text_area(f"Description {i+1}", key=f"profile_desc_{i}")
|
||||
}
|
||||
profile_data["experience"].append(exp)
|
||||
st.divider()
|
||||
|
||||
if st.button("Analyze Profile", key="profile_analyze_btn"):
|
||||
with st.spinner("Analyzing your profile..."):
|
||||
analysis = await optimizer.analyze_profile_strength(profile_data)
|
||||
|
||||
@@ -83,11 +84,11 @@ async def linkedin_profile_optimizer_ui():
|
||||
st.header("Headline Optimizer")
|
||||
st.info("Optimize your headline for better visibility and impact")
|
||||
|
||||
current_headline = st.text_input("Current Headline")
|
||||
industry = st.text_input("Industry")
|
||||
role = st.text_input("Current/Target Role")
|
||||
current_headline = st.text_input("Current Headline", key="headline_current")
|
||||
industry = st.text_input("Industry", key="headline_industry")
|
||||
role = st.text_input("Current/Target Role", key="headline_role")
|
||||
|
||||
if st.button("Optimize Headline"):
|
||||
if st.button("Optimize Headline", key="headline_optimize_btn"):
|
||||
with st.spinner("Generating optimized headline..."):
|
||||
headline_optimization = await optimizer.optimize_headline(
|
||||
current_headline,
|
||||
@@ -110,11 +111,11 @@ async def linkedin_profile_optimizer_ui():
|
||||
st.header("About Section Generator")
|
||||
st.info("Create an engaging and professional About section")
|
||||
|
||||
current_about = st.text_area("Current About Section")
|
||||
achievements = st.text_area("Key Achievements (one per line)").split("\n")
|
||||
target_audience = st.text_input("Target Audience")
|
||||
current_about = st.text_area("Current About Section", key="about_current")
|
||||
achievements = st.text_area("Key Achievements (one per line)", key="about_achievements").split("\n")
|
||||
target_audience = st.text_input("Target Audience", key="about_audience")
|
||||
|
||||
if st.button("Generate About Section"):
|
||||
if st.button("Generate About Section", key="about_generate_btn"):
|
||||
with st.spinner("Generating optimized About section..."):
|
||||
about_optimization = await optimizer.generate_about_section(
|
||||
current_about,
|
||||
@@ -128,8 +129,9 @@ async def linkedin_profile_optimizer_ui():
|
||||
|
||||
st.subheader("Section Structure")
|
||||
for section, explanation in about_optimization['structure_explanation'].items():
|
||||
with st.expander(section):
|
||||
st.write(explanation)
|
||||
st.markdown(f"**{section}**")
|
||||
st.write(explanation)
|
||||
st.divider()
|
||||
|
||||
st.subheader("Impact Factors")
|
||||
for factor in about_optimization['impact_factors']:
|
||||
@@ -141,44 +143,47 @@ async def linkedin_profile_optimizer_ui():
|
||||
st.info("Enhance your work experience descriptions for maximum impact")
|
||||
|
||||
experiences = []
|
||||
num_exp = st.number_input("Number of experiences to enhance", min_value=1, max_value=10, value=1)
|
||||
num_exp = st.number_input("Number of experiences to enhance", min_value=1, max_value=10, value=1, key="exp_num")
|
||||
|
||||
for i in range(num_exp):
|
||||
with st.expander(f"Experience {i+1}"):
|
||||
exp = {
|
||||
"role": st.text_input(f"Role {i+1}"),
|
||||
"company": st.text_input(f"Company {i+1}"),
|
||||
"description": st.text_area(f"Current Description {i+1}")
|
||||
}
|
||||
experiences.append(exp)
|
||||
st.markdown(f"**Experience {i+1}**")
|
||||
exp = {
|
||||
"role": st.text_input(f"Role {i+1}", key=f"exp_role_{i}"),
|
||||
"company": st.text_input(f"Company {i+1}", key=f"exp_company_{i}"),
|
||||
"description": st.text_area(f"Current Description {i+1}", key=f"exp_desc_{i}")
|
||||
}
|
||||
experiences.append(exp)
|
||||
st.divider()
|
||||
|
||||
if st.button("Enhance Experiences"):
|
||||
if st.button("Enhance Experiences", key="exp_enhance_btn"):
|
||||
with st.spinner("Enhancing experience descriptions..."):
|
||||
enhanced_experiences = await optimizer.enhance_experience_descriptions(experiences)
|
||||
|
||||
for i, exp in enumerate(enhanced_experiences):
|
||||
with st.expander(f"Enhanced Experience {i+1}"):
|
||||
st.subheader(f"{exp['role']} at {exp['company']}")
|
||||
st.markdown(exp['enhanced_description'])
|
||||
|
||||
st.subheader("Key Achievements")
|
||||
for achievement in exp['achievements']:
|
||||
st.success(achievement)
|
||||
|
||||
st.subheader("Keywords Used")
|
||||
for keyword in exp['keywords']:
|
||||
st.info(keyword)
|
||||
st.markdown(f"**Enhanced Experience {i+1}**")
|
||||
st.subheader(f"{exp['role']} at {exp['company']}")
|
||||
st.markdown(exp['enhanced_description'])
|
||||
|
||||
st.subheader("Key Achievements")
|
||||
for achievement in exp['achievements']:
|
||||
st.success(achievement)
|
||||
|
||||
st.subheader("Keywords Used")
|
||||
for keyword in exp['keywords']:
|
||||
st.info(keyword)
|
||||
|
||||
st.divider()
|
||||
|
||||
# Skills Recommender Tab
|
||||
with tabs[4]:
|
||||
st.header("Skills Recommender")
|
||||
st.info("Get personalized skill recommendations for your profile")
|
||||
|
||||
current_skills = st.text_area("Current Skills (one per line)").split("\n")
|
||||
industry = st.text_input("Industry (for skills)")
|
||||
role = st.text_input("Role (for skills)")
|
||||
current_skills = st.text_area("Current Skills (one per line)", key="skills_current").split("\n")
|
||||
industry = st.text_input("Industry (for skills)", key="skills_industry")
|
||||
role = st.text_input("Role (for skills)", key="skills_role")
|
||||
|
||||
if st.button("Get Skill Recommendations"):
|
||||
if st.button("Get Skill Recommendations", key="skills_recommend_btn"):
|
||||
with st.spinner("Analyzing and recommending skills..."):
|
||||
skill_recommendations = await optimizer.recommend_skills(
|
||||
current_skills,
|
||||
@@ -204,6 +209,7 @@ async def linkedin_profile_optimizer_ui():
|
||||
|
||||
st.subheader("Skill Categories")
|
||||
for category, skills in skill_recommendations['skill_categories'].items():
|
||||
with st.expander(category):
|
||||
for skill in skills:
|
||||
st.write(f"- {skill}")
|
||||
st.markdown(f"**{category}**")
|
||||
for skill in skills:
|
||||
st.write(f"- {skill}")
|
||||
st.divider()
|
||||
Reference in New Issue
Block a user