File size: 1,699 Bytes
adf4599
8fe992b
2b5d52f
8fe992b
adf4599
8fe992b
 
adf4599
 
 
2b5d52f
adf4599
8fe992b
2b5d52f
8fe992b
 
 
 
adf4599
5feb0eb
 
 
adf4599
5feb0eb
 
 
 
 
 
 
2b5d52f
5feb0eb
adf4599
5feb0eb
 
adf4599
 
185a3f4
 
 
adf4599
185a3f4
 
 
adf4599
185a3f4
 
 
adf4599
5feb0eb
54c64a8
2b5d52f
adf4599
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
from typing import Any
from smolagents.tools import Tool
from ddgs import DDGS


class DuckDuckGoSearchTool(Tool):
    name = "web_search"
    description = "Performs a DuckDuckGo web search based on your query and returns the top results."
    inputs: dict[str, dict[str, Any]] = {
        "query": {"type": "string", "description": "The search query to perform."}
    }
    output_type = "string"  # you can switch to "json" if your smolagents version supports it

    def __init__(self, max_results: int = 10, **kwargs: Any) -> None:
        super().__init__()
        self.max_results = max_results
        self.ddgs = DDGS(**kwargs)

    def forward(self, query: str) -> list[dict[str, str]]:
        q = (query or "").strip()
        if not q:
            raise ValueError("Query must be a non-empty string.")

        items = list(
            self.ddgs.text(
                keywords=q,
                region="wt-wt",
                safesearch="moderate",
                timelimit=None,
                max_results=self.max_results,
            )
        )

        if not items:
            raise RuntimeError("No results found. Try a broader/simpler query.")

        results: list[dict[str, str]] = []
        for it in items:
            href = (it.get("href") or "").strip()
            if not href:
                continue
            results.append(
                {
                    "title": str(it.get("title", "")),
                    "url": href,
                    "snippet": str(it.get("body", "")),
                }
            )

        if not results:
            raise RuntimeError("Results were returned but none contained valid URLs.")

        return results