



"""simple docstring"""






from argparse import ArgumentParser, Namespace
from typing import Any, List, Optional

from ..pipelines import Pipeline, get_supported_tasks, pipeline
from ..utils import logging
from . import BaseTransformersCLICommand


try:
		from fastapi import Body, FastAPI, HTTPException
		from fastapi.routing import APIRoute
		from pydantic import BaseModel
		from starlette.responses import JSONResponse
		from uvicorn import run

		_lowercase				:				Tuple   		=True
except (ImportError, AttributeError):
		_lowercase				:				Optional[Any]   		=object






		def   snake_case__     (	*__lowerCamelCase       :					Tuple							,	**__lowerCamelCase       :					Tuple			):
					"""simple docstring"""
					pass

		_lowercase				:				List[Any]   		=False


_lowercase				:				List[Any]   		=logging.get_logger("transformers-cli/serving")






def   snake_case__     (	__lowerCamelCase       :					Namespace			):
			"""simple docstring"""
			lowerCamelCase__	:	Any				=pipeline(
			    task=args.task							,	model=args.model if args.model else None							,	config=args.config							,	tokenizer=args.tokenizer							,	device=args.device							,	)
			return ServeCommand(lowerCamelCase_							,	args.host							,	args.port							,	args.workers			)

class  __SCREAMING_SNAKE_CASE			(   lowerCamelCase__     ):


					'''simple docstring'''





					_a         =							4_2





class  __SCREAMING_SNAKE_CASE			(   lowerCamelCase__     ):


					'''simple docstring'''





					_a         =							4_2
					_a         =							4_2





class  __SCREAMING_SNAKE_CASE			(   lowerCamelCase__     ):


					'''simple docstring'''





					_a         =							4_2





class  __SCREAMING_SNAKE_CASE			(   lowerCamelCase__     ):


					'''simple docstring'''





					_a         =							4_2





