1414
1515from application .workflow .common import WorkflowType , new_instance
1616from application .workflow .i_node import INode , Signal
17-
18- from application .workflow .message .struct .content import NodeInfo , Position
19- from application .workflow .message .struct .text_content import TextContent
17+ from application .workflow .message .struct .content import Position
2018from application .workflow .status import Status
21-
2219from common .exception .app_exception import AppApiException
2320
2421MAX_LOOP_COUNT = 500
@@ -61,6 +58,8 @@ class LoopNode(INode):
6158 serializer_class = LoopNodeSerializer
6259 supported_workflow_type_list = [WorkflowType .APPLICATION , WorkflowType .KNOWLEDGE , WorkflowType .TOOL ]
6360 type = "loop-node"
61+ _workflow_params = None
62+ _iterator = None
6463
6564 def _run (self ):
6665 self .execute ()
@@ -81,7 +80,7 @@ def execute(self):
8180 if loop_type == "ARRAY" and isinstance (array , list ) and len (array ) >= 2 :
8281 array = self .workflow_manage .get_reference_field (array [0 ], array [1 :])
8382
84- self .write_context ( "params" , {"loop_type" : loop_type , "array" : array , "number" : number })
83+ self .data [ "params" ] = {"loop_type" : loop_type , "array" : array , "number" : number }
8584
8685 # 根据 start_index 构建迭代器
8786 if loop_type == "ARRAY" :
@@ -90,12 +89,8 @@ def execute(self):
9089 iterator = _generate_while_loop (number or MAX_LOOP_COUNT , start_index = start_index )
9190 else :
9291 iterator = _generate_loop_number (number , start_index = start_index )
93-
94- self ._loop_node_data = self .get_context ("loop_node_data" ) or []
95- self ._loop_answer_data = self .get_context ("loop_answer_data" ) or []
96- self ._answer_text = self .get_context ("answer" ) or ""
9792 self ._workflow_params = workflow_params
98- self ._loop_body = loop_body
93+ self .data [ "loop_body" ] = loop_body
9994 self ._iterator = iterator
10095
10196 self ._run_next ()
@@ -104,35 +99,31 @@ def _run_next(self):
10499 try :
105100 item , index = next (self ._iterator )
106101 except StopIteration :
107- self .write_context ("answer" , self ._answer_text )
108- self .write_context ("run_time" , time .time () - self .data .get ("start_time" , time .time ()))
102+ self .data ["run_time" ] = time .time () - self .data .get ("start_time" , time .time ())
109103 self .complete (Status .SUCCESS )
110104 return
111- loop_context = {"index" : index , "item" : item }
112- workflow = new_instance (self ._loop_body , self .get_workflow_type ())
105+ workflow = new_instance (self .data ["loop_body" ], self .get_workflow_type ())
113106
114107 chunk_list = []
115108
116109 def on_next (wf_manage , content ):
117110 chunk_list .append (content )
118- if hasattr (content , "content" ):
119- self ._answer_text += content .content
120111 content .position = Position (self .get_node_id (), index , content .position )
121112 self .write (content )
122113
123114 def on_complete (wf_manage , error ):
124115 loop_details_list = self .data .setdefault ("loop_details_list" , [])
125116 loop_details_list .append (wf_manage .get_details ())
126- self ._loop_node_data .append (wf_manage .context )
127- self ._loop_answer_data .append ([c .to_dict () for c in chunk_list ])
128- self .write_context ("loop_node_data" , self ._loop_node_data )
129- self .write_context ("loop_answer_data" , self ._loop_answer_data )
130117 self .write_context ("index" , index )
131118 self .write_context ("item" , item )
119+ last_context = self .workflow_manage .get_context (self .node .id , "last_context" )
120+ if last_context :
121+ self .write_context ("last_context" , {** last_context , ** wf_manage .context })
122+ else :
123+ self .write_context ("last_context" , wf_manage .context )
132124
133125 if wf_manage .signal == Signal .BREAK or wf_manage .signal == Signal .FORM :
134- self .write_context ("answer" , self ._answer_text )
135- self .write_context ("run_time" , time .time () - self .data .get ("start_time" , time .time ()))
126+ self .data ["run_time" ] = time .time () - self .data .get ("start_time" , time .time ())
136127 self .complete (Status .SUCCESS )
137128 return
138129
@@ -173,40 +164,41 @@ def get_start_node_fn(wf, wf_manage):
173164 start_node = wf .get_node ("loop-start-node" )
174165 return loop_start_class (start_node , wf_manage , lambda n : n .properties .get ("node_data" , {}))
175166
167+ def get_context ():
168+ last_context = self .workflow_manage .get_context (self .node .id , "last_context" ) or {}
169+ if last_context :
170+ return last_context
171+ return {}
172+
176173 # 构建子工作流参数,第一次迭代传入 child_position
177174 loop_workflow_params = dict (self ._workflow_params )
178175 if child_position :
179176 loop_workflow_params ["position" ] = child_position
180177 else :
181178 loop_workflow_params .pop ("position" , None )
182-
183- loop_manage = LoopWorkFlowManage (
179+ loop_workflow_params ["index" ] = index
180+ loop_workflow_params ["item" ] = item
181+ loop_manage = LoopWorkFlowManage .from_context (
184182 workflow = workflow ,
185183 parameters = loop_workflow_params ,
186184 workflow_type = self .get_workflow_type (),
187185 call_back = call_back ,
188186 get_start_node = get_start_node_fn ,
189187 parent_workflow_manage = self .workflow_manage ,
190- loop_context = loop_context ,
188+ get_context = get_context ,
191189 )
192- loop_manage .start_node .workflow_manage = loop_manage
193190 loop_manage .run ()
194191
195192 def get_details (self , index : int = 0 , position : dict = None , old_details : dict = None , ** kwargs ):
196193 details = super ().get_details (index , position , old_details , ** kwargs )
197194 details .update (
198- {
199- "params" : self .get_context ("params" ),
200- "index" : self .get_context ("index" ),
201- "item" : self .get_context ("item" ),
202- "answer" : self .get_context ("answer" ),
203- }
195+ {"params" : self .data .get ("params" ), "index" : self .get_context ("index" ), "item" : self .get_context ("item" )}
204196 )
205197 loop_details = []
206198 position_index = 0
207199 loop_position_index = 0
208200 if old_details and position :
209- for index , item in enumerate (old_details .get ("iteration_details " ) or []):
201+ for index , item in enumerate (old_details .get ("children " ) or []):
210202 loop_position_index = index
211203 loop_details .append (item )
212204 current_details = loop_details [loop_position_index ]
0 commit comments