"""Basic calculator operations."""
from typing import Any, Dict
from ...logger import get_logger
from ..base import tool
logger = get_logger(__name__)
@tool(
name="calculator_add",
description="Add two numbers together and return the result",
input_schema={
"type": "object",
"properties": {
"a": {"type": "number", "description": "First number"},
"b": {"type": "number", "description": "Second number"},
},
"required": ["a", "b"],
},
)
async def add(a: float, b: float) -> Dict[str, Any]:
"""
Add two numbers.
Args:
a: First number
b: Second number
Returns:
Result dictionary with calculation details
"""
logger.info(f"calculator_add called: a={a}, b={b}")
result = a + b
logger.debug(f"calculator_add result: {result}")
return {"result": result, "operation": "add", "operands": {"a": a, "b": b}}
@tool(
name="calculator_subtract",
description="Subtract second number from first number and return the result",
input_schema={
"type": "object",
"properties": {
"a": {"type": "number", "description": "First number (minuend)"},
"b": {"type": "number", "description": "Second number (subtrahend)"},
},
"required": ["a", "b"],
},
)
async def subtract(a: float, b: float) -> Dict[str, Any]:
"""
Subtract b from a.
Args:
a: First number (minuend)
b: Second number (subtrahend)
Returns:
Result dictionary with calculation details
"""
logger.info(f"calculator_subtract called: a={a}, b={b}")
result = a - b
logger.debug(f"calculator_subtract result: {result}")
return {"result": result, "operation": "subtract", "operands": {"a": a, "b": b}}
@tool(
name="calculator_multiply",
description="Multiply two numbers together and return the result",
input_schema={
"type": "object",
"properties": {
"a": {"type": "number", "description": "First number"},
"b": {"type": "number", "description": "Second number"},
},
"required": ["a", "b"],
},
)
async def multiply(a: float, b: float) -> Dict[str, Any]:
"""
Multiply two numbers.
Args:
a: First number
b: Second number
Returns:
Result dictionary with calculation details
"""
logger.info(f"calculator_multiply called: a={a}, b={b}")
result = a * b
logger.debug(f"calculator_multiply result: {result}")
return {"result": result, "operation": "multiply", "operands": {"a": a, "b": b}}
@tool(
name="calculator_divide",
description="Divide first number by second number and return the result",
input_schema={
"type": "object",
"properties": {
"a": {"type": "number", "description": "Dividend (number to be divided)"},
"b": {"type": "number", "description": "Divisor (number to divide by)"},
},
"required": ["a", "b"],
},
)
async def divide(a: float, b: float) -> Dict[str, Any]:
"""
Divide a by b.
Args:
a: Dividend
b: Divisor
Returns:
Result dictionary with calculation details
Raises:
ValueError: If b is zero
"""
logger.info(f"calculator_divide called: a={a}, b={b}")
if b == 0:
logger.error("Division by zero attempted")
raise ValueError("Cannot divide by zero")
result = a / b
logger.debug(f"calculator_divide result: {result}")
return {"result": result, "operation": "divide", "operands": {"a": a, "b": b}}