diff options
Diffstat (limited to 'autogpts/forge/forge/actions/web/web_search.py')
-rw-r--r-- | autogpts/forge/forge/actions/web/web_search.py | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/autogpts/forge/forge/actions/web/web_search.py b/autogpts/forge/forge/actions/web/web_search.py new file mode 100644 index 000000000..2bcc0a32d --- /dev/null +++ b/autogpts/forge/forge/actions/web/web_search.py @@ -0,0 +1,74 @@ +from __future__ import annotations + +import json +import time +from itertools import islice + +from duckduckgo_search import DDGS + +from ..registry import action + +DUCKDUCKGO_MAX_ATTEMPTS = 3 + + +@action( + name="web_search", + description="Searches the web", + parameters=[ + { + "name": "query", + "description": "The search query", + "type": "string", + "required": True, + } + ], + output_type="list[str]", +) +async def web_search(agent, task_id: str, query: str) -> str: + """Return the results of a Google search + + Args: + query (str): The search query. + num_results (int): The number of results to return. + + Returns: + str: The results of the search. + """ + search_results = [] + attempts = 0 + num_results = 8 + + while attempts < DUCKDUCKGO_MAX_ATTEMPTS: + if not query: + return json.dumps(search_results) + + results = DDGS().text(query) + search_results = list(islice(results, num_results)) + + if search_results: + break + + time.sleep(1) + attempts += 1 + + results = json.dumps(search_results, ensure_ascii=False, indent=4) + return safe_google_results(results) + + +def safe_google_results(results: str | list) -> str: + """ + Return the results of a Google search in a safe format. + + Args: + results (str | list): The search results. + + Returns: + str: The results of the search. + """ + if isinstance(results, list): + safe_message = json.dumps( + [result.encode("utf-8", "ignore").decode("utf-8") for result in results] + ) + else: + safe_message = results.encode("utf-8", "ignore").decode("utf-8") + return safe_message |