
    Ng*                       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j-        e.          Z/ G 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                     e Zd ZU dZdZded<   dZded<   	 dZd	ed
<   	  ee	          Z
ded<   	  e edd          d          Zded<   	  edd          Zded<   	 dZded<   	 dZded<   	 dZded<   	  ed !          ZedEd$            Z ed%&          edFd(                        Z ed)&          dGd+            ZedHd,            ZdId/ZdJd5ZdKd;Z	 	 dLdMd@Z	 	 dLdNdBZedOdC            ZedPdD            Z dS )Q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_factoryDict[str, Any]model_kwargsPPLX_API_KEY)defaultapi_key)r,   aliaszOptional[str]pplx_api_keytimeout)r2   z+Optional[Union[float, Tuple[float, float]]]request_timeout   intmax_retriesFbool	streamingzOptional[int]
max_tokensT)populate_by_namereturnDict[str, str]c                
    ddiS )Nr3   r/    selfs    f/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/perplexity.py
lc_secretszChatPerplexity.lc_secrets^   s    //    before)modevaluesc           
        t          |           }|                    di           }t          |          D ]Y}||v rt          d| d          ||vr<t                              d| d| d| d           |                    |          ||<   Z|                    |                                          }|rt          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)clsrH   all_required_field_namesextra
field_nameinvalid_model_kwargss         rC   build_extrazChatPerplexity.build_extrab   s4    $<C#@#@ 

>2..v,, 		; 		;JU"" !F*!F!F!FGGG!999N* N NN N)3N N N  
 %+JJz$:$:j!7DDUZZ\\RR 	T2 T T T  
 "'~rE   afterr$   c                    	 ddl }n# t          $ r t          d          w xY w	 |                    | j        d          | _        n# t
          $ r t          d          w xY w| 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`.https://api.perplexity.ai)r1   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ImportErrorOpenAIr3   r'   AttributeErrorrL   )rB   r\   s     rC   validate_environmentz#ChatPerplexity.validate_environment}   s    	MMMM 	 	 	?  	
		 --)4O (  DKK  	 	 	7  	 s    !!A A!c                F    | j         | j        | j        | j        d| j        S )z:Get the default parameters for calling PerplexityChat API.)r5   r;   streamr+   )r5   r;   r:   r+   r.   rA   s    rC   _default_paramszChatPerplexity._default_params   s6      $3/n+	
 

 
 	
rE   messager   c                4   t          |t                    r|j        |j        d}nrt          |t                    rd|j        d}nRt          |t
                    rd|j        d}n2t          |t                    rd|j        d}nt          d|           |S )N)rolecontentsystemuser	assistantzGot unknown type )
isinstancer   rf   rg   r   r   r   	TypeError)rB   rd   message_dicts      rC   _convert_message_to_dictz'ChatPerplexity._convert_message_to_dict   s    g{++ 		;$+LW_MMLL// 	;$,IILL.. 	;$*wGGLL++ 	;$/GOLLLL999:::rE   messagesList[BaseMessage]stopOptional[List[str]]+Tuple[List[Dict[str, Any]], Dict[str, Any]]c                     t           j                  }|d|v rt          d          ||d<    fd|D             }||fS )Nrq   z2`stop` found in both the input and default params.c                :    g | ]}                     |          S r@   )rn   ).0mrB   s     rC   
<listcomp>z8ChatPerplexity._create_message_dicts.<locals>.<listcomp>   s'    LLLa66q99LLLrE   )dict_invocation_paramsrL   )rB   ro   rq   paramsmessage_dictss   `    rC   _create_message_dictsz$ChatPerplexity._create_message_dicts   sb     d-.. !UVVV!F6NLLLL8LLLf$$rE   _dictMapping[str, Any]default_classType[BaseMessageChunk]r   c                   |                     d          }|                     d          pd}i }|                     d          r+t          |d                   }d|v r|d         d|d<   ||d<   |                     d          r|d         |d<   |dk    s|t          k    rt          |          S |d	k    s|t          k    rt          ||
          S |dk    s|t          k    rt	          |          S |dk    s|t
          k    rt          ||d                   S |dk    s|t          k    rt          ||d                   S |s|t          k    rt          ||          S  ||          S )Nrf   rg    function_callname
