[docs]classSearchApiAPIWrapper(BaseModel):""" 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() """# Use "google" engine by default.# Full list of supported ones can be found in https://www.searchapi.io docsengine:str="google"searchapi_api_key:Optional[str]=Noneaiosession:Optional[aiohttp.ClientSession]=Nonemodel_config=ConfigDict(arbitrary_types_allowed=True,)@model_validator(mode="before")@classmethoddefvalidate_environment(cls,values:Dict)->Any:"""Validate that API key exists in environment."""searchapi_api_key=get_from_dict_or_env(values,"searchapi_api_key","SEARCHAPI_API_KEY")values["searchapi_api_key"]=searchapi_api_keyreturnvalues
def_prepare_request(self,query:str,**kwargs:Any)->dict:return{"url":"https://www.searchapi.io/api/v1/search","headers":{"Authorization":f"Bearer {self.searchapi_api_key}",},"params":{"engine":self.engine,"q":query,**{key:valueforkey,valueinkwargs.items()ifvalueisnotNone},},}def_search_api_results(self,query:str,**kwargs:Any)->dict:request_details=self._prepare_request(query,**kwargs)response=requests.get(url=request_details["url"],params=request_details["params"],headers=request_details["headers"],)response.raise_for_status()returnresponse.json()asyncdef_async_search_api_results(self,query:str,**kwargs:Any)->dict:"""Use aiohttp to send request to SearchApi API and return results async."""request_details=self._prepare_request(query,**kwargs)ifnotself.aiosession:asyncwithaiohttp.ClientSession()assession:asyncwithsession.get(url=request_details["url"],headers=request_details["headers"],params=request_details["params"],raise_for_status=True,)asresponse:results=awaitresponse.json()else:asyncwithself.aiosession.get(url=request_details["url"],headers=request_details["headers"],params=request_details["params"],raise_for_status=True,)asresponse:results=awaitresponse.json()returnresults@staticmethoddef_result_as_string(result:dict)->str:toret="No good search result found"if"answer_box"inresult.keys()and"answer"inresult["answer_box"].keys():toret=result["answer_box"]["answer"]elif"answer_box"inresult.keys()and"snippet"inresult["answer_box"].keys():toret=result["answer_box"]["snippet"]elif"knowledge_graph"inresult.keys():toret=result["knowledge_graph"]["description"]elif"organic_results"inresult.keys():snippets=[r["snippet"]forrinresult["organic_results"]if"snippet"inr.keys()]toret="\n".join(snippets)elif"jobs"inresult.keys():jobs=[r["description"]forrinresult["jobs"]if"description"inr.keys()]toret="\n".join(jobs)elif"videos"inresult.keys():videos=[f"""Title: "{r["title"]}" Link: {r["link"]}"""forrinresult["videos"]if"title"inr.keys()]toret="\n".join(videos)elif"images"inresult.keys():images=[f"""Title: "{r["title"]}" Link: {r["original"]["link"]}"""forrinresult["images"]if"original"inr.keys()]toret="\n".join(images)returntoret