Files
ALwrity/lib/ai_seo_tools/content_title_generator.py

161 lines
6.0 KiB
Python

"""Content title generator module."""
import os
import json
import streamlit as st
from tenacity import (
retry,
stop_after_attempt,
wait_random_exponential,
)
from loguru import logger
from typing import Dict, Any, List, Optional
import asyncio
import sys
from lib.gpt_providers.text_generation.main_text_generation import llm_text_gen
from lib.utils.website_analyzer.analyzer import WebsiteAnalyzer
# Configure logger
logger.remove() # Remove default handler
logger.add(
"logs/content_title_generator.log",
rotation="50 MB",
retention="10 days",
level="DEBUG",
format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}"
)
logger.add(
sys.stdout,
level="INFO",
format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{message}</cyan>"
)
# Ensure logs directory exists
os.makedirs("logs", exist_ok=True)
def ai_title_generator(url: str) -> Dict[str, Any]:
"""
Generate SEO-optimized titles using AI.
Args:
url: The URL to analyze
Returns:
Dictionary containing title suggestions and analysis
"""
try:
# Initialize analyzer
analyzer = WebsiteAnalyzer()
# Analyze website
analysis = analyzer.analyze_website(url)
if not analysis.get('success', False):
return {
'error': analysis.get('error', 'Unknown error in analysis'),
'patterns': {},
'suggestions': []
}
# Extract content and meta information
content_info = analysis['data']['analysis']['content_info']
seo_info = analysis['data']['analysis']['seo_info']
# Generate title suggestions using AI
prompt = f"""Based on the following website content and SEO analysis, generate 5 SEO-optimized title suggestions:
Content Analysis:
- Word Count: {content_info.get('word_count', 0)}
- Heading Structure: {content_info.get('heading_structure', {})}
SEO Analysis:
- Meta Title: {seo_info.get('meta_tags', {}).get('title', {}).get('value', '')}
- Meta Description: {seo_info.get('meta_tags', {}).get('description', {}).get('value', '')}
- Keywords: {seo_info.get('meta_tags', {}).get('keywords', {}).get('value', '')}
Generate 5 title suggestions that are:
1. SEO-optimized
2. Engaging and click-worthy
3. Between 50-60 characters
4. Include relevant keywords
5. Follow best practices for title optimization
Format the response as JSON with 'suggestions' and 'patterns' keys."""
# Get AI suggestions
suggestions = llm_text_gen(
prompt=prompt,
system_prompt="You are an SEO expert specializing in title optimization.",
response_format="json_object"
)
if not suggestions:
return {
'error': 'Failed to generate title suggestions',
'patterns': {},
'suggestions': []
}
return {
'patterns': suggestions.get('patterns', {}),
'suggestions': suggestions.get('suggestions', [])
}
except Exception as e:
error_msg = f"Error generating title suggestions: {str(e)}"
logger.error(error_msg, exc_info=True)
return {
'error': error_msg,
'patterns': {},
'suggestions': []
}
@retry(stop=stop_after_attempt(3), wait=wait_random_exponential(min=1, max=4))
def generate_blog_titles(input_blog_keywords, input_blog_content, input_title_type, input_title_intent, input_language):
""" Generate SEO optimized blog titles using AI """
if input_blog_content and input_blog_keywords:
prompt = f"""As a SEO expert, I will provide you with main 'blog keywords' and 'blog content'.
Your task is to write 5 SEO optimized blog titles from the given blog keywords and content.
Follow the below guidelines for generating the blog titles:
1. Follow all best practices for SEO optimized blog titles.
2. Optimize your response around the given keywords and content.
3. Optimize your response for web search intent {input_title_intent}.
4. Optimize your response for blog type {input_title_type}.
5. The blog titles should be in {input_language} language.
Blog keywords: '{input_blog_keywords}'
Blog content: '{input_blog_content}'
"""
elif input_blog_keywords and not input_blog_content:
prompt = f"""As a SEO expert, I will provide you with the main 'keywords' of a blog.
Your task is to write 5 SEO optimized blog titles from the given blog keywords.
Follow the below guidelines for generating the blog titles:
1. Follow all best practices for SEO optimized blog titles.
2. Optimize your response around the given keywords.
3. Optimize your response for web search intent {input_title_intent}.
4. Optimize your response for blog type {input_title_type}.
5. The blog titles should be in {input_language} language.
Blog keywords: '{input_blog_keywords}'
"""
elif input_blog_content and not input_blog_keywords:
prompt = f"""As a SEO expert, I will provide you with the 'blog content'.
Your task is to write 5 SEO optimized blog titles from the given blog content.
Follow the below guidelines for generating the blog titles:
1. Follow all best practices for SEO optimized blog titles.
2. Optimize your response around the given content.
3. Optimize your response for web search intent {input_title_intent}.
4. Optimize your response for blog type {input_title_type}.
5. The blog titles should be in {input_language} language.
Blog content: '{input_blog_content}'
"""
try:
response = llm_text_gen(prompt)
return response
except Exception as err:
st.error(f"Exit: Failed to get response from LLM: {err}")