|
import requests
|
|
from bs4 import BeautifulSoup
|
|
|
|
def duckduckgo_search(query: str, num_results: int = 3) -> list:
|
|
"""
|
|
Perform a search using DuckDuckGo and return the results.
|
|
|
|
Args:
|
|
query: The search query string
|
|
num_results: Maximum number of results to return (default: 3)
|
|
|
|
Returns:
|
|
List of dictionaries containing search results with title, url, and snippet
|
|
"""
|
|
print(f"Performing DuckDuckGo search for: {query}")
|
|
|
|
try:
|
|
headers = {
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
|
|
}
|
|
|
|
|
|
formatted_query = query.replace(' ', '+')
|
|
url = f"https://html.duckduckgo.com/html/?q={formatted_query}"
|
|
|
|
|
|
response = requests.get(url, headers=headers, timeout=10)
|
|
response.raise_for_status()
|
|
|
|
|
|
soup = BeautifulSoup(response.text, 'html.parser')
|
|
|
|
|
|
results = []
|
|
for result in soup.select('.result'):
|
|
title_elem = result.select_one('.result__title')
|
|
link_elem = result.select_one('.result__url')
|
|
snippet_elem = result.select_one('.result__snippet')
|
|
|
|
if title_elem and link_elem:
|
|
title = title_elem.get_text(strip=True)
|
|
url = link_elem.get('href') if link_elem.get('href') else link_elem.get_text(strip=True)
|
|
snippet = snippet_elem.get_text(strip=True) if snippet_elem else ""
|
|
|
|
results.append({
|
|
"title": title,
|
|
"url": url,
|
|
"snippet": snippet
|
|
})
|
|
|
|
if len(results) >= num_results:
|
|
break
|
|
|
|
print(f"Found {len(results)} results for query: {query}")
|
|
return results
|
|
except Exception as e:
|
|
print(f"Error during DuckDuckGo search: {e}")
|
|
return []
|
|
|
|
|
|
TOOLS_MAPPING = {
|
|
"duckduckgo_search": duckduckgo_search
|
|
}
|
|
|
|
|
|
TOOLS_DEFINITION = [
|
|
{
|
|
"type": "function",
|
|
"function": {
|
|
"name": "duckduckgo_search",
|
|
"description": "Search the web using DuckDuckGo and return relevant results",
|
|
"parameters": {
|
|
"type": "object",
|
|
"properties": {
|
|
"query": {
|
|
"type": "string",
|
|
"description": "The search query string"
|
|
},
|
|
"num_results": {
|
|
"type": "integer",
|
|
"description": "Maximum number of results to return",
|
|
"default": 5
|
|
}
|
|
},
|
|
"required": ["query"]
|
|
}
|
|
}
|
|
}
|
|
] |