conversation.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. from flask_restful import marshal_with, reqparse
  2. from flask_restful.inputs import int_range
  3. from werkzeug.exceptions import NotFound
  4. from controllers.web import api
  5. from controllers.web.error import NotChatAppError
  6. from controllers.web.wraps import WebApiResource
  7. from core.app.entities.app_invoke_entities import InvokeFrom
  8. from fields.conversation_fields import conversation_infinite_scroll_pagination_fields, simple_conversation_fields
  9. from libs.helper import uuid_value
  10. from models.model import AppMode
  11. from services.conversation_service import ConversationService
  12. from services.errors.conversation import ConversationNotExistsError, LastConversationNotExistsError
  13. from services.web_conversation_service import WebConversationService
  14. class ConversationListApi(WebApiResource):
  15. @marshal_with(conversation_infinite_scroll_pagination_fields)
  16. def get(self, app_model, end_user):
  17. app_mode = AppMode.value_of(app_model.mode)
  18. if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}:
  19. raise NotChatAppError()
  20. parser = reqparse.RequestParser()
  21. parser.add_argument("last_id", type=uuid_value, location="args")
  22. parser.add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args")
  23. parser.add_argument("pinned", type=str, choices=["true", "false", None], location="args")
  24. parser.add_argument(
  25. "sort_by",
  26. type=str,
  27. choices=["created_at", "-created_at", "updated_at", "-updated_at"],
  28. required=False,
  29. default="-updated_at",
  30. location="args",
  31. )
  32. args = parser.parse_args()
  33. pinned = None
  34. if "pinned" in args and args["pinned"] is not None:
  35. pinned = True if args["pinned"] == "true" else False
  36. try:
  37. return WebConversationService.pagination_by_last_id(
  38. app_model=app_model,
  39. user=end_user,
  40. last_id=args["last_id"],
  41. limit=args["limit"],
  42. invoke_from=InvokeFrom.WEB_APP,
  43. pinned=pinned,
  44. sort_by=args["sort_by"],
  45. )
  46. except LastConversationNotExistsError:
  47. raise NotFound("Last Conversation Not Exists.")
  48. class ConversationApi(WebApiResource):
  49. def delete(self, app_model, end_user, c_id):
  50. app_mode = AppMode.value_of(app_model.mode)
  51. if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}:
  52. raise NotChatAppError()
  53. conversation_id = str(c_id)
  54. try:
  55. ConversationService.delete(app_model, conversation_id, end_user)
  56. except ConversationNotExistsError:
  57. raise NotFound("Conversation Not Exists.")
  58. WebConversationService.unpin(app_model, conversation_id, end_user)
  59. return {"result": "success"}, 204
  60. class ConversationRenameApi(WebApiResource):
  61. @marshal_with(simple_conversation_fields)
  62. def post(self, app_model, end_user, c_id):
  63. app_mode = AppMode.value_of(app_model.mode)
  64. if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}:
  65. raise NotChatAppError()
  66. conversation_id = str(c_id)
  67. parser = reqparse.RequestParser()
  68. parser.add_argument("name", type=str, required=False, location="json")
  69. parser.add_argument("auto_generate", type=bool, required=False, default=False, location="json")
  70. args = parser.parse_args()
  71. try:
  72. return ConversationService.rename(app_model, conversation_id, end_user, args["name"], args["auto_generate"])
  73. except ConversationNotExistsError:
  74. raise NotFound("Conversation Not Exists.")
  75. class ConversationPinApi(WebApiResource):
  76. def patch(self, app_model, end_user, c_id):
  77. app_mode = AppMode.value_of(app_model.mode)
  78. if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}:
  79. raise NotChatAppError()
  80. conversation_id = str(c_id)
  81. try:
  82. WebConversationService.pin(app_model, conversation_id, end_user)
  83. except ConversationNotExistsError:
  84. raise NotFound("Conversation Not Exists.")
  85. return {"result": "success"}
  86. class ConversationUnPinApi(WebApiResource):
  87. def patch(self, app_model, end_user, c_id):
  88. app_mode = AppMode.value_of(app_model.mode)
  89. if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}:
  90. raise NotChatAppError()
  91. conversation_id = str(c_id)
  92. WebConversationService.unpin(app_model, conversation_id, end_user)
  93. return {"result": "success"}
  94. api.add_resource(ConversationRenameApi, "/conversations/<uuid:c_id>/name", endpoint="web_conversation_name")
  95. api.add_resource(ConversationListApi, "/conversations")
  96. api.add_resource(ConversationApi, "/conversations/<uuid:c_id>")
  97. api.add_resource(ConversationPinApi, "/conversations/<uuid:c_id>/pin")
  98. api.add_resource(ConversationUnPinApi, "/conversations/<uuid:c_id>/unpin")