§
    šŠtjº-  ã                  ód  — 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 ddlmZmZ ddlmZ ddlmZmZ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m Z  ddl!m"Z"m#Z#m$Z$m%Z%m&Z& erddl'm(Z)  ej*        e+¦  «        Z, G d„ de-¦  «        Z.d%d„Z/d&d„Z0d'd„Z1d(d„Z2d)d"„Z3d)d#„Z4 G d$„ dee¦  «        Z5dS )*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                  ó   — e Zd ZdZdS )ÚChatGooglePalmErrorz!Error with the `Google PaLM` API.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úi/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/chat_models/google_palm.pyr    r    (   s   € € € € € Ø+Ð+Ð+Ð+r&   r    ÚtextÚstrÚstopúOptional[List[str]]Úreturnc                ób   — |€| S |D ]'}|                       |¦  «        }|dk    r
| d|…         } Œ(| S )z0Truncates text at the earliest stop token found.Néÿÿÿÿ)Úfind)r(   r*   Ú
stop_tokenÚstop_token_idxs       r'   Ú_truncate_at_stop_tokensr2   ,   sM   € ð
 €|Øˆàð )ð )ˆ
ØŸš :Ñ.Ô.ˆØ˜RÒÐØ˜˜˜Ô(ˆDøØ€Kr&   Úresponseúgenai.types.ChatResponser   c           
     óv  — | j         st          d¦  «        ‚g }| j         D �]	}|                     d¦  «        }|€t          d|› �¦  «        ‚t          |                     dd¦  «        |¦  «        }|€t          d|› �¦  «        ‚|dk    r3|                     t          |t          |¬	¦  «        ¬
¦  «        ¦  «         Œ�|dk    r3|                     t          |t          |¬	¦  «        ¬
¦  «        ¦  «         ŒÖ|                     t          |t          ||¬¦  «        ¬
¦  «        ¦  «         �Œt          |¬¦  «        S )z9Converts a PaLM API response into a LangChain ChatResult.z.ChatResponse must have at least one candidate.ÚauthorNz"ChatResponse must have an author: ÚcontentÚ z"ChatResponse must have a content: Úai)r7   )r(   ÚmessageÚhuman)Úroler7   )Úgenerations)
Ú
candidatesr    Úgetr2   Úappendr   r   r   r   r   )r3   r*   r=   Ú	candidater6   r7   s         r'   Ú_response_to_resultrB   ;   s�  € ð
 Ôð TÝ!Ð"RÑSÔSÐSà(*€KØÔ(ð ñ ˆ	Ø—’˜xÑ(Ô(ˆØˆ>Ý%Ð&VÈ9Ð&VÐ&VÑWÔWÐWå*¨9¯=ª=¸ÀBÑ+GÔ+GÈÑNÔNˆØˆ?Ý%Ð&VÈ9Ð&VÐ&VÑWÔWÐWà�TŠ>ˆ>Ø×ÒÝ GµYÀwÐ5OÑ5OÔ5OÐPÑPÔPñô ð ð ð �wÒÐØ×ÒÝØ Ý(°Ð9Ñ9Ô9ðñ ô ñô ð ð ð ×ÒÝØ Ý'¨V¸WÐEÑEÔEðñ ô ñô ð ñ õ  +Ð.Ñ.Ô.Ð.r&   Úinput_messagesúList[BaseMessage]úgenai.types.MessagePromptDictc                óŽ  — ddl m} d}g }g }t          t          | ¦  «        ¦  «        }|�r~|                     d¦  «        \  }}t          |t          ¦  «        r1|dk    rt          d¦  «        ‚t          t          |j
        ¦  «        }�nt          |t          ¦  «        rØ|j                             d¦  «        r¾|rt          d¦  «        ‚|                     d¦  «        \  }}	t          |	t          ¦  «        rq|	j                             d¦  «        rW|                     |j                             d|j
        ¬¦  «        |j                             d	|	j
        ¬¦  «        g¦  «         �n?t          d
