from langchain.tools import tool #mathematical operations import cmath @tool(description="Multiplies two numbers.") def multiply(a: float, b: float) -> float: return a * b @tool(description="Adds two numbers.") def add(a: float, b: float) -> float: return a + b @tool(description="Subtracts two numbers.") def subtract(a: float, b: float) -> int: return a - b @tool(description="Divides two numbers.") def divide(a: float, b: float) -> float: if b == 0: raise ValueError("Cannot divided by zero.") return a / b @tool(description="Get the modulus of two numbers.") def modulus(a: int, b: int) -> int: return a % b @tool(description="Get the power of two numbers.") def power(a: float, b: float) -> float: return a**b @tool(description="Get the square root of a number.") def square_root(a: float) -> float | complex: if a >= 0: return a**0.5 return cmath.sqrt(a) from langchain_community.document_loaders import WikipediaLoader @tool(description="Search Wikipedia for a query and return up to 2 results.") def wiki_search(query: str) -> dict: print(f"Searching Wikipedia for: {query}") try: # Load up to 2 documents from Wikipedia search_docs = WikipediaLoader(query=query, load_max_docs=2).load() # Format the output for each document formatted_search_docs = "\n\n---\n\n".join( [ f'\n{doc.page_content}\n' for doc in search_docs ] ) print(f"Here are the outputs:\n{formatted_search_docs}") return {"wiki_results": formatted_search_docs} except Exception as e: print(f"Error occurred: {e}") return {"wiki_results": f"None found for {query}, use the results from the other tools or similar questions obtained earlier."} from langchain_community.document_loaders import ArxivLoader @tool(description="Search Arxiv for a query and return maximum 3 result.") def arvix_search(query: str) -> str: search_docs = ArxivLoader(query=query, load_max_docs=3).load() formatted_search_docs = "\n\n---\n\n".join( [ f'{doc.page_content[:1000]}' for doc in search_docs ]) return {"arvix_results": formatted_search_docs} from langchain_community.tools.tavily_search import TavilySearchResults @tool(description="Search Tavily for a query and return maximum 3 results.") def web_search(query: str) -> str: search_docs = TavilySearchResults(max_results=3).invoke(query=query) formatted_search_docs = "\n\n---\n\n".join( [ f'{doc.page_content}' for doc in search_docs ]) return {"web_results": formatted_search_docs} from upload_metadata_n_setup_retrivers import retriever def vector_search(query:str) -> str: search_docs = retriever.invoke(input=query) formatted_search_docs = "\n\n---\n\n".join( [ f'{doc.page_content}' for doc in search_docs ]) return formatted_search_docs