from langchain_core.tools import tool from langchain_community.utilities.duckduckgo_search import DuckDuckGoSearchAPIWrapper from langchain_community.document_loaders.wikipedia import WikipediaLoader from langchain_community.document_loaders.arxiv import ArxivLoader from langchain_community.document_loaders.pubmed import PubMedLoader ## Simple algebra tools @tool def add(a: float, b: float) -> float: """Add two numbers. Args: a: first float b: second float """ return a + b @tool def substract(a: float, b: float) -> float: """Substract two numbers. Args: a: first float b: second float """ return a - b @tool def multiply(a: float, b: float) -> float: """Multiply two numbers. Args: a: first float b: second float """ return a * b @tool def divide(a: float, b: float) -> float: """Divide two numbers. Args: a: first float b: second float """ if b == 0: raise ValueError("Cannot divide any number by zero.") return a / b # Maybe add algebra tools??? ## Search Tools def DuckDuckGoSearchTool(query: str) -> str: """Search DuckDuckGo for a query and return maximum 3 results. Args: query: The search query. """ results = DuckDuckGoSearchAPIWrapper().results(query = query, max_results=3) formatted_search_docs = "\n\n---\n\n".join( [ f'\n{res["snippet"]}\n' for res in results ]) return {"web_results": formatted_search_docs} @tool def WikipediaSearchTool(query: str) -> str: """Search Wikipedia for a query and return maximum 2 results. Args: query: The search query.""" search_docs = WikipediaLoader(query=query, load_max_docs=2).load() formatted_search_docs = "\n\n---\n\n".join( [ f'\n{doc.page_content}\n' for doc in search_docs ]) return {"wiki_results": formatted_search_docs} @tool def ArxivSearchTool(query: str) -> str: """Search Arxiv for a query and return maximum 3 result. Args: query: The search query.""" search_docs = ArxivLoader(query=query, load_max_docs=3).load() formatted_search_docs = "\n\n---\n\n".join( [ f'\n{doc.page_content[:1000]}\n' for doc in search_docs ]) return {"arvix_results": formatted_search_docs} @tool def PubmedSearchTool(query: str) -> str: """Search Arxiv for a query and return maximum 3 result. Args: query: The search query.""" search_docs = PubMedLoader(query=query, load_max_docs=3).load() formatted_search_docs = "\n\n---\n\n".join( [ f'\n{doc.page_content[:1000]}\n' for doc in search_docs ]) return {"pubmed_results": formatted_search_docs}