completion_guard.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. """find_agent 基于持久化运行状态的结束守卫。"""
  2. from __future__ import annotations
  3. from collections.abc import Sequence
  4. from typing import TYPE_CHECKING
  5. from supply_agent.types import CompletionGuard, Message
  6. from supply_infra.services.video_discovery_service import (
  7. get_video_discovery_service,
  8. )
  9. if TYPE_CHECKING:
  10. from supply_agent.agent.core import Agent
  11. _BUSINESS_OUTCOMES = {"goal_met", "partial", "no_match"}
  12. def create_find_completion_guard(run_id: str) -> CompletionGuard:
  13. """创建只允许已进入 finished / failed 终态的 find_agent 结束守卫。"""
  14. normalized_run_id = str(run_id or "").strip()[:64]
  15. def guard(_response: Message, _messages: Sequence[Message]) -> str | None:
  16. if not normalized_run_id:
  17. return (
  18. "当前用户消息中缺少 run_id,无法确认运行状态。"
  19. "请不要直接输出最终结果。"
  20. )
  21. run = get_video_discovery_service().lookup_run(normalized_run_id)
  22. if run is None:
  23. return (
  24. f"run_id={normalized_run_id} 不存在,无法确认运行状态。"
  25. "请不要直接输出最终结果。"
  26. )
  27. status = str(run.get("status") or "").strip()
  28. if status == "failed":
  29. return None
  30. if status == "finished":
  31. outcome = str(run.get("outcome_status") or "").strip()
  32. if outcome in _BUSINESS_OUTCOMES:
  33. return None
  34. return (
  35. "run.status 已是 finished,但缺少程序计算的业务结果。"
  36. "请再次调用 update_video_discovery_run_status,"
  37. "并以返回的 outcome_status 与 valid_primary_count 为准。"
  38. )
  39. return (
  40. f"当前 run.status 仍为 {status or 'unknown'}。"
  41. "请继续处理;正常完成后先调用 "
  42. "update_video_discovery_run_status 将状态更新为 finished,"
  43. "无法完成时将状态更新为 failed,再输出最终结果。"
  44. )
  45. return guard
  46. def configure_find_agent_completion_guard(agent: Agent, run_id: str) -> None:
  47. """在 find_agent 循环创建前按需注入状态结束守卫。"""
  48. if getattr(agent, "completion_guard", None) is not None:
  49. return
  50. agent.completion_guard = create_find_completion_guard(run_id)
  51. __all__ = [
  52. "configure_find_agent_completion_guard",
  53. "create_find_completion_guard",
  54. ]