verify_find_agent_from_demand.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. """从 demand_grade + demand_video_expansion 选取一条记录,调用 find_agent。"""
  2. from __future__ import annotations
  3. import argparse
  4. import json
  5. import logging
  6. from agents.find_agent.demand_run import (
  7. build_find_agent_user_input,
  8. build_run_input_payload,
  9. discover_videos_for_demand,
  10. list_find_demand_contexts,
  11. pick_find_demand_context,
  12. serialize_find_demand_context,
  13. )
  14. logging.basicConfig(
  15. level=logging.INFO,
  16. format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
  17. )
  18. logger = logging.getLogger(__name__)
  19. def _load_target_context(args: argparse.Namespace):
  20. if args.list_only:
  21. biz_dt, contexts = list_find_demand_contexts(args.biz_dt)
  22. print(
  23. json.dumps(
  24. {
  25. "biz_dt": biz_dt,
  26. "total": len(contexts),
  27. "items": [serialize_find_demand_context(ctx) for ctx in contexts],
  28. },
  29. ensure_ascii=False,
  30. indent=2,
  31. )
  32. )
  33. return None
  34. ctx = pick_find_demand_context(
  35. args.biz_dt,
  36. index=args.index,
  37. demand_grade_id=args.demand_grade_id,
  38. )
  39. if ctx is None:
  40. biz_dt, contexts = list_find_demand_contexts(args.biz_dt)
  41. raise SystemExit(
  42. "未找到匹配的待执行记录。"
  43. f" biz_dt={biz_dt}, total={len(contexts)}, index={args.index},"
  44. f" demand_grade_id={args.demand_grade_id}"
  45. )
  46. return ctx
  47. def main() -> None:
  48. parser = argparse.ArgumentParser(
  49. description="从 S/A 需求拓展点位中选取一条记录,调用 find_agent。",
  50. )
  51. parser.add_argument("--biz-dt", help="业务日 YYYYMMDD,默认取最新 demand_grade.biz_dt")
  52. parser.add_argument(
  53. "--index",
  54. type=int,
  55. default=0,
  56. help="在未指定 demand_grade_id 时,选取第几条记录(从 0 开始)",
  57. )
  58. parser.add_argument("--demand-grade-id", type=int, help="指定 demand_grade.id")
  59. parser.add_argument(
  60. "--list-only",
  61. action="store_true",
  62. help="只列出可执行记录,不调用 Agent",
  63. )
  64. parser.add_argument(
  65. "--dry-run",
  66. action="store_true",
  67. help="只打印组装后的上下文与 prompt,不调用 Agent",
  68. )
  69. parser.add_argument(
  70. "--force",
  71. action="store_true",
  72. help="忽略当天已执行记录,强制重跑",
  73. )
  74. args = parser.parse_args()
  75. ctx = _load_target_context(args)
  76. if ctx is None:
  77. return
  78. summary = serialize_find_demand_context(ctx)
  79. run_payload = build_run_input_payload(ctx)
  80. print("CONTEXT " + json.dumps(summary, ensure_ascii=False), flush=True)
  81. print("RUN_PAYLOAD " + json.dumps(run_payload, ensure_ascii=False), flush=True)
  82. if args.dry_run:
  83. user_input = build_find_agent_user_input(ctx, "<pre-create-on-run>")
  84. print("PROMPT_BEGIN", flush=True)
  85. print(user_input, flush=True)
  86. print("PROMPT_END", flush=True)
  87. return
  88. execution = discover_videos_for_demand(ctx, force=args.force)
  89. if execution.skipped:
  90. print("SKIPPED " + json.dumps({"skip_reason": execution.skip_reason}, ensure_ascii=False), flush=True)
  91. return
  92. agent_result = execution.agent_result
  93. if agent_result is None:
  94. raise SystemExit("Agent 未返回结果")
  95. print(
  96. "AGENT_REPORT "
  97. + json.dumps(
  98. {
  99. "run_id": execution.run_id,
  100. "iterations": agent_result.iterations,
  101. "content_chars": len(agent_result.content or ""),
  102. },
  103. ensure_ascii=False,
  104. ),
  105. flush=True,
  106. )
  107. print("FINAL_CONTENT_BEGIN", flush=True)
  108. print(agent_result.content or "", flush=True)
  109. print("FINAL_CONTENT_END", flush=True)
  110. if __name__ == "__main__":
  111. main()