a
    bg                     @   s  d dl 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 d dlmZmZmZ d dlmZ d dlmZ eed	d
dZ ddee eeeeef   eeeef dddZ!eddddG dd deeZ"dS )    )AnyAsyncIteratorDictIteratorListOptional)
deprecated)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseChatModelagenerate_from_streamgenerate_from_stream)	AIMessageAIMessageChunkBaseMessageChatMessageHumanMessageSystemMessage)ChatGenerationChatGenerationChunk
ChatResult)
ConfigDict)
BaseCohere)messagereturnc                 C   sF   t | tst | trdS t | tr&dS t | tr4dS td|  dS )zGet the role of the message.

    Args:
        message: The message.

    Returns:
        The role of the message.

    Raises:
        ValueError: If the message is of an unknown type.
    ZUserZChatbotSystemzGot unknown type N)
isinstancer   r   r   r   
ValueErrorr    r   t/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/chat_models/cohere.pyget_role   s    

r!   N)
connectors)messagesr"   kwargsr   c                K   s   d|vrdndd t |d D }|dd |du r:|nd}|dusN|durRdnd}| d jdd | dd D |||d|}d	d
 | D S )zGet the request for the Cohere chat API.

    Args:
        messages: The messages.
        connectors: The connectors.
        **kwargs: The keyword arguments.

    Returns:
        The request for the Cohere chat API.
    Zsource_documentsNc                 S   s2   g | ]*\}}|j |jd p(dt| dqS )idzdoc-)Zsnippetr%   )Zpage_contentmetadatagetstr).0idocr   r   r    
<listcomp>D   s   z+get_cohere_chat_request.<locals>.<listcomp>ZAUTOc                 S   s   g | ]}t ||jd qS ))Zroler   )r!   content)r)   xr   r   r    r,   W   s   )r   Zchat_history	documentsr"   prompt_truncationc                 S   s   i | ]\}}|d ur||qS )Nr   )r)   kvr   r   r    
<dictcomp>`       z+get_cohere_chat_request.<locals>.<dictcomp>)	enumeratepopr.   items)r#   r"   r$   r0   Zmaybe_connectorsr1   reqr   r   r    get_cohere_chat_request1   s*    

r:   z0.0.30z1.0zlangchain_cohere.ChatCohere)ZsinceZremovalZalternative_importc                   @   s2  e Zd ZdZedddZeedddZee	ee
f dddZee	ee
f dd	d
Zdee eee  ee e
ee dddZdee eee  ee e
ee dddZe
e	ee
f dddZdee eee  ee e
edddZdee eee  ee e
edddZeedddZdS )
ChatCohereaA  `Cohere` chat large language models.

    To use, you should have the ``cohere`` python package installed, and the
    environment variable ``COHERE_API_KEY`` set with your API key, or pass
    it as a named parameter to the constructor.

    Example:
        .. code-block:: python

            from langchain_community.chat_models import ChatCohere
            from langchain_core.messages import HumanMessage

            chat = ChatCohere(max_tokens=256, temperature=0.75)

            messages = [HumanMessage(content="knock knock")]
            chat.invoke(messages)
    T)Zpopulate_by_nameZarbitrary_types_allowed)r   c                 C   s   dS )zReturn type of chat model.zcohere-chatr   selfr   r   r    	_llm_type~   s    zChatCohere._llm_typec                 C   s
   d| j iS )z2Get the default parameters for calling Cohere API.temperature)r?   r<   r   r   r    _default_params   s    zChatCohere._default_paramsc                 C   s   i d| j i| jS )zGet the identifying parameters.model)rA   r@   r<   r   r   r    _identifying_params   s    zChatCohere._identifying_paramsN)r#   stoprun_managerr$   r   c           
      k   s   t |fi | j|}t| jdr6| jjf i |}n| jjf i |ddi}|D ]<}|jdkrT|j}tt	|dd}	|r|j
||	d |	V  qTd S Nchat_streamstreamTztext-generationr.   r   )chunk)r:   r@   hasattrclientrF   chat
event_typetextr   r   on_llm_new_token
r=   r#   rC   rD   r$   requestrG   datadeltarI   r   r   r    _stream   s    
zChatCohere._streamc           
      K  s   t |fi | j|}t| jdr<| jjf i |I d H }n | jjf i |ddiI d H }|2 zJ3 d H W }|jdkr`|j}tt	|dd}	|r|j
||	dI d H  |	V  q`6 d S rE   )r:   r@   rJ   Zasync_clientrF   rL   rM   rN   r   r   rO   rP   r   r   r    _astream   s     
zChatCohere._astream)responser   c                 C   s   |j |j|j|j|jdS )z1Get the generation info from cohere API response.r0   Z	citationsZsearch_resultsZsearch_queriesZtoken_countrW   )r=   rV   r   r   r    _get_generation_info   s    zChatCohere._get_generation_infoc           
      K   s   | j r&| j|f||d|}t|S t|fi | j|}| jjf i |}t|jd}d }	t	|drr| 
|}	tt||	dgdS N)rC   rD   rH   r0   )r   generation_info)Zgenerations)	streamingrT   r   r:   r@   rK   rL   r   rN   rJ   rX   r   r   
r=   r#   rC   rD   r$   Zstream_iterrQ   rV   r   rZ   r   r   r    	_generate   s&    


zChatCohere._generatec           
         s   | j r,| j|f||d|}t|I d H S t|fi | j|}| jjf i |}t|jd}d }	t	|drx| 
|}	tt||	dgdS rY   )r[   rU   r   r:   r@   rK   rL   r   rN   rJ   rX   r   r   r\   r   r   r    
_agenerate   s&    


zChatCohere._agenerate)rN   r   c                 C   s   t | jj|djS )zCalculate number of tokens.)rN   )lenrK   tokenizetokens)r=   rN   r   r   r    get_num_tokens   s    zChatCohere.get_num_tokens)NN)NN)NN)NN)__name__
__module____qualname____doc__r   Zmodel_configpropertyr(   r>   r   r   r@   rB   r   r   r   r
   r   r   rT   r	   r   rU   rX   r   r]   r^   intrb   r   r   r   r    r;   c   sb     
  
  
  
r;   )#typingr   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   Zlangchain_core.outputsr   r   r   Zpydanticr   Zlangchain_community.llms.coherer   r(   r!   r:   r;   r   r   r   r    <module>   s&     
2