Ë
    µŒjð!  ã                   ó†   — 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y)
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y)ÚHiddenPrintszContext manager to hide prints.ÚreturnNc                 ót   — t         j                  | _        t        t        j
                  d«      t         _        y)zOpen file to pipe stdout to.ÚwN)ÚsysÚstdoutÚ_original_stdoutÚopenÚosÚdevnull)Úselfs    úo/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/utilities/serpapi.pyÚ	__enter__zHiddenPrints.__enter__   s    € ä #§
¡
ˆÔÜœ"Ÿ*™* cÓ*Œ�
ó    Ú_c                 ój   — t         j                  j                  «        | j                  t         _        y)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      s   „ Ù)ó+ð
+˜3ð + 4ô +r   r   c                   óD  — 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y)Ú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:
        .. code-block:: 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                 ór   — t        |dd«      }||d<   	 ddlm} ||d<   |S # t        $ r t        d«      ‚w xY w)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<   sa   € ô /ØÐ%Ð'8ó
ˆð %4ˆÐ Ñ!ð	Ý,à&2ˆF�?Ñ#ð ˆøô ò 	ÜðNóð ð	ús   ”! ¡6ÚqueryÚkwargsc              ‹   ó^   K  — | j                  | j                  |«      ƒ d{  –—† «      S 7 Œ­w)z1Run query through SerpAPI and parse result async.N)Ú_process_responseÚaresults©r   r?   r@   s      r   ÚarunzSerpAPIWrapper.arunO   s&   è ø€ à×%Ñ%¨D¯M©M¸%Ó,@×&@ÓAÐAÐ&@ús   ‚ -¢+£	-c                 óB   — | j                  | j                  |«      «      S )z+Run query through SerpAPI and parse result.)rB   ÚresultsrD   s      r   ÚrunzSerpAPIWrapper.runS   s   € à×%Ñ% d§l¡l°5Ó&9Ó:Ð:r   c                 óª   — | j                  |«      }t        «       5  | j                  |«      }|j                  «       }ddd«       |S # 1 sw Y   S xY w)z4Run query through SerpAPI and return the raw result.N)Ú
get_paramsr   r&   Úget_dict)r   r?   r/   ÚsearchÚress        r   rG   zSerpAPIWrapper.resultsW   sJ   € à—‘ Ó'ˆÜ�^Ø×'Ñ'¨Ó/ˆFØ—/‘/Ó#ˆC÷ ð ˆ
÷ ð ˆ
ús   œ"AÁAc              ƒ   ó°  ‡ ‡K  — dt         t        t        t        t        f   f   fˆˆ fd„} |«       \  }}‰ j                  sst	        j
                  «       4 ƒd{  –—† }|j                  ||¬«      4 ƒd{  –—† }|j                  «       ƒ d{  –—† }ddd«      ƒd{  –—†  ddd«      ƒd{  –—†  S ‰ j                  j                  ||¬«      4 ƒd{  –—† }|j                  «       ƒ d{  –—† }ddd«      ƒd{  –—†  |S 7 Œª7 Œ�7 Œz7 Œl# 1 ƒd{  –—†7  sw Y   Œ|xY w7 Œs# 1 ƒd{  –—†7  sw Y   S xY w7 Œc7 ŒM7 Œ?# 1 ƒd{  –—†7  sw Y   S xY w­w)zFUse aiohttp to run query through SerpAPI and return the results async.r   c                  ó|   •— ‰j                  ‰«      } 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_paramsb   sM   ø€ Ø—_‘_ 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.aresults_   s  ùè ø€ ð	¬%´´T¼#¼s¸(±^Ð0CÑ*Dö 	ñ /Ó0‰ˆˆVØ�ŠÜ×,Ñ,×.Ô.°'Ø"Ÿ;™; s°6˜;×:Ô:¸hØ (§¡£×/�C÷ ;×:÷ /×.ð ˆ
ð —‘×*Ñ*¨3°vÐ*×>Ô>À(Ø$ŸM™M›O×+�÷ ?×>ð ˆ
ð /øØ:øØ/øð ;ø×:×:Ñ:úð /ø×.×.Ð.ð ˆ
úð ?øØ+øð ?ø×>×>Ð>ð ˆ
üsö   „AEÁDÁEÁD$Á6DÁ7D$Á:DÂD	ÂDÂD$ÂDÂD$Â#EÂ.D"Â/'EÃD:ÃEÃE Ã.D<Ã/E Ã3EÃ>D>Ã?EÄD$Ä	DÄD$ÄD	ÄDÄD	ÄD$Ä"EÄ$D7Ä*D-Ä+D7Ä2	EÄ<E Ä>EÅ EÅE	ÅEÅEc                 óD   — | j                   |dœ}i | j                  ¥|¥}|S )zGet parameters for SerpAPI.)Úapi_keyÚq)r0   r/   )r   r?   Ú_paramsr/   s       r   rJ   zSerpAPIWrapper.get_paramsv   s1   € ð ×+Ñ+Øñ
ˆð ,�D—K‘KÐ+ 7Ð+ˆØˆr   rM   c           	      ó$
  — d| j                  «       v rt        d| d   › �«      ‚d| j                  «       v r| d   | d<   d| j                  «       v rÙ| d   }t        |t        «      r|d   }d|j                  «       v r|d   S d|j                  «       v r|d   S d|j                  «       v r|d   S d	|j                  «       v r|d	   S i }|j	                  «       D ]C  \  }}t        |t        t
        f«      rŒt        |t        «      r|j                  d
