ppt-tool/backend/workers/master_deck_worker.py
Vadym Samoilenko a0d73b3b63 Phase 4: Generation Pipeline — brand enforcement, enhanced LLM calls, ARQ job queue
- Step 14: Brand enforcement service (font/color/logo replacement, WCAG contrast check, LLM prompt context)
- Step 15: Enhanced outline & slide content generation with brand context, content summary, "no hallucination" instructions
- Step 15b: LLM auto-fallback retry logic across providers (FALLBACK_LLM_PROVIDERS env)
- Step 16: Redis/ARQ job queue — worker entry point, presentation & master deck workers, job status/SSE endpoints, graceful fallback to BackgroundTasks when Redis unavailable

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 16:15:25 +00:00

59 lines
2 KiB
Python

"""ARQ worker task: parse a master deck PPTX."""
import traceback
import uuid
from datetime import datetime
from models.sql.job import JobModel
from services.database import async_session_maker
from services.master_deck_parser_service import parse_master_deck
from services.redis_service import publish_job_progress
async def parse_master_deck_task(ctx: dict, job_id: str) -> None:
"""ARQ task: parse a master deck via the existing parser service."""
job_uuid = uuid.UUID(job_id)
async with async_session_maker() as session:
job = await session.get(JobModel, job_uuid)
if not job:
return
try:
job.status = "processing"
job.started_at = datetime.utcnow()
job.progress = 10
job.progress_message = "Parsing master deck"
await session.commit()
try:
await publish_job_progress(job_uuid, 10, "Parsing master deck")
except Exception:
pass
# The existing parser updates MasterDeckModel directly
# presentation_id is reused to store the deck_id for this job type
await parse_master_deck(job.presentation_id)
job.status = "completed"
job.progress = 100
job.progress_message = "Parsing complete"
job.completed_at = datetime.utcnow()
await session.commit()
try:
await publish_job_progress(job_uuid, 100, "Parsing complete", "completed")
except Exception:
pass
except Exception as e:
traceback.print_exc()
job.status = "failed"
job.error_message = str(e)[:500]
job.progress_message = "Parsing failed"
job.completed_at = datetime.utcnow()
await session.commit()
try:
await publish_job_progress(job_uuid, job.progress, "Parsing failed", "failed")
except Exception:
pass