





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

		A	     =					True
except (ImportError, AttributeError):
		A	     =					object

		def       __A (     *a_  :Union[str, Any]				,    **a_  :List[Any])						->						Any:
						pass






		A	     =					False


A	     =					logging.get_logger('''transformers-cli/serving''')

def       __A (     a_  :Namespace)						->						Optional[Any]:
				__a	:  int         =					pipeline(
				    task=args.task				,    model=args.model if args.model else None				,    config=args.config				,    tokenizer=args.tokenizer				,    device=args.device				,    )
				return ServeCommand(SCREAMING_SNAKE_CASE_				,    args.host				,    args.port				,    args.workers)




class 			__lowercase     (     snake_case__							):







					'''simple docstring'''




					__lowerCAmelCase					=					42






class 			__lowercase     (     snake_case__							):







					'''simple docstring'''




					__lowerCAmelCase					=					42
					__lowerCAmelCase					=					42






class 			__lowercase     (     snake_case__							):







					'''simple docstring'''




					__lowerCAmelCase					=					42






class 			__lowercase     (     snake_case__							):







					'''simple docstring'''




					__lowerCAmelCase					=					42






class 			__lowercase     (     snake_case__							):







					'''simple docstring'''




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







					def __init__(  self		,     _UpperCAmelCase		,     _UpperCAmelCase		,     _UpperCAmelCase		,     _UpperCAmelCase       ):
									__a	:  int         =					pipeline

									__a	:  Optional[int]         =					host
									__a	:  int         =					port
									__a	:  str         =					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}"""       )
													__a	:  Optional[Any]         =					FastAPI(
													    routes=[
													        APIRoute(
													            '''/'''		,     self.model_info		,     response_model=_A		,     response_class=_A		,     methods=['''GET''']		,     ),
													        APIRoute(
													            '''/tokenize'''		,     self.tokenize		,     response_model=_A		,     response_class=_A		,     methods=['''POST''']		,     ),
													        APIRoute(
													            '''/detokenize'''		,     self.detokenize		,     response_model=_A		,     response_class=_A		,     methods=['''POST''']		,     ),
													        APIRoute(
													            '''/forward'''		,     self.forward		,     response_model=_A		,     response_class=_A		,     methods=['''POST''']		,     ),
													    ]		,     timeout=600		,     )







					def 	_lowerCamelCase						(  self       ):
									run(self._app		,     host=self.host		,     port=self.port		,     workers=self.workers       )







					def 	_lowerCamelCase						(  self       ):
									return ServeModelInfoResult(infos=vars(self._pipeline.model.config       )       )







					def 	_lowerCamelCase						(  self		,     _UpperCAmelCase = Body(_A		,     embed=_A       )		,     _UpperCAmelCase = Body(_A		,     embed=_A       )       ):



									try:
													__a	:  Optional[int]         =					self._pipeline.tokenizer.tokenize(_A       )

													if return_ids:
																	__a	:  str         =					self._pipeline.tokenizer.convert_tokens_to_ids(_A       )
																	return ServeTokenizeResult(tokens=_A		,     tokens_ids=_A       )
													else:
																	return ServeTokenizeResult(tokens=_A       )

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







					def 	_lowerCamelCase						(  self		,     _UpperCAmelCase = Body(_A		,     embed=_A       )		,     _UpperCAmelCase = Body(_A		,     embed=_A       )		,     _UpperCAmelCase = Body(_A		,     embed=_A       )		,     ):



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







					async def 	_lowerCamelCase						(  self		,     _UpperCAmelCase=Body(_A		,     embed=_A       )       ):



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

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






"""simple docstring"""






import hashlib
import unittest
from typing import Dict

import numpy as np

from transformers import (
    MODEL_FOR_MASK_GENERATION_MAPPING,
    TF_MODEL_FOR_MASK_GENERATION_MAPPING,
    is_vision_available,
    pipeline,
)
from transformers.pipelines import MaskGenerationPipeline
from transformers.testing_utils import (
    is_pipeline_test,
    nested_simplify,
    require_tf,
    require_torch,
    require_vision,
    slow,
)


if is_vision_available():
		from PIL import Image
else:




		class 			__lowercase     :







							'''simple docstring'''




							@staticmethod
							def 	_lowerCamelCase						(  *_UpperCAmelCase		,     **_UpperCAmelCase       ):
											pass

def       __A (     a_  :Image)						->						str:
				__a	:  List[str]         =					hashlib.mda(image.tobytes())
				return m.hexdigest()[:10]

def       __A (     a_  :Image)						->						Dict:
				__a	:  Any         =					np.array(a_)
				__a	:  Tuple         =					npimg.shape
				return {"hash": hashimage(a_), "shape": shape}






@is_pipeline_test
@require_vision
@require_torch
class 			__lowercase     (     unittest.TestCase							):







					'''simple docstring'''




					__lowerCAmelCase					=					dict(
					    (list(MODEL_FOR_MASK_GENERATION_MAPPING.items()							) if MODEL_FOR_MASK_GENERATION_MAPPING else [])							)
					__lowerCAmelCase					=					dict(
					    (list(TF_MODEL_FOR_MASK_GENERATION_MAPPING.items()							) if TF_MODEL_FOR_MASK_GENERATION_MAPPING else [])							)







					def 	_lowerCamelCase						(  self		,     _UpperCAmelCase		,     _UpperCAmelCase		,     _UpperCAmelCase       ):
									__a	:  List[str]         =					MaskGenerationPipeline(model=_UpperCAmelCase		,     image_processor=_UpperCAmelCase       )
									return image_segmenter, [
									    "./tests/fixtures/tests_samples/COCO/000000039769.png",
									    "./tests/fixtures/tests_samples/COCO/000000039769.png",
									]







					def 	_lowerCamelCase						(  self		,     _UpperCAmelCase		,     _UpperCAmelCase       ):
									pass







					@require_tf
					@unittest.skip('''Image segmentation not implemented in TF'''       )
					def 	_lowerCamelCase						(  self       ):
									pass







					@slow
					@require_torch
					def 	_lowerCamelCase						(  self       ):
									__a	:  Dict         =					pipeline('''mask-generation'''		,     model='''facebook/sam-vit-huge'''       )

									__a	:  Optional[Any]         =					image_segmenter('''http://images.cocodataset.org/val2017/000000039769.jpg'''		,     points_per_batch=256       )

									# Shortening by hashing
									__a	:  Optional[int]         =					[]
									for i, o in enumerate(outputs['''masks''']       ):
													new_outupt += [{"mask": mask_to_test_readable(_UpperCAmelCase       ), "scores": outputs["scores"][i]}]

									# fmt: off
									self.assertEqual(
									    nested_simplify(_UpperCAmelCase		,     decimals=4       )		,     [
									        {'''mask''': {'''hash''': '''115ad19f5f''', '''shape''': (480, 640)}, '''scores''': 1.0_4_4_4},
									        {'''mask''': {'''hash''': '''6affa964c6''', '''shape''': (480, 640)}, '''scores''': 1.0_2_1},
									        {'''mask''': {'''hash''': '''dfe28a0388''', '''shape''': (480, 640)}, '''scores''': 1.0_1_6_7},
									        {'''mask''': {'''hash''': '''c0a5f4a318''', '''shape''': (480, 640)}, '''scores''': 1.0_1_3_2},
									        {'''mask''': {'''hash''': '''fe8065c197''', '''shape''': (480, 640)}, '''scores''': 1.0_0_5_3},
									        {'''mask''': {'''hash''': '''e2d0b7a0b7''', '''shape''': (480, 640)}, '''scores''': 0.9_9_6_7},
									        {'''mask''': {'''hash''': '''453c7844bd''', '''shape''': (480, 640)}, '''scores''': 0.9_9_3},
									        {'''mask''': {'''hash''': '''3d44f2926d''', '''shape''': (480, 640)}, '''scores''': 0.9_9_0_9},
									        {'''mask''': {'''hash''': '''64033ddc3f''', '''shape''': (480, 640)}, '''scores''': 0.9_8_7_9},
									        {'''mask''': {'''hash''': '''801064ff79''', '''shape''': (480, 640)}, '''scores''': 0.9_8_3_4},
									        {'''mask''': {'''hash''': '''6172f276ef''', '''shape''': (480, 640)}, '''scores''': 0.9_7_1_6},
									        {'''mask''': {'''hash''': '''b49e60e084''', '''shape''': (480, 640)}, '''scores''': 0.9_6_1_2},
									        {'''mask''': {'''hash''': '''a811e775fd''', '''shape''': (480, 640)}, '''scores''': 0.9_5_9_9},
									        {'''mask''': {'''hash''': '''a6a8ebcf4b''', '''shape''': (480, 640)}, '''scores''': 0.9_5_5_2},
									        {'''mask''': {'''hash''': '''9d8257e080''', '''shape''': (480, 640)}, '''scores''': 0.9_5_3_2},
									        {'''mask''': {'''hash''': '''32de6454a8''', '''shape''': (480, 640)}, '''scores''': 0.9_5_1_6},
									        {'''mask''': {'''hash''': '''af3d4af2c8''', '''shape''': (480, 640)}, '''scores''': 0.9_4_9_9},
									        {'''mask''': {'''hash''': '''3c6db475fb''', '''shape''': (480, 640)}, '''scores''': 0.9_4_8_3},
									        {'''mask''': {'''hash''': '''c290813fb9''', '''shape''': (480, 640)}, '''scores''': 0.9_4_6_4},
									        {'''mask''': {'''hash''': '''b6f0b8f606''', '''shape''': (480, 640)}, '''scores''': 0.9_4_3},
									        {'''mask''': {'''hash''': '''92ce16bfdf''', '''shape''': (480, 640)}, '''scores''': 0.9_4_3},
									        {'''mask''': {'''hash''': '''c749b25868''', '''shape''': (480, 640)}, '''scores''': 0.9_4_0_8},
									        {'''mask''': {'''hash''': '''efb6cab859''', '''shape''': (480, 640)}, '''scores''': 0.9_3_3_5},
									        {'''mask''': {'''hash''': '''1ff2eafb30''', '''shape''': (480, 640)}, '''scores''': 0.9_3_2_6},
									        {'''mask''': {'''hash''': '''788b798e24''', '''shape''': (480, 640)}, '''scores''': 0.9_2_6_2},
									        {'''mask''': {'''hash''': '''abea804f0e''', '''shape''': (480, 640)}, '''scores''': 0.8_9_9_9},
									        {'''mask''': {'''hash''': '''7b9e8ddb73''', '''shape''': (480, 640)}, '''scores''': 0.8_9_8_6},
									        {'''mask''': {'''hash''': '''cd24047c8a''', '''shape''': (480, 640)}, '''scores''': 0.8_9_8_4},
									        {'''mask''': {'''hash''': '''6943e6bcbd''', '''shape''': (480, 640)}, '''scores''': 0.8_8_7_3},
									        {'''mask''': {'''hash''': '''b5f47c9191''', '''shape''': (480, 640)}, '''scores''': 0.8_8_7_1}
									    ]		,     )
									# fmt: on







					@require_torch
					@slow
					def 	_lowerCamelCase						(  self       ):
									__a	:  Dict         =					'''facebook/sam-vit-huge'''
									__a	:  Tuple         =					pipeline('''mask-generation'''		,     model=_UpperCAmelCase       )

									__a	:  List[Any]         =					image_segmenter(
									    '''http://images.cocodataset.org/val2017/000000039769.jpg'''		,     pred_iou_thresh=1		,     points_per_batch=256       )

									# Shortening by hashing
									__a	:  Optional[int]         =					[]
									for i, o in enumerate(outputs['''masks''']       ):
													new_outupt += [{"mask": mask_to_test_readable(_UpperCAmelCase       ), "scores": outputs["scores"][i]}]

									self.assertEqual(
									    nested_simplify(_UpperCAmelCase		,     decimals=4       )		,     [
									        {'''mask''': {'''hash''': '''115ad19f5f''', '''shape''': (480, 640)}, '''scores''': 1.0_4_4_4},
									        {'''mask''': {'''hash''': '''6affa964c6''', '''shape''': (480, 640)}, '''scores''': 1.0_2_1_0},
									        {'''mask''': {'''hash''': '''dfe28a0388''', '''shape''': (480, 640)}, '''scores''': 1.0_1_6_7},
									        {'''mask''': {'''hash''': '''c0a5f4a318''', '''shape''': (480, 640)}, '''scores''': 1.0_1_3_2},
									        {'''mask''': {'''hash''': '''fe8065c197''', '''shape''': (480, 640)}, '''scores''': 1.0_0_5_3},
									    ]		,     )