a
    
d|B                     @   s  d dl mZ d dlmZ d dlmZmZmZ d dlm	Z	 ddl
mZ e rdd dlmZ d dlmZ nd dl mZ d	d
 ZeG dd dZeG dd dZeG dd dZeG dd dZG dd deeZeG dd dZeG dd dZeG dd dZeG dd dZeG dd dZG dd  d e	ZG d!d" d"eZG d#d$ d$eZG d%d& d&eZG d'd( d(eZe	ed)d*d+Z d,S )-    )field)Enum)ListNoReturnOptional)	HTTPError   )is_pydantic_available)	validator)	dataclassc                 C   s   dd S )Nc                 S   s   | S N )yr   r   s/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/huggingface_hub/inference/_text_generation.py<lambda>,       zvalidator.<locals>.<lambda>r   )xr   r   r   r
   +   s    r
   c                   @   st  e Zd ZU dZdZeed< dZeed< dZ	e
e ed< dZeed< ed	d
 dZee ed< dZe
e ed< dZe
e ed< dZe
e ed< dZe
e ed< dZe
e ed< dZe
e ed< dZe
e ed< dZeed< dZeed< dZeed< eddd Zeddd Zeddd Zeddd Zeddd  Z edd!d" Z!edd#d$ Z"edd%d& Z#dS )'TextGenerationParametersa  
    Parameters for text generation.

    Args:
        do_sample (`bool`, *optional*):
            Activate logits sampling. Defaults to False.
        max_new_tokens (`int`, *optional*):
            Maximum number of generated tokens. Defaults to 20.
        repetition_penalty (`Optional[float]`, *optional*):
            The parameter for repetition penalty. A value of 1.0 means no penalty. See [this paper](https://arxiv.org/pdf/1909.05858.pdf)
            for more details. Defaults to None.
        return_full_text (`bool`, *optional*):
            Whether to prepend the prompt to the generated text. Defaults to False.
        stop (`List[str]`, *optional*):
            Stop generating tokens if a member of `stop_sequences` is generated. Defaults to an empty list.
        seed (`Optional[int]`, *optional*):
            Random sampling seed. Defaults to None.
        temperature (`Optional[float]`, *optional*):
            The value used to modulate the logits distribution. Defaults to None.
        top_k (`Optional[int]`, *optional*):
            The number of highest probability vocabulary tokens to keep for top-k-filtering. Defaults to None.
        top_p (`Optional[float]`, *optional*):
            If set to a value less than 1, only the smallest set of most probable tokens with probabilities that add up
            to `top_p` or higher are kept for generation. Defaults to None.
        truncate (`Optional[int]`, *optional*):
            Truncate input tokens to the given size. Defaults to None.
        typical_p (`Optional[float]`, *optional*):
            Typical Decoding mass. See [Typical Decoding for Natural Language Generation](https://arxiv.org/abs/2202.00666)
            for more information. Defaults to None.
        best_of (`Optional[int]`, *optional*):
            Generate `best_of` sequences and return the one with the highest token logprobs. Defaults to None.
        watermark (`bool`, *optional*):
            Watermarking with [A Watermark for Large Language Models](https://arxiv.org/abs/2301.10226). Defaults to False.
        details (`bool`, *optional*):
            Get generation details. Defaults to False.
        decoder_input_details (`bool`, *optional*):
            Get decoder input token logprobs and ids. Defaults to False.
    F	do_sample   max_new_tokensNrepetition_penaltyreturn_full_textc                   C   s   g S r   r   r   r   r   r   r   b   r   z!TextGenerationParameters.<lambda>default_factorystopseedtemperaturetop_ktop_ptruncate	typical_pbest_of	watermarkdetailsdecoder_input_detailsc                 C   s   |d ur|dkrt d|dkr4|d d ur4t d|d |d d uB |d d uB |d	 d uB |d
 d uB }|dkr|st d|S )Nr   z#`best_of` must be strictly positive   r   z,`seed` must not be set when `best_of` is > 1r   r   r   r   r!   z+you must use sampling when `best_of` is > 1
ValueError)clsfield_valuevaluesZsamplingr   r   r   valid_best_ofz   s$    



