From adf2651d1fee2f6f365a8c313a07207e76bc8eae Mon Sep 17 00:00:00 2001 From: Yash_1124 <82636823+Yash-1511@users.noreply.github.com> Date: Wed, 21 Feb 2024 08:12:34 +0530 Subject: [PATCH] FEAT: Add DuckDuckGo Search Tool for Enhanced Privacy-Focused Search Functionality (#2499) --- .../builtin/duckduckgo/_assets/icon.svg | 1 + .../provider/builtin/duckduckgo/duckduckgo.py | 20 ++++++++++ .../builtin/duckduckgo/duckduckgo.yaml | 10 +++++ .../duckduckgo/tools/duckduckgo_search.py | 40 +++++++++++++++++++ .../duckduckgo/tools/duckduckgo_search.yaml | 23 +++++++++++ api/requirements.txt | 3 +- 6 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 api/core/tools/provider/builtin/duckduckgo/_assets/icon.svg create mode 100644 api/core/tools/provider/builtin/duckduckgo/duckduckgo.py create mode 100644 api/core/tools/provider/builtin/duckduckgo/duckduckgo.yaml create mode 100644 api/core/tools/provider/builtin/duckduckgo/tools/duckduckgo_search.py create mode 100644 api/core/tools/provider/builtin/duckduckgo/tools/duckduckgo_search.yaml diff --git a/api/core/tools/provider/builtin/duckduckgo/_assets/icon.svg b/api/core/tools/provider/builtin/duckduckgo/_assets/icon.svg new file mode 100644 index 0000000000..a816a6b49e --- /dev/null +++ b/api/core/tools/provider/builtin/duckduckgo/_assets/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/core/tools/provider/builtin/duckduckgo/duckduckgo.py b/api/core/tools/provider/builtin/duckduckgo/duckduckgo.py new file mode 100644 index 0000000000..3e9b57ece7 --- /dev/null +++ b/api/core/tools/provider/builtin/duckduckgo/duckduckgo.py @@ -0,0 +1,20 @@ +from core.tools.errors import ToolProviderCredentialValidationError +from core.tools.provider.builtin.duckduckgo.tools.duckduckgo_search import DuckDuckGoSearchTool +from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController + + +class DuckDuckGoProvider(BuiltinToolProviderController): + def _validate_credentials(self, credentials: dict) -> None: + try: + DuckDuckGoSearchTool().fork_tool_runtime( + meta={ + "credentials": credentials, + } + ).invoke( + user_id='', + tool_parameters={ + "query": "John Doe", + }, + ) + except Exception as e: + raise ToolProviderCredentialValidationError(str(e)) \ No newline at end of file diff --git a/api/core/tools/provider/builtin/duckduckgo/duckduckgo.yaml b/api/core/tools/provider/builtin/duckduckgo/duckduckgo.yaml new file mode 100644 index 0000000000..8778dde625 --- /dev/null +++ b/api/core/tools/provider/builtin/duckduckgo/duckduckgo.yaml @@ -0,0 +1,10 @@ +identity: + author: Yash Parmar + name: duckduckgo + label: + en_US: DuckDuckGo + zh_Hans: DuckDuckGo + description: + en_US: A privacy-focused search engine. + zh_Hans: 一个注重隐私的搜索引擎。 + icon: icon.svg diff --git a/api/core/tools/provider/builtin/duckduckgo/tools/duckduckgo_search.py b/api/core/tools/provider/builtin/duckduckgo/tools/duckduckgo_search.py new file mode 100644 index 0000000000..6046a18930 --- /dev/null +++ b/api/core/tools/provider/builtin/duckduckgo/tools/duckduckgo_search.py @@ -0,0 +1,40 @@ +from typing import Any + +from langchain.tools import DuckDuckGoSearchRun +from pydantic import BaseModel, Field + +from core.tools.entities.tool_entities import ToolInvokeMessage +from core.tools.tool.builtin_tool import BuiltinTool + + +class DuckDuckGoInput(BaseModel): + query: str = Field(..., description="Search query.") + + +class DuckDuckGoSearchTool(BuiltinTool): + """ + Tool for performing a search using DuckDuckGo search engine. + """ + + def _invoke(self, user_id: str, tool_parameters: dict[str, Any]) -> ToolInvokeMessage | list[ToolInvokeMessage]: + """ + Invoke the DuckDuckGo search tool. + + Args: + user_id (str): The ID of the user invoking the tool. + tool_parameters (dict[str, Any]): The parameters for the tool invocation. + + Returns: + ToolInvokeMessage | list[ToolInvokeMessage]: The result of the tool invocation. + """ + query = tool_parameters.get('query', '') + + if not query: + return self.create_text_message('Please input query') + + tool = DuckDuckGoSearchRun(args_schema=DuckDuckGoInput) + + result = tool.run(query) + + return self.create_text_message(self.summary(user_id=user_id, content=result)) + \ No newline at end of file diff --git a/api/core/tools/provider/builtin/duckduckgo/tools/duckduckgo_search.yaml b/api/core/tools/provider/builtin/duckduckgo/tools/duckduckgo_search.yaml new file mode 100644 index 0000000000..93c857010c --- /dev/null +++ b/api/core/tools/provider/builtin/duckduckgo/tools/duckduckgo_search.yaml @@ -0,0 +1,23 @@ +identity: + name: duckduckgo_search + author: Yash Parmar + label: + en_US: DuckDuckGo Search + zh_Hans: DuckDuckGo 搜索 +description: + human: + en_US: Perform searches on DuckDuckGo and get results. + zh_Hans: 在 DuckDuckGo 上进行搜索并获取结果。 + llm: Perform searches on DuckDuckGo and get results. +parameters: + - name: query + type: string + required: true + label: + en_US: Query string + zh_Hans: 查询语句 + human_description: + en_US: The search query. + zh_Hans: 搜索查询语句。 + llm_description: Key words for searching + form: llm diff --git a/api/requirements.txt b/api/requirements.txt index af29654248..5881c99903 100644 --- a/api/requirements.txt +++ b/api/requirements.txt @@ -65,4 +65,5 @@ matplotlib~=3.8.2 yfinance~=0.2.35 pydub~=0.25.1 gmpy2~=2.1.5 -numexpr~=2.9.0 \ No newline at end of file +numexpr~=2.9.0 +duckduckgo-search==4.4.3 \ No newline at end of file