feat(market-intel): Finalize Level 4 Competitive Radar (Semantics & Relations)

- Implemented semantic classification for Products (e.g. 'Cleaning', 'Logistics') and Battlecards (e.g. 'Price', 'Support').
- Created 'import_competitive_radar.py' for full 4-database relational import to Notion.
- Updated Orchestrator with new prompts for structured output.
- Cleaned up obsolete scripts.
This commit is contained in:
2026-01-11 12:54:12 +00:00
parent 9a769f62a0
commit b5e6c415c7
5 changed files with 249 additions and 26 deletions

78
refresh_classification.py Normal file
View File

@@ -0,0 +1,78 @@
import asyncio
import json
import os
import sys
# Path to the orchestrator
sys.path.append(os.path.join(os.getcwd(), 'competitor-analysis-app'))
from competitor_analysis_orchestrator import analyze_single_competitor, fetch_step7_data_battlecards, FetchStep7DataBattlecardsRequest
# Mock Object to mimic Pydantic model behavior for the API call
class MockCompany:
def __init__(self, data):
self.name = data.get('name')
self.start_url = data.get('start_url')
def get(self, key, default=None):
return getattr(self, key, default)
class MockRequest:
def __init__(self, company, analyses, silver_bullets):
self.company = company
self.analyses = analyses
self.silver_bullets = silver_bullets
self.language = "de"
async def refresh_classification():
json_path = 'analysis_robo-planet.de.json'
with open(json_path, 'r') as f:
data = json.load(f)
company_data = data.get('company', {})
competitors = data.get('competitors_shortlist', []) or data.get('competitor_candidates', [])
silver_bullets = data.get('silver_bullets', [])
print(f"🔄 Re-Running Classification for {len(competitors)} competitors...")
# --- STEP 1: Re-Analyze Single Competitors (to get Product Categories) ---
print("Step 1: Updating Portfolio Classification...")
tasks = [analyze_single_competitor(c, company_data) for c in competitors]
new_analyses = await asyncio.gather(*tasks)
# Filter valid results
valid_analyses = [r for r in new_analyses if r is not None]
data['analyses'] = valid_analyses
print(f"✅ Updated {len(valid_analyses)} analyses with product categories.")
# --- STEP 2: Re-Generate Battlecards (to get Landmine Topics) ---
print("Step 2: Updating Battlecard Classification...")
# Construct request object for the API function
# Note: fetch_step7_data_battlecards expects a Pydantic model, but we can pass a dict if we are careful or construct a mock.
# The function uses `request.analyses` etc.
req = FetchStep7DataBattlecardsRequest(
company=company_data,
analyses=valid_analyses,
silver_bullets=silver_bullets,
language="de"
)
# Call the function directly
new_battlecards_result = await fetch_step7_data_battlecards(req)
if new_battlecards_result and 'battlecards' in new_battlecards_result:
data['battlecards'] = new_battlecards_result['battlecards']
print(f"✅ Updated {len(data['battlecards'])} battlecards with topics.")
else:
print("⚠️ Failed to update battlecards.")
# Save
with open(json_path, 'w') as f:
json.dump(data, f, indent=2)
print(f"🎉 Successfully updated {json_path} with full classification.")
if __name__ == "__main__":
asyncio.run(refresh_classification())