|
|
@@ -137,7 +137,7 @@ class AIReviewWorkflow:
|
|
|
workflow = StateGraph(AIReviewState)
|
|
|
workflow.add_node("start", self._start_node)
|
|
|
workflow.add_node("initialize_progress", self._initialize_progress_node)
|
|
|
- workflow.add_node("ai_review", self._ai_review_node)
|
|
|
+ #workflow.add_node("ai_review", self._ai_review_node)
|
|
|
workflow.add_node("ai_review_check_item",self._ai_review_node_check_item)
|
|
|
workflow.add_node("save_results", self._save_results_node) # 添加保存结果节点
|
|
|
workflow.add_node("complete", self._complete_node)
|
|
|
@@ -152,20 +152,20 @@ class AIReviewWorkflow:
|
|
|
self._should_check_item_or_dimensions,
|
|
|
{
|
|
|
"activate_ai_review_check_item": "ai_review_check_item", # 使用 review_item_config
|
|
|
- "activate_ai_review": "ai_review" # 使用 review_config
|
|
|
+ # "activate_ai_review": "ai_review" # 使用 review_config
|
|
|
}
|
|
|
)
|
|
|
|
|
|
- # 添加条件边(错误处理 + 终止检查)
|
|
|
- workflow.add_conditional_edges(
|
|
|
- "ai_review",
|
|
|
- self._should_terminate_or_error,
|
|
|
- {
|
|
|
- "terminate": "terminate", # 终止路径
|
|
|
- "success": "save_results", # 成功后先保存结果
|
|
|
- "error": "error_handler" # 错误处理
|
|
|
- }
|
|
|
- )
|
|
|
+ # # 添加条件边(错误处理 + 终止检查)
|
|
|
+ # workflow.add_conditional_edges(
|
|
|
+ # "ai_review",
|
|
|
+ # self._should_terminate_or_error,
|
|
|
+ # {
|
|
|
+ # "terminate": "terminate", # 终止路径
|
|
|
+ # "success": "save_results", # 成功后先保存结果
|
|
|
+ # "error": "error_handler" # 错误处理
|
|
|
+ # }
|
|
|
+ # )
|
|
|
|
|
|
# 添加条件边(错误处理 + 终止检查)
|
|
|
workflow.add_conditional_edges(
|
|
|
@@ -397,7 +397,8 @@ class AIReviewWorkflow:
|
|
|
all_check_items.extend(check_list) # 把每个分类的检查项加入总列表
|
|
|
|
|
|
# 统计所有 filtered_chunks 作为总块数(与实际处理的块数保持一致)
|
|
|
- total_chunks = len(filtered_chunks)
|
|
|
+ # 注意:+1 为目录审查单元(系统强制添加,不在用户配置的 review_item_config 中)
|
|
|
+ total_chunks = len(filtered_chunks) + 1
|
|
|
|
|
|
# 初始化issues列表
|
|
|
all_issues = []
|
|
|
@@ -452,6 +453,7 @@ class AIReviewWorkflow:
|
|
|
logger.info(f"章节 {chapter_code} 处理完成")
|
|
|
|
|
|
# 主流程完成后,串行处理 catalogue(目录审查)
|
|
|
+ # 注意:catalogue 是系统强制添加的审查单元,已计入 total_chunks
|
|
|
logger.info("开始处理目录审查(catalogue)")
|
|
|
chunks_completed, all_issues = await self.core_fun._process_chapter_item(
|
|
|
"catalogue", # chapter_code
|
|
|
@@ -510,237 +512,237 @@ class AIReviewWorkflow:
|
|
|
"messages": [AIMessage(content=f"AI审查项检查失败: {str(e)}")]
|
|
|
}
|
|
|
|
|
|
- async def _ai_review_node(self, state: AIReviewState) -> AIReviewState:
|
|
|
- """
|
|
|
- AI审查节点
|
|
|
-
|
|
|
- Args:
|
|
|
- state: AI审查状态
|
|
|
-
|
|
|
- Returns:
|
|
|
- AIReviewState: 更新后的审查状态
|
|
|
- """
|
|
|
- try:
|
|
|
- logger.info(f"AI审查节点开始执行,任务ID: {self.task_info.callback_task_id}")
|
|
|
-
|
|
|
- # ⚠️ 检查终止信号(执行前)
|
|
|
- if await self.workflow_manager.check_terminate_signal(state["callback_task_id"]):
|
|
|
- logger.warning(f"AI审查节点检测到终止信号,任务ID: {state['callback_task_id']}")
|
|
|
- return {
|
|
|
- "status": "terminated",
|
|
|
- "current_stage": "ai_review",
|
|
|
- "messages": [AIMessage(content="检测到终止信号")]
|
|
|
- }
|
|
|
-
|
|
|
- test_designation_chunk_flag = self.task_info.get_test_designation_chunk_flag()
|
|
|
- logger.debug(f"测试定位标志: {test_designation_chunk_flag}")
|
|
|
-
|
|
|
- # 1. 准备审查单元数据
|
|
|
- review_chunks, total_units = await self.core_fun._prepare_review_units(state, test_designation_chunk_flag)
|
|
|
-
|
|
|
- # 检查指定测试章节是否未找到
|
|
|
- if test_designation_chunk_flag is not None and not review_chunks:
|
|
|
- error_msg = f"AI审查测试失败:未找到指定审查标志「{test_designation_chunk_flag}」。请修改指定审查标识字段串,建议去除前后符号等(如书名号《》、括号()等),使用更简洁的关键词重新尝试。"
|
|
|
- logger.error(f"🔴 {error_msg}")
|
|
|
- return {
|
|
|
- "current_stage": "ai_review",
|
|
|
- "error_message": error_msg,
|
|
|
- "status": "failed",
|
|
|
- "messages": [AIMessage(content=error_msg)]
|
|
|
- }
|
|
|
-
|
|
|
- logger.info(f"准备审查单元完成,总单元数: {total_units}, 实际审查: {len(review_chunks)}")
|
|
|
-
|
|
|
- if not review_chunks:
|
|
|
- logger.warning(f"没有可审查的单元,任务ID: {state['callback_task_id']}")
|
|
|
- return {
|
|
|
- "current_stage": "ai_review",
|
|
|
- "error_message": "没有可审查的单元",
|
|
|
- "status": "failed",
|
|
|
- "messages": [AIMessage(content=f"没有可审查的单元,任务ID: {state['callback_task_id']}")]
|
|
|
- }
|
|
|
-
|
|
|
- logger.info(f"开始核心审查,任务ID: {state['callback_task_id']}")
|
|
|
- await self.core_fun._send_start_review_progress(state, total_units,'core_review')
|
|
|
- # 2. 执行基础并发审查(内部会检测终止信号)
|
|
|
- logger.info(f"开始执行并发审查,任务ID: {state['callback_task_id']}")
|
|
|
- successful_results = await self.core_fun._execute_concurrent_reviews(
|
|
|
- review_chunks, total_units, state, check_terminate=True
|
|
|
- )
|
|
|
- logger.info(f"并发审查完成,成功结果: {len(successful_results)}, 任务ID: {state['callback_task_id']}")
|
|
|
-
|
|
|
- # ⚠️ 再次检查终止信号(并发审查后)
|
|
|
- if await self.workflow_manager.check_terminate_signal(state["callback_task_id"]):
|
|
|
- logger.warning(f"AI审查节点并发审查后检测到终止信号,任务ID: {state['callback_task_id']}")
|
|
|
- return {
|
|
|
- "status": "terminated",
|
|
|
- "current_stage": "ai_review",
|
|
|
- "messages": [AIMessage(content="检测到终止信号")]
|
|
|
- }
|
|
|
-
|
|
|
- # 开始条文完整性审查
|
|
|
+ # async def _ai_review_node(self, state: AIReviewState) -> AIReviewState:
|
|
|
+ # """
|
|
|
+ # AI审查节点
|
|
|
+
|
|
|
+ # Args:
|
|
|
+ # state: AI审查状态
|
|
|
+
|
|
|
+ # Returns:
|
|
|
+ # AIReviewState: 更新后的审查状态
|
|
|
+ # """
|
|
|
+ # try:
|
|
|
+ # logger.info(f"AI审查节点开始执行,任务ID: {self.task_info.callback_task_id}")
|
|
|
+
|
|
|
+ # # ⚠️ 检查终止信号(执行前)
|
|
|
+ # if await self.workflow_manager.check_terminate_signal(state["callback_task_id"]):
|
|
|
+ # logger.warning(f"AI审查节点检测到终止信号,任务ID: {state['callback_task_id']}")
|
|
|
+ # return {
|
|
|
+ # "status": "terminated",
|
|
|
+ # "current_stage": "ai_review",
|
|
|
+ # "messages": [AIMessage(content="检测到终止信号")]
|
|
|
+ # }
|
|
|
+
|
|
|
+ # test_designation_chunk_flag = self.task_info.get_test_designation_chunk_flag()
|
|
|
+ # logger.debug(f"测试定位标志: {test_designation_chunk_flag}")
|
|
|
+
|
|
|
+ # # 1. 准备审查单元数据
|
|
|
+ # review_chunks, total_units = await self.core_fun._prepare_review_units(state, test_designation_chunk_flag)
|
|
|
+
|
|
|
+ # # 检查指定测试章节是否未找到
|
|
|
+ # if test_designation_chunk_flag is not None and not review_chunks:
|
|
|
+ # error_msg = f"AI审查测试失败:未找到指定审查标志「{test_designation_chunk_flag}」。请修改指定审查标识字段串,建议去除前后符号等(如书名号《》、括号()等),使用更简洁的关键词重新尝试。"
|
|
|
+ # logger.error(f"🔴 {error_msg}")
|
|
|
+ # return {
|
|
|
+ # "current_stage": "ai_review",
|
|
|
+ # "error_message": error_msg,
|
|
|
+ # "status": "failed",
|
|
|
+ # "messages": [AIMessage(content=error_msg)]
|
|
|
+ # }
|
|
|
+
|
|
|
+ # logger.info(f"准备审查单元完成,总单元数: {total_units}, 实际审查: {len(review_chunks)}")
|
|
|
+
|
|
|
+ # if not review_chunks:
|
|
|
+ # logger.warning(f"没有可审查的单元,任务ID: {state['callback_task_id']}")
|
|
|
+ # return {
|
|
|
+ # "current_stage": "ai_review",
|
|
|
+ # "error_message": "没有可审查的单元",
|
|
|
+ # "status": "failed",
|
|
|
+ # "messages": [AIMessage(content=f"没有可审查的单元,任务ID: {state['callback_task_id']}")]
|
|
|
+ # }
|
|
|
+
|
|
|
+ # logger.info(f"开始核心审查,任务ID: {state['callback_task_id']}")
|
|
|
+ # await self.core_fun._send_start_review_progress(state, total_units,'core_review')
|
|
|
+ # # 2. 执行基础并发审查(内部会检测终止信号)
|
|
|
+ # logger.info(f"开始执行并发审查,任务ID: {state['callback_task_id']}")
|
|
|
+ # successful_results = await self.core_fun._execute_concurrent_reviews(
|
|
|
+ # review_chunks, total_units, state, check_terminate=True
|
|
|
+ # )
|
|
|
+ # logger.info(f"并发审查完成,成功结果: {len(successful_results)}, 任务ID: {state['callback_task_id']}")
|
|
|
+
|
|
|
+ # # ⚠️ 再次检查终止信号(并发审查后)
|
|
|
+ # if await self.workflow_manager.check_terminate_signal(state["callback_task_id"]):
|
|
|
+ # logger.warning(f"AI审查节点并发审查后检测到终止信号,任务ID: {state['callback_task_id']}")
|
|
|
+ # return {
|
|
|
+ # "status": "terminated",
|
|
|
+ # "current_stage": "ai_review",
|
|
|
+ # "messages": [AIMessage(content="检测到终止信号")]
|
|
|
+ # }
|
|
|
+
|
|
|
+ # # 开始条文完整性审查
|
|
|
|
|
|
|
|
|
- # 开始大纲审查
|
|
|
- await self.core_fun._send_start_review_progress(state, total_units,'outline')
|
|
|
- completeness_check = "completeness_check" in self.task_info.get_review_config_list()
|
|
|
- if not completeness_check:
|
|
|
- logger.info(f"跳过执行大纲审查")
|
|
|
- else:
|
|
|
- # 3. 执行大纲审查
|
|
|
- logger.info(f"开始执行大纲审查")
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- check_completeness_result = await self.ai_review_engine.check_completeness(
|
|
|
- trace_id_idx = state["callback_task_id"],
|
|
|
- review_content = state["structured_content"]["chunks"],
|
|
|
- state = state,
|
|
|
- stage_name = state.get("stage_name", "完整性审查")
|
|
|
- )
|
|
|
- outline_review_result = {}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- # # 4. 执行编制依据审查
|
|
|
- # #await self.core_fun._send_start_review_progress(state, total_units,'prpe_basis')
|
|
|
- reference_check = "reference_check" in self.task_info.get_review_config_list()
|
|
|
- timeliness_check = "timeliness_check" in self.task_info.get_review_config_list()
|
|
|
- reference_check_result = None
|
|
|
- timeliness_check_result = None
|
|
|
-
|
|
|
- # 统一提取一次编制依据内容(任一审查开启时才提取)
|
|
|
- basis_content = ""
|
|
|
- basis_items = None
|
|
|
- if reference_check or timeliness_check:
|
|
|
- prep_basis_content = self._extract_prep_basis_content(state["structured_content"])
|
|
|
- if prep_basis_content:
|
|
|
- try:
|
|
|
- basis_items = await extract_basis_with_langchain_qwen(
|
|
|
- progress_manager=state.get("progress_manager"),
|
|
|
- callback_task_id=state.get("callback_task_id"),
|
|
|
- text=prep_basis_content,
|
|
|
- )
|
|
|
- basis_content = "\n".join(
|
|
|
- [
|
|
|
- item.raw
|
|
|
- for item in getattr(basis_items, "items", [])
|
|
|
- if getattr(item, "raw", None)
|
|
|
- ]
|
|
|
- ).strip()
|
|
|
- if not basis_content:
|
|
|
- basis_content = prep_basis_content
|
|
|
- logger.info(
|
|
|
- f"编制依据AI提取完成,条数: {len(getattr(basis_items, 'items', []))}"
|
|
|
- )
|
|
|
- except Exception as e:
|
|
|
- logger.error(f"编制依据AI提取失败,回退原文: {e}", exc_info=True)
|
|
|
- basis_content = prep_basis_content
|
|
|
- else:
|
|
|
- logger.warning(f"未找到编制依据内容,跳过编制依据审查准备")
|
|
|
-
|
|
|
- logger.info(f"执行编制依据审查")
|
|
|
- if not reference_check:
|
|
|
- logger.info(f"跳过执行编制依据审查")
|
|
|
- else:
|
|
|
- if basis_content:
|
|
|
- logger.info(f"开始执行编制依据审查")
|
|
|
-
|
|
|
- prep_basis_review_data = {
|
|
|
- 'content': basis_content,
|
|
|
- 'basis_items': basis_items,
|
|
|
- 'max_concurrent': self.max_concurrent
|
|
|
- }
|
|
|
-
|
|
|
- reference_check_result = await self.ai_review_engine.reference_basis_reviewer(
|
|
|
- review_data=prep_basis_review_data,
|
|
|
- trace_id=state["callback_task_id"],
|
|
|
- state=state,
|
|
|
- stage_name="编制依据审查"
|
|
|
- )
|
|
|
- else:
|
|
|
- logger.warning(f"未找到编制依据内容,跳过编制依据审查")
|
|
|
-
|
|
|
- logger.info(f"执行编制依据审查(时效性)")
|
|
|
- if not timeliness_check:
|
|
|
- logger.info(f"跳过执行编制依据审查(时效性)")
|
|
|
- else:
|
|
|
- if basis_content:
|
|
|
- logger.info(f"开始执行编制依据审查(时效性)")
|
|
|
-
|
|
|
- timeliness_check_data = {
|
|
|
- 'content': basis_content,
|
|
|
- 'basis_items': basis_items,
|
|
|
- 'max_concurrent': self.max_concurrent
|
|
|
- }
|
|
|
-
|
|
|
- timeliness_check_result = await self.ai_review_engine.timeliness_basis_reviewer(
|
|
|
- review_data=timeliness_check_data,
|
|
|
- trace_id=state["callback_task_id"],
|
|
|
- state=state,
|
|
|
- stage_name="编制依据审查"
|
|
|
- )
|
|
|
- else:
|
|
|
- logger.warning(f"未找到编制依据内容,跳过编制依据审查(时效性)")
|
|
|
-
|
|
|
-
|
|
|
- # 6. 汇总结果
|
|
|
- summary = self.inter_tool._aggregate_results(successful_results)
|
|
|
-
|
|
|
- # 将所有单元的issues合并成一个列表
|
|
|
- all_issues = []
|
|
|
- if completeness_check:
|
|
|
- all_issues.append(outline_review_result)
|
|
|
- all_issues.append(check_completeness_result)
|
|
|
- if reference_check and reference_check_result:
|
|
|
- all_issues.append(reference_check_result)
|
|
|
- if timeliness_check and timeliness_check_result:
|
|
|
- all_issues.append(timeliness_check_result)
|
|
|
- for unit_issues in successful_results:
|
|
|
- if unit_issues and isinstance(unit_issues, list):
|
|
|
- all_issues.extend(unit_issues)
|
|
|
-
|
|
|
- # 构建符合格式的review_results(兼容 execute() 方法的期望格式)
|
|
|
- review_results = {
|
|
|
- # 兼容旧版格式的字段
|
|
|
- "total_units": total_units,
|
|
|
- "successful_units": len(successful_results),
|
|
|
- "failed_units": max(0, total_units - len(successful_results)),
|
|
|
- "review_results": all_issues, # 审查结果列表
|
|
|
- "summary": summary,
|
|
|
-
|
|
|
- # 额外的元信息
|
|
|
- "callback_task_id": state["callback_task_id"],
|
|
|
- "file_name": state.get("file_name", ""),
|
|
|
- "user_id": state["user_id"],
|
|
|
- "current": 100,
|
|
|
- "stage_name": "完整审查结果",
|
|
|
- "status": "full_review_result",
|
|
|
- "message": f"审查完成,共发现{summary.get('total_issues', 0)}个问题",
|
|
|
- "updated_at": int(time.time())
|
|
|
- }
|
|
|
-
|
|
|
- logger.info(f"AI审查节点执行成功,任务ID: {state['callback_task_id']}, 总单元数: {total_units}, 成功: {len(successful_results)}")
|
|
|
-
|
|
|
- # 返回新的状态,避免原地修改导致的LangGraph冲突
|
|
|
- return {
|
|
|
- "current_stage": "ai_review_completed",
|
|
|
- "review_results": review_results,
|
|
|
- "status": "completed",
|
|
|
- "messages": [AIMessage(content="AI审查完成")]
|
|
|
- }
|
|
|
-
|
|
|
- except Exception as e:
|
|
|
- logger.error(f"AI审查节点执行失败,任务ID: {state['callback_task_id']}, 错误: {str(e)}", exc_info=True)
|
|
|
-
|
|
|
- # 返回错误状态
|
|
|
- return {
|
|
|
- "current_stage": "ai_review_failed",
|
|
|
- "error_message": str(e),
|
|
|
- "status": "failed",
|
|
|
- "messages": [AIMessage(content=f"AI审查失败: {str(e)}")]
|
|
|
- }
|
|
|
+ # # 开始大纲审查
|
|
|
+ # await self.core_fun._send_start_review_progress(state, total_units,'outline')
|
|
|
+ # completeness_check = "completeness_check" in self.task_info.get_review_config_list()
|
|
|
+ # if not completeness_check:
|
|
|
+ # logger.info(f"跳过执行大纲审查")
|
|
|
+ # else:
|
|
|
+ # # 3. 执行大纲审查
|
|
|
+ # logger.info(f"开始执行大纲审查")
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ # check_completeness_result = await self.ai_review_engine.check_completeness(
|
|
|
+ # trace_id_idx = state["callback_task_id"],
|
|
|
+ # review_content = state["structured_content"]["chunks"],
|
|
|
+ # state = state,
|
|
|
+ # stage_name = state.get("stage_name", "完整性审查")
|
|
|
+ # )
|
|
|
+ # outline_review_result = {}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ # # # 4. 执行编制依据审查
|
|
|
+ # # #await self.core_fun._send_start_review_progress(state, total_units,'prpe_basis')
|
|
|
+ # reference_check = "reference_check" in self.task_info.get_review_config_list()
|
|
|
+ # timeliness_check = "timeliness_check" in self.task_info.get_review_config_list()
|
|
|
+ # reference_check_result = None
|
|
|
+ # timeliness_check_result = None
|
|
|
+
|
|
|
+ # # 统一提取一次编制依据内容(任一审查开启时才提取)
|
|
|
+ # basis_content = ""
|
|
|
+ # basis_items = None
|
|
|
+ # if reference_check or timeliness_check:
|
|
|
+ # prep_basis_content = self._extract_prep_basis_content(state["structured_content"])
|
|
|
+ # if prep_basis_content:
|
|
|
+ # try:
|
|
|
+ # basis_items = await extract_basis_with_langchain_qwen(
|
|
|
+ # progress_manager=state.get("progress_manager"),
|
|
|
+ # callback_task_id=state.get("callback_task_id"),
|
|
|
+ # text=prep_basis_content,
|
|
|
+ # )
|
|
|
+ # basis_content = "\n".join(
|
|
|
+ # [
|
|
|
+ # item.raw
|
|
|
+ # for item in getattr(basis_items, "items", [])
|
|
|
+ # if getattr(item, "raw", None)
|
|
|
+ # ]
|
|
|
+ # ).strip()
|
|
|
+ # if not basis_content:
|
|
|
+ # basis_content = prep_basis_content
|
|
|
+ # logger.info(
|
|
|
+ # f"编制依据AI提取完成,条数: {len(getattr(basis_items, 'items', []))}"
|
|
|
+ # )
|
|
|
+ # except Exception as e:
|
|
|
+ # logger.error(f"编制依据AI提取失败,回退原文: {e}", exc_info=True)
|
|
|
+ # basis_content = prep_basis_content
|
|
|
+ # else:
|
|
|
+ # logger.warning(f"未找到编制依据内容,跳过编制依据审查准备")
|
|
|
+
|
|
|
+ # logger.info(f"执行编制依据审查")
|
|
|
+ # if not reference_check:
|
|
|
+ # logger.info(f"跳过执行编制依据审查")
|
|
|
+ # else:
|
|
|
+ # if basis_content:
|
|
|
+ # logger.info(f"开始执行编制依据审查")
|
|
|
+
|
|
|
+ # prep_basis_review_data = {
|
|
|
+ # 'content': basis_content,
|
|
|
+ # 'basis_items': basis_items,
|
|
|
+ # 'max_concurrent': self.max_concurrent
|
|
|
+ # }
|
|
|
+
|
|
|
+ # reference_check_result = await self.ai_review_engine.reference_basis_reviewer(
|
|
|
+ # review_data=prep_basis_review_data,
|
|
|
+ # trace_id=state["callback_task_id"],
|
|
|
+ # state=state,
|
|
|
+ # stage_name="编制依据审查"
|
|
|
+ # )
|
|
|
+ # else:
|
|
|
+ # logger.warning(f"未找到编制依据内容,跳过编制依据审查")
|
|
|
+
|
|
|
+ # logger.info(f"执行编制依据审查(时效性)")
|
|
|
+ # if not timeliness_check:
|
|
|
+ # logger.info(f"跳过执行编制依据审查(时效性)")
|
|
|
+ # else:
|
|
|
+ # if basis_content:
|
|
|
+ # logger.info(f"开始执行编制依据审查(时效性)")
|
|
|
+
|
|
|
+ # timeliness_check_data = {
|
|
|
+ # 'content': basis_content,
|
|
|
+ # 'basis_items': basis_items,
|
|
|
+ # 'max_concurrent': self.max_concurrent
|
|
|
+ # }
|
|
|
+
|
|
|
+ # timeliness_check_result = await self.ai_review_engine.timeliness_basis_reviewer(
|
|
|
+ # review_data=timeliness_check_data,
|
|
|
+ # trace_id=state["callback_task_id"],
|
|
|
+ # state=state,
|
|
|
+ # stage_name="编制依据审查"
|
|
|
+ # )
|
|
|
+ # else:
|
|
|
+ # logger.warning(f"未找到编制依据内容,跳过编制依据审查(时效性)")
|
|
|
+
|
|
|
+
|
|
|
+ # # 6. 汇总结果
|
|
|
+ # summary = self.inter_tool._aggregate_results(successful_results)
|
|
|
+
|
|
|
+ # # 将所有单元的issues合并成一个列表
|
|
|
+ # all_issues = []
|
|
|
+ # if completeness_check:
|
|
|
+ # all_issues.append(outline_review_result)
|
|
|
+ # all_issues.append(check_completeness_result)
|
|
|
+ # if reference_check and reference_check_result:
|
|
|
+ # all_issues.append(reference_check_result)
|
|
|
+ # if timeliness_check and timeliness_check_result:
|
|
|
+ # all_issues.append(timeliness_check_result)
|
|
|
+ # for unit_issues in successful_results:
|
|
|
+ # if unit_issues and isinstance(unit_issues, list):
|
|
|
+ # all_issues.extend(unit_issues)
|
|
|
+
|
|
|
+ # # 构建符合格式的review_results(兼容 execute() 方法的期望格式)
|
|
|
+ # review_results = {
|
|
|
+ # # 兼容旧版格式的字段
|
|
|
+ # "total_units": total_units,
|
|
|
+ # "successful_units": len(successful_results),
|
|
|
+ # "failed_units": max(0, total_units - len(successful_results)),
|
|
|
+ # "review_results": all_issues, # 审查结果列表
|
|
|
+ # "summary": summary,
|
|
|
+
|
|
|
+ # # 额外的元信息
|
|
|
+ # "callback_task_id": state["callback_task_id"],
|
|
|
+ # "file_name": state.get("file_name", ""),
|
|
|
+ # "user_id": state["user_id"],
|
|
|
+ # "current": 100,
|
|
|
+ # "stage_name": "完整审查结果",
|
|
|
+ # "status": "full_review_result",
|
|
|
+ # "message": f"审查完成,共发现{summary.get('total_issues', 0)}个问题",
|
|
|
+ # "updated_at": int(time.time())
|
|
|
+ # }
|
|
|
+
|
|
|
+ # logger.info(f"AI审查节点执行成功,任务ID: {state['callback_task_id']}, 总单元数: {total_units}, 成功: {len(successful_results)}")
|
|
|
+
|
|
|
+ # # 返回新的状态,避免原地修改导致的LangGraph冲突
|
|
|
+ # return {
|
|
|
+ # "current_stage": "ai_review_completed",
|
|
|
+ # "review_results": review_results,
|
|
|
+ # "status": "completed",
|
|
|
+ # "messages": [AIMessage(content="AI审查完成")]
|
|
|
+ # }
|
|
|
+
|
|
|
+ # except Exception as e:
|
|
|
+ # logger.error(f"AI审查节点执行失败,任务ID: {state['callback_task_id']}, 错误: {str(e)}", exc_info=True)
|
|
|
+
|
|
|
+ # # 返回错误状态
|
|
|
+ # return {
|
|
|
+ # "current_stage": "ai_review_failed",
|
|
|
+ # "error_message": str(e),
|
|
|
+ # "status": "failed",
|
|
|
+ # "messages": [AIMessage(content=f"AI审查失败: {str(e)}")]
|
|
|
+ # }
|
|
|
|
|
|
async def _save_results_node(self, state: AIReviewState) -> AIReviewState:
|
|
|
"""
|