¦  «        ‚t          |t          ¦  «        r)|j                             d¦  «        rt          d¦  «        ‚t          |t          ¦  «        r5|                     |j                             d	|j
        ¬¦  «        ¦  «         n¨t          |t          ¦  «        r5|                     |j                             d|j
        ¬¦  «        ¦  «         n^t          |t&          ¦  «        r:|                     |j                             |j        |j
        ¬¦  «        ¦  «         nt          d¦  «        ‚|�°~|j                             |||¬¦  «        S )zNConverts a list of LangChain messages into a PaLM API MessagePrompt structure.r   Nr8   z+System message must be first input message.Úexamplez1Message examples must come before other messages.r;   )r6   r7   r9   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
   r)   r7   r   Úadditional_kwargsr?   r   ÚextendÚtypesÚMessageDictr@   r   r<   ÚMessagePromptDict)
rC   ÚgenairH   rI   rJ   Ú	remainingÚindexÚinput_messageÚ_Únext_input_messages
             r'   Ú_messages_to_prompt_dictr\   c   s0  € ð (Ð'Ð'Ð'Ð'Ð'à€GØ.0€HØ.0€Hå•Y˜~Ñ.Ô.Ñ/Ô/€Ià
ñ 9Ø(Ÿ}š}¨QÑ/Ô/Ñˆˆ}å�m¥]Ñ3Ô3ð 6	Ø˜ŠzˆzÝ)Ð*WÑXÔXÐXÝ�3 Ô 5Ñ6Ô6ˆG‰GÝØ�<ñ
ô 
ð 2	àÔ-×1Ò1°)Ñ<Ô<ð2	ð ð Ý)ØGñô ð ð %.§M¢M°!Ñ$4Ô$4Ñ!ˆAÐ!ÝØ"¥Iñô ð à$Ô6×:Ò:¸9ÑEÔEðð —’àœ×/Ò/Ø#*°MÔ4Ið 0ñ ô ð œ×/Ò/Ø#'Ð1CÔ1Kð 0ñ ô ð	ñ	ô 	ð 	ñ 	õ *ð,ñô ð õ Ø�9ñ
ô 
ð 	àÔ-×1Ò1°)Ñ<Ô<ð	õ &ð#ñô ð õ ˜¥yÑ1Ô1ð 	Ø�OŠOØ”×'Ò'¨t¸]Ô=RÐ'ÑSÔSñô ð ð õ ˜¥|Ñ4Ô4ð 	Ø�OŠOØ”×'Ò'¨wÀÔ@UÐ'ÑVÔVñô ð ð õ ˜¥{Ñ3Ô3ð 		Ø�OŠOØ”×'Ò'Ø(Ô-°}Ô7Lð (ñ ô ñô ð ð õ &ØNñô ð ðo ñ 9ðv Œ;×(Ò(ØØØð )ñ ô ð r&   úCallable[[Any], Any]c            
     ój  — ddl } d}d}d}d}t          dt          |¦  «        t          |||¬¦  «        t	          | j        j        j        ¦  «        t	          | j        j        j        ¦  «        z  t	          | j        j        j	        ¦  «        z  t          t          t          j        ¦  «        ¬	¦  «        S )
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)Úgooglerc   Úmin_secondsÚmax_secondsÚmax_retriess        r'   Ú_create_retry_decoratorrv   ±   s¯   € à%Ð%Ð%Ð%à€JØ€KØ€KØ€KåØÝ Ñ,Ô,Ý¨¸È+ÐVÑVÔVå# F¤OÔ$>Ô$PÑQÔQÝ% f¤oÔ&@Ô&SÑTÔTñUå% f¤oÔ&@Ô&OÑPÔPñQõ &¥f­g¬oÑ>Ô>ð
ñ 
ô 
ð 
r&   ÚllmÚChatGooglePalmÚkwargsr   c                óL   ‡ — t          ¦   «         }|dˆ fd„¦   «         } |di |¤ŽS )z*Use tenacity to retry the completion call.ry   r   r,   c                 ó(   •—  ‰j         j        di | ¤ŽS ©Nr%   )ÚclientÚchat©ry   rw   s    €r'   Ú_chat_with_retryz)chat_with_retry.<locals>._chat_with_retryË   s   ø€ àˆsŒzŒÐ(Ð( Ð(Ð(Ð(r&   ©ry   r   r,   r   r%   ©rv   )rw   ry   Úretry_decoratorr€   s   `   r'   Úchat_with_retryr„   Ç   sO   ø€ å-Ñ/Ô/€Oàð)ð )ð )ð )ð )ñ „_ð)ð ÐÐ%Ð%˜fÐ%Ð%Ð%r&   c              ‹  ó\   ‡ K  — t          ¦   «         }|dˆ fd„¦   «         } |di |¤Žƒ d{V —†S )z0Use tenacity to retry the async completion call.ry   r   r,   c               ›  ó8   •K  —  ‰j         j        di | ¤Žƒ d {V —†S r|   )r}   Ú
chat_asyncr   s    €r'   Ú_achat_with_retryz+achat_with_retry.<locals>._achat_with_retryÖ   s6   øè è € ð +�S”ZÔ*Ð4Ð4¨VÐ4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4r&   Nr�   r%   r‚   )rw   ry   rƒ   rˆ   s   `   r'   Úachat_with_retryr‰   Ò   se   øè è € å-Ñ/Ô/€Oàð5ð 5ð 5ð 5ð 5ñ „_ð5ð #Ð"Ð,Ð, VÐ,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,r&   c                  ó(  — e Zd ZU dZded<   dZded<   	 dZ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*d„¦   «         Zed+d„¦   «         Zed,d„¦   «         Zed-d„¦   «         Z	 	 d.d/d$„Z	 	 d.d0d&„Zed1d(„¦   «         Zed2d)„¦   «         ZdS )3rx   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   r}   zmodels/chat-bison-001r)   Ú
model_nameNzOptional[SecretStr]Úgoogle_api_keyzOptional[float]ÚtemperatureÚtop_pzOptional[int]Útop_kr`   ÚintÚnr,   úDict[str, str]c                ó
   — ddiS )NrŒ   ÚGOOGLE_API_KEYr%   ©Úselfs    r'   Ú
lc_secretszChatGooglePalm.lc_secrets  s   € à Ð"2Ð3Ð3r&   Úboolc                ó   — dS )NTr%   r•   s    r'   Úis_lc_serializablez!ChatGooglePalm.is_lc_serializable  s   € àˆtr&   ú	List[str]c                ó
   — g d¢S )z*Get the namespace of the langchain object.)Ú	langchainÚchat_modelsÚgoogle_palmr%   )Úclss    r'   Úget_lc_namespacezChatGooglePalm.get_lc_namespace	  s   € ð ;Ð:Ð:Ð:r&   Úvaluesr   c                óÒ  — t          t          |dd¦  «        ¦  «        }	 ddlm}  |j        |                     ¦   «         ¬¦  «         n# t          $ r t          d¦  «        ‚w xY w||d<   |d         �$d|d         cxk    rd	k    sn t          d
¦  «        ‚|d         �$d|d         cxk    rd	k    sn t          d¦  «        ‚|d         �|d         dk    rt          d¦  «        ‚|S )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`r}   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   rK   rL   Ú	configureÚget_secret_valueÚImportErrorr    Ú
ValueError)r    r¢   rŒ   rV   s       r'   Úvalidate_environmentz#ChatGooglePalm.validate_environment  sC  € õ /Ý  Ð)9Ð;KÑLÔLñ
ô 
ˆð	Ø/Ð/Ð/Ð/Ð/Ð/àˆEŒO N×$CÒ$CÑ$EÔ$EÐFÑFÔFÐFÐFøÝð 	ð 	ð 	Ý%ðKñô ð ð	øøøð !ˆˆxÑà�-Ô Ð,°Q¸&ÀÔ:OÐ5TÐ5TÒ5TÐ5TÐSTÒ5TÐ5TÐ5TÐ5TÝÐJÑKÔKÐKà�'Œ?Ð&¨q°F¸7´OÐ/HÐ/HÒ/HÐ/HÀqÒ/HÐ/HÐ/HÐ/HÝÐDÑEÔEÐEà�'Œ?Ð&¨6°'¬?¸aÒ+?Ð+?ÝÐ5Ñ6Ô6Ð6àˆs    )A
 Á
