Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

message.py 6.2KB

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