Source code for chatterbot.logic.mathematical_evaluation
from chatterbot.logic import LogicAdapter
from chatterbot.conversation import Statement
from chatterbot import languages
from chatterbot.logic.mcp_tools import MCPToolAdapter
[docs]
class MathematicalEvaluation(LogicAdapter, MCPToolAdapter):
"""
The MathematicalEvaluation logic adapter parses input to determine
whether the user is asking a question that requires math to be done.
If so, the equation is extracted from the input and returned with
the evaluated result.
For example:
User: 'What is three plus five?'
Bot: 'Three plus five equals eight'
:kwargs:
* *language* (``object``) --
The language is set to ``chatterbot.languages.ENG`` for English by default.
"""
def __init__(self, chatbot, **kwargs):
super().__init__(chatbot, **kwargs)
self.language = kwargs.get('language', languages.ENG)
self.cache = {}
def can_process(self, statement) -> bool:
"""
Determines whether it is appropriate for this
adapter to respond to the user input.
"""
response = self.process(statement)
self.cache[statement.text] = response
return response.confidence == 1
def process(self, statement: Statement, additional_response_selection_parameters: dict = None) -> Statement:
"""
Takes a statement string.
Returns the equation from the statement with the mathematical terms solved.
"""
from mathparse import mathparse
input_text = statement.text
# Use the result cached by the process method if it exists
if input_text in self.cache:
cached_result = self.cache[input_text]
self.cache = {}
return cached_result
# Getting the mathematical terms within the input statement
expression = mathparse.extract_expression(input_text, language=self.language.ISO_639.upper())
response = Statement(text=expression)
try:
response.text = '{} = {}'.format(
response.text,
mathparse.parse(expression, language=self.language.ISO_639.upper())
)
# The confidence is 1 if the expression could be evaluated
response.confidence = 1
except mathparse.PostfixTokenEvaluationException:
response.confidence = 0
return response
def get_tool_schema(self):
"""
Return the MCP tool schema for mathematical evaluation.
"""
return {
"name": "calculate",
"description": "Evaluate mathematical expressions and solve equations. Supports basic arithmetic, algebra, and common mathematical functions.",
"parameters": {
"type": "object",
"properties": {
"expression": {
"type": "string",
"description": "The mathematical expression to evaluate (e.g., '2 + 2', 'sqrt(16)', 'three plus five')"
}
},
"required": ["expression"]
}
}
def execute_as_tool(self, **kwargs):
"""
Execute mathematical evaluation as a tool.
Args:
**kwargs: Must contain 'expression' parameter
Returns:
The evaluation result as a string
"""
from mathparse import mathparse
expression = kwargs.get("expression", "")
if not expression:
return "Error: No expression provided"
try:
# Extract mathematical expression
extracted = mathparse.extract_expression(expression, language=self.language.ISO_639.upper())
# Evaluate the expression
result = mathparse.parse(extracted, language=self.language.ISO_639.upper())
return f"{extracted} = {result}"
except mathparse.PostfixTokenEvaluationException:
return f"Error: Could not evaluate expression '{expression}'"
except Exception as e:
return f"Error: {str(e)}"