import cmath import json from langchain_community.document_loaders import ArxivLoader from langchain_community.document_loaders import WebBaseLoader from langchain_community.tools import tool from langchain_community.tools.tavily_search import TavilySearchResults from langchain_community.document_loaders import WikipediaLoader @tool def wiki_search(query: str) -> str: """Search Wikipedia for a query and return maximum 2 page links. 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 # ] # ) formatted_search_docs = [ {"source": doc.metadata.get("source", ""), "page": doc.metadata.get("page", "")} for doc in search_docs ] return {"wiki_page_links": json.dumps(formatted_search_docs)} @tool def web_search(query: str) -> str: """Search Tavily for a query and return maximum 3 page links. Args: query: The search query.""" search_docs = TavilySearchResults( max_results=3, tavily_api_key="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", ).invoke(query) # formatted_search_docs = "\n\n---\n\n".join( # [ # f'\n{doc.get("content", "")}\n' # for doc in search_docs # ] # ) formatted_search_docs = [ {"source": doc.get("url", ""), "page": doc.get("title", "")} for doc in search_docs ] return {"web_page_links": json.dumps(formatted_search_docs)} @tool def visit_webpage(url: str) -> str: """Retrieve content from a webpage using page links. A good option when you need detailed information from a specific webpage. Args: url: The URL to retrieve content from.""" search_docs = WebBaseLoader(url).load() formatted_search_docs = "\n\n---\n\n".join( [ f'\n{doc.page_content}\n' for doc in search_docs ] ) return {"web_page_content": formatted_search_docs} @tool def arxiv_search(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 {"arxiv_results": formatted_search_docs} @tool def translate_to_english(text: str) -> str: """Translate the given text to English. Args: text: The text to translate to English.""" from langchain_ollama import ChatOllama llm = ChatOllama( model="tinyllama:1.1b", api_base="http://localhost:11434", ) prompt = f"Translate the following text to English:\n\n{text}" response = llm.invoke( [ {"role": "system", "content": "You are a helpful assistant that translates text to English."}, {"role": "user", "content": prompt}, ] ) return {"translated_text": response.content} @tool def multiply(a: float, b: float) -> float: """ Multiplies two numbers. Args: a (float): the first number b (float): the second number """ return a * b @tool def add(a: float, b: float) -> float: """ Adds two numbers. Args: a (float): the first number b (float): the second number """ return a + b @tool def subtract(a: float, b: float) -> int: """ Subtracts two numbers. Args: a (float): the first number b (float): the second number """ return a - b @tool def divide(a: float, b: float) -> float: """ Divides two numbers. Args: a (float): the first float number b (float): the second float number """ if b == 0: raise ValueError("Cannot divided by zero.") return a / b @tool def modulus(a: int, b: int) -> int: """ Get the modulus of two numbers. Args: a (int): the first number b (int): the second number """ return a % b @tool def power(a: float, b: float) -> float: """ Get the power of two numbers. Args: a (float): the first number b (float): the second number """ return a**b @tool def square_root(a: float) -> float | complex: """ Get the square root of a number. Args: a (float): the number to get the square root of """ if a >= 0: return a**0.5 return cmath.sqrt(a)