deep-research / tools /google_tools.py
mishrabp's picture
Upload folder using huggingface_hub
bfe9585 verified
import os
import requests
from dotenv import load_dotenv
from agents import function_tool
from core.logger import log_call
# Load environment variables once
load_dotenv()
# ============================================================
# 🔹 GOOGLE SEARCH TOOLSET (Serper.dev API)
# ============================================================
class GoogleTools:
"""
GoogleTools provides function tools to perform web searches
using the Serper.dev API (Google Search). I am a fallback for
retrieving recent information from the web.
"""
@staticmethod
@function_tool
@log_call
def search(query: str, num_results: int = 3) -> str:
"""
Perform a general Google search using Serper.dev API.
Parameters:
-----------
query : str
The search query string, e.g., "latest Tesla stock news".
num_results : int, optional (default=3)
Maximum number of search results to return.
Returns:
--------
str
Nicely formatted search results.
"""
try:
api_key = os.getenv("SERPER_API_KEY")
if not api_key:
return "❌ Missing SERPER_API_KEY in environment variables."
url = "https://google.serper.dev/search"
headers = {
"X-API-KEY": api_key,
"Content-Type": "application/json"
}
payload = {
"q": query,
"gl": "us", # country code (optional)
"hl": "en", # language code (optional)
}
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
data = response.json()
organic_results = data.get("organic", [])
if not organic_results:
return "No search results found."
formatted = []
for item in organic_results[:num_results]:
title = item.get("title", "No title")
link = item.get("link", "No link")
snippet = item.get("snippet", "")
formatted.append(
f"Title: {title}\nLink: {link}\nSnippet: {snippet}\n"
)
# print(formatted[-1]) # Log each result
return "\n".join(formatted)
except requests.exceptions.RequestException as e:
return f"⚠️ Network error during Google search: {e}"
except Exception as e:
return f"⚠️ Error performing Google search: {e}"
# ============================================================
# 🔹 OPENAI & OTHER MODEL TOOLS
# ============================================================
class ModelTools:
"""
ModelTools provides function tools to interact with LLM APIs
such as OpenAI, Gemini, or Groq.
Features:
- Send prompts to a language model.
- Receive structured text completions.
- Can be extended to support multiple LLM providers.
"""
@staticmethod
@function_tool
def query_openai(prompt: str, model: str = "gpt-4o-mini") -> str:
"""
Query an OpenAI language model with a prompt.
Parameters:
-----------
prompt : str
User-provided prompt for the model.
model : str, optional (default="gpt-4o-mini")
Model name to query (e.g., "gpt-4o-mini", "gpt-4").
Returns:
--------
str
Model's response content as text.
If an error occurs (network/API), returns an error message.
Example:
--------
query_openai("Explain AI in finance")
Output:
"AI in finance refers to the use of machine learning and natural language
processing techniques to automate trading, risk assessment, and customer service..."
"""
try:
from openai import OpenAI # delayed import
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
)
return response.choices[0].message.content
except Exception as e:
return f"Error querying OpenAI API: {e}"