SantoshKumar1310's picture
Create tool.py
1e52380 verified
"""
Tool definitions for the agent
"""
import requests
from typing import List, Dict, Any
import re
class Tool:
"""Base tool class"""
def __init__(self, name: str, description: str, parameters: Dict[str, Any]):
self.name = name
self.description = description
self.parameters = parameters
def __call__(self, **kwargs):
raise NotImplementedError
class WebSearchTool(Tool):
"""Web search using DuckDuckGo or similar"""
def __init__(self):
super().__init__(
name="web_search",
description="Search the web for current information. Use this when you need to find facts, statistics, recent events, or any information not in your training data.",
parameters={
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "The search query"
}
},
"required": ["query"]
}
)
def __call__(self, query: str) -> str:
"""Perform web search using DuckDuckGo API"""
try:
# Using DuckDuckGo Instant Answer API (no key required)
url = "https://api.duckduckgo.com/"
params = {
"q": query,
"format": "json",
"no_html": 1,
"skip_disambig": 1
}
response = requests.get(url, params=params, timeout=10)
data = response.json()
# Extract relevant information
results = []
if data.get("Abstract"):
results.append(data["Abstract"])
if data.get("RelatedTopics"):
for topic in data["RelatedTopics"][:3]:
if isinstance(topic, dict) and topic.get("Text"):
results.append(topic["Text"])
if results:
return " ".join(results)
return f"No detailed results found for: {query}"
except Exception as e:
return f"Search error: {str(e)}"
class WikipediaSearchTool(Tool):
"""Wikipedia search"""
def __init__(self):
super().__init__(
name="wikipedia_search",
description="Search Wikipedia for encyclopedic knowledge about people, places, events, concepts, etc.",
parameters={
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "The Wikipedia search query"
}
},
"required": ["query"]
}
)
def __call__(self, query: str) -> str:
"""Search Wikipedia"""
try:
# Wikipedia API
url = "https://en.wikipedia.org/w/api.php"
params = {
"action": "query",
"list": "search",
"srsearch": query,
"format": "json",
"utf8": 1,
"srlimit": 1
}
response = requests.get(url, params=params, timeout=10)
data = response.json()
if data.get("query", {}).get("search"):
# Get the first result's page content
page_title = data["query"]["search"][0]["title"]
# Get page extract
extract_params = {
"action": "query",
"titles": page_title,
"prop": "extracts",
"exintro": True,
"explaintext": True,
"format": "json"
}
extract_response = requests.get(url, params=extract_params, timeout=10)
extract_data = extract_response.json()
pages = extract_data.get("query", {}).get("pages", {})
for page_id, page_data in pages.items():
extract = page_data.get("extract", "")
if extract:
# Return first 500 chars
return extract[:500] + ("..." if len(extract) > 500 else "")
return f"No Wikipedia results found for: {query}"
except Exception as e:
return f"Wikipedia search error: {str(e)}"
class CalculateTool(Tool):
"""Calculator for mathematical operations"""
def __init__(self):
super().__init__(
name="calculate",
description="Perform mathematical calculations. Supports basic arithmetic, percentages, and simple expressions.",
parameters={
"type": "object",
"properties": {
"expression": {
"type": "string",
"description": "The mathematical expression to evaluate (e.g., '2 + 2', '10 * 5', '100 / 4')"
}
},
"required": ["expression"]
}
)
def __call__(self, expression: str) -> str:
"""Safely evaluate mathematical expression"""
try:
# Remove any potentially dangerous characters
safe_expr = re.sub(r'[^0-9+\-*/().\s]', '', expression)
result = eval(safe_expr)
return str(result)
except Exception as e:
return f"Calculation error: {str(e)}"
def get_tools() -> List[Tool]:
"""Return list of available tools"""
return [
WebSearchTool(),
WikipediaSearchTool(),
CalculateTool()
]