§
    šŠtjÖ!  ã                   ó”   — d Z ddlZddlZddlmZmZmZmZ ddlZddl	m
Z
 ddlmZmZmZmZ  G d„ d¦  «        Z G d„ d	e¦  «        ZdS )
zWChain that calls SerpAPI.

Heavily borrowed from https://github.com/ofirpress/self-ask
é    N)ÚAnyÚDictÚOptionalÚTuple)Úget_from_dict_or_env)Ú	BaseModelÚ
ConfigDictÚFieldÚmodel_validatorc                   ó*   — e Zd ZdZdd„Zdeddfd„ZdS )ÚHiddenPrintszContext manager to hide prints.ÚreturnNc                 óp   — t           j        | _        t          t          j        d¦  «        t           _        dS )zOpen file to pipe stdout to.ÚwN)ÚsysÚstdoutÚ_original_stdoutÚopenÚosÚdevnull)Úselfs    úc/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/utilities/serpapi.pyÚ	__enter__zHiddenPrints.__enter__   s#   € å #¤
ˆÔÝ�"œ* cÑ*Ô*�Œ
ˆ
ˆ
ó    Ú_c                 ód   — t           j                             ¦   «          | j        t           _        dS )z$Close file that stdout was piped to.N)r   r   Úcloser   )r   r   s     r   Ú__exit__zHiddenPrints.__exit__   s$   € åŒ
×ÒÑÔÐØÔ*�Œ
ˆ
ˆ
r   )r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   © r   r   r   r      sP   € € € € € Ø)Ð)ð+ð +ð +ð +ð
+˜3ð + 4ð +ð +ð +ð +ð +ð +r   r   c                   ór  — e Zd ZU dZdZeed<    edddddœ¬	¦  «        Ze	ed
<   dZ
ee         ed<   dZeej                 ed<    edd¬¦  «        Z ed¬¦  «        ededefd„¦   «         ¦   «         Zdededefd„Zdededefd„Zdede	fd„Zdede	fd„Zdedeeef         fd„Zede	defd„¦   «         ZdS )ÚSerpAPIWrappera”  Wrapper around SerpAPI.

    To use, you should have the ``google-search-results`` python package installed,
    and the environment variable ``SERPAPI_API_KEY`` set with your API key, or pass
    `serpapi_api_key` as a named parameter to the constructor.

    Example:
        ```python
        from langchain_community.utilities import SerpAPIWrapper
        serpapi = SerpAPIWrapper()
        ```
    NÚsearch_engineÚgooglez
google.comÚusÚen)ÚengineÚgoogle_domainÚglÚhl)ÚdefaultÚparamsÚserpapi_api_keyÚ
aiosessionTÚforbid)Úarbitrary_types_allowedÚextraÚbefore)ÚmodeÚvaluesr   c                 ó†   — t          |dd¦  «        }||d<   	 ddlm} ||d<   n# t          $ r t          d¦  «        ‚w xY w|S )z?Validate that api key and python package exists in environment.r0   ÚSERPAPI_API_KEYr   )ÚGoogleSearchr&   zdCould not import serpapi python package. Please install it with `pip install google-search-results`.)r   Úserpapir:   ÚImportError)Úclsr7   r0   r:   s       r   Úvalidate_environmentz#SerpAPIWrapper.validate_environment?   s‡   € õ /ØÐ%Ð'8ñ
ô 
ˆð %4ˆÐ Ñ!ð	Ø,Ð,Ð,Ð,Ð,Ð,à&2ˆF�?Ñ#Ð#øÝð 	ð 	ð 	ÝðNñô ð ð	øøøð
 ˆs   ˜$ ¤>ÚqueryÚkwargsc              ‹   ób   K  — |                       |                      |¦  «        ƒ d{V —†¦  «        S )z1Run query through SerpAPI and parse result async.N)Ú_process_responseÚaresults©r   r?   r@   s      r   ÚarunzSerpAPIWrapper.arunR   s8   è è € à×%Ò%¨D¯MªM¸%Ñ,@Ô,@Ð&@Ð&@Ð&@Ð&@Ð&@Ð&@ÑAÔAÐAr   c                 óR   — |                       |                      |¦  «        ¦  «        S )z+Run query through SerpAPI and parse result.)rB   ÚresultsrD   s      r   ÚrunzSerpAPIWrapper.runV   s"   € à×%Ò% d§l¢l°5Ñ&9Ô&9Ñ:Ô:Ð:r   c                 óÎ   — |                       |¦  «        }t          ¦   «         5  |                      |¦  «        }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   |S )z4Run query through SerpAPI and return the raw result.N)Ú
