def METHOD_NAME(cls, **kwargs) -> Union[Dict, None]:
    try:
        tree = ast.parse(inspect.getsource(cls))
    except IndentationError:
        logger.error(
            f"Error parsing class {cls.__name__}. Make sure there are no tabs in the code."
        )
        return None
    tool_params = {}
    # Iterate over the statements in the abstract syntax tree
    for node in ast.walk(tree):
        if isinstance(node, ast.ClassDef):
            # Find the class definition and look for methods
            for stmt in node.body:
                if isinstance(stmt, ast.FunctionDef) and stmt.name == "__init__":
                    # There is no assignment statements in the __init__ method
                    # So we need to get the params from the function definition
                    for arg in stmt.args.args:
                        if arg.arg == "name":
                            # It should be the name of the class
                            tool_params[arg.arg] = cls.__name__
                        elif arg.arg == "self":
                            continue
                        # If there is not default value, set it to an empty string
                        else:
                            try:
                                annotation = ast.literal_eval(arg.annotation)  # type: ignore
                                tool_params[arg.arg] = annotation
                            except ValueError:
                                tool_params[arg.arg] = ""
                # Get the attribute name and the annotation
                elif cls != Tool and isinstance(stmt, ast.AnnAssign):
                    # Get the attribute name and the annotation
                    tool_params[stmt.target.id] = ""  # type: ignore
    return tool_params