code: def _param_info(function):
      def is_enum(t):
          return isinstance(t, type) and issubclass(t, Enum)
  
      def is_valid_type(t):
          return t in [
              int,
              float,
              str,
              bool,
              list,
              tuple,
              dict,
          ] or is_enum(t)
  
      param_info = OrderedDict()
      signature = inspect.signature(function).parameters
      for name, param in signature.items():
          if name in ["self", "target_seq_index"]:
              continue
          value = param.default
          if value == param.empty:
              value = ""
          if is_valid_type(type(param.default)):
              value = value.name if isinstance(value, Enum) else value
              param_info[name] = {
                  "type": type(param.default),
                  "default": value,
              }
          elif is_valid_type(param.annotation):
              value = value.name if isinstance(value, Enum) else value
              param_info[name] = {
                  "type": param.annotation,
                  "default": value,
              }
  
      return param_info
  
file_path: merlion/merlion/dashboard/models/utils.py
imports: from collections import OrderedDict
  from enum import Enum
  import inspect
  import json
  import os
  import numpy
  import pandas
  from merlion.models.factory import ModelFactory
label_desc: Use image node_id 2 for calling the ModelMixin obj's underlying member method code with example usage: obj._param_info(function) and returns: param_info, unknown, unknown