fix: code node check decimal precision (#22522)
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
from collections.abc import Mapping, Sequence
|
from collections.abc import Mapping, Sequence
|
||||||
|
from decimal import Decimal
|
||||||
from typing import Any, Optional
|
from typing import Any, Optional
|
||||||
|
|
||||||
from configs import dify_config
|
from configs import dify_config
|
||||||
@@ -114,8 +115,10 @@ class CodeNode(BaseNode[CodeNodeData]):
|
|||||||
)
|
)
|
||||||
|
|
||||||
if isinstance(value, float):
|
if isinstance(value, float):
|
||||||
|
decimal_value = Decimal(str(value)).normalize()
|
||||||
|
precision = -decimal_value.as_tuple().exponent if decimal_value.as_tuple().exponent < 0 else 0 # type: ignore[operator]
|
||||||
# raise error if precision is too high
|
# raise error if precision is too high
|
||||||
if len(str(value).split(".")[1]) > dify_config.CODE_MAX_PRECISION:
|
if precision > dify_config.CODE_MAX_PRECISION:
|
||||||
raise OutputValidationError(
|
raise OutputValidationError(
|
||||||
f"Output variable `{variable}` has too high precision,"
|
f"Output variable `{variable}` has too high precision,"
|
||||||
f" it must be less than {dify_config.CODE_MAX_PRECISION} digits."
|
f" it must be less than {dify_config.CODE_MAX_PRECISION} digits."
|
||||||
|
@@ -354,3 +354,35 @@ def test_execute_code_output_object_list():
|
|||||||
# validate
|
# validate
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
node._transform_result(result, node.node_data.outputs)
|
node._transform_result(result, node.node_data.outputs)
|
||||||
|
|
||||||
|
|
||||||
|
def test_execute_code_scientific_notation():
|
||||||
|
code = """
|
||||||
|
def main() -> dict:
|
||||||
|
return {
|
||||||
|
"result": -8.0E-5
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
code = "\n".join([line[4:] for line in code.split("\n")])
|
||||||
|
|
||||||
|
code_config = {
|
||||||
|
"id": "code",
|
||||||
|
"data": {
|
||||||
|
"outputs": {
|
||||||
|
"result": {
|
||||||
|
"type": "number",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"title": "123",
|
||||||
|
"variables": [],
|
||||||
|
"answer": "123",
|
||||||
|
"code_language": "python3",
|
||||||
|
"code": code,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
node = init_code_node(code_config)
|
||||||
|
# execute node
|
||||||
|
result = node._run()
|
||||||
|
assert isinstance(result, NodeRunResult)
|
||||||
|
assert result.status == WorkflowNodeExecutionStatus.SUCCEEDED
|
||||||
|
Reference in New Issue
Block a user