U
    h-                     @  s   d dl mZ d dlZd dlmZ d dlmZmZmZm	Z	m
Z
mZmZ d dlmZmZ 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rd dlZd dlmZ e e!Z"G dd deZ#G dd de#eZ$dS )    )annotationsN)cached_property)TYPE_CHECKINGAnyAsyncIteratorDictIteratorListOptional)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseLLM)Serializable)
GenerationGenerationChunk	LLMResult)pre_init)
get_fieldsc                   @  s  e Zd ZU dZded< dZded< dZded< dZded< dZded< dZ	ded< dZ
ded	< dZded
< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded < ed!d"d#d$Zed%d"d&d'Zedd"d(d)Ze d*d"d+d,Z!e"d-d-d.d/d0Z#ed1d"d2d3Z$dJd4dd5d6d7d8Z%dKd4dd5d6d9d:Z&d;d"d<d=Z'd;d"d>d?Z(d!d@dAdBdCZ)d!d@dAdDdEZ*d!dFdGdHdIZ+dS )L_BaseGigaChatNzOptional[str]base_urlauth_urlcredentialsscopeaccess_tokenmodeluserpasswordzOptional[float]timeoutOptional[bool]verify_ssl_certsca_bundle_file	cert_filekey_filekey_file_passwordTbool	profanityprofanity_checkF	streamingtemperaturezOptional[int]
max_tokensuse_api_for_tokensverbosetop_prepetition_penaltyupdate_intervalstr)returnc                 C  s   dS )Nzgiga-chat-model selfr1   r1   E/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/llms/gigachat.py	_llm_typeL   s    z_BaseGigaChat._llm_typezDict[str, str]c                 C  s   dddddS )NZGIGACHAT_CREDENTIALSZGIGACHAT_ACCESS_TOKENZGIGACHAT_PASSWORDZGIGACHAT_KEY_FILE_PASSWORD)r   r   r   r#   r1   r2   r1   r1   r4   
lc_secretsP   s
    z_BaseGigaChat.lc_secretsc                 C  s   dS )NTr1   r2   r1   r1   r4   lc_serializableY   s    z_BaseGigaChat.lc_serializablezgigachat.GigaChatc                 C  sR   ddl }|j| j| j| j| j| j| j| j| j	| j
