
    dhb                     r    S r SSKJrJrJrJr  SSKrSSKrSSKJ	r	  SSK
JrJrJr  SSKJr   " S S\5      rg)	z7Util that calls Google Search using the Serper.dev API.    )AnyDictListOptionalNget_from_dict_or_env)	BaseModel
ConfigDictmodel_validator)Literalc            	          \ rS rSr% SrSr\\S'   Sr\	\S'   Sr
\	\S'   S	r\S
   \S'   SSSSS.r\\S'   Sr\\	   \S'   Sr\\	   \S'   Sr\\R(                     \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\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&\	S'\	S\S\4S( jjr# S+S&\	S'\	S\S\4S) jjr$S*r%g),GoogleSerperAPIWrapper   a  Wrapper around the Serper.dev Google Search API.

You can create a free API key at https://serper.dev.

To use, you should have the environment variable ``SERPER_API_KEY``
set with your API key, or pass `serper_api_key` as a named parameter
to the constructor.

Example:
    .. code-block:: python

        from langchain_community.utilities import GoogleSerperAPIWrapper
        google_serper = GoogleSerperAPIWrapper()

   kusglenhlsearch)newsr   placesimagestyper   r   r   organic)r   r   r   r   result_key_for_typeNtbsserper_api_key
aiosessionT)arbitrary_types_allowedbefore)modevaluesreturnc                 (    [        USS5      nX!S'   U$ )z,Validate that api key exists in environment.r   SERPER_API_KEYr   )clsr#   r   s      c/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/utilities/google_serper.pyvalidate_environment+GoogleSerperAPIWrapper.validate_environment1   s'     .$&6
 $2     querykwargsc           	          U R                   " U4U R                  U R                  U R                  U R                  U R
                  S.UD6$ )Run query through GoogleSearch.r   r   numr   search_type)_google_serper_api_resultsr   r   r   r   r   )selfr,   r-   s      r(   resultsGoogleSerperAPIWrapper.results<   sJ    ..
wwww		
 
 	
r+   c           	          U R                   " U4U R                  U R                  U R                  U R                  U R
                  S.UD6nU R                  U5      $ )z0Run query through GoogleSearch and parse result.r0   )r3   r   r   r   r   r   _parse_resultsr4   r,   r-   r5   s       r(   runGoogleSerperAPIWrapper.runH   sZ    11
wwww		
 
 ""7++r+   c           	         #    U R                   " U4U R                  U R                  U R                  U R                  U R
                  S.UD6I Sh  vN nU$  N7f)r/   r   r   r1   r2   r   N)#_async_google_serper_search_resultsr   r   r   r   r   r9   s       r(   aresultsGoogleSerperAPIWrapper.aresultsV   s[     @@
wwww		
 
 
 
s   AAAAc           	         #    U R                   " U4U R                  U R                  U R                  U R                  U R
                  S.UD6I Sh  vN nU R                  U5      $  N7f)z6Run query through GoogleSearch and parse result async.r=   N)r>   r   r   r   r   r   r8   r9   s       r(   arunGoogleSerperAPIWrapper.arunc   sg     @@
wwww		
 
 
 ""7++
s   AA)A'A)r5   c           	      F   / nUR                  S5      (       a  UR                  S0 5      nUR                  S5      (       a  UR                  S5      /$ UR                  S5      (       a"  UR                  S5      R                  SS5      /$ UR                  S5      (       a  UR                  S5      $ UR                  S5      (       a  UR                  S0 5      nUR                  S5      nUR                  S	5      nU(       a  UR                  U S
U S35        UR                  S5      nU(       a  UR                  U5        UR                  S0 5      R                  5        H  u  pUR                  U SU S
U	 S35        M!     XR                  U R
                        S U R                    H]  n
SU
;   a  UR                  U
S   5        U
R                  S0 5      R                  5        H  u  pUR                  U S
U	 S35        M     M_     [        U5      S:X  a  S/$ U$ )N	answerBoxanswersnippet
 snippetHighlightedknowledgeGraphtitler   z: .description
attributesr   z&No good Google Search Result was found)getreplaceappenditemsr   r   r   len)r4   r5   snippets
answer_boxkgrL   entity_typerN   	attributevalueresults              r(   _parse_snippets&GoogleSerperAPIWrapper._parse_snippetsq   s   ;;{## ["5J~~h''"x011	**"y199$DEE 455!~~&:;;;;'((-r2BFF7OE&&.K5'K= :;&&/K,$&FF<$<$B$B$D 	5'9+Rwa @A %E 66tyyAB8TVVLFF"y 12$*JJ|R$@$F$F$H 	9+Rwa 89 %I M x=A<==r+   c                 B    SR                  U R                  U5      5      $ )NrI   )joinr\   )r4   r5   s     r(   r8   %GoogleSerperAPIWrapper._parse_results   s    xx,,W566r+   search_termr2   c                    U R                   =(       d    SSS.nSU0UR                  5        VVs0 sH  u  pVUc  M
  XV_M     snnEn[        R                  " SU 3XGS9nUR	                  5         UR                  5       n	U	$ s  snnf )N application/jsonz	X-API-KEYzContent-Typeqhttps://google.serper.dev/)headersparams)r   rS   requestspostraise_for_statusjson)
r4   ra   r2   r-   rh   keyrZ   ri   responsesearch_resultss
             r(   r3   1GoogleSerperAPIWrapper._google_serper_api_results   s     ,,2.

 
,2LLNPNjcezszNP
 ==(6
 	!!#! Qs
   B B c                   #    U R                   =(       d    SSS.nSU 3nSU0UR                  5        VVs0 sH  u  pgUc  M
  Xg_M     snnEnU R                  (       dr  [        R                  " 5        IS h  vN n	U	R                  XXUSS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$ U R                  R                  XXUSS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$ s  snnf  N N N~ Np! , IS h  vN  (       d  f       N= f N|! , IS h  vN  (       d  f       W$ = f Ns N] NO! , IS h  vN  (       d  f       W$ = f7f)	Nrc   rd   re   rg   rf   F)ri   rh   rl   T)r   rS   r   aiohttpClientSessionrk   rm   )r4   ra   r2   r-   rh   urlrn   rZ   ri   sessionro   rp   s               r(   r>   :GoogleSerperAPIWrapper._async_google_serper_search_results   sg     ,,2.
 +;-8
,2LLNPNjcezszNP

 ,,..'"<<% (  +3==?%:N  /.  ++Gd ,  '/}}!6 
  Q / &;    /..  "7  
 s  4FDD/F7D$8F;ED&ED,)D(*D,.E9D*:E>F	E
%F/E#0F3E)E%E)FE'F&E(D,*E,E	2D53E	?EFE EE 	F%E)'F)F/E20F<F )r   )&__name__
__module____qualname____firstlineno____doc__r   int__annotations__r   strr   r   r   r   dictr   r   r   r   rs   rt   r
   model_configr   classmethodr   r   r)   r5   r:   r?   rB   r   r\   r8   r3   r>   __static_attributes__rx   r+   r(   r   r      s    AsKBNBN ;CD'6
7B	!  C#$(NHSM(26J../6 $L (#$ 3   $

S 

C 

D 

, , , ,C 3 4 , ,s ,s , t  S	  D7d 7s 7 4<-0GJ	& 4<-0GJ	 r+   r   )r}   typingr   r   r   r   rs   rj   langchain_core.utilsr   pydanticr	   r
   r   typing_extensionsr   r   rx   r+   r(   <module>r      s.    = , ,   5 ; ; %uY ur+   