
    Ng^                     f    d dl 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  G d de	          ZdS )    )AnyDictOptionalNget_from_dict_or_env)	BaseModel
ConfigDictmodel_validatorc                   h   e Zd ZU dZdZ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defdZdededefdZdededefdZededefd            ZdS )SearchApiAPIWrappera}  
    Wrapper around SearchApi API.

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

    Example:
        .. code-block:: python

            from langchain_community.utilities import SearchApiAPIWrapper
            searchapi = SearchApiAPIWrapper()
    googleengineNsearchapi_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   SEARCHAPI_API_KEYr   )clsr   r   s      c/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/utilities/searchapi.pyvalidate_environmentz(SearchApiAPIWrapper.validate_environment"   s/     1')<
 
 '8"#    querykwargsc                 H     | j         |fi |}|                     |          S N)results_result_as_stringselfr   r   r    s       r   runzSearchApiAPIWrapper.run,   s/    $,u////%%g...r   c                 X   K    | j         |fi | d {V }|                     |          S r   )aresultsr!   r"   s       r   arunzSearchApiAPIWrapper.arun0   sE      %e66v66666666%%g...r   c                 "     | j         |fi |}|S r   )_search_api_resultsr"   s       r   r    zSearchApiAPIWrapper.results4   s!    *$*5;;F;;r   c                 2   K    | j         |fi | d {V }|S r   )_async_search_api_resultsr"   s       r   r&   zSearchApiAPIWrapper.aresults8   s7      66uGGGGGGGGGGr   c                 n    ddd| j          i| j        |dd |                                D             dS )Nz&https://www.searchapi.io/api/v1/searchAuthorizationzBearer )r   qc                     i | ]
\  }}|||S r    ).0keyvalues      r   
<dictcomp>z8SearchApiAPIWrapper._prepare_request.<locals>.<dictcomp>E   s#    TTT*#u%BS3BSBSBSr   )urlheadersparams)r   r   items)r#   r   r   s      r   _prepare_requestz$SearchApiAPIWrapper._prepare_request<   s_    ;!C4+A!C!C +  UTTTT

 

 
	
r   c                      | j         |fi |}t          j        |d         |d         |d                   }|                                 |                                S )Nr5   r7   r6   )r5   r7   r6   )r9   requestsgetraise_for_statusjson)r#   r   r   request_detailsresponses        r   r)   z'SearchApiAPIWrapper._search_api_resultsI   sl    /$/@@@@<&"8,#I.
 
 

 	!!###}}r   c                 z  K    | j         |fi |}| j        st          j                    4 d{V }|                    |d         |d         |d         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   nu| j                            |d         |d         |d         d          4 d{V 	 }|                                 d{V }ddd          d{V  n# 1 d{V swxY w Y   |S )zFUse aiohttp to send request to SearchApi API and return results async.Nr5   r6   r7   T)r5   r6   r7   r=   )r9   r   aiohttpClientSessionr<   r>   )r#   r   r   r?   sessionr@   r    s          r   r+   z-SearchApiAPIWrapper._async_search_api_resultsS   s     /$/@@@@ 	0,.. 4 4 4 4 4 4 4'";;'.+I6*84%)	 '   4 4 4 4 4 4 4 4
 $,MMOO333333G4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 44 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 **#E*'	2&x0!%	 +   0 0 0 0 0 0 0 0
  (//////0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 sG   2B4$B?B4
B	B4B	B44
B>B>=D**
D47D4resultc                 J   d}d|                                  v r,d| d                                          v r| d         d         }n^d|                                  v r,d| d                                          v r| d         d         }nd|                                  v r| d         d         }nd|                                  v r(d | d         D             }d	                    |          }nd
|                                  v r(d | d
         D             }d	                    |          }n{d|                                  v r(d | d         D             }d	                    |          }n=d|                                  v r'd | d         D             }d	                    |          }|S )NzNo good search result found
answer_boxanswersnippetknowledge_graphdescriptionorganic_resultsc                 J    g | ] }d |                                 v |d          !S )rI   keysr1   rs     r   
<listcomp>z9SearchApiAPIWrapper._result_as_string.<locals>.<listcomp>s   s:       !"9PQPVPVPXPXCXCX)CXCXCXr   
jobsc                 J    g | ] }d |                                 v |d          !S )rK   rN   rP   s     r   rR   z9SearchApiAPIWrapper._result_as_string.<locals>.<listcomp>x   s6       %&MQVVXX<U<U- <U<U<Ur   videosc                 b    g | ],}d |                                 v d|d           d|d          -S )titleTitle: "" Link: linkrN   rP   s     r   rR   z9SearchApiAPIWrapper._result_as_string.<locals>.<listcomp>}   sM       affhh&& ?QwZ>>6>>&&&r   imagesc                 n    g | ]2}d |                                 v d|d          d|d          d          3S )originalrY   rX   rZ   r[   rN   rP   s     r   rR   z9SearchApiAPIWrapper._result_as_string.<locals>.<listcomp>   sS       )) KQwZJJ:v1FJJ)))r   )rO   join)rE   toretsnippetsrT   rV   r\   s         r   r!   z%SearchApiAPIWrapper._result_as_stringi   s   -6;;==((X9M9R9R9T9T-T-T<(2EEV[[]]**yF<<P<U<U<W<W/W/W<(3EE&++--//,-m<EE&++--// &,->&?  H IIh''EEv{{}}$$ *0.  D IIdOOEE&& )  F
 IIf%%EE&& )  F
 IIf%%Er   )__name__
__module____qualname____doc__r   str__annotations__r   r   r   rB   rC   r	   model_configr
   classmethodr   r   r   r$   r'   dictr    r&   r9   r)   r+   staticmethodr!   r0   r   r   r   r   	   s           FC'+x}+++26J./666: $  L _(###$ 3    [ $#/ / / / / / // /s /s / / / /S C D    C 3 4    
c 
S 
T 
 
 
 
      S C D    ,  $  3       \     r   r   )typingr   r   r   rB   r;   langchain_core.utilsr   pydanticr   r	   r
   r   r0   r   r   <module>ro      s    & & & & & & & & & &   5 5 5 5 5 5 ; ; ; ; ; ; ; ; ; ;A A A A A) A A A A Ar   