|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import logging |
|
from abc import ABC |
|
from duckduckgo_search import DDGS |
|
import pandas as pd |
|
from agent.component.base import ComponentBase, ComponentParamBase |
|
|
|
|
|
class DuckDuckGoParam(ComponentParamBase): |
|
""" |
|
Define the DuckDuckGo component parameters. |
|
""" |
|
|
|
def __init__(self): |
|
super().__init__() |
|
self.top_n = 10 |
|
self.channel = "text" |
|
|
|
def check(self): |
|
self.check_positive_integer(self.top_n, "Top N") |
|
self.check_valid_value(self.channel, "Web Search or News", ["text", "news"]) |
|
|
|
|
|
class DuckDuckGo(ComponentBase, ABC): |
|
component_name = "DuckDuckGo" |
|
|
|
def _run(self, history, **kwargs): |
|
ans = self.get_input() |
|
ans = " - ".join(ans["content"]) if "content" in ans else "" |
|
if not ans: |
|
return DuckDuckGo.be_output("") |
|
|
|
try: |
|
if self._param.channel == "text": |
|
with DDGS() as ddgs: |
|
|
|
duck_res = [{"content": '<a href="' + i["href"] + '">' + i["title"] + '</a> ' + i["body"]} for i |
|
in ddgs.text(ans, max_results=self._param.top_n)] |
|
elif self._param.channel == "news": |
|
with DDGS() as ddgs: |
|
|
|
duck_res = [{"content": '<a href="' + i["url"] + '">' + i["title"] + '</a> ' + i["body"]} for i |
|
in ddgs.news(ans, max_results=self._param.top_n)] |
|
except Exception as e: |
|
return DuckDuckGo.be_output("**ERROR**: " + str(e)) |
|
|
|
if not duck_res: |
|
return DuckDuckGo.be_output("") |
|
|
|
df = pd.DataFrame(duck_res) |
|
logging.debug("df: {df}") |
|
return df |
|
|