tool_callsri   )rg   rj   rg   additional_kwargsrh   function)rg   r   tooltool_call_id)rg   r   )rg   rf   )rJ   ry   r   r   r   r   r   r   )rB   r~   r   rf   rg   r   r   s          rC   _convert_delta_to_message_chunkz.ChatPerplexity._convert_delta_to_message_chunk   s    yy  ))I&&,""$99_%% 	? !788M&&=+@+H(*f%1>o.99\"" 	B.3L.Al+6>>].???$W5555[  M^$C$C!'EVWWWWX2D!D!D%g6666Z=4H#H#H'eFmLLLLV^^}0@@@#G%BWXXXX 	2]&666#G$???? =1111rE   run_manager"Optional[CallbackManagerForLLMRun]kwargsIterator[ChatGenerationChunk]c              +  h  K   |                      ||          \  }}i ||}t          }|r||d<   | j        j        j                            |d         |d          }|D ]}	t          |	t                    s|	                                }	t          |	d                   dk    rE|	d         d         }
| 	                    |
d         |          }	|

                    d          }|t          |	          nd }|	j        }t          |	|
          }	|r|                    |	j        |	           |	V  d S )Nstop_sequencesr)   T)r)   ro   rb   choicesr   deltafinish_reason)r   )rd   generation_info)chunk)r}   r   r'   chatcompletionscreaterk   ry   lenr   rJ   	__class__r   on_llm_new_tokentext)rB   ro   rq   r   r   r|   r{   default_chunk_classstream_respr   choicer   r   s                rC   _streamzChatPerplexity._stream   sv      !% : :8T J Jv%F%f%, 	,'+F#$k&299/M$ : 
 
 ! 	 	EeT** %

5#$$))9%a(F88w!4 E #JJ77M5B5N=1111TX  #(/'WWWE F,,UZu,EEEKKKK#	 	rE   r   c                   | j         r" | j        |f||d|}|rt          |          S |                     ||          \  }}i ||}| j        j        j                            |d         |          }t          |j	        d         j
        j        d|j        i          }	t          t          |	          g          S )	N)rq   r   r)   )r)   ro   r   	citationsr   )rd   )generations)r:   r   r   r}   r'   r   r   r   r   r   rd   rg   r   r   r   )
rB   ro   rq   r   r   stream_iterr|   r{   responserd   s
             rC   	_generatezChatPerplexity._generate   s     > 	9&$,# @F K  9+K888 $ : :8T J Jv%F%f%;#/66/M 7 
 
 $Q'/7*H,>?
 
 
 ~g'F'F'F&GHHHHrE   c                8    | j         d| j        d}i || j        S )z,Get the parameters used to invoke the model.rZ   )r1   api_baser)   )r3   r)   rc   )rB   
pplx_credss     rC   rz   z!ChatPerplexity._invocation_params  s3     (3Z&
 &


 6*5 455rE   c                    dS )zReturn type of chat model.perplexitychatr@   rA   s    rC   	_llm_typezChatPerplexity._llm_type  s
      rE   )r=   r>   )rH   r-   r=   r   )r=   r$   )r=   r-   )rd   r   r=   r-   )ro   rp   rq   rr   r=   rs   )r~   r   r   r   r=   r   )NN)
ro   rp   rq   rr   r   r   r   r   r=   r   )
ro   rp   rq   rr   r   r   r   r   r=   r   )r=   r   )r=   r(   )!__name__
__module____qualname____doc__r'   __annotations__r)   r+   r"   ry   r.   r   r3   r5   r8   r:   r;   r!   model_configpropertyrD   r#   classmethodrW   r`   rc   rn   r}   r   r   r   rz   r   r@   rE   rC   r&   r&   0   s         $ F4E4444K+#(5#>#>#>L>>>>V"'% >>>i# # #L    =CH5ID D DO     RK<I/ $J$$$$/:  L 0 0 0 X0 _(###   [ $#2 _'"""   #"* 
 
 
 X
   	% 	% 	% 	%2 2 2 2@ %):>	! ! ! ! !L %):>	I I I I I0 6 6 6 X6       X     rE   r&   )1r   
__future__r   loggingtypingr   r   r   r   r   r	   r
   r   r   langchain_core.callbacksr   *langchain_core.language_models.chat_modelsr   r   langchain_core.messagesr   r   r   r   r   r   r   r   r   r   r   r   langchain_core.outputsr   r   r   langchain_core.utilsr   r    pydanticr!   r"   r#   typing_extensionsr$   	getLoggerr   rM   r&   r@   rE   rC   <module>r      s'   % % " " " " " " 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 > = = = = =                                   S R R R R R R R R R        8 7 7 7 7 7 7 7 7 7 " " " " " "		8	$	$k  k  k  k  k ] k  k  k  k  k rE   