message.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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"], "desc"
  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. args = parser.parse_args()
  59. try:
  60. MessageService.create_feedback(app_model, message_id, current_user, args.get("rating"), args.get("content"))
  61. except services.errors.message.MessageNotExistsError:
  62. raise NotFound("Message Not Exists.")
  63. return {"result": "success"}
  64. class MessageMoreLikeThisApi(InstalledAppResource):
  65. def get(self, installed_app, message_id):
  66. app_model = installed_app.app
  67. if app_model.mode != "completion":
  68. raise NotCompletionAppError()
  69. message_id = str(message_id)
  70. parser = reqparse.RequestParser()
  71. parser.add_argument(
  72. "response_mode", type=str, required=True, choices=["blocking", "streaming"], location="args"
  73. )
  74. args = parser.parse_args()
  75. streaming = args["response_mode"] == "streaming"
  76. try:
  77. response = AppGenerateService.generate_more_like_this(
  78. app_model=app_model,
  79. user=current_user,
  80. message_id=message_id,
  81. invoke_from=InvokeFrom.EXPLORE,
  82. streaming=streaming,
  83. )
  84. return helper.compact_generate_response(response)
  85. except MessageNotExistsError:
  86. raise NotFound("Message Not Exists.")
  87. except MoreLikeThisDisabledError:
  88. raise AppMoreLikeThisDisabledError()
  89. except ProviderTokenNotInitError as ex:
  90. raise ProviderNotInitializeError(ex.description)
  91. except QuotaExceededError:
  92. raise ProviderQuotaExceededError()
  93. except ModelCurrentlyNotSupportError:
  94. raise ProviderModelCurrentlyNotSupportError()
  95. except InvokeError as e:
  96. raise CompletionRequestError(e.description)
  97. except ValueError as e:
  98. raise e
  99. except Exception:
  100. logging.exception("internal server error.")
  101. raise InternalServerError()
  102. class MessageSuggestedQuestionApi(InstalledAppResource):
  103. def get(self, installed_app, message_id):
  104. app_model = installed_app.app
  105. app_mode = AppMode.value_of(app_model.mode)
  106. if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}:
  107. raise NotChatAppError()
  108. message_id = str(message_id)
  109. try:
  110. questions = MessageService.get_suggested_questions_after_answer(
  111. app_model=app_model, user=current_user, message_id=message_id, invoke_from=InvokeFrom.EXPLORE
  112. )
  113. except MessageNotExistsError:
  114. raise NotFound("Message not found")
  115. except ConversationNotExistsError:
  116. raise NotFound("Conversation not found")
  117. except SuggestedQuestionsAfterAnswerDisabledError:
  118. raise AppSuggestedQuestionsAfterAnswerDisabledError()
  119. except ProviderTokenNotInitError as ex:
  120. raise ProviderNotInitializeError(ex.description)
  121. except QuotaExceededError:
  122. raise ProviderQuotaExceededError()
  123. except ModelCurrentlyNotSupportError:
  124. raise ProviderModelCurrentlyNotSupportError()
  125. except InvokeError as e:
  126. raise CompletionRequestError(e.description)
  127. except Exception:
  128. logging.exception("internal server error.")
  129. raise InternalServerError()
  130. return {"data": questions}