From ffd5942b31b253d58f987d105192e42b419123cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Thu, 2 May 2024 02:48:21 -0300 Subject: [PATCH] pushing initial exa search tool --- .../tools/exa_tools/exa_base_tool.py | 37 +++++++++++++++++++ .../tools/exa_tools/exa_url_search_tool.py | 24 ++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/crewai_tools/tools/exa_tools/exa_base_tool.py create mode 100644 src/crewai_tools/tools/exa_tools/exa_url_search_tool.py diff --git a/src/crewai_tools/tools/exa_tools/exa_base_tool.py b/src/crewai_tools/tools/exa_tools/exa_base_tool.py new file mode 100644 index 000000000..6235ab57b --- /dev/null +++ b/src/crewai_tools/tools/exa_tools/exa_base_tool.py @@ -0,0 +1,37 @@ +import os +from typing import Type +from pydantic.v1 import BaseModel, Field +from crewai_tools.tools.base_tool import BaseTool + +class EXABaseToolToolSchema(BaseModel): + """Input for EXABaseTool.""" + search_query: str = Field(..., description="Mandatory search query you want to use to search the internet") + +class EXABaseTool(BaseTool): + name: str = "Search the internet" + description: str = "A tool that can be used to search the internet from a search_query" + args_schema: Type[BaseModel] = EXABaseToolToolSchema + search_url: str = "https://api.exa.ai/search" + n_results: int = None + headers: dict = { + "accept": "application/json", + "content-type": "application/json", + "x-api-key": os.environ['EXA_API_KEY'], + } + + def _parse_results(self, results): + stirng = [] + for result in results: + try: + stirng.append('\n'.join([ + f"Title: {result['title']}", + f"Score: {result['score']}", + f"Url: {result['url']}", + f"ID: {result['id']}", + "---" + ])) + except KeyError: + next + + content = '\n'.join(stirng) + return f"\nSearch results: {content}\n" diff --git a/src/crewai_tools/tools/exa_tools/exa_url_search_tool.py b/src/crewai_tools/tools/exa_tools/exa_url_search_tool.py new file mode 100644 index 000000000..6e5f389b7 --- /dev/null +++ b/src/crewai_tools/tools/exa_tools/exa_url_search_tool.py @@ -0,0 +1,24 @@ +import requests +from typing import Any + +from .exa_base_tool import EXABaseTool + +class EXAURLTool(EXABaseTool): + def _run( + self, + **kwargs: Any, + ) -> Any: + search_query = kwargs.get('search_query') + if search_query is None: + search_query = kwargs.get('query') + + payload = { + "query": search_query, + } + + response = requests.post(self.search_url, json=payload, headers=self.headers) + results = response.json() + if 'results' in results: + results = super()._parse_results(results['results']) + else: + return results