You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

message.py 6.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import logging
  2. from flask_restx import marshal_with, reqparse
  3. from flask_restx.inputs import int_range
  4. from werkzeug.exceptions import InternalServerError, NotFound
  5. from controllers.console.app.error import (
  6. AppMoreLikeThisDisabledError,
  7. CompletionRequestError,
  8. ProviderModelCurrentlyNotSupportError,
  9. ProviderNotInitializeError,
  10. ProviderQuotaExceededError,
  11. )
  12. from controllers.console.explore.error import (
  13. AppSuggestedQuestionsAfterAnswerDisabledError,
  14. NotChatAppError,
  15. NotCompletionAppError,
  16. )
  17. from controllers.console.explore.wraps import InstalledAppResource
  18. from core.app.entities.app_invoke_entities import InvokeFrom
  19. from core.errors.error import ModelCurrentlyNotSupportError, ProviderTokenNotInitError, QuotaExceededError
  20. from core.model_runtime.errors.invoke import InvokeError
  21. from fields.message_fields import message_infinite_scroll_pagination_fields
  22. from libs import helper
  23. from libs.helper import uuid_value
  24. from libs.login import current_user
  25. from models import Account
  26. from models.model import AppMode
  27. from services.app_generate_service import AppGenerateService
  28. from services.errors.app import MoreLikeThisDisabledError
  29. from services.errors.conversation import ConversationNotExistsError
  30. from services.errors.message import (
  31. FirstMessageNotExistsError,
  32. MessageNotExistsError,
  33. SuggestedQuestionsAfterAnswerDisabledError,
  34. )
  35. from services.message_service import MessageService
  36. logger = logging.getLogger(__name__)
  37. class MessageListApi(InstalledAppResource):
  38. @marshal_with(message_infinite_scroll_pagination_fields)
  39. def get(self, installed_app):
  40. app_model = installed_app.app
  41. app_mode = AppMode.value_of(app_model.mode)
  42. if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}:
  43. raise NotChatAppError()
  44. parser = reqparse.RequestParser()
  45. parser.add_argument("conversation_id", required=True, type=uuid_value, location="args")
  46. parser.add_argument("first_id", type=uuid_value, location="args")
  47. parser.add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args")
  48. args = parser.parse_args()
  49. try:
  50. if not isinstance(current_user, Account):
  51. raise ValueError("current_user must be an Account instance")
  52. return MessageService.pagination_by_first_id(
  53. app_model, current_user, args["conversation_id"], args["first_id"], args["limit"]
  54. )
  55. except ConversationNotExistsError:
  56. raise NotFound("Conversation Not Exists.")
  57. except FirstMessageNotExistsError:
  58. raise NotFound("First Message Not Exists.")
  59. class MessageFeedbackApi(InstalledAppResource):
  60. def post(self, installed_app, message_id):
  61. app_model = installed_app.app
  62. message_id = str(message_id)
  63. parser = reqparse.RequestParser()
  64. parser.add_argument("rating", type=str, choices=["like", "dislike", None], location="json")
  65. parser.add_argument("content", type=str, location="json")
  66. args = parser.parse_args()
  67. try:
  68. if not isinstance(current_user, Account):
  69. raise ValueError("current_user must be an Account instance")
  70. MessageService.create_feedback(
  71. app_model=app_model,
  72. message_id=message_id,
  73. user=current_user,
  74. rating=args.get("rating"),
  75. content=args.get("content"),
  76. )
  77. except MessageNotExistsError:
  78. raise NotFound("Message Not Exists.")
  79. return {"result": "success"}
  80. class MessageMoreLikeThisApi(InstalledAppResource):
  81. def get(self, installed_app, message_id):
  82. app_model = installed_app.app
  83. if app_model.mode != "completion":
  84. raise NotCompletionAppError()
  85. message_id = str(message_id)
  86. parser = reqparse.RequestParser()
  87. parser.add_argument(
  88. "response_mode", type=str, required=True, choices=["blocking", "streaming"], location="args"
  89. )
  90. args = parser.parse_args()
  91. streaming = args["response_mode"] == "streaming"
  92. try:
  93. if not isinstance(current_user, Account):
  94. raise ValueError("current_user must be an Account instance")
  95. response = AppGenerateService.generate_more_like_this(
  96. app_model=app_model,
  97. user=current_user,
  98. message_id=message_id,
  99. invoke_from=InvokeFrom.EXPLORE,
  100. streaming=streaming,
  101. )
  102. return helper.compact_generate_response(response)
  103. except MessageNotExistsError:
  104. raise NotFound("Message Not Exists.")
  105. except MoreLikeThisDisabledError:
  106. raise AppMoreLikeThisDisabledError()
  107. except ProviderTokenNotInitError as ex:
  108. raise ProviderNotInitializeError(ex.description)
  109. except QuotaExceededError:
  110. raise ProviderQuotaExceededError()
  111. except ModelCurrentlyNotSupportError:
  112. raise ProviderModelCurrentlyNotSupportError()
  113. except InvokeError as e:
  114. raise CompletionRequestError(e.description)
  115. except ValueError as e:
  116. raise e
  117. except Exception:
  118. logger.exception("internal server error.")
  119. raise InternalServerError()
  120. class MessageSuggestedQuestionApi(InstalledAppResource):
  121. def get(self, installed_app, message_id):
  122. app_model = installed_app.app
  123. app_mode = AppMode.value_of(app_model.mode)
  124. if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}:
  125. raise NotChatAppError()
  126. message_id = str(message_id)
  127. try:
  128. if not isinstance(current_user, Account):
  129. raise ValueError("current_user must be an Account instance")
  130. questions = MessageService.get_suggested_questions_after_answer(
  131. app_model=app_model, user=current_user, message_id=message_id, invoke_from=InvokeFrom.EXPLORE
  132. )
  133. except MessageNotExistsError:
  134. raise NotFound("Message not found")
  135. except ConversationNotExistsError:
  136. raise NotFound("Conversation not found")
  137. except SuggestedQuestionsAfterAnswerDisabledError:
  138. raise AppSuggestedQuestionsAfterAnswerDisabledError()
  139. except ProviderTokenNotInitError as ex:
  140. raise ProviderNotInitializeError(ex.description)
  141. except QuotaExceededError:
  142. raise ProviderQuotaExceededError()
  143. except ModelCurrentlyNotSupportError:
  144. raise ProviderModelCurrentlyNotSupportError()
  145. except InvokeError as e:
  146. raise CompletionRequestError(e.description)
  147. except Exception:
  148. logger.exception("internal server error.")
  149. raise InternalServerError()
  150. return {"data": questions}