gates.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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. if step_key == "aigc_write_record":
  27. if payload.get("effect_recorded") is not True or not payload.get("payload_hash"):
  28. return GateDecision(
  29. False,
  30. "aigc_record_incomplete",
  31. "AIGC publish payload/hash was not durably recorded",
  32. )
  33. failed_batches = int(payload.get("failed_batch_count", 0) or 0)
  34. if failed_batches > 0:
  35. return GateDecision(
  36. False,
  37. "aigc_publish_failed",
  38. f"AIGC publish reported {failed_batches} failed batch(es)",
  39. )
  40. return GateDecision(True)