message.py 6.3 KB

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