| 
					
				 | 
			
			
				@@ -107,8 +107,8 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             usage=LLMUsage.empty_usage() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self._stream_generate_routes = self._get_stream_generate_routes() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self._iteration_nested_relations = self._get_iteration_nested_relations(self._workflow.graph_dict) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self._stream_generate_routes = self._get_stream_generate_routes() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self._conversation_name_generate_thread = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def process(self) -> Union[ChatbotAppBlockingResponse, Generator[ChatbotAppStreamResponse, None, None]]: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -410,6 +410,18 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 ingoing_edges.append(edge) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if not ingoing_edges: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # check if it's the first node in the iteration 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            target_node = next((node for node in nodes if node.get('id') == target_node_id), None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if not target_node: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            node_iteration_id = target_node.get('data', {}).get('iteration_id') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # get iteration start node id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for node in nodes: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if node.get('id') == node_iteration_id: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if node.get('data', {}).get('start_node_id') == target_node_id: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return [target_node_id] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         start_node_ids = [] 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -514,6 +526,7 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 self._task_state.answer += route_chunk.text 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 yield self._message_to_stream_response(route_chunk.text, self._message.id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                value = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 route_chunk = cast(VarGenerateRouteChunk, route_chunk) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 value_selector = route_chunk.value_selector 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if not value_selector: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -525,6 +538,20 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if route_chunk_node_id == 'sys': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     # system variable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     value = self._workflow_system_variables.get(SystemVariable.value_of(value_selector[1])) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                elif route_chunk_node_id in self._iteration_nested_relations: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    # it's a iteration variable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if not self._iteration_state or route_chunk_node_id not in self._iteration_state.current_iterations: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    iteration_state = self._iteration_state.current_iterations[route_chunk_node_id] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    iterator = iteration_state.inputs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if not iterator: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    iterator_selector = iterator.get('iterator_selector', []) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if value_selector[1] == 'index': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        value = iteration_state.current_index 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    elif value_selector[1] == 'item': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        value = iterator_selector[iteration_state.current_index] if iteration_state.current_index < len( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            iterator_selector) else None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     # check chunk node id is before current node id or equal to current node id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if route_chunk_node_id not in self._task_state.ran_node_execution_infos: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -554,7 +581,7 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             value = value.get(key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if value: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if value is not None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     text = '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if isinstance(value, str | int | float): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         text = str(value) 
			 |