The Competitor Intelligence Agent maps the competitive landscape and identifies capability gaps:
def competitor_intelligence_agent(industry_trends: list) -> dict:
"""
Analyzes competitors and identifies white-space opportunities.
This agent creates a competitive capability matrix showing:
- Who offers which services (capability mapping)
- Which capabilities are oversaturated (red ocean)
- Which capabilities are underserved (blue ocean)
Args:
industry_trends: List of trend objects from industry research
Returns:
{
'summary': str,
'competitors': list,
'capability_matrix': dict,
'gaps': list, # WHITE-SPACE OPPORTUNITIES
'visualization_path': str
}
"""
log_agent_title("Competitor Intelligence Agent", "🕵️")
queries = [
"top data analytics consulting firms 2024 services",
"leading business intelligence consulting companies capabilities",
"data science consulting firms AI ML offerings"
]
all_research = []
for query in queries:
results = search_web(query, max_results=3)
all_research.extend(results)
research_text = "\n\n".join([
f"Source: {r['title']}\n{r['content'][:400]}..."
for r in all_research[:8]
])
trend_names = [t.get('name', '') for t in industry_trends[:6]]
competitor_prompt = f"""You are a competitive intelligence analyst for data analytics consulting.
Web Research:
{research_text}
Key Industry Capabilities:
{', '.join(trend_names)}
Identify:
1. TOP 10 COMPETITORS in data analytics consulting
2. Map each competitor's capabilities (1=offers, 0=doesn't offer)
3. Identify WHITE-SPACE GAPS (capabilities no one offers well)
Respond ONLY with valid JSON:
{{
"competitors": [
{{"name": "Deloitte Analytics", "size": "Large", "focus": "Enterprise AI"}},
{{"name": "McKinsey Analytics", "size": "Large", "focus": "Strategy + Data"}}
],
"capabilities": ["AI/ML", "Cloud", "Real-time", "Visualization", "Governance", "Edge"],
"matrix": [
[1, 1, 1, 1, 0, 0],
[1, 1, 0, 1, 1, 0]
],
"gaps": [
{{"capability": "AI Governance", "reason": "Most firms offer AI but not governance"}}
],
"summary": "Competitive landscape summary..."
}}
Matrix rows = competitors, columns = capabilities.
"""
try:
response = model.generate_content(competitor_prompt)
json_match = re.search(r'\{.*\}', response.text, re.DOTALL)
if json_match:
analysis = json.loads(json_match.group(0))
viz_path = ""
if analysis.get('competitors') and analysis.get('matrix'):
competitor_names = [c['name'] for c in analysis['competitors']]
viz_path = create_competitor_matrix({
'competitors': competitor_names,
'capabilities': analysis['capabilities'],
'matrix': analysis['matrix']
})
if analysis.get('gaps'):
gaps_text = "\n".join([
f"- {g['capability']}: {g['reason']}"
for g in analysis['gaps'][:5]
])
print_html(gaps_text, "🎯 White-Space Opportunities", "orange")
return {
'summary': analysis.get('summary', 'No summary available'),
'competitors': analysis.get('competitors', []),
'gaps': analysis.get('gaps', []),
'visualization_path': viz_path
}
except Exception as e:
return {'summary': f"Analysis error: {str(e)}", 'competitors': []}