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: Returns a dictionary containing the inputs of a pipeline. Each key in the dictionary
  corresponds to a component name, and its value is another dictionary that describes the
  input sockets of that component, including their types and whether they are optional.
  
  Returns:
      A dictionary where each key is a pipeline component name and each value is a dictionary of
      inputs sockets of that component.
docstr_tok: ["Returns","a","dictionary","containing","the","inputs","of","a","pipeline",".","Each","key","in","the","dictionary","corresponds","to","a","component","name",",","and","its","value","is","another","dictionary","that","describes","the","input","sockets","of","that","component",",","including","their","types","and","whether","they","are","optional",".","Returns",":","A","dictionary","where","each","key","is","a","pipeline","component","name","and","each","value","is","a","dictionary","of","inputs","sockets","of","that","component","."]
code: def inputs(self) -> Dict[str, Dict[str, Any]]:
      """
      Returns a dictionary containing the inputs of a pipeline. Each key in the dictionary
      corresponds to a component name, and its value is another dictionary that describes the
      input sockets of that component, including their types and whether they are optional.
  
      Returns:
          A dictionary where each key is a pipeline component name and each value is a dictionary of
          inputs sockets of that component.
      """
      inputs: Dict[str, Dict[str, Any]] = {}
      for component_name, data in find_pipeline_inputs(
          self.graph
      ).items():
          sockets_description = {}
          for socket in data:
              sockets_description[socket.name] = {
                  "type": socket.type,
                  "is_mandatory": socket.is_mandatory,
              }
              if not socket.is_mandatory:
                  sockets_description[socket.name][
                      "default_value"
                  ] = socket.default_value
  
          if sockets_description:
              inputs[component_name] = sockets_description
      return inputs
  
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 9 for calling the Pipeline obj's underlying member method code with example usage: obj.inputs() and returns: inputs