code: def delete(self, key: str, recursive: bool = False):
      def delete_fn():
          if self.cloud_storage_provider == S3_CLOUD_STORAGE:
              self._delete_s3_fn(key, recursive)
              return
          if self.cloud_storage_provider == GS_CLOUD_STORAGE:
              self._delete_gs_fn(key, recursive)
              return
  
      try:
          self._run_with_retry(
              delete_fn,
              initial_retry_delay_s=2,
          )
      except Exception as e:
          logger.warning(
              f"Could not remove temporary cloud object: {e}"
          )
  
imports: import os
  import shutil
  import sys
  import tempfile
  from typing import Optional
  import boto3
  from google.cloud import storage
  from ray_release.aws import RELEASE_AWS_BUCKET
  from ray_release.cluster_manager.cluster_manager import ClusterManager
  from ray_release.exception import FileDownloadError, FileUploadError
  from ray_release.file_manager.file_manager import FileManager
  from ray_release.job_manager import JobManager
  from ray_release.logger import logger
  from ray_release.util import exponential_backoff_retry, generate_tmp_cloud_storage_path, S3_CLOUD_STORAGE, GS_CLOUD_STORAGE, GS_BUCKET
label_desc: Use image node_id 10 for calling the JobFileManager obj's underlying member method code with example usage: obj.delete(key, recursive) without return types