Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

message.py 6.3KB

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