A$rJ   rD   r*   r+   Úrun_managerú"Optional[CallbackManagerForLLMRun]ry   r   c           
     óš   — t          |¦  «        }t          | f| j        || j        | j        | j        | j        dœ|¤Ž}t          ||¦  «        S ©N)ÚmodelÚpromptr�   rŽ   r�   Úcandidate_count)r\   r„   r‹   r�   rŽ   r�   r‘   rB   ©r–   rJ   r*   rª   ry   r¯   r3   s          r'   Ú	_generatezChatGooglePalm._generate+  sf   € õ *¨(Ñ3Ô3ˆå-<Øð	.
à”/ØØÔ(Ø”*Ø”*Ø œFð	.
ð 	.
ð ð	.
ð 	.
ˆõ # 8¨TÑ2Ô2Ð2r&   ú'Optional[AsyncCallbackManagerForLLMRun]c           	   ‹  ó®   K  — t          |¦  «        }t          | | j        || j        | j        | j        | j        ¬¦  «        ƒ d {V —†}t          ||¦  «        S r­   )r\   r‰   r‹   r�   rŽ   r�   r‘   rB   r±   s          r'   Ú
_ageneratezChatGooglePalm._agenerateA  sy   è è € õ *¨(Ñ3Ô3ˆå3CØØ”/ØØÔ(Ø”*Ø”*Ø œFð4
ñ 4
ô 4
ð .
ð .
ð .
ð .
ð .
ð .
ˆõ # 8¨TÑ2Ô2Ð2r&   úDict[str, Any]c                óD   — | j         | j        | j        | j        | j        dœS )zGet the identifying parameters.©r‹   r�   rŽ   r�   r‘   r¸   r•   s    r'   Ú_identifying_paramsz"ChatGooglePalm._identifying_paramsV  s-   € ð œ/ØÔ+Ø”ZØ”ZØ”ð
ð 
ð 	
r&   c                ó   — dS )Nzgoogle-palm-chatr%   r•   s    r'   Ú	_llm_typezChatGooglePalm._llm_typea  s   € à!Ð!r&   )r,   r’   )r,   r˜   )r,   r›   )r¢   r   r,   r   )NN)
rJ   rD   r*   r+   rª   r«   ry   r   r,   r   )
rJ   rD   r*   r+   rª   r³   ry   r   r,   r   )r,   r¶   )r,   r)   )r!   r"   r#   r$   Ú__annotations__r‹   rŒ   r�   rŽ   r�   r‘   Úpropertyr—   Úclassmethodrš   r¡   r   r©   r²   rµ   r¹   r»   r%   r&   r'   rx   rx   Þ   s¨  € € € € € € ðð ð" €K€K�KØ-€JÐ-Ð-Ð-Ñ-ØØ*.€NÐ.Ð.Ð.Ñ.Ø#'€KÐ'Ð'Ð'Ñ'ðà!€EÐ!Ð!Ð!Ñ!ðXà€EÐÐÐÑðà€A€J€J€J�JðIð ð4ð 4ð 4ñ „Xð4ð ðð ð ñ „[ðð ð;ð ;ð ;ñ „[ð;ð ðð ð ñ „Xðð> %)Ø:>ð	3ð 3ð 3ð 3ð 3ð2 %)Ø?Cð	3ð 3ð 3ð 3ð 3ð* ð
ð 
ð 
ñ „Xð
ð ð"ð "ð "ñ „Xð"ð "ð "r&   )r(   r)   r*   r+   r,   r)   )r3   r4   r*   r+   r,   r   )rC   rD   r,   rE   )r,   r]   )rw   rx   ry   r   r,   r   )6r$   Ú
__future__r   rp   Ú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   rK   rL   rV   Ú	getLoggerr!   ro   Ú	Exceptionr    r2   rB   r\   rv   r„   r‰   rx   r%   r&   r'   ú<module>rÊ      sœ  ðØ ,Ð ,à "Ð "Ð "Ð "Ð "Ð "à €€€Ø KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ Kðð ð ð ð ð ð ð ð EÐ DÐ DÐ DÐ DÐ Dðð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð WÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VØ )Ð )Ð )Ð )Ð )Ð )Ð )Ð )ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð (Ø'Ð'Ð'Ð'Ð'Ð'à	ˆÔ	˜8Ñ	$Ô	$€ð,ð ,ð ,ð ,ð ,˜)ñ ,ô ,ð ,ðð ð ð ð%/ð %/ð %/ð %/ðPKð Kð Kð Kð\ð ð ð ð,&ð &ð &ð &ð	-ð 	-ð 	-ð 	-ðE"ð E"ð E"ð E"ð E"�] Iñ E"ô E"ð E"ð E"ð E"r&   