84 lines
3.0 KiB
Python
84 lines
3.0 KiB
Python
#!/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())
|