code: def parse_parameters(param_info, params):
      for key in params.keys():
          assert key in param_info, f"{key} is not in `param_info`."
  
      kwargs = {}
      for name, value in params.items():
          info = param_info[name]
          value_type = info["type"]
          if value.lower() in ["none", "null"]:
              kwargs[name] = None
          elif value_type in [int, float, str]:
              kwargs[name] = value_type(value)
          elif issubclass(value_type, Enum):
              valid_enum_values = value_type.__members__.keys()
              assert (
                  value in valid_enum_values
              ), f"The value of {name} should be in {valid_enum_values}"
              kwargs[name] = value_type[value]
          elif value_type == bool:
              assert value.lower() in [
                  "true",
                  "false",
              ], f"The value of {name} should be either True or False."
              kwargs[name] = value.lower() == "true"
          elif info["type"] in [list, tuple, dict]:
              value = value.replace(" ", "").replace("\t", "")
              value = (
                  value.replace("(", "[")
                  .replace(")", "]")
                  .replace(",]", "]")
              )
              kwargs[name] = json.loads(value)
      return kwargs
  
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 3 for calling the ModelMixin obj's underlying member method code with example usage: obj.parse_parameters(param_info, params) and returns: kwargs