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.

rag_pipeline_datasets.py 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. from flask_login import current_user # type: ignore # type: ignore
  2. from flask_restx import Resource, marshal, reqparse # type: ignore
  3. from sqlalchemy.orm import Session
  4. from werkzeug.exceptions import Forbidden
  5. import services
  6. from controllers.console import api
  7. from controllers.console.datasets.error import DatasetNameDuplicateError
  8. from controllers.console.wraps import (
  9. account_initialization_required,
  10. cloud_edition_billing_rate_limit_check,
  11. setup_required,
  12. )
  13. from extensions.ext_database import db
  14. from fields.dataset_fields import dataset_detail_fields
  15. from libs.login import login_required
  16. from models.dataset import DatasetPermissionEnum
  17. from services.dataset_service import DatasetPermissionService, DatasetService
  18. from services.entities.knowledge_entities.rag_pipeline_entities import IconInfo, RagPipelineDatasetCreateEntity
  19. from services.rag_pipeline.rag_pipeline_dsl_service import RagPipelineDslService
  20. def _validate_name(name):
  21. if not name or len(name) < 1 or len(name) > 40:
  22. raise ValueError("Name must be between 1 to 40 characters.")
  23. return name
  24. def _validate_description_length(description):
  25. if len(description) > 400:
  26. raise ValueError("Description cannot exceed 400 characters.")
  27. return description
  28. class CreateRagPipelineDatasetApi(Resource):
  29. @setup_required
  30. @login_required
  31. @account_initialization_required
  32. @cloud_edition_billing_rate_limit_check("knowledge")
  33. def post(self):
  34. parser = reqparse.RequestParser()
  35. parser.add_argument(
  36. "yaml_content",
  37. type=str,
  38. nullable=False,
  39. required=True,
  40. help="yaml_content is required.",
  41. )
  42. args = parser.parse_args()
  43. # The role of the current user in the ta table must be admin, owner, or editor, or dataset_operator
  44. if not current_user.is_dataset_editor:
  45. raise Forbidden()
  46. rag_pipeline_dataset_create_entity = RagPipelineDatasetCreateEntity(
  47. name="",
  48. description="",
  49. icon_info=IconInfo(
  50. icon="📙",
  51. icon_background="#FFF4ED",
  52. icon_type="emoji",
  53. ),
  54. permission=DatasetPermissionEnum.ONLY_ME,
  55. partial_member_list=None,
  56. yaml_content=args["yaml_content"],
  57. )
  58. try:
  59. with Session(db.engine) as session:
  60. rag_pipeline_dsl_service = RagPipelineDslService(session)
  61. import_info = rag_pipeline_dsl_service.create_rag_pipeline_dataset(
  62. tenant_id=current_user.current_tenant_id,
  63. rag_pipeline_dataset_create_entity=rag_pipeline_dataset_create_entity,
  64. )
  65. if rag_pipeline_dataset_create_entity.permission == "partial_members":
  66. DatasetPermissionService.update_partial_member_list(
  67. current_user.current_tenant_id,
  68. import_info["dataset_id"],
  69. rag_pipeline_dataset_create_entity.partial_member_list,
  70. )
  71. except services.errors.dataset.DatasetNameDuplicateError:
  72. raise DatasetNameDuplicateError()
  73. return import_info, 201
  74. class CreateEmptyRagPipelineDatasetApi(Resource):
  75. @setup_required
  76. @login_required
  77. @account_initialization_required
  78. @cloud_edition_billing_rate_limit_check("knowledge")
  79. def post(self):
  80. # The role of the current user in the ta table must be admin, owner, or editor, or dataset_operator
  81. if not current_user.is_dataset_editor:
  82. raise Forbidden()
  83. dataset = DatasetService.create_empty_rag_pipeline_dataset(
  84. tenant_id=current_user.current_tenant_id,
  85. rag_pipeline_dataset_create_entity=RagPipelineDatasetCreateEntity(
  86. name="",
  87. description="",
  88. icon_info=IconInfo(
  89. icon="📙",
  90. icon_background="#FFF4ED",
  91. icon_type="emoji",
  92. ),
  93. permission=DatasetPermissionEnum.ONLY_ME,
  94. partial_member_list=None,
  95. ),
  96. )
  97. return marshal(dataset, dataset_detail_fields), 201
  98. api.add_resource(CreateRagPipelineDatasetApi, "/rag/pipeline/dataset")
  99. api.add_resource(CreateEmptyRagPipelineDatasetApi, "/rag/pipeline/empty-dataset")