«      rŒ?|||<   ŒE t        |«      S d| j                  «       v r| d   dd S d| j                  «       v r| d   S d| j                  «       v r| d   S d| j                  «       v r| d   S d| j                  «       v rd| d   j                  «       v r| d   d   S d| j                  «       v r d| d   d   j                  «       v r| d   dd S d| j                  «       v r| d   S d| j                  «       v rd| d   j                  «       v r| d   d   S d| j                  «       v rd| d   j                  «       v r| d   d   S d| j                  «       v r:d| d   d   j                  «       v r"t        | d   dd D �cg c]  }|d   ‘Œ	 c}«      S g }d| j                  «       v rÅ| d   }d|v r|d   nd}d|j                  «       v r|j                  |d   «       |j	                  «       D ]|  \  }}t        |t        «      sŒt        |t        «      sŒ(|d vsŒ-|j                  d!«      rŒ?|j                  d"«      rŒQ|j                  d
«      rŒc|j                  |› d#|› d$|› d%�«       Œ~ | j                  d&g «      D ]Å  }	d|	j                  «       v r|j                  |	d   «       Œ*d	|	j                  «       v r|j                  |	d	   «       ŒQd'|	j                  «       v r|j                  |	d'   «       Œxd(|	j                  «       v r|j                  |	d(   «       ŒŸd)|	j                  «       v sŒ²|j                  |	d)   «       ŒÇ d*| j                  «       v r|j                  | d*   «       d+| v rt        | d+   t        «      r|| d+   z  }d+| j                  «       v r?t        | d+   t
        «      r,d,| d+   j                  «       v r|j                  | d+   d,   «       t        |«      dkD  rt        |«      S y-c c}w ).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Ú	thumbnailÚ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ÚitemÚsnippetsr{   rr   Úorganic_results
             r   rB   z SerpAPIWrapper._process_response   s)  € ð �c—h‘h“jÑ ÜÐ7¸¸G¹°~ÐFÓGÐGØ §¡£
