@@ -134,6 +134,7 @@ class Loop:
134134 var_name : str = "item" # Variable name for current item
135135 parallel : bool = False # Execute iterations in parallel
136136 max_workers : Optional [int ] = None # Max parallel workers (None = unlimited)
137+ output_variable : Optional [str ] = None # Store loop results in this variable name
137138
138139 def __init__ (
139140 self ,
@@ -143,7 +144,8 @@ def __init__(
143144 from_file : Optional [str ] = None ,
144145 var_name : str = "item" ,
145146 parallel : bool = False ,
146- max_workers : Optional [int ] = None
147+ max_workers : Optional [int ] = None ,
148+ output_variable : Optional [str ] = None
147149 ):
148150 self .step = step
149151 self .over = over
@@ -152,6 +154,7 @@ def __init__(
152154 self .var_name = var_name
153155 self .parallel = parallel
154156 self .max_workers = max_workers
157+ self .output_variable = output_variable
155158
156159
157160@dataclass
@@ -194,7 +197,8 @@ def parallel(steps: List) -> Parallel:
194197
195198def loop (step : Any , over : Optional [str ] = None , from_csv : Optional [str ] = None ,
196199 from_file : Optional [str ] = None , var_name : str = "item" ,
197- parallel : bool = False , max_workers : Optional [int ] = None ) -> Loop :
200+ parallel : bool = False , max_workers : Optional [int ] = None ,
201+ output_variable : Optional [str ] = None ) -> Loop :
198202 """Loop over items executing step for each.
199203
200204 Args:
@@ -205,12 +209,14 @@ def loop(step: Any, over: Optional[str] = None, from_csv: Optional[str] = None,
205209 var_name: Variable name for current item (default: "item")
206210 parallel: If True, execute iterations in parallel (default: False)
207211 max_workers: Max parallel workers when parallel=True (default: None = unlimited)
212+ output_variable: Variable name to store all loop outputs (default: None = "loop_outputs")
208213
209214 Returns:
210215 Loop object configured for iteration
211216 """
212217 return Loop (step = step , over = over , from_csv = from_csv , from_file = from_file ,
213- var_name = var_name , parallel = parallel , max_workers = max_workers )
218+ var_name = var_name , parallel = parallel , max_workers = max_workers ,
219+ output_variable = output_variable )
214220
215221
216222def repeat (step : Any , until : Optional [Callable [[WorkflowContext ], bool ]] = None ,
@@ -1829,10 +1835,16 @@ def execute_item(idx_item_tuple):
18291835 results .append ({"step" : f"{ step_result ['step' ]} _{ idx } " , "output" : step_result ["output" ]})
18301836 outputs .append (step_result ["output" ])
18311837 previous_output = step_result ["output" ]
1832-
1833- all_variables ["loop_outputs" ] = outputs
1838+ # Store outputs in user-specified variable or default to loop_outputs
1839+ output_var_name = loop_step .output_variable or "loop_outputs"
1840+ all_variables [output_var_name ] = outputs
1841+ all_variables ["loop_outputs" ] = outputs # Also keep for backward compatibility
18341842 combined_output = "\n " .join (str (o ) for o in outputs ) if outputs else ""
18351843
1844+ # Debug logging for output_variable
1845+ if verbose :
1846+ print (f"📦 Loop stored { len (outputs )} results in variable: '{ output_var_name } '" )
1847+
18361848 return {"steps" : results , "output" : combined_output , "variables" : all_variables }
18371849
18381850 def _parse_list_from_string (self , text : str ) -> List [Any ]:
0 commit comments