929 lines
38 KiB
Python
929 lines
38 KiB
Python
"""
|
|
AI Service Manager
|
|
Centralized AI service management for content planning system.
|
|
"""
|
|
|
|
from typing import Dict, Any, List, Optional
|
|
from loguru import logger
|
|
from datetime import datetime
|
|
import json
|
|
import asyncio
|
|
from dataclasses import dataclass
|
|
from enum import Enum
|
|
|
|
# Import AI providers
|
|
from llm_providers.main_text_generation import llm_text_gen
|
|
from llm_providers.gemini_provider import gemini_structured_json_response
|
|
|
|
class AIServiceType(Enum):
|
|
"""AI service types for monitoring."""
|
|
CONTENT_GAP_ANALYSIS = "content_gap_analysis"
|
|
MARKET_POSITION_ANALYSIS = "market_position_analysis"
|
|
KEYWORD_ANALYSIS = "keyword_analysis"
|
|
PERFORMANCE_PREDICTION = "performance_prediction"
|
|
STRATEGIC_INTELLIGENCE = "strategic_intelligence"
|
|
CONTENT_QUALITY_ASSESSMENT = "content_quality_assessment"
|
|
CONTENT_SCHEDULE_GENERATION = "content_schedule_generation"
|
|
|
|
@dataclass
|
|
class AIServiceMetrics:
|
|
"""Metrics for AI service performance."""
|
|
service_type: AIServiceType
|
|
response_time: float
|
|
success: bool
|
|
error_message: Optional[str] = None
|
|
timestamp: datetime = None
|
|
|
|
def __post_init__(self):
|
|
if self.timestamp is None:
|
|
self.timestamp = datetime.utcnow()
|
|
|
|
class AIServiceManager:
|
|
"""Centralized AI service management for content planning system."""
|
|
|
|
def __init__(self):
|
|
"""Initialize AI service manager."""
|
|
self.logger = logger
|
|
self.metrics: List[AIServiceMetrics] = []
|
|
self.prompts = self._load_centralized_prompts()
|
|
self.schemas = self._load_centralized_schemas()
|
|
self.config = self._load_ai_configuration()
|
|
|
|
logger.info("AIServiceManager initialized")
|
|
|
|
def _load_ai_configuration(self) -> Dict[str, Any]:
|
|
"""Load AI configuration settings."""
|
|
return {
|
|
'max_retries': 3,
|
|
'timeout_seconds': 30,
|
|
'temperature': 0.7,
|
|
'max_tokens': 2048,
|
|
'enable_caching': True,
|
|
'cache_duration_minutes': 60,
|
|
'performance_monitoring': True,
|
|
'fallback_enabled': True
|
|
}
|
|
|
|
def _load_centralized_prompts(self) -> Dict[str, str]:
|
|
"""Load centralized AI prompts."""
|
|
return {
|
|
'content_gap_analysis': """
|
|
As an expert SEO content strategist with 15+ years of experience in content marketing and competitive analysis, analyze this comprehensive content gap analysis data and provide actionable strategic insights:
|
|
|
|
TARGET ANALYSIS:
|
|
- Website: {target_url}
|
|
- Industry: {industry}
|
|
- SERP Opportunities: {serp_opportunities} keywords not ranking
|
|
- Keyword Expansion: {expanded_keywords_count} additional keywords identified
|
|
- Competitors Analyzed: {competitors_analyzed} websites
|
|
- Content Quality Score: {content_quality_score}/10
|
|
- Market Competition Level: {competition_level}
|
|
|
|
DOMINANT CONTENT THEMES:
|
|
{dominant_themes}
|
|
|
|
COMPETITIVE LANDSCAPE:
|
|
{competitive_landscape}
|
|
|
|
PROVIDE COMPREHENSIVE ANALYSIS:
|
|
1. Strategic Content Gap Analysis (identify 3-5 major gaps with impact assessment)
|
|
2. Priority Content Recommendations (top 5 with ROI estimates)
|
|
3. Keyword Strategy Insights (trending, seasonal, long-tail opportunities)
|
|
4. Competitive Positioning Advice (differentiation strategies)
|
|
5. Content Format Recommendations (video, interactive, comprehensive guides)
|
|
6. Technical SEO Opportunities (structured data, schema markup)
|
|
7. Implementation Timeline (30/60/90 days with milestones)
|
|
8. Risk Assessment and Mitigation Strategies
|
|
9. Success Metrics and KPIs
|
|
10. Resource Allocation Recommendations
|
|
|
|
Consider user intent, search behavior patterns, and content consumption trends in your analysis.
|
|
Format as structured JSON with clear, actionable recommendations and confidence scores.
|
|
""",
|
|
|
|
'market_position_analysis': """
|
|
As a senior competitive intelligence analyst specializing in digital marketing and content strategy, analyze the market position of competitors in the {industry} industry:
|
|
|
|
COMPETITOR ANALYSES:
|
|
{competitor_analyses}
|
|
|
|
MARKET CONTEXT:
|
|
- Industry: {industry}
|
|
- Market Size: {market_size}
|
|
- Growth Rate: {growth_rate}
|
|
- Key Trends: {key_trends}
|
|
|
|
PROVIDE COMPREHENSIVE MARKET ANALYSIS:
|
|
1. Market Leader Identification (with reasoning)
|
|
2. Content Leader Analysis (content strategy assessment)
|
|
3. Quality Leader Assessment (content quality metrics)
|
|
4. Market Gaps Identification (3-5 major gaps)
|
|
5. Opportunities Analysis (high-impact opportunities)
|
|
6. Competitive Advantages (unique positioning)
|
|
7. Strategic Positioning Recommendations (differentiation)
|
|
8. Content Strategy Insights (format, frequency, quality)
|
|
9. Innovation Opportunities (emerging trends)
|
|
10. Risk Assessment (competitive threats)
|
|
|
|
Include market share estimates, competitive positioning matrix, and strategic recommendations with implementation timeline.
|
|
Format as structured JSON with detailed analysis and confidence levels.
|
|
""",
|
|
|
|
'keyword_analysis': """
|
|
As an expert keyword research specialist with deep understanding of search algorithms and user behavior, analyze keyword opportunities for {industry} industry:
|
|
|
|
KEYWORD DATA:
|
|
- Target Keywords: {target_keywords}
|
|
- Industry Context: {industry}
|
|
- Search Volume Data: {search_volume_data}
|
|
- Competition Analysis: {competition_analysis}
|
|
- Trend Analysis: {trend_analysis}
|
|
|
|
PROVIDE COMPREHENSIVE KEYWORD ANALYSIS:
|
|
1. Search Volume Estimates (with confidence intervals)
|
|
2. Competition Level Assessment (difficulty scoring)
|
|
3. Trend Analysis (seasonal, cyclical, emerging)
|
|
4. Opportunity Scoring (ROI potential)
|
|
5. Content Format Recommendations (based on intent)
|
|
6. Keyword Clustering (semantic relationships)
|
|
7. Long-tail Opportunities (specific, low-competition)
|
|
8. Seasonal Variations (trending patterns)
|
|
9. Search Intent Classification (informational, commercial, navigational, transactional)
|
|
10. Implementation Priority (quick wins vs long-term)
|
|
|
|
Consider search intent, user journey stages, and conversion potential in your analysis.
|
|
Format as structured JSON with detailed metrics and strategic recommendations.
|
|
""",
|
|
|
|
'performance_prediction': """
|
|
As a data-driven content strategist with expertise in predictive analytics and content performance optimization, predict content performance based on comprehensive analysis:
|
|
|
|
CONTENT DATA:
|
|
{content_data}
|
|
|
|
MARKET CONTEXT:
|
|
- Industry: {industry}
|
|
- Target Audience: {target_audience}
|
|
- Competition Level: {competition_level}
|
|
- Content Quality Score: {quality_score}
|
|
|
|
PROVIDE DETAILED PERFORMANCE PREDICTIONS:
|
|
1. Traffic Predictions (monthly, peak, growth rate)
|
|
2. Engagement Predictions (time on page, bounce rate, social shares)
|
|
3. Ranking Predictions (position, timeline, competition)
|
|
4. Conversion Predictions (CTR, conversion rate, leads)
|
|
5. Revenue Impact (estimated revenue, ROI)
|
|
6. Risk Factors (content saturation, algorithm changes)
|
|
7. Success Factors (quality indicators, optimization opportunities)
|
|
8. Competitive Response (market reaction)
|
|
9. Seasonal Variations (performance fluctuations)
|
|
10. Long-term Sustainability (content lifecycle)
|
|
|
|
Include confidence intervals, risk assessments, and optimization recommendations.
|
|
Format as structured JSON with detailed predictions and actionable insights.
|
|
""",
|
|
|
|
'strategic_intelligence': """
|
|
As a senior content strategy consultant with expertise in digital marketing, competitive intelligence, and strategic planning, generate comprehensive strategic insights:
|
|
|
|
ANALYSIS DATA:
|
|
{analysis_data}
|
|
|
|
STRATEGIC CONTEXT:
|
|
- Business Objectives: {business_objectives}
|
|
- Target Audience: {target_audience}
|
|
- Competitive Landscape: {competitive_landscape}
|
|
- Market Opportunities: {market_opportunities}
|
|
|
|
PROVIDE STRATEGIC INTELLIGENCE:
|
|
1. Content Strategy Recommendations (pillar content, topic clusters)
|
|
2. Competitive Positioning Advice (differentiation strategies)
|
|
3. Content Optimization Suggestions (quality, format, frequency)
|
|
4. Innovation Opportunities (emerging trends, new formats)
|
|
5. Risk Mitigation Strategies (competitive threats, algorithm changes)
|
|
6. Resource Allocation (budget, team, timeline)
|
|
7. Performance Optimization (KPIs, metrics, tracking)
|
|
8. Market Expansion Opportunities (new audiences, verticals)
|
|
9. Technology Integration (AI, automation, tools)
|
|
10. Long-term Strategic Vision (3-5 year roadmap)
|
|
|
|
Consider market dynamics, user behavior trends, and competitive landscape in your analysis.
|
|
Format as structured JSON with strategic insights and implementation guidance.
|
|
""",
|
|
|
|
'content_quality_assessment': """
|
|
As an expert content quality analyst with deep understanding of SEO, user experience, and content marketing best practices, assess content quality comprehensively:
|
|
|
|
CONTENT DATA:
|
|
{content_data}
|
|
|
|
QUALITY METRICS:
|
|
- Readability Score: {readability_score}
|
|
- SEO Optimization: {seo_score}
|
|
- User Engagement: {engagement_score}
|
|
- Content Depth: {depth_score}
|
|
|
|
PROVIDE COMPREHENSIVE QUALITY ASSESSMENT:
|
|
1. Overall Quality Score (comprehensive evaluation)
|
|
2. Readability Analysis (clarity, accessibility, flow)
|
|
3. SEO Optimization Analysis (technical, on-page, off-page)
|
|
4. Engagement Potential (user experience, interaction)
|
|
5. Content Depth Assessment (comprehensiveness, authority)
|
|
6. Improvement Suggestions (specific, actionable)
|
|
7. Competitive Benchmarking (industry standards)
|
|
8. Performance Optimization (conversion, retention)
|
|
9. Accessibility Assessment (inclusive design)
|
|
10. Future-Proofing (algorithm resilience)
|
|
|
|
Include specific recommendations with implementation steps and expected impact.
|
|
Format as structured JSON with detailed assessment and optimization guidance.
|
|
"""
|
|
}
|
|
|
|
def _load_centralized_schemas(self) -> Dict[str, Dict[str, Any]]:
|
|
"""Load centralized JSON schemas."""
|
|
return {
|
|
'content_gap_analysis': {
|
|
"type": "object",
|
|
"properties": {
|
|
"strategic_insights": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"type": {"type": "string"},
|
|
"insight": {"type": "string"},
|
|
"confidence": {"type": "number"},
|
|
"priority": {"type": "string"},
|
|
"estimated_impact": {"type": "string"},
|
|
"implementation_time": {"type": "string"},
|
|
"risk_level": {"type": "string"}
|
|
}
|
|
}
|
|
},
|
|
"content_recommendations": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"type": {"type": "string"},
|
|
"recommendation": {"type": "string"},
|
|
"priority": {"type": "string"},
|
|
"estimated_traffic": {"type": "string"},
|
|
"implementation_time": {"type": "string"},
|
|
"roi_estimate": {"type": "string"},
|
|
"success_metrics": {
|
|
"type": "array",
|
|
"items": {"type": "string"}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
'market_position_analysis': {
|
|
"type": "object",
|
|
"properties": {
|
|
"market_leader": {"type": "string"},
|
|
"content_leader": {"type": "string"},
|
|
"quality_leader": {"type": "string"},
|
|
"market_gaps": {
|
|
"type": "array",
|
|
"items": {"type": "string"}
|
|
},
|
|
"opportunities": {
|
|
"type": "array",
|
|
"items": {"type": "string"}
|
|
},
|
|
"competitive_advantages": {
|
|
"type": "array",
|
|
"items": {"type": "string"}
|
|
},
|
|
"strategic_recommendations": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"type": {"type": "string"},
|
|
"recommendation": {"type": "string"},
|
|
"priority": {"type": "string"},
|
|
"estimated_impact": {"type": "string"},
|
|
"implementation_time": {"type": "string"},
|
|
"confidence_level": {"type": "string"}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
'keyword_analysis': {
|
|
"type": "object",
|
|
"properties": {
|
|
"keyword_opportunities": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"keyword": {"type": "string"},
|
|
"search_volume": {"type": "number"},
|
|
"competition_level": {"type": "string"},
|
|
"difficulty_score": {"type": "number"},
|
|
"trend": {"type": "string"},
|
|
"intent": {"type": "string"},
|
|
"opportunity_score": {"type": "number"},
|
|
"recommended_format": {"type": "string"},
|
|
"estimated_traffic": {"type": "string"},
|
|
"implementation_priority": {"type": "string"}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
'performance_prediction': {
|
|
"type": "object",
|
|
"properties": {
|
|
"traffic_predictions": {
|
|
"type": "object",
|
|
"properties": {
|
|
"estimated_monthly_traffic": {"type": "string"},
|
|
"traffic_growth_rate": {"type": "string"},
|
|
"peak_traffic_month": {"type": "string"},
|
|
"confidence_level": {"type": "string"}
|
|
}
|
|
},
|
|
"engagement_predictions": {
|
|
"type": "object",
|
|
"properties": {
|
|
"estimated_time_on_page": {"type": "string"},
|
|
"estimated_bounce_rate": {"type": "string"},
|
|
"estimated_social_shares": {"type": "string"},
|
|
"estimated_comments": {"type": "string"},
|
|
"confidence_level": {"type": "string"}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
'strategic_intelligence': {
|
|
"type": "object",
|
|
"properties": {
|
|
"strategic_insights": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"type": {"type": "string"},
|
|
"insight": {"type": "string"},
|
|
"reasoning": {"type": "string"},
|
|
"priority": {"type": "string"},
|
|
"estimated_impact": {"type": "string"},
|
|
"implementation_time": {"type": "string"},
|
|
"confidence_level": {"type": "string"}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
'content_quality_assessment': {
|
|
"type": "object",
|
|
"properties": {
|
|
"overall_score": {"type": "number"},
|
|
"readability_score": {"type": "number"},
|
|
"seo_score": {"type": "number"},
|
|
"engagement_potential": {"type": "string"},
|
|
"improvement_suggestions": {
|
|
"type": "array",
|
|
"items": {"type": "string"}
|
|
},
|
|
"timestamp": {"type": "string"}
|
|
}
|
|
},
|
|
'content_schedule_generation': {
|
|
"type": "object",
|
|
"properties": {
|
|
"schedule": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"day": {"type": "number"},
|
|
"title": {"type": "string"},
|
|
"description": {"type": "string"},
|
|
"content_type": {"type": "string"},
|
|
"platform": {"type": "string"},
|
|
"pillar": {"type": "string"},
|
|
"priority": {"type": "string"},
|
|
"keywords": {
|
|
"type": "array",
|
|
"items": {"type": "string"}
|
|
},
|
|
"estimated_impact": {"type": "string"},
|
|
"implementation_time": {"type": "string"}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
async def _execute_ai_call(self, service_type: AIServiceType, prompt: str, schema: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""
|
|
Execute AI call with performance monitoring.
|
|
|
|
Args:
|
|
service_type: Type of AI service
|
|
prompt: AI prompt
|
|
schema: JSON schema for response
|
|
|
|
Returns:
|
|
AI response
|
|
"""
|
|
start_time = datetime.utcnow()
|
|
success = False
|
|
error_message = None
|
|
result = {}
|
|
|
|
try:
|
|
logger.info(f"🤖 Executing AI call for {service_type.value}")
|
|
|
|
# Execute AI call with timeout
|
|
response = await asyncio.wait_for(
|
|
gemini_structured_json_response(
|
|
prompt=prompt,
|
|
schema=schema,
|
|
temperature=self.config['temperature'],
|
|
max_tokens=self.config['max_tokens']
|
|
),
|
|
timeout=self.config['timeout_seconds']
|
|
)
|
|
|
|
# Parse response
|
|
result = json.loads(response)
|
|
success = True
|
|
logger.info(f"✅ AI call for {service_type.value} completed successfully")
|
|
|
|
except asyncio.TimeoutError:
|
|
error_message = f"AI call timeout for {service_type.value}"
|
|
logger.error(error_message)
|
|
except json.JSONDecodeError as e:
|
|
error_message = f"JSON decode error for {service_type.value}: {str(e)}"
|
|
logger.error(error_message)
|
|
except Exception as e:
|
|
error_message = f"AI call error for {service_type.value}: {str(e)}"
|
|
logger.error(error_message)
|
|
|
|
# Calculate response time
|
|
response_time = (datetime.utcnow() - start_time).total_seconds()
|
|
|
|
# Record metrics
|
|
metrics = AIServiceMetrics(
|
|
service_type=service_type,
|
|
response_time=response_time,
|
|
success=success,
|
|
error_message=error_message
|
|
)
|
|
self.metrics.append(metrics)
|
|
|
|
return result
|
|
|
|
async def generate_content_gap_analysis(self, analysis_data: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""
|
|
Generate content gap analysis using centralized AI service.
|
|
|
|
Args:
|
|
analysis_data: Analysis data
|
|
|
|
Returns:
|
|
Content gap analysis results
|
|
"""
|
|
try:
|
|
# Format prompt
|
|
prompt = self.prompts['content_gap_analysis'].format(
|
|
target_url=analysis_data.get('target_url', 'N/A'),
|
|
industry=analysis_data.get('industry', 'N/A'),
|
|
serp_opportunities=analysis_data.get('serp_opportunities', 0),
|
|
expanded_keywords_count=analysis_data.get('expanded_keywords_count', 0),
|
|
competitors_analyzed=analysis_data.get('competitors_analyzed', 0),
|
|
content_quality_score=analysis_data.get('content_quality_score', 7.0),
|
|
competition_level=analysis_data.get('competition_level', 'medium'),
|
|
dominant_themes=json.dumps(analysis_data.get('dominant_themes', {}), indent=2),
|
|
competitive_landscape=json.dumps(analysis_data.get('competitive_landscape', {}), indent=2)
|
|
)
|
|
|
|
# Execute AI call
|
|
result = await self._execute_ai_call(
|
|
AIServiceType.CONTENT_GAP_ANALYSIS,
|
|
prompt,
|
|
self.schemas['content_gap_analysis']
|
|
)
|
|
|
|
return result if result else self._get_fallback_content_gap_analysis()
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error in content gap analysis: {str(e)}")
|
|
return self._get_fallback_content_gap_analysis()
|
|
|
|
async def generate_market_position_analysis(self, market_data: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""
|
|
Generate market position analysis using centralized AI service.
|
|
|
|
Args:
|
|
market_data: Market analysis data
|
|
|
|
Returns:
|
|
Market position analysis results
|
|
"""
|
|
try:
|
|
# Format prompt
|
|
prompt = self.prompts['market_position_analysis'].format(
|
|
industry=market_data.get('industry', 'N/A'),
|
|
competitor_analyses=json.dumps(market_data.get('competitors', []), indent=2),
|
|
market_size=market_data.get('market_size', 'N/A'),
|
|
growth_rate=market_data.get('growth_rate', 'N/A'),
|
|
key_trends=json.dumps(market_data.get('key_trends', []), indent=2)
|
|
)
|
|
|
|
# Execute AI call
|
|
result = await self._execute_ai_call(
|
|
AIServiceType.MARKET_POSITION_ANALYSIS,
|
|
prompt,
|
|
self.schemas['market_position_analysis']
|
|
)
|
|
|
|
return result if result else self._get_fallback_market_position_analysis()
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error in market position analysis: {str(e)}")
|
|
return self._get_fallback_market_position_analysis()
|
|
|
|
async def generate_keyword_analysis(self, keyword_data: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""
|
|
Generate keyword analysis using centralized AI service.
|
|
|
|
Args:
|
|
keyword_data: Keyword analysis data
|
|
|
|
Returns:
|
|
Keyword analysis results
|
|
"""
|
|
try:
|
|
# Format prompt
|
|
prompt = self.prompts['keyword_analysis'].format(
|
|
industry=keyword_data.get('industry', 'N/A'),
|
|
target_keywords=json.dumps(keyword_data.get('target_keywords', []), indent=2),
|
|
search_volume_data=json.dumps(keyword_data.get('search_volume_data', {}), indent=2),
|
|
competition_analysis=json.dumps(keyword_data.get('competition_analysis', {}), indent=2),
|
|
trend_analysis=json.dumps(keyword_data.get('trend_analysis', {}), indent=2)
|
|
)
|
|
|
|
# Execute AI call
|
|
result = await self._execute_ai_call(
|
|
AIServiceType.KEYWORD_ANALYSIS,
|
|
prompt,
|
|
self.schemas['keyword_analysis']
|
|
)
|
|
|
|
return result if result else self._get_fallback_keyword_analysis()
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error in keyword analysis: {str(e)}")
|
|
return self._get_fallback_keyword_analysis()
|
|
|
|
async def generate_performance_prediction(self, content_data: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""
|
|
Generate performance prediction using centralized AI service.
|
|
|
|
Args:
|
|
content_data: Content data for prediction
|
|
|
|
Returns:
|
|
Performance prediction results
|
|
"""
|
|
try:
|
|
# Format prompt
|
|
prompt = self.prompts['performance_prediction'].format(
|
|
industry=content_data.get('industry', 'N/A'),
|
|
target_audience=json.dumps(content_data.get('target_audience', {})),
|
|
competition_level=content_data.get('competition_level', 'medium'),
|
|
quality_score=content_data.get('quality_score', 7.0)
|
|
)
|
|
|
|
# Execute AI call
|
|
result = await self._execute_ai_call(
|
|
AIServiceType.PERFORMANCE_PREDICTION,
|
|
prompt,
|
|
self.schemas['performance_prediction']
|
|
)
|
|
|
|
return result if result else self._get_fallback_performance_prediction()
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error in performance prediction: {str(e)}")
|
|
return self._get_fallback_performance_prediction()
|
|
|
|
async def generate_strategic_intelligence(self, analysis_data: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""
|
|
Generate strategic intelligence using centralized AI service.
|
|
|
|
Args:
|
|
analysis_data: Analysis data for strategic insights
|
|
|
|
Returns:
|
|
Strategic intelligence results
|
|
"""
|
|
try:
|
|
# Format prompt
|
|
prompt = self.prompts['strategic_intelligence'].format(
|
|
analysis_data=json.dumps(analysis_data, indent=2),
|
|
business_objectives=json.dumps(analysis_data.get('business_objectives', {})),
|
|
target_audience=json.dumps(analysis_data.get('target_audience', {})),
|
|
competitive_landscape=json.dumps(analysis_data.get('competitive_landscape', {}), indent=2),
|
|
market_opportunities=json.dumps(analysis_data.get('market_opportunities', []), indent=2)
|
|
)
|
|
|
|
# Execute AI call
|
|
result = await self._execute_ai_call(
|
|
AIServiceType.STRATEGIC_INTELLIGENCE,
|
|
prompt,
|
|
self.schemas['strategic_intelligence']
|
|
)
|
|
|
|
return result if result else self._get_fallback_strategic_intelligence()
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error in strategic intelligence: {str(e)}")
|
|
return self._get_fallback_strategic_intelligence()
|
|
|
|
async def generate_content_quality_assessment(self, content_data: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""
|
|
Generate content quality assessment using centralized AI service.
|
|
|
|
Args:
|
|
content_data: Content data for assessment
|
|
|
|
Returns:
|
|
Content quality assessment results
|
|
"""
|
|
try:
|
|
# Format prompt
|
|
prompt = self.prompts['content_quality_assessment'].format(
|
|
content_data=json.dumps(content_data, indent=2),
|
|
readability_score=content_data.get('readability_score', 80.0),
|
|
seo_score=content_data.get('seo_score', 90.0),
|
|
engagement_score=content_data.get('engagement_score', 75.0),
|
|
depth_score=content_data.get('depth_score', 85.0)
|
|
)
|
|
|
|
# Execute AI call
|
|
result = await self._execute_ai_call(
|
|
AIServiceType.CONTENT_QUALITY_ASSESSMENT,
|
|
prompt,
|
|
self.schemas['content_quality_assessment']
|
|
)
|
|
|
|
return result if result else self._get_fallback_content_quality_assessment()
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error in content quality assessment: {str(e)}")
|
|
return self._get_fallback_content_quality_assessment()
|
|
|
|
async def generate_content_schedule(self, prompt: str) -> Dict[str, Any]:
|
|
"""
|
|
Generate content schedule using AI.
|
|
"""
|
|
try:
|
|
logger.info("Generating content schedule using AI")
|
|
|
|
# Use the content schedule prompt
|
|
enhanced_prompt = f"""
|
|
{prompt}
|
|
|
|
Please return a structured JSON response with the following format:
|
|
{{
|
|
"schedule": [
|
|
{{
|
|
"day": 1,
|
|
"title": "Content Title",
|
|
"description": "Content description",
|
|
"content_type": "blog_post",
|
|
"platform": "website",
|
|
"pillar": "Educational Content",
|
|
"priority": "high",
|
|
"keywords": ["keyword1", "keyword2"],
|
|
"estimated_impact": "High",
|
|
"implementation_time": "2-4 weeks"
|
|
}}
|
|
]
|
|
}}
|
|
"""
|
|
|
|
response = await self._execute_ai_call(
|
|
AIServiceType.CONTENT_SCHEDULE_GENERATION,
|
|
enhanced_prompt,
|
|
self.schemas.get('content_schedule_generation', {})
|
|
)
|
|
|
|
logger.info("Content schedule generated successfully")
|
|
return response
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error generating content schedule: {str(e)}")
|
|
return {"schedule": []}
|
|
|
|
# Fallback methods
|
|
def _get_fallback_content_gap_analysis(self) -> Dict[str, Any]:
|
|
"""Fallback content gap analysis."""
|
|
return {
|
|
'strategic_insights': [
|
|
{
|
|
'type': 'content_strategy',
|
|
'insight': 'Focus on educational content to build authority',
|
|
'confidence': 0.85,
|
|
'priority': 'high',
|
|
'estimated_impact': 'Authority building',
|
|
'implementation_time': '3-6 months',
|
|
'risk_level': 'low'
|
|
}
|
|
],
|
|
'content_recommendations': [
|
|
{
|
|
'type': 'content_creation',
|
|
'recommendation': 'Create comprehensive guides for high-opportunity keywords',
|
|
'priority': 'high',
|
|
'estimated_traffic': '5K+ monthly',
|
|
'implementation_time': '2-3 weeks',
|
|
'roi_estimate': 'High ROI potential',
|
|
'success_metrics': ['Traffic increase', 'Authority building', 'Lead generation']
|
|
}
|
|
]
|
|
}
|
|
|
|
def _get_fallback_market_position_analysis(self) -> Dict[str, Any]:
|
|
"""Fallback market position analysis."""
|
|
return {
|
|
'market_leader': 'competitor1.com',
|
|
'content_leader': 'competitor2.com',
|
|
'quality_leader': 'competitor3.com',
|
|
'market_gaps': ['Video content', 'Interactive content', 'Expert interviews'],
|
|
'opportunities': ['Niche content development', 'Expert interviews', 'Industry reports'],
|
|
'competitive_advantages': ['Technical expertise', 'Comprehensive guides', 'Industry insights']
|
|
}
|
|
|
|
def _get_fallback_keyword_analysis(self) -> Dict[str, Any]:
|
|
"""Fallback keyword analysis."""
|
|
return {
|
|
'keyword_opportunities': [
|
|
{
|
|
'keyword': 'industry best practices',
|
|
'search_volume': 3000,
|
|
'competition_level': 'low',
|
|
'difficulty_score': 35,
|
|
'trend': 'rising',
|
|
'intent': 'informational',
|
|
'opportunity_score': 85,
|
|
'recommended_format': 'comprehensive_guide',
|
|
'estimated_traffic': '2K+ monthly',
|
|
'implementation_priority': 'high'
|
|
}
|
|
]
|
|
}
|
|
|
|
def _get_fallback_performance_prediction(self) -> Dict[str, Any]:
|
|
"""Fallback performance prediction."""
|
|
return {
|
|
"traffic_predictions": {
|
|
"estimated_monthly_traffic": "10K+",
|
|
"traffic_growth_rate": "10%",
|
|
"peak_traffic_month": "June",
|
|
"confidence_level": "high"
|
|
},
|
|
"engagement_predictions": {
|
|
"estimated_time_on_page": "5 min",
|
|
"estimated_bounce_rate": "20%",
|
|
"estimated_social_shares": "100+",
|
|
"estimated_comments": "50+",
|
|
"confidence_level": "medium"
|
|
}
|
|
}
|
|
|
|
def _get_fallback_strategic_intelligence(self) -> Dict[str, Any]:
|
|
"""Fallback strategic intelligence."""
|
|
return {
|
|
"strategic_insights": [
|
|
{
|
|
"type": "content_strategy",
|
|
"insight": "Focus on educational content to build authority",
|
|
"reasoning": "Educational content is highly shareable and can attract a targeted audience.",
|
|
"priority": "high",
|
|
"estimated_impact": "Authority building",
|
|
"implementation_time": "3-6 months",
|
|
"confidence_level": "high"
|
|
}
|
|
]
|
|
}
|
|
|
|
def _get_fallback_content_quality_assessment(self) -> Dict[str, Any]:
|
|
"""Fallback content quality assessment."""
|
|
return {
|
|
"overall_score": 88.0,
|
|
"readability_score": 92.0,
|
|
"seo_score": 95.0,
|
|
"engagement_potential": "High engagement and retention",
|
|
"improvement_suggestions": ["Add more internal links", "Optimize images for SEO"],
|
|
"timestamp": datetime.utcnow().isoformat()
|
|
}
|
|
|
|
def get_performance_metrics(self) -> Dict[str, Any]:
|
|
"""
|
|
Get AI service performance metrics.
|
|
|
|
Returns:
|
|
Performance metrics
|
|
"""
|
|
if not self.metrics:
|
|
return {
|
|
'total_calls': 0,
|
|
'success_rate': 0,
|
|
'average_response_time': 0,
|
|
'service_breakdown': {}
|
|
}
|
|
|
|
total_calls = len(self.metrics)
|
|
successful_calls = len([m for m in self.metrics if m.success])
|
|
success_rate = (successful_calls / total_calls) * 100 if total_calls > 0 else 0
|
|
average_response_time = sum(m.response_time for m in self.metrics) / total_calls if total_calls > 0 else 0
|
|
|
|
# Service breakdown
|
|
service_breakdown = {}
|
|
for service_type in AIServiceType:
|
|
service_metrics = [m for m in self.metrics if m.service_type == service_type]
|
|
if service_metrics:
|
|
service_breakdown[service_type.value] = {
|
|
'total_calls': len(service_metrics),
|
|
'success_rate': (len([m for m in service_metrics if m.success]) / len(service_metrics)) * 100,
|
|
'average_response_time': sum(m.response_time for m in service_metrics) / len(service_metrics)
|
|
}
|
|
|
|
return {
|
|
'total_calls': total_calls,
|
|
'success_rate': success_rate,
|
|
'average_response_time': average_response_time,
|
|
'service_breakdown': service_breakdown,
|
|
'last_updated': datetime.utcnow().isoformat()
|
|
}
|
|
|
|
async def health_check(self) -> Dict[str, Any]:
|
|
"""
|
|
Health check for the AI service manager.
|
|
|
|
Returns:
|
|
Health status information
|
|
"""
|
|
try:
|
|
logger.info("Performing health check for AIServiceManager")
|
|
|
|
# Test AI functionality with a simple prompt
|
|
test_prompt = "Hello, this is a health check test."
|
|
try:
|
|
test_response = llm_text_gen(test_prompt)
|
|
ai_status = "operational" if test_response else "degraded"
|
|
except Exception as e:
|
|
ai_status = "error"
|
|
logger.warning(f"AI health check failed: {str(e)}")
|
|
|
|
# Get performance metrics
|
|
performance_metrics = self.get_performance_metrics()
|
|
|
|
health_status = {
|
|
'service': 'AIServiceManager',
|
|
'status': 'healthy',
|
|
'capabilities': {
|
|
'content_gap_analysis': 'operational',
|
|
'market_position_analysis': 'operational',
|
|
'keyword_analysis': 'operational',
|
|
'performance_prediction': 'operational',
|
|
'strategic_intelligence': 'operational',
|
|
'content_quality_assessment': 'operational',
|
|
'ai_integration': ai_status
|
|
},
|
|
'performance_metrics': performance_metrics,
|
|
'prompts_loaded': len(self.prompts),
|
|
'schemas_loaded': len(self.schemas),
|
|
'configuration': self.config,
|
|
'timestamp': datetime.utcnow().isoformat()
|
|
}
|
|
|
|
logger.info("AIServiceManager health check passed")
|
|
return health_status
|
|
|
|
except Exception as e:
|
|
logger.error(f"AIServiceManager health check failed: {str(e)}")
|
|
return {
|
|
'service': 'AIServiceManager',
|
|
'status': 'unhealthy',
|
|
'error': str(e),
|
|
'timestamp': datetime.utcnow().isoformat()
|
|
} |