Ñ*Ø #Ð$5Ñ 6ˆC�ÑØ˜3Ÿ8™8›:Ñ%Ø˜\Ñ*ˆJÜ˜*¤dÔ+Ø'¨™]�
Ø˜:Ÿ?™?Ó,Ñ,Ø! (Ñ+Ð+Ø˜ZŸ_™_Ó.Ñ.Ø! (Ñ+Ð+Ø˜jŸo™oÓ/Ñ/Ø! )Ñ,Ð,Ø,°
·±Ó0AÑAØ!Ð"=Ñ>Ð>à�Ø",×"2Ñ"2Ö"4‘J�C˜Ü% e¬d´D¨\Õ:Ü" 5¬#Ô.°5×3CÑ3CÀFÕ3Kà&+˜˜sšð	 #5ô
 ˜6“{Ð"Ø §¡£Ñ+ØÐ'Ñ(¨¨"Ð-Ð-Ø §¡£Ñ+ØÐ'Ñ(Ð(Ø˜cŸh™h›jÑ(Ø�}Ñ%Ð%Ø˜sŸx™x›zÑ)Ø�~Ñ&Ð&Ø˜sŸx™x›zÑ)¨f¸¸NÑ8K×8PÑ8PÓ8RÑ.RØ�~Ñ& vÑ.Ð.à #§(¡(£*Ñ,Ø˜3Ð1Ñ2°1Ñ5×:Ñ:Ó<Ñ<àÐ)Ñ*¨2¨AÐ.Ð.Ø$¨¯©«
Ñ2ØÐ.Ñ/Ð/à" c§h¡h£jÑ0Ø #Ð&<Ñ"=×"BÑ"BÓ"DÑDàÐ-Ñ.¨~Ñ>Ð>Ø˜SŸX™X›ZÑ'¨H¸¸LÑ8I×8NÑ8NÓ8PÑ,PØ�|Ñ$ XÑ.Ð.à §¡£
Ñ*Ø˜sÐ#3Ñ4°QÑ7×<Ñ<Ó>Ñ>ä°cÐ:JÑ6KÈCÈRÑ6PÓQÑ6P¨d˜˜[Ó)Ð6PÑQÓRÐRàˆØ §¡£
Ñ*Ø!Ð"3Ñ4ˆOØ07¸?Ñ0J�O GÒ,ÐPRˆEØ × 4Ñ 4Ó 6Ñ6Ø—‘ °Ñ >Ô?Ø-×3Ñ3Ö5‘
��Uä˜s¤CÕ(Ü" 5¬#Õ.ØÐ#;Ò;ØŸL™L¨Õ2ØŸL™L¨Õ1Ø!×,Ñ,¨VÕ4à—O‘O u g¨Q¨s¨e°2°e°W¸AÐ$>Õ?ð 6ð "Ÿg™gÐ&7¸Ö<ˆNØ˜N×/Ñ/Ó1Ñ1Ø—‘ ¨yÑ 9Õ:Ø,°×0CÑ0CÓ0EÑEØ—‘ Ð/JÑ KÕLØ >×#6Ñ#6Ó#8Ñ8Ø—‘ ¨~Ñ >Õ?Ø%¨×)<Ñ)<Ó)>Ñ>Ø—‘ Ð/CÑ DÕEØ˜>×.Ñ.Ó0Ò0Ø—‘ ¨vÑ 6Õ7ð =ð ˜SŸX™X›ZÑ'Ø�O‰O˜C Ñ/Ô0Ø˜cÑ!¤j°°_Ñ1EÄtÔ&LØ˜˜OÑ,Ñ,ˆHà˜sŸx™x›zÑ)Ü˜3˜Ñ/´Ô6Ø˜C Ñ0×5Ñ5Ó7Ñ7à�O‰O˜C Ñ0°Ñ:Ô;Üˆx‹=˜1ÒÜ�x“=Ð à0ùòY Rs   ÊT)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%      s8  … ñð €M�3ÓÙàØ)ØØñ	
ô€FˆDó ð &*€O�X˜c‘]Ó)Ø26€J�˜×.Ñ.Ñ/Ó6áØ $Øô€Lñ
 ˜(Ô#Øð¨$ð °3ò ó ó $ðð"B ð B¨sð B°só Bð;˜ð ;¨ð ;°ó ;ð˜Sð  Tó ð Cð ¨Dó ð. ð ¨¨S°#¨X©ó ð ðb1˜tð 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ß BÓ B÷+ñ +ôE1�Yõ E1r   