a
    bgN*                     @  s   d Z 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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%m&Z& dd
l'm(Z(m)Z)m*Z* ddl+m,Z, e-e.Z/G dd deZ0dS )zWrapper around Perplexity APIs.    )annotationsN)	AnyDictIteratorListMappingOptionalTupleTypeUnion)CallbackManagerForLLMRun)BaseChatModelgenerate_from_stream)	AIMessageAIMessageChunkBaseMessageBaseMessageChunkChatMessageChatMessageChunkFunctionMessageChunkHumanMessageHumanMessageChunkSystemMessageSystemMessageChunkToolMessageChunk)ChatGenerationChatGenerationChunk
ChatResult)from_envget_pydantic_field_names)
ConfigDictFieldmodel_validator)Selfc                   @  s  e Zd ZU dZdZded< dZded< dZd	ed
< ee	dZ
ded< eedddddZded< edddZded< dZded< dZded< dZded< ed d!Zed"d#d$d%Zed&d'eddd(d)d*Zed+d'd,d#d-d.Zedd#d/d0Zd1dd2d3d4Zd5d6d7d8d9d:Zd;d<d=d>d?d@ZdMd5d6dAddBdCdDdEZdNd5d6dAddFdCdGdHZed;d#dIdJZedd#dKdLZ dS )OChatPerplexitya@  `Perplexity AI` Chat models API.

    To use, you should have the ``openai`` python package installed, and the
    environment variable ``PPLX_API_KEY`` set to your API key.
    Any parameters that are valid to be passed to the openai.create call can be passed
    in, even if not explicitly saved on this class.

    Example:
        .. code-block:: python

            from langchain_community.chat_models import ChatPerplexity

            chat = ChatPerplexity(
                model="llama-3.1-sonar-small-128k-online",
                temperature=0.7,
            )
    Nr   clientz!llama-3.1-sonar-small-128k-onlinestrmodelgffffff?floattemperature)default_factoryzDict[str, Any]model_kwargsPPLX_API_KEY)defaultapi_key)r*   aliaszOptional[str]pplx_api_keytimeout)r/   z+Optional[Union[float, Tuple[float, float]]]request_timeout   intmax_retriesFbool	streamingzOptional[int]
max_tokensT)Zpopulate_by_namezDict[str, str])returnc                 C  s   ddiS )Nr0   r,    selfr:   r:   x/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/chat_models/perplexity.py
lc_secrets^   s    zChatPerplexity.lc_secretsbefore)mode)valuesr9   c              
   C  s   t | }|di }t|D ]P}||v r8td| d||vrtd| d| d| d ||||< q|| }|rtd| d	||d< |S )
z>Build extra kwargs from additional params that were passed in.r+   zFound z supplied twice.z	WARNING! z1 is not a default parameter.
                    zJ was transferred to model_kwargs.
                    Please confirm that z is what you intended.zParameters za should be specified explicitly. Instead they were passed in as part of `model_kwargs` parameter.)	r   getlist
ValueErrorloggerwarningpopintersectionkeys)clsrA   Zall_required_field_namesextra
field_nameZinvalid_model_kwargsr:   r:   r=   build_extrab   s*    
zChatPerplexity.build_extraafterr#   c                 C  s^   zddl }W n ty&   tdY n0 z|j| jdd| _W n tyX   tdY n0 | S )z?Validate that api key and python package exists in environment.r   NzTCould not import openai python package. Please install it with `pip install openai`.zhttps://api.perplexity.ai)r.   base_urlz`openai` has no `ChatCompletion` attribute, this is likely due to an old version of the openai package. Try upgrading it with `pip install --upgrade openai`.)openaiImportErrorZOpenAIr0   r%   AttributeErrorrD   )r<   rP   r:   r:   r=   validate_environment}   s    

z#ChatPerplexity.validate_environmentc                 C  s   | j | j| jd| jS )z:Get the default parameters for calling PerplexityChat API.)r8   streamr)   )r8   r7   r)   r+   r;   r:   r:   r=   _default_params   s    zChatPerplexity._default_paramsr   )messager9   c                 C  st   t |tr|j|jd}nVt |tr2d|jd}n>t |trJd|jd}n&t |trbd|jd}ntd| |S )N)rolecontentsystemuser	assistantzGot unknown type )
isinstancer   rW   rX   r   r   r   	TypeError)r<   rV   Zmessage_dictr:   r:   r=   _convert_message_to_dict   s    



