


# Copyright 2023 The HuggingFace Inc. team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import re

from ..models.auto import AutoProcessor
from ..models.vision_encoder_decoder import VisionEncoderDecoderModel
from ..utils import is_vision_available
from .base import PipelineTool


if is_vision_available():
				from PIL import Image






class    _UpperCamelCase     (       __snake_case					):

				"""simple docstring"""







				lowerCAmelCase					=			'naver-clova-ix/donut-base-finetuned-docvqa'
				lowerCAmelCase					=			(
				    'This is a tool that answers a question about an document (pdf). It takes an input named `document` which '
				    'should be the document containing the information, as well as a `question` that is the question about the '
				    'document. It returns a text that contains the answer to the question.'
				)
				lowerCAmelCase					=			'document_qa'
				lowerCAmelCase					=			AutoProcessor
				lowerCAmelCase					=			VisionEncoderDecoderModel

				lowerCAmelCase					=			['image', 'text']
				lowerCAmelCase					=			['text']

				def __init__(    self					, *a__					, **a__ )						->					List[str]:
					if not is_vision_available():
						raise ValueError("""Pillow must be installed to use the DocumentQuestionAnsweringTool.""" )

					super().__init__(*a__					, **a__ )

				def   _UpperCAmelCase       (    self					, a__					, a__ )						->					Dict:
					A             =					"""<s_docvqa><s_question>{user_input}</s_question><s_answer>"""
					A             =					task_prompt.replace("""{user_input}"""					, a__ )
					A             =					self.pre_processor.tokenizer(
					    a__					, add_special_tokens=a__					, return_tensors="""pt""" ).input_ids
					A             =					self.pre_processor(a__					, return_tensors="""pt""" ).pixel_values

					return {"decoder_input_ids": decoder_input_ids, "pixel_values": pixel_values}

				def   _UpperCAmelCase       (    self					, a__ )						->					Optional[Any]:
					return self.model.generate(
					    inputs["""pixel_values"""].to(self.device )					, decoder_input_ids=inputs["""decoder_input_ids"""].to(self.device )					, max_length=self.model.decoder.config.max_position_embeddings					, early_stopping=a__					, pad_token_id=self.pre_processor.tokenizer.pad_token_id					, eos_token_id=self.pre_processor.tokenizer.eos_token_id					, use_cache=a__					, num_beams=1					, bad_words_ids=[[self.pre_processor.tokenizer.unk_token_id]]					, return_dict_in_generate=a__					, ).sequences

				def   _UpperCAmelCase       (    self					, a__ )						->					Union[str, Any]:
					A             =					self.pre_processor.batch_decode(a__ )[0]
					A             =					sequence.replace(self.pre_processor.tokenizer.eos_token					, """""" )
					A             =					sequence.replace(self.pre_processor.tokenizer.pad_token					, """""" )
					A             =					re.sub(r"""<.*?>"""					, """"""					, a__					, count=1 ).strip()  # remove first task start token
					A             =					self.pre_processor.tokenajson(a__ )

					return sequence["answer"]







from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_flax_available,
    is_tf_available,
    is_torch_available,
)


_lowercase							:   int						=						{
    "configuration_roberta_prelayernorm": [
        "ROBERTA_PRELAYERNORM_PRETRAINED_CONFIG_ARCHIVE_MAP",
        "RobertaPreLayerNormConfig",
        "RobertaPreLayerNormOnnxConfig",
    ],
}

try:
				if not is_torch_available():
								raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
				pass
else:
				_lowercase							:   List[Any]						=						[
				    "ROBERTA_PRELAYERNORM_PRETRAINED_MODEL_ARCHIVE_LIST",
				    "RobertaPreLayerNormForCausalLM",
				    "RobertaPreLayerNormForMaskedLM",
				    "RobertaPreLayerNormForMultipleChoice",
				    "RobertaPreLayerNormForQuestionAnswering",
				    "RobertaPreLayerNormForSequenceClassification",
				    "RobertaPreLayerNormForTokenClassification",
				    "RobertaPreLayerNormModel",
				    "RobertaPreLayerNormPreTrainedModel",
				]

try:
				if not is_tf_available():
								raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
				pass
