
    dh8-                       S r SSKJr  SSKrSSKJrJrJrJrJ	r	J
r
Jr  SSKJrJr  SSKJr  SSKJrJrJrJrJr  SSKJrJr  SS	KJrJrJr  SS
KJrJ r   SSK!J"r"J#r#J$r$J%r%J&r&  \(       a  SSK'J(r)  \RT                  " \+5      r, " S S\-5      r.      SS jr/      SS jr0    SS jr1SS jr2SS jr3SS jr4 " S S\\5      r5g)z&Wrapper around Google's PaLM Chat API.    )annotationsN)TYPE_CHECKINGAnyCallableDictListOptionalcast)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseChatModel)	AIMessageBaseMessageChatMessageHumanMessageSystemMessage)ChatGeneration
ChatResult)convert_to_secret_strget_from_dict_or_envpre_init)	BaseModel	SecretStr)before_sleep_logretryretry_if_exception_typestop_after_attemptwait_exponentialc                      \ rS rSrSrSrg)ChatGooglePalmError(   z!Error with the `Google PaLM` API. N)__name__
__module____qualname____firstlineno____doc____static_attributes__r"       c/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/chat_models/google_palm.pyr    r    (   s    +r)   r    c                ^    Uc  U $ U H!  nU R                  U5      nUS:w  d  M  U SU n M#     U $ )z0Truncates text at the earliest stop token found.N)find)textstop
stop_tokenstop_token_idxs       r*   _truncate_at_stop_tokensr2   ,   sA    
 |