z'ChatPerplexity._convert_message_to_dictzList[BaseMessage]zOptional[List[str]]z+Tuple[List[Dict[str, Any]], Dict[str, Any]])messagesstopr9   c                   sD   t  j}|d ur*d|v r"td||d<  fdd|D }||fS )Nr`   z2`stop` found in both the input and default params.c                   s   g | ]}  |qS r:   )r^   ).0mr;   r:   r=   
<listcomp>       z8ChatPerplexity._create_message_dicts.<locals>.<listcomp>)dict_invocation_paramsrD   )r<   r_   r`   paramsmessage_dictsr:   r;   r=   _create_message_dicts   s    
z$ChatPerplexity._create_message_dictszMapping[str, Any]zType[BaseMessageChunk]r   )_dictdefault_classr9   c                 C  s(  | d}| dpd}i }| drVt|d }d|v rN|d d u rNd|d< ||d< | drl|d |d< |dks||tkrt|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 |dks|tk rt||d dS |s|tkrt||dS ||dS d S )NrW   rX    function_callnameZ
tool_callsrZ   )rX   r[   rX   additional_kwargsrY   function)rX   rn   Ztooltool_call_id)rX   rr   )rX   rW   )rB   re   r   r   r   r   r   r   )r<   rj   rk   rW   rX   rp   rm   r:   r:   r=   _convert_delta_to_message_chunk   s.    




z.ChatPerplexity._convert_delta_to_message_chunkz"Optional[CallbackManagerForLLMRun]zIterator[ChatGenerationChunk])r_   r`   run_managerkwargsr9   c                 k  s  |  ||\}}i ||}t}|dd  |r8||d< | jjjjf |dd|}d}	|D ]}
t|
tsr|
 }
t	|
d dkrq\|
d d }|

dg }| |d |}
|	r|
 jd|iO  _d	}	|
d
}|d urt|dnd }|
j}t|
|d}
|r|j|
j|
d |
V  q\d S )NrT   Zstop_sequencesT)r_   rT   choicesr   	citationsdeltaFfinish_reason)ry   )rV   generation_info)chunk)ri   r   rG   r%   chatcompletionscreater\   re   lenrB   rs   rp   	__class__r   Zon_llm_new_tokentext)r<   r_   r`   rt   ru   rh   rg   Zdefault_chunk_classZstream_respZfirst_chunkr{   choicerw   ry   rz   r:   r:   r=   _stream   sB    

zChatPerplexity._streamr   c           
      K  s   | j r*| j|f||d|}|r*t|S | ||\}}i ||}| jjjjf d|i|}t|j	d j
jd|jid}	tt|	dgdS )N)r`   rt   r_   r   rw   ro   )rV   )Zgenerations)r7   r   r   ri   r%   r|   r}   r~   r   rv   rV   rX   rw   r   r   )
r<   r_   r`   rt   ru   Zstream_iterrh   rg   responserV   r:   r:   r=   	_generate   s$    zChatPerplexity._generatec                 C  s   d| j i}i || jS )z,Get the parameters used to invoke the model.r'   )r'   rU   )r<   Z
pplx_credsr:   r:   r=   rf     s    z!ChatPerplexity._invocation_paramsc                 C  s   dS )zReturn type of chat model.Zperplexitychatr:   r;   r:   r:   r=   	_llm_type  s    zChatPerplexity._llm_type)NN)NN)!__name__
__module____qualname____doc__r%   __annotations__r'   r)   r!   re   r+   r   r0   r2   r5   r7   r8   r    Zmodel_configpropertyr>   r"   classmethodrM   rS   rU   r^   ri   rs   r   r   rf   r   r:   r:   r:   r=   r$   0   sN   
	   ,  r$   )1r   
__future__r   loggingtypingr   r   r   r   r   r   r	   r
   r   Zlangchain_core.callbacksr   Z*langchain_core.language_models.chat_modelsr   r   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   r   Zpydanticr    r!   r"   Ztyping_extensionsr#   	getLoggerr   rE   r$   r:   r:   r:   r=   <module>   s   ,8