z&TextGenerationParameters.valid_best_ofc                 C   s   |d ur|dkrt d|S )Nr   z.`repetition_penalty` must be strictly positiver'   r)   vr   r   r   valid_repetition_penalty   s    z1TextGenerationParameters.valid_repetition_penaltyc                 C   s   |d ur|dk rt d|S )Nr   z`seed` must be positiver'   r-   r   r   r   
valid_seed   s    z#TextGenerationParameters.valid_seedc                 C   s   |d ur|dkrt d|S )Nr   z'`temperature` must be strictly positiver'   r-   r   r   r   
valid_temp   s    z#TextGenerationParameters.valid_tempc                 C   s   |d ur|dkrt d|S )Nr   z!`top_k` must be strictly positiver'   r-   r   r   r   valid_top_k   s    z$TextGenerationParameters.valid_top_kc                 C   s$   |d ur |dks|dkr t d|S )Nr         ?z`top_p` must be > 0.0 and < 1.0r'   r-   r   r   r   valid_top_p   s    z$TextGenerationParameters.valid_top_pc                 C   s   |d ur|dkrt d|S )Nr   z$`truncate` must be strictly positiver'   r-   r   r   r   valid_truncate   s    z'TextGenerationParameters.valid_truncatec                 C   s$   |d ur |dks|dkr t d|S )Nr   r3   z#`typical_p` must be > 0.0 and < 1.0r'   r-   r   r   r   valid_typical_p   s    z(TextGenerationParameters.valid_typical_p)$__name__
__module____qualname____doc__r   bool__annotations__r   intr   r   floatr   r   r   r   strr   r   r   r   r    r!   r"   r#   r$   r%   r
   r,   r/   r0   r1   r2   r4   r5   r6   r   r   r   r   r   /   s@   
(






r   c                   @   sV   e Zd ZU dZeed< dZee ed< dZ	e
ed< eddd Zedd	d
 ZdS )TextGenerationRequestac  
    Request object for text generation (only for internal use).

    Args:
        inputs (`str`):
            The prompt for text generation.
        parameters (`Optional[TextGenerationParameters]`, *optional*):
            Generation parameters.
        stream (`bool`, *optional*):
            Whether to stream output tokens. Defaults to False.
    inputsN
parametersFstreamc                 C   s   |st d|S )Nz`inputs` cannot be emptyr'   r-   r   r   r   valid_input   s    z!TextGenerationRequest.valid_inputc                 C   s4   |d }|d ur0|j d ur0|j dkr0|r0td|S )NrB   r&   z5`best_of` != 1 is not supported when `stream` == True)r"   r(   )r)   r*   r+   rB   r   r   r   valid_best_of_stream   s     z*TextGenerationRequest.valid_best_of_stream)r7   r8   r9   r:   r?   r<   rB   r   r   rC   r;   r
   rD   rE   r   r   r   r   r@      s   

r@   c                   @   s2   e Zd ZU dZeed< eed< dZee	 ed< dS )
InputTokena1  
    Represents an input token.

    Args:
        id (`int`):
            Token ID from the model tokenizer.
        text (`str`):
            Token text.
        logprob (`float` or `None`):
            Log probability of the token. Optional since the logprob of the first token cannot be computed.
    idtextNlogprob)
r7   r8   r9   r:   r=   r<   r?   rI   r   r>   r   r   r   r   rF      s   
rF   c                   @   s2   e Zd ZU dZeed< eed< eed< eed< dS )Tokenat  
    Represents a token.

    Args:
        id (`int`):
            Token ID from the model tokenizer.
        text (`str`):
            Token text.
        logprob (`float`):
            Log probability of the token.
        special (`bool`):
            Indicates whether the token is a special token. It can be used to ignore
            tokens when concatenating.
    rG   rH   rI   ZspecialN)	r7   r8   r9   r:   r=   r<   r?   r>   r;   r   r   r   r   rJ      s
   
rJ   c                   @   s   e Zd ZdZdZdZdS )FinishReasonlengthZ	eos_tokenZstop_sequenceN)r7   r8   r9   ZLengthZEndOfSequenceTokenZStopSequencer   r   r   r   rK     s   rK   c                   @   sn   e Zd ZU dZeed< eed< eed< dZe	e ed< e
dd d	Zee ed
< e
dd d	Zee ed< dS )BestOfSequencea  
    Represents a best-of sequence generated during text generation.

    Args:
        generated_text (`str`):
            The generated text.
        finish_reason (`FinishReason`):
            The reason for the generation to finish, represented by a `FinishReason` value.
        generated_tokens (`int`):
            The number of generated tokens in the sequence.
        seed (`Optional[int]`):
            The sampling seed if sampling was activated.
        prefill (`List[InputToken]`):
            The decoder input tokens. Empty if `decoder_input_details` is False. Defaults to an empty list.
        tokens (`List[Token]`):
            The generated tokens. Defaults to an empty list.
    generated_textfinish_reasongenerated_tokensNr   c                   C   s   g S r   r   r   r   r   r   r   8  r   zBestOfSequence.<lambda>r   prefillc                   C   s   g S r   r   r   r   r   r   r   :  r   tokens)r7   r8   r9   r:   r?   r<   rK   r=   r   r   r   rQ   r   rF   rR   rJ   r   r   r   r   rM     s   