class  __SCREAMING_SNAKE_CASE			(   lowerCamelCase__     ):


					'''simple docstring'''





					@staticmethod
					def 	snake_case ( lowerCamelCase							:						Dict  )->      Optional[int]:
								lowerCamelCase__	:	Any				=parser.add_parser(
								    '''serve''',						help='''CLI tool to run inference requests through REST and GraphQL endpoints.'''  )
								serve_parser.add_argument(
								    '''--task''',						type=__lowerCamelCase,						choices=get_supported_tasks(),						help='''The task to run the pipeline on''',						)
								serve_parser.add_argument('''--host''',						type=__lowerCamelCase,						default='''localhost''',						help='''Interface the server will listen on.'''  )
								serve_parser.add_argument('''--port''',						type=__lowerCamelCase,						default=8888,						help='''Port the serving will listen to.'''  )
								serve_parser.add_argument('''--workers''',						type=__lowerCamelCase,						default=1,						help='''Number of http workers'''  )
								serve_parser.add_argument('''--model''',						type=__lowerCamelCase,						help='''Model\'s name or path to stored model.'''  )
								serve_parser.add_argument('''--config''',						type=__lowerCamelCase,						help='''Model\'s config name or path to stored model.'''  )
								serve_parser.add_argument('''--tokenizer''',						type=__lowerCamelCase,						help='''Tokenizer name to use.'''  )
								serve_parser.add_argument(
								    '''--device''',						type=__lowerCamelCase,						default=-1,						help='''Indicate the device to run onto, -1 indicates CPU, >= 0 indicates GPU (default: -1)''',						)
								serve_parser.set_defaults(func=__lowerCamelCase  )



					def __init__( self							:						Optional[Any],						lowerCamelCase							:						List[Any],						lowerCamelCase							:						str,						lowerCamelCase							:						Dict,						lowerCamelCase							:						Union[str, Any]  )->      List[str]:
								lowerCamelCase__	:	List[Any]				=pipeline

								lowerCamelCase__	:	int				=host
								lowerCamelCase__	:	Optional[Any]				=port
								lowerCamelCase__	:	Optional[int]				=workers

								if not _serve_dependencies_installed:
											raise RuntimeError(
											    '''Using serve command requires FastAPI and uvicorn. '''
											    '''Please install transformers with [serving]: pip install "transformers[serving]".'''
											    '''Or install FastAPI and uvicorn separately.'''  )
								else:
											logger.info(F'''Serving model over {host}:{port}'''  )
											lowerCamelCase__	:	Optional[int]				=FastAPI(
											    routes=[
											        APIRoute(
											            '''/''',						self.model_info,						response_model=__lowerCamelCase,						response_class=__lowerCamelCase,						methods=['''GET'''],						),
											        APIRoute(
											            '''/tokenize''',						self.tokenize,						response_model=__lowerCamelCase,						response_class=__lowerCamelCase,						methods=['''POST'''],						),
											        APIRoute(
											            '''/detokenize''',						self.detokenize,						response_model=__lowerCamelCase,						response_class=__lowerCamelCase,						methods=['''POST'''],						),
											        APIRoute(
											            '''/forward''',						self.forward,						response_model=__lowerCamelCase,						response_class=__lowerCamelCase,						methods=['''POST'''],						),
											    ],						timeout=600,						)



					def 	snake_case ( self							:						Union[str, Any]  )->      Optional[Any]:
								run(self._app,						host=self.host,						port=self.port,						workers=self.workers  )



					def 	snake_case ( self							:						int  )->      List[str]:
								return ServeModelInfoResult(infos=vars(self._pipeline.model.config  )  )



					def 	snake_case ( self							:						int,						lowerCamelCase							:						Optional[Any] = Body(__lowerCamelCase,						embed=__lowerCamelCase  ),						lowerCamelCase							:						Union[str, Any] = Body(__lowerCamelCase,						embed=__lowerCamelCase  )  )->      Any:






								try:
											lowerCamelCase__	:	Tuple				=self._pipeline.tokenizer.tokenize(__lowerCamelCase  )

											if return_ids:
														lowerCamelCase__	:	Tuple				=self._pipeline.tokenizer.convert_tokens_to_ids(__lowerCamelCase  )
														return ServeTokenizeResult(tokens=__lowerCamelCase,						tokens_ids=__lowerCamelCase  )
											else:
														return ServeTokenizeResult(tokens=__lowerCamelCase  )

								except Exception as e:
											raise HTTPException(status_code=500,						detail={'''model''': '''''', '''error''': str(__lowerCamelCase  )}  )



					def 	snake_case ( self							:						int,						lowerCamelCase							:						Dict = Body(__lowerCamelCase,						embed=__lowerCamelCase  ),						lowerCamelCase							:						List[Any] = Body(__lowerCamelCase,						embed=__lowerCamelCase  ),						lowerCamelCase							:						Tuple = Body(__lowerCamelCase,						embed=__lowerCamelCase  ),						)->      List[str]:






								try:
											lowerCamelCase__	:	List[str]				=self._pipeline.tokenizer.decode(__lowerCamelCase,						__lowerCamelCase,						__lowerCamelCase  )
											return ServeDeTokenizeResult(model='''''',						text=__lowerCamelCase  )
								except Exception as e:
											raise HTTPException(status_code=500,						detail={'''model''': '''''', '''error''': str(__lowerCamelCase  )}  )




					async def 	snake_case ( self							:						int,						lowerCamelCase							:						Optional[Any]=Body(__lowerCamelCase,						embed=__lowerCamelCase  )  )->      Optional[Any]:






								if len(__lowerCamelCase  ) == 0:
											return ServeForwardResult(output=[],						attention=[]  )

								try:
											# Forward through the model
											lowerCamelCase__	:	int				=self._pipeline(__lowerCamelCase  )
											return ServeForwardResult(output=__lowerCamelCase  )
								except Exception as e:
											raise HTTPException(500,						{'''error''': str(__lowerCamelCase  )}  )









"""simple docstring"""






