i_loop_node.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. # coding=utf-8
  2. """
  3. @project: MaxKB
  4. @Author:虎
  5. @file: i_loop_node.py
  6. @date:2025/3/11 18:19
  7. @desc:
  8. """
  9. from typing import Type
  10. from django.utils.translation import gettext_lazy as _
  11. from rest_framework import serializers
  12. from application.flow.common import WorkflowMode
  13. from application.flow.i_step_node import INode, NodeResult
  14. from common.exception.app_exception import AppApiException
  15. class ILoopNodeSerializer(serializers.Serializer):
  16. loop_type = serializers.CharField(required=True, label=_("loop_type"))
  17. array = serializers.ListField(required=False, allow_null=True,
  18. label=_("array"))
  19. number = serializers.IntegerField(required=False, allow_null=True,
  20. label=_("number"))
  21. loop_body = serializers.DictField(required=True, label="循环体")
  22. def is_valid(self, *, raise_exception=False):
  23. super().is_valid(raise_exception=True)
  24. loop_type = self.data.get('loop_type')
  25. if loop_type == 'ARRAY':
  26. array = self.data.get('array')
  27. if array is None or len(array) == 0:
  28. message = _('{field}, this field is required.', field='array')
  29. raise AppApiException(500, message)
  30. elif loop_type == 'NUMBER':
  31. number = self.data.get('number')
  32. if number is None:
  33. message = _('{field}, this field is required.', field='number')
  34. raise AppApiException(500, message)
  35. class ILoopNode(INode):
  36. type = 'loop-node'
  37. support = [WorkflowMode.APPLICATION, WorkflowMode.KNOWLEDGE, WorkflowMode.TOOL]
  38. def get_node_params_serializer_class(self) -> Type[serializers.Serializer]:
  39. return ILoopNodeSerializer
  40. def _run(self):
  41. array = self.node_params_serializer.data.get('array')
  42. if self.node_params_serializer.data.get('loop_type') == 'ARRAY':
  43. array = self.workflow_manage.get_reference_field(
  44. array[0],
  45. array[1:])
  46. return self.execute(**{**self.node_params_serializer.data, "array": array}, **self.flow_params_serializer.data)
  47. def execute(self, loop_type, array, number, loop_body, **kwargs) -> NodeResult:
  48. pass