Spaces:
Running
Running
import json | |
import requests | |
from typing import List, Optional | |
# from langchain_community.document_transformers import MarkdownifyTransformer | |
from langchain_core.documents import Document | |
from langchain_core.pydantic_v1 import BaseModel, Field | |
class BraveAIWrapper(BaseModel): | |
api_key: str = Field(..., description="API key for Brave Search") | |
base_search_url: str = Field("https://api.search.brave.com/res/v1/web/search", const=True) | |
base_summarize_url: str = Field("https://api.search.brave.com/res/v1/summarizer/search", const=True) | |
headers: dict = Field(default_factory=dict, description="HTTP headers for API requests") | |
class Config: | |
arbitrary_types_allowed = True | |
def __init__(self, **data): | |
super().__init__(**data) | |
self.headers = { | |
"X-Subscription-Token": self.api_key, | |
"Accept": "application/json", | |
"Accept-Encoding": "gzip", | |
} | |
def get_brave_results(self, query: str, count: int = 3, safe_search: str = 'off') -> Optional[dict]: | |
""" | |
Get search results from Brave Search. | |
Args: | |
query (str): The search query. | |
count (int): Number of results to return. | |
safe_search (str): Safe search filter (off, moderate, strict). | |
Returns: | |
Optional[dict]: JSON response from Brave Search API or None if an error occurs. | |
""" | |
params = { | |
"q": query, | |
"count": count, | |
"summary": True, | |
"safe_search": safe_search, | |
"extra_snippets": True, | |
} | |
try: | |
response = requests.get(self.base_search_url, headers=self.headers, params=params) | |
response.raise_for_status() | |
return response.json() | |
except requests.exceptions.RequestException as e: | |
print(f"Error: {e}") | |
return None | |
def summarize_results(self, summarizer_key: str) -> Optional[dict]: | |
""" | |
Summarize search results using Brave Summarizer. | |
Args: | |
summarizer_key (str): The key for the summarizer. | |
Returns: | |
Optional[dict]: JSON response from Brave Summarizer API or None if an error occurs. | |
""" | |
params = {"key": summarizer_key} | |
try: | |
response = requests.get(self.base_summarize_url, headers=self.headers, params=params) | |
response.raise_for_status() | |
return response.json() | |
except requests.exceptions.RequestException as e: | |
print(f"Error: {e}") | |
return None | |
def get_and_summarize(self, query: str, count: int = 3, safe_search: str = 'off') -> Optional[str]: | |
""" | |
Get and summarize search results from Brave Search. | |
Args: | |
query (str): The search query. | |
count (int): Number of results to return. | |
safe_search (str): Safe search filter (off, moderate, strict). | |
Returns: | |
Optional[str]: Summarized result or None if an error occurs. | |
""" | |
results = self.get_brave_results(query, count, safe_search) | |
if results and 'summarizer' in results: | |
summarizer_key = results['summarizer']['key'] | |
summary = self.summarize_results(summarizer_key) | |
if summary and 'summary' in summary and len(summary['summary']) > 0: | |
return summary['summary'][0]['data'] | |
return None | |