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.

annotation.py 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. from flask import request
  2. from flask_restful import Resource, marshal, marshal_with, reqparse
  3. from werkzeug.exceptions import Forbidden
  4. from controllers.service_api import api
  5. from controllers.service_api.wraps import validate_app_token
  6. from extensions.ext_redis import redis_client
  7. from fields.annotation_fields import (
  8. annotation_fields,
  9. )
  10. from libs.login import current_user
  11. from models.model import App, EndUser
  12. from services.annotation_service import AppAnnotationService
  13. class AnnotationReplyActionApi(Resource):
  14. @validate_app_token
  15. def post(self, app_model: App, end_user: EndUser, action):
  16. parser = reqparse.RequestParser()
  17. parser.add_argument("score_threshold", required=True, type=float, location="json")
  18. parser.add_argument("embedding_provider_name", required=True, type=str, location="json")
  19. parser.add_argument("embedding_model_name", required=True, type=str, location="json")
  20. args = parser.parse_args()
  21. if action == "enable":
  22. result = AppAnnotationService.enable_app_annotation(args, app_model.id)
  23. elif action == "disable":
  24. result = AppAnnotationService.disable_app_annotation(app_model.id)
  25. else:
  26. raise ValueError("Unsupported annotation reply action")
  27. return result, 200
  28. class AnnotationReplyActionStatusApi(Resource):
  29. @validate_app_token
  30. def get(self, app_model: App, end_user: EndUser, job_id, action):
  31. job_id = str(job_id)
  32. app_annotation_job_key = "{}_app_annotation_job_{}".format(action, str(job_id))
  33. cache_result = redis_client.get(app_annotation_job_key)
  34. if cache_result is None:
  35. raise ValueError("The job does not exist.")
  36. job_status = cache_result.decode()
  37. error_msg = ""
  38. if job_status == "error":
  39. app_annotation_error_key = "{}_app_annotation_error_{}".format(action, str(job_id))
  40. error_msg = redis_client.get(app_annotation_error_key).decode()
  41. return {"job_id": job_id, "job_status": job_status, "error_msg": error_msg}, 200
  42. class AnnotationListApi(Resource):
  43. @validate_app_token
  44. def get(self, app_model: App, end_user: EndUser):
  45. page = request.args.get("page", default=1, type=int)
  46. limit = request.args.get("limit", default=20, type=int)
  47. keyword = request.args.get("keyword", default="", type=str)
  48. annotation_list, total = AppAnnotationService.get_annotation_list_by_app_id(app_model.id, page, limit, keyword)
  49. response = {
  50. "data": marshal(annotation_list, annotation_fields),
  51. "has_more": len(annotation_list) == limit,
  52. "limit": limit,
  53. "total": total,
  54. "page": page,
  55. }
  56. return response, 200
  57. @validate_app_token
  58. @marshal_with(annotation_fields)
  59. def post(self, app_model: App, end_user: EndUser):
  60. parser = reqparse.RequestParser()
  61. parser.add_argument("question", required=True, type=str, location="json")
  62. parser.add_argument("answer", required=True, type=str, location="json")
  63. args = parser.parse_args()
  64. annotation = AppAnnotationService.insert_app_annotation_directly(args, app_model.id)
  65. return annotation
  66. class AnnotationUpdateDeleteApi(Resource):
  67. @validate_app_token
  68. @marshal_with(annotation_fields)
  69. def put(self, app_model: App, end_user: EndUser, annotation_id):
  70. if not current_user.is_editor:
  71. raise Forbidden()
  72. annotation_id = str(annotation_id)
  73. parser = reqparse.RequestParser()
  74. parser.add_argument("question", required=True, type=str, location="json")
  75. parser.add_argument("answer", required=True, type=str, location="json")
  76. args = parser.parse_args()
  77. annotation = AppAnnotationService.update_app_annotation_directly(args, app_model.id, annotation_id)
  78. return annotation
  79. @validate_app_token
  80. def delete(self, app_model: App, end_user: EndUser, annotation_id):
  81. if not current_user.is_editor:
  82. raise Forbidden()
  83. annotation_id = str(annotation_id)
  84. AppAnnotationService.delete_app_annotation(app_model.id, annotation_id)
  85. return {"result": "success"}, 204
  86. api.add_resource(AnnotationReplyActionApi, "/apps/annotation-reply/<string:action>")
  87. api.add_resource(AnnotationReplyActionStatusApi, "/apps/annotation-reply/<string:action>/status/<uuid:job_id>")
  88. api.add_resource(AnnotationListApi, "/apps/annotations")
  89. api.add_resource(AnnotationUpdateDeleteApi, "/apps/annotations/<uuid:annotation_id>")