gates.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334
  1. from __future__ import annotations
  2. from dataclasses import dataclass
  3. from typing import Any
  4. @dataclass(frozen=True)
  5. class GateDecision:
  6. passed: bool
  7. error_code: str | None = None
  8. error_message: str | None = None
  9. def evaluate_step_gate(step_key: str, payload: dict[str, Any]) -> GateDecision:
  10. if payload.get("success") is False:
  11. return GateDecision(
  12. passed=False,
  13. error_code=str(payload.get("error_code") or "step_reported_failure"),
  14. error_message=str(payload.get("error") or "Step returned success=false"),
  15. )
  16. if step_key == "demand_classify" and payload.get("failed_batches"):
  17. return GateDecision(False, "classification_failed_batches", "Classification has failed batches")
  18. if step_key in {"demand_grade", "demand_expand", "video_discovery"}:
  19. failed = int(payload.get("failed", payload.get("failed_count", 0)) or 0)
  20. if failed > 0:
  21. return GateDecision(
  22. False,
  23. "business_failures",
  24. f"{step_key} reported {failed} failed item(s)",
  25. )
  26. return GateDecision(True)