| j| j| j| j| j| j| jdS )zReturns GigaChat API clientr   N)r   r   r   r   r   r   r&   r   r   r   r   r    r!   r"   r#   r+   )gigachatGigaChatr   r   r   r   r   r   r&   r   r   r   r   r    r!   r"   r#   r+   )r3   r8   r1   r1   r4   _client]   s&    z_BaseGigaChat._clientr   )valuesr0   c                 C  s   zddl }W n tk
r(   tdY nX tt|  }t| | }|r`td| d d|kr|ddkrtd |d	dkr|d|d	< |S )
zJValidate authenticate data in environment and python package is installed.r   NzXCould not import gigachat python package. Please install it with `pip install gigachat`.zExtra fields z in GigaChat classr%   Fz?'profanity' field is deprecated. Use 'profanity_check' instead.r&   )r8   ImportErrorsetr   keysloggerwarningget)clsr;   r8   fieldsZdiffr1   r1   r4   validate_environmentu   s"    
z"_BaseGigaChat.validate_environmentDict[str, Any]c                 C  s"   | j | j| j| j| j| j| jdS )zGet the identifying parameters.)r(   r   r%   r'   r)   r,   r-   )r(   r   r&   r'   r)   r,   r-   r2   r1   r1   r4   _identifying_params   s    z!_BaseGigaChat._identifying_params	List[str]zList[gm.TokensCount])input_r   r0   c                 C  s   | j ||S )zGet tokens of string list)r:   tokens_countr3   rH   r   r1   r1   r4   rI      s    z_BaseGigaChat.tokens_countc                   s   | j ||I dH S )z"Get tokens of strings list (async)N)r:   atokens_countrJ   r1   r1   r4   rK      s    z_BaseGigaChat.atokens_countz	gm.Modelsc                 C  s
   | j  S )z Get available models of Gigachat)r:   
get_modelsr2   r1   r1   r4   rL      s    z_BaseGigaChat.get_modelsc                   s   | j  I dH S )z(Get available models of Gigachat (async)N)r:   aget_modelsr2   r1   r1   r4   rM      s    z_BaseGigaChat.aget_modelszgm.Model)r   r0   c                 C  s   | j |S )zGet info about model)r:   	get_modelr3   r   r1   r1   r4   rN      s    z_BaseGigaChat.get_modelc                   s   | j |I dH S )zGet info about model (async)N)r:   
aget_modelrO   r1   r1   r4   rP      s    z_BaseGigaChat.aget_modelint)textr0   c                 C  s,   | j r| |gd jS tt|d S dS )z"Count approximate number of tokensr   gffffff@N)r*   rI   tokensroundlen)r3   rR   r1   r1   r4   get_num_tokens   s    z_BaseGigaChat.get_num_tokens)N)N),__name__
__module____qualname__r   __annotations__r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   propertyr5   r6   r7   r   r:   r   rD   rF   rI   rK   rL   rM   rN   rP   rV   r1   r1   r1   r4   r      sZ   
  r   c                   @  s   e Zd ZU dZdZded< ddddd	Zd
ddddZd"ddddd
ddddZd#ddddd
ddddZ	d$dddd
ddddZ
d%dddd
ddddZG d d! d!ZdS )&r9   a7  `GigaChat` large language models API.

    To use, you should pass login and password to access GigaChat API or use token.

    Example:
        .. code-block:: python

            from langchain_community.llms import GigaChat
            giga = GigaChat(credentials=..., scope=..., verify_ssl_certs=False)
    r   r/   payload_rolerG   rE   )messagesr0   c                   s   d fdd|D i} j r& j |d<  jd k	r: j|d<  jd k	rN j|d<  jd k	rb j|d<  jd k	rv j|d<  jd k	r j|d	<  jd k	r j|d
<  jrt	d| |S )Nr]   c                   s   g | ]} j |d qS ))rolecontent)r\   ).0mr2   r1   r4   
<listcomp>   s     z+GigaChat._build_payload.<locals>.<listcomp>r   r&   r(   r,   r)   r-   r.   zGiga request: %s)
r   r&   r(   r,   r)   r-   r.   r+   r?   info)r3   r]   payloadr1   r2   r4   _build_payload   s(     












zGigaChat._build_payloadr   r   )responser0   c                 C  s~   g }|j D ]T}|j}t|jjd|id}||g |dkrHtd| | jr
t	d|jj q
|j
}||jd}t||dS )Nfinish_reason)rR   Zgeneration_infostopz'Giga generation stopped with reason: %szGiga response: %s)token_usageZ
model_name)generations
llm_output)choicesrg   r   messager_   appendr?   r@   r+   rc   usager   r   )r3   rf   rj   resrg   genri   rk   r1   r1   r4   _create_llm_result   s$    
zGigaChat._create_llm_resultNzOptional[List[str]]z"Optional[CallbackManagerForLLMRun]r   )promptsrh   run_managerstreamkwargsr0   c                 K  s   |d k	r|n| j }|rpd }| j|d f||d|}|D ]}	|d krL|	}q:||	7 }q:|d k	sbtt|ggdS | |}
| j|
}| |S Nr   )rh   rt   )rj   )r'   _streamAssertionErrorr   re   r:   Zchatrr   r3   rs   rh   rt   ru   rv   Zshould_streamZ
generationZstream_iterchunkrd   rf   r1   r1   r4   	_generate   s(     

zGigaChat._generatez'Optional[AsyncCallbackManagerForLLMRun]c                   s   |d k	r|n| j }|rzd }| j|d f||d|}|2 z"3 d H W }	|d krT|	}q:||	7 }q:6 |d k	sltt|ggdS | |}
| j|
I d H }| |S rw   )r'   _astreamry   r   re   r:   Zachatrr   rz   r1   r1   r4   
_agenerate  s(     
zGigaChat._ageneratezIterator[GenerationChunk])promptrh   rt   rv   r0   c                 k  sP   |  |g}| j|D ]2}|jr|jd jj}t|dV  |r|| qd S Nr   )rR   )re   r:   ru   rl   deltar_   r   on_llm_new_tokenr3   r   rh   rt   rv   rd   r{   r_   r1   r1   r4   rx   -  s    zGigaChat._streamzAsyncIterator[GenerationChunk]c                 K s`   |  |g}| j|2 z@3 d H W }|jr|jd jj}t|dV  |r||I d H  q6 d S r   )re   r:   Zastreamrl   r   r_   r   r   r   r1   r1   r4   r}   =  s    zGigaChat._astreamc                   @  s   e Zd ZdZdS )zGigaChat.ConfigZallowN)rW   rX   rY   extrar1   r1   r1   r4   ConfigM  s   r   )NNN)NNN)NN)NN)rW   rX   rY   __doc__r\   rZ   re   rr   r|   r~   rx   r}   r   r1   r1   r1   r4   r9      s&   
          r9   )%
__future__r   logging	functoolsr   typingr   r   r   r   r   r	   r
   Zlangchain_core.callbacksr   r   Z#langchain_core.language_models.llmsr   Z langchain_core.load.serializabler   Zlangchain_core.outputsr   r   r   Zlangchain_core.utilsr   Zlangchain_core.utils.pydanticr   r8   Zgigachat.modelsmodelsZgm	getLoggerrW   r?   r   r9   r1   r1   r1   r4   <module>   s    $
 %