SkynetAgent / tools.py
cyberosa
new model and new search tools
9077c4d
from smolagents import WebSearchTool, Tool
import requests
import time
from typing import List, Dict, Any, Optional
from duckduckgo_search import DDGS
class MySearchTool(WebSearchTool):
name = "my_search_tool"
description = "It receives a question and returns a list of search results from various sources. It uses DuckDuckGo as the primary source"
inputs = {
"query": {
"type": "string",
"description": "The question or topic to search in internet.",
},
}
output_type = "string"
def __init__(self, max_results=5):
super().__init__()
self.max_results = max_results
def search_duckduckgo(self, query: str) -> list:
"""
Free search using DuckDuckGo Instant Answer API
Args:
query: Search query
max_results: Maximum number of results
Returns:
List of search results
"""
try:
# DuckDuckGo Instant Answer API (free)
url = "https://api.duckduckgo.com/"
params = {
"q": query,
"format": "json",
"no_html": "1",
"skip_disambig": "1",
}
response = requests.get(url, params=params, timeout=10)
response.raise_for_status()
data = response.json()
time.sleep(2) # 2-second delay
results = []
# Process abstract
if data.get("Abstract"):
results.append(
{
"title": data.get("Heading", "DuckDuckGo Result"),
"url": data.get("AbstractURL", ""),
"content": data.get("Abstract", ""),
"source": "DuckDuckGo",
}
)
# Process related topics
for topic in data.get("RelatedTopics", [])[
: self.max_results - len(results)
]:
if isinstance(topic, dict) and "Text" in topic:
results.append(
{
"title": topic.get("Text", "")[:100],
"url": topic.get("FirstURL", ""),
"content": topic.get("Text", ""),
"source": "DuckDuckGo",
}
)
return results[: self.max_results]
except Exception as e:
print(f"DuckDuckGo search failed: {str(e)}")
return []
class DuckDuckGoSearchTool(Tool):
name = "web_search"
description = "Performs a duckduckgo web search based on your query (think a Google search) then returns the top search results."
inputs = {
"query": {"type": "string", "description": "The search query to perform."}
}
output_type = "string"
def __init__(self, max_results=10, **kwargs):
super().__init__()
self.max_results = max_results
self.ddgs = DDGS(**kwargs)
def forward(self, query: str) -> str:
results = self.ddgs.text(query, max_results=self.max_results)
if len(results) == 0:
raise Exception("No results found! Try a less restrictive/shorter query.")
postprocessed_results = [
f"[{result['title']}]({result['href']})\n{result['body']}"
for result in results
]
return "## Search Results\n\n" + "\n\n".join(postprocessed_results)