|
import requests
|
|
import json
|
|
from bs4 import BeautifulSoup
|
|
|
|
|
|
def duckduckgo_search(query: str, count: int = 3) -> list:
|
|
"""
|
|
Perform a search using DuckDuckGo and return the results.
|
|
|
|
Args:
|
|
query: The search query string
|
|
count: Maximum number of results to return (default: 3)
|
|
|
|
Returns:
|
|
List of search results
|
|
"""
|
|
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}&kl=wt-wt"
|
|
|
|
|
|
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(snippet)
|
|
|
|
if len(results) >= count:
|
|
break
|
|
|
|
print(f"DuckDuckGo results: {results}")
|
|
return results
|
|
except Exception as e:
|
|
print(f"Error during DuckDuckGo search: {e}")
|
|
return []
|
|
|
|
|
|
def langsearch_search(query: str, count: int = 5) -> list:
|
|
"""
|
|
Perform a search using LangSearch API and return the results.
|
|
|
|
Args:
|
|
query: The search query string
|
|
count: Maximum number of results to return (default: 5)
|
|
api_key: LangSearch API key (default: None, will look for env variable)
|
|
|
|
Returns:
|
|
List of search results
|
|
"""
|
|
print(f"Performing LangSearch search for: {query}")
|
|
|
|
try:
|
|
import os
|
|
|
|
api_key = os.environ.get("LS_TOKEN")
|
|
|
|
if not api_key:
|
|
print("Warning: No LangSearch API key provided. Set LS_TOKEN environment variable.")
|
|
return []
|
|
|
|
headers = {
|
|
"Content-Type": "application/json",
|
|
"Authorization": f"Bearer {api_key}"
|
|
}
|
|
|
|
payload = json.dumps({
|
|
"query": query,
|
|
"freshness": "noLimit",
|
|
"summary": True,
|
|
"count": count
|
|
})
|
|
|
|
url = "https://api.langsearch.com/v1/web-search"
|
|
|
|
response = requests.post(url, headers=headers, data=payload, timeout=30)
|
|
response.raise_for_status()
|
|
if response.status_code != 200:
|
|
print(f"LangSearch API error: {response.text}")
|
|
return []
|
|
response = response.json()
|
|
results = []
|
|
for result in response["data"]["webPages"]["value"]:
|
|
results.append(result["summary"])
|
|
|
|
return results
|
|
except Exception as e:
|
|
print(f"Error during LangSearch search: {e}")
|
|
return []
|
|
|
|
|
|
|
|
TOOLS_MAPPING = {
|
|
"duckduckgo_search": duckduckgo_search,
|
|
"langsearch_search": langsearch_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"]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"type": "function",
|
|
"function": {
|
|
"name": "langsearch_search",
|
|
"description": "Search the web using LangSearch API for more relevant results with deeper context",
|
|
"parameters": {
|
|
"type": "object",
|
|
"properties": {
|
|
"query": {
|
|
"type": "string",
|
|
"description": "The search query string"
|
|
},
|
|
"top_k": {
|
|
"type": "integer",
|
|
"description": "Maximum number of results to return",
|
|
"default": 5
|
|
},
|
|
"api_key": {
|
|
"type": "string",
|
|
"description": "LangSearch API key (optional, will use LANGSEARCH_API_KEY env var if not provided)"
|
|
}
|
|
},
|
|
"required": ["query"]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
|