| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- #!/usr/bin/env python3
- """单需求视频点位拓展判断 — 由任务层调用。"""
- from __future__ import annotations
- from dataclasses import dataclass
- from supply_agent.types import AgentResult, Role
- _POINT_TYPE_LABEL = {
- "inspiration": "灵感点",
- "purpose": "目的点",
- "key": "关键点",
- }
- @dataclass
- class VideoPoint:
- video_id: str
- point_type: str
- point_data: str | None
- point_desc: str | None
- @dataclass
- class DemandExpandContext:
- biz_dt: str
- run_id: str
- demand_grade_id: int
- demand_name: str
- grade: str
- score: float | None
- video_ids: list[str]
- points: list[VideoPoint]
- def build_expand_user_input(ctx: DemandExpandContext) -> str:
- """构建传给 Agent 的用户消息。"""
- score_text = f"{ctx.score:.2f}" if ctx.score is not None else "—"
- lines = [
- f"biz_dt={ctx.biz_dt}",
- f"run_id={ctx.run_id}",
- f"demand_grade_id={ctx.demand_grade_id}",
- f"demand_name={ctx.demand_name}",
- f"grade={ctx.grade}",
- f"score={score_text}",
- f"video_count={len(ctx.video_ids)}",
- "",
- "以下是从关联视频中提取的点位,请判断哪些可作为拓展需求:",
- ]
- for index, point in enumerate(ctx.points, start=1):
- type_label = _POINT_TYPE_LABEL.get(point.point_type, point.point_type)
- data_text = point.point_data or "—"
- desc_text = point.point_desc or "—"
- lines.append(
- f"[{index}|{type_label}|video={point.video_id}] "
- f"{data_text} | 描述: {desc_text}"
- )
- lines.extend(
- [
- "",
- "判断完成后调用 batch_save_demand_expansions 落库;",
- "将上述 biz_dt、demand_grade_id、demand_name、grade、run_id 原样传入工具。",
- "若无合适拓展,传 items=[]。",
- ]
- )
- return "\n".join(lines)
- def judge_demand_expansion(ctx: DemandExpandContext) -> AgentResult:
- """对单个需求执行拓展判断。"""
- from agents.demand_video_expand_agent.agent import create_demand_video_expand_agent
- agent = create_demand_video_expand_agent()
- user_input = build_expand_user_input(ctx)
- return agent.run(user_input)
- def extract_saved_count(result: AgentResult) -> int:
- """从 Agent 工具返回消息中解析保存条数。"""
- for msg in reversed(result.messages):
- if msg.role != Role.TOOL or not msg.content:
- continue
- text = str(msg.content)
- if "成功保存" not in text:
- continue
- try:
- part = text.split("成功保存", 1)[1].strip()
- return int(part.split("条", 1)[0].strip())
- except (IndexError, ValueError):
- continue
- return 0
|