a
    bg.                     @   s  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 d dl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% d d	l&m'Z' d d
l(m)Z)m*Z*m+Z+ d dl,m-Z- eee edddZ.eedddZ/eddddG dd deZ0e1eegef eegef dddZ2dde0e1ee eedddZ3dde0e1ee eedd d!Z4dde0e1ee eedd"d#Z5d'e0ee	eef  eegef d$d%d&Z6dS )(    )	AnyAsyncIteratorCallableDictIteratorListOptionalTypeUnion)
deprecated)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseChatModel)create_base_retry_decorator)	AIMessageAIMessageChunkBaseMessageBaseMessageChunkChatMessageChatMessageChunkFunctionMessageFunctionMessageChunkHumanMessageHumanMessageChunkSystemMessageSystemMessageChunk)ChatGenerationChatGenerationChunk
ChatResult)convert_to_secret_str)get_from_dict_or_env)Field	SecretStrmodel_validatorconvert_message_to_dict)_dictdefault_classreturnc                 C   s   | j }| jpd}i }|dks$|tkr.t|dS |dks>|tkrJt||dS |dksZ|tkrdt|dS |dkst|tkrt|| jdS |s|tkrt||d	S ||dS d
S )z,Convert a delta response to a message chunk. usercontent	assistantr,   additional_kwargssystemfunctionr,   namer,   roleN)r5   r,   r   r   r   r   r3   r   )r&   r'   r5   r,   r/    r6   w/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/chat_models/fireworks.py_convert_delta_to_message_chunk*   s    


r8   )r&   r(   c                 C   sx   | j }| jpd}|dkr"t|dS |dkr@| j}i }t||dS |dkrRt|dS |dkrht|| jdS t||d	S d
S )z%Convert a dict response to a message.r)   r*   r+   r-   r.   r0   r1   r2   r4   N)r5   r,   r   r   r   r   r3   r   )r&   r5   r,   r/   r6   r6   r7   convert_dict_to_message@   s    


r9   z0.0.26z1.0z!langchain_fireworks.ChatFireworks)ZsinceZremovalZalternative_importc                   @   s  e Zd ZU dZdZeed< edd dZe	ed< dZ
ee ed	< d
Zeed< dZeed< eeeef dddZeedddZeee dddZeddeeedddZee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e	  e	d!d"d#Z"eed$d%d&Z#ee eeeef  d'd(d)Z$d0ee eee  ee ee%e& dd*d+Z'd1ee eee  ee  ee(e& dd,d-Z)dS )2ChatFireworkszFireworks Chat models.z*accounts/fireworks/models/llama-v2-7b-chatmodelc                   C   s   dddd  S )Ngffffff?i      )ZtemperatureZ
max_tokensZtop_p)copyr6   r6   r6   r7   <lambda>\   s    zChatFireworks.<lambda>)default_factorymodel_kwargsNfireworks_api_key   max_retriesT	use_retry)r(   c                 C   s   ddiS )NrA   FIREWORKS_API_KEYr6   selfr6   r6   r7   
lc_secretsf   s    zChatFireworks.lc_secretsc                 C   s   dS )NTr6   clsr6   r6   r7   is_lc_serializablej   s    z ChatFireworks.is_lc_serializablec                 C   s   g dS )z*Get the namespace of the langchain object.)Z	langchainZchat_models	fireworksr6   rI   r6   r6   r7   get_lc_namespacen   s    zChatFireworks.get_lc_namespacebefore)mode)valuesr(   c              
   C   s\   zddl }W n. ty: } ztd|W Y d}~n
d}~0 0 tt|dd}| |j_|S )z%Validate that api key in environment.r   Nz`Could not import fireworks-ai python package. Please install it with `pip install fireworks-ai`.rA   rE   )fireworks.clientImportErrorr   r    Zget_secret_valueclientZapi_key)rJ   rP   rL   erA   r6   r6   r7   validate_environments   s    
z"ChatFireworks.validate_environmentc                 C   s   dS )zReturn type of llm.zfireworks-chatr6   rF   r6   r6   r7   	_llm_type   s    zChatFireworks._llm_type)messagesstoprun_managerkwargsr(   c                 K   sD   |  |}| j|d| j|}t| | jf||d|}| |S N)r;   rW   rY   rX   )_create_message_dictsr;   r@   completion_with_retryrD   _create_chat_resultrG   rW   rX   rY   rZ   message_dictsparamsresponser6   r6   r7   	_generate   s$    
zChatFireworks._generatec                    sJ   |  |}| j|d| j|}t| | jf||d|I d H }| |S r[   )r]   r;   r@   acompletion_with_retryrD   r_   r`   r6   r6   r7   
_agenerate   s     
zChatFireworks._agenerate)llm_outputsr(   c                 C   s   |d d u ri S |d S )Nr   r6   )rG   rg   r6   r6   r7   _combine_llm_outputs   s    z"ChatFireworks._combine_llm_outputs)rc   r(   c                 C   sN   g }|j D ],}t|j}t|t|jdd}|| q
d| ji}t||dS )Nfinish_reasonmessagegeneration_infor;   )generations
llm_output)	choicesr9   rl   r   dictrj   appendr;   r   )rG   rc   rn   resrl   genro   r6   r6   r7   r_      s    



