class_docstr: Components orchestration engine.
  
  Builds a graph of components and orchestrates their execution according to the execution graph.
class_docstr_tok: ["Components","orchestration","engine",".","Builds","a","graph","of","components","and","orchestrates","their","execution","according","to","the","execution","graph","."]
docstr: Creates the Pipeline.
  
  Args:
      metadata: arbitrary dictionary to store metadata about this pipeline. Make sure all the values contained in
          this dictionary can be serialized and deserialized if you wish to save this pipeline to file with
          `save_pipelines()/load_pipelines()`.
      max_loops_allowed: how many times the pipeline can run the same node before throwing an exception.
      debug_path: when debug is enabled in `run()`, where to save the debug data.
docstr_tok: ["Creates","the","Pipeline",".","Args",":","metadata",":","arbitrary","dictionary","to","store","metadata","about","this","pipeline",".","Make","sure","all","the","values","contained","in","this","dictionary","can","be","serialized","and","deserialized","if","you","wish","to","save","this","pipeline","to","file","with","`","save_pipelines","(",")","\/load_pipelines","(",")","`",".","max_loops_allowed",":","how","many","times","the","pipeline","can","run","the","same","node","before","throwing","an","exception",".","debug_path",":","when","debug","is","enabled","in","`","run","(",")","`",",","where","to","save","the","debug","data","."]
code: def __init__(
      self,
      metadata: Optional[Dict[str, Any]] = None,
      max_loops_allowed: int = 100,
      debug_path: Union[Path, str] = Path(".canals_debug/"),
  ):
      """
      Creates the Pipeline.
  
      Args:
          metadata: arbitrary dictionary to store metadata about this pipeline. Make sure all the values contained in
              this dictionary can be serialized and deserialized if you wish to save this pipeline to file with
              `save_pipelines()/load_pipelines()`.
          max_loops_allowed: how many times the pipeline can run the same node before throwing an exception.
          debug_path: when debug is enabled in `run()`, where to save the debug data.
      """
      self.metadata = metadata or {}
      self.max_loops_allowed = max_loops_allowed
      self.graph = networkx.MultiDiGraph()
      self._connections: List[Connection] = []
      self._mandatory_connections: Dict[
          str, List[Connection]
      ] = defaultdict(list)
      self._debug: Dict[int, Dict[str, Any]] = {}
      self._debug_path = Path(debug_path)
  
imports: from typing import Optional, Any, Dict, List, Union, TypeVar, Type, Set
  import os
  import json
  import datetime
  import logging
  import importlib
  from pathlib import Path
  from copy import deepcopy
  from collections import defaultdict
  import networkx
  from haystack.core.component import component, Component, InputSocket, OutputSocket
  from haystack.core.errors import PipelineError, PipelineConnectError, PipelineMaxLoops, PipelineRuntimeError, PipelineValidationError
  from haystack.core.pipeline.descriptions import find_pipeline_outputs
  from haystack.core.pipeline.draw.draw import _draw, RenderingEngines
  from haystack.core.pipeline.validation import validate_pipeline_input, find_pipeline_inputs
  from haystack.core.component.connection import Connection, parse_connect_string
  from haystack.core.type_utils import _type_name
  from haystack.core.serialization import component_to_dict, component_from_dict
label_desc: Use image node_id 1 to create a new Pipeline object  with example: obj = Pipeline(metadata, max_loops_allowed, debug_path)