Initial commit - WhyRating Engine (Google Reviews Scraper)

This commit is contained in:
Alejandro Gutiérrez
2026-02-02 18:19:00 +00:00
parent 0543a08242
commit 2206ddeff2
136 changed files with 51138 additions and 855 deletions

83
run_synthesis.py Normal file
View File

@@ -0,0 +1,83 @@
#!/usr/bin/env python3
"""Regenerate synthesis with new report format."""
import asyncio
import os
import sys
import uuid
sys.path.insert(0, '/app/packages/reviewiq-pipeline/src')
sys.path.insert(0, '/app/packages/pipeline-core/src')
async def main():
import asyncpg
from reviewiq_pipeline.config import Config
from reviewiq_pipeline.services.llm_client import LLMClient
from reviewiq_pipeline.stages.stage5_synthesize import Stage5Synthesizer
job_id = "a3813665-ea23-4fb0-aab7-b282ef9443e4"
database_url = os.getenv(
'DATABASE_URL',
'postgresql://scraper:scraper123@scraper-db:5432/scraper'
)
print("Connecting to database...")
pool = await asyncpg.create_pool(database_url)
# Check if execution exists for this job, create one if not
print("Checking for existing execution...")
row = await pool.fetchrow(
"SELECT id FROM pipeline.executions WHERE job_id = $1::uuid ORDER BY created_at DESC LIMIT 1",
job_id
)
if row:
execution_id = str(row['id'])
print(f"Found existing execution: {execution_id}")
else:
execution_id = str(uuid.uuid4())
print(f"Creating new execution: {execution_id}")
await pool.execute("""
INSERT INTO pipeline.executions (id, pipeline_id, job_id, status, stages_requested, created_at)
VALUES ($1::uuid, 'reviewiq', $2::uuid, 'running', ARRAY['synthesize'], NOW())
""", execution_id, job_id)
print("Creating LLM client...")
config = Config()
llm_client = LLMClient.create(config)
try:
print(f"Generating analyst report for job {job_id}...")
stage5 = Stage5Synthesizer(pool=pool, llm_client=llm_client)
synthesis = await stage5.run(job_id, execution_id)
# Mark execution as completed
await pool.execute(
"UPDATE pipeline.executions SET status = 'completed', completed_at = NOW() WHERE id = $1::uuid",
execution_id
)
print(f"\n{'='*70}")
print("ANALYST REPORT GENERATED")
print(f"{'='*70}")
print(f"\nHEADLINE: {synthesis.headline}")
print(f"\nVERDICT: {synthesis.verdict}")
print(f"\nRATING: {synthesis.current_rating:.1f}{synthesis.potential_rating:.1f} (gap: +{synthesis.rating_gap:.1f})")
print(f"\nNARRATIVE:\n{synthesis.narrative[:500]}...")
print(f"\nPRIMARY PROBLEM: {synthesis.primary_problem}")
print(f"ROOT CAUSE: {synthesis.root_cause}")
print(f"\nACTIONS ({len(synthesis.actions)}):")
for a in synthesis.actions:
print(f" [{a.priority}] {a.action}")
print(f" Owner: {a.owner} | Impact: {a.impact}")
print(f"\nEVIDENCE ({len(synthesis.evidence)}):")
for e in synthesis.evidence[:3]:
print(f" [{e.sentiment}] \"{e.quote[:60]}...\"")
print(f" Context: {e.context}")
finally:
await llm_client.close()
await pool.close()
if __name__ == "__main__":
asyncio.run(main())