U
    9%eeB                     @   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   i/var/www/html/Darija-Ai-API/env/lib/python3.8/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   a   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 k	r|dkrt d|dkr4|d d k	r4t d|d |d d k	B |d d k	B |d	 d k	B |d
 d k	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_ofy   s$    



z&TextGenerationParameters.valid_best_ofc                 C   s   |d k	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 k	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 k	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 k	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 k	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 k	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 k	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 k	r0|j d k	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   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   rL     s   rL   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   7  r   zBestOfSequence.<lambda>r   prefillc                   C   s   g S r   r   r   r   r   r   r   9  r   tokens)r7   r8   r9   r:   r?   r<   rL   r=   r   r   r   rR   r   rF   rS   rJ   r   r   r   r   rN     s   
rN   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.
    rP   rQ   Nr   c                   C   s   g S r   r   r   r   r   r   r   X  r   zDetails.<lambda>r   rR   c                   C   s   g S r   r   r   r   r   r   r   Z  r   rS   best_of_sequences)r7   r8   r9   r:   rL   r<   r=   r   r   r   rR   r   rF   rS   rJ   rU   rN   r   r   r   r   rT   =  s   
rT   c                   @   s*   e Zd ZU dZeed< dZee ed< dS )TextGenerationResponseaE  
    Represents a response for text generation.

    Only returned when `details=True`, otherwise a string is returned.

    Args:
        generated_text (`str`):
            The generated text.
        details (`Optional[Details]`):
            Generation details. Returned only if `details=True` is sent to the server.
    rO   Nr$   )	r7   r8   r9   r:   r?   r<   r$   r   rT   r   r   r   r   rV   `  s   
rV   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.
    rP   rQ   Nr   )	r7   r8   r9   r:   rL   r<   r=   r   r   r   r   r   r   rW   u  s   
rW   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 streaming text generation.

    Only returned when `details=True` and `stream=True`.

    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.
    tokenNrO   r$   )r7   r8   r9   r:   rJ   r<   rO   r   r?   r$   rW   r   r   r   r   rX     s   
rX   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   rZ     s   rZ   c                   @   s   e Zd ZdZdS )ValidationErrorzServer-side validation error.Nr[   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k
rF   | Y nX |dk	r|dkrbt|| |dkrtt|| |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\   )ra   payloadmessagerd   r   r   r   raise_text_generation_error  s     






rl   N)!dataclassesr   enumr   typingr   r   r   requestsr   utilsr	   Zpydanticr
   Zpydantic.dataclassesr   r   r@   rF   rJ   r?   rL   rN   rT   rV   rW   rX   rZ   r\   r]   r_   r`   rl   r   r   r   r   <module>   sF    	#
"" 