code: def get_preprocessor(
      model_name: str,
  ) -> Optional[
      Union["AutoTokenizer", "AutoFeatureExtractor", "AutoProcessor"]
  ]:
      """
      Gets a preprocessor (tokenizer, feature extractor or processor) that is available for `model_name`.
  
      Args:
          model_name (`str`): Name of the model for which a preprocessor are loaded.
  
      Returns:
          `Optional[Union[AutoTokenizer, AutoFeatureExtractor, AutoProcessor]]`:
              If a processor is found, it is returned. Otherwise, if a tokenizer or a feature extractor exists, it is
              returned. If both a tokenizer and a feature extractor exist, an error is raised. The function returns
              `None` if no preprocessor is found.
      """
      # Avoid circular imports by only importing this here.
      from .. import (
          AutoFeatureExtractor,
          AutoProcessor,
          AutoTokenizer,
      )  # tests_ignore
  
      try:
          return AutoProcessor.from_pretrained(model_name)
      except (ValueError, OSError, KeyError):
          tokenizer, feature_extractor = None, None
          try:
              tokenizer = AutoTokenizer.from_pretrained(model_name)
          except (OSError, KeyError):
              pass
          try:
              feature_extractor = AutoFeatureExtractor.from_pretrained(
                  model_name
              )
          except (OSError, KeyError):
              pass
  
          if tokenizer is not None and feature_extractor is not None:
              raise ValueError(
                  f"Couldn't auto-detect preprocessor for {model_name}. Found both a tokenizer and a feature extractor."
              )
          elif tokenizer is None and feature_extractor is None:
              return None
          elif tokenizer is not None:
              return tokenizer
          else:
              return feature_extractor
  
file_path: transformers/src/transformers/onnx/utils.py
imports: from ctypes import c_float, sizeof
  from enum import Enum
  from typing import TYPE_CHECKING, Optional, Union
label_desc: Use image node_id 3 for calling a global function with example usage: get_preprocessor(model_name) and returns: AutoProcessor, None, tokenizer, feature_extractor