From d4cfd3e7ac9375eeac42ad6eeb64f4b3b235cd64 Mon Sep 17 00:00:00 2001 From: Bowen Liang Date: Mon, 5 Feb 2024 18:40:35 +0800 Subject: [PATCH] add built-in maths tool for local expression evaluation on NumExpr (#2390) --- api/core/tools/provider/_position.yaml | 1 + .../provider/builtin/maths/_assets/icon.svg | 10 +++++++ .../tools/provider/builtin/maths/maths.py | 18 ++++++++++++ .../tools/provider/builtin/maths/maths.yaml | 12 ++++++++ .../builtin/maths/tools/eval_expression.py | 29 +++++++++++++++++++ .../builtin/maths/tools/eval_expression.yaml | 26 +++++++++++++++++ api/requirements.txt | 3 +- 7 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 api/core/tools/provider/builtin/maths/_assets/icon.svg create mode 100644 api/core/tools/provider/builtin/maths/maths.py create mode 100644 api/core/tools/provider/builtin/maths/maths.yaml create mode 100644 api/core/tools/provider/builtin/maths/tools/eval_expression.py create mode 100644 api/core/tools/provider/builtin/maths/tools/eval_expression.yaml diff --git a/api/core/tools/provider/_position.yaml b/api/core/tools/provider/_position.yaml index 7fb762cd74..40c62d710a 100644 --- a/api/core/tools/provider/_position.yaml +++ b/api/core/tools/provider/_position.yaml @@ -13,3 +13,4 @@ - vectorizer - youtube - gaode +- maths diff --git a/api/core/tools/provider/builtin/maths/_assets/icon.svg b/api/core/tools/provider/builtin/maths/_assets/icon.svg new file mode 100644 index 0000000000..f94d115211 --- /dev/null +++ b/api/core/tools/provider/builtin/maths/_assets/icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/api/core/tools/provider/builtin/maths/maths.py b/api/core/tools/provider/builtin/maths/maths.py new file mode 100644 index 0000000000..42c0293408 --- /dev/null +++ b/api/core/tools/provider/builtin/maths/maths.py @@ -0,0 +1,18 @@ +from typing import Any, Dict + +from core.tools.errors import ToolProviderCredentialValidationError +from core.tools.provider.builtin.maths.tools.eval_expression import EvaluateExpressionTool +from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController + + +class MathsProvider(BuiltinToolProviderController): + def _validate_credentials(self, credentials: Dict[str, Any]) -> None: + try: + EvaluateExpressionTool().invoke( + user_id='', + tool_parameters={ + 'expression': '1+(2+3)*4', + }, + ) + except Exception as e: + raise ToolProviderCredentialValidationError(str(e)) diff --git a/api/core/tools/provider/builtin/maths/maths.yaml b/api/core/tools/provider/builtin/maths/maths.yaml new file mode 100644 index 0000000000..5bd892a927 --- /dev/null +++ b/api/core/tools/provider/builtin/maths/maths.yaml @@ -0,0 +1,12 @@ +identity: + author: Bowen Liang + name: maths + label: + en_US: Maths + zh_Hans: 数学工具 + pt_BR: Maths + description: + en_US: A tool for maths. + zh_Hans: 一个用于数学计算的工具。 + pt_BR: A tool for maths. + icon: icon.svg diff --git a/api/core/tools/provider/builtin/maths/tools/eval_expression.py b/api/core/tools/provider/builtin/maths/tools/eval_expression.py new file mode 100644 index 0000000000..b551e5a0c7 --- /dev/null +++ b/api/core/tools/provider/builtin/maths/tools/eval_expression.py @@ -0,0 +1,29 @@ +import logging +from datetime import datetime, timezone +from typing import Any, Dict, List, Union + +from core.tools.entities.tool_entities import ToolInvokeMessage +from core.tools.tool.builtin_tool import BuiltinTool +from pytz import timezone as pytz_timezone +import numexpr as ne + +class EvaluateExpressionTool(BuiltinTool): + def _invoke(self, + user_id: str, + tool_parameters: Dict[str, Any], + ) -> Union[ToolInvokeMessage, List[ToolInvokeMessage]]: + """ + invoke tools + """ + # get expression + expression = tool_parameters.get('expression', '').strip() + if not expression: + return self.create_text_message('Invalid expression') + + try: + result = ne.evaluate(expression) + result_str = str(result) + except Exception as e: + logging.exception(f'Error evaluating expression: {expression}') + return self.create_text_message(f'Invalid expression: {expression}, error: {str(e)}') + return self.create_text_message(f'The result of the expression "{expression}" is {result_str}') \ No newline at end of file diff --git a/api/core/tools/provider/builtin/maths/tools/eval_expression.yaml b/api/core/tools/provider/builtin/maths/tools/eval_expression.yaml new file mode 100644 index 0000000000..c936a4293f --- /dev/null +++ b/api/core/tools/provider/builtin/maths/tools/eval_expression.yaml @@ -0,0 +1,26 @@ +identity: + name: eval_expression + author: Bowen Liang + label: + en_US: Evaluate Math Expression + zh_Hans: 计算数学表达式 + pt_BR: Evaluate Math Expression +description: + human: + en_US: A tool for evaluating an math expression, calculated locally with NumExpr. + zh_Hans: 一个用于计算数学表达式的工具,表达式将通过NumExpr本地执行。 + pt_BR: A tool for evaluating an math expression, calculated locally with NumExpr. + llm: A tool for evaluating an math expression. +parameters: + - name: expression + type: string + required: true + label: + en_US: Math Expression + zh_Hans: 数学计算表达式 + pt_BR: Math Expression + human_description: + en_US: Math Expression + zh_Hans: 数学计算表达式 + pt_BR: Math Expression + form: llm diff --git a/api/requirements.txt b/api/requirements.txt index a4757ed0fe..67f30949e7 100644 --- a/api/requirements.txt +++ b/api/requirements.txt @@ -64,4 +64,5 @@ httpx[socks]~=0.24.1 matplotlib~=3.8.2 yfinance~=0.2.35 pydub~=0.25.1 -gmpy2~=2.1.5 \ No newline at end of file +gmpy2~=2.1.5 +numexpr~=2.9.0 \ No newline at end of file