a
    bgb                     @   sl   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 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                   @   sN  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dZeddeeedddZeeedddZeeeddd Zeeedd!d"Zeeedd#d$Zeee d%d&d'Z eed%d(d)Z!d/eeeed*d+d,Z"d0eeeed*d-d.Z#dS )1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   Zorganic)r   r   r   r   result_key_for_typeNtbsserper_api_key
aiosessionT)Zarbitrary_types_allowedbefore)mode)valuesreturnc                 C   s   t |dd}||d< |S )z,Validate that api key exists in environment.r   ZSERPER_API_KEYr   )clsr   r    r!   y/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/utilities/google_serper.pyvalidate_environment1   s
    z+GoogleSerperAPIWrapper.validate_environment)querykwargsr   c                 K   s(   | 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%   r!   r!   r"   results<   s    zGoogleSerperAPIWrapper.resultsc                 K   s2   | j |f| j| j| j| j| jd|}| |S )z0Run query through GoogleSearch and parse result.r'   )r*   r   r   r   r   r   _parse_resultsr+   r$   r%   r,   r!   r!   r"   runH   s    
zGoogleSerperAPIWrapper.runc                    s2   | j |f| j| j| j| j| jd|I dH }|S )r&   r   r   r(   r)   r   N)#_async_google_serper_search_resultsr   r   r   r   r   r.   r!   r!   r"   aresultsV   s    	zGoogleSerperAPIWrapper.aresultsc                    s8   | j |f| j| j| j| j| jd|I dH }| |S )z6Run query through GoogleSearch and parse result async.r0   N)r1   r   r   r   r   r   r-   r.   r!   r!   r"   arunc   s    
zGoogleSerperAPIWrapper.arun)r,   r   c              	   C   sx  g }| drb| di }| dr0| dgS | drN| dddgS | drb| dS | dr| di }| d}| d	}|r|| d
| d | d}|r|| | di  D ]$\}}	|| d| d
|	 d q|| j| j  d | j D ]P}
d|
v r*||
d  |
 di  D ] \}}	|| d
|	 d q:qt|dkrtdgS |S )NZ	answerBoxZanswerZsnippet
 ZsnippetHighlightedZknowledgeGraphtitler   z: .description
attributesr   z&No good Google Search Result was found)getreplaceappenditemsr   r   r   len)r+   r,   ZsnippetsZ
answer_boxZkgr6   Zentity_typer8   	attributevalueresultr!   r!   r"   _parse_snippetsq   s8    










z&GoogleSerperAPIWrapper._parse_snippetsc                 C   s   d | |S )Nr5   )joinrB   )r+   r,   r!   r!   r"   r-      s    z%GoogleSerperAPIWrapper._parse_results)search_termr)   r%   r   c                 K   sT   | j pddd}d|idd | D }tjd| ||d}|  | }|S )	N application/jsonz	X-API-KEYzContent-Typeqc                 S   s   i | ]\}}|d ur||qS Nr!   .0keyr@   r!   r!   r"   
<dictcomp>       zEGoogleSerperAPIWrapper._google_serper_api_results.<locals>.<dictcomp>https://google.serper.dev/)headersparams)r   r=   requestspostraise_for_statusjson)r+   rD   r)   r%   rP   rQ   responsesearch_resultsr!   r!   r"   r*      s    z1GoogleSerperAPIWrapper._google_serper_api_resultsc           
   
      s*  | j pddd}d| }d|idd | D }| jst 4 I d H j}|j|||dd	4 I d H $}| I d H }	W d   I d H  q1 I d H s0    Y  W d   I d H  q1 I d H s0    Y  nZ| jj|||d
d	4 I d H &}| I d H }	W d   I d H  q&1 I d H s0    Y  |	S )NrE   rF   rG   rO   rH   c                 S   s   i | ]\}}|d ur||qS rI   r!   rJ   r!   r!   r"   rM      rN   zNGoogleSerperAPIWrapper._async_google_serper_search_results.<locals>.<dictcomp>F)rQ   rP   rT   T)r   r=   r   aiohttpClientSessionrS   rU   )
r+   rD   r)   r%   rP   urlrQ   sessionrV   rW   r!   r!   r"   r1      s*    
d<z:GoogleSerperAPIWrapper._async_google_serper_search_results)r   )r   )$__name__
__module____qualname____doc__r   int__annotations__r   strr   r   r   r   dictr   r   r   r   rX   rY   r	   Zmodel_configr
   classmethodr   r   r#   r,   r/   r2   r3   r   rB   r-   r*   r1   r!   r!   r!   r"   r      sF   
	"  r   )r_   typingr   r   r   r   rX   rR   Zlangchain_core.utilsr   Zpydanticr   r	   r
   Ztyping_extensionsr   r   r!   r!   r!   r"   <module>   s   