diff --git a/apps/application/flow/compare/__init__.py b/apps/application/flow/compare/__init__.py index 4e99bfa7270..ce0c430e1ad 100644 --- a/apps/application/flow/compare/__init__.py +++ b/apps/application/flow/compare/__init__.py @@ -6,31 +6,78 @@ @date:2024/6/7 14:43 @desc: """ +from typing import List -from .contain_compare import * +from .contain_compare import ContainCompare from .end_with import EndWithCompare -from .equal_compare import * -from .ge_compare import * -from .gt_compare import * -from .is_not_null_compare import * +from .equal_compare import EqualCompare +from .ge_compare import GECompare +from .gt_compare import GTCompare +from .is_not_null_compare import IsNotNullCompare from .is_not_true import IsNotTrueCompare -from .is_null_compare import * +from .is_null_compare import IsNullCompare from .is_true import IsTrueCompare -from .le_compare import * -from .len_equal_compare import * -from .len_ge_compare import * -from .len_gt_compare import * -from .len_le_compare import * -from .len_lt_compare import * -from .lt_compare import * -from .not_contain_compare import * -from .not_equal_compare import * +from .le_compare import LECompare +from .len_equal_compare import LenEqualCompare +from .len_ge_compare import LenGECompare +from .len_gt_compare import LenGTCompare +from .len_le_compare import LenLECompare +from .len_lt_compare import LenLTCompare +from .lt_compare import LTCompare +from .not_contain_compare import NotContainCompare +from .not_equal_compare import NotEqualCompare from .regex_compare import RegexCompare from .start_with import StartWithCompare from .wildcard_compare import WildcardCompare -compare_handle_list = [GECompare(), GTCompare(), ContainCompare(), EqualCompare(), LTCompare(), LECompare(), - LenLECompare(), LenGECompare(), LenEqualCompare(), LenGTCompare(), LenLTCompare(), - IsNullCompare(), - IsNotNullCompare(), NotContainCompare(), NotEqualCompare(), IsTrueCompare(), IsNotTrueCompare(), StartWithCompare(), - EndWithCompare(), RegexCompare(), WildcardCompare()] +_compare_handler_dict = { + 'is_null': IsNullCompare(), + 'is_not_null': IsNotNullCompare(), + 'contain': ContainCompare(), + 'not_contain': NotContainCompare(), + 'eq': EqualCompare(), + 'not_eq': NotEqualCompare(), + 'ge': GECompare(), + 'gt': GTCompare(), + 'le': LECompare(), + 'lt': LTCompare(), + 'len_eq': LenEqualCompare(), + 'len_ge': LenGECompare(), + 'len_gt': LenGTCompare(), + 'len_le': LenLECompare(), + 'len_lt': LenLTCompare(), + 'is_true': IsTrueCompare(), + 'is_not_true': IsNotTrueCompare(), + 'start_with': StartWithCompare(), + 'end_with': EndWithCompare(), + 'regex': RegexCompare(), + 'wildcard': WildcardCompare(), +} + + +def _compare(source_value, compare, target_value): + compare_handler = _compare_handler_dict.get(compare) + if compare_handler is None: + raise RuntimeError(f"Unknown compare handler '{compare}'") + return compare_handler.compare(source_value, compare, target_value) + + +def _assertion(workflow_manage, field_list: List[str], compare: str, value): + try: + value = workflow_manage.generate_prompt(value) + except Exception: + pass + field_value = None + try: + field_value = workflow_manage.get_reference_field(field_list[0], field_list[1:]) + except Exception: + pass + return _compare(field_value, compare, value) + + +def do_assertion(workflow_manage, condition, condition_list): + b = False if condition == 'and' else True + for row in condition_list: + if _assertion(workflow_manage, row.get('field'), row.get('compare'), row.get('value')) is b: + return b + return not b diff --git a/apps/application/flow/compare/compare.py b/apps/application/flow/compare/compare.py index 6cbb4af0732..62eb4a7b910 100644 --- a/apps/application/flow/compare/compare.py +++ b/apps/application/flow/compare/compare.py @@ -7,13 +7,8 @@ @desc: """ from abc import abstractmethod -from typing import List - class Compare: - @abstractmethod - def support(self, node_id, fields: List[str], source_value, compare, target_value): - pass @abstractmethod def compare(self, source_value, compare, target_value): diff --git a/apps/application/flow/compare/contain_compare.py b/apps/application/flow/compare/contain_compare.py index b79b9cad728..cd50d543a3a 100644 --- a/apps/application/flow/compare/contain_compare.py +++ b/apps/application/flow/compare/contain_compare.py @@ -6,17 +6,11 @@ @date:2024/6/11 10:02 @desc: """ -from typing import List - -from application.flow.compare.compare import Compare +from .compare import Compare class ContainCompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'contain': - return True - def compare(self, source_value, compare, target_value): target_value = str(target_value) diff --git a/apps/application/flow/compare/end_with.py b/apps/application/flow/compare/end_with.py index a0fe1798956..eae7e3a8a15 100644 --- a/apps/application/flow/compare/end_with.py +++ b/apps/application/flow/compare/end_with.py @@ -6,17 +6,11 @@ @date:2025/10/20 10:37 @desc: """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class EndWithCompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'end_with': - return True - def compare(self, source_value, compare, target_value): source_value = str(source_value) return source_value.endswith(str(target_value)) diff --git a/apps/application/flow/compare/equal_compare.py b/apps/application/flow/compare/equal_compare.py index b8d9f7eeead..dad0cffa9fa 100644 --- a/apps/application/flow/compare/equal_compare.py +++ b/apps/application/flow/compare/equal_compare.py @@ -6,16 +6,10 @@ @date:2024/6/7 14:44 @desc: """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class EqualCompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'eq': - return True - def compare(self, source_value, compare, target_value): return str(source_value) == str(target_value) diff --git a/apps/application/flow/compare/ge_compare.py b/apps/application/flow/compare/ge_compare.py index 84a223beef2..bd85d0c3c52 100644 --- a/apps/application/flow/compare/ge_compare.py +++ b/apps/application/flow/compare/ge_compare.py @@ -6,23 +6,17 @@ @date:2024/6/11 9:52 @desc: 大于比较器 """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class GECompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'ge': - return True - def compare(self, source_value, compare, target_value): try: return float(source_value) >= float(target_value) - except Exception as e: + except Exception: try: return str(source_value) >= str(target_value) - except Exception as _: + except Exception: pass return False diff --git a/apps/application/flow/compare/gt_compare.py b/apps/application/flow/compare/gt_compare.py index 2307aaae418..c83a1e765e0 100644 --- a/apps/application/flow/compare/gt_compare.py +++ b/apps/application/flow/compare/gt_compare.py @@ -6,23 +6,17 @@ @date:2024/6/11 9:52 @desc: 大于比较器 """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class GTCompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'gt': - return True - def compare(self, source_value, compare, target_value): try: return float(source_value) > float(target_value) - except Exception as e: + except Exception: try: return str(source_value) > str(target_value) - except Exception as _: + except Exception: pass return False diff --git a/apps/application/flow/compare/is_not_null_compare.py b/apps/application/flow/compare/is_not_null_compare.py index 92306bed0b8..37fd4a72ea4 100644 --- a/apps/application/flow/compare/is_not_null_compare.py +++ b/apps/application/flow/compare/is_not_null_compare.py @@ -6,17 +6,11 @@ @date:2024/6/28 10:45 @desc: """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class IsNotNullCompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'is_not_null': - return True - def compare(self, source_value, compare, target_value): try: return source_value is not None and len(source_value) > 0 diff --git a/apps/application/flow/compare/is_not_true.py b/apps/application/flow/compare/is_not_true.py index 78433a76d87..fabeec2cc41 100644 --- a/apps/application/flow/compare/is_not_true.py +++ b/apps/application/flow/compare/is_not_true.py @@ -6,19 +6,13 @@ @date:2025/4/7 13:44 @desc: """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class IsNotTrueCompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'is_not_true': - return True - def compare(self, source_value, compare, target_value): try: return source_value is False - except Exception as e: + except Exception: return False diff --git a/apps/application/flow/compare/is_null_compare.py b/apps/application/flow/compare/is_null_compare.py index 09c115c98d9..240403ea605 100644 --- a/apps/application/flow/compare/is_null_compare.py +++ b/apps/application/flow/compare/is_null_compare.py @@ -6,19 +6,13 @@ @date:2024/6/28 10:45 @desc: """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class IsNullCompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'is_null': - return True - def compare(self, source_value, compare, target_value): try: return source_value is None or len(source_value) == 0 - except Exception as e: + except Exception: return False diff --git a/apps/application/flow/compare/is_true.py b/apps/application/flow/compare/is_true.py index e3f29ea2978..8cb4a45a2a5 100644 --- a/apps/application/flow/compare/is_true.py +++ b/apps/application/flow/compare/is_true.py @@ -6,19 +6,13 @@ @date:2025/4/7 13:38 @desc: """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class IsTrueCompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'is_true': - return True - def compare(self, source_value, compare, target_value): try: return source_value is True - except Exception as e: + except Exception: return False diff --git a/apps/application/flow/compare/le_compare.py b/apps/application/flow/compare/le_compare.py index 0b1710a25dd..8b115d84b33 100644 --- a/apps/application/flow/compare/le_compare.py +++ b/apps/application/flow/compare/le_compare.py @@ -6,23 +6,17 @@ @date:2024/6/11 9:52 @desc: 小于比较器 """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class LECompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'le': - return True - def compare(self, source_value, compare, target_value): try: return float(source_value) <= float(target_value) - except Exception as e: + except Exception: try: return str(source_value) <= str(target_value) - except Exception as _: + except Exception: pass return False diff --git a/apps/application/flow/compare/len_equal_compare.py b/apps/application/flow/compare/len_equal_compare.py index 203a0338fd2..98a5314a292 100644 --- a/apps/application/flow/compare/len_equal_compare.py +++ b/apps/application/flow/compare/len_equal_compare.py @@ -6,17 +6,11 @@ @date:2024/6/7 14:44 @desc: """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class LenEqualCompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'len_eq': - return True - def compare(self, source_value, compare, target_value): try: return len(source_value) == int(target_value) diff --git a/apps/application/flow/compare/len_ge_compare.py b/apps/application/flow/compare/len_ge_compare.py index d1e45cd3419..06dd566cf24 100644 --- a/apps/application/flow/compare/len_ge_compare.py +++ b/apps/application/flow/compare/len_ge_compare.py @@ -6,19 +6,13 @@ @date:2024/6/11 9:52 @desc: 大于比较器 """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class LenGECompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'len_ge': - return True - def compare(self, source_value, compare, target_value): try: return len(source_value) >= int(target_value) - except Exception as e: + except Exception: return False diff --git a/apps/application/flow/compare/len_gt_compare.py b/apps/application/flow/compare/len_gt_compare.py index a3383138208..fae2668e0ba 100644 --- a/apps/application/flow/compare/len_gt_compare.py +++ b/apps/application/flow/compare/len_gt_compare.py @@ -6,19 +6,13 @@ @date:2024/6/11 9:52 @desc: 大于比较器 """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class LenGTCompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'len_gt': - return True - def compare(self, source_value, compare, target_value): try: return len(source_value) > int(target_value) - except Exception as e: + except Exception: return False diff --git a/apps/application/flow/compare/len_le_compare.py b/apps/application/flow/compare/len_le_compare.py index 6bb73c0a149..41b9ee9f709 100644 --- a/apps/application/flow/compare/len_le_compare.py +++ b/apps/application/flow/compare/len_le_compare.py @@ -6,19 +6,13 @@ @date:2024/6/11 9:52 @desc: 小于比较器 """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class LenLECompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'len_le': - return True - def compare(self, source_value, compare, target_value): try: return len(source_value) <= int(target_value) - except Exception as e: + except Exception: return False diff --git a/apps/application/flow/compare/len_lt_compare.py b/apps/application/flow/compare/len_lt_compare.py index 92f99d47a2c..4a9b11654ca 100644 --- a/apps/application/flow/compare/len_lt_compare.py +++ b/apps/application/flow/compare/len_lt_compare.py @@ -6,19 +6,13 @@ @date:2024/6/11 9:52 @desc: 小于比较器 """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class LenLTCompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'len_lt': - return True - def compare(self, source_value, compare, target_value): try: return len(source_value) < int(target_value) - except Exception as e: + except Exception: return False diff --git a/apps/application/flow/compare/lt_compare.py b/apps/application/flow/compare/lt_compare.py index c5ff3d6f610..6720af7f17a 100644 --- a/apps/application/flow/compare/lt_compare.py +++ b/apps/application/flow/compare/lt_compare.py @@ -6,23 +6,17 @@ @date:2024/6/11 9:52 @desc: 小于比较器 """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class LTCompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'lt': - return True - def compare(self, source_value, compare, target_value): try: return float(source_value) < float(target_value) - except Exception as e: + except Exception: try: return str(source_value) < str(target_value) - except Exception as _: + except Exception: pass return False diff --git a/apps/application/flow/compare/not_contain_compare.py b/apps/application/flow/compare/not_contain_compare.py index 193aa1c1f78..99194e70364 100644 --- a/apps/application/flow/compare/not_contain_compare.py +++ b/apps/application/flow/compare/not_contain_compare.py @@ -6,17 +6,11 @@ @date:2024/6/11 10:02 @desc: """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class NotContainCompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'not_contain': - return True - def compare(self, source_value, compare, target_value): target_value = str(target_value) diff --git a/apps/application/flow/compare/not_equal_compare.py b/apps/application/flow/compare/not_equal_compare.py index 7e7a055162e..f53057ebfa9 100644 --- a/apps/application/flow/compare/not_equal_compare.py +++ b/apps/application/flow/compare/not_equal_compare.py @@ -6,16 +6,10 @@ @date:2026/3/17 9:41 @desc: """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class NotEqualCompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'not_eq': - return True - def compare(self, source_value, compare, target_value): return str(source_value) != str(target_value) diff --git a/apps/application/flow/compare/regex_compare.py b/apps/application/flow/compare/regex_compare.py index 8fd98f3eca8..eeb76a5256e 100644 --- a/apps/application/flow/compare/regex_compare.py +++ b/apps/application/flow/compare/regex_compare.py @@ -7,9 +7,8 @@ @desc: """ import re -from typing import List -from application.flow.compare import Compare +from .compare import Compare from common.cache.mem_cache import MemCache @@ -31,10 +30,6 @@ def compile_and_cache(regex): class RegexCompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'regex': - return True - def compare(self, source_value, compare, target_value): match = compile_and_cache(str(target_value)) return bool(match(str(source_value))) diff --git a/apps/application/flow/compare/start_with.py b/apps/application/flow/compare/start_with.py index ccf0ae45b65..054ea9bd6cb 100644 --- a/apps/application/flow/compare/start_with.py +++ b/apps/application/flow/compare/start_with.py @@ -6,17 +6,11 @@ @date:2025/10/20 10:37 @desc: """ -from typing import List - -from application.flow.compare import Compare +from .compare import Compare class StartWithCompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'start_with': - return True - def compare(self, source_value, compare, target_value): source_value = str(source_value) return source_value.startswith(str(target_value)) diff --git a/apps/application/flow/compare/wildcard_compare.py b/apps/application/flow/compare/wildcard_compare.py index 65ea2c74a5a..43c903a9360 100644 --- a/apps/application/flow/compare/wildcard_compare.py +++ b/apps/application/flow/compare/wildcard_compare.py @@ -8,9 +8,8 @@ """ import fnmatch import re -from typing import List -from application.flow.compare import Compare +from .compare import Compare from common.cache.mem_cache import MemCache @@ -33,10 +32,6 @@ def translate_and_compile_and_cache(wildcard): class WildcardCompare(Compare): - def support(self, node_id, fields: List[str], source_value, compare, target_value): - if compare == 'wildcard': - return True - def compare(self, source_value, compare, target_value): # 转成正则,性能更高 match = translate_and_compile_and_cache(str(target_value)) diff --git a/apps/application/flow/step_node/condition_node/impl/base_condition_node.py b/apps/application/flow/step_node/condition_node/impl/base_condition_node.py index 7e5a5e28e35..e0da03ace4c 100644 --- a/apps/application/flow/step_node/condition_node/impl/base_condition_node.py +++ b/apps/application/flow/step_node/condition_node/impl/base_condition_node.py @@ -9,7 +9,7 @@ from typing import List from application.flow.i_step_node import NodeResult -from application.flow.compare import compare_handle_list +from application.flow.compare import do_assertion from application.flow.step_node.condition_node.i_condition_node import IConditionNode @@ -31,24 +31,7 @@ def _execute(self, branch_list: List): return branch def branch_assertion(self, branch): - condition_list = [self.assertion(row.get('field'), row.get('compare'), row.get('value')) for row in - branch.get('conditions')] - condition = branch.get('condition') - return all(condition_list) if condition == 'and' else any(condition_list) - - def assertion(self, field_list: List[str], compare: str, value): - try: - value = self.workflow_manage.generate_prompt(value) - except Exception as e: - pass - field_value = None - try: - field_value = self.workflow_manage.get_reference_field(field_list[0], field_list[1:]) - except Exception as e: - pass - for compare_handler in compare_handle_list: - if compare_handler.support(field_list[0], field_list[1:], field_value, compare, value): - return compare_handler.compare(field_value, compare, value) + return do_assertion(self.workflow_manage, branch.get('condition'), branch.get('conditions')) def get_details(self, index: int, **kwargs): return { diff --git a/apps/application/flow/step_node/loop_break_node/impl/base_loop_break_node.py b/apps/application/flow/step_node/loop_break_node/impl/base_loop_break_node.py index e5e030e75d0..f82289729da 100644 --- a/apps/application/flow/step_node/loop_break_node/impl/base_loop_break_node.py +++ b/apps/application/flow/step_node/loop_break_node/impl/base_loop_break_node.py @@ -7,9 +7,9 @@ @desc: """ import time -from typing import List, Dict +from typing import Dict -from application.flow.compare import compare_handle_list +from application.flow.compare import do_assertion from application.flow.i_step_node import NodeResult from application.flow.step_node.loop_break_node.i_loop_break_node import ILoopBreakNode @@ -26,9 +26,7 @@ def save_context(self, details, workflow_manage): self.context['exception_message'] = details.get('err_message') def execute(self, condition, condition_list, **kwargs) -> NodeResult: - r = [self.assertion(row.get('field'), row.get('compare'), row.get('value')) for row in - condition_list] - is_break = all(r) if condition == 'and' else any(r) + is_break = do_assertion(self.workflow_manage, condition, condition_list) if is_break: self.node_params['is_result'] = True self.context['is_break'] = is_break @@ -36,20 +34,6 @@ def execute(self, condition, condition_list, **kwargs) -> NodeResult: _write_context=_write_context, _is_interrupt=lambda n, v, w: is_break) - def assertion(self, field_list: List[str], compare: str, value): - try: - value = self.workflow_manage.generate_prompt(value) - except Exception as e: - pass - field_value = None - try: - field_value = self.workflow_manage.get_reference_field(field_list[0], field_list[1:]) - except Exception as e: - pass - for compare_handler in compare_handle_list: - if compare_handler.support(field_list[0], field_list[1:], field_value, compare, value): - return compare_handler.compare(field_value, compare, value) - def get_details(self, index: int, **kwargs): return { 'name': self.node.properties.get('stepName'), diff --git a/apps/application/flow/step_node/loop_continue_node/impl/base_loop_continue_node.py b/apps/application/flow/step_node/loop_continue_node/impl/base_loop_continue_node.py index d3ee6de636e..3c0393217c5 100644 --- a/apps/application/flow/step_node/loop_continue_node/impl/base_loop_continue_node.py +++ b/apps/application/flow/step_node/loop_continue_node/impl/base_loop_continue_node.py @@ -6,9 +6,7 @@ @date:2025/9/15 12:13 @desc: """ -from typing import List - -from application.flow.compare import compare_handle_list +from application.flow.compare import do_assertion from application.flow.i_step_node import NodeResult from application.flow.step_node.loop_continue_node.i_loop_continue_node import ILoopContinueNode @@ -18,28 +16,12 @@ def save_context(self, details, workflow_manage): self.context['exception_message'] = details.get('err_message') def execute(self, condition, condition_list, **kwargs) -> NodeResult: - condition_list = [self.assertion(row.get('field'), row.get('compare'), row.get('value')) for row in - condition_list] - is_continue = all(condition_list) if condition == 'and' else any(condition_list) + is_continue = do_assertion(self.workflow_manage, condition, condition_list) self.context['is_continue'] = is_continue if is_continue: return NodeResult({'is_continue': is_continue, 'branch_id': 'continue'}, {}) return NodeResult({'is_continue': is_continue}, {}) - def assertion(self, field_list: List[str], compare: str, value): - try: - value = self.workflow_manage.generate_prompt(value) - except Exception as e: - pass - field_value = None - try: - field_value = self.workflow_manage.get_reference_field(field_list[0], field_list[1:]) - except Exception as e: - pass - for compare_handler in compare_handle_list: - if compare_handler.support(field_list[0], field_list[1:], field_value, compare, value): - return compare_handler.compare(field_value, compare, value) - def get_details(self, index: int, **kwargs): return { 'name': self.node.properties.get('stepName'), diff --git a/ui/src/workflow/common/data.ts b/ui/src/workflow/common/data.ts index 8512f3e2ddf..a726ae9ed5a 100644 --- a/ui/src/workflow/common/data.ts +++ b/ui/src/workflow/common/data.ts @@ -1135,8 +1135,8 @@ export const compareList = [ {value: 'is_not_true', label: t('workflow.compare.is_not_true')}, {value: 'start_with', label: 'startWith'}, {value: 'end_with', label: 'endWith'}, - { value: 'regex', label: t('workflow.compare.regex') }, - { value: 'wildcard', label: t('workflow.compare.wildcard') }, + {value: 'regex', label: t('workflow.compare.regex')}, + {value: 'wildcard', label: t('workflow.compare.wildcard')}, ] export const nodeDict: any = { [WorkflowType.AiChat]: aiChatNode,