conversation.py 5.6 KB

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