Pārlūkot izejas kodu

v0.0.4-修复LangGraph并发更新问题

WangXuMing 2 mēneši atpakaļ
vecāks
revīzija
071b3028a5

+ 5 - 0
core/construction_review/component/ai_review_engine.py

@@ -236,6 +236,11 @@ class AIReviewEngine(BaseReviewer):
         except Exception as e:
             logger.warning(f"大纲审查失败,但返回提取结果: {str(e)}")
             outline_review_result = None
+
+        # 确保目录存在
+        import os
+        os.makedirs("temp/outline_result_temp", exist_ok=True)
+
         with open("temp/outline_result_temp/outline_result.json","w",encoding="utf-8") as f:
             json.dump(outline_review_result,f,ensure_ascii=False,indent=4)
         # 返回提取的大纲结果和审查结果

+ 32 - 32
core/construction_review/workflows/ai_review_workflow.py

@@ -225,11 +225,11 @@ class AIReviewWorkflow:
         """开始节点"""
         logger.info(f"AI审查工作流正在启动...: {state['file_id']}")
 
-        state["current_stage"] = "start"
-        state["status"] = "processing"
-        state["messages"].append(AIMessage(content=""))
-
-        return state
+        return {
+            "current_stage": "start",
+            "status": "processing",
+            "messages": [AIMessage(content="")]
+        }
 
     async def _initialize_progress_node(self, state: AIReviewState) -> AIReviewState:
         """初始化进度节点"""
@@ -252,9 +252,9 @@ class AIReviewWorkflow:
         else:
             logger.warning(f"AI审查工作流中未找到ProgressManager: {state.get('progress_manager', 'None')}")
 
-        state["messages"].append(AIMessage(content="进度初始化完成"))
-
-        return state
+        return {
+            "messages": [AIMessage(content="进度初始化完成")]
+        }
     
     async def _ai_review_node(self, state: AIReviewState) -> AIReviewState:
         """
@@ -276,10 +276,10 @@ class AIReviewWorkflow:
             if not review_chunks:
                 logger.warning(f"没有可审查的单元,任务ID: {state['callback_task_id']}")
                 return {
-                    **state,
                     "current_stage": "ai_review",
                     "error_message": "没有可审查的单元",
-                    "status": "failed"
+                    "status": "failed",
+                    "messages": [AIMessage(content=f"没有可审查的单元,任务ID: {state['callback_task_id']}")]
                 }
 
             # 2. 发送开始审查进度
@@ -359,11 +359,10 @@ class AIReviewWorkflow:
 
             # 返回新的状态,避免原地修改导致的LangGraph冲突
             return {
-                **state,
                 "current_stage": "ai_review_completed",
                 "review_results": review_results,
                 "status": "completed",
-                "messages": state["messages"] + [AIMessage(content="AI审查完成")]
+                "messages": [AIMessage(content="AI审查完成")]
             }
 
         except Exception as e:
@@ -371,11 +370,10 @@ class AIReviewWorkflow:
 
             # 返回错误状态
             return {
-                **state,
                 "current_stage": "ai_review_failed",
                 "error_message": str(e),
                 "status": "failed",
-                "messages": state["messages"] + [AIMessage(content=f"AI审查失败: {str(e)}")]
+                "messages": [AIMessage(content=f"AI审查失败: {str(e)}")]
             }
 
     async def _save_results_node(self, state: AIReviewState) -> AIReviewState:
@@ -424,16 +422,19 @@ class AIReviewWorkflow:
             #         event_type="processing"
             #     )
 
-            # state["current_stage"] = "save_results"
-            # state["messages"].append(AIMessage(content=f"审查结果已保存到: {file_path}"))
-
-            return state
+            return {
+                "current_stage": "save_results",
+                "messages": [AIMessage(content=f"审查结果已保存到: {file_path}")]
+            }
 
         except Exception as e:
             logger.error(f"保存审查结果失败: {str(e)}", exc_info=True)
-            state["error_message"] = f"保存结果失败: {str(e)}"
-            state["messages"].append(AIMessage(content=f"保存结果失败: {str(e)}"))
-            return state
+            return {
+                "current_stage": "save_results_failed",
+                "error_message": f"保存结果失败: {str(e)}",
+                "status": "failed",
+                "messages": [AIMessage(content=f"保存结果失败: {str(e)}")]
+            }
 
     async def _complete_node(self, state: AIReviewState) -> AIReviewState:
         """
@@ -451,9 +452,6 @@ class AIReviewWorkflow:
         """
         logger.info(f"AI审查完成: {state['file_id']}")
 
-        state["current_stage"] = "complete"
-        state["status"] = "completed"
-
         # 更新完成状态
         if state["progress_manager"]:
             await state["progress_manager"].update_stage_progress(
@@ -466,9 +464,11 @@ class AIReviewWorkflow:
                 event_type="processing"
             )
 
-        state["messages"].append(AIMessage(content="AI审查工作流完成"))
-
-        return state
+        return {
+            "current_stage": "complete",
+            "status": "completed",
+            "messages": [AIMessage(content="AI审查工作流完成")]
+        }
 
     async def _error_handler_node(self, state: AIReviewState) -> AIReviewState:
         """
@@ -501,11 +501,11 @@ class AIReviewWorkflow:
                 event_type="error"
             )
 
-        state["messages"].append(AIMessage(
-            content=f"错误处理: {state['error_message']}"
-        ))
-
-        return state
+        return {
+            "status": "failed",
+            "current_stage": "error_handler",
+            "messages": [AIMessage(content=f"错误处理: {state['error_message']}")]
+        }
 
     def _get_workflow_graph(self):
         """获取工作流图(可视化输出)"""