tool_workflow.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. # coding=utf-8
  2. from django.utils.translation import gettext_lazy as _
  3. from drf_spectacular.utils import extend_schema
  4. from rest_framework.request import Request
  5. from rest_framework.views import APIView
  6. from application.api.application_api import SpeechToTextAPI
  7. from common.auth import TokenAuth
  8. from common.auth.authentication import has_permissions
  9. from common.constants.permission_constants import PermissionConstants, RoleConstants, ViewPermission, CompareConstants
  10. from common.log.log import log
  11. from common.result import result, DefaultResultSerializer
  12. from knowledge.api.knowledge_workflow import KnowledgeWorkflowApi
  13. from tools.api.tool import GetInternalToolAPI
  14. from tools.api.tool_workflow import ToolWorkflowApi
  15. from tools.serializers.tool_workflow import ToolWorkflowSerializer, ToolWorkflowMcpSerializer, StoreToolWorkflow
  16. from tools.views import get_tool_operation_object
  17. class ToolWorkflowView(APIView):
  18. authentication_classes = [TokenAuth]
  19. class Publish(APIView):
  20. authentication_classes = [TokenAuth]
  21. @extend_schema(
  22. methods=['PUT'],
  23. description=_("Publishing an tool"),
  24. summary=_("Publishing an tool"),
  25. operation_id=_("Publishing an tool"), # type: ignore
  26. parameters=ToolWorkflowApi.get_parameters(),
  27. request=None,
  28. responses=DefaultResultSerializer,
  29. tags=[_('Tool')] # type: ignore
  30. )
  31. @has_permissions(PermissionConstants.TOOL_EDIT.get_workspace_tool_permission(),
  32. PermissionConstants.TOOL_EDIT.get_workspace_permission_workspace_manage_role(),
  33. ViewPermission([RoleConstants.USER.get_workspace_role()],
  34. [PermissionConstants.TOOL.get_workspace_tool_permission()],
  35. CompareConstants.AND),
  36. RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  37. @log(menu='Tool', operate='Publishing an tool',
  38. get_operation_object=lambda r, k: get_tool_operation_object(k.get('tool_id')))
  39. def put(self, request: Request, workspace_id: str, tool_id: str):
  40. return result.success(
  41. ToolWorkflowSerializer.Operate(
  42. data={'tool_id': tool_id, 'user_id': request.user.id,
  43. 'workspace_id': workspace_id, }).publish())
  44. class Operate(APIView):
  45. authentication_classes = [TokenAuth]
  46. @extend_schema(
  47. methods=['PUT'],
  48. description=_('Edit tool workflow'),
  49. summary=_('Edit tool workflow'),
  50. operation_id=_('Edit tool workflow'), # type: ignore
  51. parameters=ToolWorkflowApi.get_parameters(),
  52. request=ToolWorkflowApi.get_request(),
  53. responses=ToolWorkflowApi.get_response(),
  54. tags=[_('Tool')] # type: ignore
  55. )
  56. @has_permissions(
  57. PermissionConstants.TOOL_EDIT.get_workspace_tool_permission(),
  58. PermissionConstants.TOOL_EDIT.get_workspace_permission_workspace_manage_role(),
  59. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  60. ViewPermission(
  61. [RoleConstants.USER.get_workspace_role()],
  62. [PermissionConstants.TOOL.get_workspace_tool_permission()],
  63. CompareConstants.AND
  64. )
  65. )
  66. @log(
  67. menu='Tool', operate="Modify tool workflow",
  68. get_operation_object=lambda r, k: get_tool_operation_object(k.get('tool_id')),
  69. )
  70. def put(self, request: Request, workspace_id: str, tool_id: str):
  71. return result.success(ToolWorkflowSerializer.Operate(
  72. data={'user_id': request.user.id, 'workspace_id': workspace_id, 'tool_id': tool_id}
  73. ).edit(request.data))
  74. @extend_schema(
  75. methods=['GET'],
  76. description=_('Get tool workflow'),
  77. summary=_('Get tool workflow'),
  78. operation_id=_('Get tool workflow'), # type: ignore
  79. parameters=KnowledgeWorkflowApi.get_parameters(),
  80. responses=KnowledgeWorkflowApi.get_response(),
  81. tags=[_('Tool')] # type: ignore
  82. )
  83. @has_permissions(
  84. PermissionConstants.TOOL_READ.get_workspace_tool_permission(),
  85. PermissionConstants.TOOL_READ.get_workspace_permission_workspace_manage_role(),
  86. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  87. ViewPermission(
  88. [RoleConstants.USER.get_workspace_role()],
  89. [PermissionConstants.TOOL.get_workspace_tool_permission()],
  90. CompareConstants.AND
  91. ),
  92. )
  93. def get(self, request: Request, workspace_id: str, tool_id: str):
  94. return result.success(ToolWorkflowSerializer.Operate(
  95. data={'user_id': request.user.id, 'workspace_id': workspace_id, 'tool_id': tool_id}
  96. ).one())
  97. class ToolWorkflowDebugView(APIView):
  98. authentication_classes = [TokenAuth]
  99. @extend_schema(
  100. methods=['POST'],
  101. description=_('tool workflow debug'),
  102. summary=_('tool workflow debug'),
  103. operation_id=_('tool workflow debug'), # type: ignore
  104. parameters=ToolWorkflowApi.get_parameters(),
  105. responses=ToolWorkflowApi.get_response(),
  106. tags=[_('Tool')] # type: ignore
  107. )
  108. @has_permissions(
  109. PermissionConstants.TOOL_EDIT.get_workspace_tool_permission(),
  110. PermissionConstants.TOOL_EDIT.get_workspace_permission_workspace_manage_role(),
  111. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  112. ViewPermission(
  113. [RoleConstants.USER.get_workspace_role()],
  114. [PermissionConstants.TOOL.get_workspace_tool_permission()],
  115. CompareConstants.AND
  116. ),
  117. )
  118. def post(self, request: Request, workspace_id: str, tool_id: str):
  119. return ToolWorkflowSerializer.Operate(
  120. data={'workspace_id': workspace_id, 'tool_id': tool_id, 'user_id': request.user.id}).debug(
  121. request.data,
  122. request.user,
  123. True)
  124. class McpServers(APIView):
  125. authentication_classes = [TokenAuth]
  126. @extend_schema(
  127. methods=['GET'],
  128. description=_("Get the list of MCP tools"),
  129. summary=_("Get the list of MCP tools"),
  130. operation_id=_("Get the list of MCP tools"), # type: ignore
  131. parameters=SpeechToTextAPI.get_parameters(),
  132. request=SpeechToTextAPI.get_request(),
  133. responses=SpeechToTextAPI.get_response(),
  134. tags=[_('Tool')] # type: ignore
  135. )
  136. @has_permissions(PermissionConstants.TOOL_READ.get_workspace_tool_permission(),
  137. PermissionConstants.TOOL_READ.get_workspace_permission_workspace_manage_role(),
  138. ViewPermission([RoleConstants.USER.get_workspace_role()],
  139. [PermissionConstants.TOOL.get_workspace_tool_permission()],
  140. CompareConstants.AND),
  141. RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  142. def post(self, request: Request, workspace_id, tool_id: str):
  143. return result.success(ToolWorkflowMcpSerializer(
  144. data={'mcp_servers': request.query_params.get('mcp_servers'), 'workspace_id': workspace_id,
  145. 'user_id': request.user.id,
  146. 'tool_id': tool_id}).get_mcp_servers(request.data))
  147. class StoreToolWorkflowView(APIView):
  148. authentication_classes = [TokenAuth]
  149. @extend_schema(
  150. methods=['GET'],
  151. description=_("Get Appstore tools"),
  152. summary=_("Get Appstore tools"),
  153. operation_id=_("Get Appstore tools"), # type: ignore
  154. responses=GetInternalToolAPI.get_response(),
  155. tags=[_("Tool")] # type: ignore
  156. )
  157. def get(self, request: Request):
  158. return result.success(StoreToolWorkflow(data={
  159. 'user_id': request.user.id,
  160. 'name': request.query_params.get('name', ''),
  161. }).get_appstore_templates())