code: def _get_signature_keys(obj):
      parameters = inspect.signature(obj.__init__).parameters
      required_parameters = {
          k: v
          for k, v in parameters.items()
          if v.default == inspect._empty
      }
      optional_parameters = set(
          {
              k
              for k, v in parameters.items()
              if v.default != inspect._empty
          }
      )
      expected_modules = set(required_parameters.keys()) - {"self"}
      return expected_modules, optional_parameters
  
imports: import inspect
  from collections import OrderedDict
  from ..configuration_utils import ConfigMixin
  from ..utils import DIFFUSERS_CACHE
  from .controlnet import StableDiffusionControlNetImg2ImgPipeline, StableDiffusionControlNetInpaintPipeline, StableDiffusionControlNetPipeline, StableDiffusionXLControlNetImg2ImgPipeline, StableDiffusionXLControlNetPipeline
  from .deepfloyd_if import IFImg2ImgPipeline, IFInpaintingPipeline, IFPipeline
  from .kandinsky import KandinskyCombinedPipeline, KandinskyImg2ImgCombinedPipeline, KandinskyImg2ImgPipeline, KandinskyInpaintCombinedPipeline, KandinskyInpaintPipeline, KandinskyPipeline
  from .kandinsky2_2 import KandinskyV22CombinedPipeline, KandinskyV22Img2ImgCombinedPipeline, KandinskyV22Img2ImgPipeline, KandinskyV22InpaintCombinedPipeline, KandinskyV22InpaintPipeline, KandinskyV22Pipeline
  from .stable_diffusion import StableDiffusionImg2ImgPipeline, StableDiffusionInpaintPipeline, StableDiffusionPipeline
  from .stable_diffusion_xl import StableDiffusionXLImg2ImgPipeline, StableDiffusionXLInpaintPipeline, StableDiffusionXLPipeline
  from .wuerstchen import WuerstchenCombinedPipeline, WuerstchenDecoderPipeline
label_desc: Use image node_id 3 for calling a global function with example usage: _get_signature_keys(obj) and returns: expected_modules,  optional_parameters