Shreyas094's picture
Upload 528 files
372531f verified
raw
history blame
3.45 kB
# Tavily API Retriever
# libraries
import os
from typing import Literal, Sequence, Optional
import requests
import json
class TavilySearch():
"""
Tavily API Retriever
"""
def __init__(self, query, headers=None, topic="general"):
"""
Initializes the TavilySearch object
Args:
query:
"""
self.query = query
self.headers = headers or {}
self.topic = topic
self.base_url = "https://api.tavily.com/search"
self.api_key = self.get_api_key()
self.headers = {
"Content-Type": "application/json",
}
def get_api_key(self):
"""
Gets the Tavily API key
Returns:
"""
api_key = self.headers.get("tavily_api_key")
if not api_key:
try:
api_key = os.environ["TAVILY_API_KEY"]
except KeyError:
raise Exception(
"Tavily API key not found. Please set the TAVILY_API_KEY environment variable.")
return api_key
def _search(self,
query: str,
search_depth: Literal["basic", "advanced"] = "basic",
topic: str = "general",
days: int = 2,
max_results: int = 5,
include_domains: Sequence[str] = None,
exclude_domains: Sequence[str] = None,
include_answer: bool = False,
include_raw_content: bool = False,
include_images: bool = False,
use_cache: bool = True,
) -> dict:
"""
Internal search method to send the request to the API.
"""
data = {
"query": query,
"search_depth": search_depth,
"topic": topic,
"days": days,
"include_answer": include_answer,
"include_raw_content": include_raw_content,
"max_results": max_results,
"include_domains": include_domains,
"exclude_domains": exclude_domains,
"include_images": include_images,
"api_key": self.api_key,
"use_cache": use_cache,
}
response = requests.post(self.base_url, data=json.dumps(
data), headers=self.headers, timeout=100)
if response.status_code == 200:
return response.json()
else:
# Raises a HTTPError if the HTTP request returned an unsuccessful status code
response.raise_for_status()
def search(self, max_results=7):
"""
Searches the query
Returns:
"""
try:
# Search the query
results = self._search(
self.query, search_depth="basic", max_results=max_results, topic=self.topic)
sources = results.get("results", [])
if not sources:
raise Exception("No results found with Tavily API search.")
# Return the results
search_response = [{"href": obj["url"],
"body": obj["content"]} for obj in sources]
except Exception as e:
print(
f"Error: {e}. Failed fetching sources. Resulting in empty response.")
search_response = []
return search_response