else:
				_lowercase							:   Optional[int]						=						[
				    "TF_ROBERTA_PRELAYERNORM_PRETRAINED_MODEL_ARCHIVE_LIST",
				    "TFRobertaPreLayerNormForCausalLM",
				    "TFRobertaPreLayerNormForMaskedLM",
				    "TFRobertaPreLayerNormForMultipleChoice",
				    "TFRobertaPreLayerNormForQuestionAnswering",
				    "TFRobertaPreLayerNormForSequenceClassification",
				    "TFRobertaPreLayerNormForTokenClassification",
				    "TFRobertaPreLayerNormMainLayer",
				    "TFRobertaPreLayerNormModel",
				    "TFRobertaPreLayerNormPreTrainedModel",
				]

try:
				if not is_flax_available():
								raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
				pass
else:
				_lowercase							:   str						=						[
				    "FlaxRobertaPreLayerNormForCausalLM",
				    "FlaxRobertaPreLayerNormForMaskedLM",
				    "FlaxRobertaPreLayerNormForMultipleChoice",
				    "FlaxRobertaPreLayerNormForQuestionAnswering",
				    "FlaxRobertaPreLayerNormForSequenceClassification",
				    "FlaxRobertaPreLayerNormForTokenClassification",
				    "FlaxRobertaPreLayerNormModel",
				    "FlaxRobertaPreLayerNormPreTrainedModel",
				]


if TYPE_CHECKING:
				from .configuration_roberta_prelayernorm import (
				    ROBERTA_PRELAYERNORM_PRETRAINED_CONFIG_ARCHIVE_MAP,
				    RobertaPreLayerNormConfig,
				    RobertaPreLayerNormOnnxConfig,
				)

				try:
								if not is_torch_available():
												raise OptionalDependencyNotAvailable()
				except OptionalDependencyNotAvailable:
								pass
				else:
								from .modeling_roberta_prelayernorm import (
								    ROBERTA_PRELAYERNORM_PRETRAINED_MODEL_ARCHIVE_LIST,
								    RobertaPreLayerNormForCausalLM,
								    RobertaPreLayerNormForMaskedLM,
								    RobertaPreLayerNormForMultipleChoice,
								    RobertaPreLayerNormForQuestionAnswering,
								    RobertaPreLayerNormForSequenceClassification,
								    RobertaPreLayerNormForTokenClassification,
								    RobertaPreLayerNormModel,
								    RobertaPreLayerNormPreTrainedModel,
								)

				try:
								if not is_tf_available():
												raise OptionalDependencyNotAvailable()
				except OptionalDependencyNotAvailable:
								pass
				else:
								from .modeling_tf_roberta_prelayernorm import (
								    TF_ROBERTA_PRELAYERNORM_PRETRAINED_MODEL_ARCHIVE_LIST,
								    TFRobertaPreLayerNormForCausalLM,
								    TFRobertaPreLayerNormForMaskedLM,
								    TFRobertaPreLayerNormForMultipleChoice,
								    TFRobertaPreLayerNormForQuestionAnswering,
								    TFRobertaPreLayerNormForSequenceClassification,
								    TFRobertaPreLayerNormForTokenClassification,
								    TFRobertaPreLayerNormMainLayer,
								    TFRobertaPreLayerNormModel,
								    TFRobertaPreLayerNormPreTrainedModel,
								)

				try:
								if not is_flax_available():
												raise OptionalDependencyNotAvailable()
				except OptionalDependencyNotAvailable:
								pass
				else:
								from .modeling_flax_roberta_prelayernorm import (
								    FlaxRobertaPreLayerNormForCausalLM,
								    FlaxRobertaPreLayerNormForMaskedLM,
								    FlaxRobertaPreLayerNormForMultipleChoice,
								    FlaxRobertaPreLayerNormForQuestionAnswering,
								    FlaxRobertaPreLayerNormForSequenceClassification,
								    FlaxRobertaPreLayerNormForTokenClassification,
								    FlaxRobertaPreLayerNormModel,
								    FlaxRobertaPreLayerNormPreTrainedModel,
								)

else:
				import sys

				_lowercase							:   List[Any]						=						_LazyModule(__name__, globals()["__file__"], _import_structure, module_spec=__spec__)