get_paramsr   r&   Úget_dict)r   r?   r/   ÚsearchÚress        r   rG   zSerpAPIWrapper.resultsZ   s›   € à—’ Ñ'Ô'ˆÝ‰^Œ^ð 	$ð 	$Ø×'Ò'¨Ñ/Ô/ˆFØ—/’/Ñ#Ô#ˆCð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð ˆ
s   ¤*AÁAÁ!Ac              ƒ   óŒ  ‡ ‡K  — dt           t          t          t          t          f         f         fˆˆ fd„} |¦   «         \  }}‰ j        s™t	          j        ¦   «         4 ƒd{V —†}|                     ||¬¦  «        4 ƒd{V —†}|                     ¦   «         ƒ d{V —†}ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   n`‰ j                             ||¬¦  «        4 ƒd{V —†}|                     ¦   «         ƒ d{V —†}ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   |S )zFUse aiohttp to run query through SerpAPI and return the results async.r   c                  óp   •— ‰                      ‰¦  «        } d| d<   ‰j        r
‰j        | d<   d| d<   d}|| fS )NÚpythonÚsourceÚserp_api_keyÚjsonÚoutputzhttps://serpapi.com/search)rJ   r0   )r/   Úurlr?   r   s     €€r   Úconstruct_url_and_paramsz9SerpAPIWrapper.aresults.<locals>.construct_url_and_paramse   sO   ø€ Ø—_’_ UÑ+Ô+ˆFØ'ˆF�8ÑØÔ#ð >Ø)-Ô)=��~Ñ&Ø%ˆF�8ÑØ.ˆCØ˜�;Ðr   N)r/   )r   Ústrr   r1   ÚaiohttpÚClientSessionÚgetrS   )r   r?   rV   rU   r/   ÚsessionÚresponserM   s   ``      r   rC   zSerpAPIWrapper.aresultsb   sî  øøè è € ð	­%µµT½#½s¸(´^Ð0CÔ*Dð 	ð 	ð 	ð 	ð 	ð 	ð 	ð /Ð.Ñ0Ô0‰ˆˆVØŒð 	,ÝÔ,Ñ.Ô.ð 0ð 0ð 0ð 0ð 0ð 0ð 0°'Ø"Ÿ;š; s°6˜;Ñ:Ô:ð 0ð 0ð 0ð 0ð 0ð 0ð 0¸hØ (§¢¡¤Ð/Ð/Ð/Ð/Ð/Ð/�Cð0ð 0ð 0ñ 0ô 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0øøøð 0ð 0ð 0ð 0ð0ð 0ð 0ñ 0ô 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0øøøð 0ð 0ð 0ð 0øð ”×*Ò*¨3°vÐ*Ñ>Ô>ð ,ð ,ð ,ð ,ð ,ð ,ð ,À(Ø$ŸMšM™OœOÐ+Ð+Ð+Ð+Ð+Ð+�ð,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,ð ˆ
sH   Á$CÂB/ÂCÂ/
B9	Â9CÂ<B9	Â=CÃ
CÃCÄD3Ä3
D=Å D=c                 ó0   — | j         |dœ}i | j        ¥|¥}|S )zGet parameters for SerpAPI.)Úapi_keyÚq)r0   r/   )r   r?   Ú_paramsr/   s       r   rJ   zSerpAPIWrapper.get_paramsy   s1   € ð Ô+Øð
ð 
ˆð ,�D”KÐ+ 7Ð+ˆØˆr   rM   c           	      ó  — d|                       ¦   «         v rt          d| d         › �¦  «        ‚d|                       ¦   «         v r| d         | d<   d|                       ¦   «         v �r| d         }t          |t          ¦  «        r|d         }d|                      ¦   «         v r|d         S d|                      ¦   «         v r|d         S d|                      ¦   «         v r|d         S d	|                      ¦   «         v r|d	         S i }|                     ¦   «         D ]P\  }}t          |t          t
          f¦  «        s/t          |t          ¦  «        r|                     d
¦  «        s|||<   ŒQt          |¦  «        S d|                       ¦   «         v r| d         dd…         S d|                       ¦   «         v r| d         S d|                       ¦   «         v r| d         S d|                       ¦   «         v r| d         S d|                       ¦   «         v r*d| d                               ¦   «         v r| d         d         S d|                       ¦   «         v r2d| d         d                               ¦   «         v r| d         dd…         S d|                       ¦   «         v r| d         S d|                       ¦   «         v r*d| d                               ¦   «         v r| d         d         S d|                       ¦   «         v r*d| d                               ¦   «         v r| d         d         S d|                       ¦   «         v rId| d         d                               ¦   «         v r't          d„ | d         dd…         D ¦   «         ¦  «        S g }d|                       ¦   «         v rì| d         }d|v r|d         nd}d |                      ¦   «         v r|                     |d          ¦  «         |                     ¦   «         D ]�\  }}t          |t          ¦  «        rvt          |t          ¦  «        ra|d!vr]| 	                    d"¦  «        sH| 	                    d#¦  «        s3|                     d
¦  «        s|                     |› d$|› d%|› d&�¦  «         Œ‘|  
                    d'g ¦  «        D ]û}d|                      ¦   «         v r|                     |d         ¦  «         Œ4d	|                      ¦   «         v r|                     |d	         ¦  «         Œfd(|                      ¦   «         v r|                     |d(         ¦  «         Œ˜d)|                      ¦   «         v r|                     |d)         ¦  «         ŒÊd*|                      ¦   «         v r|                     |d*         ¦  «         Œüd+|                       ¦   «         v r|                     | d+         ¦  «         d,| v r&t          | d,         t          ¦  «        r|| d,         z  }d,|                       ¦   «         v rXt          | d,         t
          ¦  «        r=d-| d,                               ¦   «         v r!|                     | d,         d-         ¦  «         t          |¦  «        dk    rt          |¦  «        S d.S )/zProcess response from SerpAPI.ÚerrorzGot error from SerpAPI: Úanswer_box_listÚ
answer_boxr   ÚresultÚanswerÚsnippetÚsnippet_highlighted_wordsÚhttpÚevents_resultsNé
   Úsports_resultsÚtop_storiesÚnews_resultsÚjobs_resultsÚjobsÚshopping_resultsÚtitleé   Úquestions_and_answersÚpopular_destinationsÚdestinationsÚ
top_sightsÚsightsÚimages_resultsÚ	thumbnailc                 ó   — g | ]
}|d          ‘ŒS )rz   r#   )Ú.0Úitems     r   ú
<listcomp>z4SerpAPIWrapper._process_response.<locals>.<listcomp>¹   s   € ÐQÐQÐQ¨d˜˜[Ô)ÐQÐQÐQr   Úknowledge_graphÚ Údescription)rr   r�   Ú_stickÚ_linkú z: ú.Úorganic_resultsÚrich_snippetÚrich_snippet_tableÚlinkÚbuying_guideÚlocal_resultsÚplaceszNo good search result found)ÚkeysÚ
ValueErrorÚ
isinstanceÚlistÚitemsÚdictrW   Ú
startswithÚappendÚendswithrZ   Úlen)	rM   rd   rf   ÚkeyÚvalueÚsnippetsr   rr   Úorganic_results	            r   rB   z SerpAPIWrapper._process_response‚   s°  € ð �c—h’h‘j”jÐ Ð ÝÐF¸¸G¼ÐFÐFÑGÔGÐGØ §¢¡
¤
Ð*Ð*Ø #Ð$5Ô 6ˆC�ÑØ˜3Ÿ8š8™:œ:Ð%Ñ%Ø˜\Ô*ˆJÝ˜*¥dÑ+Ô+ð +Ø'¨œ]�
Ø˜:Ÿ?š?Ñ,Ô,Ð,Ð,Ø! (Ô+Ð+Ø˜ZŸ_š_Ñ.Ô.Ð.Ð.Ø! (Ô+Ð+Ø˜jŸošoÑ/Ô/Ð/Ð/Ø! )Ô,Ð,Ø,°
·²Ñ0AÔ0AÐAÐAØ!Ð"=Ô>Ð>à�Ø",×"2Ò"2Ñ"4Ô"4ð ,ð ,‘J�C˜Ý% e­dµD¨\Ñ:Ô:ð ,Ý" 5­#Ñ.Ô.ð,Ø38×3CÒ3CÀFÑ3KÔ3Kð,ð ',˜˜s™øÝ˜6‘{”{Ð"Ø §¢¡¤Ð+Ð+ØÐ'Ô(¨¨"¨Ô-Ð-Ø §¢¡¤Ð+Ð+ØÐ'Ô(Ð(Ø˜cŸhšh™jœjÐ(Ð(Ø�}Ô%Ð%Ø˜sŸxšx™zœzÐ)Ð)Ø�~Ô&Ð&Ø˜sŸxšx™zœzÐ)Ð)¨f¸¸NÔ8K×8PÒ8PÑ8RÔ8RÐ.RÐ.RØ�~Ô& vÔ.Ð.à #§(¢(¡*¤*Ð,Ð,Ø˜3Ð1Ô2°1Ô5×:Ò:Ñ<Ô<Ð<Ð<àÐ)Ô*¨2¨A¨2Ô.Ð.Ø$¨¯ª©
¬
Ð2Ð2ØÐ.Ô/Ð/à" c§h¢h¡j¤jÐ0Ð0Ø #Ð&<Ô"=×"BÒ"BÑ"DÔ"DÐDÐDàÐ-Ô.¨~Ô>Ð>Ø˜SŸXšX™ZœZÐ'Ð'¨H¸¸LÔ8I×8NÒ8NÑ8PÔ8PÐ,PÐ,PØ�|Ô$ XÔ.Ð.à §¢¡
¤
Ð*Ð*Ø˜sÐ#3Ô4°QÔ7×<Ò<Ñ>Ô>Ð>Ð>åÐQÐQ°cÐ:JÔ6KÈCÈRÈCÔ6PÐQÑQÔQÑRÔRÐRàˆØ §¢¡
¤
Ð*Ð*Ø!Ð"3Ô4ˆOØ07¸?Ð0JÐ0J�O GÔ,Ð,ÐPRˆEØ × 4Ò 4Ñ 6Ô 6Ð6Ð6Ø—’ °Ô >Ñ?Ô?Ð?Ø-×3Ò3Ñ5Ô5ð 	@ð 	@‘
��Uå˜s¥CÑ(Ô(ð@å" 5­#Ñ.Ô.ð@ð Ð#;Ð;Ð;ØŸLšL¨Ñ2Ô2ð <àŸLšL¨Ñ1Ô1ð <ð "×,Ò,¨VÑ4Ô4ð <ð
 —O’O uÐ$>Ð$>¨sÐ$>Ð$>°eÐ$>Ð$>Ð$>Ñ?Ô?Ð?øà!ŸgšgÐ&7¸Ñ<Ô<ð 
	8ð 
	8ˆNØ˜N×/Ò/Ñ1Ô1Ð1Ð1Ø—’ ¨yÔ 9Ñ:Ô:Ð:Ð:Ø,°×0CÒ0CÑ0EÔ0EÐEÐEØ—’ Ð/JÔ KÑLÔLÐLÐLØ >×#6Ò#6Ñ#8Ô#8Ð8Ð8Ø—’ ¨~Ô >Ñ?Ô?Ð?Ð?Ø%¨×)<Ò)<Ñ)>Ô)>Ð>Ð>Ø—’ Ð/CÔ DÑEÔEÐEÐEØ˜>×.Ò.Ñ0Ô0Ð0Ð0Ø—’ ¨vÔ 6Ñ7Ô7Ð7øà˜SŸXšX™ZœZÐ'Ð'Ø�OŠO˜C Ô/Ñ0Ô0Ð0Ø˜cÐ!Ð!¥j°°_Ô1EÅtÑ&LÔ&LÐ!Ø˜˜OÔ,Ñ,ˆHà˜sŸxšx™zœzÐ)Ð)Ý˜3˜Ô/µÑ6Ô6ð *à˜C Ô0×5Ò5Ñ7Ô7Ð7Ð7à�OŠO˜C Ô0°Ô:Ñ;Ô;Ð;Ýˆx‰=Œ=˜1ÒÐÝ�x‘=”=Ð à0Ð0r   )r   r    r!   r"   r&   r   Ú__annotations__r
   r/   r’   r0   r   rW   r1   rX   rY   r	   Úmodel_configr   Úclassmethodr   r>   rE   rH   rG   rC   rJ   ÚstaticmethodrB   r#   r   r   r%   r%      sü  € € € € € € ðð ð €M�3ÐÐÑà�5àØ)ØØð	
ð 
ðñ ô €FˆDð ð ñ ð &*€O�X˜c”]Ð)Ð)Ñ)à26€J�˜Ô.Ô/Ð6Ð6Ñ6à�:Ø $Øðñ ô €Lð
 €_˜(Ð#Ñ#Ô#Øð¨$ð °3ð ð ð ñ „[ñ $Ô#ðð"B ð B¨sð B°sð Bð Bð Bð Bð;˜ð ;¨ð ;°ð ;ð ;ð ;ð ;ð˜Sð  Tð ð ð ð ð Cð ¨Dð ð ð ð ð. ð ¨¨S°#¨X¬ð ð ð ð ð ðb1˜tð b1¨ð b1ð b1ð b1ñ „\ðb1ð b1ð b1r   r%   )r"   r   r   Útypingr   r   r   r   rX   Úlangchain_core.utilsr   Úpydanticr   r	   r
   r   r   r%   r#   r   r   ú<module>r¢      sì   ððð ð
 
€	€	€	Ø 
€
€
€
Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -à €€€Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ Bð+ð +ð +ð +ð +ñ +ô +ð +ðH1ð H1ð H1ð H1ð H1�Yñ H1ô H1ð H1ð H1ð H1r   