diff --git a/MediaEngine/agent.py b/MediaEngine/agent.py index c66effa..3eb8c1f 100644 --- a/MediaEngine/agent.py +++ b/MediaEngine/agent.py @@ -263,7 +263,12 @@ class DeepSearchAgent: logger.info(" - 未找到搜索结果") # 更新状态中的搜索历史 - paragraph.research.add_search_results(search_query, search_results) + paragraph.research.add_search_results( + search_query, + search_results, + search_tool=search_tool, + paragraph_title=paragraph.title, + ) # 生成初始总结 logger.info(" - 生成初始总结...") @@ -341,7 +346,12 @@ class DeepSearchAgent: logger.info(" 未找到反思搜索结果") # 更新搜索历史 - paragraph.research.add_search_results(search_query, search_results) + paragraph.research.add_search_results( + search_query, + search_results, + search_tool=search_tool, + paragraph_title=paragraph.title, + ) # 生成反思总结 reflection_summary_input = { diff --git a/MediaEngine/state/state.py b/MediaEngine/state/state.py index dfb00d9..1dcf3ce 100644 --- a/MediaEngine/state/state.py +++ b/MediaEngine/state/state.py @@ -17,6 +17,9 @@ class Search: title: str = "" # 搜索结果标题 content: str = "" # 搜索返回的内容 score: Optional[float] = None # 相关度评分 + paragraph_title: str = "" # 段落标题,便于展示归属 + search_tool: str = "" # 使用的搜索工具 + has_result: bool = True # 是否有返回结果 timestamp: str = field(default_factory=lambda: datetime.now().isoformat()) def to_dict(self) -> Dict[str, Any]: @@ -27,6 +30,9 @@ class Search: "title": self.title, "content": self.content, "score": self.score, + "paragraph_title": self.paragraph_title, + "search_tool": self.search_tool, + "has_result": self.has_result, "timestamp": self.timestamp } @@ -39,6 +45,9 @@ class Search: title=data.get("title", ""), content=data.get("content", ""), score=data.get("score"), + paragraph_title=data.get("paragraph_title", ""), + search_tool=data.get("search_tool", ""), + has_result=data.get("has_result", True), timestamp=data.get("timestamp", datetime.now().isoformat()) ) @@ -55,23 +64,42 @@ class Research: """添加搜索记录""" self.search_history.append(search) - def add_search_results(self, query: str, results: List[Dict[str, Any]]): + def add_search_results(self, query: str, results: List[Dict[str, Any]], search_tool: str = "", paragraph_title: str = ""): """批量添加搜索结果""" + if not results: + # 记录一次“无结果”搜索,方便前端显示搜索轨迹 + self.add_search( + Search( + query=query or "", + title="未找到结果", + content="本次搜索未返回结果或调用失败", + url="", + score=None, + paragraph_title=paragraph_title, + search_tool=search_tool, + has_result=False, + ) + ) + return + for result in results: - # 防御空值,避免下游展示时报错 url = result.get("url") or "" title = result.get("title") or "" - content = result.get("content") or "" + content = result.get("content") or result.get("raw_content") or "" if not isinstance(content, str): content = str(content) - search = Search( - query=query or "", - url=url, - title=title, - content=content, - score=result.get("score") + self.add_search( + Search( + query=query or "", + url=url, + title=title, + content=content, + score=result.get("score"), + paragraph_title=paragraph_title or result.get("paragraph_title", ""), + search_tool=search_tool or result.get("search_tool", ""), + has_result=True, + ) ) - self.add_search(search) def get_search_count(self) -> int: """获取搜索次数""" diff --git a/SingleEngineApp/media_engine_streamlit_app.py b/SingleEngineApp/media_engine_streamlit_app.py index 2a6c4b0..6666903 100644 --- a/SingleEngineApp/media_engine_streamlit_app.py +++ b/SingleEngineApp/media_engine_streamlit_app.py @@ -222,14 +222,21 @@ def display_results(agent: DeepSearchAgent, final_report: str): for i, search in enumerate(all_searches): query_label = search.query if search.query else "未记录查询" with st.expander(f"搜索 {i + 1}: {query_label}"): + paragraph_title = getattr(search, "paragraph_title", "") or "未标注段落" + search_tool = getattr(search, "search_tool", "") or "未标注工具" + has_result = getattr(search, "has_result", True) + st.write("**段落:**", paragraph_title) + st.write("**使用的工具:**", search_tool) preview = search.content or "" if not isinstance(preview, str): preview = str(preview) if len(preview) > 200: preview = preview[:200] + "..." - st.write("**URL:**", search.url) - st.write("**标题:**", search.title) + st.write("**URL:**", search.url or "无") + st.write("**标题:**", search.title or "无") st.write("**内容预览:**", preview if preview else "无可用内容") + if not has_result: + st.info("本次搜索未返回结果") if search.score: st.write("**相关度评分:**", search.score)