
    Ngb                     z    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dS )	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#dS )*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                 2    t          |dd          }||d<   |S )z,Validate that api key exists in environment.r   SERPER_API_KEYr   )clsr"   r   s      g/var/www/html/ai-engine/env/lib/python3.11/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<   sI    .t.
ww	
 
 
 
 	
r)   c           	           | j         |f| j        | j        | j        | j        | j        d|}|                     |          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
ww	
 
 
 
 ""7+++r)   c           	      p   K    | j         |f| j        | j        | j        | j        | j        d| d{V }|S )r-   r   r   r/   r0   r   N)#_async_google_serper_search_resultsr   r   r   r   r   r6   s       r'   aresultszGoogleSerperAPIWrapper.aresultsV   so      @@
ww	
 
 
 
 
 
 
 
 
 
 r)   c           	         K    | j         |f| j        | j        | j        | j        | j        d| d{V }|                     |          S )z6Run query through GoogleSearch and parse result async.r9   N)r:   r   r   r   r   r   r5   r6   s       r'   arunzGoogleSerperAPIWrapper.arunc   s~      @@
ww	
 
 
 
 
 
 
 
 
 
 ""7+++r)   r3   c           	         g }|                     d          r|                     di           }|                     d          r|                     d          gS |                     d          r*|                     d                              dd          gS |                     d          r|                     d          S |                     d          r|                     di           }|                     d          }|                     d	          }|r|                    | d
| d           |                     d          }|r|                    |           |                     di                                           D ]#\  }}	|                    | d| d
|	 d           $|| j        | j                          d | j                 D ]j}
d|
v r|                    |
d                    |
                     di                                           D ] \  }}	|                    | d
|	 d           !kt          |          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   sy   ;;{## 	< ["55J~~h'' <"x0011	** <"y1199$DDEE 455 <!~~&:;;;;;'(( 
	B-r22BFF7OOE&&..K <5 : :K : : :;;;&&//K -,,,$&FF<$<$<$B$B$D$D B B 	55 @ @9 @ @ @ @ @AAAAd6tyAB8TV8L 	: 	:FF""y 1222$*JJ|R$@$@$F$F$H$H : : 	59 8 8 8 8 89999: x==A<==r)   c                 R    d                     |                     |                    S )NrC   )joinrV   )r2   r3   s     r'   r5   z%GoogleSerperAPIWrapper._parse_results   s"    xx,,W55666r)   search_termr0   c                     | j         pddd}d|id |                                D             }t          j        d| ||          }|                                 |                                }|S )N application/jsonz	X-API-KEYzContent-Typeqc                     i | ]
\  }}|||S N .0keyrT   s      r'   
<dictcomp>zEGoogleSerperAPIWrapper._google_serper_api_results.<locals>.<dictcomp>   #    PPPjc5e>OsE>O>O>Or)   https://google.serper.dev/)headersparams)r   rM   requestspostraise_for_statusjson)r2   rY   r0   r+   rh   ri   responsesearch_resultss           r'   r1   z1GoogleSerperAPIWrapper._google_serper_api_results   s     ,2.
 

 
PPFLLNNPPP
 =666PV
 
 
 	!!###!r)   c                 |  K   | j         pddd}d| }d|id |                                D             }| j        st          j                    4 d {V }|                    |||d          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   nc| j                            |||d	          4 d {V 	 }|                                 d {V }	d d d           d {V  n# 1 d {V swxY w Y   |	S )
Nr[   r\   r]   rg   r^   c                     i | ]
\  }}|||S r`   ra   rb   s      r'   re   zNGoogleSerperAPIWrapper._async_google_serper_search_results.<locals>.<dictcomp>   rf   r)   F)ri   rh   rl   T)r   rM   r   aiohttpClientSessionrk   rm   )
r2   rY   r0   r+   rh   urlri   sessionrn   ro   s
             r'   r:   z:GoogleSerperAPIWrapper._async_google_serper_search_results   s      ,2.
 
 9;88
PPFLLNNPPP

  
	7,.. ; ; ; ; ; ; ;'"<<% (   ; ; ; ; ; ; ; ;+3==??%:%:%:%:%:%:N; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ++FGd ,   7 7 7 7 7 7 7 7'/}}!6!6!6!6!6!67 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
 sH    C7B$C$
B.	.C1B.	2C
CC>D++
D58D5)r   )$__name__
__module____qualname____doc__r   int__annotations__r   strr   r   r   r   dictr   r   r   r   rr   rs   r
   model_configr   classmethodr   r   r(   r3   r7   r;   r=   r   rV   r5   r1   r:   ra   r)   r'   r   r      s          AsKKKBNNNBNNN ;CD'6
7BBB	! !    C#$(NHSM(((26J./666: $  L _(###$ 3    [ $#

S 

C 

D 

 

 

 

, , , , , , ,C 3 4    , ,s ,s , , , , t  S	        D7d 7s 7 7 7 7 4< -0GJ	   & 4< -0GJ	     r)   r   )ry   typingr   r   r   r   rr   rj   langchain_core.utilsr   pydanticr	   r
   r   typing_extensionsr   r   ra   r)   r'   <module>r      s    = = , , , , , , , , , , , ,   5 5 5 5 5 5 ; ; ; ; ; ; ; ; ; ; % % % % % %u u u u uY u u u u ur)   