| 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"]
|
| }
|
| }
|
| }
|
| ]
|
|
|