Spaces:
Sleeping
Sleeping
| from typing import List | |
| from smolagents.tools import Tool | |
| class DuckDuckGoSearchTool(Tool): | |
| """ | |
| Performs a DuckDuckGo web search and returns formatted search results. | |
| """ | |
| name = "web_search" | |
| description = ( | |
| "Searches the web using DuckDuckGo and returns the most relevant " | |
| "search results. Use this whenever factual or current information " | |
| "is required." | |
| ) | |
| inputs = { | |
| "query": { | |
| "type": "string", | |
| "description": "Search query." | |
| } | |
| } | |
| output_type = "string" | |
| def __init__(self, max_results: int = 5): | |
| super().__init__() | |
| self.max_results = max_results | |
| try: | |
| from ddgs import DDGS | |
| self.ddgs = DDGS() | |
| except ImportError as e: | |
| raise ImportError( | |
| "Install ddgs using:\n\npip install ddgs" | |
| ) from e | |
| def forward(self, query: str) -> str: | |
| queries = [ | |
| query, | |
| query + " wikipedia", | |
| query + " official", | |
| query.replace("-", " "), | |
| ] | |
| seen = set() | |
| formatted = [] | |
| for q in queries: | |
| try: | |
| results = list( | |
| self.ddgs.text( | |
| q, | |
| max_results=3 | |
| ) | |
| ) | |
| except Exception: | |
| continue | |
| for result in results: | |
| url = result.get("href", "") | |
| if url in seen: | |
| continue | |
| seen.add(url) | |
| title = result.get("title", "No title") | |
| snippet = result.get("body", "") | |
| formatted.append( | |
| f""" | |
| Title: | |
| {title} | |
| URL: | |
| {url} | |
| Snippet: | |
| {snippet} | |
| """ | |
| ) | |
| if len(formatted) >= 5: | |
| break | |
| if not formatted: | |
| return "No useful search results were found." | |
| return "\n".join(formatted[:5]) |