# tools/calculator.py import ast, operator as op from smolagents import tool _ops = { ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul, ast.Div: op.truediv, ast.Pow: op.pow, ast.Mod: op.mod, ast.USub: op.neg } def _safe_eval(node): if isinstance(node, ast.Expression): return _safe_eval(node.body) if isinstance(node, ast.Constant): return node.value if isinstance(node, ast.BinOp): return _ops[type(node.op)](_safe_eval(node.left), _safe_eval(node.right)) if isinstance(node, ast.UnaryOp): return _ops[type(node.op)](_safe_eval(node.operand)) raise ValueError("Unsupported expression") @tool def calculator(expression: str) -> str: """Evaluate a simple arithmetic expression safely. Args: expression: The math expression to evaluate. """ tree = ast.parse(expression, mode="eval") return str(_safe_eval(tree))