@@ -765,6 +765,22 @@ def trigger_inputs(self):
765765 def __repr__ (self ):
766766 class_name = self .__class__ .__name__
767767 base_class = self .__class__ .__bases__ [0 ].__name__
768+ header = (
769+ f"{ class_name } (\n Class: { base_class } \n "
770+ if base_class and base_class != "object"
771+ else f"{ class_name } (\n "
772+ )
773+
774+
775+ if self .trigger_inputs :
776+ header += "\n "
777+ header += " " + "=" * 100 + "\n "
778+ header += " This pipeline contains blocks that are selected at runtime based on inputs.\n "
779+ header += f" Trigger Inputs: { self .trigger_inputs } \n "
780+ # Get first trigger input as example
781+ example_input = next (t for t in self .trigger_inputs if t is not None )
782+ header += f" Use `get_execution_blocks()` with input names to see selected blocks (e.g. `get_execution_blocks('{ example_input } ')`).\n "
783+ header += " " + "=" * 100 + "\n \n "
768784
769785 # Format description with proper indentation
770786 desc_lines = self .description .split ('\n ' )
@@ -776,70 +792,92 @@ def __repr__(self):
776792 desc .extend (f" { line } " for line in desc_lines [1 :])
777793 desc = '\n ' .join (desc ) + '\n '
778794
779- sections = []
780- all_triggers = set (self . trigger_to_block_map . keys ( ))
781- for trigger in sorted ( all_triggers , key = lambda x : str ( x )):
782- sections . append ( f" \n Trigger Input: { trigger } \n " )
783-
784- block = self .trigger_to_block_map . get ( trigger )
785- if block is None :
786- continue
795+ # Components section
796+ expected_components = set (getattr ( self , "expected_components" , [] ))
797+ loaded_components = set ( self . components . keys ())
798+ all_components = sorted ( expected_components | loaded_components )
799+ components_str = " Components: \n " + " \n " . join (
800+ f" - { k } = { type ( self .components [ k ]). __name__ } " if k in loaded_components else f" - { k } "
801+ for k in all_components
802+ )
787803
788- # Add block description with proper indentation
804+ # Auxiliaries section
805+ auxiliaries_str = " Auxiliaries:\n " + "\n " .join (
806+ f" - { k } ={ type (v ).__name__ } " for k , v in self .auxiliaries .items ()
807+ )
808+
809+ # Configs section
810+ expected_configs = set (getattr (self , "expected_configs" , []))
811+ loaded_configs = set (self .configs .keys ())
812+ all_configs = sorted (expected_configs | loaded_configs )
813+ configs_str = " Configs:\n " + "\n " .join (
814+ f" - { k } ={ v } " if k in loaded_configs else f" - { k } " for k , v in self .configs .items ()
815+ )
816+
817+ blocks_str = " Blocks:\n "
818+ for i , (name , block ) in enumerate (self .blocks .items ()):
819+ # Get trigger input for this block
820+ trigger = None
821+ if hasattr (self , 'block_to_trigger_map' ):
822+ trigger = self .block_to_trigger_map .get (name )
823+ # Format the trigger info
824+ if trigger is None :
825+ trigger_str = "[default]"
826+ elif isinstance (trigger , (list , tuple )):
827+ trigger_str = f"[trigger: { ', ' .join (str (t ) for t in trigger )} ]"
828+ else :
829+ trigger_str = f"[trigger: { trigger } ]"
830+ # For AutoPipelineBlocks, add bullet points
831+ blocks_str += f" • { name } { trigger_str } ({ block .__class__ .__name__ } )\n "
832+ else :
833+ # For SequentialPipelineBlocks, show execution order
834+ blocks_str += f" [{ i } ] { name } ({ block .__class__ .__name__ } )\n "
835+
836+ # Add block description
789837 desc_lines = block .description .split ('\n ' )
790- # First line starts right after "Description:", subsequent lines get indented
791838 indented_desc = desc_lines [0 ]
792839 if len (desc_lines ) > 1 :
793- indented_desc += '\n ' + '\n ' .join (' ' + line for line in desc_lines [1 :]) # Align with first line
794- sections .append (f" Description: { indented_desc } \n " )
795-
796- expected_components = set (getattr (block , "expected_components" , []))
797- loaded_components = set (k for k , v in self .components .items ()
798- if v is not None and hasattr (block , k ))
799- all_components = sorted (expected_components | loaded_components )
800- if all_components :
801- sections .append (" Components:\n " + "\n " .join (
802- f" - { k } ={ type (self .components [k ]).__name__ } " if k in loaded_components
803- else f" - { k } " for k in all_components
804- ))
805-
806- if self .auxiliaries :
807- sections .append (" Auxiliaries:\n " + "\n " .join (
808- f" - { k } ={ type (v ).__name__ } "
809- for k , v in self .auxiliaries .items ()
810- ))
811-
812- if self .configs :
813- sections .append (" Configs:\n " + "\n " .join (
814- f" - { k } ={ v } " for k , v in self .configs .items ()
815- ))
816-
817- sections .append (f" Block: { block .__class__ .__name__ } " )
818-
840+ indented_desc += '\n ' + '\n ' .join (' ' + line for line in desc_lines [1 :])
841+ blocks_str += f" Description: { indented_desc } \n "
842+
843+ # Format inputs
819844 inputs_str = format_inputs_short (block .inputs )
820- sections . append ( f" inputs: { inputs_str } " )
845+ blocks_str += f" inputs: { inputs_str } \n "
821846
822- # Format intermediates with proper indentation
847+ # Format intermediates
823848 intermediates_str = format_intermediates_short (
824- block .intermediates_inputs ,
825- block .required_intermediates_inputs ,
849+ block .intermediates_inputs ,
850+ block .required_intermediates_inputs ,
826851 block .intermediates_outputs
827852 )
828- if intermediates_str != " (none)" : # Only add if there are intermediates
829- sections .append (" intermediates:" )
830- # Add extra indentation to each line of intermediates
853+ if intermediates_str != " (none)" :
854+ blocks_str += " intermediates:\n "
831855 indented_intermediates = "\n " .join (
832856 " " + line for line in intermediates_str .split ("\n " )
833857 )
834- sections .append (indented_intermediates )
835-
836- sections .append ("" )
858+ blocks_str += f"{ indented_intermediates } \n "
859+ blocks_str += "\n "
860+
861+ inputs_str = format_inputs_short (self .inputs )
862+ inputs_str = " Inputs:\n " + inputs_str
863+ outputs = [out .name for out in self .outputs ]
864+
865+ intermediates_str = format_intermediates_short (self .intermediates_inputs , self .required_intermediates_inputs , self .intermediates_outputs )
866+ intermediates_str = (
867+ "\n Intermediates:\n "
868+ f"{ intermediates_str } \n "
869+ f" - final outputs: { ', ' .join (outputs )} "
870+ )
837871
838872 return (
839- f"{ class_name } (\n "
840- f" Class: { base_class } \n "
873+ f"{ header } \n "
841874 f"{ desc } "
842- f"{ chr (10 ).join (sections )} "
875+ f"{ components_str } \n "
876+ f"{ auxiliaries_str } \n "
877+ f"{ configs_str } \n "
878+ f"{ blocks_str } \n "
879+ f"{ inputs_str } \n "
880+ f"{ intermediates_str } \n "
843881 f")"
844882 )
845883
@@ -1097,7 +1135,7 @@ def fn_recursive_traverse(block, block_name, active_triggers):
10971135 all_blocks .update (blocks_to_update )
10981136 return all_blocks
10991137
1100- def get_triggered_blocks (self , * trigger_inputs ):
1138+ def get_execution_blocks (self , * trigger_inputs ):
11011139 trigger_inputs_all = self .trigger_inputs
11021140
11031141 if trigger_inputs is not None :
@@ -1130,14 +1168,14 @@ def __repr__(self):
11301168
11311169
11321170 if self .trigger_inputs :
1133- header += "\n " # Add empty line before
1134- header += " " + "=" * 100 + "\n " # Add decorative line
1135- header += " This pipeline block contains dynamic blocks that are selected at runtime based on your inputs.\n "
1136- header += " You can use `get_triggered_blocks(input1, input2,...)` to see which blocks will be used for your trigger inputs.\n "
1137- header += " Use `get_triggered_blocks()` to see blocks will be used for default inputs (when no trigger inputs are provided)\n "
1171+ header += "\n "
1172+ header += " " + "=" * 100 + "\n "
1173+ header += " This pipeline contains blocks that are selected at runtime based on inputs.\n "
11381174 header += f" Trigger Inputs: { self .trigger_inputs } \n "
1139- header += " " + "=" * 100 + "\n " # Add decorative line
1140- header += "\n " # Add empty line after
1175+ # Get first trigger input as example
1176+ example_input = next (t for t in self .trigger_inputs if t is not None )
1177+ header += f" Use `get_execution_blocks()` with input names to see selected blocks (e.g. `get_execution_blocks('{ example_input } ')`).\n "
1178+ header += " " + "=" * 100 + "\n \n "
11411179
11421180 # Format description with proper indentation
11431181 desc_lines = self .description .split ('\n ' )
@@ -1173,28 +1211,42 @@ def __repr__(self):
11731211
11741212 blocks_str = " Blocks:\n "
11751213 for i , (name , block ) in enumerate (self .blocks .items ()):
1176- blocks_str += f" { i } . { name } ({ block .__class__ .__name__ } )\n "
1214+ # Get trigger input for this block
1215+ trigger = None
1216+ if hasattr (self , 'block_to_trigger_map' ):
1217+ trigger = self .block_to_trigger_map .get (name )
1218+ # Format the trigger info
1219+ if trigger is None :
1220+ trigger_str = "[default]"
1221+ elif isinstance (trigger , (list , tuple )):
1222+ trigger_str = f"[trigger: { ', ' .join (str (t ) for t in trigger )} ]"
1223+ else :
1224+ trigger_str = f"[trigger: { trigger } ]"
1225+ # For AutoPipelineBlocks, add bullet points
1226+ blocks_str += f" • { name } { trigger_str } ({ block .__class__ .__name__ } )\n "
1227+ else :
1228+ # For SequentialPipelineBlocks, show execution order
1229+ blocks_str += f" [{ i } ] { name } ({ block .__class__ .__name__ } )\n "
11771230
1231+ # Add block description
11781232 desc_lines = block .description .split ('\n ' )
1179- # First line starts right after "Description:", subsequent lines get indented
11801233 indented_desc = desc_lines [0 ]
11811234 if len (desc_lines ) > 1 :
1182- indented_desc += '\n ' + '\n ' .join (' ' + line for line in desc_lines [1 :]) # Align with first line
1235+ indented_desc += '\n ' + '\n ' .join (' ' + line for line in desc_lines [1 :])
11831236 blocks_str += f" Description: { indented_desc } \n "
11841237
11851238 # Format inputs
11861239 inputs_str = format_inputs_short (block .inputs )
11871240 blocks_str += f" inputs: { inputs_str } \n "
11881241
1189- # Format intermediates with proper indentation
1242+ # Format intermediates
11901243 intermediates_str = format_intermediates_short (
1191- block .intermediates_inputs ,
1192- block .required_intermediates_inputs ,
1244+ block .intermediates_inputs ,
1245+ block .required_intermediates_inputs ,
11931246 block .intermediates_outputs
11941247 )
1195- if intermediates_str != " (none)" : # Only add if there are intermediates
1248+ if intermediates_str != " (none)" :
11961249 blocks_str += " intermediates:\n "
1197- # Add extra indentation to each line of intermediates
11981250 indented_intermediates = "\n " .join (
11991251 " " + line for line in intermediates_str .split ("\n " )
12001252 )
@@ -1295,6 +1347,10 @@ def _execution_device(self):
12951347 return torch .device (module ._hf_hook .execution_device )
12961348 return self .device
12971349
1350+
1351+ def get_execution_blocks (self , * trigger_inputs ):
1352+ return self .pipeline_block .get_execution_blocks (* trigger_inputs )
1353+
12981354 @property
12991355 def dtype (self ) -> torch .dtype :
13001356 r"""
@@ -1449,16 +1505,7 @@ def __repr__(self):
14491505
14501506 block = self .pipeline_block
14511507
1452- if hasattr (block , "trigger_inputs" ) and block .trigger_inputs :
1453- output += "\n "
1454- output += " Trigger Inputs:\n "
1455- output += " --------------\n "
1456- output += f" This pipeline contains dynamic blocks that are selected at runtime based on your inputs.\n "
1457- output += f" • Trigger inputs: { block .trigger_inputs } \n "
1458- output += f" • Use .pipeline_block.get_triggered_blocks(*inputs) to see which blocks will be used for specific inputs\n "
1459- output += f" • Use .pipeline_block.get_triggered_blocks() to see blocks will be used for default inputs (when no trigger inputs are provided)\n "
1460- output += "\n "
1461-
1508+ # List the pipeline block structure first
14621509 output += "Pipeline Block:\n "
14631510 output += "--------------\n "
14641511 if hasattr (block , "blocks" ):
@@ -1493,6 +1540,16 @@ def __repr__(self):
14931540 output += f"{ name } : { config !r} \n "
14941541 output += "\n "
14951542
1543+ # Add auto blocks section
1544+ if hasattr (block , "trigger_inputs" ) and block .trigger_inputs :
1545+ output += "------------------\n "
1546+ output += "This pipeline contains blocks that are selected at runtime based on inputs.\n \n "
1547+ output += f"Trigger Inputs: { block .trigger_inputs } \n "
1548+ # Get first trigger input as example
1549+ example_input = next (t for t in block .trigger_inputs if t is not None )
1550+ output += f" Use `get_execution_blocks()` with input names to see selected blocks (e.g. `get_execution_blocks('{ example_input } ')`).\n "
1551+ output += "Check `.doc` of returned object for more information.\n \n "
1552+
14961553 # List the call parameters
14971554 full_doc = self .pipeline_block .doc
14981555 if "------------------------" in full_doc :
0 commit comments