from langchain_community.tools import DuckDuckGoSearchRun from langchain_community.document_loaders import ( WikipediaLoader, ArxivLoader, ImageCaptionLoader, ) from langchain_core.tools import tool from typing import List import math # Web_search Tool search_tool = DuckDuckGoSearchRun() # Calulator Tool @tool( "calculator", description="Performs arithmetic calculations. Use this for any math problems.", ) def calc(expression: str) -> str: """Evaluate mathematical expressions. Args: expression: expression to evaluate """ try: cleaned = expression.replace("^", "**").replace(",", "") safe_ns = {k: getattr(math, k) for k in dir(math) if not k.startswith("_")} safe_ns["__builtins__"] = {} result = eval(cleaned, safe_ns) return str(result) except Exception as e: return f"Calculation error: {e}" @tool def wiki_search(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 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 run_python_code(code_str: str) -> str: """Executes the provided Python code string and returns the result.""" try: exec_globals = {} exec(code_str, exec_globals) return str(exec_globals.get("result", "Execution successful")) except Exception as e: return f"Error: {str(e)}" @tool def get_image_captioning(list_image_urls: List[str]) -> str: """ generate captions for images Args: list_image_urls: list of image urls to process """ try: loader = ImageCaptionLoader(images=list_image_urls) list_docs = loader.load() result = "Captions for given images: \n" for doc in list_docs: result += f"Image: {doc.metadata.__str__()}, Caption:{doc.page_content}" return result except Exception as e: return f"Image captioning failied: {str(e)}"