Spaces:
Runtime error
Runtime error
import json | |
from typing import List | |
import requests | |
from langchain_core.documents import Document | |
from langchain_core.pydantic_v1 import BaseModel, Field | |
class BraveSearchWrapper(BaseModel): | |
"""Wrapper around the Brave search engine.""" | |
api_key: str | |
"""The API key to use for the Brave search engine.""" | |
search_kwargs: dict = Field(default_factory=dict) | |
"""Additional keyword arguments to pass to the search request.""" | |
base_url: str = "https://api.search.brave.com/res/v1/web/search" | |
"""The base URL for the Brave search engine.""" | |
def run(self, query: str) -> str: | |
"""Query the Brave search engine and return the results as a JSON string. | |
Args: | |
query: The query to search for. | |
Returns: The results as a JSON string. | |
""" | |
web_search_results = self._search_request(query=query) | |
final_results = [ | |
{ | |
"title": item.get("title"), | |
"link": item.get("url"), | |
"snippet": item.get("description"), | |
} | |
for item in web_search_results | |
] | |
return json.dumps(final_results) | |
def download_documents(self, query: str) -> List[Document]: | |
"""Query the Brave search engine and return the results as a list of Documents. | |
Args: | |
query: The query to search for. | |
Returns: The results as a list of Documents. | |
""" | |
results = self._search_request(query) | |
return [ | |
Document( | |
page_content=item.get("description"), | |
metadata={"title": item.get("title"), "link": item.get("url")}, | |
) | |
for item in results | |
] | |
def _search_request(self, query: str) -> List[dict]: | |
headers = { | |
"X-Subscription-Token": self.api_key, | |
"Accept": "application/json", | |
} | |
req = requests.PreparedRequest() | |
params = {**self.search_kwargs, **{"q": query}} | |
req.prepare_url(self.base_url, params) | |
if req.url is None: | |
raise ValueError("prepared url is None, this should not happen") | |
response = requests.get(req.url, headers=headers) | |
if not response.ok: | |
raise Exception(f"HTTP error {response.status_code}") | |
return response.json().get("web", {}).get("results", []) | |