a
    bg&                     @  s8  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 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Z0ddddddZ1eddddG dd de(eZ2dS )    )annotationsN)	TYPE_CHECKINGAnyAsyncIteratorDictIteratorListMappingOptionalType)
deprecated)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&    r4   v/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/chat_models/gigachat.py_convert_dict_to_message2   s    


r6   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,   r7   r%   r-   r   r0   r(   r   r1   r   r2   r*   getr   r/   r   ZFUNCTIONr3   )r"   r7   r%   r4   r4   r5   _convert_message_to_dictF   s     




r9   zMapping[str, Any]zType[BaseMessageChunk]r   )_dictdefault_classr#   c                 C  s   |  d}|  dpd}i }|  drVt| d }d|v rN|d d u 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/   )r8   r.   r   r   r   r   r   )r:   r;   r/   r(   r*   r&   r4   r4   r5   _convert_delta_to_message_chunk[   s&    



rA   z0.3.5z1.0zlangchain_gigachat.GigaChat)ZsinceZremovalZalternative_importc                   @  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 urH| j|_| jd urZ| j|_| jd url| j|_| jd ur~| j|_| j	d ur| j	|_	| j
d ur| j
|_
| jrtd|  |S )Nr   )Chatc                 S  s   g | ]}t |qS r4   )r9   ).0mr4   r4   r5   
<listcomp>       z+GigaChat._build_payload.<locals>.<listcomp>)rC   	functionszGiga request: %s)r,   rE   r8   rJ   modelZprofanity_checkZtemperatureZtop_pZ
max_tokensZrepetition_penaltyZupdate_intervalverboseloggerwarningr.   )selfrC   rD   rE   payloadr4   r4   r5   _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)choicesr6   r"   rS   r   appendrM   rN   rL   r(   usagerK   r    )rO   rR   rW   resr"   rS   genrX   r4   r4   r5   _create_chat_result   s$    


zGigaChat._create_chat_resultNzOptional[List[str]]z"Optional[CallbackManagerForLLMRun]zOptional[bool])rC   rV   run_managerstreamrD   r#   c           
      K  s^   |d ur|n| j }|r6| j|f||d|}t|S | j|fi |}| j|}	| |	S N)rV   r_   )	streaming_streamr   rQ   _clientZchatr^   
rO   rC   rV   r_   r`   rD   Zshould_streamZstream_iterrP   rR   r4   r4   r5   	_generate   s    zGigaChat._generatez'Optional[AsyncCallbackManagerForLLMRun]c           
        sj   |d ur|n| j }|r<| j|f||d|}t|I d H S | j|fi |}| j|I d H }	| |	S ra   )rb   _astreamr   rQ   rd   Zachatr^   re   r4   r4   r5   
_agenerate   s    zGigaChat._ageneratezIterator[ChatGenerationChunk])rC   rV   r_   rD   r#   c                 k  s   | j |fi |}| j|D ]}t|ts4| }t|d dkrFq|d d }|di di }t|d t}|d}	|	d urt|	dnd }
|r|	| t
||
dV  qd S NrY   r   deltar(   rS   )rS   rT   )rQ   rd   r`   r-   r.   lenr8   rA   r   on_llm_new_tokenr   rO   rC   rV   r_   rD   rP   chunkchoicer(   rS   rU   r4   r4   r5   rc      s    


zGigaChat._streamz"AsyncIterator[ChatGenerationChunk]c                 K s   | j |fi |}| j|2 z3 d H W }t|ts<| }t|d dkrNq|d d }|di di }t|d t}|d}	|	d urt|	dnd }
|r|	|I d H  t
||
dV  q6 d S ri   )rQ   rd   Zastreamr-   r.   rk   r8   rA   r   rl   r   rm   r4   r4   r5   rg      s    

zGigaChat._astream)NNN)NNN)NN)NN)
__name__
__module____qualname____doc__rQ   r^   rf   rh   rc   rg   r4   r4   r4   r5   rB   u   s"           !  rB   )3
__future__r   loggingtypingr   r   r   r   r   r   r	   r
   r   Zlangchain_core._api.deprecationr   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	getLoggerrp   rM   r6   r9   rA   rB   r4   r4   r4   r5   <module>   s(   ,8
