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

    Args:
        message (BaseMessage): The message object.

    Raises:
        ValueError: Raised when the message is of an unknown type.

    Returns:
        str: The role of the message.
    userZ	assistantsystemzGot unknown type N)
isinstancer   r   r   r   
ValueErrorr    r    v/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/chat_models/friendli.pyget_role   s    

r"   List[BaseMessage]Dict[str, Any])messagesr   c                 C  s   ddd | D iS )zGet a request of the Friendli chat API.

    Args:
        messages (List[BaseMessage]): Messages comprising the conversation so far.

    Returns:
        Dict[str, Any]: The request for the Friendli chat API.
    r%   c                 S  s   g | ]}t ||jd qS )Zrolecontentr"   r'   .0r   r    r    r!   
<listcomp>:   s   z$get_chat_request.<locals>.<listcomp>r    )r%   r    r    r!   get_chat_request0   s    
r,   c                   @  s   e Zd ZU dZ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
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(ddddd dd!d"Zd)ddddd dd#d$ZdS )*ChatFriendlia3  Friendli LLM for chat.

    ``friendli-client`` package should be installed with `pip install friendli-client`.
    You must set ``FRIENDLI_TOKEN`` environment variable or provide the value of your
    personal access token for the ``friendli_token`` argument.

    Example:
        .. code-block:: python

            from langchain_community.chat_models import FriendliChat

            chat = Friendli(
                model="meta-llama-3.1-8b-instruct", friendli_token="YOUR FRIENDLI TOKEN"
            )
            chat.invoke("What is generative AI?")
    zmeta-llama-3.1-8b-instructr   modelzDict[str, str])r   c                 C  s   ddiS )NZfriendli_tokenZFRIENDLI_TOKENr    selfr    r    r!   
lc_secretsU   s    zChatFriendli.lc_secretsr$   c                 C  s   | j | j| j| j| j| jdS )z@Get the default parameters for calling Friendli completions API.Zfrequency_penaltyZpresence_penaltyZ
max_tokensstopZtemperatureZtop_pr2   r/   r    r    r!   _default_paramsY   s    zChatFriendli._default_paramsc                 C  s   d| j i| jS )zGet the identifying parameters.r.   )r.   r4   r/   r    r    r!   _identifying_paramse   s    z ChatFriendli._identifying_paramsc                 C  s   dS )Nzfriendli-chatr    r/   r    r    r!   	_llm_typej   s    zChatFriendli._llm_typeNzOptional[List[str]]r   )r3   kwargsr   c                 K  sL   | j }| jdur"|dur"tdn| jdur8| j|d< n||d< i ||S )z,Get the parameters used to invoke the model.Nz2`stop` found in both the input and default params.r3   )r4   r3   r   )r0   r3   r7   paramsr    r    r!   _get_invocation_paramsn   s    

z#ChatFriendli._get_invocation_paramsr#   z"Optional[CallbackManagerForLLMRun]zIterator[ChatGenerationChunk])r%   r3   run_managerr7   r   c           	      k  s~   | j f d|i|}| jjjjf i t|d| jd|}|D ]6}|jd jj	}|rB|rf|
| tt|ddV  qBd S Nr3   T)streamr.   r   r'   r   )r9   clientchatcompletionscreater,   r.   choicesdeltar'   on_llm_new_tokenr   r   	r0   r%   r3   r:   r7   r8   r<   chunkrC   r    r    r!   _stream{   s    
zChatFriendli._streamz'Optional[AsyncCallbackManagerForLLMRun]z"AsyncIterator[ChatGenerationChunk]c           	      K s   | j f d|i|}| jjjjf i t|d| jd|I d H }|2 zD3 d H W }|jd jj	}|rH|rz|
|I d H  tt|ddV  qH6 d S r;   )r9   async_clientr?   r@   rA   r,   r.   rB   rC   r'   rD   r   r   rE   r    r    r!   _astream   s    zChatFriendli._astreamr   c           	      K  s   | j r&| j|f||d|}t|S | jf d|i|}| jjjjf dd |D d| jd|}t	|j
d jjd}tt|d	gd
S )Nr3   r:   r3   c                 S  s   g | ]}t ||jd qS r&   r(   r)   r    r    r!   r+      s   z*ChatFriendli._generate.<locals>.<listcomp>Fr%   r<   r.   r   r=   r   Zgenerations)	streamingrG   r   r9   r>   r?   r@   rA   r.   r   rB   r   r'   r   r   	r0   r%   r3   r:   r7   Zstream_iterr8   responser   r    r    r!   	_generate   s*    
zChatFriendli._generatec           	        s   | j r,| j|f||d|}t|I d H S | jf d|i|}| jjjjf dd |D d| jd|I d H }t	|j
d jjd}tt|d	gd
S )NrJ   r3   c                 S  s   g | ]}t ||jd qS r&   r(   r)   r    r    r!   r+      s   z+ChatFriendli._agenerate.<locals>.<listcomp>FrK   r   r=   r   rL   )rM   rI   r   r9   rH   r?   r@   rA   r.   r   rB   r   r'   r   r   rN   r    r    r!   
_agenerate   s*    
zChatFriendli._agenerate)N)NN)NN)NN)NN)__name__
__module____qualname____doc__r.   __annotations__propertyr1   r4   r5   r6   r9   rG   rI   rP   rQ   r    r    r    r!   r-   A   s0   
       !  r-   N) 
__future__r   typingr   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   Zlangchain_core.outputsr   r   r   Z!langchain_community.llms.friendlir   r"   r,   r-   r    r    r    r!   <module>   s     