import asyncio import json from agents import Agent, Runner from lib.my_trace import set_trace_smith as set_trace from lib.utils import read_json from agents import Agent, Runner, trace from lib.client import get_model MODEL_NAME = "google/gemini-2.5-flash" # 系统提示词:定义角色、能力、输出要求 SYSTEM_PROMPT = """ 你是一个小红书帖子创作方法论分析专家,擅长分析创作过程中的"手段"和"方法"。 你的能力: - 分析灵感点的获取途径和具体手段 - 分析目的点的确定方法和决策逻辑 - 分析关键点的形成过程和推导方法 - 分析选题的整合逻辑和形成路径 分析要求: 1. 基于已有的 what 解构结果(灵感点、目的点、关键点) 2. 深入分析"HOW"——创作者是通过什么手段、方法获得这些点的 3. 分析各个点之间的关联逻辑和推导过程 4. 总结可复用的创作方法论 输出格式: - 结构化的 JSON 格式 - 包含具体的手段、方法、步骤 - 包含推导逻辑和决策原理 """.strip() instructions = SYSTEM_PROMPT agent = Agent( name="How Deconstruction Expert", instructions=instructions, model=get_model(MODEL_NAME), tools=[], ) def build_how_analysis_message(post_data, what_result): """ 构造 how 分析的提示词 Args: post_data: 原始帖子数据 what_result: what 解构结果 Returns: 多模态消息列表 """ images = post_data.get('images', []) # 提取 what 结果的关键信息 inspiration_points = what_result.get('三点解构', {}).get('灵感点', {}).get('points', []) purpose = what_result.get('三点解构', {}).get('目的点', {}) key_points = what_result.get('三点解构', {}).get('关键点', {}).get('key_points', []) # 构造灵感点列表 inspiration_list = [] for idx, insp in enumerate(inspiration_points, 1): inspiration_list.append(f"{idx}. {insp.get('灵感点', '')}\n 描述:{insp.get('描述', '')}") # 构造关键点列表 key_point_list = [] for idx, kp in enumerate(key_points, 1): key_point_list.append(f"{idx}. {kp.get('关键点', '')} ({kp.get('类型', '')})") content = [] # 添加说明 content.append({ "type": "input_text", "text": "# HOW 业务解构任务\n\n你需要分析创作者是通过什么手段和方法完成创作的。" }) # 添加原始帖子图片 content.append({ "type": "input_text", "text": f"\n## 原始帖子(共{len(images)}张图片)" }) for img_url in images: content.append({ "type": "input_image", "detail": "auto", "image_url": img_url }) # 添加帖子文本 content.append({ "type": "input_text", "text": f""" ## 帖子基本信息 标题:{post_data.get('title', '')} 正文:{post_data.get('body_text', '')} """ }) # 添加 what 解构结果 content.append({ "type": "input_text", "text": f""" ## WHAT 解构结果 ### 灵感点列表 {chr(10).join(inspiration_list)} ### 目的点 {purpose.get('main_purpose', '')} 描述:{purpose.get('description', '')} ### 关键点列表 {chr(10).join(key_point_list)} """ }) # 添加 how 分析任务 content.append({ "type": "input_text", "text": """ ## 你的任务 请基于以上信息,深入分析创作过程中的"手段"和"方法",输出以下内容: ### 1. 灵感点获取分析 对每个灵感点,分析: - **来源途径**:这个灵感是从哪里来的?(生活观察、素材积累、热点追踪等) - **获取手段**:创作者用了什么具体方法获得这个灵感? - 主要方法(如:日常行为模式观察、表情包库浏览等) - 具体手段(列举3-4个具体步骤或操作) - 触发点(什么时刻产生的灵感) ### 2. 目的点确定分析 分析创作者如何确定这个目的: - **来源途径**:这个目的是基于什么确定的? - **确定手段**: - 主要方法(如:内容价值评估、受众分析等) - 具体手段(列举3-5个分析步骤) - 决策逻辑(如何从灵感点推导到目的点) ### 3. 关键点形成分析 分析灵感点和目的点如何推导出关键点: - **形成逻辑**:整体的推导思路 - **推导方法**: - 方法论名称(如:目标分解法、手段枚举法) - 具体过程(对每个关键点,说明如何从灵感点/目的点推导出来) - **关键点分类**:按内容层、形式层、传播层分类 ### 4. 选题形成分析 分析三点如何整合成选题: - **形成路径**:灵感点 → 目的点 → 关键点 → 选题 - **整合方法**: - 方法论(如:要素提取、逻辑串联、主题凝练) - 具体步骤(5个左右的步骤,每步说明手段、操作、结果) - **整合原理**:说明三点在选题中的作用和验证标准 ### 5. 创作流程总结 - 完整流程(从灵感获取到选题确定的全流程) - 核心方法论(每个阶段的关键方法) - 关键能力要求(需要具备什么能力) 请以 JSON 格式输出,结构清晰,包含所有分析维度。 """ }) return [{ "role": "user", "content": content }] async def main(): # 读取帖子数据 example_id = '689bf685000000001d0021d3' in_dir = f'examples/{example_id}/输入' out_dir = f'examples/{example_id}/输出' target_note_file = f'{in_dir}/待解构帖子.json' what_result_file = f'{in_dir}/what_解构结果.json' target_note = read_json(target_note_file) what_result = read_json(what_result_file) print("=" * 80) print("开始 HOW 业务解构") print("=" * 80) # 构造 how 分析消息 multimodal_messages = build_how_analysis_message( post_data=target_note, what_result=what_result ) # 运行 agent print("\n正在分析创作手段和方法...") result = await Runner.run(agent, input=multimodal_messages) print("\n" + "=" * 80) print("HOW 解构结果") print("=" * 80) print(result.final_output) # 尝试解析并保存结果 try: # 提取 JSON 内容(如果包含在 markdown 代码块中) output_text = result.final_output if "```json" in output_text: json_start = output_text.index("```json") + 7 json_end = output_text.index("```", json_start) json_text = output_text[json_start:json_end].strip() elif "```" in output_text: json_start = output_text.index("```") + 3 json_end = output_text.index("```", json_start) json_text = output_text[json_start:json_end].strip() else: json_text = output_text # 解析 JSON how_result = json.loads(json_text) # 保存结果 output_file = f'{out_dir}/how_解构结果_生成.json' with open(output_file, 'w', encoding='utf-8') as f: json.dump(how_result, f, ensure_ascii=False, indent=2) print(f"\n✓ 结果已保存到:{output_file}") except Exception as e: print(f"\n⚠ 无法解析 JSON 结果:{e}") print("请手动检查输出内容") if __name__ == "__main__": set_trace() with trace("how decode"): asyncio.run(main())