| 
									
										
										
										
											2025-04-17 15:07:23 +08:00
										 |  |  | import logging | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-29 23:04:04 +08:00
										 |  |  | import yaml | 
					
						
							| 
									
										
										
										
											2025-04-27 14:31:19 +08:00
										 |  |  | from flask import request | 
					
						
							| 
									
										
										
										
											2025-05-16 12:02:35 +08:00
										 |  |  | from flask_restful import Resource, reqparse | 
					
						
							|  |  |  | from sqlalchemy.orm import Session | 
					
						
							| 
									
										
										
										
											2025-04-17 15:07:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | from controllers.console import api | 
					
						
							|  |  |  | from controllers.console.wraps import ( | 
					
						
							|  |  |  |     account_initialization_required, | 
					
						
							|  |  |  |     enterprise_license_required, | 
					
						
							|  |  |  |     setup_required, | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2025-05-16 12:02:35 +08:00
										 |  |  | from extensions.ext_database import db | 
					
						
							| 
									
										
										
										
											2025-04-27 14:31:19 +08:00
										 |  |  | from libs.login import login_required | 
					
						
							| 
									
										
										
										
											2025-05-29 23:04:04 +08:00
										 |  |  | from models.dataset import PipelineCustomizedTemplate | 
					
						
							| 
									
										
										
										
											2025-04-17 15:07:23 +08:00
										 |  |  | from services.entities.knowledge_entities.rag_pipeline_entities import PipelineTemplateInfoEntity | 
					
						
							|  |  |  | from services.rag_pipeline.rag_pipeline import RagPipelineService | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | logger = logging.getLogger(__name__) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def _validate_name(name): | 
					
						
							|  |  |  |     if not name or len(name) < 1 or len(name) > 40: | 
					
						
							|  |  |  |         raise ValueError("Name must be between 1 to 40 characters.") | 
					
						
							|  |  |  |     return name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def _validate_description_length(description): | 
					
						
							|  |  |  |     if len(description) > 400: | 
					
						
							|  |  |  |         raise ValueError("Description cannot exceed 400 characters.") | 
					
						
							|  |  |  |     return description | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PipelineTemplateListApi(Resource): | 
					
						
							|  |  |  |     @setup_required | 
					
						
							|  |  |  |     @login_required | 
					
						
							|  |  |  |     @account_initialization_required | 
					
						
							|  |  |  |     @enterprise_license_required | 
					
						
							|  |  |  |     def get(self): | 
					
						
							| 
									
										
										
										
											2025-05-16 17:22:17 +08:00
										 |  |  |         type = request.args.get("type", default="built-in", type=str) | 
					
						
							| 
									
										
										
										
											2025-04-17 15:07:23 +08:00
										 |  |  |         language = request.args.get("language", default="en-US", type=str) | 
					
						
							|  |  |  |         # get pipeline templates | 
					
						
							|  |  |  |         pipeline_templates = RagPipelineService.get_pipeline_templates(type, language) | 
					
						
							|  |  |  |         return pipeline_templates, 200 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PipelineTemplateDetailApi(Resource): | 
					
						
							|  |  |  |     @setup_required | 
					
						
							|  |  |  |     @login_required | 
					
						
							|  |  |  |     @account_initialization_required | 
					
						
							|  |  |  |     @enterprise_license_required | 
					
						
							| 
									
										
										
										
											2025-05-23 17:11:56 +08:00
										 |  |  |     def get(self, template_id: str): | 
					
						
							|  |  |  |         pipeline_template = RagPipelineService.get_pipeline_template_detail(template_id) | 
					
						
							| 
									
										
										
										
											2025-04-17 15:07:23 +08:00
										 |  |  |         return pipeline_template, 200 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CustomizedPipelineTemplateApi(Resource): | 
					
						
							|  |  |  |     @setup_required | 
					
						
							|  |  |  |     @login_required | 
					
						
							|  |  |  |     @account_initialization_required | 
					
						
							|  |  |  |     @enterprise_license_required | 
					
						
							|  |  |  |     def patch(self, template_id: str): | 
					
						
							|  |  |  |         parser = reqparse.RequestParser() | 
					
						
							|  |  |  |         parser.add_argument( | 
					
						
							|  |  |  |             "name", | 
					
						
							|  |  |  |             nullable=False, | 
					
						
							|  |  |  |             required=True, | 
					
						
							|  |  |  |             help="Name must be between 1 to 40 characters.", | 
					
						
							|  |  |  |             type=_validate_name, | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         parser.add_argument( | 
					
						
							|  |  |  |             "description", | 
					
						
							|  |  |  |             type=str, | 
					
						
							|  |  |  |             nullable=True, | 
					
						
							|  |  |  |             required=False, | 
					
						
							|  |  |  |             default="", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         parser.add_argument( | 
					
						
							|  |  |  |             "icon_info", | 
					
						
							|  |  |  |             type=dict, | 
					
						
							|  |  |  |             location="json", | 
					
						
							|  |  |  |             nullable=True, | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         args = parser.parse_args() | 
					
						
							|  |  |  |         pipeline_template_info = PipelineTemplateInfoEntity(**args) | 
					
						
							| 
									
										
										
										
											2025-05-29 23:04:04 +08:00
										 |  |  |         RagPipelineService.update_customized_pipeline_template(template_id, pipeline_template_info) | 
					
						
							|  |  |  |         return 200 | 
					
						
							| 
									
										
										
										
											2025-04-17 15:07:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @setup_required | 
					
						
							|  |  |  |     @login_required | 
					
						
							|  |  |  |     @account_initialization_required | 
					
						
							|  |  |  |     @enterprise_license_required | 
					
						
							|  |  |  |     def delete(self, template_id: str): | 
					
						
							|  |  |  |         RagPipelineService.delete_customized_pipeline_template(template_id) | 
					
						
							|  |  |  |         return 200 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-16 12:02:35 +08:00
										 |  |  |     @setup_required | 
					
						
							|  |  |  |     @login_required | 
					
						
							|  |  |  |     @account_initialization_required | 
					
						
							|  |  |  |     @enterprise_license_required | 
					
						
							|  |  |  |     def post(self, template_id: str): | 
					
						
							|  |  |  |         with Session(db.engine) as session: | 
					
						
							| 
									
										
										
										
											2025-05-16 18:42:07 +08:00
										 |  |  |             template = ( | 
					
						
							|  |  |  |                 session.query(PipelineCustomizedTemplate).filter(PipelineCustomizedTemplate.id == template_id).first() | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2025-05-16 13:45:47 +08:00
										 |  |  |             if not template: | 
					
						
							|  |  |  |                 raise ValueError("Customized pipeline template not found.") | 
					
						
							| 
									
										
										
										
											2025-05-16 17:22:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-29 23:04:04 +08:00
										 |  |  |             dsl = yaml.safe_load(template.yaml_content) | 
					
						
							| 
									
										
										
										
											2025-05-16 12:02:35 +08:00
										 |  |  |         return {"data": dsl}, 200 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-29 23:04:04 +08:00
										 |  |  | class CustomizedPipelineTemplateApi(Resource): | 
					
						
							|  |  |  |     @setup_required | 
					
						
							|  |  |  |     @login_required | 
					
						
							|  |  |  |     @account_initialization_required | 
					
						
							|  |  |  |     @enterprise_license_required | 
					
						
							|  |  |  |     def post(self, pipeline_id: str): | 
					
						
							|  |  |  |         parser = reqparse.RequestParser() | 
					
						
							|  |  |  |         parser.add_argument( | 
					
						
							|  |  |  |             "name", | 
					
						
							|  |  |  |             nullable=False, | 
					
						
							|  |  |  |             required=True, | 
					
						
							|  |  |  |             help="Name must be between 1 to 40 characters.", | 
					
						
							|  |  |  |             type=_validate_name, | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         parser.add_argument( | 
					
						
							|  |  |  |             "description", | 
					
						
							|  |  |  |             type=str, | 
					
						
							|  |  |  |             nullable=True, | 
					
						
							|  |  |  |             required=False, | 
					
						
							|  |  |  |             default="", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         parser.add_argument( | 
					
						
							|  |  |  |             "icon_info", | 
					
						
							|  |  |  |             type=dict, | 
					
						
							|  |  |  |             location="json", | 
					
						
							|  |  |  |             nullable=True, | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         args = parser.parse_args() | 
					
						
							|  |  |  |         rag_pipeline_service = RagPipelineService() | 
					
						
							|  |  |  |         RagPipelineService.publish_customized_pipeline_template(pipeline_id, args) | 
					
						
							|  |  |  |         return 200 | 
					
						
							| 
									
										
										
										
											2025-04-17 15:07:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | api.add_resource( | 
					
						
							|  |  |  |     PipelineTemplateListApi, | 
					
						
							|  |  |  |     "/rag/pipeline/templates", | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | api.add_resource( | 
					
						
							|  |  |  |     PipelineTemplateDetailApi, | 
					
						
							| 
									
										
										
										
											2025-05-23 17:11:56 +08:00
										 |  |  |     "/rag/pipeline/templates/<string:template_id>", | 
					
						
							| 
									
										
										
										
											2025-04-17 15:07:23 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | api.add_resource( | 
					
						
							|  |  |  |     CustomizedPipelineTemplateApi, | 
					
						
							| 
									
										
										
										
											2025-05-16 12:02:35 +08:00
										 |  |  |     "/rag/pipeline/customized/templates/<string:template_id>", | 
					
						
							| 
									
										
										
										
											2025-04-17 15:07:23 +08:00
										 |  |  | ) |