
    dh!                         S r SSKrSSKrSSKJrJrJrJr  SSKrSSK	J
r
  SSKJrJrJrJr   " S S5      r " S S	\5      rg)
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                   4    \ rS rSrSrS	S jrS\SS4S jrSrg)
HiddenPrints   zContext manager to hide prints.returnNc                 t    [         R                  U l        [        [        R
                  S5      [         l        g)zOpen file to pipe stdout to.wN)sysstdout_original_stdoutopenosdevnull)selfs    ]/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/utilities/serpapi.py	__enter__HiddenPrints.__enter__   s      #

"**c*
    _c                 j    [         R                  R                  5         U R                  [         l        g)z$Close file that stdout was piped to.N)r   r   closer   )r   r   s     r   __exit__HiddenPrints.__exit__   s    

**
r   )r   )r   N)	__name__
__module____qualname____firstlineno____doc__r   r   r    __static_attributes__ r   r   r   r      s    )+
+3 +4 +r   r   c                   H   \ rS rSr% SrSr\\S'   \" SSSSS	.S
9r	\
\S'   Sr\\   \S'   Sr\\R                      \S'   \" SSS9r\" SS9\S\S\4S j5       5       rS\S\S\4S jrS\S\S\4S jrS\S\
4S jrS\S\
4S jrS\S\\\4   4S jr\S\
S\4S j5       rSrg) SerpAPIWrapper   a~  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                 p    [        USS5      nX!S'    SSKJn  X1S'   U$ ! [         a    [        S5      ef = f)z?Validate that api key and python package exists in environment.r6   SERPAPI_API_KEYr   )GoogleSearchr,   zdCould not import serpapi python package. Please install it with `pip install google-search-results`.)r   serpapir@   ImportError)clsr=   r6   r@   s       r   validate_environment#SerpAPIWrapper.validate_environment<   s]     /%'8
 %4 !	,&2?#   	N 	s   
 5querykwargsc                 ^   #    U R                  U R                  U5      I Sh  vN 5      $  N7f)z1Run query through SerpAPI and parse result async.N)_process_responsearesultsr   rF   rG   s      r   arunSerpAPIWrapper.arunO   s%     %%DMM%,@&@AA&@s    -+	-c                 B    U R                  U R                  U5      5      $ )z+Run query through SerpAPI and parse result.)rI   resultsrK   s      r   runSerpAPIWrapper.runS   s    %%dll5&9::r   c                     U R                  U5      n[        5          U R                  U5      nUR                  5       nSSS5        U$ ! , (       d  f       W$ = f)z4Run query through SerpAPI and return the raw result.N)
get_paramsr   r,   get_dict)r   rF   r5   searchress        r   rO   SerpAPIWrapper.resultsW   sL    '^''/F//#C  
 ^ 