rM   c                   @   sz   e Zd ZU dZeed< eed< dZee ed< e	dd dZ
ee ed	< e	d
d dZee ed< dZeee  ed< dS )Detailsa  
    Represents details of a text generation.

    Args:
        finish_reason (`FinishReason`):
            The reason for the generation to finish, represented by a `FinishReason` value.
        generated_tokens (`int`):
            The number of generated tokens.
        seed (`Optional[int]`):
            The sampling seed if sampling was activated.
        prefill (`List[InputToken]`, *optional*):
            The decoder input tokens. Empty if `decoder_input_details` is False. Defaults to an empty list.
        tokens (`List[Token]`):
            The generated tokens. Defaults to an empty list.
        best_of_sequences (`Optional[List[BestOfSequence]]`):
            Additional sequences when using the `best_of` parameter.
    rO   rP   Nr   c                   C   s   g S r   r   r   r   r   r   r   Y  r   zDetails.<lambda>r   rQ   c                   C   s   g S r   r   r   r   r   r   r   [  r   rR   best_of_sequences)r7   r8   r9   r:   rK   r<   r=   r   r   r   rQ   r   rF   rR   rJ   rT   rM   r   r   r   r   rS   >  s   
rS   c                   @   s*   e Zd ZU dZeed< dZee ed< dS )TextGenerationResponsea\  
    Represents a response for text generation.

    In practice, if `details=False` is passed (default), only the generated text is returned.

    Args:
        generated_text (`str`):
            The generated text.
        details (`Optional[Details]`):
            Generation details. Returned only if `details=True` is sent to the server.
    rN   Nr$   )	r7   r8   r9   r:   r?   r<   r$   r   rS   r   r   r   r   rU   a  s   
rU   c                   @   s2   e Zd ZU dZeed< eed< dZee ed< dS )StreamDetailsao  
    Represents details of a text generation stream.

    Args:
        finish_reason (`FinishReason`):
            The reason for the generation to finish, represented by a `FinishReason` value.
        generated_tokens (`int`):
            The number of generated tokens.
        seed (`Optional[int]`):
            The sampling seed if sampling was activated.
    rO   rP   Nr   )	r7   r8   r9   r:   rK   r<   r=   r   r   r   r   r   r   rV   v  s   
rV   c                   @   s:   e Zd ZU dZeed< dZee ed< dZ	ee
 ed< dS )TextGenerationStreamResponsea  
    Represents a response for text generation when `stream=True` is passed

    Args:
        token (`Token`):
            The generated token.
        generated_text (`Optional[str]`, *optional*):
            The complete generated text. Only available when the generation is finished.
        details (`Optional[StreamDetails]`, *optional*):
            Generation details. Only available when the generation is finished.
    tokenNrN   r$   )r7   r8   r9   r:   rJ   r<   rN   r   r?   r$   rV   r   r   r   r   rW     s   
rW   c                   @   s   e Zd ZdZdS )TextGenerationErrorz3Generic error raised if text-generation went wrong.Nr7   r8   r9   r:   r   r   r   r   rY     s   rY   c                   @   s   e Zd ZdZdS )ValidationErrorzServer-side validation error.NrZ   r   r   r   r   r[     s   r[   c                   @   s   e Zd ZdS )GenerationErrorNr7   r8   r9   r   r   r   r   r\     s   r\   c                   @   s   e Zd ZdS )OverloadedErrorNr]   r   r   r   r   r^     s   r^   c                   @   s   e Zd ZdS )IncompleteGenerationErrorNr]   r   r   r   r   r_     s   r_   )
http_errorreturnc                 C   s   z.t | ddp| j }|d}|d}W n tyD   | Y n0 |dur|dkr`t|| |dkrrt|| |dkrt|| |dkrt|| | dS )	z
    Try to parse text-generation-inference error message and raise HTTPError in any case.

    Args:
        error (`HTTPError`):
            The HTTPError that have been raised.
    Zresponse_error_payloadNerror
error_typeZ
generationZincomplete_generationZ
overloadedZ
validation)	getattrresponsejsonget	Exceptionr\   r_   r^   r[   )r`   payloadmessagerc   r   r   r   raise_text_generation_error  s     






rk   N)!Zdataclassesr   enumr   typingr   r   r   requestsr   utilsr	   Zpydanticr
   Zpydantic.dataclassesr   r   r@   rF   rJ   r?   rK   rM   rS   rU   rV   rW   rY   r[   r\   r^   r_   rk   r   r   r   r   <module>   sF    	#
""