| from math import sqrt | |
| import logging | |
| from llama_index.core.tools import FunctionTool | |
| def add(a: float, b: float, context: str) -> str: | |
| """Add two numbers. | |
| Args: | |
| a (float): Addend 1 | |
| b (float): Addend 2 | |
| context (str): Context for the addition, this should be used to keep track of the operations. | |
| Returns: | |
| str: The result with the context included. | |
| """ | |
| return f"Result {str(a + b)} for {context}" | |
| def sub(a: float, b: float, context: str) -> str: | |
| """Subtract two numbers. | |
| Args: | |
| a (float): Minuend | |
| b (float): Subtrahend | |
| context (str): Context for the subtraction, this should be used to keep track of the operations. | |
| Returns: | |
| str: The result with the context included. | |
| """ | |
| return f"Result {str(a - b)} for {context}" | |
| def multiply(a: float, b: float, context: str) -> str: | |
| """Multiply two numbers. | |
| Args: | |
| a (float): Multiplicand | |
| b (float): Multiplier | |
| context (str): Context for the multiplication, this should be used to keep track of the operations. | |
| Returns: | |
| str: The result with the context included. | |
| """ | |
| return f"Result {str(a * b)} for {context}" | |
| def divide(a: float, b: float, context: str) -> str: | |
| """Divide two numbers. | |
| Args: | |
| a (float): Dividend | |
| b (float): Divisor | |
| context (str): Context for the division, this should be used to keep track of the operations. | |
| Returns: | |
| str: The result with the context included, or an error message if division by zero occurs. | |
| """ | |
| if b == 0: | |
| return f"Error: Division by zero for {context}" | |
| return f"Result {str(a / b)} for {context}" | |
| def floordiv(a: float, b: float, context: str) -> str: | |
| """Floor divide two numbers. | |
| Args: | |
| a (float): Dividend | |
| b (float): Divisor | |
| context (str): Context for the floor division, this should be used to keep track of the operations. | |
| Returns: | |
| str: The result with the context included, or an error message if division by zero occurs. | |
| """ | |
| if b == 0: | |
| return f"Error: Division by zero for {context}" | |
| return f"Result {str(a // b)} for {context}" | |
| def mod(a: float, b: float, context: str) -> str: | |
| """Get the modulus of two numbers. | |
| Args: | |
| a (float): Dividend | |
| b (float): Divisor | |
| context (str): Context for the modulus operation, this should be used to keep track of the operations. | |
| Returns: | |
| str: The result with the context included. | |
| """ | |
| return f"Result {str(a % b)} for {context}" | |
| def sqrt(a: float, context: str) -> str: | |
| """Get the square root of a number. | |
| Args: | |
| a (float): Number to find the square root of | |
| context (str): Context for the square root operation, this should be used to keep track of the operations. | |
| Returns: | |
| str: The result with the context included. | |
| """ | |
| return f"Result {str(a**0.5)} for {context}" | |
| def equals(a: float, b: float, context: str) -> str: | |
| """Check if two numbers are equal. | |
| Args: | |
| a (float): First number | |
| b (float): Second number | |
| context (str): Context for the equality check, this should be used to keep track of the operations. | |
| Returns: | |
| str: The result with the context included. | |
| """ | |
| return f"Result {str(a == b)} for {context}" | |
| def less_than(a: float, b: float, context: str) -> str: | |
| """Check if the first number is less than the second number. | |
| Args: | |
| a (float): First number | |
| b (float): Second number | |
| context (str): Context for the less than check, this should be used to keep track of the operations. | |
| Returns: | |
| str: The result with the context included. | |
| """ | |
| return f"Result {str(a < b)} for {context}" | |
| def more_than(a: float, b: float, context: str) -> str: | |
| """Check if the first number is more than the second number. | |
| Args: | |
| a (float): First number | |
| b (float): Second number | |
| context (str): Context for the more than check, this should be used to keep track of the operations. | |
| Returns: | |
| str: The result with the context included. | |
| """ | |
| return f"Result {str(a > b)} for {context}" | |
| def solve_math_problem(problem: str) -> str: | |
| """ | |
| Solve mathematical problems using GPT-4. | |
| Args: | |
| problem: The mathematical problem to solve | |
| Returns: | |
| str: Solution | |
| """ | |
| try: | |
| from openai import OpenAI | |
| client = OpenAI() | |
| response = client.chat.completions.create( | |
| model="gpt-4o", | |
| messages=[ | |
| { | |
| "role": "system", | |
| "content": "You are a mathematics expert. Solve problems step by step with clear explanations." | |
| }, | |
| { | |
| "role": "user", | |
| "content": f"Please solve this mathematical problem step by step:\n\n{problem}" | |
| } | |
| ] | |
| ) | |
| return response.choices[0].message.content | |
| except Exception as e: | |
| return f"Math problem solving failed: {str(e)}" | |
| def get_math_tools(): | |
| """ | |
| Get the math tools. | |
| """ | |
| return [ | |
| FunctionTool.from_defaults(fn=sum), | |
| FunctionTool.from_defaults(fn=sub), | |
| FunctionTool.from_defaults(fn=add), | |
| FunctionTool.from_defaults(fn=sqrt), | |
| FunctionTool.from_defaults(fn=floordiv), | |
| FunctionTool.from_defaults(fn=mod), | |
| FunctionTool.from_defaults(fn=multiply), | |
| FunctionTool.from_defaults(fn=equals), | |
| FunctionTool.from_defaults(fn=less_than), | |
| FunctionTool.from_defaults(fn=more_than), | |
| ] | |