U
    h&                     @  s  d dl mZ d dlZd dlmZmZ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mZmZ d dlmZmZmZmZmZmZmZmZmZmZmZm Z  d dl!m"Z"m#Z#m$Z$ d dl%m&Z& erd dl'm(Z) e*e+Z,d	d
dddZ-dd	dddZ.ddddddZ/G dd de&eZ0dS )    )annotationsN)	TYPE_CHECKINGAnyAsyncIteratorDictIteratorListMappingOptionalType)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseChatModelagenerate_from_streamgenerate_from_stream)	AIMessageAIMessageChunkBaseMessageBaseMessageChunkChatMessageChatMessageChunkFunctionMessageFunctionMessageChunkHumanMessageHumanMessageChunkSystemMessageSystemMessageChunk)ChatGenerationChatGenerationChunk
ChatResult)_BaseGigaChatzgm.Messagesr   )messagereturnc                 C  s   ddl m}m} i }| j }rHt||r6t||d< nt|trH||d< | j|jkr`t| j	dS | j|j
krxt| j	dS | j|jkrt| j	|dS td| j d|  d S )Nr   )FunctionCallMessagesRolefunction_callcontentr'   additional_kwargszGot unknown role  )gigachat.modelsr#   r$   r%   
isinstancedictroleSYSTEMr   r'   USERr   	ASSISTANTr   	TypeError)r!   r#   r$   r)   r%    r3   L/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/chat_models/gigachat.py_convert_dict_to_message1   s    


r5   zgm.BaseMessagec                 C  s   ddl m}m} t| tr*||j| jdS t| trD||j| jdS t| t	rj||j
| j| jdd dS t| tr||| j| jdS t| tr||j| jdS td|  d S )Nr   )Messagesr$   )r.   r'   r%   )r.   r'   r%   zGot unknown type )r+   r6   r$   r,   r   r/   r'   r   r0   r   r1   r)   getr   r.   r   ZFUNCTIONr2   )r!   r6   r$   r3   r3   r4   _convert_message_to_dictE   s     




r8   zMapping[str, Any]zType[BaseMessageChunk]r   )_dictdefault_classr"   c                 C  s   |  d}|  dpd}i }|  drVt| d }d|krN|d d krNd|d< ||d< |dksf|tkrpt|dS |dks|tkrt||d	S |d
ks|tkrt|dS |dks|tkrt|| d dS |s|tkrt||dS ||dS d S )Nr.   r'    r%   nameuserr&   Z	assistantr(   systemfunction)r'   r<   )r'   r.   )r7   r-   r   r   r   r   r   )r9   r:   r.   r'   r)   r%   r3   r3   r4   _convert_delta_to_message_chunkZ   s&    



r@   c                   @  s   e Zd ZdZ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	dS )!GigaChata>  `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.chat_models import GigaChat
            giga = GigaChat(credentials=..., scope=..., verify_ssl_certs=False)
    zList[BaseMessage]r   zgm.Chat)messageskwargsr"   c                 K  s   ddl m} |dd |D d}|dd |_| j|_| jd k	rH| j|_| jd k	rZ| j|_| jd k	rl| j|_| jd k	r~| j|_| j	d k	r| j	|_	| j
d k	r| j
|_
| jrtd|  |S )Nr   )Chatc                 S  s   g | ]}t |qS r3   )r8   ).0mr3   r3   r4   
<listcomp>   s     z+GigaChat._build_payload.<locals>.<listcomp>)rB   	functionszGiga request: %s)r+   rD   r7   rH   modelZprofanity_checkZtemperatureZtop_pZ
max_tokensZrepetition_penaltyZupdate_intervalverboseloggerwarningr-   )selfrB   rC   rD   payloadr3   r3   r4   _build_payload   s*    





zGigaChat._build_payloadr   )responser"   c                 C  s|   g }|j D ]V}t|j}|j}t|d|id}|| |dkrLtd| | jr
td|j	 q
|j
|jd}t||dS )Nfinish_reasonr!   generation_infostopz'Giga generation stopped with reason: %szGiga response: %s)Ztoken_usageZ
model_name)generations
llm_output)choicesr5   r!   rQ   r   appendrK   rL   rJ   r'   usagerI   r   )rM   rP   rU   resr!   rQ   genrV   r3   r3   r4   _create_chat_result   s$    


zGigaChat._create_chat_resultNzOptional[List[str]]z"Optional[CallbackManagerForLLMRun]zOptional[bool])rB   rT   run_managerstreamrC   r"   c           
      K  sZ   |d k	r|n| j }|r6| j|f||d|}t|S | j|f|}| j|}	| |	S N)rT   r]   )	streaming_streamr   rO   _clientZchatr\   
rM   rB   rT   r]   r^   rC   Zshould_streamZstream_iterrN   rP   r3   r3   r4   	_generate   s     zGigaChat._generatez'Optional[AsyncCallbackManagerForLLMRun]c           
        sf   |d k	r|n| j }|r<| j|f||d|}t|I d H S | j|f|}| j|I d H }	| |	S r_   )r`   _astreamr   rO   rb   Zachatr\   rc   r3   r3   r4   
_agenerate   s     zGigaChat._ageneratezIterator[ChatGenerationChunk])rB   rT   r]   rC   r"   c                 k  s   | j |f|}| j|D ]}t|ts0| }t|d dkrBq|d d }|di di }t|d t}|d}	|	d k	rt|	dnd }
|r|	| t
||
dV  qd S NrW   r   deltar'   rQ   )rQ   rR   )rO   rb   r^   r,   r-   lenr7   r@   r   on_llm_new_tokenr   rM   rB   rT   r]   rC   rN   chunkchoicer'   rQ   rS   r3   r3   r4   ra      s    


zGigaChat._streamz"AsyncIterator[ChatGenerationChunk]c                 K s   | j |f|}| j|2 z3 d H W }t|ts8| }t|d dkrJq|d d }|di di }t|d t}|d}	|	d k	rt|	dnd }
|r|	|I d H  t
||
dV  q6 d S rg   )rO   rb   Zastreamr,   r-   ri   r7   r@   r   rj   r   rk   r3   r3   r4   re      s    

zGigaChat._astream)NNN)NNN)NN)NN)
__name__
__module____qualname____doc__rO   r\   rd   rf   ra   re   r3   r3   r3   r4   rA   t   s"           !  rA   )1
__future__r   loggingtypingr   r   r   r   r   r   r	   r
   r   Zlangchain_core.callbacksr   r   Z*langchain_core.language_models.chat_modelsr   r   r   Zlangchain_core.messagesr   r   r   r   r   r   r   r   r   r   r   r   Zlangchain_core.outputsr   r   r   Z!langchain_community.llms.gigachatr    r+   modelsZgm	getLoggerrn   rK   r5   r8   r@   rA   r3   r3   r3   r4   <module>   s   ,8
