From 4488c090b20e9ae6d1373aa4be40eca615641cf4 Mon Sep 17 00:00:00 2001 From: Asuka Minato Date: Sun, 19 Oct 2025 12:54:41 +0900 Subject: [PATCH] fluent api (#27093) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- api/controllers/console/admin.py | 20 +- .../console/app/advanced_prompt_template.py | 12 +- api/controllers/console/app/agent.py | 8 +- api/controllers/console/app/annotation.py | 29 +- api/controllers/console/app/app.py | 125 ++++---- api/controllers/console/app/app_import.py | 22 +- api/controllers/console/app/audio.py | 15 +- api/controllers/console/app/completion.py | 36 ++- api/controllers/console/app/conversation.py | 62 ++-- .../console/app/conversation_variables.py | 3 +- api/controllers/console/app/generator.py | 51 ++-- api/controllers/console/app/mcp_server.py | 20 +- api/controllers/console/app/message.py | 30 +- api/controllers/console/app/ops_trace.py | 22 +- api/controllers/console/app/site.py | 42 +-- api/controllers/console/app/statistic.py | 64 ++-- api/controllers/console/app/workflow.py | 101 ++++--- .../console/app/workflow_app_log.py | 54 ++-- .../console/app/workflow_draft_variable.py | 29 +- .../console/app/workflow_statistic.py | 32 +- api/controllers/console/auth/activate.py | 30 +- .../console/auth/data_source_bearer_auth.py | 10 +- .../console/auth/email_register.py | 28 +- .../console/auth/forgot_password.py | 28 +- api/controllers/console/auth/login.py | 41 +-- api/controllers/console/auth/oauth_server.py | 20 +- api/controllers/console/billing/billing.py | 8 +- api/controllers/console/billing/compliance.py | 3 +- .../console/datasets/data_source.py | 12 +- api/controllers/console/datasets/datasets.py | 246 ++++++++-------- .../console/datasets/datasets_document.py | 70 ++--- .../console/datasets/datasets_segments.py | 70 +++-- api/controllers/console/datasets/external.py | 112 +++---- .../console/datasets/hit_testing_base.py | 11 +- api/controllers/console/datasets/metadata.py | 16 +- .../datasets/rag_pipeline/datasource_auth.py | 44 +-- .../datasource_content_preview.py | 10 +- .../datasets/rag_pipeline/rag_pipeline.py | 84 +++--- .../rag_pipeline/rag_pipeline_datasets.py | 4 +- .../rag_pipeline_draft_variable.py | 29 +- .../rag_pipeline/rag_pipeline_import.py | 25 +- .../rag_pipeline/rag_pipeline_workflow.py | 144 ++++----- api/controllers/console/datasets/website.py | 25 +- api/controllers/console/explore/audio.py | 12 +- api/controllers/console/explore/completion.py | 30 +- .../console/explore/conversation.py | 18 +- .../console/explore/installed_app.py | 6 +- api/controllers/console/explore/message.py | 21 +- .../console/explore/recommended_app.py | 3 +- .../console/explore/saved_message.py | 11 +- api/controllers/console/explore/workflow.py | 8 +- api/controllers/console/extension.py | 23 +- api/controllers/console/init_validate.py | 3 +- api/controllers/console/remote_files.py | 3 +- api/controllers/console/setup.py | 10 +- api/controllers/console/tag/tags.py | 53 ++-- api/controllers/console/version.py | 3 +- api/controllers/console/workspace/account.py | 104 ++++--- api/controllers/console/workspace/endpoint.py | 47 +-- .../workspace/load_balancing_config.py | 44 +-- api/controllers/console/workspace/members.py | 29 +- .../console/workspace/model_providers.py | 44 +-- api/controllers/console/workspace/models.py | 239 ++++++++------- api/controllers/console/workspace/plugin.py | 130 +++++---- .../console/workspace/tool_providers.py | 251 ++++++++-------- .../console/workspace/workspace.py | 22 +- api/controllers/files/image_preview.py | 12 +- api/controllers/files/tool_files.py | 13 +- api/controllers/files/upload.py | 22 +- api/controllers/inner_api/mail.py | 12 +- api/controllers/inner_api/plugin/wraps.py | 8 +- .../inner_api/workspace/workspace.py | 11 +- api/controllers/mcp/mcp.py | 14 +- api/controllers/service_api/app/annotation.py | 24 +- api/controllers/service_api/app/audio.py | 12 +- api/controllers/service_api/app/completion.py | 54 ++-- .../service_api/app/conversation.py | 87 +++--- .../service_api/app/file_preview.py | 3 +- api/controllers/service_api/app/message.py | 42 ++- api/controllers/service_api/app/workflow.py | 52 ++-- .../service_api/dataset/dataset.py | 274 +++++++++--------- .../service_api/dataset/document.py | 50 ++-- .../service_api/dataset/metadata.py | 16 +- .../rag_pipeline/rag_pipeline_workflow.py | 40 +-- .../service_api/dataset/segment.py | 38 ++- api/controllers/web/app.py | 11 +- api/controllers/web/audio.py | 12 +- api/controllers/web/completion.py | 32 +- api/controllers/web/conversation.py | 32 +- api/controllers/web/forgot_password.py | 28 +- api/controllers/web/login.py | 26 +- api/controllers/web/message.py | 21 +- api/controllers/web/remote_files.py | 3 +- api/controllers/web/saved_message.py | 11 +- api/controllers/web/workflow.py | 8 +- .../services/test_metadata_bug_complete.py | 24 +- .../services/test_metadata_nullable_bug.py | 24 +- 97 files changed, 2179 insertions(+), 1798 deletions(-) diff --git a/api/controllers/console/admin.py b/api/controllers/console/admin.py index 93f242ad28..ef96184678 100644 --- a/api/controllers/console/admin.py +++ b/api/controllers/console/admin.py @@ -70,15 +70,17 @@ class InsertExploreAppListApi(Resource): @only_edition_cloud @admin_required def post(self): - parser = reqparse.RequestParser() - parser.add_argument("app_id", type=str, required=True, nullable=False, location="json") - parser.add_argument("desc", type=str, location="json") - parser.add_argument("copyright", type=str, location="json") - parser.add_argument("privacy_policy", type=str, location="json") - parser.add_argument("custom_disclaimer", type=str, location="json") - parser.add_argument("language", type=supported_language, required=True, nullable=False, location="json") - parser.add_argument("category", type=str, required=True, nullable=False, location="json") - parser.add_argument("position", type=int, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("app_id", type=str, required=True, nullable=False, location="json") + .add_argument("desc", type=str, location="json") + .add_argument("copyright", type=str, location="json") + .add_argument("privacy_policy", type=str, location="json") + .add_argument("custom_disclaimer", type=str, location="json") + .add_argument("language", type=supported_language, required=True, nullable=False, location="json") + .add_argument("category", type=str, required=True, nullable=False, location="json") + .add_argument("position", type=int, required=True, nullable=False, location="json") + ) args = parser.parse_args() app = db.session.execute(select(App).where(App.id == args["app_id"])).scalar_one_or_none() diff --git a/api/controllers/console/app/advanced_prompt_template.py b/api/controllers/console/app/advanced_prompt_template.py index 315825db79..5885d7b447 100644 --- a/api/controllers/console/app/advanced_prompt_template.py +++ b/api/controllers/console/app/advanced_prompt_template.py @@ -25,11 +25,13 @@ class AdvancedPromptTemplateList(Resource): @login_required @account_initialization_required def get(self): - parser = reqparse.RequestParser() - parser.add_argument("app_mode", type=str, required=True, location="args") - parser.add_argument("model_mode", type=str, required=True, location="args") - parser.add_argument("has_context", type=str, required=False, default="true", location="args") - parser.add_argument("model_name", type=str, required=True, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("app_mode", type=str, required=True, location="args") + .add_argument("model_mode", type=str, required=True, location="args") + .add_argument("has_context", type=str, required=False, default="true", location="args") + .add_argument("model_name", type=str, required=True, location="args") + ) args = parser.parse_args() return AdvancedPromptTemplateService.get_prompt(args) diff --git a/api/controllers/console/app/agent.py b/api/controllers/console/app/agent.py index c063f336c7..717263a74d 100644 --- a/api/controllers/console/app/agent.py +++ b/api/controllers/console/app/agent.py @@ -27,9 +27,11 @@ class AgentLogApi(Resource): @get_app_model(mode=[AppMode.AGENT_CHAT]) def get(self, app_model): """Get agent logs""" - parser = reqparse.RequestParser() - parser.add_argument("message_id", type=uuid_value, required=True, location="args") - parser.add_argument("conversation_id", type=uuid_value, required=True, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("message_id", type=uuid_value, required=True, location="args") + .add_argument("conversation_id", type=uuid_value, required=True, location="args") + ) args = parser.parse_args() diff --git a/api/controllers/console/app/annotation.py b/api/controllers/console/app/annotation.py index 3e549d869e..932214058a 100644 --- a/api/controllers/console/app/annotation.py +++ b/api/controllers/console/app/annotation.py @@ -44,10 +44,12 @@ class AnnotationReplyActionApi(Resource): @edit_permission_required def post(self, app_id, action: Literal["enable", "disable"]): app_id = str(app_id) - parser = reqparse.RequestParser() - parser.add_argument("score_threshold", required=True, type=float, location="json") - parser.add_argument("embedding_provider_name", required=True, type=str, location="json") - parser.add_argument("embedding_model_name", required=True, type=str, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("score_threshold", required=True, type=float, location="json") + .add_argument("embedding_provider_name", required=True, type=str, location="json") + .add_argument("embedding_model_name", required=True, type=str, location="json") + ) args = parser.parse_args() if action == "enable": result = AppAnnotationService.enable_app_annotation(args, app_id) @@ -98,8 +100,7 @@ class AppAnnotationSettingUpdateApi(Resource): app_id = str(app_id) annotation_setting_id = str(annotation_setting_id) - parser = reqparse.RequestParser() - parser.add_argument("score_threshold", required=True, type=float, location="json") + parser = reqparse.RequestParser().add_argument("score_threshold", required=True, type=float, location="json") args = parser.parse_args() result = AppAnnotationService.update_app_annotation_setting(app_id, annotation_setting_id, args) @@ -190,9 +191,11 @@ class AnnotationApi(Resource): @edit_permission_required def post(self, app_id): app_id = str(app_id) - parser = reqparse.RequestParser() - parser.add_argument("question", required=True, type=str, location="json") - parser.add_argument("answer", required=True, type=str, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("question", required=True, type=str, location="json") + .add_argument("answer", required=True, type=str, location="json") + ) args = parser.parse_args() annotation = AppAnnotationService.insert_app_annotation_directly(args, app_id) return annotation @@ -259,9 +262,11 @@ class AnnotationUpdateDeleteApi(Resource): def post(self, app_id, annotation_id): app_id = str(app_id) annotation_id = str(annotation_id) - parser = reqparse.RequestParser() - parser.add_argument("question", required=True, type=str, location="json") - parser.add_argument("answer", required=True, type=str, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("question", required=True, type=str, location="json") + .add_argument("answer", required=True, type=str, location="json") + ) args = parser.parse_args() annotation = AppAnnotationService.update_app_annotation_directly(args, app_id, annotation_id) return annotation diff --git a/api/controllers/console/app/app.py b/api/controllers/console/app/app.py index 3900f5a6eb..17505d69b2 100644 --- a/api/controllers/console/app/app.py +++ b/api/controllers/console/app/app.py @@ -63,28 +63,30 @@ class AppListApi(Resource): except ValueError: abort(400, message="Invalid UUID format in tag_ids.") - parser = reqparse.RequestParser() - parser.add_argument("page", type=inputs.int_range(1, 99999), required=False, default=1, location="args") - parser.add_argument("limit", type=inputs.int_range(1, 100), required=False, default=20, location="args") - parser.add_argument( - "mode", - type=str, - choices=[ - "completion", - "chat", - "advanced-chat", - "workflow", - "agent-chat", - "channel", - "all", - ], - default="all", - location="args", - required=False, + parser = ( + reqparse.RequestParser() + .add_argument("page", type=inputs.int_range(1, 99999), required=False, default=1, location="args") + .add_argument("limit", type=inputs.int_range(1, 100), required=False, default=20, location="args") + .add_argument( + "mode", + type=str, + choices=[ + "completion", + "chat", + "advanced-chat", + "workflow", + "agent-chat", + "channel", + "all", + ], + default="all", + location="args", + required=False, + ) + .add_argument("name", type=str, location="args", required=False) + .add_argument("tag_ids", type=uuid_list, location="args", required=False) + .add_argument("is_created_by_me", type=inputs.boolean, location="args", required=False) ) - parser.add_argument("name", type=str, location="args", required=False) - parser.add_argument("tag_ids", type=uuid_list, location="args", required=False) - parser.add_argument("is_created_by_me", type=inputs.boolean, location="args", required=False) args = parser.parse_args() @@ -133,13 +135,15 @@ class AppListApi(Resource): def post(self): """Create app""" current_user, current_tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("name", type=str, required=True, location="json") - parser.add_argument("description", type=validate_description_length, location="json") - parser.add_argument("mode", type=str, choices=ALLOW_CREATE_APP_MODES, location="json") - parser.add_argument("icon_type", type=str, location="json") - parser.add_argument("icon", type=str, location="json") - parser.add_argument("icon_background", type=str, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("name", type=str, required=True, location="json") + .add_argument("description", type=validate_description_length, location="json") + .add_argument("mode", type=str, choices=ALLOW_CREATE_APP_MODES, location="json") + .add_argument("icon_type", type=str, location="json") + .add_argument("icon", type=str, location="json") + .add_argument("icon_background", type=str, location="json") + ) args = parser.parse_args() if "mode" not in args or args["mode"] is None: @@ -203,14 +207,16 @@ class AppApi(Resource): @marshal_with(app_detail_fields_with_site) def put(self, app_model): """Update app""" - parser = reqparse.RequestParser() - parser.add_argument("name", type=str, required=True, nullable=False, location="json") - parser.add_argument("description", type=validate_description_length, location="json") - parser.add_argument("icon_type", type=str, location="json") - parser.add_argument("icon", type=str, location="json") - parser.add_argument("icon_background", type=str, location="json") - parser.add_argument("use_icon_as_answer_icon", type=bool, location="json") - parser.add_argument("max_active_requests", type=int, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("name", type=str, required=True, nullable=False, location="json") + .add_argument("description", type=validate_description_length, location="json") + .add_argument("icon_type", type=str, location="json") + .add_argument("icon", type=str, location="json") + .add_argument("icon_background", type=str, location="json") + .add_argument("use_icon_as_answer_icon", type=bool, location="json") + .add_argument("max_active_requests", type=int, location="json") + ) args = parser.parse_args() app_service = AppService() @@ -278,12 +284,14 @@ class AppCopyApi(Resource): # The role of the current user in the ta table must be admin, owner, or editor current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("name", type=str, location="json") - parser.add_argument("description", type=validate_description_length, location="json") - parser.add_argument("icon_type", type=str, location="json") - parser.add_argument("icon", type=str, location="json") - parser.add_argument("icon_background", type=str, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("name", type=str, location="json") + .add_argument("description", type=validate_description_length, location="json") + .add_argument("icon_type", type=str, location="json") + .add_argument("icon", type=str, location="json") + .add_argument("icon_background", type=str, location="json") + ) args = parser.parse_args() with Session(db.engine) as session: @@ -331,9 +339,11 @@ class AppExportApi(Resource): def get(self, app_model): """Export app""" # Add include_secret params - parser = reqparse.RequestParser() - parser.add_argument("include_secret", type=inputs.boolean, default=False, location="args") - parser.add_argument("workflow_id", type=str, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("include_secret", type=inputs.boolean, default=False, location="args") + .add_argument("workflow_id", type=str, location="args") + ) args = parser.parse_args() return { @@ -357,8 +367,7 @@ class AppNameApi(Resource): @marshal_with(app_detail_fields) @edit_permission_required def post(self, app_model): - parser = reqparse.RequestParser() - parser.add_argument("name", type=str, required=True, location="json") + parser = reqparse.RequestParser().add_argument("name", type=str, required=True, location="json") args = parser.parse_args() app_service = AppService() @@ -391,9 +400,11 @@ class AppIconApi(Resource): @marshal_with(app_detail_fields) @edit_permission_required def post(self, app_model): - parser = reqparse.RequestParser() - parser.add_argument("icon", type=str, location="json") - parser.add_argument("icon_background", type=str, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("icon", type=str, location="json") + .add_argument("icon_background", type=str, location="json") + ) args = parser.parse_args() app_service = AppService() @@ -421,8 +432,7 @@ class AppSiteStatus(Resource): @marshal_with(app_detail_fields) @edit_permission_required def post(self, app_model): - parser = reqparse.RequestParser() - parser.add_argument("enable_site", type=bool, required=True, location="json") + parser = reqparse.RequestParser().add_argument("enable_site", type=bool, required=True, location="json") args = parser.parse_args() app_service = AppService() @@ -454,8 +464,7 @@ class AppApiStatus(Resource): if not current_user.is_admin_or_owner: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("enable_api", type=bool, required=True, location="json") + parser = reqparse.RequestParser().add_argument("enable_api", type=bool, required=True, location="json") args = parser.parse_args() app_service = AppService() @@ -499,9 +508,11 @@ class AppTraceApi(Resource): @edit_permission_required def post(self, app_id): # add app trace - parser = reqparse.RequestParser() - parser.add_argument("enabled", type=bool, required=True, location="json") - parser.add_argument("tracing_provider", type=str, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("enabled", type=bool, required=True, location="json") + .add_argument("tracing_provider", type=str, required=True, location="json") + ) args = parser.parse_args() OpsTraceManager.update_app_tracing_config( diff --git a/api/controllers/console/app/app_import.py b/api/controllers/console/app/app_import.py index 5e7ea6d481..d902c129ad 100644 --- a/api/controllers/console/app/app_import.py +++ b/api/controllers/console/app/app_import.py @@ -30,16 +30,18 @@ class AppImportApi(Resource): def post(self): # Check user role first current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("mode", type=str, required=True, location="json") - parser.add_argument("yaml_content", type=str, location="json") - parser.add_argument("yaml_url", type=str, location="json") - parser.add_argument("name", type=str, location="json") - parser.add_argument("description", type=str, location="json") - parser.add_argument("icon_type", type=str, location="json") - parser.add_argument("icon", type=str, location="json") - parser.add_argument("icon_background", type=str, location="json") - parser.add_argument("app_id", type=str, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("mode", type=str, required=True, location="json") + .add_argument("yaml_content", type=str, location="json") + .add_argument("yaml_url", type=str, location="json") + .add_argument("name", type=str, location="json") + .add_argument("description", type=str, location="json") + .add_argument("icon_type", type=str, location="json") + .add_argument("icon", type=str, location="json") + .add_argument("icon_background", type=str, location="json") + .add_argument("app_id", type=str, location="json") + ) args = parser.parse_args() # Create service with session diff --git a/api/controllers/console/app/audio.py b/api/controllers/console/app/audio.py index 7d659dae0d..8170ba271a 100644 --- a/api/controllers/console/app/audio.py +++ b/api/controllers/console/app/audio.py @@ -111,11 +111,13 @@ class ChatMessageTextApi(Resource): @account_initialization_required def post(self, app_model: App): try: - parser = reqparse.RequestParser() - parser.add_argument("message_id", type=str, location="json") - parser.add_argument("text", type=str, location="json") - parser.add_argument("voice", type=str, location="json") - parser.add_argument("streaming", type=bool, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("message_id", type=str, location="json") + .add_argument("text", type=str, location="json") + .add_argument("voice", type=str, location="json") + .add_argument("streaming", type=bool, location="json") + ) args = parser.parse_args() message_id = args.get("message_id", None) @@ -166,8 +168,7 @@ class TextModesApi(Resource): @account_initialization_required def get(self, app_model): try: - parser = reqparse.RequestParser() - parser.add_argument("language", type=str, required=True, location="args") + parser = reqparse.RequestParser().add_argument("language", type=str, required=True, location="args") args = parser.parse_args() response = AudioService.transcript_tts_voices( diff --git a/api/controllers/console/app/completion.py b/api/controllers/console/app/completion.py index d69f05f23e..d7bc3cc20d 100644 --- a/api/controllers/console/app/completion.py +++ b/api/controllers/console/app/completion.py @@ -64,13 +64,15 @@ class CompletionMessageApi(Resource): @account_initialization_required @get_app_model(mode=AppMode.COMPLETION) def post(self, app_model): - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, location="json") - parser.add_argument("query", type=str, location="json", default="") - parser.add_argument("files", type=list, required=False, location="json") - parser.add_argument("model_config", type=dict, required=True, location="json") - parser.add_argument("response_mode", type=str, choices=["blocking", "streaming"], location="json") - parser.add_argument("retriever_from", type=str, required=False, default="dev", location="json") + parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, location="json") + .add_argument("query", type=str, location="json", default="") + .add_argument("files", type=list, required=False, location="json") + .add_argument("model_config", type=dict, required=True, location="json") + .add_argument("response_mode", type=str, choices=["blocking", "streaming"], location="json") + .add_argument("retriever_from", type=str, required=False, default="dev", location="json") + ) args = parser.parse_args() streaming = args["response_mode"] != "blocking" @@ -153,15 +155,17 @@ class ChatMessageApi(Resource): @get_app_model(mode=[AppMode.CHAT, AppMode.AGENT_CHAT]) @edit_permission_required def post(self, app_model): - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, location="json") - parser.add_argument("query", type=str, required=True, location="json") - parser.add_argument("files", type=list, required=False, location="json") - parser.add_argument("model_config", type=dict, required=True, location="json") - parser.add_argument("conversation_id", type=uuid_value, location="json") - parser.add_argument("parent_message_id", type=uuid_value, required=False, location="json") - parser.add_argument("response_mode", type=str, choices=["blocking", "streaming"], location="json") - parser.add_argument("retriever_from", type=str, required=False, default="dev", location="json") + parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, location="json") + .add_argument("query", type=str, required=True, location="json") + .add_argument("files", type=list, required=False, location="json") + .add_argument("model_config", type=dict, required=True, location="json") + .add_argument("conversation_id", type=uuid_value, location="json") + .add_argument("parent_message_id", type=uuid_value, required=False, location="json") + .add_argument("response_mode", type=str, choices=["blocking", "streaming"], location="json") + .add_argument("retriever_from", type=str, required=False, default="dev", location="json") + ) args = parser.parse_args() streaming = args["response_mode"] != "blocking" diff --git a/api/controllers/console/app/conversation.py b/api/controllers/console/app/conversation.py index 779be62973..d5fa70d678 100644 --- a/api/controllers/console/app/conversation.py +++ b/api/controllers/console/app/conversation.py @@ -59,15 +59,21 @@ class CompletionConversationApi(Resource): @edit_permission_required def get(self, app_model): current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("keyword", type=str, location="args") - parser.add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") - parser.add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") - parser.add_argument( - "annotation_status", type=str, choices=["annotated", "not_annotated", "all"], default="all", location="args" + parser = ( + reqparse.RequestParser() + .add_argument("keyword", type=str, location="args") + .add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + .add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + .add_argument( + "annotation_status", + type=str, + choices=["annotated", "not_annotated", "all"], + default="all", + location="args", + ) + .add_argument("page", type=int_range(1, 99999), default=1, location="args") + .add_argument("limit", type=int_range(1, 100), default=20, location="args") ) - parser.add_argument("page", type=int_range(1, 99999), default=1, location="args") - parser.add_argument("limit", type=int_range(1, 100), default=20, location="args") args = parser.parse_args() query = sa.select(Conversation).where( @@ -206,23 +212,29 @@ class ChatConversationApi(Resource): @edit_permission_required def get(self, app_model): current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("keyword", type=str, location="args") - parser.add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") - parser.add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") - parser.add_argument( - "annotation_status", type=str, choices=["annotated", "not_annotated", "all"], default="all", location="args" - ) - parser.add_argument("message_count_gte", type=int_range(1, 99999), required=False, location="args") - parser.add_argument("page", type=int_range(1, 99999), required=False, default=1, location="args") - parser.add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") - parser.add_argument( - "sort_by", - type=str, - choices=["created_at", "-created_at", "updated_at", "-updated_at"], - required=False, - default="-updated_at", - location="args", + parser = ( + reqparse.RequestParser() + .add_argument("keyword", type=str, location="args") + .add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + .add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + .add_argument( + "annotation_status", + type=str, + choices=["annotated", "not_annotated", "all"], + default="all", + location="args", + ) + .add_argument("message_count_gte", type=int_range(1, 99999), required=False, location="args") + .add_argument("page", type=int_range(1, 99999), required=False, default=1, location="args") + .add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") + .add_argument( + "sort_by", + type=str, + choices=["created_at", "-created_at", "updated_at", "-updated_at"], + required=False, + default="-updated_at", + location="args", + ) ) args = parser.parse_args() diff --git a/api/controllers/console/app/conversation_variables.py b/api/controllers/console/app/conversation_variables.py index 8a65a89963..d4c0b5697f 100644 --- a/api/controllers/console/app/conversation_variables.py +++ b/api/controllers/console/app/conversation_variables.py @@ -29,8 +29,7 @@ class ConversationVariablesApi(Resource): @get_app_model(mode=AppMode.ADVANCED_CHAT) @marshal_with(paginated_conversation_variable_fields) def get(self, app_model): - parser = reqparse.RequestParser() - parser.add_argument("conversation_id", type=str, location="args") + parser = reqparse.RequestParser().add_argument("conversation_id", type=str, location="args") args = parser.parse_args() stmt = ( diff --git a/api/controllers/console/app/generator.py b/api/controllers/console/app/generator.py index 4a9b6e7801..b6ca97ab4f 100644 --- a/api/controllers/console/app/generator.py +++ b/api/controllers/console/app/generator.py @@ -42,10 +42,12 @@ class RuleGenerateApi(Resource): @login_required @account_initialization_required def post(self): - parser = reqparse.RequestParser() - parser.add_argument("instruction", type=str, required=True, nullable=False, location="json") - parser.add_argument("model_config", type=dict, required=True, nullable=False, location="json") - parser.add_argument("no_variable", type=bool, required=True, default=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("instruction", type=str, required=True, nullable=False, location="json") + .add_argument("model_config", type=dict, required=True, nullable=False, location="json") + .add_argument("no_variable", type=bool, required=True, default=False, location="json") + ) args = parser.parse_args() _, current_tenant_id = current_account_with_tenant() @@ -92,11 +94,13 @@ class RuleCodeGenerateApi(Resource): @login_required @account_initialization_required def post(self): - parser = reqparse.RequestParser() - parser.add_argument("instruction", type=str, required=True, nullable=False, location="json") - parser.add_argument("model_config", type=dict, required=True, nullable=False, location="json") - parser.add_argument("no_variable", type=bool, required=True, default=False, location="json") - parser.add_argument("code_language", type=str, required=False, default="javascript", location="json") + parser = ( + reqparse.RequestParser() + .add_argument("instruction", type=str, required=True, nullable=False, location="json") + .add_argument("model_config", type=dict, required=True, nullable=False, location="json") + .add_argument("no_variable", type=bool, required=True, default=False, location="json") + .add_argument("code_language", type=str, required=False, default="javascript", location="json") + ) args = parser.parse_args() _, current_tenant_id = current_account_with_tenant() @@ -139,9 +143,11 @@ class RuleStructuredOutputGenerateApi(Resource): @login_required @account_initialization_required def post(self): - parser = reqparse.RequestParser() - parser.add_argument("instruction", type=str, required=True, nullable=False, location="json") - parser.add_argument("model_config", type=dict, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("instruction", type=str, required=True, nullable=False, location="json") + .add_argument("model_config", type=dict, required=True, nullable=False, location="json") + ) args = parser.parse_args() _, current_tenant_id = current_account_with_tenant() @@ -188,14 +194,16 @@ class InstructionGenerateApi(Resource): @login_required @account_initialization_required def post(self): - parser = reqparse.RequestParser() - parser.add_argument("flow_id", type=str, required=True, default="", location="json") - parser.add_argument("node_id", type=str, required=False, default="", location="json") - parser.add_argument("current", type=str, required=False, default="", location="json") - parser.add_argument("language", type=str, required=False, default="javascript", location="json") - parser.add_argument("instruction", type=str, required=True, nullable=False, location="json") - parser.add_argument("model_config", type=dict, required=True, nullable=False, location="json") - parser.add_argument("ideal_output", type=str, required=False, default="", location="json") + parser = ( + reqparse.RequestParser() + .add_argument("flow_id", type=str, required=True, default="", location="json") + .add_argument("node_id", type=str, required=False, default="", location="json") + .add_argument("current", type=str, required=False, default="", location="json") + .add_argument("language", type=str, required=False, default="javascript", location="json") + .add_argument("instruction", type=str, required=True, nullable=False, location="json") + .add_argument("model_config", type=dict, required=True, nullable=False, location="json") + .add_argument("ideal_output", type=str, required=False, default="", location="json") + ) args = parser.parse_args() _, current_tenant_id = current_account_with_tenant() code_template = ( @@ -293,8 +301,7 @@ class InstructionGenerationTemplateApi(Resource): @login_required @account_initialization_required def post(self): - parser = reqparse.RequestParser() - parser.add_argument("type", type=str, required=True, default=False, location="json") + parser = reqparse.RequestParser().add_argument("type", type=str, required=True, default=False, location="json") args = parser.parse_args() match args["type"]: case "prompt": diff --git a/api/controllers/console/app/mcp_server.py b/api/controllers/console/app/mcp_server.py index 599f5adb34..3700c6b1d0 100644 --- a/api/controllers/console/app/mcp_server.py +++ b/api/controllers/console/app/mcp_server.py @@ -55,9 +55,11 @@ class AppMCPServerController(Resource): @edit_permission_required def post(self, app_model): _, current_tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("description", type=str, required=False, location="json") - parser.add_argument("parameters", type=dict, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("description", type=str, required=False, location="json") + .add_argument("parameters", type=dict, required=True, location="json") + ) args = parser.parse_args() description = args.get("description") @@ -101,11 +103,13 @@ class AppMCPServerController(Resource): @marshal_with(app_server_fields) @edit_permission_required def put(self, app_model): - parser = reqparse.RequestParser() - parser.add_argument("id", type=str, required=True, location="json") - parser.add_argument("description", type=str, required=False, location="json") - parser.add_argument("parameters", type=dict, required=True, location="json") - parser.add_argument("status", type=str, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("id", type=str, required=True, location="json") + .add_argument("description", type=str, required=False, location="json") + .add_argument("parameters", type=dict, required=True, location="json") + .add_argument("status", type=str, required=False, location="json") + ) args = parser.parse_args() server = db.session.query(AppMCPServer).where(AppMCPServer.id == args["id"]).first() if not server: diff --git a/api/controllers/console/app/message.py b/api/controllers/console/app/message.py index 005cff75fc..7e0ae370ef 100644 --- a/api/controllers/console/app/message.py +++ b/api/controllers/console/app/message.py @@ -63,10 +63,12 @@ class ChatMessageListApi(Resource): @marshal_with(message_infinite_scroll_pagination_fields) @edit_permission_required def get(self, app_model): - parser = reqparse.RequestParser() - parser.add_argument("conversation_id", required=True, type=uuid_value, location="args") - parser.add_argument("first_id", type=uuid_value, location="args") - parser.add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("conversation_id", required=True, type=uuid_value, location="args") + .add_argument("first_id", type=uuid_value, location="args") + .add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") + ) args = parser.parse_args() conversation = ( @@ -154,9 +156,11 @@ class MessageFeedbackApi(Resource): def post(self, app_model): current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("message_id", required=True, type=uuid_value, location="json") - parser.add_argument("rating", type=str, choices=["like", "dislike", None], location="json") + parser = ( + reqparse.RequestParser() + .add_argument("message_id", required=True, type=uuid_value, location="json") + .add_argument("rating", type=str, choices=["like", "dislike", None], location="json") + ) args = parser.parse_args() message_id = str(args["message_id"]) @@ -216,11 +220,13 @@ class MessageAnnotationApi(Resource): @account_initialization_required @edit_permission_required def post(self, app_model): - parser = reqparse.RequestParser() - parser.add_argument("message_id", required=False, type=uuid_value, location="json") - parser.add_argument("question", required=True, type=str, location="json") - parser.add_argument("answer", required=True, type=str, location="json") - parser.add_argument("annotation_reply", required=False, type=dict, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("message_id", required=False, type=uuid_value, location="json") + .add_argument("question", required=True, type=str, location="json") + .add_argument("answer", required=True, type=str, location="json") + .add_argument("annotation_reply", required=False, type=dict, location="json") + ) args = parser.parse_args() annotation = AppAnnotationService.up_insert_app_annotation_from_message(args, app_model.id) diff --git a/api/controllers/console/app/ops_trace.py b/api/controllers/console/app/ops_trace.py index 981974e842..1d80314774 100644 --- a/api/controllers/console/app/ops_trace.py +++ b/api/controllers/console/app/ops_trace.py @@ -30,8 +30,7 @@ class TraceAppConfigApi(Resource): @login_required @account_initialization_required def get(self, app_id): - parser = reqparse.RequestParser() - parser.add_argument("tracing_provider", type=str, required=True, location="args") + parser = reqparse.RequestParser().add_argument("tracing_provider", type=str, required=True, location="args") args = parser.parse_args() try: @@ -63,9 +62,11 @@ class TraceAppConfigApi(Resource): @account_initialization_required def post(self, app_id): """Create a new trace app configuration""" - parser = reqparse.RequestParser() - parser.add_argument("tracing_provider", type=str, required=True, location="json") - parser.add_argument("tracing_config", type=dict, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("tracing_provider", type=str, required=True, location="json") + .add_argument("tracing_config", type=dict, required=True, location="json") + ) args = parser.parse_args() try: @@ -99,9 +100,11 @@ class TraceAppConfigApi(Resource): @account_initialization_required def patch(self, app_id): """Update an existing trace app configuration""" - parser = reqparse.RequestParser() - parser.add_argument("tracing_provider", type=str, required=True, location="json") - parser.add_argument("tracing_config", type=dict, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("tracing_provider", type=str, required=True, location="json") + .add_argument("tracing_config", type=dict, required=True, location="json") + ) args = parser.parse_args() try: @@ -129,8 +132,7 @@ class TraceAppConfigApi(Resource): @account_initialization_required def delete(self, app_id): """Delete an existing trace app configuration""" - parser = reqparse.RequestParser() - parser.add_argument("tracing_provider", type=str, required=True, location="args") + parser = reqparse.RequestParser().add_argument("tracing_provider", type=str, required=True, location="args") args = parser.parse_args() try: diff --git a/api/controllers/console/app/site.py b/api/controllers/console/app/site.py index 1da704efcc..c4d640bf0e 100644 --- a/api/controllers/console/app/site.py +++ b/api/controllers/console/app/site.py @@ -13,25 +13,31 @@ from models import Site def parse_app_site_args(): - parser = reqparse.RequestParser() - parser.add_argument("title", type=str, required=False, location="json") - parser.add_argument("icon_type", type=str, required=False, location="json") - parser.add_argument("icon", type=str, required=False, location="json") - parser.add_argument("icon_background", type=str, required=False, location="json") - parser.add_argument("description", type=str, required=False, location="json") - parser.add_argument("default_language", type=supported_language, required=False, location="json") - parser.add_argument("chat_color_theme", type=str, required=False, location="json") - parser.add_argument("chat_color_theme_inverted", type=bool, required=False, location="json") - parser.add_argument("customize_domain", type=str, required=False, location="json") - parser.add_argument("copyright", type=str, required=False, location="json") - parser.add_argument("privacy_policy", type=str, required=False, location="json") - parser.add_argument("custom_disclaimer", type=str, required=False, location="json") - parser.add_argument( - "customize_token_strategy", type=str, choices=["must", "allow", "not_allow"], required=False, location="json" + parser = ( + reqparse.RequestParser() + .add_argument("title", type=str, required=False, location="json") + .add_argument("icon_type", type=str, required=False, location="json") + .add_argument("icon", type=str, required=False, location="json") + .add_argument("icon_background", type=str, required=False, location="json") + .add_argument("description", type=str, required=False, location="json") + .add_argument("default_language", type=supported_language, required=False, location="json") + .add_argument("chat_color_theme", type=str, required=False, location="json") + .add_argument("chat_color_theme_inverted", type=bool, required=False, location="json") + .add_argument("customize_domain", type=str, required=False, location="json") + .add_argument("copyright", type=str, required=False, location="json") + .add_argument("privacy_policy", type=str, required=False, location="json") + .add_argument("custom_disclaimer", type=str, required=False, location="json") + .add_argument( + "customize_token_strategy", + type=str, + choices=["must", "allow", "not_allow"], + required=False, + location="json", + ) + .add_argument("prompt_public", type=bool, required=False, location="json") + .add_argument("show_workflow_steps", type=bool, required=False, location="json") + .add_argument("use_icon_as_answer_icon", type=bool, required=False, location="json") ) - parser.add_argument("prompt_public", type=bool, required=False, location="json") - parser.add_argument("show_workflow_steps", type=bool, required=False, location="json") - parser.add_argument("use_icon_as_answer_icon", type=bool, required=False, location="json") return parser.parse_args() diff --git a/api/controllers/console/app/statistic.py b/api/controllers/console/app/statistic.py index cfe5b3ff17..0917a6e53c 100644 --- a/api/controllers/console/app/statistic.py +++ b/api/controllers/console/app/statistic.py @@ -38,9 +38,11 @@ class DailyMessageStatistic(Resource): def get(self, app_model): account, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") - parser.add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + parser = ( + reqparse.RequestParser() + .add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + .add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + ) args = parser.parse_args() sql_query = """SELECT @@ -111,9 +113,11 @@ class DailyConversationStatistic(Resource): def get(self, app_model): account, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") - parser.add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + parser = ( + reqparse.RequestParser() + .add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + .add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + ) args = parser.parse_args() assert account.timezone is not None timezone = pytz.timezone(account.timezone) @@ -177,9 +181,11 @@ class DailyTerminalsStatistic(Resource): def get(self, app_model): account, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") - parser.add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + parser = ( + reqparse.RequestParser() + .add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + .add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + ) args = parser.parse_args() sql_query = """SELECT @@ -249,9 +255,11 @@ class DailyTokenCostStatistic(Resource): def get(self, app_model): account, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") - parser.add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + parser = ( + reqparse.RequestParser() + .add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + .add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + ) args = parser.parse_args() sql_query = """SELECT @@ -324,9 +332,11 @@ class AverageSessionInteractionStatistic(Resource): def get(self, app_model): account, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") - parser.add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + parser = ( + reqparse.RequestParser() + .add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + .add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + ) args = parser.parse_args() sql_query = """SELECT @@ -415,9 +425,11 @@ class UserSatisfactionRateStatistic(Resource): def get(self, app_model): account, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") - parser.add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + parser = ( + reqparse.RequestParser() + .add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + .add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + ) args = parser.parse_args() sql_query = """SELECT @@ -496,9 +508,11 @@ class AverageResponseTimeStatistic(Resource): def get(self, app_model): account, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") - parser.add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + parser = ( + reqparse.RequestParser() + .add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + .add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + ) args = parser.parse_args() sql_query = """SELECT @@ -568,9 +582,11 @@ class TokensPerSecondStatistic(Resource): def get(self, app_model): account, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") - parser.add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + parser = ( + reqparse.RequestParser() + .add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + .add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + ) args = parser.parse_args() sql_query = """SELECT diff --git a/api/controllers/console/app/workflow.py b/api/controllers/console/app/workflow.py index 172a80736f..56771ed420 100644 --- a/api/controllers/console/app/workflow.py +++ b/api/controllers/console/app/workflow.py @@ -115,12 +115,14 @@ class DraftWorkflowApi(Resource): content_type = request.headers.get("Content-Type", "") if "application/json" in content_type: - parser = reqparse.RequestParser() - parser.add_argument("graph", type=dict, required=True, nullable=False, location="json") - parser.add_argument("features", type=dict, required=True, nullable=False, location="json") - parser.add_argument("hash", type=str, required=False, location="json") - parser.add_argument("environment_variables", type=list, required=True, location="json") - parser.add_argument("conversation_variables", type=list, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("graph", type=dict, required=True, nullable=False, location="json") + .add_argument("features", type=dict, required=True, nullable=False, location="json") + .add_argument("hash", type=str, required=False, location="json") + .add_argument("environment_variables", type=list, required=True, location="json") + .add_argument("conversation_variables", type=list, required=False, location="json") + ) args = parser.parse_args() elif "text/plain" in content_type: try: @@ -202,12 +204,14 @@ class AdvancedChatDraftWorkflowRunApi(Resource): """ current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, location="json") - parser.add_argument("query", type=str, required=True, location="json", default="") - parser.add_argument("files", type=list, location="json") - parser.add_argument("conversation_id", type=uuid_value, location="json") - parser.add_argument("parent_message_id", type=uuid_value, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, location="json") + .add_argument("query", type=str, required=True, location="json", default="") + .add_argument("files", type=list, location="json") + .add_argument("conversation_id", type=uuid_value, location="json") + .add_argument("parent_message_id", type=uuid_value, required=False, location="json") + ) args = parser.parse_args() @@ -261,8 +265,7 @@ class AdvancedChatDraftRunIterationNodeApi(Resource): Run draft workflow iteration node """ current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, location="json") + parser = reqparse.RequestParser().add_argument("inputs", type=dict, location="json") args = parser.parse_args() try: @@ -309,8 +312,7 @@ class WorkflowDraftRunIterationNodeApi(Resource): Run draft workflow iteration node """ current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, location="json") + parser = reqparse.RequestParser().add_argument("inputs", type=dict, location="json") args = parser.parse_args() try: @@ -357,8 +359,7 @@ class AdvancedChatDraftRunLoopNodeApi(Resource): Run draft workflow loop node """ current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, location="json") + parser = reqparse.RequestParser().add_argument("inputs", type=dict, location="json") args = parser.parse_args() try: @@ -405,8 +406,7 @@ class WorkflowDraftRunLoopNodeApi(Resource): Run draft workflow loop node """ current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, location="json") + parser = reqparse.RequestParser().add_argument("inputs", type=dict, location="json") args = parser.parse_args() try: @@ -452,9 +452,11 @@ class DraftWorkflowRunApi(Resource): Run draft workflow """ current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, nullable=False, location="json") - parser.add_argument("files", type=list, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, nullable=False, location="json") + .add_argument("files", type=list, required=False, location="json") + ) args = parser.parse_args() external_trace_id = get_external_trace_id(request) @@ -529,10 +531,12 @@ class DraftWorkflowNodeRunApi(Resource): Run draft workflow node """ current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, nullable=False, location="json") - parser.add_argument("query", type=str, required=False, location="json", default="") - parser.add_argument("files", type=list, location="json", default=[]) + parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, nullable=False, location="json") + .add_argument("query", type=str, required=False, location="json", default="") + .add_argument("files", type=list, location="json", default=[]) + ) args = parser.parse_args() user_inputs = args.get("inputs") @@ -594,9 +598,11 @@ class PublishedWorkflowApi(Resource): Publish workflow """ current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("marked_name", type=str, required=False, default="", location="json") - parser.add_argument("marked_comment", type=str, required=False, default="", location="json") + parser = ( + reqparse.RequestParser() + .add_argument("marked_name", type=str, required=False, default="", location="json") + .add_argument("marked_comment", type=str, required=False, default="", location="json") + ) args = parser.parse_args() # Validate name and comment length @@ -668,8 +674,7 @@ class DefaultBlockConfigApi(Resource): """ Get default block config """ - parser = reqparse.RequestParser() - parser.add_argument("q", type=str, location="args") + parser = reqparse.RequestParser().add_argument("q", type=str, location="args") args = parser.parse_args() q = args.get("q") @@ -708,11 +713,13 @@ class ConvertToWorkflowApi(Resource): current_user, _ = current_account_with_tenant() if request.data: - parser = reqparse.RequestParser() - parser.add_argument("name", type=str, required=False, nullable=True, location="json") - parser.add_argument("icon_type", type=str, required=False, nullable=True, location="json") - parser.add_argument("icon", type=str, required=False, nullable=True, location="json") - parser.add_argument("icon_background", type=str, required=False, nullable=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("name", type=str, required=False, nullable=True, location="json") + .add_argument("icon_type", type=str, required=False, nullable=True, location="json") + .add_argument("icon", type=str, required=False, nullable=True, location="json") + .add_argument("icon_background", type=str, required=False, nullable=True, location="json") + ) args = parser.parse_args() else: args = {} @@ -745,11 +752,13 @@ class PublishedAllWorkflowApi(Resource): """ current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("page", type=inputs.int_range(1, 99999), required=False, default=1, location="args") - parser.add_argument("limit", type=inputs.int_range(1, 100), required=False, default=20, location="args") - parser.add_argument("user_id", type=str, required=False, location="args") - parser.add_argument("named_only", type=inputs.boolean, required=False, default=False, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("page", type=inputs.int_range(1, 99999), required=False, default=1, location="args") + .add_argument("limit", type=inputs.int_range(1, 100), required=False, default=20, location="args") + .add_argument("user_id", type=str, required=False, location="args") + .add_argument("named_only", type=inputs.boolean, required=False, default=False, location="args") + ) args = parser.parse_args() page = int(args.get("page", 1)) limit = int(args.get("limit", 10)) @@ -808,9 +817,11 @@ class WorkflowByIdApi(Resource): Update workflow attributes """ current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("marked_name", type=str, required=False, location="json") - parser.add_argument("marked_comment", type=str, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("marked_name", type=str, required=False, location="json") + .add_argument("marked_comment", type=str, required=False, location="json") + ) args = parser.parse_args() # Validate name and comment length diff --git a/api/controllers/console/app/workflow_app_log.py b/api/controllers/console/app/workflow_app_log.py index 8e24be4fa7..cbf4e84ff0 100644 --- a/api/controllers/console/app/workflow_app_log.py +++ b/api/controllers/console/app/workflow_app_log.py @@ -42,33 +42,35 @@ class WorkflowAppLogApi(Resource): """ Get workflow app logs """ - parser = reqparse.RequestParser() - parser.add_argument("keyword", type=str, location="args") - parser.add_argument( - "status", type=str, choices=["succeeded", "failed", "stopped", "partial-succeeded"], location="args" + parser = ( + reqparse.RequestParser() + .add_argument("keyword", type=str, location="args") + .add_argument( + "status", type=str, choices=["succeeded", "failed", "stopped", "partial-succeeded"], location="args" + ) + .add_argument( + "created_at__before", type=str, location="args", help="Filter logs created before this timestamp" + ) + .add_argument( + "created_at__after", type=str, location="args", help="Filter logs created after this timestamp" + ) + .add_argument( + "created_by_end_user_session_id", + type=str, + location="args", + required=False, + default=None, + ) + .add_argument( + "created_by_account", + type=str, + location="args", + required=False, + default=None, + ) + .add_argument("page", type=int_range(1, 99999), default=1, location="args") + .add_argument("limit", type=int_range(1, 100), default=20, location="args") ) - parser.add_argument( - "created_at__before", type=str, location="args", help="Filter logs created before this timestamp" - ) - parser.add_argument( - "created_at__after", type=str, location="args", help="Filter logs created after this timestamp" - ) - parser.add_argument( - "created_by_end_user_session_id", - type=str, - location="args", - required=False, - default=None, - ) - parser.add_argument( - "created_by_account", - type=str, - location="args", - required=False, - default=None, - ) - parser.add_argument("page", type=int_range(1, 99999), default=1, location="args") - parser.add_argument("limit", type=int_range(1, 100), default=20, location="args") args = parser.parse_args() args.status = WorkflowExecutionStatus(args.status) if args.status else None diff --git a/api/controllers/console/app/workflow_draft_variable.py b/api/controllers/console/app/workflow_draft_variable.py index 5e865dc4c1..0722eb40d2 100644 --- a/api/controllers/console/app/workflow_draft_variable.py +++ b/api/controllers/console/app/workflow_draft_variable.py @@ -57,16 +57,18 @@ def _serialize_var_value(variable: WorkflowDraftVariable): def _create_pagination_parser(): - parser = reqparse.RequestParser() - parser.add_argument( - "page", - type=inputs.int_range(1, 100_000), - required=False, - default=1, - location="args", - help="the page of data requested", + parser = ( + reqparse.RequestParser() + .add_argument( + "page", + type=inputs.int_range(1, 100_000), + required=False, + default=1, + location="args", + help="the page of data requested", + ) + .add_argument("limit", type=inputs.int_range(1, 100), required=False, default=20, location="args") ) - parser.add_argument("limit", type=inputs.int_range(1, 100), required=False, default=20, location="args") return parser @@ -319,10 +321,11 @@ class VariableApi(Resource): # "upload_file_id": "1602650a-4fe4-423c-85a2-af76c083e3c4" # } - parser = reqparse.RequestParser() - parser.add_argument(self._PATCH_NAME_FIELD, type=str, required=False, nullable=True, location="json") - # Parse 'value' field as-is to maintain its original data structure - parser.add_argument(self._PATCH_VALUE_FIELD, type=lambda x: x, required=False, nullable=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument(self._PATCH_NAME_FIELD, type=str, required=False, nullable=True, location="json") + .add_argument(self._PATCH_VALUE_FIELD, type=lambda x: x, required=False, nullable=True, location="json") + ) draft_var_srv = WorkflowDraftVariableService( session=db.session(), diff --git a/api/controllers/console/app/workflow_statistic.py b/api/controllers/console/app/workflow_statistic.py index 8f7f936c9b..bbea04640a 100644 --- a/api/controllers/console/app/workflow_statistic.py +++ b/api/controllers/console/app/workflow_statistic.py @@ -30,9 +30,11 @@ class WorkflowDailyRunsStatistic(Resource): def get(self, app_model): account, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") - parser.add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + parser = ( + reqparse.RequestParser() + .add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + .add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + ) args = parser.parse_args() sql_query = """SELECT @@ -98,9 +100,11 @@ class WorkflowDailyTerminalsStatistic(Resource): def get(self, app_model): account, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") - parser.add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + parser = ( + reqparse.RequestParser() + .add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + .add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + ) args = parser.parse_args() sql_query = """SELECT @@ -166,9 +170,11 @@ class WorkflowDailyTokenCostStatistic(Resource): def get(self, app_model): account, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") - parser.add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + parser = ( + reqparse.RequestParser() + .add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + .add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + ) args = parser.parse_args() sql_query = """SELECT @@ -239,9 +245,11 @@ class WorkflowAverageAppInteractionStatistic(Resource): def get(self, app_model): account, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") - parser.add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + parser = ( + reqparse.RequestParser() + .add_argument("start", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + .add_argument("end", type=DatetimeString("%Y-%m-%d %H:%M"), location="args") + ) args = parser.parse_args() sql_query = """SELECT diff --git a/api/controllers/console/auth/activate.py b/api/controllers/console/auth/activate.py index 06d2b936b7..2eeef079a1 100644 --- a/api/controllers/console/auth/activate.py +++ b/api/controllers/console/auth/activate.py @@ -10,15 +10,11 @@ from libs.helper import StrLen, email, extract_remote_ip, timezone from models import AccountStatus from services.account_service import AccountService, RegisterService -active_check_parser = reqparse.RequestParser() -active_check_parser.add_argument( - "workspace_id", type=str, required=False, nullable=True, location="args", help="Workspace ID" -) -active_check_parser.add_argument( - "email", type=email, required=False, nullable=True, location="args", help="Email address" -) -active_check_parser.add_argument( - "token", type=str, required=True, nullable=False, location="args", help="Activation token" +active_check_parser = ( + reqparse.RequestParser() + .add_argument("workspace_id", type=str, required=False, nullable=True, location="args", help="Workspace ID") + .add_argument("email", type=email, required=False, nullable=True, location="args", help="Email address") + .add_argument("token", type=str, required=True, nullable=False, location="args", help="Activation token") ) @@ -60,15 +56,15 @@ class ActivateCheckApi(Resource): return {"is_valid": False} -active_parser = reqparse.RequestParser() -active_parser.add_argument("workspace_id", type=str, required=False, nullable=True, location="json") -active_parser.add_argument("email", type=email, required=False, nullable=True, location="json") -active_parser.add_argument("token", type=str, required=True, nullable=False, location="json") -active_parser.add_argument("name", type=StrLen(30), required=True, nullable=False, location="json") -active_parser.add_argument( - "interface_language", type=supported_language, required=True, nullable=False, location="json" +active_parser = ( + reqparse.RequestParser() + .add_argument("workspace_id", type=str, required=False, nullable=True, location="json") + .add_argument("email", type=email, required=False, nullable=True, location="json") + .add_argument("token", type=str, required=True, nullable=False, location="json") + .add_argument("name", type=StrLen(30), required=True, nullable=False, location="json") + .add_argument("interface_language", type=supported_language, required=True, nullable=False, location="json") + .add_argument("timezone", type=timezone, required=True, nullable=False, location="json") ) -active_parser.add_argument("timezone", type=timezone, required=True, nullable=False, location="json") @console_ns.route("/activate") diff --git a/api/controllers/console/auth/data_source_bearer_auth.py b/api/controllers/console/auth/data_source_bearer_auth.py index d9ab7de29b..a06435267b 100644 --- a/api/controllers/console/auth/data_source_bearer_auth.py +++ b/api/controllers/console/auth/data_source_bearer_auth.py @@ -45,10 +45,12 @@ class ApiKeyAuthDataSourceBinding(Resource): if not current_user.is_admin_or_owner: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("category", type=str, required=True, nullable=False, location="json") - parser.add_argument("provider", type=str, required=True, nullable=False, location="json") - parser.add_argument("credentials", type=dict, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("category", type=str, required=True, nullable=False, location="json") + .add_argument("provider", type=str, required=True, nullable=False, location="json") + .add_argument("credentials", type=dict, required=True, nullable=False, location="json") + ) args = parser.parse_args() ApiKeyAuthService.validate_api_key_auth_args(args) try: diff --git a/api/controllers/console/auth/email_register.py b/api/controllers/console/auth/email_register.py index cabd118d23..fe2bb54e0b 100644 --- a/api/controllers/console/auth/email_register.py +++ b/api/controllers/console/auth/email_register.py @@ -31,9 +31,11 @@ class EmailRegisterSendEmailApi(Resource): @email_password_login_enabled @email_register_enabled def post(self): - parser = reqparse.RequestParser() - parser.add_argument("email", type=email, required=True, location="json") - parser.add_argument("language", type=str, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("email", type=email, required=True, location="json") + .add_argument("language", type=str, required=False, location="json") + ) args = parser.parse_args() ip_address = extract_remote_ip(request) @@ -59,10 +61,12 @@ class EmailRegisterCheckApi(Resource): @email_password_login_enabled @email_register_enabled def post(self): - parser = reqparse.RequestParser() - parser.add_argument("email", type=str, required=True, location="json") - parser.add_argument("code", type=str, required=True, location="json") - parser.add_argument("token", type=str, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("email", type=str, required=True, location="json") + .add_argument("code", type=str, required=True, location="json") + .add_argument("token", type=str, required=True, nullable=False, location="json") + ) args = parser.parse_args() user_email = args["email"] @@ -100,10 +104,12 @@ class EmailRegisterResetApi(Resource): @email_password_login_enabled @email_register_enabled def post(self): - parser = reqparse.RequestParser() - parser.add_argument("token", type=str, required=True, nullable=False, location="json") - parser.add_argument("new_password", type=valid_password, required=True, nullable=False, location="json") - parser.add_argument("password_confirm", type=valid_password, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("token", type=str, required=True, nullable=False, location="json") + .add_argument("new_password", type=valid_password, required=True, nullable=False, location="json") + .add_argument("password_confirm", type=valid_password, required=True, nullable=False, location="json") + ) args = parser.parse_args() # Validate passwords match diff --git a/api/controllers/console/auth/forgot_password.py b/api/controllers/console/auth/forgot_password.py index 102d33966e..6be6ad51fe 100644 --- a/api/controllers/console/auth/forgot_password.py +++ b/api/controllers/console/auth/forgot_password.py @@ -54,9 +54,11 @@ class ForgotPasswordSendEmailApi(Resource): @setup_required @email_password_login_enabled def post(self): - parser = reqparse.RequestParser() - parser.add_argument("email", type=email, required=True, location="json") - parser.add_argument("language", type=str, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("email", type=email, required=True, location="json") + .add_argument("language", type=str, required=False, location="json") + ) args = parser.parse_args() ip_address = extract_remote_ip(request) @@ -111,10 +113,12 @@ class ForgotPasswordCheckApi(Resource): @setup_required @email_password_login_enabled def post(self): - parser = reqparse.RequestParser() - parser.add_argument("email", type=str, required=True, location="json") - parser.add_argument("code", type=str, required=True, location="json") - parser.add_argument("token", type=str, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("email", type=str, required=True, location="json") + .add_argument("code", type=str, required=True, location="json") + .add_argument("token", type=str, required=True, nullable=False, location="json") + ) args = parser.parse_args() user_email = args["email"] @@ -169,10 +173,12 @@ class ForgotPasswordResetApi(Resource): @setup_required @email_password_login_enabled def post(self): - parser = reqparse.RequestParser() - parser.add_argument("token", type=str, required=True, nullable=False, location="json") - parser.add_argument("new_password", type=valid_password, required=True, nullable=False, location="json") - parser.add_argument("password_confirm", type=valid_password, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("token", type=str, required=True, nullable=False, location="json") + .add_argument("new_password", type=valid_password, required=True, nullable=False, location="json") + .add_argument("password_confirm", type=valid_password, required=True, nullable=False, location="json") + ) args = parser.parse_args() # Validate passwords match diff --git a/api/controllers/console/auth/login.py b/api/controllers/console/auth/login.py index e4bbbf107b..3696c88346 100644 --- a/api/controllers/console/auth/login.py +++ b/api/controllers/console/auth/login.py @@ -40,11 +40,13 @@ class LoginApi(Resource): @email_password_login_enabled def post(self): """Authenticate user and login.""" - parser = reqparse.RequestParser() - parser.add_argument("email", type=email, required=True, location="json") - parser.add_argument("password", type=str, required=True, location="json") - parser.add_argument("remember_me", type=bool, required=False, default=False, location="json") - parser.add_argument("invite_token", type=str, required=False, default=None, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("email", type=email, required=True, location="json") + .add_argument("password", type=str, required=True, location="json") + .add_argument("remember_me", type=bool, required=False, default=False, location="json") + .add_argument("invite_token", type=str, required=False, default=None, location="json") + ) args = parser.parse_args() if dify_config.BILLING_ENABLED and BillingService.is_email_in_freeze(args["email"]): @@ -108,9 +110,11 @@ class ResetPasswordSendEmailApi(Resource): @setup_required @email_password_login_enabled def post(self): - parser = reqparse.RequestParser() - parser.add_argument("email", type=email, required=True, location="json") - parser.add_argument("language", type=str, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("email", type=email, required=True, location="json") + .add_argument("language", type=str, required=False, location="json") + ) args = parser.parse_args() if args["language"] is not None and args["language"] == "zh-Hans": @@ -136,9 +140,11 @@ class ResetPasswordSendEmailApi(Resource): class EmailCodeLoginSendEmailApi(Resource): @setup_required def post(self): - parser = reqparse.RequestParser() - parser.add_argument("email", type=email, required=True, location="json") - parser.add_argument("language", type=str, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("email", type=email, required=True, location="json") + .add_argument("language", type=str, required=False, location="json") + ) args = parser.parse_args() ip_address = extract_remote_ip(request) @@ -169,10 +175,12 @@ class EmailCodeLoginSendEmailApi(Resource): class EmailCodeLoginApi(Resource): @setup_required def post(self): - parser = reqparse.RequestParser() - parser.add_argument("email", type=str, required=True, location="json") - parser.add_argument("code", type=str, required=True, location="json") - parser.add_argument("token", type=str, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("email", type=str, required=True, location="json") + .add_argument("code", type=str, required=True, location="json") + .add_argument("token", type=str, required=True, location="json") + ) args = parser.parse_args() user_email = args["email"] @@ -225,8 +233,7 @@ class EmailCodeLoginApi(Resource): @console_ns.route("/refresh-token") class RefreshTokenApi(Resource): def post(self): - parser = reqparse.RequestParser() - parser.add_argument("refresh_token", type=str, required=True, location="json") + parser = reqparse.RequestParser().add_argument("refresh_token", type=str, required=True, location="json") args = parser.parse_args() try: diff --git a/api/controllers/console/auth/oauth_server.py b/api/controllers/console/auth/oauth_server.py index 188ef7f622..5e12aa7d03 100644 --- a/api/controllers/console/auth/oauth_server.py +++ b/api/controllers/console/auth/oauth_server.py @@ -23,8 +23,7 @@ T = TypeVar("T") def oauth_server_client_id_required(view: Callable[Concatenate[T, OAuthProviderApp, P], R]): @wraps(view) def decorated(self: T, *args: P.args, **kwargs: P.kwargs): - parser = reqparse.RequestParser() - parser.add_argument("client_id", type=str, required=True, location="json") + parser = reqparse.RequestParser().add_argument("client_id", type=str, required=True, location="json") parsed_args = parser.parse_args() client_id = parsed_args.get("client_id") if not client_id: @@ -90,8 +89,7 @@ class OAuthServerAppApi(Resource): @setup_required @oauth_server_client_id_required def post(self, oauth_provider_app: OAuthProviderApp): - parser = reqparse.RequestParser() - parser.add_argument("redirect_uri", type=str, required=True, location="json") + parser = reqparse.RequestParser().add_argument("redirect_uri", type=str, required=True, location="json") parsed_args = parser.parse_args() redirect_uri = parsed_args.get("redirect_uri") @@ -132,12 +130,14 @@ class OAuthServerUserTokenApi(Resource): @setup_required @oauth_server_client_id_required def post(self, oauth_provider_app: OAuthProviderApp): - parser = reqparse.RequestParser() - parser.add_argument("grant_type", type=str, required=True, location="json") - parser.add_argument("code", type=str, required=False, location="json") - parser.add_argument("client_secret", type=str, required=False, location="json") - parser.add_argument("redirect_uri", type=str, required=False, location="json") - parser.add_argument("refresh_token", type=str, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("grant_type", type=str, required=True, location="json") + .add_argument("code", type=str, required=False, location="json") + .add_argument("client_secret", type=str, required=False, location="json") + .add_argument("redirect_uri", type=str, required=False, location="json") + .add_argument("refresh_token", type=str, required=False, location="json") + ) parsed_args = parser.parse_args() try: diff --git a/api/controllers/console/billing/billing.py b/api/controllers/console/billing/billing.py index 5c89b29057..705f5970dd 100644 --- a/api/controllers/console/billing/billing.py +++ b/api/controllers/console/billing/billing.py @@ -14,9 +14,11 @@ class Subscription(Resource): @only_edition_cloud def get(self): current_user, current_tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("plan", type=str, required=True, location="args", choices=["professional", "team"]) - parser.add_argument("interval", type=str, required=True, location="args", choices=["month", "year"]) + parser = ( + reqparse.RequestParser() + .add_argument("plan", type=str, required=True, location="args", choices=["professional", "team"]) + .add_argument("interval", type=str, required=True, location="args", choices=["month", "year"]) + ) args = parser.parse_args() BillingService.is_tenant_owner_or_admin(current_user) return BillingService.get_subscription(args["plan"], args["interval"], current_user.email, current_tenant_id) diff --git a/api/controllers/console/billing/compliance.py b/api/controllers/console/billing/compliance.py index 3b32fe29a1..2a6889968c 100644 --- a/api/controllers/console/billing/compliance.py +++ b/api/controllers/console/billing/compliance.py @@ -17,8 +17,7 @@ class ComplianceApi(Resource): @only_edition_cloud def get(self): current_user, current_tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("doc_name", type=str, required=True, location="args") + parser = reqparse.RequestParser().add_argument("doc_name", type=str, required=True, location="args") args = parser.parse_args() ip_address = extract_remote_ip(request) diff --git a/api/controllers/console/datasets/data_source.py b/api/controllers/console/datasets/data_source.py index 058ef4408a..ef66053075 100644 --- a/api/controllers/console/datasets/data_source.py +++ b/api/controllers/console/datasets/data_source.py @@ -246,12 +246,12 @@ class DataSourceNotionApi(Resource): def post(self): _, current_tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("notion_info_list", type=list, required=True, nullable=True, location="json") - parser.add_argument("process_rule", type=dict, required=True, nullable=True, location="json") - parser.add_argument("doc_form", type=str, default="text_model", required=False, nullable=False, location="json") - parser.add_argument( - "doc_language", type=str, default="English", required=False, nullable=False, location="json" + parser = ( + reqparse.RequestParser() + .add_argument("notion_info_list", type=list, required=True, nullable=True, location="json") + .add_argument("process_rule", type=dict, required=True, nullable=True, location="json") + .add_argument("doc_form", type=str, default="text_model", required=False, nullable=False, location="json") + .add_argument("doc_language", type=str, default="English", required=False, nullable=False, location="json") ) args = parser.parse_args() # validate args diff --git a/api/controllers/console/datasets/datasets.py b/api/controllers/console/datasets/datasets.py index 4a9e0789fb..50bf48450c 100644 --- a/api/controllers/console/datasets/datasets.py +++ b/api/controllers/console/datasets/datasets.py @@ -206,48 +206,50 @@ class DatasetListApi(Resource): @account_initialization_required @cloud_edition_billing_rate_limit_check("knowledge") def post(self): - parser = reqparse.RequestParser() - parser.add_argument( - "name", - nullable=False, - required=True, - help="type is required. Name must be between 1 to 40 characters.", - type=_validate_name, - ) - parser.add_argument( - "description", - type=validate_description_length, - nullable=True, - required=False, - default="", - ) - parser.add_argument( - "indexing_technique", - type=str, - location="json", - choices=Dataset.INDEXING_TECHNIQUE_LIST, - nullable=True, - help="Invalid indexing technique.", - ) - parser.add_argument( - "external_knowledge_api_id", - type=str, - nullable=True, - required=False, - ) - parser.add_argument( - "provider", - type=str, - nullable=True, - choices=Dataset.PROVIDER_LIST, - required=False, - default="vendor", - ) - parser.add_argument( - "external_knowledge_id", - type=str, - nullable=True, - required=False, + parser = ( + reqparse.RequestParser() + .add_argument( + "name", + nullable=False, + required=True, + help="type is required. Name must be between 1 to 40 characters.", + type=_validate_name, + ) + .add_argument( + "description", + type=validate_description_length, + nullable=True, + required=False, + default="", + ) + .add_argument( + "indexing_technique", + type=str, + location="json", + choices=Dataset.INDEXING_TECHNIQUE_LIST, + nullable=True, + help="Invalid indexing technique.", + ) + .add_argument( + "external_knowledge_api_id", + type=str, + nullable=True, + required=False, + ) + .add_argument( + "provider", + type=str, + nullable=True, + choices=Dataset.PROVIDER_LIST, + required=False, + default="vendor", + ) + .add_argument( + "external_knowledge_id", + type=str, + nullable=True, + required=False, + ) ) args = parser.parse_args() current_user, current_tenant_id = current_account_with_tenant() @@ -352,70 +354,72 @@ class DatasetApi(Resource): if dataset is None: raise NotFound("Dataset not found.") - parser = reqparse.RequestParser() - parser.add_argument( - "name", - nullable=False, - help="type is required. Name must be between 1 to 40 characters.", - type=_validate_name, - ) - parser.add_argument("description", location="json", store_missing=False, type=validate_description_length) - parser.add_argument( - "indexing_technique", - type=str, - location="json", - choices=Dataset.INDEXING_TECHNIQUE_LIST, - nullable=True, - help="Invalid indexing technique.", - ) - parser.add_argument( - "permission", - type=str, - location="json", - choices=(DatasetPermissionEnum.ONLY_ME, DatasetPermissionEnum.ALL_TEAM, DatasetPermissionEnum.PARTIAL_TEAM), - help="Invalid permission.", - ) - parser.add_argument("embedding_model", type=str, location="json", help="Invalid embedding model.") - parser.add_argument( - "embedding_model_provider", type=str, location="json", help="Invalid embedding model provider." - ) - parser.add_argument("retrieval_model", type=dict, location="json", help="Invalid retrieval model.") - parser.add_argument("partial_member_list", type=list, location="json", help="Invalid parent user list.") - - parser.add_argument( - "external_retrieval_model", - type=dict, - required=False, - nullable=True, - location="json", - help="Invalid external retrieval model.", - ) - - parser.add_argument( - "external_knowledge_id", - type=str, - required=False, - nullable=True, - location="json", - help="Invalid external knowledge id.", - ) - - parser.add_argument( - "external_knowledge_api_id", - type=str, - required=False, - nullable=True, - location="json", - help="Invalid external knowledge api id.", - ) - - parser.add_argument( - "icon_info", - type=dict, - required=False, - nullable=True, - location="json", - help="Invalid icon info.", + parser = ( + reqparse.RequestParser() + .add_argument( + "name", + nullable=False, + help="type is required. Name must be between 1 to 40 characters.", + type=_validate_name, + ) + .add_argument("description", location="json", store_missing=False, type=validate_description_length) + .add_argument( + "indexing_technique", + type=str, + location="json", + choices=Dataset.INDEXING_TECHNIQUE_LIST, + nullable=True, + help="Invalid indexing technique.", + ) + .add_argument( + "permission", + type=str, + location="json", + choices=( + DatasetPermissionEnum.ONLY_ME, + DatasetPermissionEnum.ALL_TEAM, + DatasetPermissionEnum.PARTIAL_TEAM, + ), + help="Invalid permission.", + ) + .add_argument("embedding_model", type=str, location="json", help="Invalid embedding model.") + .add_argument( + "embedding_model_provider", type=str, location="json", help="Invalid embedding model provider." + ) + .add_argument("retrieval_model", type=dict, location="json", help="Invalid retrieval model.") + .add_argument("partial_member_list", type=list, location="json", help="Invalid parent user list.") + .add_argument( + "external_retrieval_model", + type=dict, + required=False, + nullable=True, + location="json", + help="Invalid external retrieval model.", + ) + .add_argument( + "external_knowledge_id", + type=str, + required=False, + nullable=True, + location="json", + help="Invalid external knowledge id.", + ) + .add_argument( + "external_knowledge_api_id", + type=str, + required=False, + nullable=True, + location="json", + help="Invalid external knowledge api id.", + ) + .add_argument( + "icon_info", + type=dict, + required=False, + nullable=True, + location="json", + help="Invalid icon info.", + ) ) args = parser.parse_args() data = request.get_json() @@ -542,21 +546,21 @@ class DatasetIndexingEstimateApi(Resource): @login_required @account_initialization_required def post(self): - parser = reqparse.RequestParser() - parser.add_argument("info_list", type=dict, required=True, nullable=True, location="json") - parser.add_argument("process_rule", type=dict, required=True, nullable=True, location="json") - parser.add_argument( - "indexing_technique", - type=str, - required=True, - choices=Dataset.INDEXING_TECHNIQUE_LIST, - nullable=True, - location="json", - ) - parser.add_argument("doc_form", type=str, default="text_model", required=False, nullable=False, location="json") - parser.add_argument("dataset_id", type=str, required=False, nullable=False, location="json") - parser.add_argument( - "doc_language", type=str, default="English", required=False, nullable=False, location="json" + parser = ( + reqparse.RequestParser() + .add_argument("info_list", type=dict, required=True, nullable=True, location="json") + .add_argument("process_rule", type=dict, required=True, nullable=True, location="json") + .add_argument( + "indexing_technique", + type=str, + required=True, + choices=Dataset.INDEXING_TECHNIQUE_LIST, + nullable=True, + location="json", + ) + .add_argument("doc_form", type=str, default="text_model", required=False, nullable=False, location="json") + .add_argument("dataset_id", type=str, required=False, nullable=False, location="json") + .add_argument("doc_language", type=str, default="English", required=False, nullable=False, location="json") ) args = parser.parse_args() _, current_tenant_id = current_account_with_tenant() diff --git a/api/controllers/console/datasets/datasets_document.py b/api/controllers/console/datasets/datasets_document.py index 9c0c54833e..85fd0535c7 100644 --- a/api/controllers/console/datasets/datasets_document.py +++ b/api/controllers/console/datasets/datasets_document.py @@ -292,20 +292,20 @@ class DatasetDocumentListApi(Resource): except services.errors.account.NoPermissionError as e: raise Forbidden(str(e)) - parser = reqparse.RequestParser() - parser.add_argument( - "indexing_technique", type=str, choices=Dataset.INDEXING_TECHNIQUE_LIST, nullable=False, location="json" - ) - parser.add_argument("data_source", type=dict, required=False, location="json") - parser.add_argument("process_rule", type=dict, required=False, location="json") - parser.add_argument("duplicate", type=bool, default=True, nullable=False, location="json") - parser.add_argument("original_document_id", type=str, required=False, location="json") - parser.add_argument("doc_form", type=str, default="text_model", required=False, nullable=False, location="json") - parser.add_argument("retrieval_model", type=dict, required=False, nullable=False, location="json") - parser.add_argument("embedding_model", type=str, required=False, nullable=True, location="json") - parser.add_argument("embedding_model_provider", type=str, required=False, nullable=True, location="json") - parser.add_argument( - "doc_language", type=str, default="English", required=False, nullable=False, location="json" + parser = ( + reqparse.RequestParser() + .add_argument( + "indexing_technique", type=str, choices=Dataset.INDEXING_TECHNIQUE_LIST, nullable=False, location="json" + ) + .add_argument("data_source", type=dict, required=False, location="json") + .add_argument("process_rule", type=dict, required=False, location="json") + .add_argument("duplicate", type=bool, default=True, nullable=False, location="json") + .add_argument("original_document_id", type=str, required=False, location="json") + .add_argument("doc_form", type=str, default="text_model", required=False, nullable=False, location="json") + .add_argument("retrieval_model", type=dict, required=False, nullable=False, location="json") + .add_argument("embedding_model", type=str, required=False, nullable=True, location="json") + .add_argument("embedding_model_provider", type=str, required=False, nullable=True, location="json") + .add_argument("doc_language", type=str, default="English", required=False, nullable=False, location="json") ) args = parser.parse_args() knowledge_config = KnowledgeConfig.model_validate(args) @@ -379,24 +379,24 @@ class DatasetInitApi(Resource): if not current_user.is_dataset_editor: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument( - "indexing_technique", - type=str, - choices=Dataset.INDEXING_TECHNIQUE_LIST, - required=True, - nullable=False, - location="json", + parser = ( + reqparse.RequestParser() + .add_argument( + "indexing_technique", + type=str, + choices=Dataset.INDEXING_TECHNIQUE_LIST, + required=True, + nullable=False, + location="json", + ) + .add_argument("data_source", type=dict, required=True, nullable=True, location="json") + .add_argument("process_rule", type=dict, required=True, nullable=True, location="json") + .add_argument("doc_form", type=str, default="text_model", required=False, nullable=False, location="json") + .add_argument("doc_language", type=str, default="English", required=False, nullable=False, location="json") + .add_argument("retrieval_model", type=dict, required=False, nullable=False, location="json") + .add_argument("embedding_model", type=str, required=False, nullable=True, location="json") + .add_argument("embedding_model_provider", type=str, required=False, nullable=True, location="json") ) - parser.add_argument("data_source", type=dict, required=True, nullable=True, location="json") - parser.add_argument("process_rule", type=dict, required=True, nullable=True, location="json") - parser.add_argument("doc_form", type=str, default="text_model", required=False, nullable=False, location="json") - parser.add_argument( - "doc_language", type=str, default="English", required=False, nullable=False, location="json" - ) - parser.add_argument("retrieval_model", type=dict, required=False, nullable=False, location="json") - parser.add_argument("embedding_model", type=str, required=False, nullable=True, location="json") - parser.add_argument("embedding_model_provider", type=str, required=False, nullable=True, location="json") args = parser.parse_args() knowledge_config = KnowledgeConfig.model_validate(args) @@ -1043,8 +1043,9 @@ class DocumentRetryApi(DocumentResource): def post(self, dataset_id): """retry document.""" - parser = reqparse.RequestParser() - parser.add_argument("document_ids", type=list, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument( + "document_ids", type=list, required=True, nullable=False, location="json" + ) args = parser.parse_args() dataset_id = str(dataset_id) dataset = DatasetService.get_dataset(dataset_id) @@ -1093,8 +1094,7 @@ class DocumentRenameApi(DocumentResource): if not dataset: raise NotFound("Dataset not found.") DatasetService.check_dataset_operator_permission(current_user, dataset) - parser = reqparse.RequestParser() - parser.add_argument("name", type=str, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument("name", type=str, required=True, nullable=False, location="json") args = parser.parse_args() try: diff --git a/api/controllers/console/datasets/datasets_segments.py b/api/controllers/console/datasets/datasets_segments.py index d4d484a2e2..2fe7d42e46 100644 --- a/api/controllers/console/datasets/datasets_segments.py +++ b/api/controllers/console/datasets/datasets_segments.py @@ -60,13 +60,15 @@ class DatasetDocumentSegmentListApi(Resource): if not document: raise NotFound("Document not found.") - parser = reqparse.RequestParser() - parser.add_argument("limit", type=int, default=20, location="args") - parser.add_argument("status", type=str, action="append", default=[], location="args") - parser.add_argument("hit_count_gte", type=int, default=None, location="args") - parser.add_argument("enabled", type=str, default="all", location="args") - parser.add_argument("keyword", type=str, default=None, location="args") - parser.add_argument("page", type=int, default=1, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("limit", type=int, default=20, location="args") + .add_argument("status", type=str, action="append", default=[], location="args") + .add_argument("hit_count_gte", type=int, default=None, location="args") + .add_argument("enabled", type=str, default="all", location="args") + .add_argument("keyword", type=str, default=None, location="args") + .add_argument("page", type=int, default=1, location="args") + ) args = parser.parse_args() @@ -244,10 +246,12 @@ class DatasetDocumentSegmentAddApi(Resource): except services.errors.account.NoPermissionError as e: raise Forbidden(str(e)) # validate args - parser = reqparse.RequestParser() - parser.add_argument("content", type=str, required=True, nullable=False, location="json") - parser.add_argument("answer", type=str, required=False, nullable=True, location="json") - parser.add_argument("keywords", type=list, required=False, nullable=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("content", type=str, required=True, nullable=False, location="json") + .add_argument("answer", type=str, required=False, nullable=True, location="json") + .add_argument("keywords", type=list, required=False, nullable=True, location="json") + ) args = parser.parse_args() SegmentService.segment_create_args_validate(args, document) segment = SegmentService.create_segment(args, document, dataset) @@ -309,12 +313,14 @@ class DatasetDocumentSegmentUpdateApi(Resource): except services.errors.account.NoPermissionError as e: raise Forbidden(str(e)) # validate args - parser = reqparse.RequestParser() - parser.add_argument("content", type=str, required=True, nullable=False, location="json") - parser.add_argument("answer", type=str, required=False, nullable=True, location="json") - parser.add_argument("keywords", type=list, required=False, nullable=True, location="json") - parser.add_argument( - "regenerate_child_chunks", type=bool, required=False, nullable=True, default=False, location="json" + parser = ( + reqparse.RequestParser() + .add_argument("content", type=str, required=True, nullable=False, location="json") + .add_argument("answer", type=str, required=False, nullable=True, location="json") + .add_argument("keywords", type=list, required=False, nullable=True, location="json") + .add_argument( + "regenerate_child_chunks", type=bool, required=False, nullable=True, default=False, location="json" + ) ) args = parser.parse_args() SegmentService.segment_create_args_validate(args, document) @@ -385,8 +391,9 @@ class DatasetDocumentSegmentBatchImportApi(Resource): if not document: raise NotFound("Document not found.") - parser = reqparse.RequestParser() - parser.add_argument("upload_file_id", type=str, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument( + "upload_file_id", type=str, required=True, nullable=False, location="json" + ) args = parser.parse_args() upload_file_id = args["upload_file_id"] @@ -484,8 +491,9 @@ class ChildChunkAddApi(Resource): except services.errors.account.NoPermissionError as e: raise Forbidden(str(e)) # validate args - parser = reqparse.RequestParser() - parser.add_argument("content", type=str, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument( + "content", type=str, required=True, nullable=False, location="json" + ) args = parser.parse_args() try: content = args["content"] @@ -521,10 +529,12 @@ class ChildChunkAddApi(Resource): ) if not segment: raise NotFound("Segment not found.") - parser = reqparse.RequestParser() - parser.add_argument("limit", type=int, default=20, location="args") - parser.add_argument("keyword", type=str, default=None, location="args") - parser.add_argument("page", type=int, default=1, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("limit", type=int, default=20, location="args") + .add_argument("keyword", type=str, default=None, location="args") + .add_argument("page", type=int, default=1, location="args") + ) args = parser.parse_args() @@ -578,8 +588,9 @@ class ChildChunkAddApi(Resource): except services.errors.account.NoPermissionError as e: raise Forbidden(str(e)) # validate args - parser = reqparse.RequestParser() - parser.add_argument("chunks", type=list, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument( + "chunks", type=list, required=True, nullable=False, location="json" + ) args = parser.parse_args() try: chunks_data = args["chunks"] @@ -700,8 +711,9 @@ class ChildChunkUpdateApi(Resource): except services.errors.account.NoPermissionError as e: raise Forbidden(str(e)) # validate args - parser = reqparse.RequestParser() - parser.add_argument("content", type=str, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument( + "content", type=str, required=True, nullable=False, location="json" + ) args = parser.parse_args() try: content = args["content"] diff --git a/api/controllers/console/datasets/external.py b/api/controllers/console/datasets/external.py index 1ebd7101e4..4f738db0e5 100644 --- a/api/controllers/console/datasets/external.py +++ b/api/controllers/console/datasets/external.py @@ -58,20 +58,22 @@ class ExternalApiTemplateListApi(Resource): @account_initialization_required def post(self): current_user, current_tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument( - "name", - nullable=False, - required=True, - help="Name is required. Name must be between 1 to 100 characters.", - type=_validate_name, - ) - parser.add_argument( - "settings", - type=dict, - location="json", - nullable=False, - required=True, + parser = ( + reqparse.RequestParser() + .add_argument( + "name", + nullable=False, + required=True, + help="Name is required. Name must be between 1 to 100 characters.", + type=_validate_name, + ) + .add_argument( + "settings", + type=dict, + location="json", + nullable=False, + required=True, + ) ) args = parser.parse_args() @@ -116,20 +118,22 @@ class ExternalApiTemplateApi(Resource): current_user, current_tenant_id = current_account_with_tenant() external_knowledge_api_id = str(external_knowledge_api_id) - parser = reqparse.RequestParser() - parser.add_argument( - "name", - nullable=False, - required=True, - help="type is required. Name must be between 1 to 100 characters.", - type=_validate_name, - ) - parser.add_argument( - "settings", - type=dict, - location="json", - nullable=False, - required=True, + parser = ( + reqparse.RequestParser() + .add_argument( + "name", + nullable=False, + required=True, + help="type is required. Name must be between 1 to 100 characters.", + type=_validate_name, + ) + .add_argument( + "settings", + type=dict, + location="json", + nullable=False, + required=True, + ) ) args = parser.parse_args() ExternalDatasetService.validate_api_list(args["settings"]) @@ -202,18 +206,20 @@ class ExternalDatasetCreateApi(Resource): if not current_user.has_edit_permission: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("external_knowledge_api_id", type=str, required=True, nullable=False, location="json") - parser.add_argument("external_knowledge_id", type=str, required=True, nullable=False, location="json") - parser.add_argument( - "name", - nullable=False, - required=True, - help="name is required. Name must be between 1 to 100 characters.", - type=_validate_name, + parser = ( + reqparse.RequestParser() + .add_argument("external_knowledge_api_id", type=str, required=True, nullable=False, location="json") + .add_argument("external_knowledge_id", type=str, required=True, nullable=False, location="json") + .add_argument( + "name", + nullable=False, + required=True, + help="name is required. Name must be between 1 to 100 characters.", + type=_validate_name, + ) + .add_argument("description", type=str, required=False, nullable=True, location="json") + .add_argument("external_retrieval_model", type=dict, required=False, location="json") ) - parser.add_argument("description", type=str, required=False, nullable=True, location="json") - parser.add_argument("external_retrieval_model", type=dict, required=False, location="json") args = parser.parse_args() @@ -266,10 +272,12 @@ class ExternalKnowledgeHitTestingApi(Resource): except services.errors.account.NoPermissionError as e: raise Forbidden(str(e)) - parser = reqparse.RequestParser() - parser.add_argument("query", type=str, location="json") - parser.add_argument("external_retrieval_model", type=dict, required=False, location="json") - parser.add_argument("metadata_filtering_conditions", type=dict, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("query", type=str, location="json") + .add_argument("external_retrieval_model", type=dict, required=False, location="json") + .add_argument("metadata_filtering_conditions", type=dict, required=False, location="json") + ) args = parser.parse_args() HitTestingService.hit_testing_args_check(args) @@ -305,15 +313,17 @@ class BedrockRetrievalApi(Resource): ) @api.response(200, "Bedrock retrieval test completed") def post(self): - parser = reqparse.RequestParser() - parser.add_argument("retrieval_setting", nullable=False, required=True, type=dict, location="json") - parser.add_argument( - "query", - nullable=False, - required=True, - type=str, + parser = ( + reqparse.RequestParser() + .add_argument("retrieval_setting", nullable=False, required=True, type=dict, location="json") + .add_argument( + "query", + nullable=False, + required=True, + type=str, + ) + .add_argument("knowledge_id", nullable=False, required=True, type=str) ) - parser.add_argument("knowledge_id", nullable=False, required=True, type=str) args = parser.parse_args() # Call the knowledge retrieval service diff --git a/api/controllers/console/datasets/hit_testing_base.py b/api/controllers/console/datasets/hit_testing_base.py index 6113f1fd17..99d4d5a29c 100644 --- a/api/controllers/console/datasets/hit_testing_base.py +++ b/api/controllers/console/datasets/hit_testing_base.py @@ -48,11 +48,12 @@ class DatasetsHitTestingBase: @staticmethod def parse_args(): - parser = reqparse.RequestParser() - - parser.add_argument("query", type=str, location="json") - parser.add_argument("retrieval_model", type=dict, required=False, location="json") - parser.add_argument("external_retrieval_model", type=dict, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("query", type=str, location="json") + .add_argument("retrieval_model", type=dict, required=False, location="json") + .add_argument("external_retrieval_model", type=dict, required=False, location="json") + ) return parser.parse_args() @staticmethod diff --git a/api/controllers/console/datasets/metadata.py b/api/controllers/console/datasets/metadata.py index 673bac1add..72b2ff0ff8 100644 --- a/api/controllers/console/datasets/metadata.py +++ b/api/controllers/console/datasets/metadata.py @@ -24,9 +24,11 @@ class DatasetMetadataCreateApi(Resource): @marshal_with(dataset_metadata_fields) def post(self, dataset_id): current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("type", type=str, required=True, nullable=False, location="json") - parser.add_argument("name", type=str, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("type", type=str, required=True, nullable=False, location="json") + .add_argument("name", type=str, required=True, nullable=False, location="json") + ) args = parser.parse_args() metadata_args = MetadataArgs.model_validate(args) @@ -60,8 +62,7 @@ class DatasetMetadataApi(Resource): @marshal_with(dataset_metadata_fields) def patch(self, dataset_id, metadata_id): current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("name", type=str, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument("name", type=str, required=True, nullable=False, location="json") args = parser.parse_args() name = args["name"] @@ -138,8 +139,9 @@ class DocumentMetadataEditApi(Resource): raise NotFound("Dataset not found.") DatasetService.check_dataset_permission(dataset, current_user) - parser = reqparse.RequestParser() - parser.add_argument("operation_data", type=list, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument( + "operation_data", type=list, required=True, nullable=False, location="json" + ) args = parser.parse_args() metadata_args = MetadataOperationData.model_validate(args) diff --git a/api/controllers/console/datasets/rag_pipeline/datasource_auth.py b/api/controllers/console/datasets/rag_pipeline/datasource_auth.py index 194bd98fa3..2111ee2ecf 100644 --- a/api/controllers/console/datasets/rag_pipeline/datasource_auth.py +++ b/api/controllers/console/datasets/rag_pipeline/datasource_auth.py @@ -130,11 +130,13 @@ class DatasourceAuth(Resource): def post(self, provider_id: str): _, current_tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument( - "name", type=StrLen(max_length=100), required=False, nullable=True, location="json", default=None + parser = ( + reqparse.RequestParser() + .add_argument( + "name", type=StrLen(max_length=100), required=False, nullable=True, location="json", default=None + ) + .add_argument("credentials", type=dict, required=True, nullable=False, location="json") ) - parser.add_argument("credentials", type=dict, required=True, nullable=False, location="json") args = parser.parse_args() datasource_provider_id = DatasourceProviderID(provider_id) datasource_provider_service = DatasourceProviderService() @@ -179,8 +181,9 @@ class DatasourceAuthDeleteApi(Resource): plugin_id = datasource_provider_id.plugin_id provider_name = datasource_provider_id.provider_name - parser = reqparse.RequestParser() - parser.add_argument("credential_id", type=str, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument( + "credential_id", type=str, required=True, nullable=False, location="json" + ) args = parser.parse_args() datasource_provider_service = DatasourceProviderService() datasource_provider_service.remove_datasource_credentials( @@ -202,10 +205,12 @@ class DatasourceAuthUpdateApi(Resource): _, current_tenant_id = current_account_with_tenant() datasource_provider_id = DatasourceProviderID(provider_id) - parser = reqparse.RequestParser() - parser.add_argument("credentials", type=dict, required=False, nullable=True, location="json") - parser.add_argument("name", type=StrLen(max_length=100), required=False, nullable=True, location="json") - parser.add_argument("credential_id", type=str, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("credentials", type=dict, required=False, nullable=True, location="json") + .add_argument("name", type=StrLen(max_length=100), required=False, nullable=True, location="json") + .add_argument("credential_id", type=str, required=True, nullable=False, location="json") + ) args = parser.parse_args() datasource_provider_service = DatasourceProviderService() @@ -255,9 +260,11 @@ class DatasourceAuthOauthCustomClient(Resource): def post(self, provider_id: str): _, current_tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("client_params", type=dict, required=False, nullable=True, location="json") - parser.add_argument("enable_oauth_custom_client", type=bool, required=False, nullable=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("client_params", type=dict, required=False, nullable=True, location="json") + .add_argument("enable_oauth_custom_client", type=bool, required=False, nullable=True, location="json") + ) args = parser.parse_args() datasource_provider_id = DatasourceProviderID(provider_id) datasource_provider_service = DatasourceProviderService() @@ -293,8 +300,7 @@ class DatasourceAuthDefaultApi(Resource): def post(self, provider_id: str): _, current_tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("id", type=str, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument("id", type=str, required=True, nullable=False, location="json") args = parser.parse_args() datasource_provider_id = DatasourceProviderID(provider_id) datasource_provider_service = DatasourceProviderService() @@ -315,9 +321,11 @@ class DatasourceUpdateProviderNameApi(Resource): def post(self, provider_id: str): _, current_tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("name", type=StrLen(max_length=100), required=True, nullable=False, location="json") - parser.add_argument("credential_id", type=str, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("name", type=StrLen(max_length=100), required=True, nullable=False, location="json") + .add_argument("credential_id", type=str, required=True, nullable=False, location="json") + ) args = parser.parse_args() datasource_provider_id = DatasourceProviderID(provider_id) datasource_provider_service = DatasourceProviderService() diff --git a/api/controllers/console/datasets/rag_pipeline/datasource_content_preview.py b/api/controllers/console/datasets/rag_pipeline/datasource_content_preview.py index 6c04cc877a..856e4a1c70 100644 --- a/api/controllers/console/datasets/rag_pipeline/datasource_content_preview.py +++ b/api/controllers/console/datasets/rag_pipeline/datasource_content_preview.py @@ -26,10 +26,12 @@ class DataSourceContentPreviewApi(Resource): if not isinstance(current_user, Account): raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, nullable=False, location="json") - parser.add_argument("datasource_type", type=str, required=True, location="json") - parser.add_argument("credential_id", type=str, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, nullable=False, location="json") + .add_argument("datasource_type", type=str, required=True, location="json") + .add_argument("credential_id", type=str, required=False, location="json") + ) args = parser.parse_args() inputs = args.get("inputs") diff --git a/api/controllers/console/datasets/rag_pipeline/rag_pipeline.py b/api/controllers/console/datasets/rag_pipeline/rag_pipeline.py index e021f95283..f589bba3bf 100644 --- a/api/controllers/console/datasets/rag_pipeline/rag_pipeline.py +++ b/api/controllers/console/datasets/rag_pipeline/rag_pipeline.py @@ -66,26 +66,28 @@ class CustomizedPipelineTemplateApi(Resource): @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=_validate_description_length, - nullable=True, - required=False, - default="", - ) - parser.add_argument( - "icon_info", - type=dict, - location="json", - nullable=True, + parser = ( + reqparse.RequestParser() + .add_argument( + "name", + nullable=False, + required=True, + help="Name must be between 1 to 40 characters.", + type=_validate_name, + ) + .add_argument( + "description", + type=_validate_description_length, + nullable=True, + required=False, + default="", + ) + .add_argument( + "icon_info", + type=dict, + location="json", + nullable=True, + ) ) args = parser.parse_args() pipeline_template_info = PipelineTemplateInfoEntity.model_validate(args) @@ -123,26 +125,28 @@ class PublishCustomizedPipelineTemplateApi(Resource): @enterprise_license_required @knowledge_pipeline_publish_enabled 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=_validate_description_length, - nullable=True, - required=False, - default="", - ) - parser.add_argument( - "icon_info", - type=dict, - location="json", - nullable=True, + parser = ( + reqparse.RequestParser() + .add_argument( + "name", + nullable=False, + required=True, + help="Name must be between 1 to 40 characters.", + type=_validate_name, + ) + .add_argument( + "description", + type=_validate_description_length, + nullable=True, + required=False, + default="", + ) + .add_argument( + "icon_info", + type=dict, + location="json", + nullable=True, + ) ) args = parser.parse_args() rag_pipeline_service = RagPipelineService() diff --git a/api/controllers/console/datasets/rag_pipeline/rag_pipeline_datasets.py b/api/controllers/console/datasets/rag_pipeline/rag_pipeline_datasets.py index b394887783..98876e9f5e 100644 --- a/api/controllers/console/datasets/rag_pipeline/rag_pipeline_datasets.py +++ b/api/controllers/console/datasets/rag_pipeline/rag_pipeline_datasets.py @@ -26,9 +26,7 @@ class CreateRagPipelineDatasetApi(Resource): @account_initialization_required @cloud_edition_billing_rate_limit_check("knowledge") def post(self): - parser = reqparse.RequestParser() - - parser.add_argument( + parser = reqparse.RequestParser().add_argument( "yaml_content", type=str, nullable=False, diff --git a/api/controllers/console/datasets/rag_pipeline/rag_pipeline_draft_variable.py b/api/controllers/console/datasets/rag_pipeline/rag_pipeline_draft_variable.py index 2e8cc16dc1..858ba94bf8 100644 --- a/api/controllers/console/datasets/rag_pipeline/rag_pipeline_draft_variable.py +++ b/api/controllers/console/datasets/rag_pipeline/rag_pipeline_draft_variable.py @@ -33,16 +33,18 @@ logger = logging.getLogger(__name__) def _create_pagination_parser(): - parser = reqparse.RequestParser() - parser.add_argument( - "page", - type=inputs.int_range(1, 100_000), - required=False, - default=1, - location="args", - help="the page of data requested", + parser = ( + reqparse.RequestParser() + .add_argument( + "page", + type=inputs.int_range(1, 100_000), + required=False, + default=1, + location="args", + help="the page of data requested", + ) + .add_argument("limit", type=inputs.int_range(1, 100), required=False, default=20, location="args") ) - parser.add_argument("limit", type=inputs.int_range(1, 100), required=False, default=20, location="args") return parser @@ -206,10 +208,11 @@ class RagPipelineVariableApi(Resource): # "upload_file_id": "1602650a-4fe4-423c-85a2-af76c083e3c4" # } - parser = reqparse.RequestParser() - parser.add_argument(self._PATCH_NAME_FIELD, type=str, required=False, nullable=True, location="json") - # Parse 'value' field as-is to maintain its original data structure - parser.add_argument(self._PATCH_VALUE_FIELD, type=lambda x: x, required=False, nullable=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument(self._PATCH_NAME_FIELD, type=str, required=False, nullable=True, location="json") + .add_argument(self._PATCH_VALUE_FIELD, type=lambda x: x, required=False, nullable=True, location="json") + ) draft_var_srv = WorkflowDraftVariableService( session=db.session(), diff --git a/api/controllers/console/datasets/rag_pipeline/rag_pipeline_import.py b/api/controllers/console/datasets/rag_pipeline/rag_pipeline_import.py index ca767dbb10..2c28120e65 100644 --- a/api/controllers/console/datasets/rag_pipeline/rag_pipeline_import.py +++ b/api/controllers/console/datasets/rag_pipeline/rag_pipeline_import.py @@ -28,16 +28,18 @@ class RagPipelineImportApi(Resource): if not current_user.has_edit_permission: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("mode", type=str, required=True, location="json") - parser.add_argument("yaml_content", type=str, location="json") - parser.add_argument("yaml_url", type=str, location="json") - parser.add_argument("name", type=str, location="json") - parser.add_argument("description", type=str, location="json") - parser.add_argument("icon_type", type=str, location="json") - parser.add_argument("icon", type=str, location="json") - parser.add_argument("icon_background", type=str, location="json") - parser.add_argument("pipeline_id", type=str, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("mode", type=str, required=True, location="json") + .add_argument("yaml_content", type=str, location="json") + .add_argument("yaml_url", type=str, location="json") + .add_argument("name", type=str, location="json") + .add_argument("description", type=str, location="json") + .add_argument("icon_type", type=str, location="json") + .add_argument("icon", type=str, location="json") + .add_argument("icon_background", type=str, location="json") + .add_argument("pipeline_id", type=str, location="json") + ) args = parser.parse_args() # Create service with session @@ -121,8 +123,7 @@ class RagPipelineExportApi(Resource): raise Forbidden() # Add include_secret params - parser = reqparse.RequestParser() - parser.add_argument("include_secret", type=str, default="false", location="args") + parser = reqparse.RequestParser().add_argument("include_secret", type=str, default="false", location="args") args = parser.parse_args() with Session(db.engine) as session: diff --git a/api/controllers/console/datasets/rag_pipeline/rag_pipeline_workflow.py b/api/controllers/console/datasets/rag_pipeline/rag_pipeline_workflow.py index 77dcf30a78..5fe8572dfa 100644 --- a/api/controllers/console/datasets/rag_pipeline/rag_pipeline_workflow.py +++ b/api/controllers/console/datasets/rag_pipeline/rag_pipeline_workflow.py @@ -88,12 +88,14 @@ class DraftRagPipelineApi(Resource): content_type = request.headers.get("Content-Type", "") if "application/json" in content_type: - parser = reqparse.RequestParser() - parser.add_argument("graph", type=dict, required=True, nullable=False, location="json") - parser.add_argument("hash", type=str, required=False, location="json") - parser.add_argument("environment_variables", type=list, required=False, location="json") - parser.add_argument("conversation_variables", type=list, required=False, location="json") - parser.add_argument("rag_pipeline_variables", type=list, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("graph", type=dict, required=True, nullable=False, location="json") + .add_argument("hash", type=str, required=False, location="json") + .add_argument("environment_variables", type=list, required=False, location="json") + .add_argument("conversation_variables", type=list, required=False, location="json") + .add_argument("rag_pipeline_variables", type=list, required=False, location="json") + ) args = parser.parse_args() elif "text/plain" in content_type: try: @@ -160,8 +162,7 @@ class RagPipelineDraftRunIterationNodeApi(Resource): # The role of the current user in the ta table must be admin, owner, or editor current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, location="json") + parser = reqparse.RequestParser().add_argument("inputs", type=dict, location="json") args = parser.parse_args() try: @@ -196,8 +197,7 @@ class RagPipelineDraftRunLoopNodeApi(Resource): if not current_user.has_edit_permission: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, location="json") + parser = reqparse.RequestParser().add_argument("inputs", type=dict, location="json") args = parser.parse_args() try: @@ -232,11 +232,13 @@ class DraftRagPipelineRunApi(Resource): if not current_user.has_edit_permission: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, nullable=False, location="json") - parser.add_argument("datasource_type", type=str, required=True, location="json") - parser.add_argument("datasource_info_list", type=list, required=True, location="json") - parser.add_argument("start_node_id", type=str, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, nullable=False, location="json") + .add_argument("datasource_type", type=str, required=True, location="json") + .add_argument("datasource_info_list", type=list, required=True, location="json") + .add_argument("start_node_id", type=str, required=True, location="json") + ) args = parser.parse_args() try: @@ -268,14 +270,16 @@ class PublishedRagPipelineRunApi(Resource): if not current_user.has_edit_permission: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, nullable=False, location="json") - parser.add_argument("datasource_type", type=str, required=True, location="json") - parser.add_argument("datasource_info_list", type=list, required=True, location="json") - parser.add_argument("start_node_id", type=str, required=True, location="json") - parser.add_argument("is_preview", type=bool, required=True, location="json", default=False) - parser.add_argument("response_mode", type=str, required=True, location="json", default="streaming") - parser.add_argument("original_document_id", type=str, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, nullable=False, location="json") + .add_argument("datasource_type", type=str, required=True, location="json") + .add_argument("datasource_info_list", type=list, required=True, location="json") + .add_argument("start_node_id", type=str, required=True, location="json") + .add_argument("is_preview", type=bool, required=True, location="json", default=False) + .add_argument("response_mode", type=str, required=True, location="json", default="streaming") + .add_argument("original_document_id", type=str, required=False, location="json") + ) args = parser.parse_args() streaming = args["response_mode"] == "streaming" @@ -310,9 +314,10 @@ class PublishedRagPipelineRunApi(Resource): # if not isinstance(current_user, Account): # raise Forbidden() # -# parser = reqparse.RequestParser() -# parser.add_argument("job_id", type=str, required=True, nullable=False, location="json") -# parser.add_argument("datasource_type", type=str, required=True, location="json") +# parser = (reqparse.RequestParser() +# .add_argument("job_id", type=str, required=True, nullable=False, location="json") +# .add_argument("datasource_type", type=str, required=True, location="json") +# ) # args = parser.parse_args() # # job_id = args.get("job_id") @@ -351,9 +356,10 @@ class PublishedRagPipelineRunApi(Resource): # if not isinstance(current_user, Account): # raise Forbidden() # -# parser = reqparse.RequestParser() -# parser.add_argument("job_id", type=str, required=True, nullable=False, location="json") -# parser.add_argument("datasource_type", type=str, required=True, location="json") +# parser = (reqparse.RequestParser() +# .add_argument("job_id", type=str, required=True, nullable=False, location="json") +# .add_argument("datasource_type", type=str, required=True, location="json") +# ) # args = parser.parse_args() # # job_id = args.get("job_id") @@ -390,10 +396,12 @@ class RagPipelinePublishedDatasourceNodeRunApi(Resource): if not current_user.has_edit_permission: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, nullable=False, location="json") - parser.add_argument("datasource_type", type=str, required=True, location="json") - parser.add_argument("credential_id", type=str, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, nullable=False, location="json") + .add_argument("datasource_type", type=str, required=True, location="json") + .add_argument("credential_id", type=str, required=False, location="json") + ) args = parser.parse_args() inputs = args.get("inputs") @@ -434,10 +442,12 @@ class RagPipelineDraftDatasourceNodeRunApi(Resource): if not current_user.has_edit_permission: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, nullable=False, location="json") - parser.add_argument("datasource_type", type=str, required=True, location="json") - parser.add_argument("credential_id", type=str, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, nullable=False, location="json") + .add_argument("datasource_type", type=str, required=True, location="json") + .add_argument("credential_id", type=str, required=False, location="json") + ) args = parser.parse_args() inputs = args.get("inputs") @@ -479,8 +489,9 @@ class RagPipelineDraftNodeRunApi(Resource): if not current_user.has_edit_permission: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument( + "inputs", type=dict, required=True, nullable=False, location="json" + ) args = parser.parse_args() inputs = args.get("inputs") @@ -611,8 +622,7 @@ class DefaultRagPipelineBlockConfigApi(Resource): if not current_user.has_edit_permission: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("q", type=str, location="args") + parser = reqparse.RequestParser().add_argument("q", type=str, location="args") args = parser.parse_args() q = args.get("q") @@ -644,11 +654,13 @@ class PublishedAllRagPipelineApi(Resource): if not current_user.has_edit_permission: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("page", type=inputs.int_range(1, 99999), required=False, default=1, location="args") - parser.add_argument("limit", type=inputs.int_range(1, 100), required=False, default=20, location="args") - parser.add_argument("user_id", type=str, required=False, location="args") - parser.add_argument("named_only", type=inputs.boolean, required=False, default=False, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("page", type=inputs.int_range(1, 99999), required=False, default=1, location="args") + .add_argument("limit", type=inputs.int_range(1, 100), required=False, default=20, location="args") + .add_argument("user_id", type=str, required=False, location="args") + .add_argument("named_only", type=inputs.boolean, required=False, default=False, location="args") + ) args = parser.parse_args() page = int(args.get("page", 1)) limit = int(args.get("limit", 10)) @@ -695,9 +707,11 @@ class RagPipelineByIdApi(Resource): if not current_user.has_edit_permission: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("marked_name", type=str, required=False, location="json") - parser.add_argument("marked_comment", type=str, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("marked_name", type=str, required=False, location="json") + .add_argument("marked_comment", type=str, required=False, location="json") + ) args = parser.parse_args() # Validate name and comment length @@ -749,8 +763,7 @@ class PublishedRagPipelineSecondStepApi(Resource): """ Get second step parameters of rag pipeline """ - parser = reqparse.RequestParser() - parser.add_argument("node_id", type=str, required=True, location="args") + parser = reqparse.RequestParser().add_argument("node_id", type=str, required=True, location="args") args = parser.parse_args() node_id = args.get("node_id") if not node_id: @@ -773,8 +786,7 @@ class PublishedRagPipelineFirstStepApi(Resource): """ Get first step parameters of rag pipeline """ - parser = reqparse.RequestParser() - parser.add_argument("node_id", type=str, required=True, location="args") + parser = reqparse.RequestParser().add_argument("node_id", type=str, required=True, location="args") args = parser.parse_args() node_id = args.get("node_id") if not node_id: @@ -797,8 +809,7 @@ class DraftRagPipelineFirstStepApi(Resource): """ Get first step parameters of rag pipeline """ - parser = reqparse.RequestParser() - parser.add_argument("node_id", type=str, required=True, location="args") + parser = reqparse.RequestParser().add_argument("node_id", type=str, required=True, location="args") args = parser.parse_args() node_id = args.get("node_id") if not node_id: @@ -821,8 +832,7 @@ class DraftRagPipelineSecondStepApi(Resource): """ Get second step parameters of rag pipeline """ - parser = reqparse.RequestParser() - parser.add_argument("node_id", type=str, required=True, location="args") + parser = reqparse.RequestParser().add_argument("node_id", type=str, required=True, location="args") args = parser.parse_args() node_id = args.get("node_id") if not node_id: @@ -846,9 +856,11 @@ class RagPipelineWorkflowRunListApi(Resource): """ Get workflow run list """ - parser = reqparse.RequestParser() - parser.add_argument("last_id", type=uuid_value, location="args") - parser.add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("last_id", type=uuid_value, location="args") + .add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") + ) args = parser.parse_args() rag_pipeline_service = RagPipelineService() @@ -962,11 +974,13 @@ class RagPipelineDatasourceVariableApi(Resource): Set datasource variables """ current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("datasource_type", type=str, required=True, location="json") - parser.add_argument("datasource_info", type=dict, required=True, location="json") - parser.add_argument("start_node_id", type=str, required=True, location="json") - parser.add_argument("start_node_title", type=str, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("datasource_type", type=str, required=True, location="json") + .add_argument("datasource_info", type=dict, required=True, location="json") + .add_argument("start_node_id", type=str, required=True, location="json") + .add_argument("start_node_title", type=str, required=True, location="json") + ) args = parser.parse_args() rag_pipeline_service = RagPipelineService() diff --git a/api/controllers/console/datasets/website.py b/api/controllers/console/datasets/website.py index b9c1f65bfd..fe6eaaa0de 100644 --- a/api/controllers/console/datasets/website.py +++ b/api/controllers/console/datasets/website.py @@ -31,17 +31,19 @@ class WebsiteCrawlApi(Resource): @login_required @account_initialization_required def post(self): - parser = reqparse.RequestParser() - parser.add_argument( - "provider", - type=str, - choices=["firecrawl", "watercrawl", "jinareader"], - required=True, - nullable=True, - location="json", + parser = ( + reqparse.RequestParser() + .add_argument( + "provider", + type=str, + choices=["firecrawl", "watercrawl", "jinareader"], + required=True, + nullable=True, + location="json", + ) + .add_argument("url", type=str, required=True, nullable=True, location="json") + .add_argument("options", type=dict, required=True, nullable=True, location="json") ) - parser.add_argument("url", type=str, required=True, nullable=True, location="json") - parser.add_argument("options", type=dict, required=True, nullable=True, location="json") args = parser.parse_args() # Create typed request and validate @@ -70,8 +72,7 @@ class WebsiteCrawlStatusApi(Resource): @login_required @account_initialization_required def get(self, job_id: str): - parser = reqparse.RequestParser() - parser.add_argument( + parser = reqparse.RequestParser().add_argument( "provider", type=str, choices=["firecrawl", "watercrawl", "jinareader"], required=True, location="args" ) args = parser.parse_args() diff --git a/api/controllers/console/explore/audio.py b/api/controllers/console/explore/audio.py index 7c20fb49d8..2a248cf20d 100644 --- a/api/controllers/console/explore/audio.py +++ b/api/controllers/console/explore/audio.py @@ -81,11 +81,13 @@ class ChatTextApi(InstalledAppResource): app_model = installed_app.app try: - parser = reqparse.RequestParser() - parser.add_argument("message_id", type=str, required=False, location="json") - parser.add_argument("voice", type=str, location="json") - parser.add_argument("text", type=str, location="json") - parser.add_argument("streaming", type=bool, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("message_id", type=str, required=False, location="json") + .add_argument("voice", type=str, location="json") + .add_argument("text", type=str, location="json") + .add_argument("streaming", type=bool, location="json") + ) args = parser.parse_args() message_id = args.get("message_id", None) diff --git a/api/controllers/console/explore/completion.py b/api/controllers/console/explore/completion.py index 1102b815eb..9386ecebae 100644 --- a/api/controllers/console/explore/completion.py +++ b/api/controllers/console/explore/completion.py @@ -49,12 +49,14 @@ class CompletionApi(InstalledAppResource): if app_model.mode != "completion": raise NotCompletionAppError() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, location="json") - parser.add_argument("query", type=str, location="json", default="") - parser.add_argument("files", type=list, required=False, location="json") - parser.add_argument("response_mode", type=str, choices=["blocking", "streaming"], location="json") - parser.add_argument("retriever_from", type=str, required=False, default="explore_app", location="json") + parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, location="json") + .add_argument("query", type=str, location="json", default="") + .add_argument("files", type=list, required=False, location="json") + .add_argument("response_mode", type=str, choices=["blocking", "streaming"], location="json") + .add_argument("retriever_from", type=str, required=False, default="explore_app", location="json") + ) args = parser.parse_args() streaming = args["response_mode"] == "streaming" @@ -121,13 +123,15 @@ class ChatApi(InstalledAppResource): if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: raise NotChatAppError() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, location="json") - parser.add_argument("query", type=str, required=True, location="json") - parser.add_argument("files", type=list, required=False, location="json") - parser.add_argument("conversation_id", type=uuid_value, location="json") - parser.add_argument("parent_message_id", type=uuid_value, required=False, location="json") - parser.add_argument("retriever_from", type=str, required=False, default="explore_app", location="json") + parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, location="json") + .add_argument("query", type=str, required=True, location="json") + .add_argument("files", type=list, required=False, location="json") + .add_argument("conversation_id", type=uuid_value, location="json") + .add_argument("parent_message_id", type=uuid_value, required=False, location="json") + .add_argument("retriever_from", type=str, required=False, default="explore_app", location="json") + ) args = parser.parse_args() args["auto_generate_name"] = False diff --git a/api/controllers/console/explore/conversation.py b/api/controllers/console/explore/conversation.py index feabea2524..5a39363cc2 100644 --- a/api/controllers/console/explore/conversation.py +++ b/api/controllers/console/explore/conversation.py @@ -31,10 +31,12 @@ class ConversationListApi(InstalledAppResource): if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: raise NotChatAppError() - parser = reqparse.RequestParser() - parser.add_argument("last_id", type=uuid_value, location="args") - parser.add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") - parser.add_argument("pinned", type=str, choices=["true", "false", None], location="args") + parser = ( + reqparse.RequestParser() + .add_argument("last_id", type=uuid_value, location="args") + .add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") + .add_argument("pinned", type=str, choices=["true", "false", None], location="args") + ) args = parser.parse_args() pinned = None @@ -94,9 +96,11 @@ class ConversationRenameApi(InstalledAppResource): conversation_id = str(c_id) - parser = reqparse.RequestParser() - parser.add_argument("name", type=str, required=False, location="json") - parser.add_argument("auto_generate", type=bool, required=False, default=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("name", type=str, required=False, location="json") + .add_argument("auto_generate", type=bool, required=False, default=False, location="json") + ) args = parser.parse_args() try: diff --git a/api/controllers/console/explore/installed_app.py b/api/controllers/console/explore/installed_app.py index 7ead93a1b6..dec84b68f4 100644 --- a/api/controllers/console/explore/installed_app.py +++ b/api/controllers/console/explore/installed_app.py @@ -111,8 +111,7 @@ class InstalledAppsListApi(Resource): @account_initialization_required @cloud_edition_billing_resource_check("apps") def post(self): - parser = reqparse.RequestParser() - parser.add_argument("app_id", type=str, required=True, help="Invalid app_id") + parser = reqparse.RequestParser().add_argument("app_id", type=str, required=True, help="Invalid app_id") args = parser.parse_args() recommended_app = db.session.query(RecommendedApp).where(RecommendedApp.app_id == args["app_id"]).first() @@ -170,8 +169,7 @@ class InstalledAppApi(InstalledAppResource): return {"result": "success", "message": "App uninstalled successfully"}, 204 def patch(self, installed_app): - parser = reqparse.RequestParser() - parser.add_argument("is_pinned", type=inputs.boolean) + parser = reqparse.RequestParser().add_argument("is_pinned", type=inputs.boolean) args = parser.parse_args() commit_args = False diff --git a/api/controllers/console/explore/message.py b/api/controllers/console/explore/message.py index 064e026753..db854e09bb 100644 --- a/api/controllers/console/explore/message.py +++ b/api/controllers/console/explore/message.py @@ -54,10 +54,12 @@ class MessageListApi(InstalledAppResource): if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: raise NotChatAppError() - parser = reqparse.RequestParser() - parser.add_argument("conversation_id", required=True, type=uuid_value, location="args") - parser.add_argument("first_id", type=uuid_value, location="args") - parser.add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("conversation_id", required=True, type=uuid_value, location="args") + .add_argument("first_id", type=uuid_value, location="args") + .add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") + ) args = parser.parse_args() try: @@ -81,9 +83,11 @@ class MessageFeedbackApi(InstalledAppResource): message_id = str(message_id) - parser = reqparse.RequestParser() - parser.add_argument("rating", type=str, choices=["like", "dislike", None], location="json") - parser.add_argument("content", type=str, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("rating", type=str, choices=["like", "dislike", None], location="json") + .add_argument("content", type=str, location="json") + ) args = parser.parse_args() try: @@ -113,8 +117,7 @@ class MessageMoreLikeThisApi(InstalledAppResource): message_id = str(message_id) - parser = reqparse.RequestParser() - parser.add_argument( + parser = reqparse.RequestParser().add_argument( "response_mode", type=str, required=True, choices=["blocking", "streaming"], location="args" ) args = parser.parse_args() diff --git a/api/controllers/console/explore/recommended_app.py b/api/controllers/console/explore/recommended_app.py index 6d627a929a..751012757a 100644 --- a/api/controllers/console/explore/recommended_app.py +++ b/api/controllers/console/explore/recommended_app.py @@ -42,8 +42,7 @@ class RecommendedAppListApi(Resource): @marshal_with(recommended_app_list_fields) def get(self): # language args - parser = reqparse.RequestParser() - parser.add_argument("language", type=str, location="args") + parser = reqparse.RequestParser().add_argument("language", type=str, location="args") args = parser.parse_args() language = args.get("language") diff --git a/api/controllers/console/explore/saved_message.py b/api/controllers/console/explore/saved_message.py index 830685975b..9775c951f7 100644 --- a/api/controllers/console/explore/saved_message.py +++ b/api/controllers/console/explore/saved_message.py @@ -39,9 +39,11 @@ class SavedMessageListApi(InstalledAppResource): if app_model.mode != "completion": raise NotCompletionAppError() - parser = reqparse.RequestParser() - parser.add_argument("last_id", type=uuid_value, location="args") - parser.add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("last_id", type=uuid_value, location="args") + .add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") + ) args = parser.parse_args() return SavedMessageService.pagination_by_last_id(app_model, current_user, args["last_id"], args["limit"]) @@ -52,8 +54,7 @@ class SavedMessageListApi(InstalledAppResource): if app_model.mode != "completion": raise NotCompletionAppError() - parser = reqparse.RequestParser() - parser.add_argument("message_id", type=uuid_value, required=True, location="json") + parser = reqparse.RequestParser().add_argument("message_id", type=uuid_value, required=True, location="json") args = parser.parse_args() try: diff --git a/api/controllers/console/explore/workflow.py b/api/controllers/console/explore/workflow.py index aeea446c6e..3022d937b9 100644 --- a/api/controllers/console/explore/workflow.py +++ b/api/controllers/console/explore/workflow.py @@ -47,9 +47,11 @@ class InstalledAppWorkflowRunApi(InstalledAppResource): if app_mode != AppMode.WORKFLOW: raise NotWorkflowAppError() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, nullable=False, location="json") - parser.add_argument("files", type=list, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, nullable=False, location="json") + .add_argument("files", type=list, required=False, location="json") + ) args = parser.parse_args() assert current_user is not None try: diff --git a/api/controllers/console/extension.py b/api/controllers/console/extension.py index e5b7611c44..4e1a8aeb3e 100644 --- a/api/controllers/console/extension.py +++ b/api/controllers/console/extension.py @@ -29,8 +29,7 @@ class CodeBasedExtensionAPI(Resource): @login_required @account_initialization_required def get(self): - parser = reqparse.RequestParser() - parser.add_argument("module", type=str, required=True, location="args") + parser = reqparse.RequestParser().add_argument("module", type=str, required=True, location="args") args = parser.parse_args() return {"module": args["module"], "data": CodeBasedExtensionService.get_code_based_extension(args["module"])} @@ -67,10 +66,12 @@ class APIBasedExtensionAPI(Resource): @account_initialization_required @marshal_with(api_based_extension_fields) def post(self): - parser = reqparse.RequestParser() - parser.add_argument("name", type=str, required=True, location="json") - parser.add_argument("api_endpoint", type=str, required=True, location="json") - parser.add_argument("api_key", type=str, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("name", type=str, required=True, location="json") + .add_argument("api_endpoint", type=str, required=True, location="json") + .add_argument("api_key", type=str, required=True, location="json") + ) args = parser.parse_args() _, current_tenant_id = current_account_with_tenant() @@ -124,10 +125,12 @@ class APIBasedExtensionDetailAPI(Resource): extension_data_from_db = APIBasedExtensionService.get_with_tenant_id(current_tenant_id, api_based_extension_id) - parser = reqparse.RequestParser() - parser.add_argument("name", type=str, required=True, location="json") - parser.add_argument("api_endpoint", type=str, required=True, location="json") - parser.add_argument("api_key", type=str, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("name", type=str, required=True, location="json") + .add_argument("api_endpoint", type=str, required=True, location="json") + .add_argument("api_key", type=str, required=True, location="json") + ) args = parser.parse_args() extension_data_from_db.name = args["name"] diff --git a/api/controllers/console/init_validate.py b/api/controllers/console/init_validate.py index 30b53458b2..f219425d07 100644 --- a/api/controllers/console/init_validate.py +++ b/api/controllers/console/init_validate.py @@ -57,8 +57,7 @@ class InitValidateAPI(Resource): if tenant_count > 0: raise AlreadySetupError() - parser = reqparse.RequestParser() - parser.add_argument("password", type=StrLen(30), required=True, location="json") + parser = reqparse.RequestParser().add_argument("password", type=StrLen(30), required=True, location="json") input_password = parser.parse_args()["password"] if input_password != os.environ.get("INIT_PASSWORD"): diff --git a/api/controllers/console/remote_files.py b/api/controllers/console/remote_files.py index b053f222df..96c86dc0db 100644 --- a/api/controllers/console/remote_files.py +++ b/api/controllers/console/remote_files.py @@ -40,8 +40,7 @@ class RemoteFileInfoApi(Resource): class RemoteFileUploadApi(Resource): @marshal_with(file_fields_with_signed_url) def post(self): - parser = reqparse.RequestParser() - parser.add_argument("url", type=str, required=True, help="URL is required") + parser = reqparse.RequestParser().add_argument("url", type=str, required=True, help="URL is required") args = parser.parse_args() url = args["url"] diff --git a/api/controllers/console/setup.py b/api/controllers/console/setup.py index bff5fc1651..6d2b22bde3 100644 --- a/api/controllers/console/setup.py +++ b/api/controllers/console/setup.py @@ -69,10 +69,12 @@ class SetupApi(Resource): if not get_init_validate_status(): raise NotInitValidateError() - parser = reqparse.RequestParser() - parser.add_argument("email", type=email, required=True, location="json") - parser.add_argument("name", type=StrLen(30), required=True, location="json") - parser.add_argument("password", type=valid_password, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("email", type=email, required=True, location="json") + .add_argument("name", type=StrLen(30), required=True, location="json") + .add_argument("password", type=valid_password, required=True, location="json") + ) args = parser.parse_args() # setup diff --git a/api/controllers/console/tag/tags.py b/api/controllers/console/tag/tags.py index 5748ca110d..40ae7fb4d0 100644 --- a/api/controllers/console/tag/tags.py +++ b/api/controllers/console/tag/tags.py @@ -39,12 +39,18 @@ class TagListApi(Resource): if not (current_user.has_edit_permission or current_user.is_dataset_editor): raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument( - "name", nullable=False, required=True, help="Name must be between 1 to 50 characters.", type=_validate_name - ) - parser.add_argument( - "type", type=str, location="json", choices=Tag.TAG_TYPE_LIST, nullable=True, help="Invalid tag type." + parser = ( + reqparse.RequestParser() + .add_argument( + "name", + nullable=False, + required=True, + help="Name must be between 1 to 50 characters.", + type=_validate_name, + ) + .add_argument( + "type", type=str, location="json", choices=Tag.TAG_TYPE_LIST, nullable=True, help="Invalid tag type." + ) ) args = parser.parse_args() tag = TagService.save_tags(args) @@ -66,8 +72,7 @@ class TagUpdateDeleteApi(Resource): if not (current_user.has_edit_permission or current_user.is_dataset_editor): raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument( + parser = reqparse.RequestParser().add_argument( "name", nullable=False, required=True, help="Name must be between 1 to 50 characters.", type=_validate_name ) args = parser.parse_args() @@ -105,15 +110,17 @@ class TagBindingCreateApi(Resource): if not (current_user.has_edit_permission or current_user.is_dataset_editor): raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument( - "tag_ids", type=list, nullable=False, required=True, location="json", help="Tag IDs is required." - ) - parser.add_argument( - "target_id", type=str, nullable=False, required=True, location="json", help="Target ID is required." - ) - parser.add_argument( - "type", type=str, location="json", choices=Tag.TAG_TYPE_LIST, nullable=True, help="Invalid tag type." + parser = ( + reqparse.RequestParser() + .add_argument( + "tag_ids", type=list, nullable=False, required=True, location="json", help="Tag IDs is required." + ) + .add_argument( + "target_id", type=str, nullable=False, required=True, location="json", help="Target ID is required." + ) + .add_argument( + "type", type=str, location="json", choices=Tag.TAG_TYPE_LIST, nullable=True, help="Invalid tag type." + ) ) args = parser.parse_args() TagService.save_tag_binding(args) @@ -132,11 +139,13 @@ class TagBindingDeleteApi(Resource): if not (current_user.has_edit_permission or current_user.is_dataset_editor): raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("tag_id", type=str, nullable=False, required=True, help="Tag ID is required.") - parser.add_argument("target_id", type=str, nullable=False, required=True, help="Target ID is required.") - parser.add_argument( - "type", type=str, location="json", choices=Tag.TAG_TYPE_LIST, nullable=True, help="Invalid tag type." + parser = ( + reqparse.RequestParser() + .add_argument("tag_id", type=str, nullable=False, required=True, help="Tag ID is required.") + .add_argument("target_id", type=str, nullable=False, required=True, help="Target ID is required.") + .add_argument( + "type", type=str, location="json", choices=Tag.TAG_TYPE_LIST, nullable=True, help="Invalid tag type." + ) ) args = parser.parse_args() TagService.delete_tag_binding(args) diff --git a/api/controllers/console/version.py b/api/controllers/console/version.py index 965a520f70..417486f59e 100644 --- a/api/controllers/console/version.py +++ b/api/controllers/console/version.py @@ -37,8 +37,7 @@ class VersionApi(Resource): ) def get(self): """Check for application version updates""" - parser = reqparse.RequestParser() - parser.add_argument("current_version", type=str, required=True, location="args") + parser = reqparse.RequestParser().add_argument("current_version", type=str, required=True, location="args") args = parser.parse_args() check_update_url = dify_config.CHECK_UPDATE_URL diff --git a/api/controllers/console/workspace/account.py b/api/controllers/console/workspace/account.py index a5e6b8f473..499a52370f 100644 --- a/api/controllers/console/workspace/account.py +++ b/api/controllers/console/workspace/account.py @@ -57,9 +57,9 @@ class AccountInitApi(Resource): if dify_config.EDITION == "CLOUD": parser.add_argument("invitation_code", type=str, location="json") - - parser.add_argument("interface_language", type=supported_language, required=True, location="json") - parser.add_argument("timezone", type=timezone, required=True, location="json") + parser.add_argument("interface_language", type=supported_language, required=True, location="json").add_argument( + "timezone", type=timezone, required=True, location="json" + ) args = parser.parse_args() if dify_config.EDITION == "CLOUD": @@ -114,8 +114,7 @@ class AccountNameApi(Resource): @marshal_with(account_fields) def post(self): current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("name", type=str, required=True, location="json") + parser = reqparse.RequestParser().add_argument("name", type=str, required=True, location="json") args = parser.parse_args() # Validate account name length @@ -135,8 +134,7 @@ class AccountAvatarApi(Resource): @marshal_with(account_fields) def post(self): current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("avatar", type=str, required=True, location="json") + parser = reqparse.RequestParser().add_argument("avatar", type=str, required=True, location="json") args = parser.parse_args() updated_account = AccountService.update_account(current_user, avatar=args["avatar"]) @@ -152,8 +150,9 @@ class AccountInterfaceLanguageApi(Resource): @marshal_with(account_fields) def post(self): current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("interface_language", type=supported_language, required=True, location="json") + parser = reqparse.RequestParser().add_argument( + "interface_language", type=supported_language, required=True, location="json" + ) args = parser.parse_args() updated_account = AccountService.update_account(current_user, interface_language=args["interface_language"]) @@ -169,8 +168,9 @@ class AccountInterfaceThemeApi(Resource): @marshal_with(account_fields) def post(self): current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("interface_theme", type=str, choices=["light", "dark"], required=True, location="json") + parser = reqparse.RequestParser().add_argument( + "interface_theme", type=str, choices=["light", "dark"], required=True, location="json" + ) args = parser.parse_args() updated_account = AccountService.update_account(current_user, interface_theme=args["interface_theme"]) @@ -186,8 +186,7 @@ class AccountTimezoneApi(Resource): @marshal_with(account_fields) def post(self): current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("timezone", type=str, required=True, location="json") + parser = reqparse.RequestParser().add_argument("timezone", type=str, required=True, location="json") args = parser.parse_args() # Validate timezone string, e.g. America/New_York, Asia/Shanghai @@ -207,10 +206,12 @@ class AccountPasswordApi(Resource): @marshal_with(account_fields) def post(self): current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("password", type=str, required=False, location="json") - parser.add_argument("new_password", type=str, required=True, location="json") - parser.add_argument("repeat_new_password", type=str, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("password", type=str, required=False, location="json") + .add_argument("new_password", type=str, required=True, location="json") + .add_argument("repeat_new_password", type=str, required=True, location="json") + ) args = parser.parse_args() if args["new_password"] != args["repeat_new_password"]: @@ -301,9 +302,11 @@ class AccountDeleteApi(Resource): def post(self): account, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("token", type=str, required=True, location="json") - parser.add_argument("code", type=str, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("token", type=str, required=True, location="json") + .add_argument("code", type=str, required=True, location="json") + ) args = parser.parse_args() if not AccountService.verify_account_deletion_code(args["token"], args["code"]): @@ -318,9 +321,11 @@ class AccountDeleteApi(Resource): class AccountDeleteUpdateFeedbackApi(Resource): @setup_required def post(self): - parser = reqparse.RequestParser() - parser.add_argument("email", type=str, required=True, location="json") - parser.add_argument("feedback", type=str, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("email", type=str, required=True, location="json") + .add_argument("feedback", type=str, required=True, location="json") + ) args = parser.parse_args() BillingService.update_account_deletion_feedback(args["email"], args["feedback"]) @@ -363,10 +368,12 @@ class EducationApi(Resource): def post(self): account, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("token", type=str, required=True, location="json") - parser.add_argument("institution", type=str, required=True, location="json") - parser.add_argument("role", type=str, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("token", type=str, required=True, location="json") + .add_argument("institution", type=str, required=True, location="json") + .add_argument("role", type=str, required=True, location="json") + ) args = parser.parse_args() return BillingService.EducationIdentity.activate(account, args["token"], args["institution"], args["role"]) @@ -402,10 +409,12 @@ class EducationAutoCompleteApi(Resource): @cloud_edition_billing_enabled @marshal_with(data_fields) def get(self): - parser = reqparse.RequestParser() - parser.add_argument("keywords", type=str, required=True, location="args") - parser.add_argument("page", type=int, required=False, location="args", default=0) - parser.add_argument("limit", type=int, required=False, location="args", default=20) + parser = ( + reqparse.RequestParser() + .add_argument("keywords", type=str, required=True, location="args") + .add_argument("page", type=int, required=False, location="args", default=0) + .add_argument("limit", type=int, required=False, location="args", default=20) + ) args = parser.parse_args() return BillingService.EducationIdentity.autocomplete(args["keywords"], args["page"], args["limit"]) @@ -419,11 +428,13 @@ class ChangeEmailSendEmailApi(Resource): @account_initialization_required def post(self): current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("email", type=email, required=True, location="json") - parser.add_argument("language", type=str, required=False, location="json") - parser.add_argument("phase", type=str, required=False, location="json") - parser.add_argument("token", type=str, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("email", type=email, required=True, location="json") + .add_argument("language", type=str, required=False, location="json") + .add_argument("phase", type=str, required=False, location="json") + .add_argument("token", type=str, required=False, location="json") + ) args = parser.parse_args() ip_address = extract_remote_ip(request) @@ -466,10 +477,12 @@ class ChangeEmailCheckApi(Resource): @login_required @account_initialization_required def post(self): - parser = reqparse.RequestParser() - parser.add_argument("email", type=email, required=True, location="json") - parser.add_argument("code", type=str, required=True, location="json") - parser.add_argument("token", type=str, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("email", type=email, required=True, location="json") + .add_argument("code", type=str, required=True, location="json") + .add_argument("token", type=str, required=True, nullable=False, location="json") + ) args = parser.parse_args() user_email = args["email"] @@ -509,9 +522,11 @@ class ChangeEmailResetApi(Resource): @account_initialization_required @marshal_with(account_fields) def post(self): - parser = reqparse.RequestParser() - parser.add_argument("new_email", type=email, required=True, location="json") - parser.add_argument("token", type=str, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("new_email", type=email, required=True, location="json") + .add_argument("token", type=str, required=True, nullable=False, location="json") + ) args = parser.parse_args() if AccountService.is_account_in_freeze(args["new_email"]): @@ -544,8 +559,7 @@ class ChangeEmailResetApi(Resource): class CheckEmailUnique(Resource): @setup_required def post(self): - parser = reqparse.RequestParser() - parser.add_argument("email", type=email, required=True, location="json") + parser = reqparse.RequestParser().add_argument("email", type=email, required=True, location="json") args = parser.parse_args() if AccountService.is_account_in_freeze(args["email"]): raise AccountInFreezeError() diff --git a/api/controllers/console/workspace/endpoint.py b/api/controllers/console/workspace/endpoint.py index b31011b4a3..d115f62d73 100644 --- a/api/controllers/console/workspace/endpoint.py +++ b/api/controllers/console/workspace/endpoint.py @@ -37,10 +37,12 @@ class EndpointCreateApi(Resource): if not user.is_admin_or_owner: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("plugin_unique_identifier", type=str, required=True) - parser.add_argument("settings", type=dict, required=True) - parser.add_argument("name", type=str, required=True) + parser = ( + reqparse.RequestParser() + .add_argument("plugin_unique_identifier", type=str, required=True) + .add_argument("settings", type=dict, required=True) + .add_argument("name", type=str, required=True) + ) args = parser.parse_args() plugin_unique_identifier = args["plugin_unique_identifier"] @@ -81,9 +83,11 @@ class EndpointListApi(Resource): def get(self): user, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("page", type=int, required=True, location="args") - parser.add_argument("page_size", type=int, required=True, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("page", type=int, required=True, location="args") + .add_argument("page_size", type=int, required=True, location="args") + ) args = parser.parse_args() page = args["page"] @@ -124,10 +128,12 @@ class EndpointListForSinglePluginApi(Resource): def get(self): user, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("page", type=int, required=True, location="args") - parser.add_argument("page_size", type=int, required=True, location="args") - parser.add_argument("plugin_id", type=str, required=True, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("page", type=int, required=True, location="args") + .add_argument("page_size", type=int, required=True, location="args") + .add_argument("plugin_id", type=str, required=True, location="args") + ) args = parser.parse_args() page = args["page"] @@ -166,8 +172,7 @@ class EndpointDeleteApi(Resource): def post(self): user, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("endpoint_id", type=str, required=True) + parser = reqparse.RequestParser().add_argument("endpoint_id", type=str, required=True) args = parser.parse_args() if not user.is_admin_or_owner: @@ -206,10 +211,12 @@ class EndpointUpdateApi(Resource): def post(self): user, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("endpoint_id", type=str, required=True) - parser.add_argument("settings", type=dict, required=True) - parser.add_argument("name", type=str, required=True) + parser = ( + reqparse.RequestParser() + .add_argument("endpoint_id", type=str, required=True) + .add_argument("settings", type=dict, required=True) + .add_argument("name", type=str, required=True) + ) args = parser.parse_args() endpoint_id = args["endpoint_id"] @@ -249,8 +256,7 @@ class EndpointEnableApi(Resource): def post(self): user, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("endpoint_id", type=str, required=True) + parser = reqparse.RequestParser().add_argument("endpoint_id", type=str, required=True) args = parser.parse_args() endpoint_id = args["endpoint_id"] @@ -282,8 +288,7 @@ class EndpointDisableApi(Resource): def post(self): user, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("endpoint_id", type=str, required=True) + parser = reqparse.RequestParser().add_argument("endpoint_id", type=str, required=True) args = parser.parse_args() endpoint_id = args["endpoint_id"] diff --git a/api/controllers/console/workspace/load_balancing_config.py b/api/controllers/console/workspace/load_balancing_config.py index 4e6f1fa3a5..9bf393ea2e 100644 --- a/api/controllers/console/workspace/load_balancing_config.py +++ b/api/controllers/console/workspace/load_balancing_config.py @@ -24,17 +24,19 @@ class LoadBalancingCredentialsValidateApi(Resource): tenant_id = current_tenant_id - parser = reqparse.RequestParser() - parser.add_argument("model", type=str, required=True, nullable=False, location="json") - parser.add_argument( - "model_type", - type=str, - required=True, - nullable=False, - choices=[mt.value for mt in ModelType], - location="json", + parser = ( + reqparse.RequestParser() + .add_argument("model", type=str, required=True, nullable=False, location="json") + .add_argument( + "model_type", + type=str, + required=True, + nullable=False, + choices=[mt.value for mt in ModelType], + location="json", + ) + .add_argument("credentials", type=dict, required=True, nullable=False, location="json") ) - parser.add_argument("credentials", type=dict, required=True, nullable=False, location="json") args = parser.parse_args() # validate model load balancing credentials @@ -77,17 +79,19 @@ class LoadBalancingConfigCredentialsValidateApi(Resource): tenant_id = current_tenant_id - parser = reqparse.RequestParser() - parser.add_argument("model", type=str, required=True, nullable=False, location="json") - parser.add_argument( - "model_type", - type=str, - required=True, - nullable=False, - choices=[mt.value for mt in ModelType], - location="json", + parser = ( + reqparse.RequestParser() + .add_argument("model", type=str, required=True, nullable=False, location="json") + .add_argument( + "model_type", + type=str, + required=True, + nullable=False, + choices=[mt.value for mt in ModelType], + location="json", + ) + .add_argument("credentials", type=dict, required=True, nullable=False, location="json") ) - parser.add_argument("credentials", type=dict, required=True, nullable=False, location="json") args = parser.parse_args() # validate model load balancing config credentials diff --git a/api/controllers/console/workspace/members.py b/api/controllers/console/workspace/members.py index 4f080708cc..d66f861799 100644 --- a/api/controllers/console/workspace/members.py +++ b/api/controllers/console/workspace/members.py @@ -57,10 +57,12 @@ class MemberInviteEmailApi(Resource): @account_initialization_required @cloud_edition_billing_resource_check("members") def post(self): - parser = reqparse.RequestParser() - parser.add_argument("emails", type=list, required=True, location="json") - parser.add_argument("role", type=str, required=True, default="admin", location="json") - parser.add_argument("language", type=str, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("emails", type=list, required=True, location="json") + .add_argument("role", type=str, required=True, default="admin", location="json") + .add_argument("language", type=str, required=False, location="json") + ) args = parser.parse_args() invitee_emails = args["emails"] @@ -149,8 +151,7 @@ class MemberUpdateRoleApi(Resource): @login_required @account_initialization_required def put(self, member_id): - parser = reqparse.RequestParser() - parser.add_argument("role", type=str, required=True, location="json") + parser = reqparse.RequestParser().add_argument("role", type=str, required=True, location="json") args = parser.parse_args() new_role = args["role"] @@ -199,8 +200,7 @@ class SendOwnerTransferEmailApi(Resource): @account_initialization_required @is_allow_transfer_owner def post(self): - parser = reqparse.RequestParser() - parser.add_argument("language", type=str, required=False, location="json") + parser = reqparse.RequestParser().add_argument("language", type=str, required=False, location="json") args = parser.parse_args() ip_address = extract_remote_ip(request) if AccountService.is_email_send_ip_limit(ip_address): @@ -236,9 +236,11 @@ class OwnerTransferCheckApi(Resource): @account_initialization_required @is_allow_transfer_owner def post(self): - parser = reqparse.RequestParser() - parser.add_argument("code", type=str, required=True, location="json") - parser.add_argument("token", type=str, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("code", type=str, required=True, location="json") + .add_argument("token", type=str, required=True, nullable=False, location="json") + ) args = parser.parse_args() # check if the current user is the owner of the workspace current_user, _ = current_account_with_tenant() @@ -281,8 +283,9 @@ class OwnerTransfer(Resource): @account_initialization_required @is_allow_transfer_owner def post(self, member_id): - parser = reqparse.RequestParser() - parser.add_argument("token", type=str, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument( + "token", type=str, required=True, nullable=False, location="json" + ) args = parser.parse_args() # check if the current user is the owner of the workspace diff --git a/api/controllers/console/workspace/model_providers.py b/api/controllers/console/workspace/model_providers.py index acdd467b30..04db975fc2 100644 --- a/api/controllers/console/workspace/model_providers.py +++ b/api/controllers/console/workspace/model_providers.py @@ -24,8 +24,7 @@ class ModelProviderListApi(Resource): _, current_tenant_id = current_account_with_tenant() tenant_id = current_tenant_id - parser = reqparse.RequestParser() - parser.add_argument( + parser = reqparse.RequestParser().add_argument( "model_type", type=str, required=False, @@ -50,8 +49,9 @@ class ModelProviderCredentialApi(Resource): _, current_tenant_id = current_account_with_tenant() tenant_id = current_tenant_id # if credential_id is not provided, return current used credential - parser = reqparse.RequestParser() - parser.add_argument("credential_id", type=uuid_value, required=False, nullable=True, location="args") + parser = reqparse.RequestParser().add_argument( + "credential_id", type=uuid_value, required=False, nullable=True, location="args" + ) args = parser.parse_args() model_provider_service = ModelProviderService() @@ -69,9 +69,11 @@ class ModelProviderCredentialApi(Resource): if not current_user.is_admin_or_owner: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("credentials", type=dict, required=True, nullable=False, location="json") - parser.add_argument("name", type=StrLen(30), required=False, nullable=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("credentials", type=dict, required=True, nullable=False, location="json") + .add_argument("name", type=StrLen(30), required=False, nullable=True, location="json") + ) args = parser.parse_args() model_provider_service = ModelProviderService() @@ -96,10 +98,12 @@ class ModelProviderCredentialApi(Resource): if not current_user.is_admin_or_owner: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("credential_id", type=uuid_value, required=True, nullable=False, location="json") - parser.add_argument("credentials", type=dict, required=True, nullable=False, location="json") - parser.add_argument("name", type=StrLen(30), required=False, nullable=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("credential_id", type=uuid_value, required=True, nullable=False, location="json") + .add_argument("credentials", type=dict, required=True, nullable=False, location="json") + .add_argument("name", type=StrLen(30), required=False, nullable=True, location="json") + ) args = parser.parse_args() model_provider_service = ModelProviderService() @@ -124,8 +128,9 @@ class ModelProviderCredentialApi(Resource): current_user, current_tenant_id = current_account_with_tenant() if not current_user.is_admin_or_owner: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("credential_id", type=uuid_value, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument( + "credential_id", type=uuid_value, required=True, nullable=False, location="json" + ) args = parser.parse_args() model_provider_service = ModelProviderService() @@ -145,8 +150,9 @@ class ModelProviderCredentialSwitchApi(Resource): current_user, current_tenant_id = current_account_with_tenant() if not current_user.is_admin_or_owner: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("credential_id", type=str, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument( + "credential_id", type=str, required=True, nullable=False, location="json" + ) args = parser.parse_args() service = ModelProviderService() @@ -165,8 +171,9 @@ class ModelProviderValidateApi(Resource): @account_initialization_required def post(self, provider: str): _, current_tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("credentials", type=dict, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument( + "credentials", type=dict, required=True, nullable=False, location="json" + ) args = parser.parse_args() tenant_id = current_tenant_id @@ -223,8 +230,7 @@ class PreferredProviderTypeUpdateApi(Resource): tenant_id = current_tenant_id - parser = reqparse.RequestParser() - parser.add_argument( + parser = reqparse.RequestParser().add_argument( "preferred_provider_type", type=str, required=True, diff --git a/api/controllers/console/workspace/models.py b/api/controllers/console/workspace/models.py index d5d1aed00e..5ab958d585 100644 --- a/api/controllers/console/workspace/models.py +++ b/api/controllers/console/workspace/models.py @@ -24,8 +24,7 @@ class DefaultModelApi(Resource): def get(self): _, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument( + parser = reqparse.RequestParser().add_argument( "model_type", type=str, required=True, @@ -51,8 +50,9 @@ class DefaultModelApi(Resource): if not current_user.is_admin_or_owner: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("model_settings", type=list, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument( + "model_settings", type=list, required=True, nullable=False, location="json" + ) args = parser.parse_args() model_provider_service = ModelProviderService() model_settings = args["model_settings"] @@ -107,19 +107,21 @@ class ModelProviderModelApi(Resource): if not current_user.is_admin_or_owner: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("model", type=str, required=True, nullable=False, location="json") - parser.add_argument( - "model_type", - type=str, - required=True, - nullable=False, - choices=[mt.value for mt in ModelType], - location="json", + parser = ( + reqparse.RequestParser() + .add_argument("model", type=str, required=True, nullable=False, location="json") + .add_argument( + "model_type", + type=str, + required=True, + nullable=False, + choices=[mt.value for mt in ModelType], + location="json", + ) + .add_argument("load_balancing", type=dict, required=False, nullable=True, location="json") + .add_argument("config_from", type=str, required=False, nullable=True, location="json") + .add_argument("credential_id", type=uuid_value, required=False, nullable=True, location="json") ) - parser.add_argument("load_balancing", type=dict, required=False, nullable=True, location="json") - parser.add_argument("config_from", type=str, required=False, nullable=True, location="json") - parser.add_argument("credential_id", type=uuid_value, required=False, nullable=True, location="json") args = parser.parse_args() if args.get("config_from", "") == "custom-model": @@ -167,15 +169,17 @@ class ModelProviderModelApi(Resource): if not current_user.is_admin_or_owner: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("model", type=str, required=True, nullable=False, location="json") - parser.add_argument( - "model_type", - type=str, - required=True, - nullable=False, - choices=[mt.value for mt in ModelType], - location="json", + parser = ( + reqparse.RequestParser() + .add_argument("model", type=str, required=True, nullable=False, location="json") + .add_argument( + "model_type", + type=str, + required=True, + nullable=False, + choices=[mt.value for mt in ModelType], + location="json", + ) ) args = parser.parse_args() @@ -195,18 +199,20 @@ class ModelProviderModelCredentialApi(Resource): def get(self, provider: str): _, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("model", type=str, required=True, nullable=False, location="args") - parser.add_argument( - "model_type", - type=str, - required=True, - nullable=False, - choices=[mt.value for mt in ModelType], - location="args", + parser = ( + reqparse.RequestParser() + .add_argument("model", type=str, required=True, nullable=False, location="args") + .add_argument( + "model_type", + type=str, + required=True, + nullable=False, + choices=[mt.value for mt in ModelType], + location="args", + ) + .add_argument("config_from", type=str, required=False, nullable=True, location="args") + .add_argument("credential_id", type=uuid_value, required=False, nullable=True, location="args") ) - parser.add_argument("config_from", type=str, required=False, nullable=True, location="args") - parser.add_argument("credential_id", type=uuid_value, required=False, nullable=True, location="args") args = parser.parse_args() model_provider_service = ModelProviderService() @@ -260,18 +266,20 @@ class ModelProviderModelCredentialApi(Resource): if not current_user.is_admin_or_owner: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("model", type=str, required=True, nullable=False, location="json") - parser.add_argument( - "model_type", - type=str, - required=True, - nullable=False, - choices=[mt.value for mt in ModelType], - location="json", + parser = ( + reqparse.RequestParser() + .add_argument("model", type=str, required=True, nullable=False, location="json") + .add_argument( + "model_type", + type=str, + required=True, + nullable=False, + choices=[mt.value for mt in ModelType], + location="json", + ) + .add_argument("name", type=StrLen(30), required=False, nullable=True, location="json") + .add_argument("credentials", type=dict, required=True, nullable=False, location="json") ) - parser.add_argument("name", type=StrLen(30), required=False, nullable=True, location="json") - parser.add_argument("credentials", type=dict, required=True, nullable=False, location="json") args = parser.parse_args() model_provider_service = ModelProviderService() @@ -305,19 +313,21 @@ class ModelProviderModelCredentialApi(Resource): if not current_user.is_admin_or_owner: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("model", type=str, required=True, nullable=False, location="json") - parser.add_argument( - "model_type", - type=str, - required=True, - nullable=False, - choices=[mt.value for mt in ModelType], - location="json", + parser = ( + reqparse.RequestParser() + .add_argument("model", type=str, required=True, nullable=False, location="json") + .add_argument( + "model_type", + type=str, + required=True, + nullable=False, + choices=[mt.value for mt in ModelType], + location="json", + ) + .add_argument("credential_id", type=uuid_value, required=True, nullable=False, location="json") + .add_argument("credentials", type=dict, required=True, nullable=False, location="json") + .add_argument("name", type=StrLen(30), required=False, nullable=True, location="json") ) - parser.add_argument("credential_id", type=uuid_value, required=True, nullable=False, location="json") - parser.add_argument("credentials", type=dict, required=True, nullable=False, location="json") - parser.add_argument("name", type=StrLen(30), required=False, nullable=True, location="json") args = parser.parse_args() model_provider_service = ModelProviderService() @@ -345,17 +355,19 @@ class ModelProviderModelCredentialApi(Resource): if not current_user.is_admin_or_owner: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("model", type=str, required=True, nullable=False, location="json") - parser.add_argument( - "model_type", - type=str, - required=True, - nullable=False, - choices=[mt.value for mt in ModelType], - location="json", + parser = ( + reqparse.RequestParser() + .add_argument("model", type=str, required=True, nullable=False, location="json") + .add_argument( + "model_type", + type=str, + required=True, + nullable=False, + choices=[mt.value for mt in ModelType], + location="json", + ) + .add_argument("credential_id", type=uuid_value, required=True, nullable=False, location="json") ) - parser.add_argument("credential_id", type=uuid_value, required=True, nullable=False, location="json") args = parser.parse_args() model_provider_service = ModelProviderService() @@ -380,17 +392,19 @@ class ModelProviderModelCredentialSwitchApi(Resource): if not current_user.is_admin_or_owner: raise Forbidden() - parser = reqparse.RequestParser() - parser.add_argument("model", type=str, required=True, nullable=False, location="json") - parser.add_argument( - "model_type", - type=str, - required=True, - nullable=False, - choices=[mt.value for mt in ModelType], - location="json", + parser = ( + reqparse.RequestParser() + .add_argument("model", type=str, required=True, nullable=False, location="json") + .add_argument( + "model_type", + type=str, + required=True, + nullable=False, + choices=[mt.value for mt in ModelType], + location="json", + ) + .add_argument("credential_id", type=str, required=True, nullable=False, location="json") ) - parser.add_argument("credential_id", type=str, required=True, nullable=False, location="json") args = parser.parse_args() service = ModelProviderService() @@ -414,15 +428,17 @@ class ModelProviderModelEnableApi(Resource): def patch(self, provider: str): _, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("model", type=str, required=True, nullable=False, location="json") - parser.add_argument( - "model_type", - type=str, - required=True, - nullable=False, - choices=[mt.value for mt in ModelType], - location="json", + parser = ( + reqparse.RequestParser() + .add_argument("model", type=str, required=True, nullable=False, location="json") + .add_argument( + "model_type", + type=str, + required=True, + nullable=False, + choices=[mt.value for mt in ModelType], + location="json", + ) ) args = parser.parse_args() @@ -444,15 +460,17 @@ class ModelProviderModelDisableApi(Resource): def patch(self, provider: str): _, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("model", type=str, required=True, nullable=False, location="json") - parser.add_argument( - "model_type", - type=str, - required=True, - nullable=False, - choices=[mt.value for mt in ModelType], - location="json", + parser = ( + reqparse.RequestParser() + .add_argument("model", type=str, required=True, nullable=False, location="json") + .add_argument( + "model_type", + type=str, + required=True, + nullable=False, + choices=[mt.value for mt in ModelType], + location="json", + ) ) args = parser.parse_args() @@ -472,17 +490,19 @@ class ModelProviderModelValidateApi(Resource): def post(self, provider: str): _, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("model", type=str, required=True, nullable=False, location="json") - parser.add_argument( - "model_type", - type=str, - required=True, - nullable=False, - choices=[mt.value for mt in ModelType], - location="json", + parser = ( + reqparse.RequestParser() + .add_argument("model", type=str, required=True, nullable=False, location="json") + .add_argument( + "model_type", + type=str, + required=True, + nullable=False, + choices=[mt.value for mt in ModelType], + location="json", + ) + .add_argument("credentials", type=dict, required=True, nullable=False, location="json") ) - parser.add_argument("credentials", type=dict, required=True, nullable=False, location="json") args = parser.parse_args() model_provider_service = ModelProviderService() @@ -516,8 +536,9 @@ class ModelProviderModelParameterRuleApi(Resource): @login_required @account_initialization_required def get(self, provider: str): - parser = reqparse.RequestParser() - parser.add_argument("model", type=str, required=True, nullable=False, location="args") + parser = reqparse.RequestParser().add_argument( + "model", type=str, required=True, nullable=False, location="args" + ) args = parser.parse_args() _, tenant_id = current_account_with_tenant() diff --git a/api/controllers/console/workspace/plugin.py b/api/controllers/console/workspace/plugin.py index ed5426376f..e8bc312caf 100644 --- a/api/controllers/console/workspace/plugin.py +++ b/api/controllers/console/workspace/plugin.py @@ -44,9 +44,11 @@ class PluginListApi(Resource): @account_initialization_required def get(self): _, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("page", type=int, required=False, location="args", default=1) - parser.add_argument("page_size", type=int, required=False, location="args", default=256) + parser = ( + reqparse.RequestParser() + .add_argument("page", type=int, required=False, location="args", default=1) + .add_argument("page_size", type=int, required=False, location="args", default=256) + ) args = parser.parse_args() try: plugins_with_total = PluginService.list_with_total(tenant_id, args["page"], args["page_size"]) @@ -62,8 +64,7 @@ class PluginListLatestVersionsApi(Resource): @login_required @account_initialization_required def post(self): - req = reqparse.RequestParser() - req.add_argument("plugin_ids", type=list, required=True, location="json") + req = reqparse.RequestParser().add_argument("plugin_ids", type=list, required=True, location="json") args = req.parse_args() try: @@ -82,8 +83,7 @@ class PluginListInstallationsFromIdsApi(Resource): def post(self): _, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("plugin_ids", type=list, required=True, location="json") + parser = reqparse.RequestParser().add_argument("plugin_ids", type=list, required=True, location="json") args = parser.parse_args() try: @@ -98,9 +98,11 @@ class PluginListInstallationsFromIdsApi(Resource): class PluginIconApi(Resource): @setup_required def get(self): - req = reqparse.RequestParser() - req.add_argument("tenant_id", type=str, required=True, location="args") - req.add_argument("filename", type=str, required=True, location="args") + req = ( + reqparse.RequestParser() + .add_argument("tenant_id", type=str, required=True, location="args") + .add_argument("filename", type=str, required=True, location="args") + ) args = req.parse_args() try: @@ -145,10 +147,12 @@ class PluginUploadFromGithubApi(Resource): def post(self): _, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("repo", type=str, required=True, location="json") - parser.add_argument("version", type=str, required=True, location="json") - parser.add_argument("package", type=str, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("repo", type=str, required=True, location="json") + .add_argument("version", type=str, required=True, location="json") + .add_argument("package", type=str, required=True, location="json") + ) args = parser.parse_args() try: @@ -192,8 +196,9 @@ class PluginInstallFromPkgApi(Resource): def post(self): _, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("plugin_unique_identifiers", type=list, required=True, location="json") + parser = reqparse.RequestParser().add_argument( + "plugin_unique_identifiers", type=list, required=True, location="json" + ) args = parser.parse_args() # check if all plugin_unique_identifiers are valid string @@ -218,11 +223,13 @@ class PluginInstallFromGithubApi(Resource): def post(self): _, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("repo", type=str, required=True, location="json") - parser.add_argument("version", type=str, required=True, location="json") - parser.add_argument("package", type=str, required=True, location="json") - parser.add_argument("plugin_unique_identifier", type=str, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("repo", type=str, required=True, location="json") + .add_argument("version", type=str, required=True, location="json") + .add_argument("package", type=str, required=True, location="json") + .add_argument("plugin_unique_identifier", type=str, required=True, location="json") + ) args = parser.parse_args() try: @@ -248,8 +255,9 @@ class PluginInstallFromMarketplaceApi(Resource): def post(self): _, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("plugin_unique_identifiers", type=list, required=True, location="json") + parser = reqparse.RequestParser().add_argument( + "plugin_unique_identifiers", type=list, required=True, location="json" + ) args = parser.parse_args() # check if all plugin_unique_identifiers are valid string @@ -274,8 +282,9 @@ class PluginFetchMarketplacePkgApi(Resource): def get(self): _, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("plugin_unique_identifier", type=str, required=True, location="args") + parser = reqparse.RequestParser().add_argument( + "plugin_unique_identifier", type=str, required=True, location="args" + ) args = parser.parse_args() try: @@ -300,8 +309,9 @@ class PluginFetchManifestApi(Resource): def get(self): _, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("plugin_unique_identifier", type=str, required=True, location="args") + parser = reqparse.RequestParser().add_argument( + "plugin_unique_identifier", type=str, required=True, location="args" + ) args = parser.parse_args() try: @@ -325,9 +335,11 @@ class PluginFetchInstallTasksApi(Resource): def get(self): _, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("page", type=int, required=True, location="args") - parser.add_argument("page_size", type=int, required=True, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("page", type=int, required=True, location="args") + .add_argument("page_size", type=int, required=True, location="args") + ) args = parser.parse_args() try: @@ -407,9 +419,11 @@ class PluginUpgradeFromMarketplaceApi(Resource): def post(self): _, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("original_plugin_unique_identifier", type=str, required=True, location="json") - parser.add_argument("new_plugin_unique_identifier", type=str, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("original_plugin_unique_identifier", type=str, required=True, location="json") + .add_argument("new_plugin_unique_identifier", type=str, required=True, location="json") + ) args = parser.parse_args() try: @@ -431,12 +445,14 @@ class PluginUpgradeFromGithubApi(Resource): def post(self): _, tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("original_plugin_unique_identifier", type=str, required=True, location="json") - parser.add_argument("new_plugin_unique_identifier", type=str, required=True, location="json") - parser.add_argument("repo", type=str, required=True, location="json") - parser.add_argument("version", type=str, required=True, location="json") - parser.add_argument("package", type=str, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("original_plugin_unique_identifier", type=str, required=True, location="json") + .add_argument("new_plugin_unique_identifier", type=str, required=True, location="json") + .add_argument("repo", type=str, required=True, location="json") + .add_argument("version", type=str, required=True, location="json") + .add_argument("package", type=str, required=True, location="json") + ) args = parser.parse_args() try: @@ -461,8 +477,7 @@ class PluginUninstallApi(Resource): @account_initialization_required @plugin_permission_required(install_required=True) def post(self): - req = reqparse.RequestParser() - req.add_argument("plugin_installation_id", type=str, required=True, location="json") + req = reqparse.RequestParser().add_argument("plugin_installation_id", type=str, required=True, location="json") args = req.parse_args() _, tenant_id = current_account_with_tenant() @@ -484,9 +499,11 @@ class PluginChangePermissionApi(Resource): if not user.is_admin_or_owner: raise Forbidden() - req = reqparse.RequestParser() - req.add_argument("install_permission", type=str, required=True, location="json") - req.add_argument("debug_permission", type=str, required=True, location="json") + req = ( + reqparse.RequestParser() + .add_argument("install_permission", type=str, required=True, location="json") + .add_argument("debug_permission", type=str, required=True, location="json") + ) args = req.parse_args() install_permission = TenantPluginPermission.InstallPermission(args["install_permission"]) @@ -535,12 +552,14 @@ class PluginFetchDynamicSelectOptionsApi(Resource): user_id = current_user.id - parser = reqparse.RequestParser() - parser.add_argument("plugin_id", type=str, required=True, location="args") - parser.add_argument("provider", type=str, required=True, location="args") - parser.add_argument("action", type=str, required=True, location="args") - parser.add_argument("parameter", type=str, required=True, location="args") - parser.add_argument("provider_type", type=str, required=True, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("plugin_id", type=str, required=True, location="args") + .add_argument("provider", type=str, required=True, location="args") + .add_argument("action", type=str, required=True, location="args") + .add_argument("parameter", type=str, required=True, location="args") + .add_argument("provider_type", type=str, required=True, location="args") + ) args = parser.parse_args() try: @@ -569,9 +588,11 @@ class PluginChangePreferencesApi(Resource): if not user.is_admin_or_owner: raise Forbidden() - req = reqparse.RequestParser() - req.add_argument("permission", type=dict, required=True, location="json") - req.add_argument("auto_upgrade", type=dict, required=True, location="json") + req = ( + reqparse.RequestParser() + .add_argument("permission", type=dict, required=True, location="json") + .add_argument("auto_upgrade", type=dict, required=True, location="json") + ) args = req.parse_args() permission = args["permission"] @@ -661,8 +682,7 @@ class PluginAutoUpgradeExcludePluginApi(Resource): # exclude one single plugin _, tenant_id = current_account_with_tenant() - req = reqparse.RequestParser() - req.add_argument("plugin_id", type=str, required=True, location="json") + req = reqparse.RequestParser().add_argument("plugin_id", type=str, required=True, location="json") args = req.parse_args() return jsonable_encoder({"success": PluginAutoUpgradeService.exclude_plugin(tenant_id, args["plugin_id"])}) diff --git a/api/controllers/console/workspace/tool_providers.py b/api/controllers/console/workspace/tool_providers.py index 17a935ade7..cc50131f0a 100644 --- a/api/controllers/console/workspace/tool_providers.py +++ b/api/controllers/console/workspace/tool_providers.py @@ -56,8 +56,7 @@ class ToolProviderListApi(Resource): user_id = user.id - req = reqparse.RequestParser() - req.add_argument( + req = reqparse.RequestParser().add_argument( "type", type=str, choices=["builtin", "model", "api", "workflow", "mcp"], @@ -107,8 +106,9 @@ class ToolBuiltinProviderDeleteApi(Resource): if not user.is_admin_or_owner: raise Forbidden() - req = reqparse.RequestParser() - req.add_argument("credential_id", type=str, required=True, nullable=False, location="json") + req = reqparse.RequestParser().add_argument( + "credential_id", type=str, required=True, nullable=False, location="json" + ) args = req.parse_args() return BuiltinToolManageService.delete_builtin_tool_provider( @@ -128,10 +128,12 @@ class ToolBuiltinProviderAddApi(Resource): user_id = user.id - parser = reqparse.RequestParser() - parser.add_argument("credentials", type=dict, required=True, nullable=False, location="json") - parser.add_argument("name", type=StrLen(30), required=False, nullable=False, location="json") - parser.add_argument("type", type=str, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("credentials", type=dict, required=True, nullable=False, location="json") + .add_argument("name", type=StrLen(30), required=False, nullable=False, location="json") + .add_argument("type", type=str, required=True, nullable=False, location="json") + ) args = parser.parse_args() if args["type"] not in CredentialType.values(): @@ -160,10 +162,12 @@ class ToolBuiltinProviderUpdateApi(Resource): user_id = user.id - parser = reqparse.RequestParser() - parser.add_argument("credential_id", type=str, required=True, nullable=False, location="json") - parser.add_argument("credentials", type=dict, required=False, nullable=True, location="json") - parser.add_argument("name", type=StrLen(30), required=False, nullable=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("credential_id", type=str, required=True, nullable=False, location="json") + .add_argument("credentials", type=dict, required=False, nullable=True, location="json") + .add_argument("name", type=StrLen(30), required=False, nullable=True, location="json") + ) args = parser.parse_args() @@ -216,15 +220,17 @@ class ToolApiProviderAddApi(Resource): user_id = user.id - parser = reqparse.RequestParser() - parser.add_argument("credentials", type=dict, required=True, nullable=False, location="json") - parser.add_argument("schema_type", type=str, required=True, nullable=False, location="json") - parser.add_argument("schema", type=str, required=True, nullable=False, location="json") - parser.add_argument("provider", type=str, required=True, nullable=False, location="json") - parser.add_argument("icon", type=dict, required=True, nullable=False, location="json") - parser.add_argument("privacy_policy", type=str, required=False, nullable=True, location="json") - parser.add_argument("labels", type=list[str], required=False, nullable=True, location="json", default=[]) - parser.add_argument("custom_disclaimer", type=str, required=False, nullable=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("credentials", type=dict, required=True, nullable=False, location="json") + .add_argument("schema_type", type=str, required=True, nullable=False, location="json") + .add_argument("schema", type=str, required=True, nullable=False, location="json") + .add_argument("provider", type=str, required=True, nullable=False, location="json") + .add_argument("icon", type=dict, required=True, nullable=False, location="json") + .add_argument("privacy_policy", type=str, required=False, nullable=True, location="json") + .add_argument("labels", type=list[str], required=False, nullable=True, location="json", default=[]) + .add_argument("custom_disclaimer", type=str, required=False, nullable=True, location="json") + ) args = parser.parse_args() @@ -252,9 +258,7 @@ class ToolApiProviderGetRemoteSchemaApi(Resource): user_id = user.id - parser = reqparse.RequestParser() - - parser.add_argument("url", type=str, required=True, nullable=False, location="args") + parser = reqparse.RequestParser().add_argument("url", type=str, required=True, nullable=False, location="args") args = parser.parse_args() @@ -275,9 +279,9 @@ class ToolApiProviderListToolsApi(Resource): user_id = user.id - parser = reqparse.RequestParser() - - parser.add_argument("provider", type=str, required=True, nullable=False, location="args") + parser = reqparse.RequestParser().add_argument( + "provider", type=str, required=True, nullable=False, location="args" + ) args = parser.parse_args() @@ -303,16 +307,18 @@ class ToolApiProviderUpdateApi(Resource): user_id = user.id - parser = reqparse.RequestParser() - parser.add_argument("credentials", type=dict, required=True, nullable=False, location="json") - parser.add_argument("schema_type", type=str, required=True, nullable=False, location="json") - parser.add_argument("schema", type=str, required=True, nullable=False, location="json") - parser.add_argument("provider", type=str, required=True, nullable=False, location="json") - parser.add_argument("original_provider", type=str, required=True, nullable=False, location="json") - parser.add_argument("icon", type=dict, required=True, nullable=False, location="json") - parser.add_argument("privacy_policy", type=str, required=True, nullable=True, location="json") - parser.add_argument("labels", type=list[str], required=False, nullable=True, location="json") - parser.add_argument("custom_disclaimer", type=str, required=True, nullable=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("credentials", type=dict, required=True, nullable=False, location="json") + .add_argument("schema_type", type=str, required=True, nullable=False, location="json") + .add_argument("schema", type=str, required=True, nullable=False, location="json") + .add_argument("provider", type=str, required=True, nullable=False, location="json") + .add_argument("original_provider", type=str, required=True, nullable=False, location="json") + .add_argument("icon", type=dict, required=True, nullable=False, location="json") + .add_argument("privacy_policy", type=str, required=True, nullable=True, location="json") + .add_argument("labels", type=list[str], required=False, nullable=True, location="json") + .add_argument("custom_disclaimer", type=str, required=True, nullable=True, location="json") + ) args = parser.parse_args() @@ -344,9 +350,9 @@ class ToolApiProviderDeleteApi(Resource): user_id = user.id - parser = reqparse.RequestParser() - - parser.add_argument("provider", type=str, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument( + "provider", type=str, required=True, nullable=False, location="json" + ) args = parser.parse_args() @@ -367,9 +373,9 @@ class ToolApiProviderGetApi(Resource): user_id = user.id - parser = reqparse.RequestParser() - - parser.add_argument("provider", type=str, required=True, nullable=False, location="args") + parser = reqparse.RequestParser().add_argument( + "provider", type=str, required=True, nullable=False, location="args" + ) args = parser.parse_args() @@ -401,9 +407,9 @@ class ToolApiProviderSchemaApi(Resource): @login_required @account_initialization_required def post(self): - parser = reqparse.RequestParser() - - parser.add_argument("schema", type=str, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument( + "schema", type=str, required=True, nullable=False, location="json" + ) args = parser.parse_args() @@ -418,14 +424,15 @@ class ToolApiProviderPreviousTestApi(Resource): @login_required @account_initialization_required def post(self): - parser = reqparse.RequestParser() - - parser.add_argument("tool_name", type=str, required=True, nullable=False, location="json") - parser.add_argument("provider_name", type=str, required=False, nullable=False, location="json") - parser.add_argument("credentials", type=dict, required=True, nullable=False, location="json") - parser.add_argument("parameters", type=dict, required=True, nullable=False, location="json") - parser.add_argument("schema_type", type=str, required=True, nullable=False, location="json") - parser.add_argument("schema", type=str, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("tool_name", type=str, required=True, nullable=False, location="json") + .add_argument("provider_name", type=str, required=False, nullable=False, location="json") + .add_argument("credentials", type=dict, required=True, nullable=False, location="json") + .add_argument("parameters", type=dict, required=True, nullable=False, location="json") + .add_argument("schema_type", type=str, required=True, nullable=False, location="json") + .add_argument("schema", type=str, required=True, nullable=False, location="json") + ) args = parser.parse_args() _, current_tenant_id = current_account_with_tenant() @@ -453,15 +460,17 @@ class ToolWorkflowProviderCreateApi(Resource): user_id = user.id - reqparser = reqparse.RequestParser() - reqparser.add_argument("workflow_app_id", type=uuid_value, required=True, nullable=False, location="json") - reqparser.add_argument("name", type=alphanumeric, required=True, nullable=False, location="json") - reqparser.add_argument("label", type=str, required=True, nullable=False, location="json") - reqparser.add_argument("description", type=str, required=True, nullable=False, location="json") - reqparser.add_argument("icon", type=dict, required=True, nullable=False, location="json") - reqparser.add_argument("parameters", type=list[dict], required=True, nullable=False, location="json") - reqparser.add_argument("privacy_policy", type=str, required=False, nullable=True, location="json", default="") - reqparser.add_argument("labels", type=list[str], required=False, nullable=True, location="json") + reqparser = ( + reqparse.RequestParser() + .add_argument("workflow_app_id", type=uuid_value, required=True, nullable=False, location="json") + .add_argument("name", type=alphanumeric, required=True, nullable=False, location="json") + .add_argument("label", type=str, required=True, nullable=False, location="json") + .add_argument("description", type=str, required=True, nullable=False, location="json") + .add_argument("icon", type=dict, required=True, nullable=False, location="json") + .add_argument("parameters", type=list[dict], required=True, nullable=False, location="json") + .add_argument("privacy_policy", type=str, required=False, nullable=True, location="json", default="") + .add_argument("labels", type=list[str], required=False, nullable=True, location="json") + ) args = reqparser.parse_args() @@ -492,15 +501,17 @@ class ToolWorkflowProviderUpdateApi(Resource): user_id = user.id - reqparser = reqparse.RequestParser() - reqparser.add_argument("workflow_tool_id", type=uuid_value, required=True, nullable=False, location="json") - reqparser.add_argument("name", type=alphanumeric, required=True, nullable=False, location="json") - reqparser.add_argument("label", type=str, required=True, nullable=False, location="json") - reqparser.add_argument("description", type=str, required=True, nullable=False, location="json") - reqparser.add_argument("icon", type=dict, required=True, nullable=False, location="json") - reqparser.add_argument("parameters", type=list[dict], required=True, nullable=False, location="json") - reqparser.add_argument("privacy_policy", type=str, required=False, nullable=True, location="json", default="") - reqparser.add_argument("labels", type=list[str], required=False, nullable=True, location="json") + reqparser = ( + reqparse.RequestParser() + .add_argument("workflow_tool_id", type=uuid_value, required=True, nullable=False, location="json") + .add_argument("name", type=alphanumeric, required=True, nullable=False, location="json") + .add_argument("label", type=str, required=True, nullable=False, location="json") + .add_argument("description", type=str, required=True, nullable=False, location="json") + .add_argument("icon", type=dict, required=True, nullable=False, location="json") + .add_argument("parameters", type=list[dict], required=True, nullable=False, location="json") + .add_argument("privacy_policy", type=str, required=False, nullable=True, location="json", default="") + .add_argument("labels", type=list[str], required=False, nullable=True, location="json") + ) args = reqparser.parse_args() @@ -534,8 +545,9 @@ class ToolWorkflowProviderDeleteApi(Resource): user_id = user.id - reqparser = reqparse.RequestParser() - reqparser.add_argument("workflow_tool_id", type=uuid_value, required=True, nullable=False, location="json") + reqparser = reqparse.RequestParser().add_argument( + "workflow_tool_id", type=uuid_value, required=True, nullable=False, location="json" + ) args = reqparser.parse_args() @@ -556,9 +568,11 @@ class ToolWorkflowProviderGetApi(Resource): user_id = user.id - parser = reqparse.RequestParser() - parser.add_argument("workflow_tool_id", type=uuid_value, required=False, nullable=True, location="args") - parser.add_argument("workflow_app_id", type=uuid_value, required=False, nullable=True, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("workflow_tool_id", type=uuid_value, required=False, nullable=True, location="args") + .add_argument("workflow_app_id", type=uuid_value, required=False, nullable=True, location="args") + ) args = parser.parse_args() @@ -590,8 +604,9 @@ class ToolWorkflowProviderListToolApi(Resource): user_id = user.id - parser = reqparse.RequestParser() - parser.add_argument("workflow_tool_id", type=uuid_value, required=True, nullable=False, location="args") + parser = reqparse.RequestParser().add_argument( + "workflow_tool_id", type=uuid_value, required=True, nullable=False, location="args" + ) args = parser.parse_args() @@ -776,8 +791,7 @@ class ToolBuiltinProviderSetDefaultApi(Resource): @account_initialization_required def post(self, provider): current_user, current_tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("id", type=str, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument("id", type=str, required=True, nullable=False, location="json") args = parser.parse_args() return BuiltinToolManageService.set_default_provider( tenant_id=current_tenant_id, user_id=current_user.id, provider=provider, id=args["id"] @@ -790,9 +804,11 @@ class ToolOAuthCustomClient(Resource): @login_required @account_initialization_required def post(self, provider): - parser = reqparse.RequestParser() - parser.add_argument("client_params", type=dict, required=False, nullable=True, location="json") - parser.add_argument("enable_oauth_custom_client", type=bool, required=False, nullable=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("client_params", type=dict, required=False, nullable=True, location="json") + .add_argument("enable_oauth_custom_client", type=bool, required=False, nullable=True, location="json") + ) args = parser.parse_args() user, tenant_id = current_account_with_tenant() @@ -862,18 +878,18 @@ class ToolProviderMCPApi(Resource): @login_required @account_initialization_required def post(self): - parser = reqparse.RequestParser() - parser.add_argument("server_url", type=str, required=True, nullable=False, location="json") - parser.add_argument("name", type=str, required=True, nullable=False, location="json") - parser.add_argument("icon", type=str, required=True, nullable=False, location="json") - parser.add_argument("icon_type", type=str, required=True, nullable=False, location="json") - parser.add_argument("icon_background", type=str, required=False, nullable=True, location="json", default="") - parser.add_argument("server_identifier", type=str, required=True, nullable=False, location="json") - parser.add_argument("timeout", type=float, required=False, nullable=False, location="json", default=30) - parser.add_argument( - "sse_read_timeout", type=float, required=False, nullable=False, location="json", default=300 + parser = ( + reqparse.RequestParser() + .add_argument("server_url", type=str, required=True, nullable=False, location="json") + .add_argument("name", type=str, required=True, nullable=False, location="json") + .add_argument("icon", type=str, required=True, nullable=False, location="json") + .add_argument("icon_type", type=str, required=True, nullable=False, location="json") + .add_argument("icon_background", type=str, required=False, nullable=True, location="json", default="") + .add_argument("server_identifier", type=str, required=True, nullable=False, location="json") + .add_argument("timeout", type=float, required=False, nullable=False, location="json", default=30) + .add_argument("sse_read_timeout", type=float, required=False, nullable=False, location="json", default=300) + .add_argument("headers", type=dict, required=False, nullable=True, location="json", default={}) ) - parser.add_argument("headers", type=dict, required=False, nullable=True, location="json", default={}) args = parser.parse_args() user, tenant_id = current_account_with_tenant() if not is_valid_url(args["server_url"]): @@ -898,17 +914,19 @@ class ToolProviderMCPApi(Resource): @login_required @account_initialization_required def put(self): - parser = reqparse.RequestParser() - parser.add_argument("server_url", type=str, required=True, nullable=False, location="json") - parser.add_argument("name", type=str, required=True, nullable=False, location="json") - parser.add_argument("icon", type=str, required=True, nullable=False, location="json") - parser.add_argument("icon_type", type=str, required=True, nullable=False, location="json") - parser.add_argument("icon_background", type=str, required=False, nullable=True, location="json") - parser.add_argument("provider_id", type=str, required=True, nullable=False, location="json") - parser.add_argument("server_identifier", type=str, required=True, nullable=False, location="json") - parser.add_argument("timeout", type=float, required=False, nullable=True, location="json") - parser.add_argument("sse_read_timeout", type=float, required=False, nullable=True, location="json") - parser.add_argument("headers", type=dict, required=False, nullable=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("server_url", type=str, required=True, nullable=False, location="json") + .add_argument("name", type=str, required=True, nullable=False, location="json") + .add_argument("icon", type=str, required=True, nullable=False, location="json") + .add_argument("icon_type", type=str, required=True, nullable=False, location="json") + .add_argument("icon_background", type=str, required=False, nullable=True, location="json") + .add_argument("provider_id", type=str, required=True, nullable=False, location="json") + .add_argument("server_identifier", type=str, required=True, nullable=False, location="json") + .add_argument("timeout", type=float, required=False, nullable=True, location="json") + .add_argument("sse_read_timeout", type=float, required=False, nullable=True, location="json") + .add_argument("headers", type=dict, required=False, nullable=True, location="json") + ) args = parser.parse_args() if not is_valid_url(args["server_url"]): if "[__HIDDEN__]" in args["server_url"]: @@ -935,8 +953,9 @@ class ToolProviderMCPApi(Resource): @login_required @account_initialization_required def delete(self): - parser = reqparse.RequestParser() - parser.add_argument("provider_id", type=str, required=True, nullable=False, location="json") + parser = reqparse.RequestParser().add_argument( + "provider_id", type=str, required=True, nullable=False, location="json" + ) args = parser.parse_args() _, current_tenant_id = current_account_with_tenant() MCPToolManageService.delete_mcp_tool(tenant_id=current_tenant_id, provider_id=args["provider_id"]) @@ -949,9 +968,11 @@ class ToolMCPAuthApi(Resource): @login_required @account_initialization_required def post(self): - parser = reqparse.RequestParser() - parser.add_argument("provider_id", type=str, required=True, nullable=False, location="json") - parser.add_argument("authorization_code", type=str, required=False, nullable=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("provider_id", type=str, required=True, nullable=False, location="json") + .add_argument("authorization_code", type=str, required=False, nullable=True, location="json") + ) args = parser.parse_args() provider_id = args["provider_id"] _, tenant_id = current_account_with_tenant() @@ -1030,9 +1051,11 @@ class ToolMCPUpdateApi(Resource): @console_ns.route("/mcp/oauth/callback") class ToolMCPCallbackApi(Resource): def get(self): - parser = reqparse.RequestParser() - parser.add_argument("code", type=str, required=True, nullable=False, location="args") - parser.add_argument("state", type=str, required=True, nullable=False, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("code", type=str, required=True, nullable=False, location="args") + .add_argument("state", type=str, required=True, nullable=False, location="args") + ) args = parser.parse_args() state_key = args["state"] authorization_code = args["code"] diff --git a/api/controllers/console/workspace/workspace.py b/api/controllers/console/workspace/workspace.py index 5be427e9bb..f9856df9ea 100644 --- a/api/controllers/console/workspace/workspace.py +++ b/api/controllers/console/workspace/workspace.py @@ -97,9 +97,11 @@ class WorkspaceListApi(Resource): @setup_required @admin_required def get(self): - parser = reqparse.RequestParser() - parser.add_argument("page", type=inputs.int_range(1, 99999), required=False, default=1, location="args") - parser.add_argument("limit", type=inputs.int_range(1, 100), required=False, default=20, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("page", type=inputs.int_range(1, 99999), required=False, default=1, location="args") + .add_argument("limit", type=inputs.int_range(1, 100), required=False, default=20, location="args") + ) args = parser.parse_args() stmt = select(Tenant).order_by(Tenant.created_at.desc()) @@ -154,8 +156,7 @@ class SwitchWorkspaceApi(Resource): @account_initialization_required def post(self): current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("tenant_id", type=str, required=True, location="json") + parser = reqparse.RequestParser().add_argument("tenant_id", type=str, required=True, location="json") args = parser.parse_args() # check if tenant_id is valid, 403 if not @@ -179,9 +180,11 @@ class CustomConfigWorkspaceApi(Resource): @cloud_edition_billing_resource_check("workspace_custom") def post(self): _, current_tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("remove_webapp_brand", type=bool, location="json") - parser.add_argument("replace_webapp_logo", type=str, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("remove_webapp_brand", type=bool, location="json") + .add_argument("replace_webapp_logo", type=str, location="json") + ) args = parser.parse_args() tenant = db.get_or_404(Tenant, current_tenant_id) @@ -246,8 +249,7 @@ class WorkspaceInfoApi(Resource): # Change workspace name def post(self): _, current_tenant_id = current_account_with_tenant() - parser = reqparse.RequestParser() - parser.add_argument("name", type=str, required=True, location="json") + parser = reqparse.RequestParser().add_argument("name", type=str, required=True, location="json") args = parser.parse_args() if not current_tenant_id: diff --git a/api/controllers/files/image_preview.py b/api/controllers/files/image_preview.py index 0efee0c377..3db82456d5 100644 --- a/api/controllers/files/image_preview.py +++ b/api/controllers/files/image_preview.py @@ -46,11 +46,13 @@ class FilePreviewApi(Resource): def get(self, file_id): file_id = str(file_id) - parser = reqparse.RequestParser() - parser.add_argument("timestamp", type=str, required=True, location="args") - parser.add_argument("nonce", type=str, required=True, location="args") - parser.add_argument("sign", type=str, required=True, location="args") - parser.add_argument("as_attachment", type=bool, required=False, default=False, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("timestamp", type=str, required=True, location="args") + .add_argument("nonce", type=str, required=True, location="args") + .add_argument("sign", type=str, required=True, location="args") + .add_argument("as_attachment", type=bool, required=False, default=False, location="args") + ) args = parser.parse_args() diff --git a/api/controllers/files/tool_files.py b/api/controllers/files/tool_files.py index 42207b878c..dec5a4a1b2 100644 --- a/api/controllers/files/tool_files.py +++ b/api/controllers/files/tool_files.py @@ -16,12 +16,13 @@ class ToolFileApi(Resource): def get(self, file_id, extension): file_id = str(file_id) - parser = reqparse.RequestParser() - - parser.add_argument("timestamp", type=str, required=True, location="args") - parser.add_argument("nonce", type=str, required=True, location="args") - parser.add_argument("sign", type=str, required=True, location="args") - parser.add_argument("as_attachment", type=bool, required=False, default=False, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("timestamp", type=str, required=True, location="args") + .add_argument("nonce", type=str, required=True, location="args") + .add_argument("sign", type=str, required=True, location="args") + .add_argument("as_attachment", type=bool, required=False, default=False, location="args") + ) args = parser.parse_args() if not verify_tool_file_signature( diff --git a/api/controllers/files/upload.py b/api/controllers/files/upload.py index 206a5d1cc2..a09e24e2d9 100644 --- a/api/controllers/files/upload.py +++ b/api/controllers/files/upload.py @@ -18,19 +18,17 @@ from core.tools.tool_file_manager import ToolFileManager from fields.file_fields import build_file_model # Define parser for both documentation and validation -upload_parser = reqparse.RequestParser() -upload_parser.add_argument("file", location="files", type=FileStorage, required=True, help="File to upload") -upload_parser.add_argument( - "timestamp", type=str, required=True, location="args", help="Unix timestamp for signature verification" +upload_parser = ( + reqparse.RequestParser() + .add_argument("file", location="files", type=FileStorage, required=True, help="File to upload") + .add_argument( + "timestamp", type=str, required=True, location="args", help="Unix timestamp for signature verification" + ) + .add_argument("nonce", type=str, required=True, location="args", help="Random string for signature verification") + .add_argument("sign", type=str, required=True, location="args", help="HMAC signature for request validation") + .add_argument("tenant_id", type=str, required=True, location="args", help="Tenant identifier") + .add_argument("user_id", type=str, required=False, location="args", help="User identifier") ) -upload_parser.add_argument( - "nonce", type=str, required=True, location="args", help="Random string for signature verification" -) -upload_parser.add_argument( - "sign", type=str, required=True, location="args", help="HMAC signature for request validation" -) -upload_parser.add_argument("tenant_id", type=str, required=True, location="args", help="Tenant identifier") -upload_parser.add_argument("user_id", type=str, required=False, location="args", help="User identifier") @files_ns.route("/upload/for-plugin") diff --git a/api/controllers/inner_api/mail.py b/api/controllers/inner_api/mail.py index 39411a077a..7e40d81706 100644 --- a/api/controllers/inner_api/mail.py +++ b/api/controllers/inner_api/mail.py @@ -5,11 +5,13 @@ from controllers.inner_api import inner_api_ns from controllers.inner_api.wraps import billing_inner_api_only, enterprise_inner_api_only from tasks.mail_inner_task import send_inner_email_task -_mail_parser = reqparse.RequestParser() -_mail_parser.add_argument("to", type=str, action="append", required=True) -_mail_parser.add_argument("subject", type=str, required=True) -_mail_parser.add_argument("body", type=str, required=True) -_mail_parser.add_argument("substitutions", type=dict, required=False) +_mail_parser = ( + reqparse.RequestParser() + .add_argument("to", type=str, action="append", required=True) + .add_argument("subject", type=str, required=True) + .add_argument("body", type=str, required=True) + .add_argument("substitutions", type=dict, required=False) +) class BaseMail(Resource): diff --git a/api/controllers/inner_api/plugin/wraps.py b/api/controllers/inner_api/plugin/wraps.py index 1f588bedce..2a57bb745b 100644 --- a/api/controllers/inner_api/plugin/wraps.py +++ b/api/controllers/inner_api/plugin/wraps.py @@ -72,9 +72,11 @@ def get_user_tenant(view: Callable[P, R] | None = None): @wraps(view_func) def decorated_view(*args: P.args, **kwargs: P.kwargs): # fetch json body - parser = reqparse.RequestParser() - parser.add_argument("tenant_id", type=str, required=True, location="json") - parser.add_argument("user_id", type=str, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("tenant_id", type=str, required=True, location="json") + .add_argument("user_id", type=str, required=True, location="json") + ) p = parser.parse_args() diff --git a/api/controllers/inner_api/workspace/workspace.py b/api/controllers/inner_api/workspace/workspace.py index 861da57708..8391a15919 100644 --- a/api/controllers/inner_api/workspace/workspace.py +++ b/api/controllers/inner_api/workspace/workspace.py @@ -25,9 +25,11 @@ class EnterpriseWorkspace(Resource): } ) def post(self): - parser = reqparse.RequestParser() - parser.add_argument("name", type=str, required=True, location="json") - parser.add_argument("owner_email", type=str, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("name", type=str, required=True, location="json") + .add_argument("owner_email", type=str, required=True, location="json") + ) args = parser.parse_args() account = db.session.query(Account).filter_by(email=args["owner_email"]).first() @@ -68,8 +70,7 @@ class EnterpriseWorkspaceNoOwnerEmail(Resource): } ) def post(self): - parser = reqparse.RequestParser() - parser.add_argument("name", type=str, required=True, location="json") + parser = reqparse.RequestParser().add_argument("name", type=str, required=True, location="json") args = parser.parse_args() tenant = TenantService.create_tenant(args["name"], is_from_dashboard=True) diff --git a/api/controllers/mcp/mcp.py b/api/controllers/mcp/mcp.py index a8629dca20..85b7df229f 100644 --- a/api/controllers/mcp/mcp.py +++ b/api/controllers/mcp/mcp.py @@ -33,14 +33,12 @@ def int_or_str(value): # Define parser for both documentation and validation -mcp_request_parser = reqparse.RequestParser() -mcp_request_parser.add_argument( - "jsonrpc", type=str, required=True, location="json", help="JSON-RPC version (should be '2.0')" -) -mcp_request_parser.add_argument("method", type=str, required=True, location="json", help="The method to invoke") -mcp_request_parser.add_argument("params", type=dict, required=False, location="json", help="Parameters for the method") -mcp_request_parser.add_argument( - "id", type=int_or_str, required=False, location="json", help="Request ID for tracking responses" +mcp_request_parser = ( + reqparse.RequestParser() + .add_argument("jsonrpc", type=str, required=True, location="json", help="JSON-RPC version (should be '2.0')") + .add_argument("method", type=str, required=True, location="json", help="The method to invoke") + .add_argument("params", type=dict, required=False, location="json", help="Parameters for the method") + .add_argument("id", type=int_or_str, required=False, location="json", help="Request ID for tracking responses") ) diff --git a/api/controllers/service_api/app/annotation.py b/api/controllers/service_api/app/annotation.py index 0521f1537c..ed013b1674 100644 --- a/api/controllers/service_api/app/annotation.py +++ b/api/controllers/service_api/app/annotation.py @@ -15,19 +15,19 @@ from models.model import App from services.annotation_service import AppAnnotationService # Define parsers for annotation API -annotation_create_parser = reqparse.RequestParser() -annotation_create_parser.add_argument("question", required=True, type=str, location="json", help="Annotation question") -annotation_create_parser.add_argument("answer", required=True, type=str, location="json", help="Annotation answer") +annotation_create_parser = ( + reqparse.RequestParser() + .add_argument("question", required=True, type=str, location="json", help="Annotation question") + .add_argument("answer", required=True, type=str, location="json", help="Annotation answer") +) -annotation_reply_action_parser = reqparse.RequestParser() -annotation_reply_action_parser.add_argument( - "score_threshold", required=True, type=float, location="json", help="Score threshold for annotation matching" -) -annotation_reply_action_parser.add_argument( - "embedding_provider_name", required=True, type=str, location="json", help="Embedding provider name" -) -annotation_reply_action_parser.add_argument( - "embedding_model_name", required=True, type=str, location="json", help="Embedding model name" +annotation_reply_action_parser = ( + reqparse.RequestParser() + .add_argument( + "score_threshold", required=True, type=float, location="json", help="Score threshold for annotation matching" + ) + .add_argument("embedding_provider_name", required=True, type=str, location="json", help="Embedding provider name") + .add_argument("embedding_model_name", required=True, type=str, location="json", help="Embedding model name") ) diff --git a/api/controllers/service_api/app/audio.py b/api/controllers/service_api/app/audio.py index 33035123d7..c069a7ddfb 100644 --- a/api/controllers/service_api/app/audio.py +++ b/api/controllers/service_api/app/audio.py @@ -85,11 +85,13 @@ class AudioApi(Resource): # Define parser for text-to-audio API -text_to_audio_parser = reqparse.RequestParser() -text_to_audio_parser.add_argument("message_id", type=str, required=False, location="json", help="Message ID") -text_to_audio_parser.add_argument("voice", type=str, location="json", help="Voice to use for TTS") -text_to_audio_parser.add_argument("text", type=str, location="json", help="Text to convert to audio") -text_to_audio_parser.add_argument("streaming", type=bool, location="json", help="Enable streaming response") +text_to_audio_parser = ( + reqparse.RequestParser() + .add_argument("message_id", type=str, required=False, location="json", help="Message ID") + .add_argument("voice", type=str, location="json", help="Voice to use for TTS") + .add_argument("text", type=str, location="json", help="Text to convert to audio") + .add_argument("streaming", type=bool, location="json", help="Enable streaming response") +) @service_api_ns.route("/text-to-audio") diff --git a/api/controllers/service_api/app/completion.py b/api/controllers/service_api/app/completion.py index 22428ee0ab..915e7e9416 100644 --- a/api/controllers/service_api/app/completion.py +++ b/api/controllers/service_api/app/completion.py @@ -37,40 +37,34 @@ logger = logging.getLogger(__name__) # Define parser for completion API -completion_parser = reqparse.RequestParser() -completion_parser.add_argument( - "inputs", type=dict, required=True, location="json", help="Input parameters for completion" -) -completion_parser.add_argument("query", type=str, location="json", default="", help="The query string") -completion_parser.add_argument("files", type=list, required=False, location="json", help="List of file attachments") -completion_parser.add_argument( - "response_mode", type=str, choices=["blocking", "streaming"], location="json", help="Response mode" -) -completion_parser.add_argument( - "retriever_from", type=str, required=False, default="dev", location="json", help="Retriever source" +completion_parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, location="json", help="Input parameters for completion") + .add_argument("query", type=str, location="json", default="", help="The query string") + .add_argument("files", type=list, required=False, location="json", help="List of file attachments") + .add_argument("response_mode", type=str, choices=["blocking", "streaming"], location="json", help="Response mode") + .add_argument("retriever_from", type=str, required=False, default="dev", location="json", help="Retriever source") ) # Define parser for chat API -chat_parser = reqparse.RequestParser() -chat_parser.add_argument("inputs", type=dict, required=True, location="json", help="Input parameters for chat") -chat_parser.add_argument("query", type=str, required=True, location="json", help="The chat query") -chat_parser.add_argument("files", type=list, required=False, location="json", help="List of file attachments") -chat_parser.add_argument( - "response_mode", type=str, choices=["blocking", "streaming"], location="json", help="Response mode" +chat_parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, location="json", help="Input parameters for chat") + .add_argument("query", type=str, required=True, location="json", help="The chat query") + .add_argument("files", type=list, required=False, location="json", help="List of file attachments") + .add_argument("response_mode", type=str, choices=["blocking", "streaming"], location="json", help="Response mode") + .add_argument("conversation_id", type=uuid_value, location="json", help="Existing conversation ID") + .add_argument("retriever_from", type=str, required=False, default="dev", location="json", help="Retriever source") + .add_argument( + "auto_generate_name", + type=bool, + required=False, + default=True, + location="json", + help="Auto generate conversation name", + ) + .add_argument("workflow_id", type=str, required=False, location="json", help="Workflow ID for advanced chat") ) -chat_parser.add_argument("conversation_id", type=uuid_value, location="json", help="Existing conversation ID") -chat_parser.add_argument( - "retriever_from", type=str, required=False, default="dev", location="json", help="Retriever source" -) -chat_parser.add_argument( - "auto_generate_name", - type=bool, - required=False, - default=True, - location="json", - help="Auto generate conversation name", -) -chat_parser.add_argument("workflow_id", type=str, required=False, location="json", help="Workflow ID for advanced chat") @service_api_ns.route("/completion-messages") diff --git a/api/controllers/service_api/app/conversation.py b/api/controllers/service_api/app/conversation.py index 711dd5704c..c4e23dd2e7 100644 --- a/api/controllers/service_api/app/conversation.py +++ b/api/controllers/service_api/app/conversation.py @@ -24,48 +24,63 @@ from models.model import App, AppMode, EndUser from services.conversation_service import ConversationService # Define parsers for conversation APIs -conversation_list_parser = reqparse.RequestParser() -conversation_list_parser.add_argument( - "last_id", type=uuid_value, location="args", help="Last conversation ID for pagination" -) -conversation_list_parser.add_argument( - "limit", - type=int_range(1, 100), - required=False, - default=20, - location="args", - help="Number of conversations to return", -) -conversation_list_parser.add_argument( - "sort_by", - type=str, - choices=["created_at", "-created_at", "updated_at", "-updated_at"], - required=False, - default="-updated_at", - location="args", - help="Sort order for conversations", +conversation_list_parser = ( + reqparse.RequestParser() + .add_argument("last_id", type=uuid_value, location="args", help="Last conversation ID for pagination") + .add_argument( + "limit", + type=int_range(1, 100), + required=False, + default=20, + location="args", + help="Number of conversations to return", + ) + .add_argument( + "sort_by", + type=str, + choices=["created_at", "-created_at", "updated_at", "-updated_at"], + required=False, + default="-updated_at", + location="args", + help="Sort order for conversations", + ) ) -conversation_rename_parser = reqparse.RequestParser() -conversation_rename_parser.add_argument("name", type=str, required=False, location="json", help="New conversation name") -conversation_rename_parser.add_argument( - "auto_generate", type=bool, required=False, default=False, location="json", help="Auto-generate conversation name" +conversation_rename_parser = ( + reqparse.RequestParser() + .add_argument("name", type=str, required=False, location="json", help="New conversation name") + .add_argument( + "auto_generate", + type=bool, + required=False, + default=False, + location="json", + help="Auto-generate conversation name", + ) ) -conversation_variables_parser = reqparse.RequestParser() -conversation_variables_parser.add_argument( - "last_id", type=uuid_value, location="args", help="Last variable ID for pagination" -) -conversation_variables_parser.add_argument( - "limit", type=int_range(1, 100), required=False, default=20, location="args", help="Number of variables to return" +conversation_variables_parser = ( + reqparse.RequestParser() + .add_argument("last_id", type=uuid_value, location="args", help="Last variable ID for pagination") + .add_argument( + "limit", + type=int_range(1, 100), + required=False, + default=20, + location="args", + help="Number of variables to return", + ) ) -conversation_variable_update_parser = reqparse.RequestParser() -# using lambda is for passing the already-typed value without modification -# if no lambda, it will be converted to string -# the string cannot be converted using json.loads -conversation_variable_update_parser.add_argument( - "value", required=True, location="json", type=lambda x: x, help="New value for the conversation variable" +conversation_variable_update_parser = reqparse.RequestParser().add_argument( + # using lambda is for passing the already-typed value without modification + # if no lambda, it will be converted to string + # the string cannot be converted using json.loads + "value", + required=True, + location="json", + type=lambda x: x, + help="New value for the conversation variable", ) diff --git a/api/controllers/service_api/app/file_preview.py b/api/controllers/service_api/app/file_preview.py index 63b46f49f2..b8e91f0657 100644 --- a/api/controllers/service_api/app/file_preview.py +++ b/api/controllers/service_api/app/file_preview.py @@ -18,8 +18,7 @@ logger = logging.getLogger(__name__) # Define parser for file preview API -file_preview_parser = reqparse.RequestParser() -file_preview_parser.add_argument( +file_preview_parser = reqparse.RequestParser().add_argument( "as_attachment", type=bool, required=False, default=False, location="args", help="Download as attachment" ) diff --git a/api/controllers/service_api/app/message.py b/api/controllers/service_api/app/message.py index fc506ef723..b8e5ed28e4 100644 --- a/api/controllers/service_api/app/message.py +++ b/api/controllers/service_api/app/message.py @@ -26,25 +26,37 @@ logger = logging.getLogger(__name__) # Define parsers for message APIs -message_list_parser = reqparse.RequestParser() -message_list_parser.add_argument( - "conversation_id", required=True, type=uuid_value, location="args", help="Conversation ID" -) -message_list_parser.add_argument("first_id", type=uuid_value, location="args", help="First message ID for pagination") -message_list_parser.add_argument( - "limit", type=int_range(1, 100), required=False, default=20, location="args", help="Number of messages to return" +message_list_parser = ( + reqparse.RequestParser() + .add_argument("conversation_id", required=True, type=uuid_value, location="args", help="Conversation ID") + .add_argument("first_id", type=uuid_value, location="args", help="First message ID for pagination") + .add_argument( + "limit", + type=int_range(1, 100), + required=False, + default=20, + location="args", + help="Number of messages to return", + ) ) -message_feedback_parser = reqparse.RequestParser() -message_feedback_parser.add_argument( - "rating", type=str, choices=["like", "dislike", None], location="json", help="Feedback rating" +message_feedback_parser = ( + reqparse.RequestParser() + .add_argument("rating", type=str, choices=["like", "dislike", None], location="json", help="Feedback rating") + .add_argument("content", type=str, location="json", help="Feedback content") ) -message_feedback_parser.add_argument("content", type=str, location="json", help="Feedback content") -feedback_list_parser = reqparse.RequestParser() -feedback_list_parser.add_argument("page", type=int, default=1, location="args", help="Page number") -feedback_list_parser.add_argument( - "limit", type=int_range(1, 101), required=False, default=20, location="args", help="Number of feedbacks per page" +feedback_list_parser = ( + reqparse.RequestParser() + .add_argument("page", type=int, default=1, location="args", help="Page number") + .add_argument( + "limit", + type=int_range(1, 101), + required=False, + default=20, + location="args", + help="Number of feedbacks per page", + ) ) diff --git a/api/controllers/service_api/app/workflow.py b/api/controllers/service_api/app/workflow.py index e912563bc6..af5eae463d 100644 --- a/api/controllers/service_api/app/workflow.py +++ b/api/controllers/service_api/app/workflow.py @@ -42,32 +42,36 @@ from services.workflow_app_service import WorkflowAppService logger = logging.getLogger(__name__) # Define parsers for workflow APIs -workflow_run_parser = reqparse.RequestParser() -workflow_run_parser.add_argument("inputs", type=dict, required=True, nullable=False, location="json") -workflow_run_parser.add_argument("files", type=list, required=False, location="json") -workflow_run_parser.add_argument("response_mode", type=str, choices=["blocking", "streaming"], location="json") +workflow_run_parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, nullable=False, location="json") + .add_argument("files", type=list, required=False, location="json") + .add_argument("response_mode", type=str, choices=["blocking", "streaming"], location="json") +) -workflow_log_parser = reqparse.RequestParser() -workflow_log_parser.add_argument("keyword", type=str, location="args") -workflow_log_parser.add_argument("status", type=str, choices=["succeeded", "failed", "stopped"], location="args") -workflow_log_parser.add_argument("created_at__before", type=str, location="args") -workflow_log_parser.add_argument("created_at__after", type=str, location="args") -workflow_log_parser.add_argument( - "created_by_end_user_session_id", - type=str, - location="args", - required=False, - default=None, +workflow_log_parser = ( + reqparse.RequestParser() + .add_argument("keyword", type=str, location="args") + .add_argument("status", type=str, choices=["succeeded", "failed", "stopped"], location="args") + .add_argument("created_at__before", type=str, location="args") + .add_argument("created_at__after", type=str, location="args") + .add_argument( + "created_by_end_user_session_id", + type=str, + location="args", + required=False, + default=None, + ) + .add_argument( + "created_by_account", + type=str, + location="args", + required=False, + default=None, + ) + .add_argument("page", type=int_range(1, 99999), default=1, location="args") + .add_argument("limit", type=int_range(1, 100), default=20, location="args") ) -workflow_log_parser.add_argument( - "created_by_account", - type=str, - location="args", - required=False, - default=None, -) -workflow_log_parser.add_argument("page", type=int_range(1, 99999), default=1, location="args") -workflow_log_parser.add_argument("limit", type=int_range(1, 100), default=20, location="args") workflow_run_fields = { "id": fields.String, diff --git a/api/controllers/service_api/dataset/dataset.py b/api/controllers/service_api/dataset/dataset.py index 92bbb76f0f..9d5566919b 100644 --- a/api/controllers/service_api/dataset/dataset.py +++ b/api/controllers/service_api/dataset/dataset.py @@ -33,119 +33,118 @@ def _validate_name(name): # Define parsers for dataset operations -dataset_create_parser = reqparse.RequestParser() -dataset_create_parser.add_argument( - "name", - nullable=False, - required=True, - help="type is required. Name must be between 1 to 40 characters.", - type=_validate_name, -) -dataset_create_parser.add_argument( - "description", - type=validate_description_length, - nullable=True, - required=False, - default="", -) -dataset_create_parser.add_argument( - "indexing_technique", - type=str, - location="json", - choices=Dataset.INDEXING_TECHNIQUE_LIST, - help="Invalid indexing technique.", -) -dataset_create_parser.add_argument( - "permission", - type=str, - location="json", - choices=(DatasetPermissionEnum.ONLY_ME, DatasetPermissionEnum.ALL_TEAM, DatasetPermissionEnum.PARTIAL_TEAM), - help="Invalid permission.", - required=False, - nullable=False, -) -dataset_create_parser.add_argument( - "external_knowledge_api_id", - type=str, - nullable=True, - required=False, - default="_validate_name", -) -dataset_create_parser.add_argument( - "provider", - type=str, - nullable=True, - required=False, - default="vendor", -) -dataset_create_parser.add_argument( - "external_knowledge_id", - type=str, - nullable=True, - required=False, -) -dataset_create_parser.add_argument("retrieval_model", type=dict, required=False, nullable=True, location="json") -dataset_create_parser.add_argument("embedding_model", type=str, required=False, nullable=True, location="json") -dataset_create_parser.add_argument("embedding_model_provider", type=str, required=False, nullable=True, location="json") - -dataset_update_parser = reqparse.RequestParser() -dataset_update_parser.add_argument( - "name", - nullable=False, - help="type is required. Name must be between 1 to 40 characters.", - type=_validate_name, -) -dataset_update_parser.add_argument( - "description", location="json", store_missing=False, type=validate_description_length -) -dataset_update_parser.add_argument( - "indexing_technique", - type=str, - location="json", - choices=Dataset.INDEXING_TECHNIQUE_LIST, - nullable=True, - help="Invalid indexing technique.", -) -dataset_update_parser.add_argument( - "permission", - type=str, - location="json", - choices=(DatasetPermissionEnum.ONLY_ME, DatasetPermissionEnum.ALL_TEAM, DatasetPermissionEnum.PARTIAL_TEAM), - help="Invalid permission.", -) -dataset_update_parser.add_argument("embedding_model", type=str, location="json", help="Invalid embedding model.") -dataset_update_parser.add_argument( - "embedding_model_provider", type=str, location="json", help="Invalid embedding model provider." -) -dataset_update_parser.add_argument("retrieval_model", type=dict, location="json", help="Invalid retrieval model.") -dataset_update_parser.add_argument("partial_member_list", type=list, location="json", help="Invalid parent user list.") -dataset_update_parser.add_argument( - "external_retrieval_model", - type=dict, - required=False, - nullable=True, - location="json", - help="Invalid external retrieval model.", -) -dataset_update_parser.add_argument( - "external_knowledge_id", - type=str, - required=False, - nullable=True, - location="json", - help="Invalid external knowledge id.", -) -dataset_update_parser.add_argument( - "external_knowledge_api_id", - type=str, - required=False, - nullable=True, - location="json", - help="Invalid external knowledge api id.", +dataset_create_parser = ( + reqparse.RequestParser() + .add_argument( + "name", + nullable=False, + required=True, + help="type is required. Name must be between 1 to 40 characters.", + type=_validate_name, + ) + .add_argument( + "description", + type=validate_description_length, + nullable=True, + required=False, + default="", + ) + .add_argument( + "indexing_technique", + type=str, + location="json", + choices=Dataset.INDEXING_TECHNIQUE_LIST, + help="Invalid indexing technique.", + ) + .add_argument( + "permission", + type=str, + location="json", + choices=(DatasetPermissionEnum.ONLY_ME, DatasetPermissionEnum.ALL_TEAM, DatasetPermissionEnum.PARTIAL_TEAM), + help="Invalid permission.", + required=False, + nullable=False, + ) + .add_argument( + "external_knowledge_api_id", + type=str, + nullable=True, + required=False, + default="_validate_name", + ) + .add_argument( + "provider", + type=str, + nullable=True, + required=False, + default="vendor", + ) + .add_argument( + "external_knowledge_id", + type=str, + nullable=True, + required=False, + ) + .add_argument("retrieval_model", type=dict, required=False, nullable=True, location="json") + .add_argument("embedding_model", type=str, required=False, nullable=True, location="json") + .add_argument("embedding_model_provider", type=str, required=False, nullable=True, location="json") ) -tag_create_parser = reqparse.RequestParser() -tag_create_parser.add_argument( +dataset_update_parser = ( + reqparse.RequestParser() + .add_argument( + "name", + nullable=False, + help="type is required. Name must be between 1 to 40 characters.", + type=_validate_name, + ) + .add_argument("description", location="json", store_missing=False, type=validate_description_length) + .add_argument( + "indexing_technique", + type=str, + location="json", + choices=Dataset.INDEXING_TECHNIQUE_LIST, + nullable=True, + help="Invalid indexing technique.", + ) + .add_argument( + "permission", + type=str, + location="json", + choices=(DatasetPermissionEnum.ONLY_ME, DatasetPermissionEnum.ALL_TEAM, DatasetPermissionEnum.PARTIAL_TEAM), + help="Invalid permission.", + ) + .add_argument("embedding_model", type=str, location="json", help="Invalid embedding model.") + .add_argument("embedding_model_provider", type=str, location="json", help="Invalid embedding model provider.") + .add_argument("retrieval_model", type=dict, location="json", help="Invalid retrieval model.") + .add_argument("partial_member_list", type=list, location="json", help="Invalid parent user list.") + .add_argument( + "external_retrieval_model", + type=dict, + required=False, + nullable=True, + location="json", + help="Invalid external retrieval model.", + ) + .add_argument( + "external_knowledge_id", + type=str, + required=False, + nullable=True, + location="json", + help="Invalid external knowledge id.", + ) + .add_argument( + "external_knowledge_api_id", + type=str, + required=False, + nullable=True, + location="json", + help="Invalid external knowledge api id.", + ) +) + +tag_create_parser = reqparse.RequestParser().add_argument( "name", nullable=False, required=True, @@ -155,32 +154,37 @@ tag_create_parser.add_argument( else (_ for _ in ()).throw(ValueError("Name must be between 1 to 50 characters.")), ) -tag_update_parser = reqparse.RequestParser() -tag_update_parser.add_argument( - "name", - nullable=False, - required=True, - help="Name must be between 1 to 50 characters.", - type=lambda x: x - if x and 1 <= len(x) <= 50 - else (_ for _ in ()).throw(ValueError("Name must be between 1 to 50 characters.")), -) -tag_update_parser.add_argument("tag_id", nullable=False, required=True, help="Id of a tag.", type=str) - -tag_delete_parser = reqparse.RequestParser() -tag_delete_parser.add_argument("tag_id", nullable=False, required=True, help="Id of a tag.", type=str) - -tag_binding_parser = reqparse.RequestParser() -tag_binding_parser.add_argument( - "tag_ids", type=list, nullable=False, required=True, location="json", help="Tag IDs is required." -) -tag_binding_parser.add_argument( - "target_id", type=str, nullable=False, required=True, location="json", help="Target Dataset ID is required." +tag_update_parser = ( + reqparse.RequestParser() + .add_argument( + "name", + nullable=False, + required=True, + help="Name must be between 1 to 50 characters.", + type=lambda x: x + if x and 1 <= len(x) <= 50 + else (_ for _ in ()).throw(ValueError("Name must be between 1 to 50 characters.")), + ) + .add_argument("tag_id", nullable=False, required=True, help="Id of a tag.", type=str) ) -tag_unbinding_parser = reqparse.RequestParser() -tag_unbinding_parser.add_argument("tag_id", type=str, nullable=False, required=True, help="Tag ID is required.") -tag_unbinding_parser.add_argument("target_id", type=str, nullable=False, required=True, help="Target ID is required.") +tag_delete_parser = reqparse.RequestParser().add_argument( + "tag_id", nullable=False, required=True, help="Id of a tag.", type=str +) + +tag_binding_parser = ( + reqparse.RequestParser() + .add_argument("tag_ids", type=list, nullable=False, required=True, location="json", help="Tag IDs is required.") + .add_argument( + "target_id", type=str, nullable=False, required=True, location="json", help="Target Dataset ID is required." + ) +) + +tag_unbinding_parser = ( + reqparse.RequestParser() + .add_argument("tag_id", type=str, nullable=False, required=True, help="Tag ID is required.") + .add_argument("target_id", type=str, nullable=False, required=True, help="Target ID is required.") +) @service_api_ns.route("/datasets") diff --git a/api/controllers/service_api/dataset/document.py b/api/controllers/service_api/dataset/document.py index 961a338bc5..893cd7c923 100644 --- a/api/controllers/service_api/dataset/document.py +++ b/api/controllers/service_api/dataset/document.py @@ -35,37 +35,31 @@ from services.entities.knowledge_entities.knowledge_entities import KnowledgeCon from services.file_service import FileService # Define parsers for document operations -document_text_create_parser = reqparse.RequestParser() -document_text_create_parser.add_argument("name", type=str, required=True, nullable=False, location="json") -document_text_create_parser.add_argument("text", type=str, required=True, nullable=False, location="json") -document_text_create_parser.add_argument("process_rule", type=dict, required=False, nullable=True, location="json") -document_text_create_parser.add_argument("original_document_id", type=str, required=False, location="json") -document_text_create_parser.add_argument( - "doc_form", type=str, default="text_model", required=False, nullable=False, location="json" -) -document_text_create_parser.add_argument( - "doc_language", type=str, default="English", required=False, nullable=False, location="json" -) -document_text_create_parser.add_argument( - "indexing_technique", type=str, choices=Dataset.INDEXING_TECHNIQUE_LIST, nullable=False, location="json" -) -document_text_create_parser.add_argument("retrieval_model", type=dict, required=False, nullable=True, location="json") -document_text_create_parser.add_argument("embedding_model", type=str, required=False, nullable=True, location="json") -document_text_create_parser.add_argument( - "embedding_model_provider", type=str, required=False, nullable=True, location="json" +document_text_create_parser = ( + reqparse.RequestParser() + .add_argument("name", type=str, required=True, nullable=False, location="json") + .add_argument("text", type=str, required=True, nullable=False, location="json") + .add_argument("process_rule", type=dict, required=False, nullable=True, location="json") + .add_argument("original_document_id", type=str, required=False, location="json") + .add_argument("doc_form", type=str, default="text_model", required=False, nullable=False, location="json") + .add_argument("doc_language", type=str, default="English", required=False, nullable=False, location="json") + .add_argument( + "indexing_technique", type=str, choices=Dataset.INDEXING_TECHNIQUE_LIST, nullable=False, location="json" + ) + .add_argument("retrieval_model", type=dict, required=False, nullable=True, location="json") + .add_argument("embedding_model", type=str, required=False, nullable=True, location="json") + .add_argument("embedding_model_provider", type=str, required=False, nullable=True, location="json") ) -document_text_update_parser = reqparse.RequestParser() -document_text_update_parser.add_argument("name", type=str, required=False, nullable=True, location="json") -document_text_update_parser.add_argument("text", type=str, required=False, nullable=True, location="json") -document_text_update_parser.add_argument("process_rule", type=dict, required=False, nullable=True, location="json") -document_text_update_parser.add_argument( - "doc_form", type=str, default="text_model", required=False, nullable=False, location="json" +document_text_update_parser = ( + reqparse.RequestParser() + .add_argument("name", type=str, required=False, nullable=True, location="json") + .add_argument("text", type=str, required=False, nullable=True, location="json") + .add_argument("process_rule", type=dict, required=False, nullable=True, location="json") + .add_argument("doc_form", type=str, default="text_model", required=False, nullable=False, location="json") + .add_argument("doc_language", type=str, default="English", required=False, nullable=False, location="json") + .add_argument("retrieval_model", type=dict, required=False, nullable=False, location="json") ) -document_text_update_parser.add_argument( - "doc_language", type=str, default="English", required=False, nullable=False, location="json" -) -document_text_update_parser.add_argument("retrieval_model", type=dict, required=False, nullable=False, location="json") @service_api_ns.route( diff --git a/api/controllers/service_api/dataset/metadata.py b/api/controllers/service_api/dataset/metadata.py index 51420fdd5f..f646f1f4fa 100644 --- a/api/controllers/service_api/dataset/metadata.py +++ b/api/controllers/service_api/dataset/metadata.py @@ -15,21 +15,17 @@ from services.entities.knowledge_entities.knowledge_entities import ( from services.metadata_service import MetadataService # Define parsers for metadata APIs -metadata_create_parser = reqparse.RequestParser() -metadata_create_parser.add_argument( - "type", type=str, required=True, nullable=False, location="json", help="Metadata type" -) -metadata_create_parser.add_argument( - "name", type=str, required=True, nullable=False, location="json", help="Metadata name" +metadata_create_parser = ( + reqparse.RequestParser() + .add_argument("type", type=str, required=True, nullable=False, location="json", help="Metadata type") + .add_argument("name", type=str, required=True, nullable=False, location="json", help="Metadata name") ) -metadata_update_parser = reqparse.RequestParser() -metadata_update_parser.add_argument( +metadata_update_parser = reqparse.RequestParser().add_argument( "name", type=str, required=True, nullable=False, location="json", help="New metadata name" ) -document_metadata_parser = reqparse.RequestParser() -document_metadata_parser.add_argument( +document_metadata_parser = reqparse.RequestParser().add_argument( "operation_data", type=list, required=True, nullable=False, location="json", help="Metadata operation data" ) diff --git a/api/controllers/service_api/dataset/rag_pipeline/rag_pipeline_workflow.py b/api/controllers/service_api/dataset/rag_pipeline/rag_pipeline_workflow.py index 38891f0180..c177e9180a 100644 --- a/api/controllers/service_api/dataset/rag_pipeline/rag_pipeline_workflow.py +++ b/api/controllers/service_api/dataset/rag_pipeline/rag_pipeline_workflow.py @@ -91,11 +91,13 @@ class DatasourceNodeRunApi(DatasetApiResource): def post(self, tenant_id: str, dataset_id: str, node_id: str): """Resource for getting datasource plugins.""" # Get query parameter to determine published or draft - parser: RequestParser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, nullable=False, location="json") - parser.add_argument("datasource_type", type=str, required=True, location="json") - parser.add_argument("credential_id", type=str, required=False, location="json") - parser.add_argument("is_published", type=bool, required=True, location="json") + parser: RequestParser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, nullable=False, location="json") + .add_argument("datasource_type", type=str, required=True, location="json") + .add_argument("credential_id", type=str, required=False, location="json") + .add_argument("is_published", type=bool, required=True, location="json") + ) args: ParseResult = parser.parse_args() datasource_node_run_api_entity = DatasourceNodeRunApiEntity.model_validate(args) @@ -147,19 +149,21 @@ class PipelineRunApi(DatasetApiResource): ) def post(self, tenant_id: str, dataset_id: str): """Resource for running a rag pipeline.""" - parser: RequestParser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, nullable=False, location="json") - parser.add_argument("datasource_type", type=str, required=True, location="json") - parser.add_argument("datasource_info_list", type=list, required=True, location="json") - parser.add_argument("start_node_id", type=str, required=True, location="json") - parser.add_argument("is_published", type=bool, required=True, default=True, location="json") - parser.add_argument( - "response_mode", - type=str, - required=True, - choices=["streaming", "blocking"], - default="blocking", - location="json", + parser: RequestParser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, nullable=False, location="json") + .add_argument("datasource_type", type=str, required=True, location="json") + .add_argument("datasource_info_list", type=list, required=True, location="json") + .add_argument("start_node_id", type=str, required=True, location="json") + .add_argument("is_published", type=bool, required=True, default=True, location="json") + .add_argument( + "response_mode", + type=str, + required=True, + choices=["streaming", "blocking"], + default="blocking", + location="json", + ) ) args: ParseResult = parser.parse_args() diff --git a/api/controllers/service_api/dataset/segment.py b/api/controllers/service_api/dataset/segment.py index acbbf4531b..81abd19fed 100644 --- a/api/controllers/service_api/dataset/segment.py +++ b/api/controllers/service_api/dataset/segment.py @@ -24,26 +24,34 @@ from services.errors.chunk import ChildChunkDeleteIndexError as ChildChunkDelete from services.errors.chunk import ChildChunkIndexingError as ChildChunkIndexingServiceError # Define parsers for segment operations -segment_create_parser = reqparse.RequestParser() -segment_create_parser.add_argument("segments", type=list, required=False, nullable=True, location="json") +segment_create_parser = reqparse.RequestParser().add_argument( + "segments", type=list, required=False, nullable=True, location="json" +) -segment_list_parser = reqparse.RequestParser() -segment_list_parser.add_argument("status", type=str, action="append", default=[], location="args") -segment_list_parser.add_argument("keyword", type=str, default=None, location="args") +segment_list_parser = ( + reqparse.RequestParser() + .add_argument("status", type=str, action="append", default=[], location="args") + .add_argument("keyword", type=str, default=None, location="args") +) -segment_update_parser = reqparse.RequestParser() -segment_update_parser.add_argument("segment", type=dict, required=False, nullable=True, location="json") +segment_update_parser = reqparse.RequestParser().add_argument( + "segment", type=dict, required=False, nullable=True, location="json" +) -child_chunk_create_parser = reqparse.RequestParser() -child_chunk_create_parser.add_argument("content", type=str, required=True, nullable=False, location="json") +child_chunk_create_parser = reqparse.RequestParser().add_argument( + "content", type=str, required=True, nullable=False, location="json" +) -child_chunk_list_parser = reqparse.RequestParser() -child_chunk_list_parser.add_argument("limit", type=int, default=20, location="args") -child_chunk_list_parser.add_argument("keyword", type=str, default=None, location="args") -child_chunk_list_parser.add_argument("page", type=int, default=1, location="args") +child_chunk_list_parser = ( + reqparse.RequestParser() + .add_argument("limit", type=int, default=20, location="args") + .add_argument("keyword", type=str, default=None, location="args") + .add_argument("page", type=int, default=1, location="args") +) -child_chunk_update_parser = reqparse.RequestParser() -child_chunk_update_parser.add_argument("content", type=str, required=True, nullable=False, location="json") +child_chunk_update_parser = reqparse.RequestParser().add_argument( + "content", type=str, required=True, nullable=False, location="json" +) @service_api_ns.route("/datasets//documents//segments") diff --git a/api/controllers/web/app.py b/api/controllers/web/app.py index 2bc068ec75..d7facdbbb3 100644 --- a/api/controllers/web/app.py +++ b/api/controllers/web/app.py @@ -94,9 +94,11 @@ class AppAccessMode(Resource): } ) def get(self): - parser = reqparse.RequestParser() - parser.add_argument("appId", type=str, required=False, location="args") - parser.add_argument("appCode", type=str, required=False, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("appId", type=str, required=False, location="args") + .add_argument("appCode", type=str, required=False, location="args") + ) args = parser.parse_args() features = FeatureService.get_system_features() @@ -155,8 +157,7 @@ class AppWebAuthPermission(Resource): if not features.webapp_auth.enabled: return {"result": True} - parser = reqparse.RequestParser() - parser.add_argument("appId", type=str, required=True, location="args") + parser = reqparse.RequestParser().add_argument("appId", type=str, required=True, location="args") args = parser.parse_args() app_id = args["appId"] diff --git a/api/controllers/web/audio.py b/api/controllers/web/audio.py index c1c46891b6..3103851088 100644 --- a/api/controllers/web/audio.py +++ b/api/controllers/web/audio.py @@ -108,11 +108,13 @@ class TextApi(WebApiResource): def post(self, app_model: App, end_user): """Convert text to audio""" try: - parser = reqparse.RequestParser() - parser.add_argument("message_id", type=str, required=False, location="json") - parser.add_argument("voice", type=str, location="json") - parser.add_argument("text", type=str, location="json") - parser.add_argument("streaming", type=bool, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("message_id", type=str, required=False, location="json") + .add_argument("voice", type=str, location="json") + .add_argument("text", type=str, location="json") + .add_argument("streaming", type=bool, location="json") + ) args = parser.parse_args() message_id = args.get("message_id", None) diff --git a/api/controllers/web/completion.py b/api/controllers/web/completion.py index 67ae970388..5e45beffc0 100644 --- a/api/controllers/web/completion.py +++ b/api/controllers/web/completion.py @@ -67,12 +67,14 @@ class CompletionApi(WebApiResource): if app_model.mode != "completion": raise NotCompletionAppError() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, location="json") - parser.add_argument("query", type=str, location="json", default="") - parser.add_argument("files", type=list, required=False, location="json") - parser.add_argument("response_mode", type=str, choices=["blocking", "streaming"], location="json") - parser.add_argument("retriever_from", type=str, required=False, default="web_app", location="json") + parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, location="json") + .add_argument("query", type=str, location="json", default="") + .add_argument("files", type=list, required=False, location="json") + .add_argument("response_mode", type=str, choices=["blocking", "streaming"], location="json") + .add_argument("retriever_from", type=str, required=False, default="web_app", location="json") + ) args = parser.parse_args() @@ -166,14 +168,16 @@ class ChatApi(WebApiResource): if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: raise NotChatAppError() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, location="json") - parser.add_argument("query", type=str, required=True, location="json") - parser.add_argument("files", type=list, required=False, location="json") - parser.add_argument("response_mode", type=str, choices=["blocking", "streaming"], location="json") - parser.add_argument("conversation_id", type=uuid_value, location="json") - parser.add_argument("parent_message_id", type=uuid_value, required=False, location="json") - parser.add_argument("retriever_from", type=str, required=False, default="web_app", location="json") + parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, location="json") + .add_argument("query", type=str, required=True, location="json") + .add_argument("files", type=list, required=False, location="json") + .add_argument("response_mode", type=str, choices=["blocking", "streaming"], location="json") + .add_argument("conversation_id", type=uuid_value, location="json") + .add_argument("parent_message_id", type=uuid_value, required=False, location="json") + .add_argument("retriever_from", type=str, required=False, default="web_app", location="json") + ) args = parser.parse_args() diff --git a/api/controllers/web/conversation.py b/api/controllers/web/conversation.py index 03dd986aed..86e19423e5 100644 --- a/api/controllers/web/conversation.py +++ b/api/controllers/web/conversation.py @@ -60,17 +60,19 @@ class ConversationListApi(WebApiResource): if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: raise NotChatAppError() - parser = reqparse.RequestParser() - parser.add_argument("last_id", type=uuid_value, location="args") - parser.add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") - parser.add_argument("pinned", type=str, choices=["true", "false", None], location="args") - parser.add_argument( - "sort_by", - type=str, - choices=["created_at", "-created_at", "updated_at", "-updated_at"], - required=False, - default="-updated_at", - location="args", + parser = ( + reqparse.RequestParser() + .add_argument("last_id", type=uuid_value, location="args") + .add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") + .add_argument("pinned", type=str, choices=["true", "false", None], location="args") + .add_argument( + "sort_by", + type=str, + choices=["created_at", "-created_at", "updated_at", "-updated_at"], + required=False, + default="-updated_at", + location="args", + ) ) args = parser.parse_args() @@ -161,9 +163,11 @@ class ConversationRenameApi(WebApiResource): conversation_id = str(c_id) - parser = reqparse.RequestParser() - parser.add_argument("name", type=str, required=False, location="json") - parser.add_argument("auto_generate", type=bool, required=False, default=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("name", type=str, required=False, location="json") + .add_argument("auto_generate", type=bool, required=False, default=False, location="json") + ) args = parser.parse_args() try: diff --git a/api/controllers/web/forgot_password.py b/api/controllers/web/forgot_password.py index cbafd70e99..b9e391e049 100644 --- a/api/controllers/web/forgot_password.py +++ b/api/controllers/web/forgot_password.py @@ -40,9 +40,11 @@ class ForgotPasswordSendEmailApi(Resource): } ) def post(self): - parser = reqparse.RequestParser() - parser.add_argument("email", type=email, required=True, location="json") - parser.add_argument("language", type=str, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("email", type=email, required=True, location="json") + .add_argument("language", type=str, required=False, location="json") + ) args = parser.parse_args() ip_address = extract_remote_ip(request) @@ -76,10 +78,12 @@ class ForgotPasswordCheckApi(Resource): responses={200: "Token is valid", 400: "Bad request - invalid token format", 401: "Invalid or expired token"} ) def post(self): - parser = reqparse.RequestParser() - parser.add_argument("email", type=str, required=True, location="json") - parser.add_argument("code", type=str, required=True, location="json") - parser.add_argument("token", type=str, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("email", type=str, required=True, location="json") + .add_argument("code", type=str, required=True, location="json") + .add_argument("token", type=str, required=True, nullable=False, location="json") + ) args = parser.parse_args() user_email = args["email"] @@ -127,10 +131,12 @@ class ForgotPasswordResetApi(Resource): } ) def post(self): - parser = reqparse.RequestParser() - parser.add_argument("token", type=str, required=True, nullable=False, location="json") - parser.add_argument("new_password", type=valid_password, required=True, nullable=False, location="json") - parser.add_argument("password_confirm", type=valid_password, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("token", type=str, required=True, nullable=False, location="json") + .add_argument("new_password", type=valid_password, required=True, nullable=False, location="json") + .add_argument("password_confirm", type=valid_password, required=True, nullable=False, location="json") + ) args = parser.parse_args() # Validate passwords match diff --git a/api/controllers/web/login.py b/api/controllers/web/login.py index a489101cc9..351f245f4a 100644 --- a/api/controllers/web/login.py +++ b/api/controllers/web/login.py @@ -35,9 +35,11 @@ class LoginApi(Resource): ) def post(self): """Authenticate user and login.""" - parser = reqparse.RequestParser() - parser.add_argument("email", type=email, required=True, location="json") - parser.add_argument("password", type=valid_password, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("email", type=email, required=True, location="json") + .add_argument("password", type=valid_password, required=True, location="json") + ) args = parser.parse_args() try: @@ -77,9 +79,11 @@ class EmailCodeLoginSendEmailApi(Resource): } ) def post(self): - parser = reqparse.RequestParser() - parser.add_argument("email", type=email, required=True, location="json") - parser.add_argument("language", type=str, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("email", type=email, required=True, location="json") + .add_argument("language", type=str, required=False, location="json") + ) args = parser.parse_args() if args["language"] is not None and args["language"] == "zh-Hans": @@ -111,10 +115,12 @@ class EmailCodeLoginApi(Resource): } ) def post(self): - parser = reqparse.RequestParser() - parser.add_argument("email", type=str, required=True, location="json") - parser.add_argument("code", type=str, required=True, location="json") - parser.add_argument("token", type=str, required=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("email", type=str, required=True, location="json") + .add_argument("code", type=str, required=True, location="json") + .add_argument("token", type=str, required=True, location="json") + ) args = parser.parse_args() user_email = args["email"] diff --git a/api/controllers/web/message.py b/api/controllers/web/message.py index a52cccac13..9f9aa4838c 100644 --- a/api/controllers/web/message.py +++ b/api/controllers/web/message.py @@ -93,10 +93,12 @@ class MessageListApi(WebApiResource): if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: raise NotChatAppError() - parser = reqparse.RequestParser() - parser.add_argument("conversation_id", required=True, type=uuid_value, location="args") - parser.add_argument("first_id", type=uuid_value, location="args") - parser.add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("conversation_id", required=True, type=uuid_value, location="args") + .add_argument("first_id", type=uuid_value, location="args") + .add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") + ) args = parser.parse_args() try: @@ -143,9 +145,11 @@ class MessageFeedbackApi(WebApiResource): def post(self, app_model, end_user, message_id): message_id = str(message_id) - parser = reqparse.RequestParser() - parser.add_argument("rating", type=str, choices=["like", "dislike", None], location="json") - parser.add_argument("content", type=str, location="json", default=None) + parser = ( + reqparse.RequestParser() + .add_argument("rating", type=str, choices=["like", "dislike", None], location="json") + .add_argument("content", type=str, location="json", default=None) + ) args = parser.parse_args() try: @@ -193,8 +197,7 @@ class MessageMoreLikeThisApi(WebApiResource): message_id = str(message_id) - parser = reqparse.RequestParser() - parser.add_argument( + parser = reqparse.RequestParser().add_argument( "response_mode", type=str, required=True, choices=["blocking", "streaming"], location="args" ) args = parser.parse_args() diff --git a/api/controllers/web/remote_files.py b/api/controllers/web/remote_files.py index 0983e30b9d..dac4b3da94 100644 --- a/api/controllers/web/remote_files.py +++ b/api/controllers/web/remote_files.py @@ -97,8 +97,7 @@ class RemoteFileUploadApi(WebApiResource): FileTooLargeError: File exceeds size limit UnsupportedFileTypeError: File type not supported """ - parser = reqparse.RequestParser() - parser.add_argument("url", type=str, required=True, help="URL is required") + parser = reqparse.RequestParser().add_argument("url", type=str, required=True, help="URL is required") args = parser.parse_args() url = args["url"] diff --git a/api/controllers/web/saved_message.py b/api/controllers/web/saved_message.py index 96f09c8d3c..865f3610a7 100644 --- a/api/controllers/web/saved_message.py +++ b/api/controllers/web/saved_message.py @@ -63,9 +63,11 @@ class SavedMessageListApi(WebApiResource): if app_model.mode != "completion": raise NotCompletionAppError() - parser = reqparse.RequestParser() - parser.add_argument("last_id", type=uuid_value, location="args") - parser.add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") + parser = ( + reqparse.RequestParser() + .add_argument("last_id", type=uuid_value, location="args") + .add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args") + ) args = parser.parse_args() return SavedMessageService.pagination_by_last_id(app_model, end_user, args["last_id"], args["limit"]) @@ -92,8 +94,7 @@ class SavedMessageListApi(WebApiResource): if app_model.mode != "completion": raise NotCompletionAppError() - parser = reqparse.RequestParser() - parser.add_argument("message_id", type=uuid_value, required=True, location="json") + parser = reqparse.RequestParser().add_argument("message_id", type=uuid_value, required=True, location="json") args = parser.parse_args() try: diff --git a/api/controllers/web/workflow.py b/api/controllers/web/workflow.py index 9a980148d9..3cbb07a296 100644 --- a/api/controllers/web/workflow.py +++ b/api/controllers/web/workflow.py @@ -58,9 +58,11 @@ class WorkflowRunApi(WebApiResource): if app_mode != AppMode.WORKFLOW: raise NotWorkflowAppError() - parser = reqparse.RequestParser() - parser.add_argument("inputs", type=dict, required=True, nullable=False, location="json") - parser.add_argument("files", type=list, required=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("inputs", type=dict, required=True, nullable=False, location="json") + .add_argument("files", type=list, required=False, location="json") + ) args = parser.parse_args() try: diff --git a/api/tests/unit_tests/services/test_metadata_bug_complete.py b/api/tests/unit_tests/services/test_metadata_bug_complete.py index ee96305070..bbfa9da15e 100644 --- a/api/tests/unit_tests/services/test_metadata_bug_complete.py +++ b/api/tests/unit_tests/services/test_metadata_bug_complete.py @@ -80,9 +80,11 @@ class TestMetadataBugCompleteValidation: def test_4_fixed_api_layer_rejects_null(self, app): """Test Layer 4: Fixed API configuration properly rejects null values.""" # Test Console API create endpoint (fixed) - parser = reqparse.RequestParser() - parser.add_argument("type", type=str, required=True, nullable=False, location="json") - parser.add_argument("name", type=str, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("type", type=str, required=True, nullable=False, location="json") + .add_argument("name", type=str, required=True, nullable=False, location="json") + ) with app.test_request_context(json={"type": None, "name": None}, content_type="application/json"): with pytest.raises(BadRequest): @@ -100,9 +102,11 @@ class TestMetadataBugCompleteValidation: def test_5_fixed_api_accepts_valid_values(self, app): """Test that fixed API still accepts valid non-null values.""" - parser = reqparse.RequestParser() - parser.add_argument("type", type=str, required=True, nullable=False, location="json") - parser.add_argument("name", type=str, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("type", type=str, required=True, nullable=False, location="json") + .add_argument("name", type=str, required=True, nullable=False, location="json") + ) with app.test_request_context(json={"type": "string", "name": "valid_name"}, content_type="application/json"): args = parser.parse_args() @@ -112,9 +116,11 @@ class TestMetadataBugCompleteValidation: def test_6_simulated_buggy_behavior(self, app): """Test simulating the original buggy behavior with nullable=True.""" # Simulate the old buggy configuration - buggy_parser = reqparse.RequestParser() - buggy_parser.add_argument("type", type=str, required=True, nullable=True, location="json") - buggy_parser.add_argument("name", type=str, required=True, nullable=True, location="json") + buggy_parser = ( + reqparse.RequestParser() + .add_argument("type", type=str, required=True, nullable=True, location="json") + .add_argument("name", type=str, required=True, nullable=True, location="json") + ) with app.test_request_context(json={"type": None, "name": None}, content_type="application/json"): # This would pass in the buggy version diff --git a/api/tests/unit_tests/services/test_metadata_nullable_bug.py b/api/tests/unit_tests/services/test_metadata_nullable_bug.py index 3d57737943..c8a1a70422 100644 --- a/api/tests/unit_tests/services/test_metadata_nullable_bug.py +++ b/api/tests/unit_tests/services/test_metadata_nullable_bug.py @@ -54,9 +54,11 @@ class TestMetadataNullableBug: def test_api_parser_accepts_null_values(self, app): """Test that API parser configuration incorrectly accepts null values.""" # Simulate the current API parser configuration - parser = reqparse.RequestParser() - parser.add_argument("type", type=str, required=True, nullable=True, location="json") - parser.add_argument("name", type=str, required=True, nullable=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("type", type=str, required=True, nullable=True, location="json") + .add_argument("name", type=str, required=True, nullable=True, location="json") + ) # Simulate request data with null values with app.test_request_context(json={"type": None, "name": None}, content_type="application/json"): @@ -72,9 +74,11 @@ class TestMetadataNullableBug: def test_integration_bug_scenario(self, app): """Test the complete bug scenario from API to service layer.""" # Step 1: API parser accepts null values (current buggy behavior) - parser = reqparse.RequestParser() - parser.add_argument("type", type=str, required=True, nullable=True, location="json") - parser.add_argument("name", type=str, required=True, nullable=True, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("type", type=str, required=True, nullable=True, location="json") + .add_argument("name", type=str, required=True, nullable=True, location="json") + ) with app.test_request_context(json={"type": None, "name": None}, content_type="application/json"): args = parser.parse_args() @@ -105,9 +109,11 @@ class TestMetadataNullableBug: def test_correct_nullable_false_configuration_works(self, app): """Test that the correct nullable=False configuration works as expected.""" # This tests the FIXED configuration - parser = reqparse.RequestParser() - parser.add_argument("type", type=str, required=True, nullable=False, location="json") - parser.add_argument("name", type=str, required=True, nullable=False, location="json") + parser = ( + reqparse.RequestParser() + .add_argument("type", type=str, required=True, nullable=False, location="json") + .add_argument("name", type=str, required=True, nullable=False, location="json") + ) with app.test_request_context(json={"type": None, "name": None}, content_type="application/json"): # This should fail with BadRequest due to nullable=False