s   "A
Ac                   ^ ^#    S[         [        [        [        [        4   4   4UU 4S jjnU" 5       u  p4T R                  (       dp  [        R
                  " 5        ISh  vN nUR                  X4S9 ISh  vN nUR                  5       I Sh  vN nSSS5      ISh  vN   SSS5      ISh  vN   W$ T R                  R                  X4S9 ISh  vN nUR                  5       I Sh  vN nSSS5      ISh  vN   U$  N N Nv Nh! , ISh  vN  (       d  f       N}= f Nt! , ISh  vN  (       d  f       W$ = f Nm NW NI! , ISh  vN  (       d  f       W$ = f7f)zFUse aiohttp to run query through SerpAPI and return the results async.r   c                     > TR                  T5      n SU S'   TR                  (       a  TR                  U S'   SU S'   SnX4$ )Npythonsourceserp_api_keyjsonoutputzhttps://serpapi.com/search)rS   r6   )r5   urlrF   r   s     r   construct_url_and_params9SerpAPIWrapper.aresults.<locals>.construct_url_and_paramsb   sK    __U+F'F8##)-)=)=~&%F8.C;r   N)r5   )r   strr   r7   aiohttpClientSessiongetr]   )r   rF   r`   r_   r5   sessionresponserV   s   ``      r   rJ   SerpAPIWrapper.aresults_   s    	%T#s(^0C*D 	 	 /0,,..'";;s;::h (/C ;: /. 
 **3*>>($MMO+ ?> 
 /:/ ;::: /.. 
 ?+ ?>> 
s   AE$!D"E$%D(9D:D(=DDDD(!D
"D(&E$1D&2#E$EE$E	-E.E	2E$=E>E$D(D
D(D#	DD#	D(&E$(E .D1/E ;	E$E	E$	E!EE!E$c                 D    U R                   US.n0 U R                  EUEnU$ )zGet parameters for SerpAPI.)api_keyq)r6   r5   )r   rF   _paramsr5   s       r   rS   SerpAPIWrapper.get_paramsv   s1     ++
 ,DKK+7+r   rV   c           	      @   SU R                  5       ;   a  [        SU S    35      eSU R                  5       ;   a  U S   U S'   SU R                  5       ;   a  U S   n[        U[        5      (       a  US   nSUR                  5       ;   a  US   $ SUR                  5       ;   a  US   $ SUR                  5       ;   a  US   $ S	UR                  5       ;   a  US	   $ 0 nUR	                  5        HS  u  p4[        U[        [
        45      (       a  M"  [        U[        5      (       a  UR                  S
5      (       a  MO  XBU'   MU     [        U5      $ SU R                  5       ;   a  U S   SS $ SU R                  5       ;   a  U S   $ SU R                  5       ;   a  U S   $ SU R                  5       ;   a  U S   $ SU R                  5       ;   a  SU S   R                  5       ;   a  U S   S   $ SU R                  5       ;   a"  SU S   S   R                  5       ;   a  U S   SS $ SU R                  5       ;   a  U S   $ SU R                  5       ;   a  SU S   R                  5       ;   a  U S   S   $ SU R                  5       ;   a  SU S   R                  5       ;   a  U S   S   $ SU R                  5       ;   a=  SU S   S   R                  5       ;   a#  [        U S   SS  Vs/ sH  oUS   PM	     sn5      $ / nSU R                  5       ;   a  U S   nSU;   a  US   OSnSUR                  5       ;   a  UR                  US   5        UR	                  5        H  u  p4[        U[        5      (       d  M  [        U[        5      (       d  M3  US ;  d  M;  UR                  S!5      (       a  MS  UR                  S"5      (       a  Mk  UR                  S
5      (       a  M  UR                  U S#U S$U S%35        M     U R                  S&/ 5       H  n	SU	R                  5       ;   a  UR                  U	S   5        M-  S	U	R                  5       ;   a  UR                  U	S	   5        MW  S'U	R                  5       ;   a  UR                  U	S'   5        M  S(U	R                  5       ;   a  UR                  U	S(   5        M  S)U	R                  5       ;   d  M  UR                  U	S)   5        M     S*U R                  5       ;   a  UR                  U S*   5        S+U ;   a  [        U S+   [        5      (       a  X`S+   -  nS+U R                  5       ;   aF  [        U S+   [
        5      (       a.  S,U S+   R                  5       ;   a  UR                  U S+   S,   5        [        U5      S:  a  [        U5      $ g-s  snf ).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)r   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dictrb   
startswithappendendswithre   len)
rV   rq   rs   keyvalueitemsnippetsr   r   organic_results
             r   rI    SerpAPIWrapper._process_response   s@    chhj 7G~FGG
* #$5 6C388:%\*J*d++']
:??,,!(++Z__..!(++joo//!),,,
0AA!"=>>","2"2"4JC%edD\::"5#..53C3CF3K3K&+s	 #5
 6{"+'("--+'((chhj(}%%sxxz)~&&sxxz)fN8K8P8P8R.R~&v..#((*,31215::<<)*2A..$
2.//"chhj0#&<"="B"B"DD-.~>>SXXZ'HL8I8N8N8P,P|$X..
*s#34Q7<<>>c:J6KCR6PQ6Pd[)6PQRR
*!"34O07?0JOG,PRE 4 4 66 >?-335
sC(("5#..#;;LL22LL11!,,V44OOugQse2eWA$>? 6 "gg&7<NN//11y 9:,0C0C0EE/J KL>#6#6#88~ >?%)<)<)>>/C DE>..00v 67 = SXXZ'OOC/0c!j_1Et&L&LO,,Hsxxz)3/66C05577OOC0:;x=1x= 0Y Rs   Vr(   )r"   r#   r$   r%   r&   r,   r   __annotations__r
   r5   r   r6   r   rb   r7   rc   rd   r	   model_configr   classmethodr   rD   rL   rP   rO   rJ   rS   staticmethodrI   r'   r(   r   r   r*   r*      s8    M3)	
FD  &*OXc])26J../6 $L
 (#$ 3   $"B Bs Bs B; ; ; ;S T C D . S#X  b1t b1 b1 b1r   r*   )r&   r   r   typingr   r   r   r   rc   langchain_core.utilsr   pydanticr   r	   r
   r   r   r*   r(   r   r   <module>r      s<   
 
 
 - -  5 B B+ +E1Y E1r   