z!ChatFireworks._create_chat_result)rW   r(   c                 C   s   dd |D }|S )Nc                 S   s   g | ]}t |qS r6   r$   ).0mr6   r6   r7   
<listcomp>       z7ChatFireworks._create_message_dicts.<locals>.<listcomp>r6   )rG   rW   ra   r6   r6   r7   r]      s    z#ChatFireworks._create_message_dictsc                 k   s   |  |}t}| j|dd| j|}t| | jf||d|D ]b}|jd }	t|	j|}|	j	}
|
d urrt
|
dnd }|j}t||d}|r|j|j|d |V  q@d S )NTr;   rW   streamr\   r   ri   rk   )chunk)r]   r   r;   r@   r^   rD   rp   r8   deltarj   rq   	__class__r   on_llm_new_tokentextrG   rW   rX   rY   rZ   ra   Zdefault_chunk_classrb   r{   choicerj   rm   Zcg_chunkr6   r6   r7   _stream   s:    


zChatFireworks._streamc                 K  s   |  |}t}| j|dd| j|}t| | jf||d|I d H 2 zp3 d H W }|jd }	t|	j|}|	j	}
|
d urt
|
dnd }|j}t||d}|r|j|j|dI d H  |V  qF6 d S )NTry   r\   r   ri   rk   )tokenr{   )r]   r   r;   r@    acompletion_with_retry_streamingrD   rp   r8   r|   rj   rq   r}   r   r~   r   r   r6   r6   r7   _astream   s:    

zChatFireworks._astream)NN)NN)NN)NN)*__name__
__module____qualname____doc__r;   str__annotations__r!   r@   rq   rA   r   r"   rC   intrD   boolpropertyr   rH   classmethodrK   r   rM   r#   r   rU   rV   r   r   r   rd   r   rf   rh   r_   r]   r   r   r   r   r   r6   r6   r6   r7   r:   R   sx   
  
  
	  
$  
r:   )	condition	decoratorr(   c                    s.   t tgtf t tgtf d fdd}|S )zDefine conditional decorator.

    Args:
        condition: The condition.
        decorator: The decorator.

    Returns:
        The decorated function.
    )funcr(   c                    s    r| S | S Nr6   )r   r   r   r6   r7   actual_decorator  s    z/conditional_decorator.<locals>.actual_decorator)r   r   )r   r   r   r6   r   r7   conditional_decorator  s    *r   NrY   )llmrD   rY   rZ   r(   c                   s@   ddl  t| |d}t||ttd fdd}|f i |S )*Use tenacity to retry the completion call.r   Nr   rZ   r(   c                     s    j jjf i | S )r   )rS   ChatCompletioncreaterZ   rL   r6   r7   _completion_with_retry/  s    z5completion_with_retry.<locals>._completion_with_retryrQ   _create_retry_decoratorr   r   r   rD   rY   rZ   Zretry_decoratorr   r6   r   r7   r^   #  s
    r^   c                   sF   ddl  t| |d}t||ttd fdd}|f i |I dH S )z0Use tenacity to retry the async completion call.r   Nr   r   c                     s    j jjf i | I d H S r   rS   r   Zacreater   r   r6   r7   r   E  s    z6acompletion_with_retry.<locals>._completion_with_retryr   r   r6   r   r7   re   9  s
    re   c                   sF   ddl  t| |d}t||ttd fdd}|f i |I dH S )z8Use tenacity to retry the completion call for streaming.r   Nr   r   c                     s    j jjf i | S r   r   r   r   r6   r7   r   Z  s    z@acompletion_with_retry_streaming.<locals>._completion_with_retryr   r   r6   r   r7   r   N  s
    r   )r   rY   r(   c                 C   s<   ddl }|jjj|jjj|jjj|jjjg}t|| j|dS )zDefine retry mechanism.r   N)Zerror_typesrC   rY   )	rQ   rS   errorZRateLimitErrorZInternalServerErrorZBadGatewayErrorZServiceUnavailableErrorr   rC   )r   rY   rL   errorsr6   r6   r7   r   c  s    r   )N)7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   Z#langchain_core.language_models.llmsr   Zlangchain_core.messagesr   r   r   r   r   r   r   r   r   r   r   r   Zlangchain_core.outputsr   r   r   Zlangchain_core.utilsr   Zlangchain_core.utils.envr    Zpydanticr!   r"   r#   Z#langchain_community.adapters.openair%   r8   r9   r:   r   r   r^   re   r   r   r6   r6   r6   r7   <module>   sp   ,8 9 
