o
    پi                  	   @   s   d dl mZmZmZmZmZmZ d dlmZm	Z	 d dl
mZ er&d dlmZ G dd deZdi i ddfded	ee d
edefddZdS )    )TYPE_CHECKINGAnyIteratorListOptionalUnion)GenerationParametersSamplingParameters)Transformers)OutlinesLogitsProcessorc                       s   e Zd Z fddZdeeee f deee eee  f dede	d de
d	eeee eee  f fd
dZdeeee f deeee f dede	d de
d	eeeee f  fddZ  ZS )TransformersVisionc                    s   t  || || _d S N)super__init__	processor)selfmodel	tokenizerr   	__class__ W/home/ubuntu/.local/lib/python3.10/site-packages/outlines/models/transformers_vision.pyr      s   
zTransformersVision.__init__promptsmediageneration_parameterslogits_processorr   sampling_parametersreturnc           	      C   s^   | j ||ddd| jj}| ||||}| j||fi |}t|tr*|d}| 	|S )a.  Generate text using `transformers`.

        Arguments
        ---------
        prompts
            A prompt or list of prompts.
        media
            A List[PIL.Image] or List[List[PIL.Image]]
        generation_parameters
            An instance of `GenerationParameters` that contains the prompt,
            the maximum number of tokens, stop sequences and seed. All the
            arguments to `SequenceGeneratorAdapter`'s `__cal__` method.
        logits_processor
            The logits processor to use when generating text.
        sampling_parameters
            An instance of `SamplingParameters`, a dataclass that contains
            the name of the sampler to use and related parameters as available
            in Outlines.

        Returns
        -------
        The generated text
        Tpt)textimagespaddingreturn_tensorsr   )
r   tor   device_get_generation_kwargs_generate_output_seq
isinstancestrsqueeze_decode_generation)	r   r   r   r   r   r   inputsgeneration_kwargsgenerated_idsr   r   r   generate   s   



zTransformersVision.generatec                 C   s   t r   )NotImplementedError)r   r   r   r   r   r   r   r   r   streamA   s   zTransformersVision.stream)__name__
__module____qualname__r   r   r(   r   r   r   r   r	   r.   r   r0   __classcell__r   r   r   r   r   
   s8    
2r   N
model_namer$   model_kwargsprocessor_kwargsc                 C   s   |du s|du rz
ddl m}m} W n ty   tdw |du r$|}|du r*|}|dur2||d< |j| fi |}	|dd |dd	 |j| fi |}
|du rht|
d
dr^|
j}n|j| fi |}n	|j| fi |}t|	||
S )a  Instantiate a model from the `transformers` library and its tokenizer.

    Parameters
    ----------
    model_name
        The name of the model as listed on Hugging Face's model page.
    model_class
        The `PreTrainedModel` class from transformers to use in initializing the vision model from `model_name`.
        https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.PreTrainedModel
    device
        The device(s) on which the model should be loaded. This overrides
        the `device_map` entry in `model_kwargs` when provided.
    model_kwargs
        A dictionary that contains the keyword arguments to pass to the
        `from_pretrained` method when loading the model.
    processor_kwargs
        A dictionary that contains the keyword arguments to pass to the
        `from_pretrained` method when loading the processor.

    Returns
    -------
    A `TransformersModel` model instance.

    Nr   )AutoProcessorAutoTokenizerzWThe `transformers` library needs to be installed in order to use `transformers` models.
device_mappadding_sideleft	pad_tokenz[PAD]r   )	transformersr8   r9   ImportErrorfrom_pretrained
setdefaultgetattrr   r   )r5   model_classr$   r6   r7   tokenizer_classprocessor_classr8   r9   r   r   r   r   r   r   transformers_visionL   s0   !rF   )typingr   r   r   r   r   r   outlines.generate.apir   r	   outlines.modelsr
   outlines.processorsr   r   r(   dictrF   r   r   r   r   <module>   s(     E