trigger_task.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. # coding=utf-8
  2. """
  3. @project: MaxKB
  4. @Author:虎虎
  5. @file: trigger_task.py
  6. @date:2026/1/14 16:34
  7. @desc:
  8. """
  9. import os
  10. from django.db import models
  11. from django.db.models import QuerySet
  12. from django.utils.translation import gettext_lazy as _
  13. from rest_framework import serializers
  14. from application.models import ChatRecord
  15. from common.db.search import native_page_search, get_dynamics_model
  16. from common.exception.app_exception import AppApiException
  17. from common.utils.common import get_file_content
  18. from knowledge.models.knowledge_action import State
  19. from maxkb.conf import PROJECT_DIR
  20. from tools.models import ToolRecord
  21. from trigger.models import TriggerTask, TaskRecord, Trigger
  22. class ChatRecordSerializerModel(serializers.ModelSerializer):
  23. class Meta:
  24. model = ChatRecord
  25. fields = ['id', 'chat_id', 'vote_status', 'vote_reason', 'vote_other_content', 'problem_text', 'answer_text',
  26. 'message_tokens', 'answer_tokens', 'const', 'improve_paragraph_id_list', 'run_time', 'index',
  27. 'answer_text_list', 'details',
  28. 'create_time', 'update_time']
  29. class TriggerTaskResponse(serializers.ModelSerializer):
  30. class Meta:
  31. model = TriggerTask
  32. fields = "__all__"
  33. class TriggerTaskQuerySerializer(serializers.Serializer):
  34. trigger_id = serializers.CharField(required=True, label=_("Trigger ID"))
  35. workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
  36. def is_valid(self, *, raise_exception=False):
  37. super().is_valid(raise_exception=True)
  38. workspace_id = self.data.get('workspace_id')
  39. query_set = QuerySet(Trigger).filter(id=self.data.get('trigger_id'))
  40. if workspace_id:
  41. query_set = query_set.filter(workspace_id=workspace_id)
  42. if not query_set.exists():
  43. raise AppApiException(500, _('Trigger id does not exist'))
  44. def get_query_set(self):
  45. query_set = QuerySet(TriggerTask).filter(workspace_id=self.data.get("workspace_id")).filter(
  46. trigger_id=self.data.get("trigger_id"))
  47. return query_set
  48. def list(self, with_valid=True):
  49. if with_valid:
  50. self.is_valid(raise_exception=True)
  51. return [TriggerTaskResponse(row).data for row in self.get_query_set()]
  52. class TriggerTaskRecordOperateSerializer(serializers.Serializer):
  53. trigger_id = serializers.CharField(required=True, label=_("Trigger ID"))
  54. workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
  55. trigger_task_id = serializers.CharField(required=True, label=_("Trigger task ID"))
  56. trigger_task_record_id = serializers.CharField(required=True, label=_("Trigger task record ID"))
  57. def is_valid(self, *, raise_exception=False):
  58. super().is_valid(raise_exception=True)
  59. workspace_id = self.data.get('workspace_id')
  60. query_set = QuerySet(Trigger).filter(id=self.data.get('trigger_id'))
  61. if workspace_id:
  62. query_set = query_set.filter(workspace_id=workspace_id)
  63. if not query_set.exists():
  64. raise AppApiException(500, _('Trigger id does not exist'))
  65. def get_execution_details(self, is_valid=True):
  66. if is_valid:
  67. self.is_valid(raise_exception=True)
  68. task_record = QuerySet(TaskRecord).filter(trigger_id=self.data.get("trigger_id"),
  69. trigger_task_id=self.data.get("trigger_task_id"),
  70. id=self.data.get('trigger_task_record_id')).first()
  71. if not task_record:
  72. raise AppApiException(500, _('Trigger task record id does not exist'))
  73. if task_record.source_type == 'APPLICATION':
  74. chat_record = QuerySet(ChatRecord).filter(id=task_record.task_record_id).first()
  75. if chat_record:
  76. return ChatRecordSerializerModel(chat_record).data
  77. return {
  78. 'state': 'TRIGGER_ERROR',
  79. 'meta': task_record.meta
  80. }
  81. if task_record.source_type == 'TOOL':
  82. tool_record = QuerySet(ToolRecord).filter(id=task_record.task_record_id).first()
  83. if tool_record:
  84. return {
  85. 'id': tool_record.id,
  86. 'tool_id': tool_record.tool_id,
  87. 'workspace_id': tool_record.workspace_id,
  88. 'source_type': tool_record.source_type,
  89. 'source_id': tool_record.source_id,
  90. 'meta': tool_record.meta,
  91. 'state': tool_record.state,
  92. 'run_time': tool_record.run_time,
  93. 'details': {
  94. 'tool_call': {
  95. 'index': 1,
  96. 'result': tool_record.meta.get('output'),
  97. 'params': tool_record.meta.get('input'),
  98. 'status': 500 if tool_record.state == State.FAILURE else 200 if tool_record.state == State.SUCCESS else 201,
  99. 'type': 'tool-node',
  100. 'err_message': tool_record.meta.get('err_message')
  101. }
  102. }
  103. }
  104. return {
  105. 'state': 'TRIGGER_ERROR',
  106. 'meta': task_record.meta
  107. }
  108. class TriggerTaskRecordQuerySerializer(serializers.Serializer):
  109. trigger_id = serializers.CharField(required=True, label=_("Trigger ID"))
  110. workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
  111. state = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_('Trigger state'))
  112. name = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_('Trigger name'))
  113. source_type = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_('Source type'))
  114. order = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('Order field'))
  115. def is_valid(self, *, raise_exception=False):
  116. super().is_valid(raise_exception=True)
  117. workspace_id = self.data.get('workspace_id')
  118. query_set = QuerySet(Trigger).filter(id=self.data.get('trigger_id'))
  119. if workspace_id:
  120. query_set = query_set.filter(workspace_id=workspace_id)
  121. if not query_set.exists():
  122. raise AppApiException(500, _('Trigger id does not exist'))
  123. def get_query_set(self):
  124. trigger_query_set = QuerySet(
  125. model=get_dynamics_model({
  126. 'ett.create_time': models.DateTimeField(),
  127. 'ett.state': models.CharField(),
  128. 'sdc.name': models.CharField(),
  129. 'ett.workspace_id': models.CharField(),
  130. 'ett.trigger_id': models.UUIDField(),
  131. 'sdc.source_type': models.CharField()
  132. }))
  133. trigger_query_set = trigger_query_set.filter(
  134. **{'ett.trigger_id': self.data.get("trigger_id")})
  135. if self.data.get("order"):
  136. trigger_query_set = trigger_query_set.order_by(self.data.get("order"))
  137. else:
  138. trigger_query_set = trigger_query_set.order_by("-ett.create_time")
  139. if self.data.get('state'):
  140. trigger_query_set = trigger_query_set.filter(**{'ett.state': self.data.get('state')})
  141. if self.data.get("name"):
  142. trigger_query_set = trigger_query_set.filter(**{'sdc.name__contains': self.data.get('name')})
  143. if self.data.get('source_type'):
  144. trigger_query_set = trigger_query_set.filter(**{'sdc.source_type': self.data.get('source_type')})
  145. return trigger_query_set
  146. def list(self, with_valid=True):
  147. if with_valid:
  148. self.is_valid(raise_exception=True)
  149. return [TriggerTaskResponse(row).data for row in self.get_query_set()]
  150. def page(self, current_page, page_size, with_valid=True):
  151. if with_valid:
  152. self.is_valid(raise_exception=True)
  153. return native_page_search(current_page, page_size, self.get_query_set(), get_file_content(
  154. os.path.join(PROJECT_DIR, "apps", "trigger", "sql", 'get_trigger_task_record_page_list.sql')
  155. ))