
    7|h^                     ^    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y)    )AnyDictOptionalNget_from_dict_or_env)	BaseModel
ConfigDictmodel_validatorc                   F   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y)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                 *    t        |dd      }||d<   |S )z,Validate that API key exists in environment.r   SEARCHAPI_API_KEYr   )clsr   r   s      f/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/utilities/searchapi.pyvalidate_environmentz(SearchApiAPIWrapper.validate_environment"   s*     1')<
 '8"#    querykwargsc                 J     | j                   |fi |}| j                  |      S N)results_result_as_stringselfr   r   r    s       r   runzSearchApiAPIWrapper.run,   s(    $,,u//%%g..r   c                 f   K    | j                   |fi | d {   }| j                  |      S 7 wr   )aresultsr!   r"   s       r   arunzSearchApiAPIWrapper.arun0   s4     %e6v66%%g.. 7s   1/1c                 ,     | j                   |fi |}|S r   )_search_api_resultsr"   s       r   r    zSearchApiAPIWrapper.results4   s    *$**5;F;r   c                 H   K    | j                   |fi | d {   }|S 7 wr   )_async_search_api_resultsr"   s       r   r&   zSearchApiAPIWrapper.aresults8   s+     666uGGG Hs   " "c           	          ddd| j                    i| j                  |d|j                         D ci c]  \  }}|	|| c}}dS c c}}w )Nz&https://www.searchapi.io/api/v1/searchAuthorizationzBearer )r   q)urlheadersparams)r   r   items)r#   r   r   keyvalues        r   _prepare_requestz$SearchApiAPIWrapper._prepare_request<   sf    ;74+A+A*B!C ++ 17T*#u%BS3:T

 
	
 Us
   
A
A
c                      | j                   |fi |}t        j                  |d   |d   |d         }|j                          |j	                         S )Nr/   r1   r0   )r/   r1   r0   )r5   requestsgetraise_for_statusjson)r#   r   r   request_detailsresponses        r   r)   z'SearchApiAPIWrapper._search_api_resultsI   sY    /$//@@<<&"8,#I.

 	!!#}}r   c                   K    | j                   |fi |}| j                  s~t        j                         4 d{   }|j	                  |d   |d   |d   d      4 d{   }|j                          d{   }ddd      d{    ddd      d{    S | j                  j	                  |d   |d   |d   d      4 d{   }|j                          d{   }ddd      d{    |S 7 7 7 7 w# 1 d{  7  sw Y   xY w7 ~# 1 d{  7  sw Y   S xY w7 c7 M7 ?# 1 d{  7  sw Y   S xY ww)zFUse aiohttp to send request to SearchApi API and return results async.Nr/   r0   r1   T)r/   r0   r1   r9   )r5   r   aiohttpClientSessionr8   r:   )r#   r   r   r;   sessionr<   r    s          r   r+   z-SearchApiAPIWrapper._async_search_api_resultsS   so    /$//@@,,. 4 4'";;'.+I6*84%)	 '  4 4
 $,MMO3G4 44 4   **#E*'	2&x0!%	 +  0 0
  (/0 0 !44 44 4 4 44 4 4 4  0 00 0 0 0 s   8EC;E#D!C="D%D9C?:D>D	D
DED2ED0ED6$D2%D6)E4D45E=D?DDD		D
D	DED- D#!D-(	E2D64E6E	<D?=E	Eresultc                    d}d| j                         v rd| d   j                         v r
| d   d   }|S d| j                         v rd| d   j                         v r
| d   d   }|S d| j                         v r
| d   d   }|S d| j                         v r;| d   D cg c]  }d|j                         v s|d    }}dj                  |      }|S d	| j                         v r;| d	   D cg c]  }d|j                         v s|d    }}dj                  |      }|S d
| j                         v rC| d
   D cg c]"  }d|j                         v rd|d    d|d    $ }}dj                  |      }|S d| j                         v rD| d   D cg c]%  }d|j                         v rd|d    d|d   d    ' }}dj                  |      }|S c c}w c c}w c c}w c c}w )NzNo good search result found
answer_boxanswersnippetknowledge_graphdescriptionorganic_results
jobsvideostitlezTitle: "z" Link: linkimagesoriginal)keysjoin)rA   toretrsnippetsrJ   rK   rN   s          r   r!   z%SearchApiAPIWrapper._result_as_stringi   sH   -6;;=(X9M9R9R9T-T<(2E: 9 V[[]*yF<<P<U<U<W/W<(3E6 5 &++-/,-m<E2 1 &++-/&,->&?!"9PQPVPVPXCX)H  IIh'E( ' v{{}$*0.%&MQVVX<U- D  IIdOE  &  )affh& QwZL6>F 
 IIf%E  &  )) QwZL:v1F0GJF 
 IIf%E/

s$   G2G'G?G4'G	*G)__name__
__module____qualname____doc__r   str__annotations__r   r   r   r>   r?   r	   model_configr
   classmethodr   r   r   r$   r'   dictr    r&   r5   r)   r+   staticmethodr!    r   r   r   r   	   sK     FC'+x}+26J../6 $L (#$ 3   $/ / / // /s /s /S C D C 3 4 
c 
S 
T 
   S C D ,  $  3    r   r   )typingr   r   r   r>   r7   langchain_core.utilsr   pydanticr   r	   r
   r   r_   r   r   <module>rc      s(    & &   5 ; ;A) Ar   