File size: 1,971 Bytes
1e1685f
8fe992b
1e1685f
8fe992b
 
1e1685f
 
 
 
8fe992b
1e1685f
 
 
 
 
 
 
 
 
 
 
 
 
 
8fe992b
 
1e1685f
 
8fe992b
1e1685f
8fe992b
1e1685f
8fe992b
1e1685f
 
 
 
 
8fe992b
1e1685f
8fe992b
1e1685f
8fe992b
 
 
1e1685f
a8fc2f1
ebb36cd
 
 
 
 
 
a8fc2f1
 
ebb36cd
a8fc2f1
ebb36cd
a8fc2f1
1e1685f
a8fc2f1
 
ebb36cd
 
1e1685f
 
 
a8fc2f1
 
1e1685f
a8fc2f1
1e1685f
a8fc2f1
1e1685f
a8fc2f1
 
1e1685f
a8fc2f1
1e1685f
a8fc2f1
 
1e1685f
a8fc2f1
1e1685f
 
 
 
 
 
 
 
 
 
 
 
a8fc2f1
 
ebb36cd
a8fc2f1
 
ebb36cd
a8fc2f1
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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])