from langchain.tools import tool import ast import operator def safe_eval(expr): ops = { ast.Add: operator.add, ast.Sub: operator.sub, ast.Mult: operator.mul, ast.Div: operator.truediv, ast.Pow: operator.pow, ast.USub: operator.neg, } def _eval(node): if isinstance(node, ast.Constant): return node.n elif isinstance(node, ast.BinOp): return ops[type(node.op)](_eval(node.left), _eval(node.right)) elif isinstance(node, ast.UnaryOp): return ops[type(node.op)](_eval(node.operand)) else: raise TypeError(f"Unsupported expression: {node}") node = ast.parse(expr, mode='eval').body return _eval(node) @tool(description="Performs basic arithmetic calculations on a query string and returns the result as a string.") def calculator_tool(query: str) -> str: try: result = safe_eval(query) return str(result) except Exception as e: return f"Error evaluating expression: {e}"