_lowercase				:				Optional[Any]   		=		{
    "Pillow": "Pillow<10.0.0",
    "accelerate": "accelerate>=0.20.3",
    "av": "av==9.2.0",
    "beautifulsoup4": "beautifulsoup4",
    "black": "black~=23.1",
    "codecarbon": "codecarbon==1.2.0",
    "cookiecutter": "cookiecutter==1.7.3",
    "dataclasses": "dataclasses",
    "datasets": "datasets!=2.5.0",
    "decord": "decord==0.6.0",
    "deepspeed": "deepspeed>=0.9.3",
    "diffusers": "diffusers",
    "dill": "dill<0.3.5",
    "evaluate": "evaluate>=0.2.0",
    "fairscale": "fairscale>0.3",
    "faiss-cpu": "faiss-cpu",
    "fastapi": "fastapi",
    "filelock": "filelock",
    "flax": "flax>=0.4.1,<=0.7.0",
    "ftfy": "ftfy",
    "fugashi": "fugashi>=1.0",
    "GitPython": "GitPython<3.1.19",
    "hf-doc-builder": "hf-doc-builder>=0.3.0",
    "huggingface-hub": "huggingface-hub>=0.14.1,<1.0",
    "importlib_metadata": "importlib_metadata",
    "ipadic": "ipadic>=1.0.0,<2.0",
    "isort": "isort>=5.5.4",
    "jax": "jax>=0.2.8,!=0.3.2,<=0.4.13",
    "jaxlib": "jaxlib>=0.1.65,<=0.4.13",
    "jieba": "jieba",
    "kenlm": "kenlm",
    "keras-nlp": "keras-nlp>=0.3.1",
    "librosa": "librosa",
    "nltk": "nltk",
    "natten": "natten>=0.14.6",
    "numpy": "numpy>=1.17",
    "onnxconverter-common": "onnxconverter-common",
    "onnxruntime-tools": "onnxruntime-tools>=1.4.2",
    "onnxruntime": "onnxruntime>=1.4.0",
    "opencv-python": "opencv-python",
    "optuna": "optuna",
    "optax": "optax>=0.0.8,<=0.1.4",
    "packaging": "packaging>=20.0",
    "parameterized": "parameterized",
    "phonemizer": "phonemizer",
    "protobuf": "protobuf",
    "psutil": "psutil",
    "pyyaml": "pyyaml>=5.1",
    "pydantic": "pydantic<2",
    "pytest": "pytest>=7.2.0",
    "pytest-timeout": "pytest-timeout",
    "pytest-xdist": "pytest-xdist",
    "python": "python>=3.8.0",
    "ray[tune]": "ray[tune]",
    "regex": "regex!=2019.12.17",
    "requests": "requests",
    "rhoknp": "rhoknp>=1.1.0,<1.3.1",
    "rjieba": "rjieba",
    "rouge-score": "rouge-score!=0.0.7,!=0.0.8,!=0.1,!=0.1.1",
    "ruff": "ruff>=0.0.241,<=0.0.259",
    "sacrebleu": "sacrebleu>=1.4.12,<2.0.0",
    "sacremoses": "sacremoses",
    "safetensors": "safetensors>=0.3.1",
    "sagemaker": "sagemaker>=2.31.0",
    "scikit-learn": "scikit-learn",
    "sentencepiece": "sentencepiece>=0.1.91,!=0.1.92",
    "sigopt": "sigopt",
    "starlette": "starlette",
    "sudachipy": "sudachipy>=0.6.6",
    "sudachidict_core": "sudachidict_core>=20220729",
    "tensorflow-cpu": "tensorflow-cpu>=2.6,<2.14",
    "tensorflow": "tensorflow>=2.6,<2.14",
    "tensorflow-text": "tensorflow-text<2.14",
    "tf2onnx": "tf2onnx",
    "timeout-decorator": "timeout-decorator",
    "timm": "timm",
    "tokenizers": "tokenizers>=0.11.1,!=0.11.3,<0.14",
    "torch": "torch>=1.9,!=1.12.0",
    "torchaudio": "torchaudio",
    "torchvision": "torchvision",
    "pyctcdecode": "pyctcdecode>=0.4.0",
    "tqdm": "tqdm>=4.27",
    "unidic": "unidic>=1.0.2",
    "unidic_lite": "unidic_lite>=1.0.7",
    "urllib3": "urllib3<2.0.0",
    "uvicorn": "uvicorn",
}




