i_intent_node.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. # coding=utf-8
  2. from typing import Type
  3. from django.utils.translation import gettext_lazy as _
  4. from rest_framework import serializers
  5. from application.flow.common import WorkflowMode
  6. from application.flow.i_step_node import INode, NodeResult
  7. class IntentBranchSerializer(serializers.Serializer):
  8. id = serializers.CharField(required=True, label=_("Branch id"))
  9. content = serializers.CharField(required=True, label=_("content"))
  10. isOther = serializers.BooleanField(required=True, label=_("Branch Type"))
  11. class IntentNodeSerializer(serializers.Serializer):
  12. model_id = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_("Model id"))
  13. model_id_type = serializers.CharField(required=False, default='custom', label=_("Model id type"))
  14. model_id_reference = serializers.ListField(required=False, child=serializers.CharField(), allow_empty=True,
  15. label=_("Reference Field"))
  16. content_list = serializers.ListField(required=True, label=_("Text content"))
  17. dialogue_number = serializers.IntegerField(required=True, label=
  18. _("Number of multi-round conversations"))
  19. model_params_setting = serializers.DictField(required=False,
  20. label=_("Model parameter settings"))
  21. branch = IntentBranchSerializer(many=True)
  22. class IIntentNode(INode):
  23. type = 'intent-node'
  24. support = [WorkflowMode.APPLICATION, WorkflowMode.APPLICATION_LOOP, WorkflowMode.KNOWLEDGE,
  25. WorkflowMode.KNOWLEDGE_LOOP, WorkflowMode.TOOL, WorkflowMode.TOOL_LOOP]
  26. def save_context(self, details, workflow_manage):
  27. pass
  28. def get_node_params_serializer_class(self) -> Type[serializers.Serializer]:
  29. return IntentNodeSerializer
  30. def _run(self):
  31. question = self.workflow_manage.get_reference_field(
  32. self.node_params_serializer.data.get('content_list')[0],
  33. self.node_params_serializer.data.get('content_list')[1:],
  34. )
  35. if [WorkflowMode.KNOWLEDGE, WorkflowMode.KNOWLEDGE_LOOP, WorkflowMode.TOOL,
  36. WorkflowMode.TOOL_LOOP].__contains__(
  37. self.workflow_manage.flow.workflow_mode):
  38. return self.execute(**self.node_params_serializer.data, **self.flow_params_serializer.data,
  39. **{'history_chat_record': [], 'stream': True, 'chat_id': None, 'chat_record_id': None,
  40. 'user_input': str(question)})
  41. else:
  42. return self.execute(**self.node_params_serializer.data, **self.flow_params_serializer.data,
  43. user_input=str(question))
  44. def execute(self, model_id, dialogue_number, history_chat_record, user_input, branch,
  45. model_params_setting=None, model_id_type=None, model_id_reference=None, **kwargs) -> NodeResult:
  46. pass