diff --git a/superagi/tools/searx/searx.py b/superagi/tools/searx/searx.py index 6ba455511..61e26a94b 100644 --- a/superagi/tools/searx/searx.py +++ b/superagi/tools/searx/searx.py @@ -46,7 +46,16 @@ def _execute(self, query: str) -> tuple: Returns: Snippets from the Searx search. """ - snippets = search_results(query) + try: + snippets = search_results(query) + except HTTPError as http_err: + if http_err.response.status_code == 429: + return "Error: Searx returned 429 status code. Too many requests. Please try again later." + else: + return f"HTTP error occurred: {http_err}" + except Exception as err: + return f"An error occurred: {err}" + summary = self.summarise_result(query, snippets) return summary diff --git a/superagi/tools/searx/searx_toolkit.py b/superagi/tools/searx/searx_toolkit.py index 5ad917fe2..e80565d7f 100644 --- a/superagi/tools/searx/searx_toolkit.py +++ b/superagi/tools/searx/searx_toolkit.py @@ -4,6 +4,31 @@ from superagi.tools.base_tool import BaseToolkit, BaseTool, ToolConfiguration from superagi.tools.searx.searx import SearxSearchTool from superagi.types.key_type import ToolConfigKeyType +import time +import requests + +class SearxSearchTool: + def search(self, query): + url = "http://your-searx-instance/search" + params = { + 'q': query, + 'format': 'json' + } + max_retries = 5 + backoff_factor = 1 + + for attempt in range(max_retries): + response = requests.get(url, params=params) + if response.status_code == 200: + return response.json() + elif response.status_code == 429: + wait_time = backoff_factor * (2 ** attempt) + print(f"Received 429 status code. Retrying in {wait_time} seconds...") + time.sleep(wait_time) + else: + response.raise_for_status() + + raise Exception("Max retries exceeded with 429 status code") class SearxSearchToolkit(BaseToolkit, ABC): name: str = "Searx Toolkit"