[2ff88f42] feat(GTM-Engine): Implement Dual Opener Strategy & Harden Analysis
Completed the GTM engine setup:\n\n- Implemented 'Dual Opener' generation (Primary/Secondary) in ClassificationService.\n- Migrated DB to support two opener fields.\n- Updated API and Frontend to handle and display both openers.\n- Fixed bug creating duplicate website_scrape entries.\n- Hardened metric extraction by improving the LLM prompt and adding content length checks.
This commit is contained in:
@@ -97,6 +97,8 @@ class ProvisioningResponse(BaseModel):
|
||||
website: Optional[str] = None
|
||||
vertical_name: Optional[str] = None
|
||||
role_name: Optional[str] = None
|
||||
opener: Optional[str] = None # Primary opener (Infrastructure/Cleaning)
|
||||
opener_secondary: Optional[str] = None # Secondary opener (Service/Logistics)
|
||||
texts: Dict[str, Optional[str]] = {}
|
||||
|
||||
# --- Events ---
|
||||
@@ -243,6 +245,8 @@ def provision_superoffice_contact(
|
||||
website=company.website,
|
||||
vertical_name=vertical_name,
|
||||
role_name=role_name,
|
||||
opener=company.ai_opener,
|
||||
opener_secondary=company.ai_opener_secondary,
|
||||
texts=texts
|
||||
)
|
||||
|
||||
@@ -797,21 +801,29 @@ def run_analysis_task(company_id: int):
|
||||
|
||||
logger.info(f"Running Analysis Task for {company.name}")
|
||||
|
||||
# 1. Scrape Website (if not locked)
|
||||
# --- 1. Scrape Website (if not locked) ---
|
||||
# Check for existing scrape data first
|
||||
existing_scrape = db.query(EnrichmentData).filter(
|
||||
EnrichmentData.company_id == company.id,
|
||||
EnrichmentData.source_type == "website_scrape"
|
||||
).first()
|
||||
|
||||
# If it doesn't exist or is not locked, we perform a scrape
|
||||
if not existing_scrape or not existing_scrape.is_locked:
|
||||
from .services.scraping import ScraperService
|
||||
scrape_res = ScraperService().scrape_url(company.website)
|
||||
logger.info(f"Scraping website for {company.name}...")
|
||||
scrape_res = scraper.scrape_url(company.website) # Use singleton
|
||||
|
||||
# Now, either create new or update existing
|
||||
if not existing_scrape:
|
||||
db.add(EnrichmentData(company_id=company.id, source_type="website_scrape", content=scrape_res))
|
||||
logger.info("Created new website_scrape entry.")
|
||||
else:
|
||||
existing_scrape.content = scrape_res
|
||||
existing_scrape.updated_at = datetime.utcnow()
|
||||
logger.info("Updated existing website_scrape entry.")
|
||||
db.commit()
|
||||
else:
|
||||
logger.info("Website scrape is locked. Skipping.")
|
||||
|
||||
# 2. Classify Industry & Metrics
|
||||
# IMPORTANT: Using the new method name and passing db session
|
||||
|
||||
Reference in New Issue
Block a user