
    Ig)                       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jZ                  e.      Z/ G d de      Z0y)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d0d"       Z ed#$      ed1d%              Z ed&$      d2d'       Zed3d(       Zd4d)Z	 	 	 	 	 	 d5d*Z	 	 	 	 	 	 d6d+Z	 	 d7	 	 	 	 	 	 	 	 	 d8d,Z	 	 d7	 	 	 	 	 	 	 	 	 d9d-Zed:d.       Zed;d/       Z y)<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_namec                
    ddiS )Nr3   r/    selfs    g/var/www/html/answerous/venv/lib/python3.12/site-packages/langchain_community/chat_models/perplexity.py
lc_secretszChatPerplexity.lc_secrets^   s    //    before)modec           
     `   t        |       }|j                  di       }t        |      D ]M  }||v rt        d| d      ||vst        j                  d| d| d| d       |j                  |      ||<   O |j                  |j                               }|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)clsvaluesall_required_field_namesextra
field_nameinvalid_model_kwargss         rA   build_extrazChatPerplexity.build_extrab   s     $<C#@ 

>2.v, 		;JU" 6*5E!FGG!99!* .L !))34JN
 %+JJz$:j!		;  8DDUZZ\R23 4S T 
 "'~rC   afterc                    	 ddl }	 |j                  | j                  d      | _        | S # t        $ r t        d      w xY w# t
        $ r t        d      w xY w)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'   AttributeErrorrI   )r@   rZ   s     rA   validate_environmentz#ChatPerplexity.validate_environment}   s|    			 --))4O ( DK   	? 	  	7 	s   + "A A Ac                x    | j                   | j                  | j                  | j                  d| j                  S )z:Get the default parameters for calling PerplexityChat API.)r5   r;   streamr+   )r5   r;   r:   r+   r.   r?   s    rA   _default_paramszChatPerplexity._default_params   s>      $33//nn++	

 
 	
rC   c                :   t        |t              r|j                  |j                  d}|S t        |t              rd|j                  d}|S t        |t
              rd|j                  d}|S t        |t              rd|j                  d}|S t        d|       )N)rolecontentsystemuser	assistantzGot unknown type )
isinstancer   rc   rd   r   r   r   	TypeError)r@   messagemessage_dicts      rA   _convert_message_to_dictz'ChatPerplexity._convert_message_to_dict   s    g{+$+LLW__ML  /$,IL  .$*wGL
 	 +$/GOOLL  /y9::rC   c                    t        | j                        }|d|v rt        d      ||d<   |D cg c]  }| j                  |       }}||fS c c}w )Nstopz2`stop` found in both the input and default params.)dict_invocation_paramsrI   rl   )r@   messagesrn   paramsmmessage_dictss         rA   _create_message_dictsz$ChatPerplexity._create_message_dicts   sf     d--. !UVV!F6NCKLa66q9LLf$$ Ms   Ac                @   |j                  d      }|j                  d      xs d}i }|j                  d      r!t        |d         }d|v r
|d   d|d<   ||d<   |j                  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 )Nrc   rd    function_callname
tool_callsrf   rd   rg   )rd   additional_kwargsre   function)rd   ry   tooltool_call_id)rd   r   )rd   rc   )rG   ro   r   r   r   r   r   r   )r@   _dictdefault_classrc   rd   r|   rx   s          rA   _convert_delta_to_message_chunkz.ChatPerplexity._convert_delta_to_message_chunk   s@    yy ))I&,""$99_% !78M&=+@+H(*f%1>o.99\".3L.Al+6>].??$W55[ M^$C!'EVWWX2D!D%g66Z=4H#H'eFmLLV^}0@@#G%BWXX]&66#G$?? 11rC   c              +  ,  K   | j                  ||      \  }}i ||}t        }|r||d<   | j                  j                  j                  j                  |d   |d      }|D ]  }	t        |	t              s|	j                         }	t        |	d         dk(  r5|	d   d   }
| j                  |
d   |      }	|
j                  d      }|t        |	      nd }|	j                  }t        |	|
      }	|r|j                  |	j                  |	       |	  y w)Nstop_sequencesr)   T)r)   rq   r`   choicesr   deltafinish_reason)r   )rj   generation_info)chunk)ru   r   r'   chatcompletionscreaterh   ro   lenr   rG   	__class__r   on_llm_new_tokentext)r@   rq   rn   run_managerkwargsrt   rr   default_chunk_classstream_respr   choicer   r   s                rA   _streamzChatPerplexity._stream   s2     !% : :8T Jv%F%f%,'+F#$kk&&2299/M$ : 
 ! 	EeT*

5#$)9%a(F88w!4E #JJ7M5B5N=1TX  #(//'WE,,UZZu,EK#	s   DDc                   | j                   r# | j                  |f||d|}|rt        |      S | j                  ||      \  }}i ||}| j                  j
                  j                  j                  |d   |      }t        |j                  d   j                  j                        }	t        t        |	      g      S )N)rn   r   r)   )r)   rq   r   r{   )rj   )generations)r:   r   r   ru   r'   r   r   r   r   r   rj   rd   r   r   )
r@   rq   rn   r   r   stream_iterrt   rr   responserj   s
             rA   	_generatezChatPerplexity._generate   s     >>&$,,#@FK +K88 $ : :8T Jv%F%f%;;##//66/M 7 
 H$4$4Q$7$?$?$G$GH~g'F&GHHrC   c                V    | j                   d| j                  d}i || j                  S )z,Get the parameters used to invoke the model.rX   )r1   api_baser)   )r3   r)   ra   )r@   
pplx_credss     rA   rp   z!ChatPerplexity._invocation_params  s6     ((3ZZ&


 6*5 4 455rC   c                     y)zReturn type of chat model.perplexitychatr>   r?   s    rA   	_llm_typezChatPerplexity._llm_type  s      rC   )returnzDict[str, str])rP   r-   r   r   )r   r$   )r   r-   )rj   r   r   r-   )rq   List[BaseMessage]rn   Optional[List[str]]r   z+Tuple[List[Dict[str, Any]], Dict[str, Any]])r   Mapping[str, Any]r   zType[BaseMessageChunk]r   r   )NN)
rq   r   rn   r   r   "Optional[CallbackManagerForLLMRun]r   r   r   zIterator[ChatGenerationChunk])
rq   r   rn   r   r   r   r   r   r   r   )r   r   )r   r(   )!__name__
__module____qualname____doc__r'   __annotations__r)   r+   r"   ro   r.   r   r3   r5   r8   r:   r;   r!   model_configpropertyrB   r#   classmethodrU   r^   ra   rl   ru   r   r   r   rp   r   r>   rC   rA   r&   r&   0   s   $ FC4E34K+#(#>L.>V"' >i#L- =CHIDO@  RK<It/ $J$/L 0 0 (#  $2 '" #* 
 
	%)	%1D	%	4	%2&27M2	2@ %):>	!#! "! 8	!
 ! 
'!L %):>	I#I "I 8	I
 I 
I* 6 6    rC   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   rJ   r&   r>   rC   rA   <module>r      st    % " 
 
 
 >    S R 8 7 "			8	$h ] h rC   