
    7|hb                     r    d Z ddlmZmZmZmZ ddlZddlZddlm	Z	 ddl
mZmZmZ ddlmZ  G d de      Zy)	z7Util that calls Google Search using the Serper.dev API.    )AnyDictListOptionalNget_from_dict_or_env)	BaseModel
ConfigDictmodel_validator)Literalc            	          e Zd ZU dZdZeed<   dZeed<   dZ	eed<   dZ
ed	   ed
<   dddddZeed<   dZee   ed<   dZee   ed<   dZeej&                     ed<    e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defd Zdededefd!Zd"edee   fd#Z d"edefd$Z!	 d)d%ed&ededefd'Z"	 d)d%ed&ededefd(Z#y)*GoogleSerperAPIWrappera  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                 *    t        |dd      }||d<   |S )z,Validate that api key exists in environment.r   SERPER_API_KEYr   )clsr"   r   s      j/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/utilities/google_serper.pyvalidate_environmentz+GoogleSerperAPIWrapper.validate_environment1   s)     .$&6
 $2     querykwargsc           	           | j                   |f| j                  | j                  | j                  | j                  | j
                  d|S )Run query through GoogleSearch.r   r   numr   search_type)_google_serper_api_resultsr   r   r   r   r   )selfr*   r+   s      r'   resultszGoogleSerperAPIWrapper.results<   sL    .t..
wwww		
 
 	
r)   c           	           | j                   |f| j                  | j                  | j                  | j                  | j
                  d|}| j                  |      S )z0Run query through GoogleSearch and parse result.r.   )r1   r   r   r   r   r   _parse_resultsr2   r*   r+   r3   s       r'   runzGoogleSerperAPIWrapper.runH   s\    1$11
wwww		
 
 ""7++r)   c           	         K    | j                   |f| j                  | j                  | j                  | j                  | j
                  d| d{   }|S 7 w)r-   r   r   r/   r0   r   N)#_async_google_serper_search_resultsr   r   r   r   r   r6   s       r'   aresultszGoogleSerperAPIWrapper.aresultsV   s^     @@@
wwww		
 
 
 
s   AAAAc           	         K    | j                   |f| j                  | j                  | j                  | j                  | j
                  d| d{   }| j                  |      S 7 w)z6Run query through GoogleSearch and parse result async.r9   N)r:   r   r   r   r   r   r5   r6   s       r'   arunzGoogleSerperAPIWrapper.arunc   sj     @@@
wwww		
 
 
 ""7++
s   AA)A'A)r3   c           	         g }|j                  d      r|j                  di       }|j                  d      r|j                  d      gS |j                  d      r"|j                  d      j                  dd      gS |j                  d      r|j                  d      S |j                  d      r|j                  di       }|j                  d      }|j                  d	      }|r|j                  | d
| d       |j                  d      }|r|j                  |       |j                  di       j                         D ]  \  }}	|j                  | d| d
|	 d       ! || j                  | j
                        d | j                   D ]Y  }
d|
v r|j                  |
d          |
j                  di       j                         D ]  \  }}	|j                  | d
|	 d        [ t        |      dk(  rdgS |S )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)r2   r3   snippets
answer_boxkgrF   entity_typerH   	attributevalueresults              r'   _parse_snippetsz&GoogleSerperAPIWrapper._parse_snippetsq   s   ;;{# ["5J~~h'"x011	*"y199$DEE 45!~~&:;;;;'(-r2BFF7OE&&.K5'K= :;&&/K,$&FF<$<$B$B$D B 	55'9+Rwa @AB d66tyyAB8TVVL 	:FF"y 12$*JJ|R$@$F$F$H : 	59+Rwa 89:	: x=A<==r)   c                 B    dj                  | j                  |            S )NrC   )joinrV   )r2   r3   s     r'   r5   z%GoogleSerperAPIWrapper._parse_results   s    xx,,W566r)   search_termr0   c                    | j                   xs ddd}d|i|j                         D ci c]  \  }}|	|| c}}}t        j                  d| ||      }|j	                          |j                         }	|	S c c}}w )N application/jsonz	X-API-KEYzContent-Typeqhttps://google.serper.dev/)headersparams)r   rM   requestspostraise_for_statusjson)
r2   rY   r0   r+   r`   keyrT   ra   responsesearch_resultss
             r'   r1   z1GoogleSerperAPIWrapper._google_serper_api_results   s     ,,2.

 
,2LLNPjc5e>OsEzP
 ==(6PV
 	!!#! Qs
   
A<A<c                   K   | j                   xs ddd}d| }d|i|j                         D ci c]  \  }}|	|| c}}}| j                  sut        j                         4 d {   }	|	j                  |||d      4 d {   }
|
j                          d {   }d d d       d {    d d d       d {    S | j                  j                  |||d      4 d {   }
|
j                          d {   }d d d       d {    |S c c}}w 7 7 7 7 t# 1 d {  7  sw Y   xY w7 {# 1 d {  7  sw Y   S xY w7 i7 S7 E# 1 d {  7  sw Y   S xY ww)	Nr[   r\   r]   r_   r^   F)ra   r`   rd   T)r   rM   r   aiohttpClientSessionrc   re   )r2   rY   r0   r+   r`   urlrf   rT   ra   sessionrg   rh   s               r'   r:   z:GoogleSerperAPIWrapper._async_google_serper_search_results   s     ,,2.
 +;-8
,2LLNPjc5e>OsEzP

 ,,. ; ;'"<<% (  ; ;+3==?%:N; ;; ;  ++FGd ,  7 7'/}}!67 7
  Q;; &;; ; ; ;; ; ; ; 7 "77 7 7 7
 s  /E0
DD)E0*D+E0.D>D!	D>D' D#!D'%D>0D%1D>5E0 D<)E0*E+E0.EEEE0EE0!D>#D'%D>'D9	-D0.D9	5D><E0>EEE	E0EE0E- E#!E-(E0)r   )$__name__
__module____qualname____doc__r   int__annotations__r   strr   r   r   r   dictr   r   r   r   rj   rk   r
   model_configr   classmethodr   r   r(   r3   r7   r;   r=   r   rV   r5   r1   r:    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   )rq   typingr   r   r   r   rj   rb   langchain_core.utilsr   pydanticr	   r
   r   typing_extensionsr   r   rx   r)   r'   <module>r}      s.    = , ,   5 ; ; %uY ur)   