""" 报告生成器 - 汇总辩论内容并生成决策报告 """ from typing import List from orchestrator.debate_manager import SpeechRecord from utils.llm_client import LLMClient class ReportGenerator: """决策报告生成器""" def __init__(self, llm_client: LLMClient = None): self.llm_client = llm_client or LLMClient() def generate_report( self, topic: str, speeches: List[SpeechRecord], context: str = "" ) -> str: """ 生成决策报告 Args: topic: 讨论议题 speeches: 所有发言记录 context: 背景信息 Returns: str: Markdown 格式的决策报告 """ # 构建发言摘要 speeches_text = self._format_speeches(speeches) system_prompt = """你是一位专业的决策分析师,擅长汇总多方观点并生成结构化的决策报告。 你的任务是根据多位专家的讨论,生成一份清晰、可操作的决策报告。 报告格式要求: 1. 使用 Markdown 格式 2. 结构清晰,重点突出 3. 提炼核心要点,不要罗列原文 4. 给出明确的建议和下一步行动""" user_prompt = f"""## 讨论议题 {topic} {f"## 背景信息" + chr(10) + context if context else ""} ## 专家讨论记录 {speeches_text} ## 你的任务 请生成一份决策报告,包含以下部分: ### 📋 议题概述 (1-2句话总结讨论的核心问题) ### ✅ 支持观点汇总 (列出支持该决策的主要理由,注明来源角色) ### ❌ 反对/风险观点汇总 (列出反对意见和风险点,注明来源角色) ### 🔑 关键决策要点 (3-5个需要重点考虑的因素) ### 💡 建议与下一步行动 (给出明确的建议,以及具体的下一步行动项) ### ⚖️ 决策框架 (提供一个简单的决策框架或检查清单,帮助做出最终决策) """ return self.llm_client.chat( system_prompt=system_prompt, user_prompt=user_prompt, max_tokens=2048 ) def _format_speeches(self, speeches: List[SpeechRecord]) -> str: """格式化发言记录""" formatted = [] current_round = 0 for speech in speeches: if speech.round_num != current_round: current_round = speech.round_num formatted.append(f"\n### 第 {current_round} 轮讨论\n") formatted.append( f"**{speech.emoji} {speech.agent_name}**:\n{speech.content}\n" ) return "\n".join(formatted) def generate_report_stream( self, topic: str, speeches: List[SpeechRecord], context: str = "" ): """流式生成决策报告""" speeches_text = self._format_speeches(speeches) system_prompt = """你是一位专业的决策分析师,擅长汇总多方观点并生成结构化的决策报告。""" user_prompt = f"""## 讨论议题 {topic} {f"## 背景信息" + chr(10) + context if context else ""} ## 专家讨论记录 {speeches_text} ## 你的任务 请生成一份决策报告,包含以下部分: ### 📋 议题概述 (1-2句话总结讨论的核心问题) ### ✅ 支持观点汇总 (列出支持该决策的主要理由,注明来源角色) ### ❌ 反对/风险观点汇总 (列出反对意见和风险点,注明来源角色) ### 🔑 关键决策要点 (3-5个需要重点考虑的因素) ### 💡 建议与下一步行动 (给出明确的建议,以及具体的下一步行动项) ### ⚖️ 决策框架 (提供一个简单的决策框架或检查清单) """ for chunk in self.llm_client.chat_stream( system_prompt=system_prompt, user_prompt=user_prompt, max_tokens=2048 ): yield chunk