from langchain_core.tools import tool from metaphor_python import Metaphor from langflow.custom import Component from langflow.field_typing import Tool from langflow.io import BoolInput, IntInput, Output, SecretStrInput class ExaSearchToolkit(Component): display_name = "Exa Search" description = "Exa Search toolkit for search and content retrieval" documentation = "https://python.langchain.com/docs/integrations/tools/metaphor_search" beta = True name = "ExaSearch" icon = "ExaSearch" inputs = [ SecretStrInput( name="metaphor_api_key", display_name="Exa Search API Key", password=True, ), BoolInput( name="use_autoprompt", display_name="Use Autoprompt", value=True, ), IntInput( name="search_num_results", display_name="Search Number of Results", value=5, ), IntInput( name="similar_num_results", display_name="Similar Number of Results", value=5, ), ] outputs = [ Output(name="tools", display_name="Tools", method="build_toolkit"), ] def build_toolkit(self) -> Tool: client = Metaphor(api_key=self.metaphor_api_key) @tool def search(query: str): """Call search engine with a query.""" return client.search(query, use_autoprompt=self.use_autoprompt, num_results=self.search_num_results) @tool def get_contents(ids: list[str]): """Get contents of a webpage. The ids passed in should be a list of ids as fetched from `search`. """ return client.get_contents(ids) @tool def find_similar(url: str): """Get search results similar to a given URL. The url passed in should be a URL returned from `search` """ return client.find_similar(url, num_results=self.similar_num_results) return [search, get_contents, find_similar]