acquisition_runner.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. """Pipeline adapter for the acquisition stage."""
  2. from __future__ import annotations
  3. from dataclasses import dataclass
  4. from typing import Any
  5. from uuid import UUID
  6. from acquisition.repositories.base import AcquisitionRepository
  7. from acquisition.runner import RunBatchResult, run_batch
  8. from core.config import Settings
  9. from core.text_limits import ERROR_MESSAGE_MAX_CHARS, clip_text
  10. from pipeline.models import PipelineJob, PipelineRun
  11. from pipeline.repository import PipelineRepository
  12. @dataclass(frozen=True)
  13. class AcquisitionStageResult:
  14. pipeline_job: PipelineJob | None
  15. acquisition: RunBatchResult
  16. def run_acquisition_stage(
  17. *,
  18. acquisition_repo: AcquisitionRepository,
  19. batch_id: UUID,
  20. settings: Settings,
  21. pipeline_repo: PipelineRepository | None = None,
  22. pipeline_run: PipelineRun | None = None,
  23. **kwargs: Any,
  24. ) -> AcquisitionStageResult:
  25. job = None
  26. if pipeline_repo and pipeline_run and pipeline_run.id:
  27. job = pipeline_repo.save_pipeline_job(
  28. run_id=pipeline_run.id,
  29. stage="search",
  30. target_id=batch_id,
  31. status="running",
  32. metadata={"batch_id": str(batch_id)},
  33. )
  34. try:
  35. result = run_batch(acquisition_repo, batch_id=batch_id, settings=settings, **kwargs)
  36. if pipeline_repo and job and job.id:
  37. job = pipeline_repo.mark_job_status(
  38. job.id,
  39. status="done" if result.failed == 0 else "partial",
  40. metadata=result.__dict__,
  41. )
  42. return AcquisitionStageResult(pipeline_job=job, acquisition=result)
  43. except Exception as exc:
  44. if pipeline_repo and job and job.id:
  45. pipeline_repo.mark_job_status(
  46. job.id,
  47. status="failed",
  48. error_message=clip_text(exc, ERROR_MESSAGE_MAX_CHARS),
  49. )
  50. raise