code: def list_cluster_events(
      address: Optional[str] = None,
      filters: Optional[
          List[Tuple[str, PredicateType, SupportedFilterType]]
      ] = None,
      limit: int = DEFAULT_LIMIT,
      timeout: int = DEFAULT_RPC_TIMEOUT,
      detail: bool = False,
      raise_on_missing_output: bool = True,
      _explain: bool = False,
  ) -> List[Dict]:
      return StateApiClient(address=address).list(
          StateResource.CLUSTER_EVENTS,
          options=ListApiOptions(
              limit=limit,
              timeout=timeout,
              filters=filters,
              detail=detail,
          ),
          raise_on_missing_output=raise_on_missing_output,
          _explain=_explain,
      )
  
imports: import logging
  import threading
  import urllib
  import warnings
  from contextlib import contextmanager
  from dataclasses import fields
  from typing import Any, Dict, Generator, List, Optional, Tuple, Union
  import requests
  from ray.dashboard.modules.dashboard_sdk import SubmissionClient
  from ray.dashboard.utils import get_address_for_submission_client, ray_address_to_api_server_url
  from ray.util.annotations import DeveloperAPI
  from ray.util.state.common import DEFAULT_LIMIT, DEFAULT_RPC_TIMEOUT, ActorState, ClusterEventState, GetApiOptions, GetLogOptions, JobState, ListApiOptions, NodeState, ObjectState, PlacementGroupState, PredicateType, RuntimeEnvState, StateResource, SummaryApiOptions, SummaryResource, SupportedFilterType, TaskState, WorkerState, dict_to_state
  from ray.util.state.exception import RayStateApiException, ServerUnavailable
label_desc: Use image node_id 17 for calling a global function with example usage: list_cluster_events(address, filters, limit, timeout, detail, raise_on_missing_output, _explain) and returns: StateApiClient