:.R(D  Kr)   c                   U R                   (       d  [        S5      e/ nU R                    H  nUR                  S5      nUc  [        SU 35      e[        UR                  SS5      U5      nUc  [        SU 35      eUS:X  a"  UR	                  [        U[        US9S	95        Mz  US
:X  a"  UR	                  [        U[        US9S	95        M  UR	                  [        U[        XES9S	95        M     [        US9$ )z9Converts a PaLM API response into a LangChain ChatResult.z.ChatResponse must have at least one candidate.authorz"ChatResponse must have an author: content z"ChatResponse must have a content: ai)r5   )r.   messagehuman)roler5   )generations)

candidatesr    getr2   appendr   r   r   r   r   )responser/   r;   	candidater4   r5   s         r*   _response_to_resultrA   ;   s   
 !"RSS(*K((	x(>%(J9+&VWW*9==B+GN?%(J9+&VWWT>GYw5OP w (9  'VE+ )8 +..r)   c                2   SSK Jn  Sn/ n/ n[        [        U 5      5      nU(       GaU  UR	                  S5      u  pg[        U[        5      (       a-  US:w  a  [        S5      e[        [        UR                  5      nGO[        U[        5      (       a  UR                  (       a  U(       a  [        S5      eUR	                  S5      u  p[        U	[        5      (       aj  U	R                  (       aY  UR                  UR                  R!                  SUR                  S9UR                  R!                  SU	R                  S9/5        GO,[        S	5      e[        U[        5      (       a  UR                  (       a  [        S
5      e[        U[        5      (       a4  UR#                  UR                  R!                  SUR                  S95        O[        U[        5      (       a4  UR#                  UR                  R!                  SUR                  S95        O^[        U[$        5      (       a>  UR#                  UR                  R!                  UR&                  UR                  S95        O[        S5      eU(       a  GMU  UR                  R)                  UUUS9$ )zNConverts a list of LangChain messages into a PaLM API MessagePrompt structure.r   Nr6   z+System message must be first input message.z1Message examples must come before other messages.r9   )r4   r5   r7   zNHuman example message must be immediately followed by an  AI example response.zKAI example message must be immediately preceded by a Human example message.z<Messages without an explicit role not supported by PaLM API.)contextexamplesmessages)google.generativeaigenerativeailist	enumeratepop
isinstancer   r    r
   strr5   r   exampler   extendtypesMessageDictr>   r   r:   MessagePromptDict)
input_messagesgenairC   rD   rE   	remainingindexinput_message_next_input_messages
             r*   _messages_to_prompt_dictrY   c   sG    (G.0H.0HY~./I
(}}Q/m]33z)*WXX3 5 56G|449N9N)G  %.MM!$4!A,i88=O=W=W//#*M4I4I 0  //#'1C1K1K 0 		 *,  y11m6K6K%#  y11OO''t]=R=R'S |44OO''w@U@U'V {33OO''(--}7L7L (  &N c )j ;;(( )  r)   c            
        SSK n SnSnSnSn[        S[        U5      [        XUS9[	        U R
                  R                  R                  5      [	        U R
                  R                  R                  5      -  [	        U R
                  R                  R                  5      -  [        [        [        R                  5      S	9$ )
zKReturns a tenacity retry decorator, preconfigured to handle PaLM exceptionsr   N      <   
   T)
multiplierminmax)reraiser/   waitr   before_sleep)google.api_core.exceptionsr   r   r   r   api_core
exceptionsResourceExhaustedServiceUnavailableGoogleAPIErrorr   loggerloggingWARNING)googler_   min_secondsmax_secondsmax_retriess        r*   _create_retry_decoratorrr      s    %JKKK,+V#FOO$>$>$P$PQ%foo&@&@&S&STU%foo&@&@&O&OPQ &fgoo>
 
r)   ChatGooglePalmc                B   ^  [        5       nUSU 4S jj5       nU" S0 UD6$ )z*Use tenacity to retry the completion call.c                 <   > TR                   R                  " S0 U D6$ Nr"   )clientchatkwargsllms    r*   _chat_with_retry)chat_with_retry.<locals>._chat_with_retry   s    zz(((r)   rz   r   returnr   r"   rr   )r{   rz   retry_decoratorr|   s   `   r*   chat_with_retryr      s-    -/O) ) %f%%r)   c                ^   ^ #    [        5       nUSU 4S jj5       nU" S0 UD6I Sh  vN $  N7f)z0Use tenacity to retry the async completion call.c                 X   >#    TR                   R                  " S0 U D6I S h  vN $  N7frv   )rw   
chat_asyncry   s    r*   _achat_with_retry+achat_with_retry.<locals>._achat_with_retry   s&      ZZ**4V4444s    *(*Nr~   r"   r   )r{   rz   r   r   s   `   r*   achat_with_retryr      s6     -/O5 5 #,V,,,,s   #-+-c                  B   \ rS rSr% SrS\S'   SrS\S'    SrS	\S
'   SrS\S'    Sr	S\S'    Sr
S\S'    SrS\S'    \SS j5       r\SS j5       r\SS j5       r\SS j5       r  S          S!S jjr  S          S"S jjr\S#S j5       r\S$S j5       rSrg)%rs      a  `Google PaLM` Chat models API.

To use you must have the google.generativeai Python package installed and
either:

    1. The ``GOOGLE_API_KEY`` environment variable set with your API key, or
    2. Pass your API key using the google_api_key kwarg to the ChatGoogle
       constructor.

Example:
    .. code-block:: python

        from langchain_community.chat_models import ChatGooglePalm
        chat = ChatGooglePalm()

r   rw   zmodels/chat-bison-001rL   
model_nameNzOptional[SecretStr]google_api_keyzOptional[float]temperaturetop_pzOptional[int]top_kr\   intnc                
    SS0$ )Nr   GOOGLE_API_KEYr"   selfs    r*   
lc_secretsChatGooglePalm.lc_secrets   s     "233r)   c                    g)NTr"   r   s    r*   is_lc_serializable!ChatGooglePalm.is_lc_serializable   s    r)   c                
    / SQ$ )z*Get the namespace of the langchain object.)	langchainchat_modelsgoogle_palmr"   )clss    r*   get_lc_namespaceChatGooglePalm.get_lc_namespace  s
     ;:r)   c                v   [        [        USS5      5      n SSKJn  UR                  " UR                  5       S9  X1S'   US   b  SUS   s=::  a  S	::  d  O  [        S
5      eUS   b  SUS   s=::  a  S	::  d  O  [        S5      eUS   b  US   S::  a  [        S5      eU$ ! [         a    [        S5      ef = f)zGValidate api key, python package exists, temperature, top_p, and top_k.r   r   r   N)api_keyzmCould not import google.generativeai python package. Please install it with `pip install google-generativeai`rw   r   r\   z+temperature must be in the range [0.0, 1.0]r   z%top_p must be in the range [0.0, 1.0]r   ztop_k must be positive)	r   r   rF   rG   	configureget_secret_valueImportErrorr    
ValueError)r   valuesr   rS   s       r*   validate_environment#ChatGooglePalm.validate_environment  s     / )9;KL
	/OON$C$C$EF !x- ,Q&:O5TST5TJKK'?&qF7O/Hq/HDEE'?&6'?a+?566#  	%K 	s   $B" "B8c           
         [        U5      n[        U 4U R                  UU R                  U R                  U R
                  U R                  S.UD6n[        Xb5      $ N)modelpromptr   r   r   candidate_count)rY   r   r   r   r   r   r   rA   r   rE   r/   run_managerrz   r   r?   s          r*   	_generateChatGooglePalm._generate%  s_     *(3-<	.
//((**** FF	.
 	.
 #822r)   c           
        #    [        U5      n[        U U R                  UU R                  U R                  U R
                  U R                  S9I S h  vN n[        Xb5      $  N7fr   )rY   r   r   r   r   r   r   rA   r   s          r*   
_agenerateChatGooglePalm._agenerate;  s]      *(33C//((**** FF4
 .
 #822.
s   AA$A"A$c                v    U R                   U R                  U R                  U R                  U R                  S.$ )zGet the identifying parameters.r   r   r   r   r   r   r   s    r*   _identifying_params"ChatGooglePalm._identifying_paramsP  s3     //++ZZZZ
 	
r)   c                    g)Nzgoogle-palm-chatr"   r   s    r*   	_llm_typeChatGooglePalm._llm_type[  s    !r)   r"   )r   zDict[str, str])r   bool)r   z	List[str])r   r   r   r   )NN)
rE   List[BaseMessage]r/   Optional[List[str]]r   z"Optional[CallbackManagerForLLMRun]rz   r   r   r   )
rE   r   r/   r   r   z'Optional[AsyncCallbackManagerForLLMRun]rz   r   r   r   )r   zDict[str, Any])r   rL   )r#   r$   r%   r&   r'   __annotations__r   r   r   r   r   r   propertyr   classmethodr   r   r   r   r   r   r   r   r(   r"   r)   r*   rs   rs      sU   " K-J-*.N'.#'K'!E?!XE=AsJI 4 4   ; ;  > %):>	3#3 "3 8	3
 3 
32 %)?C	3#3 "3 =	3
 3 
3* 
 
 " "r)   )r.   rL   r/   r   r   rL   )r?   zgenai.types.ChatResponser/   r   r   r   )rR   r   r   zgenai.types.MessagePromptDict)r   zCallable[[Any], Any])r{   rs   rz   r   r   r   )6r'   
__future__r   rl   typingr   r   r   r   r   r	   r
   langchain_core.callbacksr   r   *langchain_core.language_models.chat_modelsr   langchain_core.messagesr   r   r   r   r   langchain_core.outputsr   r   langchain_core.utilsr   r   r   pydanticr   r   tenacityr   r   r   r   r   rF   rG   rS   	getLoggerr#   rk   	Exceptionr    r2   rA   rY   rr   r   r   rs   r"   r)   r*   <module>r      s    , "  K K K E  W V )  '			8	$,) ,

 	%/&%/
%/ %/PE%E"EP,&	-E"]I E"r)   