Vikas2025's picture
Add venv to gitignore
25a8ac6
Raw
History Blame Contribute Delete
5.23 kB
import random
from httpcore import TimeoutException
from huggingface_hub import list_models
from langchain_community.tools import DuckDuckGoSearchRun
from langchain_core.tools import Tool
from selenium import webdriver
driver = webdriver.Chrome()
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import os
try:
from langchain_tavily import TavilySearch
tavily_api_key = os.getenv("TAVILY_API_KEY")
if tavily_api_key:
tavilytool = TavilySearch(
max_results=2,
search_depth="advanced", # deep crawl mode
include_raw_content=True, # returns full page text, not just snippets
tavily_api_key=tavily_api_key
)
else:
tavilytool = None
except ImportError:
tavilytool = None
class ToolRegistry:
"""
A registry that defines and exposes all LangChain tools.
Import this class in downstream code and access tools via class methods or attributes.
"""
# ------------------------------------------------------------------ #
# Internal implementations #
# ------------------------------------------------------------------ #
@staticmethod
def _weather_info(location: str) -> str:
"""Fetches dummy weather information for a given location."""
weather_conditions = [
{"condition": "Rainy", "temp_c": 15},
{"condition": "Clear", "temp_c": 25},
{"condition": "Windy", "temp_c": 20},
]
data = random.choice(weather_conditions)
return f"Weather in {location}: {data['condition']}, {data['temp_c']}°C"
@staticmethod
def _get_hub_stats(author: str) -> str:
"""Fetches the most downloaded model from a specific author on the Hugging Face Hub."""
try:
models = list(list_models(author=author, sort="downloads", limit=1))
if models:
model = models[0]
return (
f"The most downloaded model by {author} is {model.id} "
f"with {model.downloads:,} downloads."
)
return f"No models found for author {author}."
except Exception as e:
return f"Error fetching models for {author}: {str(e)}"
@staticmethod
def _browse_url(url: str) -> str:
"""Opens a URL and returns the page text"""
try:
driver.get(url)
WebDriverWait(driver, 20).until(EC.presence_of_all_elements_located(("tag name", "body")))
return driver.find_element("tag name", "body").text[:3000]
except TimeoutException as e:
return f"Timeout loading {url}: {str(e)}. Current URL: {driver.current_url}"
@staticmethod
def _click_element(selector: str) -> str:
"""Clicks an element by CSS selector"""
try:
element = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable(("css selector", selector))
)
element.click()
return f"Clicked {selector}"
except TimeoutException as e:
return f"Timeout clicking {selector}: {str(e)}. Current URL: {driver.current_url}"
# ------------------------------------------------------------------ #
# Tool factories #
# ------------------------------------------------------------------ #
@classmethod
def weather_info_tool(cls) -> Tool:
"""Returns a LangChain Tool for fetching weather information."""
return Tool(
name="WeatherInfoTool",
func=cls._weather_info,
description="Retrieves weather information for a given location.",
)
@classmethod
def hub_stats_tool(cls) -> Tool:
"""Returns a LangChain Tool for fetching Hugging Face Hub stats."""
return Tool(
name="get_hub_stats",
func=cls._get_hub_stats,
description=(
"Fetches the most downloaded model from a specific author "
"on the Hugging Face Hub."
),
)
@classmethod
def duck_duck_go_search_tool(cls) -> DuckDuckGoSearchRun:
"""Returns a LangChain DuckDuckGo search tool."""
return DuckDuckGoSearchRun()
@classmethod
def tavily_search_tool(cls) -> TavilySearch:
"""Returns a LangChain Tavily search tool."""
if tavilytool is None:
raise ValueError("Tavily tool not available. Please install langchain-tavily and set TAVILY_API_KEY environment variable.")
return tavilytool
# ------------------------------------------------------------------ #
# Convenience: get all tools at once #
# ------------------------------------------------------------------ #
@classmethod
def get_all_tools(cls) -> list[Tool]:
"""Returns a list of all registered tools — ready to pass to an agent."""
return [
cls.weather_info_tool(),
cls.hub_stats_tool(),
cls.duck_duck_go_search_tool(),
]