"""从 demand_grade + demand_video_expansion 选取一条记录,调用 find_agent。""" from __future__ import annotations import argparse import json import logging from agents.find_agent.demand_run import ( build_find_agent_user_input, build_run_input_payload, discover_videos_for_demand, list_find_demand_contexts, pick_find_demand_context, serialize_find_demand_context, ) logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", ) logger = logging.getLogger(__name__) def _load_target_context(args: argparse.Namespace): if args.list_only: biz_dt, contexts = list_find_demand_contexts(args.biz_dt) print( json.dumps( { "biz_dt": biz_dt, "total": len(contexts), "items": [serialize_find_demand_context(ctx) for ctx in contexts], }, ensure_ascii=False, indent=2, ) ) return None ctx = pick_find_demand_context( args.biz_dt, index=args.index, demand_grade_id=args.demand_grade_id, ) if ctx is None: biz_dt, contexts = list_find_demand_contexts(args.biz_dt) raise SystemExit( "未找到匹配的待执行记录。" f" biz_dt={biz_dt}, total={len(contexts)}, index={args.index}," f" demand_grade_id={args.demand_grade_id}" ) return ctx def main() -> None: parser = argparse.ArgumentParser( description="从 S/A 需求拓展点位中选取一条记录,调用 find_agent。", ) parser.add_argument("--biz-dt", help="业务日 YYYYMMDD,默认取最新 demand_grade.biz_dt") parser.add_argument( "--index", type=int, default=0, help="在未指定 demand_grade_id 时,选取第几条记录(从 0 开始)", ) parser.add_argument("--demand-grade-id", type=int, help="指定 demand_grade.id") parser.add_argument( "--list-only", action="store_true", help="只列出可执行记录,不调用 Agent", ) parser.add_argument( "--dry-run", action="store_true", help="只打印组装后的上下文与 prompt,不调用 Agent", ) parser.add_argument( "--force", action="store_true", help="忽略当天已执行记录,强制重跑", ) args = parser.parse_args() ctx = _load_target_context(args) if ctx is None: return summary = serialize_find_demand_context(ctx) run_payload = build_run_input_payload(ctx) print("CONTEXT " + json.dumps(summary, ensure_ascii=False), flush=True) print("RUN_PAYLOAD " + json.dumps(run_payload, ensure_ascii=False), flush=True) if args.dry_run: user_input = build_find_agent_user_input(ctx, "") print("PROMPT_BEGIN", flush=True) print(user_input, flush=True) print("PROMPT_END", flush=True) return execution = discover_videos_for_demand(ctx, force=args.force) if execution.skipped: print("SKIPPED " + json.dumps({"skip_reason": execution.skip_reason}, ensure_ascii=False), flush=True) return agent_result = execution.agent_result if agent_result is None: raise SystemExit("Agent 未返回结果") print( "AGENT_REPORT " + json.dumps( { "run_id": execution.run_id, "iterations": agent_result.iterations, "content_chars": len(agent_result.content or ""), }, ensure_ascii=False, ), flush=True, ) print("FINAL_CONTENT_BEGIN", flush=True) print(agent_result.content or "", flush=True) print("FINAL_CONTENT_END", flush=True) if __name__ == "__main__": main()